import { useCallback } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { type UseGamesResult } from './useGames'; import { type UISettings } from './useSettings'; export interface GameActions { play: (id: string) => Promise; startServer: (id: string) => Promise; install: (id: string) => Promise; update: (id: string) => Promise; uninstall: (id: string) => Promise; removeDownload: (id: string) => Promise; cancelDownload: (id: string) => Promise; viewFiles: (id: string) => Promise; } /** * Thin wrappers over the backend `run_game` / `install_game` / `update_game` * / `uninstall_game` / `remove_downloaded_game` commands. Peer-backed downloads * are marked as "checking peers" until the backend emits an authoritative * operation snapshot; cancellation waits for the backend to clear that snapshot. */ export const useGameActions = ( games: UseGamesResult, settings: Pick, ): GameActions => { const play = useCallback(async (id: string) => { try { await invoke('run_game', { id, language: settings.language, username: settings.username, }); } catch (err) { console.error('run_game failed:', err); } }, [settings.language, settings.username]); const startServer = useCallback(async (id: string) => { try { await invoke('start_server', { id, language: settings.language, username: settings.username, }); } catch (err) { console.error('start_server failed:', err); } }, [settings.language, settings.username]); const install = useCallback(async (id: string) => { try { const success = await invoke('install_game', { id, language: settings.language, username: settings.username, }); if (!success) return; const game = games.games.find(item => item.id === id); if (!game?.downloaded) { games.markChecking(id); } } catch (err) { console.error('install_game failed:', err); } }, [games, settings.language, settings.username]); const update = useCallback(async (id: string) => { try { const success = await invoke('update_game', { id, language: settings.language, username: settings.username, }); if (success) games.markChecking(id); } catch (err) { console.error('update_game failed:', err); } }, [games, settings.language, settings.username]); const uninstall = useCallback(async (id: string) => { try { await invoke('uninstall_game', { id }); } catch (err) { console.error('uninstall_game failed:', err); } }, []); const removeDownload = useCallback(async (id: string) => { try { await invoke('remove_downloaded_game', { id }); } catch (err) { console.error('remove_downloaded_game failed:', err); } }, []); const cancelDownload = useCallback(async (id: string) => { try { await invoke('cancel_download', { id }); } catch (err) { console.error('cancel_download failed:', err); } }, []); const viewFiles = useCallback(async (id: string) => { try { await invoke('open_game_files', { id }); } catch (err) { console.error('open_game_files failed:', err); } }, []); return { play, startServer, install, update, uninstall, removeDownload, cancelDownload, viewFiles }; };