Skip to content

Commit 4703fbf

Browse files
committed
fix(launcher): show unregister progress modal on home
Fixes #73
1 parent 91711ba commit 4703fbf

File tree

2 files changed

+94
-8
lines changed

2 files changed

+94
-8
lines changed

frontend/src/hooks/useLauncher.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ export const useLauncher = (args: any) => {
7373
);
7474
const [isLoadingVersions, setIsLoadingVersions] =
7575
React.useState<boolean>(false);
76+
const [registerAction, setRegisterAction] = React.useState<
77+
"register" | "unregister"
78+
>("register");
7679
const fetchingLogos = React.useRef<Set<string>>(new Set());
7780
const fetchingLeviLaminaStatuses = React.useRef<Set<string>>(new Set());
7881
const [tipIndex, setTipIndex] = React.useState<number>(0);
@@ -461,15 +464,68 @@ export const useLauncher = (args: any) => {
461464
});
462465
}, []);
463466

467+
const applyOptimisticUnregisterState = React.useCallback((name: string) => {
468+
if (!name) return;
469+
setLocalVersionMap((prev) => {
470+
const target = prev.get(name);
471+
if (!target || !target.isRegistered) return prev;
472+
const next = new Map(prev);
473+
next.set(name, { ...target, isRegistered: false });
474+
return next;
475+
});
476+
}, []);
477+
464478
const doRegister = React.useCallback(async () => {
465479
if (!currentVersion) return;
480+
const isCurrentlyRegistered = Boolean(
481+
localVersionMap.get(currentVersion)?.isRegistered,
482+
);
466483
try {
467484
const ok = await IsGDKInstalled();
468485
if (!ok) {
469486
gdkMissingDisclosure.onOpen();
470487
return;
471488
}
472489
} catch {}
490+
if (isCurrentlyRegistered) {
491+
setRegisterAction("unregister");
492+
registerInstallingDisclosure.onOpen();
493+
try {
494+
const fn = (versionService as any)?.UnregisterVersionByName;
495+
if (typeof fn !== "function") {
496+
registerInstallingDisclosure.onClose();
497+
setLaunchErrorCode("ERR_UNREGISTER_FAILED");
498+
registerFailedDisclosure.onOpen();
499+
return;
500+
}
501+
const result = await fn(currentVersion);
502+
registerInstallingDisclosure.onClose();
503+
if (result === "") {
504+
applyOptimisticUnregisterState(currentVersion);
505+
const synced = await syncRegisteredFlags();
506+
if (!synced) {
507+
applyOptimisticUnregisterState(currentVersion);
508+
}
509+
window.setTimeout(() => {
510+
void syncRegisteredFlags();
511+
}, 1200);
512+
args.refresh();
513+
return;
514+
}
515+
if (result === "ERR_GDK_MISSING") {
516+
gdkMissingDisclosure.onOpen();
517+
} else {
518+
setLaunchErrorCode(result);
519+
registerFailedDisclosure.onOpen();
520+
}
521+
} catch {
522+
registerInstallingDisclosure.onClose();
523+
setLaunchErrorCode("ERR_UNREGISTER_FAILED");
524+
registerFailedDisclosure.onOpen();
525+
}
526+
return;
527+
}
528+
setRegisterAction("register");
473529
registerInstallingDisclosure.onOpen();
474530
try {
475531
const isPreview = localVersionMap.get(currentVersion)?.isPreview || false;
@@ -517,10 +573,12 @@ export const useLauncher = (args: any) => {
517573
registerFailedDisclosure.onOpen();
518574
}
519575
}, [
576+
args,
520577
currentVersion,
521578
localVersionMap,
522579
navigate,
523580
applyOptimisticRegisterState,
581+
applyOptimisticUnregisterState,
524582
gdkMissingDisclosure,
525583
registerInstallingDisclosure,
526584
registerSuccessDisclosure,
@@ -1136,6 +1194,7 @@ export const useLauncher = (args: any) => {
11361194
setVersionQuery,
11371195
logoByName,
11381196
isLoadingVersions,
1197+
registerAction,
11391198
tipIndex,
11401199
hasBackend,
11411200

frontend/src/pages/LauncherPage.tsx

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export const LauncherPage = (args: any) => {
6464
setVersionQuery,
6565
logoByName,
6666
isLoadingVersions,
67+
registerAction,
6768
tipIndex,
6869

6970
// Disclosures
@@ -141,6 +142,9 @@ export const LauncherPage = (args: any) => {
141142
() => buildVersionMenuItems(t("common.empty") as string),
142143
[buildVersionMenuItems, t],
143144
);
145+
const isCurrentVersionRegistered = Boolean(
146+
localVersionMap.get(currentVersion)?.isRegistered,
147+
);
144148
const currentVersionHasLeviLamina = Boolean(
145149
localVersionMap.get(currentVersion)?.isLeviLaminaInstalled,
146150
);
@@ -174,7 +178,7 @@ export const LauncherPage = (args: any) => {
174178
>
175179
Minecraft
176180
</motion.h1>
177-
{localVersionMap.get(currentVersion)?.isRegistered && (
181+
{isCurrentVersionRegistered && (
178182
<motion.div
179183
initial={{ opacity: 0, scale: 0.8, x: -10 }}
180184
animate={{ opacity: 1, scale: 1, x: 0 }}
@@ -431,7 +435,9 @@ export const LauncherPage = (args: any) => {
431435
startContent={<FaWindows />}
432436
onPress={doRegister}
433437
>
434-
{t("launcherpage.register_system_button")}
438+
{isCurrentVersionRegistered
439+
? t("versions.edit.unregister_button")
440+
: t("launcherpage.register_system_button")}
435441
</DropdownItem>
436442
</DropdownMenu>
437443
</Dropdown>
@@ -988,19 +994,40 @@ export const LauncherPage = (args: any) => {
988994
<UnifiedModal
989995
isOpen={registerInstallingDisclosure.isOpen}
990996
onOpenChange={registerInstallingDisclosure.onOpenChange}
991-
type="success"
992-
title={t("launcherpage.register.installing.title")}
993-
icon={<FaDownload className="w-6 h-6 text-primary-500" />}
997+
type={registerAction === "unregister" ? "warning" : "success"}
998+
title={
999+
registerAction === "unregister"
1000+
? t("versions.edit.unregister_progress.title")
1001+
: t("launcherpage.register.installing.title")
1002+
}
1003+
icon={
1004+
registerAction === "unregister" ? (
1005+
<FaExclamationTriangle className="w-6 h-6 text-warning-500" />
1006+
) : (
1007+
<FaDownload className="w-6 h-6 text-primary-500" />
1008+
)
1009+
}
9941010
>
9951011
<>
9961012
<p className="text-default-600 dark:text-zinc-300 font-medium mb-4">
997-
{t("launcherpage.register.installing.body")}
1013+
{registerAction === "unregister"
1014+
? t("versions.edit.unregister_progress.body")
1015+
: t("launcherpage.register.installing.body")}
9981016
</p>
9991017
<Progress
10001018
size="sm"
10011019
isIndeterminate
1002-
aria-label="Registering"
1003-
classNames={{ indicator: "bg-primary-500 hover:bg-primary-500" }}
1020+
aria-label={
1021+
registerAction === "unregister"
1022+
? "Unregistering"
1023+
: "Registering"
1024+
}
1025+
classNames={{
1026+
indicator:
1027+
registerAction === "unregister"
1028+
? "bg-warning-500 hover:bg-warning-500"
1029+
: "bg-primary-500 hover:bg-primary-500",
1030+
}}
10041031
/>
10051032
</>
10061033
</UnifiedModal>

0 commit comments

Comments
 (0)