fix: SFTP auto-refresh + filter mode + delete refresh

- Clear dirCache before refresh after transfer/delete/mkdir
- Cache was stale: old entries returned instead of fresh data
- Filter mode: allow commands (c,d,n,r) and nav (↑↓,Tab) to pass through
- Filter mode no longer blocks transfer/delete/mkdir/pane-switch
- Delete: clear cache + program.Send() for re-render
- Mkdir: clear cache + program.Send() for re-render
This commit is contained in:
swanadiva
2026-06-24 16:19:56 +07:00
parent 55b5c7b5a0
commit eb663c2634
2 changed files with 47 additions and 3 deletions
+8
View File
@@ -59,6 +59,14 @@
- After transfer: `t.program.Send(sftpRefreshMsg{})` triggers re-render - After transfer: `t.program.Send(sftpRefreshMsg{})` triggers re-render
- Model stores program reference, passes it to SFTP tab on creation - Model stores program reference, passes it to SFTP tab on creation
### SFTP Bug Fixes
- Auto-refresh: clear dirCache before refresh after transfer/delete/mkdir
- Cache was stale after file operations — old entries returned instead of fresh
- Filter mode: allow command keys (c, d, n, r) and navigation (↑↓, Tab) to pass through
- Filter mode no longer blocks transfer, delete, mkdir, or pane switch
- Delete: clear cache + trigger re-render after file removal
- Mkdir: clear cache + trigger re-render after directory creation
## v1.0.0 (2025-01-30) ## v1.0.0 (2025-01-30)
### Added ### Added
+39 -3
View File
@@ -293,6 +293,10 @@ func (t *SFTPBrowserTab) Update(msg tea.Msg) (Tab, tea.Cmd) {
p.filter = p.filter[:len(p.filter)-1] p.filter = p.filter[:len(p.filter)-1]
} }
return t, nil return t, nil
case "tab", "up", "k", "down", "j":
// Allow navigation and pane switch in filter mode
case "c", "d", "n", "r":
// Allow commands in filter mode
default: default:
if len(msg.Runes) == 1 { if len(msg.Runes) == 1 {
p.filter += string(msg.Runes[0]) p.filter += string(msg.Runes[0])
@@ -496,7 +500,15 @@ func (t *SFTPBrowserTab) copyFile(srcType, dstType paneType, srcPath, dstPath, n
t.transferring = false t.transferring = false
t.mu.Unlock() t.mu.Unlock()
// Auto-refresh destination pane // Auto-refresh destination pane (clear cache first)
t.mu.Lock()
if dstType == paneRemote {
delete(t.right.dirCache, t.right.cwd)
} else {
delete(t.left.dirCache, t.left.cwd)
}
t.mu.Unlock()
if dstType == paneRemote { if dstType == paneRemote {
t.refreshRemote() t.refreshRemote()
} else { } else {
@@ -606,10 +618,24 @@ func (t *SFTPBrowserTab) deleteItem(fullPath string, isDir bool, isRemote bool)
t.transferMsg = "" t.transferMsg = ""
t.mu.Unlock() t.mu.Unlock()
// Clear cache and refresh
t.mu.Lock()
if isRemote { if isRemote {
go t.refreshRemote() delete(t.right.dirCache, t.right.cwd)
} else { } else {
go t.refreshLocal() delete(t.left.dirCache, t.left.cwd)
}
t.mu.Unlock()
if isRemote {
t.refreshRemote()
} else {
t.refreshLocal()
}
// Trigger re-render
if t.program != nil {
t.program.Send(sftpRefreshMsg{})
} }
} }
@@ -630,7 +656,17 @@ func (t *SFTPBrowserTab) mkdirRemote() {
t.mu.Unlock() t.mu.Unlock()
return return
} }
// Clear cache and refresh
t.mu.Lock()
delete(t.right.dirCache, cwd)
t.mu.Unlock()
t.refreshRemote() t.refreshRemote()
// Trigger re-render
if t.program != nil {
t.program.Send(sftpRefreshMsg{})
}
} }
func (t *SFTPBrowserTab) View() string { func (t *SFTPBrowserTab) View() string {