fix: guard against undefined counts in sync and force-unlock messages

Closes #125
This commit is contained in:
2026-03-24 11:23:31 -07:00
committed by Naomi Carrigan
parent 790d35420f
commit 0c7a5f50fc
+40 -36
View File
@@ -13,18 +13,22 @@ import { ConfirmationModal } from "../ui/confirmationModal.js";
type ActiveModal = "force-unlocks" | "hard-reset" | "sync-new-content" | null; type ActiveModal = "force-unlocks" | "hard-reset" | "sync-new-content" | null;
interface SyncNewContentResult { interface SyncNewContentResult {
achievementsAdded: number; achievementsAdded: number | undefined;
adventurersAdded: number; adventurersAdded: number | undefined;
bossesAdded: number; bossesAdded: number | undefined;
bossRewardsPatched: number; bossRewardsPatched: number | undefined;
equipmentAdded: number; equipmentAdded: number | undefined;
explorationAreasAdded: number; explorationAreasAdded: number | undefined;
questRewardsPatched: number; questRewardsPatched: number | undefined;
questsAdded: number; questsAdded: number | undefined;
upgradesAdded: number; upgradesAdded: number | undefined;
zonesAdded: number; zonesAdded: number | undefined;
} }
const safeNumber = (value: number | undefined): number => {
return value ?? 0;
};
/** /**
* Builds a human-readable summary of what the sync-new-content operation added. * Builds a human-readable summary of what the sync-new-content operation added.
* @param result - The counts returned by the operation. * @param result - The counts returned by the operation.
@@ -32,16 +36,16 @@ interface SyncNewContentResult {
*/ */
const buildSyncNewContentMessage = (result: SyncNewContentResult): string => { const buildSyncNewContentMessage = (result: SyncNewContentResult): string => {
const entries: Array<[ number, string ]> = [ const entries: Array<[ number, string ]> = [
[ result.zonesAdded, "zone(s)" ], [ safeNumber(result.zonesAdded), "zone(s)" ],
[ result.questsAdded, "quest(s)" ], [ safeNumber(result.questsAdded), "quest(s)" ],
[ result.questRewardsPatched, "quest reward(s) patched" ], [ safeNumber(result.questRewardsPatched), "quest reward(s) patched" ],
[ result.bossesAdded, "boss(es)" ], [ safeNumber(result.bossesAdded), "boss(es)" ],
[ result.bossRewardsPatched, "boss reward(s) patched" ], [ safeNumber(result.bossRewardsPatched), "boss reward(s) patched" ],
[ result.explorationAreasAdded, "exploration area(s)" ], [ safeNumber(result.explorationAreasAdded), "exploration area(s)" ],
[ result.adventurersAdded, "adventurer tier(s)" ], [ safeNumber(result.adventurersAdded), "adventurer tier(s)" ],
[ result.upgradesAdded, "upgrade(s)" ], [ safeNumber(result.upgradesAdded), "upgrade(s)" ],
[ result.equipmentAdded, "equipment item(s)" ], [ safeNumber(result.equipmentAdded), "equipment item(s)" ],
[ result.achievementsAdded, "achievement(s)" ], [ safeNumber(result.achievementsAdded), "achievement(s)" ],
]; ];
const parts = entries. const parts = entries.
filter(([ count ]) => { filter(([ count ]) => {
@@ -60,14 +64,14 @@ const buildSyncNewContentMessage = (result: SyncNewContentResult): string => {
}; };
interface ForceUnlocksResult { interface ForceUnlocksResult {
adventurersUnlocked: number; adventurersUnlocked: number | undefined;
bossesUnlocked: number; bossesUnlocked: number | undefined;
equipmentUnlocked: number; equipmentUnlocked: number | undefined;
explorationUnlocked: number; explorationUnlocked: number | undefined;
questsUnlocked: number; questsUnlocked: number | undefined;
storyUnlocked: number; storyUnlocked: number | undefined;
upgradesUnlocked: number; upgradesUnlocked: number | undefined;
zonesUnlocked: number; zonesUnlocked: number | undefined;
} }
/** /**
@@ -77,14 +81,14 @@ interface ForceUnlocksResult {
*/ */
const buildForceUnlocksMessage = (result: ForceUnlocksResult): string => { const buildForceUnlocksMessage = (result: ForceUnlocksResult): string => {
const entries: Array<[ number, string ]> = [ const entries: Array<[ number, string ]> = [
[ result.zonesUnlocked, "zone(s)" ], [ safeNumber(result.zonesUnlocked), "zone(s)" ],
[ result.questsUnlocked, "quest(s)" ], [ safeNumber(result.questsUnlocked), "quest(s)" ],
[ result.bossesUnlocked, "boss(es)" ], [ safeNumber(result.bossesUnlocked), "boss(es)" ],
[ result.explorationUnlocked, "exploration area(s)" ], [ safeNumber(result.explorationUnlocked), "exploration area(s)" ],
[ result.adventurersUnlocked, "adventurer tier(s)" ], [ safeNumber(result.adventurersUnlocked), "adventurer tier(s)" ],
[ result.upgradesUnlocked, "upgrade(s)" ], [ safeNumber(result.upgradesUnlocked), "upgrade(s)" ],
[ result.equipmentUnlocked, "equipment item(s)" ], [ safeNumber(result.equipmentUnlocked), "equipment item(s)" ],
[ result.storyUnlocked, "story chapter(s)" ], [ safeNumber(result.storyUnlocked), "story chapter(s)" ],
]; ];
const parts = entries. const parts = entries.
filter(([ count ]) => { filter(([ count ]) => {