From 59268acd04c2daae44ed7a2c0e3d451edcbde821 Mon Sep 17 00:00:00 2001 From: lucaronin Date: Tue, 21 Apr 2026 18:20:09 +0200 Subject: [PATCH] fix: guard empty vault path during startup --- src/hooks/useVaultLoader.test.ts | 17 +++++++++++++++++ src/hooks/useVaultLoader.ts | 17 ++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/hooks/useVaultLoader.test.ts b/src/hooks/useVaultLoader.test.ts index 87863322..61353dbe 100644 --- a/src/hooks/useVaultLoader.test.ts +++ b/src/hooks/useVaultLoader.test.ts @@ -160,6 +160,23 @@ describe('useVaultLoader', () => { expect(result.current.modifiedFiles[0].status).toBe('modified') }) + it('does nothing until a real vault path exists', async () => { + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + + const { result } = renderHook(() => useVaultLoader('')) + + await waitFor(() => { + expect(result.current.entries).toEqual([]) + expect(result.current.modifiedFiles).toEqual([]) + expect(result.current.modifiedFilesError).toBeNull() + }) + + expect(backendInvokeFn).not.toHaveBeenCalled() + expect(warnSpy).not.toHaveBeenCalled() + + warnSpy.mockRestore() + }) + it('loads initial vault entries from a fresh reload in Tauri mode', async () => { await enableTauriMode() backendInvokeFn.mockImplementation(((cmd: string) => { diff --git a/src/hooks/useVaultLoader.ts b/src/hooks/useVaultLoader.ts index 690379ea..a255b95e 100644 --- a/src/hooks/useVaultLoader.ts +++ b/src/hooks/useVaultLoader.ts @@ -8,6 +8,10 @@ function tauriCall(command: string, tauriArgs: Record, mockA return isTauri() ? invoke(command, tauriArgs) : mockInvoke(command, mockArgs ?? tauriArgs) } +function hasVaultPath(vaultPath: string): boolean { + return vaultPath.trim().length > 0 +} + function loadVaultEntries(vaultPath: string): Promise { const command = isTauri() ? 'reload_vault' : 'list_vault' return tauriCall(command, { path: vaultPath }) @@ -150,6 +154,11 @@ export function useVaultLoader(vaultPath: string) { setModifiedFilesError, setViews, }) + + if (!hasVaultPath(path)) { + return + } + loadVaultData(path) .then(({ entries: e }) => { if (!isCurrentVaultPath(path)) return @@ -172,8 +181,14 @@ export function useVaultLoader(vaultPath: string) { const loadModifiedFiles = useCallback(async () => { const path = vaultPath + setModifiedFilesError(null) + + if (!hasVaultPath(path)) { + setModifiedFiles([]) + return + } + try { - setModifiedFilesError(null) const files = await tauriCall('get_modified_files', { vaultPath: path }, {}) if (!isCurrentVaultPath(path)) return setModifiedFiles(files)