fix: debounce stopwatch and timer

This keeps them from ticking too fast.

Fixes #661.
This commit is contained in:
Christian Rocha
2024-11-05 22:06:53 -05:00
parent 20a65e5655
commit 730f5a29e2
2 changed files with 27 additions and 6 deletions
+11 -1
View File
@@ -61,6 +61,8 @@ type TickMsg struct {
// Timeout returns whether or not this tick is a timeout tick. You can
// alternatively listen for TimeoutMsg.
Timeout bool
tag int
}
// TimeoutMsg is a message that is sent once when the timer times out.
@@ -80,6 +82,7 @@ type Model struct {
Interval time.Duration
id int
tag int
running bool
}
@@ -137,6 +140,13 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
break
}
// If a tag is set, and it's not the one we expect, reject the message.
// This prevents the ticker from receiving too many messages and
// thus ticking too fast.
if msg.tag > 0 && msg.tag != m.tag {
return m, nil
}
m.Timeout -= m.Interval
return m, tea.Batch(m.tick(), m.timedout())
}
@@ -166,7 +176,7 @@ func (m *Model) Toggle() tea.Cmd {
func (m Model) tick() tea.Cmd {
return tea.Tick(m.Interval, func(_ time.Time) tea.Msg {
return TickMsg{ID: m.id, Timeout: m.Timedout()}
return TickMsg{ID: m.id, tag: m.tag, Timeout: m.Timedout()}
})
}