diff --git a/src/App.tsx b/src/App.tsx index 2d2b0de2..8564f4f6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -165,9 +165,8 @@ function App() { }, [notes]) const handleRenameTab = useCallback(async (path: string, newTitle: string) => { - // Save any pending content before renaming so the file on disk is up to date await savePendingForPath(path) - notes.handleRenameNote(path, newTitle, vaultPath, vault.replaceEntry) + await notes.handleRenameNote(path, newTitle, vaultPath, vault.replaceEntry).then(vault.loadModifiedFiles) }, [notes, vaultPath, vault, savePendingForPath]) const { setViewMode } = useViewMode() diff --git a/src/hooks/useEditorSave.test.ts b/src/hooks/useEditorSave.test.ts index a7ba5c4c..c74e1d32 100644 --- a/src/hooks/useEditorSave.test.ts +++ b/src/hooks/useEditorSave.test.ts @@ -124,6 +124,21 @@ describe('useEditorSave', () => { expect(onAfterSave).toHaveBeenCalledOnce() }) + it('calls onAfterSave even when nothing is pending (e.g. after rename)', async () => { + const onAfterSave = vi.fn() + const { result } = renderHook(() => + useEditorSave({ updateVaultContent, setTabs, setToastMessage, onAfterSave }) + ) + + // No content buffered — simulate Cmd+S after a rename that already flushed pending + await act(async () => { + await result.current.handleSave() + }) + + expect(setToastMessage).toHaveBeenCalledWith('Nothing to save') + expect(onAfterSave).toHaveBeenCalledOnce() + }) + it('does not call onAfterSave when save fails', async () => { mockInvokeFn.mockRejectedValueOnce(new Error('Disk full')) const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}) diff --git a/src/hooks/useEditorSave.ts b/src/hooks/useEditorSave.ts index e6fdb657..855192b3 100644 --- a/src/hooks/useEditorSave.ts +++ b/src/hooks/useEditorSave.ts @@ -45,8 +45,7 @@ export function useEditorSave({ updateVaultContent, setTabs, setToastMessage, on const handleSave = useCallback(async () => { try { const saved = await flushPending() - if (!saved) { setToastMessage('Nothing to save'); return } - setToastMessage('Saved') + setToastMessage(saved ? 'Saved' : 'Nothing to save') onAfterSave?.() } catch (err) { console.error('Save failed:', err)