feat(client): coordinated broadcast listening with form/menu flow; improved loading UX

This commit is contained in:
Syahdan 2025-10-16 16:36:17 +07:00
parent 76215f14bd
commit c93b38e8ec

27
main.go
View File

@ -133,12 +133,18 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, submitOrderCmd(m.conn, *ord, m.reader) return m, submitOrderCmd(m.conn, *ord, m.reader)
} }
m.status = "Order canceled." m.status = "Order canceled."
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, cmd return m, cmd
} }
if m.form.State == huh.StateAborted { if m.form.State == huh.StateAborted {
m.status = "Order form aborted." m.status = "Order form aborted."
m.form = nil m.form = nil
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, cmd return m, cmd
} }
@ -159,13 +165,18 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
} }
_ = m.conn.SetReadDeadline(time.Time{}) _ = m.conn.SetReadDeadline(time.Time{})
return m, nil m.broadcastListening = true
return m, listenForBroadcastsCmd(m.conn, m.reader)
case menuLoadedMsg: case menuLoadedMsg:
m.loading = false m.loading = false
m.pauseBroadcast = false
if msg.err != nil { if msg.err != nil {
m.err = msg.err m.err = msg.err
m.status = "Failed to load menu." m.status = "Failed to load menu."
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, nil return m, nil
} }
m.err = nil m.err = nil
@ -173,6 +184,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.status = "Menu loaded." m.status = "Menu loaded."
m.form = m.buildForm() m.form = m.buildForm()
if m.broadcastListening {
return m, tea.Batch(m.form.Init(), listenForBroadcastsCmd(m.conn, m.reader))
}
return m, m.form.Init() return m, m.form.Init()
case orderSubmittedMsg: case orderSubmittedMsg:
@ -212,7 +226,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
} }
} }
if m.pauseBroadcast { if m.pauseBroadcast {
time.Sleep(50 * time.Millisecond) return m, nil
} }
return m, listenForBroadcastsCmd(m.conn, m.reader) return m, listenForBroadcastsCmd(m.conn, m.reader)
case statusMsg: case statusMsg:
@ -259,6 +273,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, m.form.Init() return m, m.form.Init()
} }
m.loading = true m.loading = true
m.pauseBroadcast = true
m.status = "Loading menu..." m.status = "Loading menu..."
return m, fetchMenuCmd(m.conn, m.reader) return m, fetchMenuCmd(m.conn, m.reader)
} }
@ -286,7 +301,11 @@ func (m model) renderLeftColumn() string {
lines := []string{} lines := []string{}
if m.loading { if m.loading {
lines = append(lines, "Status: "+lipgloss.NewStyle().Foreground(lipgloss.Color("178")).Render("Loading...")) loadingText := "Loading..."
if m.status != "" {
loadingText = m.status
}
lines = append(lines, "Status: "+lipgloss.NewStyle().Foreground(lipgloss.Color("178")).Render(loadingText))
} else if m.status != "" { } else if m.status != "" {
lines = append(lines, "Status: "+m.status) lines = append(lines, "Status: "+m.status)
} }
@ -520,6 +539,8 @@ func fetchMenuCmd(conn net.Conn, reader *bufio.Reader) tea.Cmd {
return menuLoadedMsg{err: errors.New("not connected")} return menuLoadedMsg{err: errors.New("not connected")}
} }
time.Sleep(150 * time.Millisecond)
if _, err := fmt.Fprintln(conn, "MENU"); err != nil { if _, err := fmt.Fprintln(conn, "MENU"); err != nil {
return menuLoadedMsg{err: fmt.Errorf("send MENU: %w", err)} return menuLoadedMsg{err: fmt.Errorf("send MENU: %w", err)}
} }