@@ -7,6 +7,7 @@ import (
77 "os"
88 "slices"
99 "strings"
10+ "time"
1011
1112 "charm.land/bubbles/v2/help"
1213 "charm.land/bubbles/v2/key"
@@ -177,7 +178,10 @@ func (m *UI) Init() tea.Cmd {
177178 }
178179 allSessions, _ := m.com.App.Sessions.List(context.Background())
179180 if len(allSessions) > 0 {
180− cmds = append(cmds, m.loadSession(allSessions[0].ID))
181+ cmds = append(cmds, func() tea.Msg {
182+ time.Sleep(2 * time.Second)
183+ return m.loadSession(allSessions[0].ID)()
184+ })
181185 }
182186 return tea.Batch(cmds...)
183187}
@@ -300,10 +304,30 @@ func (m *UI) handleKeyPressMsg(msg tea.KeyPressMsg) (cmds []tea.Cmd) {
300304 return m.updateDialogs(msg)
301305 }
302306
303− switch {
304− case key.Matches(msg, m.keyMap.Tab):
305− switch m.state {
306− case uiChat:
307+ handleGlobalKeys := func(msg tea.KeyPressMsg) {
308+ switch {
309+ case key.Matches(msg, m.keyMap.Tab):
310+ case key.Matches(msg, m.keyMap.Help):
311+ m.help.ShowAll = !m.help.ShowAll
312+ m.updateLayoutAndSize()
313+ case key.Matches(msg, m.keyMap.Quit):
314+ if !m.dialog.ContainsDialog(dialog.QuitDialogID) {
315+ m.dialog.AddDialog(dialog.NewQuit(m.com))
316+ return
317+ }
318+ case key.Matches(msg, m.keyMap.Commands):
319+ // TODO: Implement me
320+ case key.Matches(msg, m.keyMap.Models):
321+ // TODO: Implement me
322+ case key.Matches(msg, m.keyMap.Sessions):
323+ // TODO: Implement me
324+ }
325+ }
326+
327+ switch m.state {
328+ case uiChat:
329+ switch {
330+ case key.Matches(msg, m.keyMap.Tab):
307331 if m.focus == uiFocusMain {
308332 m.focus = uiFocusEditor
309333 cmds = append(cmds, m.textarea.Focus())
@@ -314,26 +338,47 @@ func (m *UI) handleKeyPressMsg(msg tea.KeyPressMsg) (cmds []tea.Cmd) {
314338 m.chat.Focus()
315339 m.chat.SetSelectedIndex(m.chat.Len() - 1)
316340 }
341+ case key.Matches(msg, m.keyMap.Chat.Up):
342+ m.chat.ScrollBy(-1)
343+ if !m.chat.SelectedItemInView() {
344+ m.chat.SelectPrev()
345+ m.chat.ScrollToSelected()
346+ }
347+ case key.Matches(msg, m.keyMap.Chat.Down):
348+ m.chat.ScrollBy(1)
349+ if !m.chat.SelectedItemInView() {
350+ m.chat.SelectNext()
351+ m.chat.ScrollToSelected()
352+ }
353+ case key.Matches(msg, m.keyMap.Chat.UpOneItem):
354+ m.chat.SelectPrev()
355+ m.chat.ScrollToSelected()
356+ case key.Matches(msg, m.keyMap.Chat.DownOneItem):
357+ m.chat.SelectNext()
358+ m.chat.ScrollToSelected()
359+ case key.Matches(msg, m.keyMap.Chat.HalfPageUp):
360+ m.chat.ScrollBy(-m.chat.Height() / 2)
361+ m.chat.SelectFirstInView()
362+ case key.Matches(msg, m.keyMap.Chat.HalfPageDown):
363+ m.chat.ScrollBy(m.chat.Height() / 2)
364+ m.chat.SelectLastInView()
365+ case key.Matches(msg, m.keyMap.Chat.PageUp):
366+ m.chat.ScrollBy(-m.chat.Height())
367+ m.chat.SelectFirstInView()
368+ case key.Matches(msg, m.keyMap.Chat.PageDown):
369+ m.chat.ScrollBy(m.chat.Height())
370+ m.chat.SelectLastInView()
371+ case key.Matches(msg, m.keyMap.Chat.Home):
372+ m.chat.ScrollToTop()
373+ m.chat.SelectFirst()
374+ case key.Matches(msg, m.keyMap.Chat.End):
375+ m.chat.ScrollToBottom()
376+ m.chat.SelectLast()
377+ default:
378+ handleGlobalKeys(msg)
317379 }
318− case key.Matches(msg, m.keyMap.Help):
319− m.help.ShowAll = !m.help.ShowAll
320− m.updateLayoutAndSize()
321− return cmds
322− case key.Matches(msg, m.keyMap.Quit):
323− if !m.dialog.ContainsDialog(dialog.QuitDialogID) {
324− m.dialog.AddDialog(dialog.NewQuit(m.com))
325− return
326− }
327− return cmds
328− case key.Matches(msg, m.keyMap.Commands):
329− // TODO: Implement me
330− return cmds
331− case key.Matches(msg, m.keyMap.Models):
332− // TODO: Implement me
333− return cmds
334− case key.Matches(msg, m.keyMap.Sessions):
335− // TODO: Implement me
336− return cmds
380+ default:
381+ handleGlobalKeys(msg)
337382 }
338383
339384 cmds = append(cmds, m.updateFocused(msg)...)