import { useCallback, useEffect, useState } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { load } from '@tauri-apps/plugin-store'; import { GAME_DIR_KEY, SETTINGS_FILE, SETTINGS_FILE_OPTIONS } from '../lib/store'; /** * Owns the user's selected game directory. Hydrates from the persistent store * on mount, writes back on every change, and pushes the value to the Tauri * backend so it can scan/rescan. */ export const useGameDirectory = () => { const [gameDir, setGameDir] = useState(''); const [gameDirExists, setGameDirExists] = useState(false); useEffect(() => { let cancelled = false; const hydrate = async () => { try { const store = await load(SETTINGS_FILE, SETTINGS_FILE_OPTIONS); const saved = await store.get(GAME_DIR_KEY); if (saved && !cancelled) setGameDir(saved); } catch (err) { console.error('Failed to load game directory:', err); } }; void hydrate(); return () => { cancelled = true; }; }, []); useEffect(() => { if (!gameDir.trim()) { setGameDirExists(false); return; } let cancelled = false; const sync = async () => { try { const store = await load(SETTINGS_FILE, SETTINGS_FILE_OPTIONS); await store.set(GAME_DIR_KEY, gameDir); } catch (err) { console.error('Failed to persist game directory:', err); } let exists = false; try { exists = await invoke('game_directory_exists', { path: gameDir }); } catch (err) { console.error('Failed to validate game directory:', err); } if (cancelled) return; setGameDirExists(exists); if (!exists) return; invoke('update_game_directory', { path: gameDir }).catch(err => console.error('Failed to push game directory to backend:', err), ); }; void sync(); return () => { cancelled = true; }; }, [gameDir]); const rescan = useCallback(() => { if (!gameDir.trim()) { setGameDirExists(false); return; } const sync = async () => { let exists = false; try { exists = await invoke('game_directory_exists', { path: gameDir }); } catch (err) { console.error('Failed to validate game directory:', err); } setGameDirExists(exists); if (!exists) return; invoke('update_game_directory', { path: gameDir }).catch(err => console.error('Failed to rescan game directory:', err), ); }; void sync(); }, [gameDir]); return { gameDir, gameDirExists, setGameDir, rescan }; };