aboutsummaryrefslogtreecommitdiff
path: root/internal/app/update.go
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-30 11:15:03 +0000
committerFuwn <[email protected]>2026-01-30 11:15:03 +0000
commit17907eaa447a8061cc1425f0c892c0c077701d13 (patch)
treeeabbfce08f75fd6269cf91f9547ecbd4c30dda7c /internal/app/update.go
parentfix: improve orphaned session handling (diff)
downloadfaustus-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.go82
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":