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() tea.View {
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 tea.NewView(
60 style.Render(
61 lipgloss.JoinVertical(lipgloss.Top,
62 title,
63 p.details.View().String(),
64 p.table.View().String(),
65 ),
66 ),
67 )
68}
69
70// GetSize implements LogPage.
71func (p *logsPage) GetSize() (int, int) {
72 return p.width, p.height
73}
74
75// SetSize implements LogPage.
76func (p *logsPage) SetSize(width int, height int) tea.Cmd {
77 p.width = width
78 p.height = height
79 availableHeight := height - 2 // Padding for top and bottom
80 availableHeight -= 1 // title height
81 return tea.Batch(
82 p.table.SetSize(width-2, availableHeight/2),
83 p.details.SetSize(width-2, availableHeight/2),
84 )
85}
86
87func (p *logsPage) Init() tea.Cmd {
88 return tea.Batch(
89 p.table.Init(),
90 p.details.Init(),
91 )
92}
93
94func NewLogsPage() LogPage {
95 return &logsPage{
96 details: logsComponents.NewLogsDetails(),
97 table: logsComponents.NewLogsTable(),
98 keyMap: DefaultKeyMap(),
99 }
100}