From 1aaf82d7d67eefe0da2a80b364b9b45a97511e9b Mon Sep 17 00:00:00 2001 From: marcusDenslow Date: Tue, 19 May 2026 20:12:03 +0200 Subject: [PATCH] feat(tui): poll orders every 10 seconds so that the order status refreshes live in the tui without logging out and in --- pkg/tui/model.go | 27 +++++++++++++++++++-------- pkg/tui/update.go | 13 +++++++++++-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/pkg/tui/model.go b/pkg/tui/model.go index 698bab8..40f76e0 100644 --- a/pkg/tui/model.go +++ b/pkg/tui/model.go @@ -77,14 +77,15 @@ type Model struct { authCmd tea.Cmd // Shared data - Username string - Coffees []models.Coffee - Cart map[uint]*models.CartItem - SavedAddresses []models.Address - SavedCards []models.Card - Orders []models.Order - OrdersLoaded bool - FAQs []FAQ + Username string + Coffees []models.Coffee + Cart map[uint]*models.CartItem + SavedAddresses []models.Address + SavedCards []models.Card + Orders []models.Order + OrdersLoaded bool + ordersPollStarted bool + FAQs []FAQ // Page navigation currentPage page // currently active screen @@ -940,6 +941,16 @@ func (m Model) collectCardCmd() tea.Cmd { } } +const ordersPollInterval = 10 * time.Second + +type OrdersPollTickMsg struct{} + +func (m Model) pollOrderCmd() tea.Cmd { + return tea.Tick(ordersPollInterval, func(_ time.Time) tea.Msg { + return OrdersPollTickMsg{} + }) +} + func (m Model) pollCardsCmd(cardCount int) tea.Cmd { return tea.Tick(time.Second, func(_ time.Time) tea.Msg { if m.APIClient == nil { diff --git a/pkg/tui/update.go b/pkg/tui/update.go index 33e8675..4f831d9 100644 --- a/pkg/tui/update.go +++ b/pkg/tui/update.go @@ -103,10 +103,13 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.Orders = msg.Data.Orders m.OrdersLoaded = true m.splash.dataReady = true + m.ordersPollStarted = true + pollCmd := m.pollOrderCmd() if m.splash.delayDone { - return m.ShopSwitch() + nextM, switchCmd := m.ShopSwitch() + return nextM, tea.Batch(switchCmd, pollCmd) } - return m, nil + return m, pollCmd case CartSyncedMsg: if msg.Err != nil { return m, m.fetchCartCmd @@ -130,8 +133,14 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if msg.Err == nil { m.Orders = msg.Orders m.OrdersLoaded = true + if !m.ordersPollStarted { + m.ordersPollStarted = true + return m, m.pollOrderCmd() + } } return m, nil + case OrdersPollTickMsg: + return m, tea.Batch(m.fetchOrdersCmd(), m.pollOrderCmd()) case AddressDeletedMsg: if msg.Err != nil { m.error = &VisibleError{message: fmt.Sprintf("failed to delete address: %v", msg.Err)}