1package logs
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5 tea "github.com/charmbracelet/bubbletea/v2"
6 "github.com/charmbracelet/crush/internal/tui/components/core"
7 "github.com/charmbracelet/crush/internal/tui/components/core/layout"
8 logsComponents "github.com/charmbracelet/crush/internal/tui/components/logs"
9 "github.com/charmbracelet/crush/internal/tui/page"
10 "github.com/charmbracelet/crush/internal/tui/page/chat"
11 "github.com/charmbracelet/crush/internal/tui/styles"
12 "github.com/charmbracelet/crush/internal/tui/util"
13 "github.com/charmbracelet/lipgloss/v2"
14)
15
16var LogsPage page.PageID = "logs"
17
18type LogPage interface {
19 util.Model
20 layout.Sizeable
21}
22
23type logsPage struct {
24 width, height int
25 table logsComponents.TableComponent
26 details logsComponents.DetailComponent
27 keyMap KeyMap
28}
29
30func (p *logsPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
31 var cmds []tea.Cmd
32 switch msg := msg.(type) {
33 case tea.WindowSizeMsg:
34 p.width = msg.Width
35 p.height = msg.Height
36 return p, p.SetSize(msg.Width, msg.Height)
37 case tea.KeyMsg:
38 switch {
39 case key.Matches(msg, p.keyMap.Back):
40 return p, util.CmdHandler(page.PageChangeMsg{ID: chat.ChatPageID})
41 }
42 }
43
44 table, cmd := p.table.Update(msg)
45 cmds = append(cmds, cmd)
46 p.table = table.(logsComponents.TableComponent)
47 details, cmd := p.details.Update(msg)
48 cmds = append(cmds, cmd)
49 p.details = details.(logsComponents.DetailComponent)
50
51 return p, tea.Batch(cmds...)
52}
53
54func (p *logsPage) View() string {
55 baseStyle := styles.CurrentTheme().S().Base
56 style := baseStyle.Width(p.width).Height(p.height).Padding(1)
57 title := core.Title("Logs", p.width-2)
58
59 return style.Render(
60 lipgloss.JoinVertical(lipgloss.Top,
61 title,
62 p.details.View(),
63 p.table.View(),
64 ),
65 )
66}
67
68// GetSize implements LogPage.
69func (p *logsPage) GetSize() (int, int) {
70 return p.width, p.height
71}
72
73// SetSize implements LogPage.
74func (p *logsPage) SetSize(width int, height int) tea.Cmd {
75 p.width = width
76 p.height = height
77 availableHeight := height - 2 // Padding for top and bottom
78 availableHeight -= 1 // title height
79 return tea.Batch(
80 p.table.SetSize(width-2, availableHeight/2),
81 p.details.SetSize(width-2, availableHeight/2),
82 )
83}
84
85func (p *logsPage) Init() tea.Cmd {
86 return tea.Batch(
87 p.table.Init(),
88 p.details.Init(),
89 )
90}
91
92func NewLogsPage() LogPage {
93 return &logsPage{
94 details: logsComponents.NewLogsDetails(),
95 table: logsComponents.NewLogsTable(),
96 keyMap: DefaultKeyMap(),
97 }
98}