import { ButtonItem, ConfirmModal, Field, PanelSection, PanelSectionRow, ToggleField, showModal } from "@decky/ui"; import { useEffect, useState } from "react"; import { getFlatpakSupportStatus, removePluginOwnedFlatpakExtensions, setFlatpakExtensionEnabled, type FlatpakExtensionStatus, type SteamBranchStatus, } from "../api/lsfgApi"; import { InstallationButton } from "./InstallationButton"; import { StatusDisplay } from "./StatusDisplay"; import { showErrorToast } from "../utils/toastUtils"; interface SetupTabProps { isInstalled: boolean; installationStatus: string; losslessScalingInstalled: boolean; losslessScalingStatus: string; steamBranchStatus: SteamBranchStatus | null; isInstalling: boolean; isUninstalling: boolean; onInstall: () => void; onUninstall: () => void; flatpakRelevant: boolean; } function FlatpakSupportDiagnostics({ relevant }: { relevant: boolean }) { const [status, setStatus] = useState(null); const [advanced, setAdvanced] = useState(false); const [operation, setOperation] = useState(null); const refresh = async () => { try { setStatus(await getFlatpakSupportStatus()); } catch (error) { setStatus({ success: false, message: "", error: String(error), available: false, extension_id: "", supported_branches: [], installed_branches: [], owned_branches: [], ownership_uncertain: false, }); } }; useEffect(() => { if (relevant) void refresh(); }, [relevant]); if (!relevant || !status?.available) return null; const runExtensionOperation = async (version: string, enabled: boolean) => { const operationKey = `${enabled ? "enable" : "disable"}-${version}`; setOperation(operationKey); try { const result = await setFlatpakExtensionEnabled(version, enabled); if (!result.success) throw new Error(result.error || result.message || "Flatpak runtime update failed"); await refresh(); } catch (error) { showErrorToast("Flatpak runtime update failed", String(error)); } finally { setOperation(null); } }; const confirmDisable = (version: string) => { showModal( void runExtensionOperation(version, false)} onCancel={() => {}} />, ); }; const handleExtensionToggle = (version: string, enabled: boolean) => { const installed = status.installed_branches.includes(version); const owned = status.owned_branches.includes(version); if (!enabled && installed && !owned) { showErrorToast( "Flatpak runtime preserved", `${version} was not installed by this plugin, so it will remain installed.`, ); void refresh(); return; } if (!enabled && installed && owned) { confirmDisable(version); return; } void runExtensionOperation(version, enabled); }; const confirmCleanup = () => { showModal( { setOperation("cleanup"); try { const result = await removePluginOwnedFlatpakExtensions(); if (!result.success) throw new Error(result.error || result.message || "Flatpak cleanup failed"); await refresh(); } catch (error) { showErrorToast("Flatpak cleanup failed", String(error)); } finally { setOperation(null); } }} onCancel={() => {}} />, ); }; return ( setAdvanced((value) => !value)}> {advanced ? "Hide runtime details" : "Show runtime details"} {advanced && ( <> {status.supported_branches.map((branch) => ( handleExtensionToggle(branch, enabled)} disabled={operation !== null || status.ownership_uncertain} /> ))} {status.ownership_uncertain && ( )} {operation === "cleanup" ? "Removing..." : "Remove plugin-installed extensions"} )} ); } export function SetupTab({ isInstalled, installationStatus, losslessScalingInstalled, losslessScalingStatus, steamBranchStatus, isInstalling, isUninstalling, onInstall, onUninstall, flatpakRelevant, }: SetupTabProps) { return ( <> ); }