summaryrefslogtreecommitdiffhomepage
path: root/internal/tui/page
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-12 02:01:45 +0200
committerKujtim Hoxha <[email protected]>2025-04-21 13:38:42 +0200
commit8d874b839db169906e18e4277cd198504018e022 (patch)
tree658a1adbee42a0ca2249252827fb37f7469f3667 /internal/tui/page
parent08bd75bb6e1fde0427dfd37204ee9a3c43bb1e5b (diff)
downloadopencode-8d874b839db169906e18e4277cd198504018e022.tar.gz
opencode-8d874b839db169906e18e4277cd198504018e022.zip
add initial message handling
Diffstat (limited to 'internal/tui/page')
-rw-r--r--internal/tui/page/chat.go92
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),
+ ),
+ }
}