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)
}
m.status = "Order canceled."
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, cmd
}
if m.form.State == huh.StateAborted {
m.status = "Order form aborted."
m.form = nil
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, cmd
}
@ -159,13 +165,18 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
_ = m.conn.SetReadDeadline(time.Time{})
return m, nil
m.broadcastListening = true
return m, listenForBroadcastsCmd(m.conn, m.reader)
case menuLoadedMsg:
m.loading = false
m.pauseBroadcast = false
if msg.err != nil {
m.err = msg.err
m.status = "Failed to load menu."
if m.broadcastListening {
return m, listenForBroadcastsCmd(m.conn, m.reader)
}
return m, nil
}
m.err = nil
@ -173,6 +184,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.status = "Menu loaded."
m.form = m.buildForm()
if m.broadcastListening {
return m, tea.Batch(m.form.Init(), listenForBroadcastsCmd(m.conn, m.reader))
}
return m, m.form.Init()
case orderSubmittedMsg:
@ -212,7 +226,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
}
if m.pauseBroadcast {
time.Sleep(50 * time.Millisecond)
return m, nil
}
return m, listenForBroadcastsCmd(m.conn, m.reader)
case statusMsg:
@ -259,6 +273,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, m.form.Init()
}
m.loading = true
m.pauseBroadcast = true
m.status = "Loading menu..."
return m, fetchMenuCmd(m.conn, m.reader)
}
@ -286,7 +301,11 @@ func (m model) renderLeftColumn() string {
lines := []string{}
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 != "" {
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")}
}
time.Sleep(150 * time.Millisecond)
if _, err := fmt.Fprintln(conn, "MENU"); err != nil {
return menuLoadedMsg{err: fmt.Errorf("send MENU: %w", err)}
}