From 7bb36ec1113378def328ce59efbf8465077bb133 Mon Sep 17 00:00:00 2001 From: catloversg <152669316+catloversg@users.noreply.github.com> Date: Thu, 23 May 2024 08:43:31 +0700 Subject: [PATCH] MISC: Refactor InvitationModal and AlertManager (#1287) --- src/Faction/FactionHelpers.tsx | 4 +- src/Faction/ui/FactionInvitationManager.tsx | 89 +++++++++++++++++++ src/Faction/ui/InvitationModal.tsx | 52 ----------- .../Player/PlayerObjectGeneralMethods.ts | 4 +- src/ui/GameRoot.tsx | 4 +- src/ui/React/AlertManager.tsx | 7 +- 6 files changed, 96 insertions(+), 64 deletions(-) create mode 100644 src/Faction/ui/FactionInvitationManager.tsx delete mode 100644 src/Faction/ui/InvitationModal.tsx diff --git a/src/Faction/FactionHelpers.tsx b/src/Faction/FactionHelpers.tsx index 0c11cd018..377ba0462 100644 --- a/src/Faction/FactionHelpers.tsx +++ b/src/Faction/FactionHelpers.tsx @@ -16,7 +16,7 @@ import { } from "../PersonObjects/formulas/reputation"; import { dialogBoxCreate } from "../ui/React/DialogBox"; -import { InvitationEvent } from "./ui/InvitationModal"; +import { FactionInvitationEvents } from "./ui/FactionInvitationManager"; import { SFC32RNG } from "../Casino/RNG"; import { isFactionWork } from "../Work/FactionWork"; import { getAugCost } from "../Augmentation/AugmentationHelpers"; @@ -28,7 +28,7 @@ export function inviteToFaction(faction: Faction): void { faction.alreadyInvited = true; faction.discovery = FactionDiscovery.known; if (!Settings.SuppressFactionInvites) { - InvitationEvent.emit(faction); + FactionInvitationEvents.emit({ type: "New", factionName: faction.name }); } } diff --git a/src/Faction/ui/FactionInvitationManager.tsx b/src/Faction/ui/FactionInvitationManager.tsx new file mode 100644 index 000000000..19bfd9841 --- /dev/null +++ b/src/Faction/ui/FactionInvitationManager.tsx @@ -0,0 +1,89 @@ +import React, { useState, useEffect } from "react"; +import { joinFaction } from "../FactionHelpers"; +import { Modal } from "../../ui/React/Modal"; +import { EventEmitter } from "../../utils/EventEmitter"; +import Typography from "@mui/material/Typography"; +import Button from "@mui/material/Button"; +import { Report } from "@mui/icons-material"; +import { Settings } from "../../Settings/Settings"; +import { FactionName } from "../Enums"; +import { Factions } from "../Factions"; + +type NewInvitation = { + type: "New"; + factionName: FactionName; +}; + +type ClearAllInvitations = { + type: "ClearAll"; +}; + +type FactionInvitationEvent = NewInvitation | ClearAllInvitations; + +export const FactionInvitationEvents = new EventEmitter<[FactionInvitationEvent]>(); + +export function FactionInvitationManager({ hidden }: { hidden: boolean }): React.ReactElement { + const [factions, setFactions] = useState([]); + + useEffect( + () => + FactionInvitationEvents.subscribe((event) => { + if (event.type === "ClearAll") { + setFactions([]); + return; + } + setFactions((currentFactions) => { + if (currentFactions.includes(event.factionName)) { + return currentFactions; + } + return [...currentFactions, event.factionName]; + }); + }), + [], + ); + + function close(): void { + setFactions((currentFactions) => { + return currentFactions.slice(1); + }); + } + + const faction = factions.length > 0 ? Factions[factions[0]] : null; + const enemies = faction?.getInfo().enemies ?? []; + + function join(): void { + if (faction === null || !faction.alreadyInvited) { + return; + } + joinFaction(faction); + close(); + } + + return ( + + You received a faction invitation. + + Would you like to join {faction?.name}? + + {enemies.length > 0 && ( + +
+ Joining this faction will prevent you from joining its enemies until your next augmentation. +
+ {faction?.name} is enemies with: + {enemies.map((enemy) => ( + + + {enemy} + + ))} +
+ )} +
+ + +
+ ); +} diff --git a/src/Faction/ui/InvitationModal.tsx b/src/Faction/ui/InvitationModal.tsx deleted file mode 100644 index 5cbbdc14d..000000000 --- a/src/Faction/ui/InvitationModal.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { joinFaction } from "../FactionHelpers"; -import { Faction } from "../Faction"; -import { Modal } from "../../ui/React/Modal"; -import { EventEmitter } from "../../utils/EventEmitter"; -import Typography from "@mui/material/Typography"; -import Button from "@mui/material/Button"; -import { Report } from "@mui/icons-material"; -import { Settings } from "../../Settings/Settings"; - -export const InvitationEvent = new EventEmitter<[Faction | null]>(); - -export function InvitationModal({ hidden }: { hidden: boolean }): React.ReactElement { - const [faction, setFaction] = useState(null); - - const enemies = faction?.getInfo().enemies ?? []; - - function join(): void { - if (faction === null) return; - if (!faction.alreadyInvited) return; - joinFaction(faction); - setFaction(null); - } - - useEffect(() => InvitationEvent.subscribe((faction) => setFaction(faction)), []); - - return ( - setFaction(null)}> - You have received a faction invitation. - - Would you like to join {faction?.name}? - - {enemies.length > 0 && ( - -
- Joining this Faction will prevent you from joining its enemies until your next augmentation. -
- {faction?.name} is enemies with: - {enemies.map((enemy) => ( - - - {enemy} - - ))} -
- )} -
- - -
- ); -} diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts index 283c485c9..91e41177b 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.ts @@ -26,7 +26,7 @@ import { CONSTANTS } from "../../Constants"; import { Exploit } from "../../Exploits/Exploit"; import { Faction } from "../../Faction/Faction"; import { Factions } from "../../Faction/Factions"; -import { InvitationEvent } from "../../Faction/ui/InvitationModal"; +import { FactionInvitationEvents } from "../../Faction/ui/FactionInvitationManager"; import { resetGangs } from "../../Gang/AllGangs"; import { Cities } from "../../Locations/Cities"; import { Locations } from "../../Locations/Locations"; @@ -104,7 +104,7 @@ export function prestigeAugmentation(this: PlayerObject): void { this.factionInvitations = []; this.factionRumors.clear(); // Clear any pending invitation modals - InvitationEvent.emit(null); + FactionInvitationEvents.emit({ type: "ClearAll" }); this.queuedAugmentations = []; diff --git a/src/ui/GameRoot.tsx b/src/ui/GameRoot.tsx index 2e32dd2fa..8b7ddfc13 100644 --- a/src/ui/GameRoot.tsx +++ b/src/ui/GameRoot.tsx @@ -56,7 +56,7 @@ import { Snackbar, SnackbarProvider } from "./React/Snackbar"; import { LogBoxManager } from "./React/LogBoxManager"; import { AlertManager } from "./React/AlertManager"; import { PromptManager } from "./React/PromptManager"; -import { InvitationModal } from "../Faction/ui/InvitationModal"; +import { FactionInvitationManager } from "../Faction/ui/FactionInvitationManager"; import { calculateAchievements } from "../Achievements/Achievements"; import { RecoveryMode, RecoveryRoot } from "./React/RecoveryRoot"; @@ -407,7 +407,7 @@ export function GameRoot(): React.ReactElement {