Reduce status refresh interval to 3 seconds and add last updated indicator
This commit is contained in:
@@ -26,11 +26,8 @@ type DetailScreen struct {
|
||||
|
||||
// Styles
|
||||
var (
|
||||
detailTitleStyle = lipgloss.NewStyle().Bold(true).MarginTop(0)
|
||||
detailSectionStyle = lipgloss.NewStyle().Bold(true).MarginTop(1)
|
||||
detailLabelStyle = lipgloss.NewStyle().Width(18)
|
||||
detailValueStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("255"))
|
||||
dimmedContentStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("244"))
|
||||
dimmedContentStyle = theme.StyleMuted
|
||||
)
|
||||
|
||||
// NewDetailScreen creates a new detail screen for a client
|
||||
@@ -118,9 +115,7 @@ func (s *DetailScreen) View() string {
|
||||
if s.showConfig && s.configDisplay != nil {
|
||||
// Render underlying content dimmed
|
||||
content := s.renderContent()
|
||||
dimmedContent := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color("244")).
|
||||
Render(content)
|
||||
dimmedContent := dimmedContentStyle.Render(content)
|
||||
|
||||
// Overlay config display modal
|
||||
return lipgloss.JoinVertical(
|
||||
@@ -134,9 +129,7 @@ func (s *DetailScreen) View() string {
|
||||
if s.showConfirm && s.confirmModal != nil {
|
||||
// Render underlying content dimmed
|
||||
content := s.renderContent()
|
||||
dimmedContent := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color("244")).
|
||||
Render(content)
|
||||
dimmedContent := dimmedContentStyle.Render(content)
|
||||
|
||||
// Overlay confirmation modal
|
||||
return lipgloss.JoinVertical(
|
||||
@@ -153,21 +146,21 @@ func (s *DetailScreen) View() string {
|
||||
func (s *DetailScreen) renderContent() string {
|
||||
statusText := s.status
|
||||
if s.status == wireguard.StatusConnected {
|
||||
statusText = detailConnectedStyle.Render("● " + s.status)
|
||||
statusText = theme.StyleSuccess.Bold(true).Render("● " + s.status)
|
||||
} else {
|
||||
statusText = detailDisconnectedStyle.Render("● " + s.status)
|
||||
statusText = theme.StyleError.Bold(true).Render("● " + s.status)
|
||||
}
|
||||
|
||||
// Build content
|
||||
content := lipgloss.JoinVertical(
|
||||
lipgloss.Left,
|
||||
detailTitleStyle.Render(fmt.Sprintf("Client Details: %s", s.client.Name)),
|
||||
theme.StyleTitle.Render(fmt.Sprintf("Client Details: %s", s.client.Name)),
|
||||
"",
|
||||
s.renderField("Status", statusText),
|
||||
s.renderField("IPv4 Address", detailValueStyle.Render(s.client.IPv4)),
|
||||
s.renderField("IPv6 Address", detailValueStyle.Render(s.client.IPv6)),
|
||||
"",
|
||||
detailSectionStyle.Render("WireGuard Configuration"),
|
||||
theme.StyleSubtitle.Bold(true).MarginTop(1).Render("WireGuard Configuration"),
|
||||
s.renderField("Public Key", detailValueStyle.Render(s.client.PublicKey)),
|
||||
s.renderField("Preshared Key", detailValueStyle.Render(func() string {
|
||||
if s.client.HasPSK {
|
||||
@@ -176,7 +169,7 @@ func (s *DetailScreen) renderContent() string {
|
||||
return "Not configured"
|
||||
}())),
|
||||
"",
|
||||
detailSectionStyle.Render("Connection Info"),
|
||||
theme.StyleSubtitle.Bold(true).MarginTop(1).Render("Connection Info"),
|
||||
s.renderField("Last Handshake", detailValueStyle.Render(s.formatHandshake())),
|
||||
s.renderField("Transfer (Rx/Tx)", detailValueStyle.Render(fmt.Sprintf("%s / %s", s.transferRx, s.transferTx))),
|
||||
s.renderField("Config Path", detailValueStyle.Render(s.client.ConfigPath)),
|
||||
@@ -184,7 +177,7 @@ func (s *DetailScreen) renderContent() string {
|
||||
)
|
||||
|
||||
// Add help text
|
||||
helpText := detailHelpStyle.Render("Actions: [d] Delete • [c] View Config • [q/b] Back")
|
||||
helpText := theme.StyleHelpKey.MarginTop(1).Render("Actions: [d] Delete • [c] View Config • [q/b] Back")
|
||||
content = lipgloss.JoinVertical(lipgloss.Left, content, helpText)
|
||||
|
||||
return content
|
||||
@@ -193,7 +186,7 @@ func (s *DetailScreen) renderContent() string {
|
||||
// renderField renders a label-value pair
|
||||
func (s *DetailScreen) renderField(label string, value string) string {
|
||||
return lipgloss.JoinHorizontal(lipgloss.Left,
|
||||
detailLabelStyle.Render(label),
|
||||
theme.StyleSubtitle.Width(18).Render(label),
|
||||
value,
|
||||
)
|
||||
}
|
||||
@@ -221,7 +214,7 @@ func (s *DetailScreen) formatHandshake() string {
|
||||
func (s *DetailScreen) loadClientStatus() tea.Msg {
|
||||
peers, err := wireguard.GetAllPeers()
|
||||
if err != nil {
|
||||
return errMsg{err: err}
|
||||
return ErrMsg{Err: err}
|
||||
}
|
||||
|
||||
// Find peer by public key
|
||||
@@ -250,7 +243,7 @@ func (s *DetailScreen) loadConfig() tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
config, err := wireguard.GetClientConfigContent(s.client.Name)
|
||||
if err != nil {
|
||||
return errMsg{fmt.Errorf("failed to load client config: %w", err)}
|
||||
return ErrMsg{Err: fmt.Errorf("failed to load client config: %w", err)}
|
||||
}
|
||||
|
||||
// Create or update config display modal
|
||||
@@ -269,7 +262,7 @@ func (s *DetailScreen) deleteClient() tea.Cmd {
|
||||
return func() tea.Msg {
|
||||
err := wireguard.DeleteClient(s.client.Name)
|
||||
if err != nil {
|
||||
return errMsg{fmt.Errorf("failed to delete client: %w", err)}
|
||||
return ErrMsg{fmt.Errorf("failed to delete client: %w", err)}
|
||||
}
|
||||
return ClientDeletedMsg{
|
||||
Name: s.client.Name,
|
||||
|
||||
Reference in New Issue
Block a user