diff options
| author | Kujtim Hoxha <[email protected]> | 2025-04-12 02:01:45 +0200 |
|---|---|---|
| committer | Kujtim Hoxha <[email protected]> | 2025-04-21 13:38:42 +0200 |
| commit | 8d874b839db169906e18e4277cd198504018e022 (patch) | |
| tree | 658a1adbee42a0ca2249252827fb37f7469f3667 /internal/tui/page | |
| parent | 08bd75bb6e1fde0427dfd37204ee9a3c43bb1e5b (diff) | |
| download | opencode-8d874b839db169906e18e4277cd198504018e022.tar.gz opencode-8d874b839db169906e18e4277cd198504018e022.zip | |
add initial message handling
Diffstat (limited to 'internal/tui/page')
| -rw-r--r-- | internal/tui/page/chat.go | 92 |
1 files changed, 82 insertions, 10 deletions
diff --git a/internal/tui/page/chat.go b/internal/tui/page/chat.go index de5b3910f..7ac0d2293 100644 --- a/internal/tui/page/chat.go +++ b/internal/tui/page/chat.go @@ -3,28 +3,100 @@ package page import ( tea "github.com/charmbracelet/bubbletea" "github.com/kujtimiihoxha/termai/internal/app" + "github.com/kujtimiihoxha/termai/internal/message" + "github.com/kujtimiihoxha/termai/internal/session" "github.com/kujtimiihoxha/termai/internal/tui/components/chat" "github.com/kujtimiihoxha/termai/internal/tui/layout" + "github.com/kujtimiihoxha/termai/internal/tui/util" ) var ChatPage PageID = "chat" -func NewChatPage(app *app.App) tea.Model { - messagesContainer := layout.NewContainer( - chat.NewMessagesCmp(), +type chatPage struct { + app *app.App + layout layout.SplitPaneLayout + session session.Session +} + +func (p *chatPage) Init() tea.Cmd { + return p.layout.Init() +} + +func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.WindowSizeMsg: + p.layout.SetSize(msg.Width, msg.Height) + case chat.SendMsg: + cmd := p.sendMessage(msg.Text) + if cmd != nil { + return p, cmd + } + } + u, cmd := p.layout.Update(msg) + p.layout = u.(layout.SplitPaneLayout) + if cmd != nil { + return p, cmd + } + return p, nil +} + +func (p *chatPage) setSidebar() tea.Cmd { + sidebarContainer := layout.NewContainer( + chat.NewSidebarCmp(p.session), layout.WithPadding(1, 1, 1, 1), ) - sidebarContainer := layout.NewContainer( - chat.NewSidebarCmp(), + p.layout.SetRightPanel(sidebarContainer) + width, height := p.layout.GetSize() + p.layout.SetSize(width, height) + return sidebarContainer.Init() +} + +func (p *chatPage) sendMessage(text string) tea.Cmd { + var cmds []tea.Cmd + if p.session.ID == "" { + session, err := p.app.Sessions.Create("New Session") + if err != nil { + return util.ReportError(err) + } + + p.session = session + cmd := p.setSidebar() + if cmd != nil { + cmds = append(cmds, cmd) + } + cmds = append(cmds, util.CmdHandler(chat.SessionSelectedMsg(session))) + } + // TODO: actually call agent + p.app.Messages.Create(p.session.ID, message.CreateMessageParams{ + Role: message.User, + Parts: []message.ContentPart{ + message.TextContent{ + Text: text, + }, + }, + }) + return tea.Batch(cmds...) +} + +func (p *chatPage) View() string { + return p.layout.View() +} + +func NewChatPage(app *app.App) tea.Model { + messagesContainer := layout.NewContainer( + chat.NewMessagesCmp(app), layout.WithPadding(1, 1, 1, 1), ) + editorContainer := layout.NewContainer( chat.NewEditorCmp(), layout.WithBorder(true, false, false, false), ) - return layout.NewSplitPane( - layout.WithRightPanel(sidebarContainer), - layout.WithLeftPanel(messagesContainer), - layout.WithBottomPanel(editorContainer), - ) + return &chatPage{ + app: app, + layout: layout.NewSplitPane( + layout.WithLeftPanel(messagesContainer), + layout.WithBottomPanel(editorContainer), + ), + } } |
