package header import ( "fmt" "github.com/mrusme/gobbs/ui/ctx" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) var ( highlight = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"} banner = `█▗▀▀▖██▀▀▀▖▗▀▀▀▀▀▀▖▗▀▀▀▀▀▖█▗▀▀▖█▗▀▀▀▖█▗▀▀▀▖█▗▀▀▀▖▗▀▀▀▀▀▖▗▀▀▀▀▀▀▖█▗▀▀▀▀▀▀▗▀▀▀▖▗▀▀▀▖█████████████████ █▐▗▀▖▀▖▐▐▀▐▘▗▘▘▝▘▝▐▘▗▘▘▀▗▝▖▘▐▀▝▀▗▀▘▀▖█▗▀▝▗▝▀▘▞▐▝▗▘▞▀▘▝▖▝▐▝▝▘▝▝▖▝▗▘▖▘▝▝▘▀▐▝▘▖▝▘▗▐▀▐█████████████████ █▐▀▀▘▀▀▀▀▀▐▀▀▀▀▀▀▘▝▀▀▀▘▝▘▀▐▀▘▀▗▀▀▀▀▀▘█▗▀▖▝▞▗▞▘▐▝▐▝▐▐▝▀▖▀▗▘▘▝▝▀▐▀▐▀▐▖▖▗▐▘▐▝▘▝▖▗▘▐▘▐▗▗▀▀▗▀▀▀▀▖▗▗▗▗▀▖▖ █▝▀▀▀▀▝▀▘▀▐▀▀▀▀▀▀▘▝▀▀▀▀▝▘▀▘▀▘▀▀▀▝▀▀▀▘█▝▀▀▀▀▘▀▀▝▀▝▀▀▘▀▀▀▀▝▀▝▀▝▀▀▀▝▀▝▀▀▀▘▀▝▀▀▀▘▝▀▞▀▘▗▀▀▀▀▀▝▀▐▀▗▘▖▗▝▖▐ █▐▀▀▖▝▞▀▀▀▐▞▀▀▀▀▀▀▐▗▀▀▀▀▀▀▘▀▖▀▖▝▗▀▀▀▘█▗▀▀▀▘▀▐▀▗▀▝▀▀▀▀▀▀▖▐▀▀▀▀▀▀▖▝▀▀▀▀▀▀▘▖▀▀▀▗▐▝▖▀▘▘▐▖▞▐▝▝▘▐▖▘▐▐▝▗▘▐ █▝▀▀▘██▀▀▀▘▝▀▀▀▀▀▀▘▝▀▀▀▀▀▘█▀▀▀▘█▝▀▀▘██▝▀▀▀▘▘▝▀▀▀▘▝▀▀▀▀▀▘▝▀▀▀▀▀▘▘█▝▀▀▀▀▖▐▐▀▖▘▀▀▗▀▀▀▀▀▀▘▝▀▀▝▘▝▀▘▝▘▀▘▘` ) type Model struct { ctx *ctx.Ctx spinner spinner.Model } func NewModel(c *ctx.Ctx) Model { m := Model{ ctx: c, } m.spinner = spinner.New() m.spinner.Spinner = spinner.Dot m.spinner.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205")) return m } func (m Model) Init() tea.Cmd { return m.spinner.Tick } func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { var cmds []tea.Cmd if m.ctx.Loading == true { cmds = append(cmds, m.spinner.Tick) } else { return m, nil } switch msg := msg.(type) { case spinner.TickMsg: var cmd tea.Cmd m.spinner, cmd = m.spinner.Update(msg) cmds = append(cmds, cmd) } return m, tea.Batch(cmds...) } func (m Model) View() string { var row string var spinner string = "" selectorWidth := 40 selectorTextLen := selectorWidth - 7 selector := lipgloss.NewStyle(). Foreground(lipgloss.Color("#7fffd4")). BorderForeground(lipgloss.Color("#7fffd4")). Border(lipgloss.NormalBorder()). Padding(0, 1, 0, 1). Width(selectorWidth) curSysIdx := m.ctx.GetCurrentSystem() var currentSystem string = "All" if curSysIdx >= 0 { currentSystem = (*m.ctx.Systems[curSysIdx]).Title() if len(currentSystem) > selectorTextLen { currentSystem = currentSystem[0:selectorTextLen] } } curForum := m.ctx.GetCurrentForum() var currentForum string = "All" if curForum.ID != "" { currentForum = curForum.Title() if len(currentForum) > selectorTextLen { currentForum = currentForum[0:selectorTextLen] } } systemSelector := selector.Render(fmt.Sprintf("⏷ %s", currentSystem)) forumSelector := selector.Render(fmt.Sprintf("⏷ %s", currentForum)) selectorColumn := lipgloss.JoinVertical(lipgloss.Center, lipgloss.JoinHorizontal(lipgloss.Bottom, "System: \n "+ lipgloss.NewStyle().Foreground(m.ctx.Theme.DialogBox.Bottombar.GetForeground()).Render("C-e"), systemSelector), lipgloss.JoinHorizontal(lipgloss.Bottom, "Forum: \n "+ lipgloss.NewStyle().Foreground(m.ctx.Theme.DialogBox.Bottombar.GetForeground()).Render("C-t"), forumSelector), ) if m.ctx.Loading == true { spinner = m.spinner.View() } row = lipgloss.JoinHorizontal(lipgloss.Top, banner, " ", selectorColumn, " ", spinner) return row }