fix: persist vault list across app updates
Vault list was stored only in React useState, lost on every app restart or update. Now persisted to ~/.config/com.laputa.app/vaults.json via Rust backend commands (load_vault_list, save_vault_list). - Add vault_list.rs module with VaultEntry/VaultList types and JSON I/O - Register load_vault_list/save_vault_list Tauri commands - Extract vaultListStore.ts utility for frontend persistence calls - Rewrite useVaultSwitcher to load on mount and persist on change - Show unavailable vaults greyed out with warning icon instead of silently removing them - Add mock handlers for browser/test environments - Add useVaultSwitcher tests covering persistence, availability, dedup Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
36
src/utils/vaultListStore.ts
Normal file
36
src/utils/vaultListStore.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { isTauri, mockInvoke } from '../mock-tauri'
|
||||
import type { VaultOption } from '../components/StatusBar'
|
||||
|
||||
export interface PersistedVaultList {
|
||||
vaults: Array<{ label: string; path: string }>
|
||||
active_vault: string | null
|
||||
}
|
||||
|
||||
function tauriCall<T>(command: string, args: Record<string, unknown>): Promise<T> {
|
||||
return isTauri() ? invoke<T>(command, args) : mockInvoke<T>(command, args)
|
||||
}
|
||||
|
||||
async function checkAvailability(v: { label: string; path: string }): Promise<VaultOption> {
|
||||
try {
|
||||
const exists = await tauriCall<boolean>('check_vault_exists', { path: v.path })
|
||||
return { label: v.label, path: v.path, available: exists }
|
||||
} catch {
|
||||
return { label: v.label, path: v.path, available: false }
|
||||
}
|
||||
}
|
||||
|
||||
export async function loadVaultList(): Promise<{ vaults: VaultOption[]; activeVault: string | null }> {
|
||||
const data = await tauriCall<PersistedVaultList>('load_vault_list', {})
|
||||
const persisted = data?.vaults ?? []
|
||||
const checked = await Promise.all(persisted.map(checkAvailability))
|
||||
return { vaults: checked, activeVault: data?.active_vault ?? null }
|
||||
}
|
||||
|
||||
export function saveVaultList(vaults: VaultOption[], activeVault: string): Promise<void> {
|
||||
const list: PersistedVaultList = {
|
||||
vaults: vaults.map(v => ({ label: v.label, path: v.path })),
|
||||
active_vault: activeVault,
|
||||
}
|
||||
return tauriCall('save_vault_list', { list })
|
||||
}
|
||||
Reference in New Issue
Block a user