import { useState, useEffect } from "react"; import { PanelSection, PanelSectionRow, ButtonItem } from "@decky/ui"; import { checkFGModPath, runInstallFGMod, runUninstallFGMod } from "../api"; import { ResultDisplay, OperationResult } from "./ResultDisplay"; import { createAutoCleanupTimer, safeAsyncOperation } from "../utils"; import { TIMEOUTS, MESSAGES } from "../utils/constants"; export function FGModInstallerSection() { const [installing, setInstalling] = useState(false); const [uninstalling, setUninstalling] = useState(false); const [installResult, setInstallResult] = useState(null); const [uninstallResult, setUninstallResult] = useState(null); const [pathExists, setPathExists] = useState(null); useEffect(() => { const checkPath = async () => { const result = await safeAsyncOperation( async () => await checkFGModPath(), 'useEffect -> checkPath' ); if (result) setPathExists(result.exists); }; checkPath(); // Initial check const intervalId = setInterval(checkPath, TIMEOUTS.pathCheck); // Check every 3 seconds return () => clearInterval(intervalId); // Cleanup interval on component unmount }, []); useEffect(() => { if (installResult) { return createAutoCleanupTimer(() => setInstallResult(null), TIMEOUTS.resultDisplay); } return () => {}; // Ensure a cleanup function is always returned }, [installResult]); useEffect(() => { if (uninstallResult) { return createAutoCleanupTimer(() => setUninstallResult(null), TIMEOUTS.resultDisplay); } return () => {}; // Ensure a cleanup function is always returned }, [uninstallResult]); const handleInstallClick = async () => { try { setInstalling(true); const result = await runInstallFGMod(); setInstallResult(result); } catch (e) { console.error(e); } finally { setInstalling(false); } }; const handleUninstallClick = async () => { try { setUninstalling(true); const result = await runUninstallFGMod(); setUninstallResult(result); } catch (e) { console.error(e); } finally { setUninstalling(false); } }; return ( {pathExists !== null ? (
{pathExists ? MESSAGES.modInstalled : MESSAGES.modNotInstalled}
) : null} {pathExists === false ? ( {installing ? MESSAGES.installing : MESSAGES.installButton} ) : null} {pathExists === true ? ( {uninstalling ? MESSAGES.uninstalling : MESSAGES.uninstallButton} ) : null}
{MESSAGES.instructionText}
); }