mirror of
https://github.com/marcusDenslow/terminalShop.git
synced 2026-10-25 10:02:21 +01:00
114 lines
3.1 KiB
Go
114 lines
3.1 KiB
Go
package tui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
func (m Model) BuildCartView() string {
|
|
if len(m.Cart) == 0 {
|
|
emptyStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("#666666")).
|
|
Align(lipgloss.Center).
|
|
Width(m.WindowWidth).
|
|
Padding(2, 0)
|
|
return emptyStyle.Render("Your cart is empty\n\nPress s to go back to shop")
|
|
}
|
|
|
|
cartItems := ""
|
|
boxWidth := m.WindowWidth - 20 // Leave some margin
|
|
itemSlice := m.GetCartItemsSlice()
|
|
|
|
// Adjust padding based on window height
|
|
boxPadding := 0
|
|
if m.WindowHeight >= 25 {
|
|
boxPadding = 1
|
|
}
|
|
|
|
for idx, item := range itemSlice {
|
|
itemTotal := float64(item.Quantity) * item.Coffee.Price
|
|
|
|
// Left side: name and individual price
|
|
nameStyle := lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(lipgloss.Color("#FFFFFF"))
|
|
|
|
individualPriceStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color(item.Coffee.Color)).
|
|
Bold(true)
|
|
|
|
infoStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("#AAAAAA"))
|
|
|
|
// Right side: quantity controls and total price
|
|
quantityStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("#FFFFFF"))
|
|
|
|
totalPriceStyle := lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("#FFFFFF")).
|
|
Bold(true)
|
|
|
|
// Build content with proper spacing
|
|
nameText := nameStyle.Render(item.Coffee.Name)
|
|
individualPriceText := individualPriceStyle.Render(fmt.Sprintf(" $%.2f", item.Coffee.Price))
|
|
infoText := infoStyle.Render(fmt.Sprintf("%s | %doz | %s",
|
|
item.Coffee.RoastType,
|
|
item.Coffee.Ounces,
|
|
item.Coffee.BeanType))
|
|
quantityText := quantityStyle.Render(fmt.Sprintf("- %d +", item.Quantity))
|
|
totalPriceText := totalPriceStyle.Render(fmt.Sprintf("$%.2f", itemTotal))
|
|
|
|
// Calculate spacing
|
|
nameAndPriceWidth := lipgloss.Width(nameText) + lipgloss.Width(individualPriceText)
|
|
quantityWidth := lipgloss.Width(quantityText)
|
|
totalPriceWidth := lipgloss.Width(totalPriceText)
|
|
spacing := boxWidth - nameAndPriceWidth - quantityWidth - totalPriceWidth - 8 // 8 for padding and gaps
|
|
|
|
if spacing < 1 {
|
|
spacing = 1
|
|
}
|
|
|
|
contentLine1 := nameText + individualPriceText +
|
|
lipgloss.NewStyle().Width(spacing).Render("") +
|
|
quantityText + " " + totalPriceText
|
|
|
|
contentLine2 := infoText
|
|
|
|
boxContent := contentLine1 + "\n" + contentLine2
|
|
|
|
// Create box for this item - highlight if it's the selected item
|
|
var itemBox lipgloss.Style
|
|
if idx == m.CartCursor {
|
|
itemBox = lipgloss.NewStyle().
|
|
Border(lipgloss.NormalBorder(), true).
|
|
BorderForeground(lipgloss.Color("#FFFFFF")).
|
|
Padding(boxPadding, 2).
|
|
Width(boxWidth).
|
|
Foreground(lipgloss.Color("#FFFFFF")).
|
|
Bold(true)
|
|
} else {
|
|
itemBox = lipgloss.NewStyle().
|
|
Border(lipgloss.NormalBorder()).
|
|
BorderForeground(lipgloss.Color("#666666")).
|
|
Padding(boxPadding, 2).
|
|
Width(boxWidth).
|
|
Foreground(lipgloss.Color("#FFFFFF"))
|
|
}
|
|
|
|
// Center the box
|
|
centered := lipgloss.NewStyle().
|
|
Width(m.WindowWidth).
|
|
Align(lipgloss.Center)
|
|
|
|
cartItems += centered.Render(itemBox.Render(boxContent))
|
|
|
|
// Add spacing between items
|
|
if idx < len(itemSlice)-1 {
|
|
cartItems += "\n"
|
|
}
|
|
}
|
|
|
|
return cartItems
|
|
}
|