From 9a3a101244912485a5dd2ea917de1e48d142620c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 25 Oct 2020 16:56:39 -0400 Subject: [PATCH] Add timer countdown example --- examples/countdown/main.go | 70 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 examples/countdown/main.go diff --git a/examples/countdown/main.go b/examples/countdown/main.go new file mode 100644 index 0000000..ba7533d --- /dev/null +++ b/examples/countdown/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "fmt" + "os" + "time" + + tea "github.com/charmbracelet/bubbletea" +) + +var ( + duration = time.Second * 10 + interval = time.Millisecond +) + +func main() { + m := model{ + timeout: time.Now().Add(duration), + } + + if err := tea.NewProgram(m).Start(); err != nil { + fmt.Println("Oh no, it didn't work:", err) + os.Exit(1) + } +} + +type tickMsg time.Time + +type model struct { + timeout time.Time + lastTick time.Time +} + +func (m model) Init() tea.Cmd { + return m.tick() +} + +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + + case tickMsg: + t := time.Time(msg) + if t.After(m.timeout) { + return m, tea.Quit + } + m.lastTick = t + return m, m.tick() + + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c", "q": + return m, tea.Quit + } + } + + return m, nil +} + +func (m model) View() string { + t := m.timeout.Sub(m.lastTick).Milliseconds() + secs := t / 1000 + millis := t % 1000 / 10 + return fmt.Sprintf("This program will quit in %02d:%02d\n", secs, millis) +} + +func (m model) tick() tea.Cmd { + return tea.Tick(time.Duration(interval), func(t time.Time) tea.Msg { + return tickMsg(t) + }) +}