1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
import { useState, useEffect } from "react";
import {
PanelSection,
PanelSectionRow,
ButtonItem,
} from "@decky/ui";
import { definePlugin, callable } from "@decky/api";
import { FaShip } from "react-icons/fa";
const runInstallFGMod = callable<
[],
{ status: string; message?: string; output?: string }
>("run_install_fgmod");
const checkFGModPath = callable<
[],
{ exists: boolean }
>("check_fgmod_path");
function FGModInstallerSection() {
const [installing, setInstalling] = useState(false);
const [installResult, setInstallResult] = useState<{
status: string;
output?: string;
message?: string;
} | null>(null);
const [pathExists, setPathExists] = useState<boolean | null>(null);
useEffect(() => {
const checkPath = async () => {
const result = await checkFGModPath();
setPathExists(result.exists);
};
checkPath(); // Initial check
const intervalId = setInterval(checkPath, 5000); // Check every 5 seconds
return () => clearInterval(intervalId); // Cleanup interval on component unmount
}, []);
const handleInstallClick = async () => {
setInstalling(true);
const result = await runInstallFGMod();
setInstalling(false);
setInstallResult(result);
};
return (
<PanelSection title="FG Mod Installer">
<PanelSectionRow>
<ButtonItem layout="below" onClick={handleInstallClick} disabled={installing}>
{installing ? "Installing..." : "Install FG Mod"}
</ButtonItem>
</PanelSectionRow>
{installResult && (
<PanelSectionRow>
<div>
<strong>Status:</strong>{" "}
{installResult.status === "success" ? "Success" : "Error"}
<br />
{installResult.output && (
<>
<strong>Output:</strong>
<pre style={{ whiteSpace: "pre-wrap" }}>{installResult.output}</pre>
</>
)}
{installResult.message && (
<>
<strong>Error:</strong> {installResult.message}
</>
)}
</div>
</PanelSectionRow>
)}
{pathExists !== null && (
<PanelSectionRow>
<div style={{ color: pathExists ? "green" : "red" }}>
{pathExists ? "Path exists" : "Path does not exist"}
</div>
</PanelSectionRow>
)}
<PanelSectionRow>
<div>
Once the patch is installed, you can apply the mod by adding the following to the game's launch options:<br />
<code>/home/deck/fgmod/fgmod %COMMAND%</code>
</div>
</PanelSectionRow>
</PanelSection>
);
}
export default definePlugin(() => ({
name: "Framegen Plugin",
titleView: <div>Framegen Plugin</div>,
content: <MainContent />,
icon: <FaShip />,
onDismount() {
console.log("Framegen Plugin unmounted");
},
}));
function MainContent() {
return (
<>
<FGModInstallerSection />
</>
);
}
|