import { useState, useEffect } from "react"; import { DropdownItem, PanelSection, PanelSectionRow } from "@decky/ui"; import { runInstallFGMod, runUninstallFGMod } from "../api"; import { OperationResult } from "./ResultDisplay"; import { createAutoCleanupTimer } from "../utils"; import { TIMEOUTS, PROXY_DLL_OPTIONS, DEFAULT_PROXY_DLL } from "../utils/constants"; import { InstallationStatus } from "./InstallationStatus"; import { OptiScalerHeader } from "./OptiScalerHeader"; import { ClipboardCommands } from "./ClipboardCommands"; import { InstructionCard } from "./InstructionCard"; import { OptiScalerWiki } from "./OptiScalerWiki"; import { UninstallButton } from "./UninstallButton"; import { ManualPatchControls } from "./CustomPathOverride"; interface OptiScalerControlsProps { pathExists: boolean | null; setPathExists: (exists: boolean | null) => void; } export function OptiScalerControls({ pathExists, setPathExists }: OptiScalerControlsProps) { const [installing, setInstalling] = useState(false); const [uninstalling, setUninstalling] = useState(false); const [installResult, setInstallResult] = useState(null); const [uninstallResult, setUninstallResult] = useState(null); const [manualModeEnabled, setManualModeEnabled] = useState(false); const [dllName, setDllName] = useState(DEFAULT_PROXY_DLL); 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); if (result.status === "success") { setPathExists(true); } } catch (e) { console.error(e); } finally { setInstalling(false); } }; const handleUninstallClick = async () => { try { setUninstalling(true); const result = await runUninstallFGMod(); setUninstallResult(result); if (result.status === "success") { setPathExists(false); } } catch (e) { console.error(e); } finally { setUninstalling(false); } }; return ( {pathExists === true && ( o.value === dllName)?.hint} menuLabel="Proxy DLL name" selectedOption={dllName} rgOptions={PROXY_DLL_OPTIONS.map((o) => ({ data: o.value, label: o.label }))} onChange={(option) => setDllName(String(option.data))} /> )} {!manualModeEnabled && ( <> )} ); }