mirror of
https://github.com/marcusDenslow/terminalShop.git
synced 2026-10-25 02:52:20 +02:00
96 lines
2.0 KiB
Go
96 lines
2.0 KiB
Go
package tui
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/charmbracelet/lipgloss"
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
|
|
func (m Model) BuildMenuView() string {
|
|
bold := m.theme.TextAccent().Bold(true)
|
|
|
|
base := m.theme.TextBody()
|
|
|
|
rowStyle := lipgloss.NewStyle().Padding(0,1)
|
|
rows := []string{
|
|
rowStyle.Render(bold.Render("s") + " " + base.Render("shop")),
|
|
rowStyle.Render(bold.Render("a") + " " + base.Render("account")),
|
|
rowStyle.Render(bold.Render("c") + " " + base.Render("cart")),
|
|
rowStyle.Render(""),
|
|
rowStyle.Render(bold.Render("q") + " " + base.Render("quit")),
|
|
}
|
|
|
|
|
|
menuContent := ""
|
|
for _, row := range rows {
|
|
menuContent += row + "\n"
|
|
}
|
|
|
|
|
|
logoStyle := m.theme.TextAccent().Bold(true)
|
|
logo := logoStyle.Render("terminal coffee")
|
|
|
|
modal := lipgloss.NewStyle().Border(lipgloss.NormalBorder()).BorderForeground(m.theme.Border()).Padding(1, 2).Render(menuContent)
|
|
|
|
hint := base.Render("press esc to close")
|
|
|
|
itemCount := 0
|
|
total := 0
|
|
for _, item := range m.Cart {
|
|
total += item.Quantity * item.Coffee.Price
|
|
itemCount += item.Quantity
|
|
}
|
|
|
|
cartHint := base.Render(fmt.Sprintf("cart $%.2f [%d]", float64(total)/100, itemCount))
|
|
|
|
assembled := lipgloss.JoinVertical(
|
|
lipgloss.Center,
|
|
logo,
|
|
"",
|
|
modal,
|
|
"",
|
|
hint,
|
|
cartHint,
|
|
)
|
|
|
|
return lipgloss.Place(
|
|
m.viewportWidth,
|
|
m.viewportHeight,
|
|
lipgloss.Center,
|
|
lipgloss.Center,
|
|
assembled,
|
|
)
|
|
|
|
}
|
|
|
|
func (m Model) MenuUpdate(msg tea.Msg) (Model, tea.Cmd) {
|
|
keyMsg, ok := msg.(tea.KeyMsg)
|
|
if !ok {
|
|
return m, nil
|
|
}
|
|
switch keyMsg.String() {
|
|
case "s":
|
|
m.ShowingMenu = false
|
|
return m.SwitchPage(shopPage).resetPageState(), nil
|
|
case "a":
|
|
m.ShowingMenu = false
|
|
m = m.SwitchPage(accountPage).resetPageState()
|
|
if !m.OrdersLoaded {
|
|
return m, m.fetchOrdersCmd()
|
|
}
|
|
return m, nil
|
|
case "c":
|
|
m.ShowingMenu = false
|
|
return m.SwitchPage(cartPage).resetPageState(), nil
|
|
case "esc":
|
|
m.ShowingMenu = false
|
|
case "?":
|
|
m.ShowingMenu = false
|
|
m.ShowingHelp = true
|
|
case "q", "ctrl+c":
|
|
return m, tea.Quit
|
|
}
|
|
return m, nil
|
|
}
|