summaryrefslogtreecommitdiff
path: root/src/components/SetupTab.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/SetupTab.tsx')
-rw-r--r--src/components/SetupTab.tsx231
1 files changed, 43 insertions, 188 deletions
diff --git a/src/components/SetupTab.tsx b/src/components/SetupTab.tsx
index df43c5e..d769200 100644
--- a/src/components/SetupTab.tsx
+++ b/src/components/SetupTab.tsx
@@ -1,15 +1,6 @@
-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";
+import { ButtonItem, Field, PanelSection, PanelSectionRow } from "@decky/ui";
+import { type SteamBranchStatus } from "../api/lsfgApi";
+import t from "../i18n/i18n";
interface SetupTabProps {
isInstalled: boolean;
@@ -21,193 +12,57 @@ interface SetupTabProps {
isUninstalling: boolean;
onInstall: () => void;
onUninstall: () => void;
- flatpakRelevant: boolean;
}
-function FlatpakSupportDiagnostics({ relevant }: { relevant: boolean }) {
- const [status, setStatus] = useState<FlatpakExtensionStatus | null>(null);
- const [advanced, setAdvanced] = useState(false);
- const [operation, setOperation] = useState<string | null>(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(
- <ConfirmModal
- strTitle={`Disable Flatpak runtime ${version}?`}
- strDescription="Only runtime extensions installed by this plugin can be removed. Pre-existing extensions are preserved."
- strOKButtonText="Disable"
- strCancelButtonText="Cancel"
- onOK={() => 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(
- <ConfirmModal
- strTitle="Remove plugin-installed Flatpak extensions?"
- strDescription="Shared runtime branches recorded as installed by this plugin will be removed. Existing unowned branches are preserved."
- strOKButtonText="Remove extensions"
- strCancelButtonText="Cancel"
- onOK={async () => {
- 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={() => {}}
- />,
- );
- };
+export function SetupTab(props: SetupTabProps) {
+ const {
+ isInstalled,
+ installationStatus,
+ losslessScalingInstalled,
+ losslessScalingStatus,
+ steamBranchStatus,
+ isInstalling,
+ isUninstalling,
+ onInstall,
+ onUninstall,
+ } = props;
+ const losslessScalingAppInstalled = losslessScalingInstalled || steamBranchStatus?.installed === true;
+ const buttonLabel = isInstalling
+ ? t("INSTALL_INSTALLING", "Installing...")
+ : isUninstalling
+ ? t("INSTALL_UNINSTALLING", "Uninstalling...")
+ : isInstalled
+ ? t("INSTALL_UNINSTALL_BTN", "Uninstall LSFG-VK")
+ : t("INSTALL_INSTALL_BTN", "Install LSFG-VK");
return (
- <PanelSection title="Flatpak support">
+ <PanelSection title="Setup">
<PanelSectionRow>
<Field
- label="Runtime extension support"
- description={status.message || "Flatpak is available for classified targets."}
+ label="Lossless Scaling"
+ description={losslessScalingAppInstalled ? "Installed" : losslessScalingStatus || "Not installed"}
/>
</PanelSectionRow>
<PanelSectionRow>
- <ButtonItem layout="below" onClick={() => setAdvanced((value) => !value)}>
- {advanced ? "Hide runtime details" : "Show runtime details"}
- </ButtonItem>
+ <Field label="LSFG-VK" description={installationStatus} />
</PanelSectionRow>
- {advanced && (
- <>
- {status.supported_branches.map((branch) => (
- <PanelSectionRow key={branch}>
- <ToggleField
- label={branch}
- description={
- operation === `enable-${branch}`
- ? "Installing..."
- : operation === `disable-${branch}`
- ? "Uninstalling..."
- : status.installed_branches.includes(branch)
- ? status.owned_branches.includes(branch)
- ? "Installed · plugin-owned"
- : "Installed · pre-existing (preserved)"
- : "Not installed"
- }
- checked={status.installed_branches.includes(branch)}
- onChange={(enabled) => handleExtensionToggle(branch, enabled)}
- disabled={operation !== null || status.ownership_uncertain}
- />
- </PanelSectionRow>
- ))}
- {status.ownership_uncertain && (
- <PanelSectionRow>
- <Field label="Ownership metadata is uncertain" description="Cleanup is disabled until the metadata is repaired." />
- </PanelSectionRow>
- )}
- <PanelSectionRow>
- <ButtonItem
- layout="below"
- disabled={operation !== null || status.ownership_uncertain || status.owned_branches.length === 0}
- onClick={confirmCleanup}
- >
- {operation === "cleanup" ? "Removing..." : "Remove plugin-installed extensions"}
- </ButtonItem>
- </PanelSectionRow>
- </>
+ {steamBranchStatus?.installed && (
+ <PanelSectionRow>
+ <Field
+ label="Steam branch"
+ description={`${steamBranchStatus.current_branch || "public"}${steamBranchStatus.needs_switch ? ` - ${steamBranchStatus.message}` : ""}`}
+ />
+ </PanelSectionRow>
)}
+ <PanelSectionRow>
+ <ButtonItem
+ layout="below"
+ onClick={isInstalled ? onUninstall : onInstall}
+ disabled={isInstalling || isUninstalling}
+ >
+ {buttonLabel}
+ </ButtonItem>
+ </PanelSectionRow>
</PanelSection>
);
}
-
-export function SetupTab({
- isInstalled,
- installationStatus,
- losslessScalingInstalled,
- losslessScalingStatus,
- steamBranchStatus,
- isInstalling,
- isUninstalling,
- onInstall,
- onUninstall,
- flatpakRelevant,
-}: SetupTabProps) {
- return (
- <>
- <PanelSection title="Setup">
- <StatusDisplay
- installationStatus={installationStatus}
- losslessScalingInstalled={losslessScalingInstalled}
- losslessScalingStatus={losslessScalingStatus}
- steamBranchStatus={steamBranchStatus}
- />
- <InstallationButton
- isInstalled={isInstalled}
- isInstalling={isInstalling}
- isUninstalling={isUninstalling}
- onInstall={onInstall}
- onUninstall={onUninstall}
- />
- </PanelSection>
- <FlatpakSupportDiagnostics relevant={flatpakRelevant} />
- </>
- );
-}