diff options
| author | Fuwn <[email protected]> | 2026-01-30 11:15:03 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-30 11:15:03 +0000 |
| commit | 17907eaa447a8061cc1425f0c892c0c077701d13 (patch) | |
| tree | eabbfce08f75fd6269cf91f9547ecbd4c30dda7c /internal/app/update.go | |
| parent | fix: improve orphaned session handling (diff) | |
| download | faustus-17907eaa447a8061cc1425f0c892c0c077701d13.tar.xz faustus-17907eaa447a8061cc1425f0c892c0c077701d13.zip | |
feat: Add folder reassignment for relocated projects
Diffstat (limited to 'internal/app/update.go')
| -rw-r--r-- | internal/app/update.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/app/update.go b/internal/app/update.go index 7e8409e..eaadef9 100644 --- a/internal/app/update.go +++ b/internal/app/update.go @@ -32,6 +32,8 @@ func (m Model) Update(message tea.Msg) (tea.Model, tea.Cmd) { return m.handleRenameMode(typedMessage) case ModeConfirm: return m.handleConfirmMode(typedMessage) + case ModeReassign: + return m.handleReassignMode(typedMessage) default: return m.handleNormalMode(typedMessage) } @@ -198,6 +200,32 @@ func (m Model) handleNormalMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { return m, textinput.Blink } + case key.Matches(keyMessage, m.keys.Reassign): + if len(m.filtered) > 0 { + session := &m.filtered[m.cursor] + + m.reassignInput.SetValue(session.ProjectPath) + m.reassignInput.Focus() + + m.reassignAll = false + m.mode = ModeReassign + + return m, textinput.Blink + } + + case key.Matches(keyMessage, m.keys.ReassignAll): + if len(m.filtered) > 0 { + session := &m.filtered[m.cursor] + + m.reassignInput.SetValue(session.ProjectPath) + m.reassignInput.Focus() + + m.reassignAll = true + m.mode = ModeReassign + + return m, textinput.Blink + } + case key.Matches(keyMessage, m.keys.Clear): if m.tab == TabTrash { m.confirmAction = ConfirmEmptyTrash @@ -382,6 +410,60 @@ func (m Model) handleRenameMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { return m, command } +func (m Model) handleReassignMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { + switch { + case key.Matches(keyMessage, m.keys.Escape): + m.mode = ModeNormal + + m.reassignInput.Blur() + + return m, nil + + case key.Matches(keyMessage, m.keys.Enter): + if len(m.filtered) > 0 { + newPath := m.reassignInput.Value() + + if newPath != "" { + session := m.selectedSession() + + if session != nil { + oldPath := session.ProjectPath + + if m.reassignAll { + count, reassignError := claude.ReassignProjectPath(oldPath, newPath) + + if reassignError != nil { + m.setMessage(fmt.Sprintf("Error: %v", reassignError)) + } else { + m.setMessage(fmt.Sprintf("Reassigned %d sessions", count)) + m.reloadSessions() + } + } else { + if reassignError := claude.ReassignSessionPath(session, newPath); reassignError != nil { + m.setMessage(fmt.Sprintf("Error: %v", reassignError)) + } else { + m.setMessage("Reassigned") + m.reloadSessions() + } + } + } + } + } + + m.mode = ModeNormal + + m.reassignInput.Blur() + + return m, nil + } + + var command tea.Cmd + + m.reassignInput, command = m.reassignInput.Update(keyMessage) + + return m, command +} + func (m Model) handleConfirmMode(keyMessage tea.KeyMsg) (tea.Model, tea.Cmd) { switch { case key.Matches(keyMessage, m.keys.Escape), keyMessage.String() == "n", keyMessage.String() == "N": |