logs.go

 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}