import { useState, useEffect } from "react"; import { PanelSection, PanelSectionRow, ButtonItem, Dropdown, DropdownOption } from "@decky/ui"; import { definePlugin, callable } from "@decky/api"; import { FaShip } from "react-icons/fa"; // "run_install_fgmod" corresponds to the Python method run_install_fgmod() const runInstallFGMod = callable< [], { status: string; message?: string; output?: string } >("run_install_fgmod"); // "get_installed_games" corresponds to the Python method get_installed_games() const fetchInstalledGames = callable<[], string>("get_installed_games"); function FGModInstallerSection() { const [installing, setInstalling] = useState(false); const [installResult, setInstallResult] = useState<{ status: string; output?: string; message?: string; } | null>(null); const handleInstallClick = async () => { setInstalling(true); const result = await runInstallFGMod(); setInstalling(false); setInstallResult(result); }; return ( {installing ? "Installing..." : "Install FG Mod"} {installResult && ( Status:{" "} {installResult.status === "success" ? "Success" : "Error"} {installResult.output && ( <> Output: {installResult.output} > )} {installResult.message && ( <> Error: {installResult.message} > )} )} ); } function GameSelectorSection() { const [games, setGames] = useState([]); const [selectedGame, setSelectedGame] = useState(null); useEffect(() => { const loadGames = async () => { const result = await fetchInstalledGames(); const gameList = JSON.parse(result) as { appid: string; name: string }[]; setGames(gameList.map((g) => ({ data: g.appid, label: g.name }))); }; loadGames(); }, []); return ( setSelectedGame(option)} strDefaultLabel="Select a game" /> {selectedGame && ( You selected: {selectedGame.label} )} ); } function MainContent() { return ( <> > ); } // One default export, one plugin export default definePlugin(() => ({ name: "Framegen Plugin", titleView: Framegen Plugin, content: , icon: , onDismount() { console.log("Framegen Plugin unmounted"); }, }));
{installResult.output}