import { invoke } from '@tauri-apps/api/core' import { isTauri, mockInvoke } from '../mock-tauri' import type { FolderNode, GitPushResult, VaultEntry, ViewFile } from '../types' import { normalizeVaultEntries, normalizeViewFiles } from '../utils/vaultMetadataNormalization' interface TauriCallOptions { command: string tauriArgs: Record mockArgs?: Record } interface VaultPathOptions { vaultPath: string } interface CommitWithPushOptions extends VaultPathOptions { message: string } interface LoadedVaultData { entries: VaultEntry[] } interface LoadedVaultChrome { folders: FolderNode[] views: ViewFile[] } export function hasVaultPath({ vaultPath }: VaultPathOptions): boolean { return vaultPath.trim().length > 0 } export function tauriCall({ command, tauriArgs, mockArgs }: TauriCallOptions): Promise { return isTauri() ? invoke(command, tauriArgs) : mockInvoke(command, mockArgs ?? tauriArgs) } function loadVaultEntriesWithCommand({ vaultPath, command }: VaultPathOptions & { command: string }): Promise { return tauriCall({ command, tauriArgs: { path: vaultPath } }) .then((entries) => normalizeVaultEntries(entries, vaultPath)) } function loadVaultEntries({ vaultPath }: VaultPathOptions): Promise { const command = isTauri() ? 'reload_vault' : 'list_vault' return loadVaultEntriesWithCommand({ vaultPath, command }) } export function reloadVaultEntries({ vaultPath }: VaultPathOptions): Promise { return loadVaultEntriesWithCommand({ vaultPath, command: 'reload_vault' }) } export function loadVaultFolders({ vaultPath }: VaultPathOptions): Promise { return tauriCall({ command: 'list_vault_folders', tauriArgs: { path: vaultPath } }) } export function loadVaultViews({ vaultPath }: VaultPathOptions): Promise { return tauriCall({ command: 'list_views', tauriArgs: { vaultPath } }) .then(normalizeViewFiles) } export async function loadVaultData({ vaultPath }: VaultPathOptions): Promise { if (!isTauri()) console.info('[mock] Using mock Tauri data for browser testing') const entries = await loadVaultEntries({ vaultPath }) console.log(`Vault scan complete: ${entries.length} entries found`) return { entries } } export async function loadVaultChrome({ vaultPath }: VaultPathOptions): Promise { const [folders, views] = await Promise.all([ loadVaultFolders({ vaultPath }).catch(() => [] as FolderNode[]), loadVaultViews({ vaultPath }).catch(() => [] as ViewFile[]), ]) return { folders: folders ?? [], views: views ?? [], } } export async function commitWithPush({ vaultPath, message }: CommitWithPushOptions): Promise { if (!isTauri()) { await mockInvoke('git_commit', { message }) return mockInvoke('git_push', {}) } await invoke('git_commit', { vaultPath, message }) return invoke('git_push', { vaultPath }) }