feat(tui): poll orders every 10 seconds so that the order status refreshes live in the tui without logging out and in

This commit is contained in:
2026-05-19 20:12:03 +02:00
parent 9515603b32
commit 1aaf82d7d6
2 changed files with 30 additions and 10 deletions

View File

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

View File

@@ -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)}