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() 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}