Fixes to message/conversation handling in tui chat view
This set of changes fixes root/child message cycling and ensures all database operations happen within a `tea.Cmd`
This commit is contained in:
@@ -71,10 +71,15 @@ func (m *Model) handleMessagesKey(msg tea.KeyMsg) (bool, tea.Cmd) {
|
||||
m.input.Focus()
|
||||
return true, nil
|
||||
case "e":
|
||||
message := m.messages[m.selectedMessage]
|
||||
cmd := tuiutil.OpenTempfileEditor("message.*.md", message.Content, "# Edit the message below\n")
|
||||
m.editorTarget = selectedMessage
|
||||
return true, cmd
|
||||
if m.selectedMessage < len(m.messages) {
|
||||
m.editorTarget = selectedMessage
|
||||
return true, tuiutil.OpenTempfileEditor(
|
||||
"message.*.md",
|
||||
m.messages[m.selectedMessage].Content,
|
||||
"# Edit the message below\n",
|
||||
)
|
||||
}
|
||||
return false, nil
|
||||
case "ctrl+k":
|
||||
if m.selectedMessage > 0 && len(m.messages) == len(m.messageOffsets) {
|
||||
m.selectedMessage--
|
||||
@@ -97,34 +102,14 @@ func (m *Model) handleMessagesKey(msg tea.KeyMsg) (bool, tea.Cmd) {
|
||||
dir = CycleNext
|
||||
}
|
||||
|
||||
var err error
|
||||
var selected *models.Message
|
||||
var cmd tea.Cmd
|
||||
if m.selectedMessage == 0 {
|
||||
selected, err = m.cycleSelectedRoot(m.conversation, dir)
|
||||
if err != nil {
|
||||
return true, shared.WrapError(fmt.Errorf("Could not cycle conversation root: %v", err))
|
||||
}
|
||||
cmd = m.cycleSelectedRoot(m.conversation, dir)
|
||||
} else if m.selectedMessage > 0 {
|
||||
selected, err = m.cycleSelectedReply(&m.messages[m.selectedMessage-1], dir)
|
||||
if err != nil {
|
||||
return true, shared.WrapError(fmt.Errorf("Could not cycle reply: %v", err))
|
||||
}
|
||||
cmd = m.cycleSelectedReply(&m.messages[m.selectedMessage-1], dir)
|
||||
}
|
||||
|
||||
if selected == nil {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// Retrieve updated view at this point
|
||||
newPath, err := m.State.Ctx.Store.PathToLeaf(selected)
|
||||
if err != nil {
|
||||
m.State.Err = fmt.Errorf("Could not fetch messages: %v", err)
|
||||
}
|
||||
|
||||
m.messages = append(m.messages[:m.selectedMessage], newPath...)
|
||||
m.rebuildMessageCache()
|
||||
m.updateContent()
|
||||
return true, nil
|
||||
return cmd != nil, cmd
|
||||
case "ctrl+r":
|
||||
// resubmit the conversation with all messages up until and including the selected message
|
||||
if m.waitingForReply || len(m.messages) == 0 {
|
||||
@@ -177,17 +162,16 @@ func (m *Model) handleInputKey(msg tea.KeyMsg) (bool, tea.Cmd) {
|
||||
|
||||
m.input.SetValue("")
|
||||
|
||||
var cmds []tea.Cmd
|
||||
if m.persistence {
|
||||
err := m.persistConversation()
|
||||
if err != nil {
|
||||
return true, shared.WrapError(err)
|
||||
}
|
||||
cmds = append(cmds, m.persistConversation())
|
||||
}
|
||||
|
||||
cmd := m.promptLLM()
|
||||
cmds = append(cmds, m.promptLLM())
|
||||
|
||||
m.updateContent()
|
||||
m.content.GotoBottom()
|
||||
return true, cmd
|
||||
return true, tea.Batch(cmds...)
|
||||
case "ctrl+e":
|
||||
cmd := tuiutil.OpenTempfileEditor("message.*.md", m.input.Value(), "# Edit your input below\n")
|
||||
m.editorTarget = input
|
||||
|
||||
Reference in New Issue
Block a user