Skip to content

Commit 355ec31

Browse files
Version cache validation
1 parent 5fea437 commit 355ec31

File tree

6 files changed

+404
-72
lines changed

6 files changed

+404
-72
lines changed

Diff for: app/Button.tsx

+17-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ export default function Button({
55
icon,
66
iconLeft,
77
tooltip,
8-
text
8+
text,
9+
loading
910
}: {
1011
onClick: () => void;
1112
enabled: boolean;
@@ -14,21 +15,31 @@ export default function Button({
1415
iconLeft?: boolean;
1516
tooltip?: string;
1617
text?: string;
18+
loading?: boolean;
1719
}) {
20+
const actuallyEnabled = enabled && !loading;
1821
return (
1922
<button
2023
type="button"
21-
className={"btn px-3 btn-" + variant + (enabled ? "" : " disabled")}
24+
className={"btn px-3 btn-" + variant + (actuallyEnabled ? "" : " disabled")}
2225
data-bs-toggle="tooltip"
2326
data-bs-placement="top"
24-
disabled={!enabled}
27+
disabled={!actuallyEnabled}
2528
tabIndex={-1}
2629
title={tooltip}
2730
onClick={onClick}
2831
>
29-
{iconLeft && icon && <i className={"fas fa-" + icon}></i>}
30-
{text && <span>{text}</span>}
31-
{!iconLeft && icon && <i className={"fas fa-" + icon}></i>}
32+
{loading ? (
33+
<div className="spinner-border spinner-border-sm" role="status">
34+
<span className="visually-hidden">Loading...</span>
35+
</div>
36+
) : (
37+
<>
38+
{iconLeft && icon && <i className={"fas fa-" + icon}></i>}
39+
{text && <span>{text}</span>}
40+
{!iconLeft && icon && <i className={"fas fa-" + icon}></i>}
41+
</>
42+
)}
3243
</button>
3344
)
3445
}

Diff for: app/GameBuildsList.tsx

+138-56
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Stack } from "react-bootstrap";
22
import Button from "./Button";
33

4-
import { VersionEntry } from "./types";
4+
import { VersionCacheData, VersionEntry } from "./types";
55

66
const BYTES_PER_GB = 1024 * 1024 * 1024;
77

@@ -10,16 +10,68 @@ const formatBytesToGB = (bytes?: number) => {
1010
return undefined;
1111
}
1212
return (bytes / BYTES_PER_GB).toFixed(2);
13-
}
13+
};
14+
15+
const getVersionData = (
16+
version: VersionEntry,
17+
versionData: Record<string, VersionCacheData>
18+
) => {
19+
return versionData[version.uuid];
20+
};
21+
22+
const isDoneValidatingOffline = (
23+
version: VersionEntry,
24+
versionData: Record<string, VersionCacheData>
25+
) => {
26+
return getVersionData(version, versionData)?.offlineDone ?? false;
27+
};
28+
29+
const isDoneValidatingGame = (
30+
version: VersionEntry,
31+
versionData: Record<string, VersionCacheData>
32+
) => {
33+
return getVersionData(version, versionData)?.gameDone ?? false;
34+
};
35+
36+
const getValidatedOfflineSize = (
37+
version: VersionEntry,
38+
versionData: Record<string, VersionCacheData>
39+
) => {
40+
const data = getVersionData(version, versionData);
41+
if (!data) {
42+
return undefined;
43+
}
44+
return data.offlineSize;
45+
};
46+
47+
const getValidatedGameSize = (
48+
version: VersionEntry,
49+
versionData: Record<string, VersionCacheData>
50+
) => {
51+
const data = getVersionData(version, versionData);
52+
if (!data) {
53+
return undefined;
54+
}
55+
return data.gameSize;
56+
};
57+
58+
const getTotalOfflineSize = (version: VersionEntry) => {
59+
if (!version.total_compressed_size || !version.main_file_info) {
60+
return undefined;
61+
}
62+
return version.total_compressed_size + version.main_file_info.size;
63+
};
1464

1565
export default function GameBuildsList({
1666
versions,
67+
versionData,
1768
clearGameCache,
1869
downloadOfflineCache,
1970
repairOfflineCache,
2071
deleteOfflineCache,
2172
}: {
2273
versions?: VersionEntry[];
74+
versionData: Record<string, VersionCacheData>;
2375
clearGameCache: (uuid: string) => void;
2476
downloadOfflineCache: (uuid: string) => void;
2577
repairOfflineCache: (uuid: string) => void;
@@ -51,60 +103,90 @@ export default function GameBuildsList({
51103
<td colSpan={3}>No versions available</td>
52104
</tr>
53105
) : (
54-
versions.map((version) => (
55-
<tr key={version.uuid}>
56-
<td className="font-monospace align-middle">
57-
{version.name ?? version.uuid}
58-
{version.description && (
59-
<>
60-
{" "}
61-
<i
62-
className="fas fa-circle-info"
63-
data-bs-toggle="tooltip"
64-
data-bs-placement="top"
65-
title={version.description}
66-
></i>
67-
</>
68-
)}
69-
</td>
70-
<td className="text-center">
71-
<p>-- / {formatBytesToGB(version.total_uncompressed_size) ?? "?.??"} GB</p>
72-
<Button
73-
enabled={false}
74-
icon="trash"
75-
onClick={() => clearGameCache(version.uuid)}
76-
variant="danger"
77-
tooltip="Clear game cache"
78-
/>
79-
</td>
80-
<td className="text-center">
81-
<p>-- / {formatBytesToGB(version.total_compressed_size) ?? "?.??"} GB</p>
82-
<Button
83-
enabled={true}
84-
icon="download"
85-
onClick={() => downloadOfflineCache(version.uuid)}
86-
variant="success"
87-
tooltip="Download offline cache"
88-
/>
89-
{" "}
90-
<Button
91-
enabled={false}
92-
icon="screwdriver-wrench"
93-
onClick={() => repairOfflineCache(version.uuid)}
94-
variant="warning"
95-
tooltip="Repair offline cache"
96-
/>
97-
{" "}
98-
<Button
99-
enabled={false}
100-
icon="trash"
101-
onClick={() => deleteOfflineCache(version.uuid)}
102-
variant="danger"
103-
tooltip="Delete offline cache"
104-
/>
105-
</td>
106-
</tr>
107-
))
106+
versions.map(
107+
(version) =>
108+
!version.hidden && (
109+
<tr key={version.uuid}>
110+
<td className="font-monospace align-middle">
111+
{version.name ?? version.uuid}
112+
{version.description && (
113+
<>
114+
{" "}
115+
<i
116+
className="fas fa-circle-info"
117+
data-bs-toggle="tooltip"
118+
data-bs-placement="top"
119+
title={version.description}
120+
></i>
121+
</>
122+
)}
123+
</td>
124+
<td className="text-center">
125+
<p>
126+
{formatBytesToGB(
127+
getValidatedGameSize(version, versionData)
128+
) ?? "--"}{" "}
129+
/{" "}
130+
{formatBytesToGB(version.total_uncompressed_size) ??
131+
"?.??"}{" "}
132+
GB
133+
</p>
134+
<Button
135+
loading={!isDoneValidatingGame(version, versionData)}
136+
enabled={!!getValidatedGameSize(version, versionData)}
137+
icon="trash"
138+
onClick={() => clearGameCache(version.uuid)}
139+
variant="danger"
140+
tooltip="Clear game cache"
141+
/>
142+
</td>
143+
<td className="text-center">
144+
<p>
145+
{formatBytesToGB(
146+
getValidatedOfflineSize(version, versionData)
147+
) ?? "--"}{" "}
148+
/{" "}
149+
{formatBytesToGB(getTotalOfflineSize(version)) ??
150+
"?.??"}{" "}
151+
GB
152+
</p>
153+
<Button
154+
loading={!isDoneValidatingOffline(version, versionData)}
155+
enabled={
156+
!getValidatedOfflineSize(version, versionData) &&
157+
!!version.main_file_info &&
158+
!!version.total_compressed_size
159+
}
160+
icon="download"
161+
onClick={() => downloadOfflineCache(version.uuid)}
162+
variant="success"
163+
tooltip="Download offline cache"
164+
/>{" "}
165+
<Button
166+
loading={!isDoneValidatingOffline(version, versionData)}
167+
enabled={
168+
!!getValidatedOfflineSize(version, versionData) &&
169+
getVersionData(version, versionData)?.offlineCorrupted
170+
}
171+
icon="screwdriver-wrench"
172+
onClick={() => repairOfflineCache(version.uuid)}
173+
variant="warning"
174+
tooltip="Repair offline cache"
175+
/>{" "}
176+
<Button
177+
loading={!isDoneValidatingOffline(version, versionData)}
178+
enabled={
179+
!!getValidatedOfflineSize(version, versionData)
180+
}
181+
icon="trash"
182+
onClick={() => deleteOfflineCache(version.uuid)}
183+
variant="danger"
184+
tooltip="Delete offline cache"
185+
/>
186+
</td>
187+
</tr>
188+
)
189+
)
108190
)}
109191
</tbody>
110192
</table>

0 commit comments

Comments
 (0)