Reduce status refresh interval to 3 seconds and add last updated indicator

This commit is contained in:
Calmcacil
2026-01-12 23:04:48 +01:00
parent 5136484cd2
commit 68939cdc08
6 changed files with 56 additions and 41 deletions

View File

@@ -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,