diff --git a/frontend/react/src/interfaces.ts b/frontend/react/src/interfaces.ts index 5240e25f..b9ae4680 100644 --- a/frontend/react/src/interfaces.ts +++ b/frontend/react/src/interfaces.ts @@ -43,7 +43,7 @@ export interface OlympusConfig { authentication?: { // Only sent when in localhost mode for autologin gameMasterPassword: string; - blueCommanderPasword: string; + blueCommanderPassword: string; redCommanderPassword: string; }; } diff --git a/frontend/react/src/mission/missionmanager.ts b/frontend/react/src/mission/missionmanager.ts index d61247dd..68812ceb 100644 --- a/frontend/react/src/mission/missionmanager.ts +++ b/frontend/react/src/mission/missionmanager.ts @@ -275,11 +275,9 @@ export class MissionManager { var requestRefresh = false; if (this.#commandModeOptions.commandMode === NONE && commandModeOptions.commandMode !== NONE) requestRefresh = true; - /* Refresh the page if we have lost Game Master priviledges */ - if (this.#commandModeOptions.commandMode === GAME_MASTER && commandModeOptions.commandMode !== GAME_MASTER) location.reload(); - /* Check if any option has changed */ var commandModeOptionsChanged = + commandModeOptions.commandMode !== this.getCommandModeOptions().commandMode || !commandModeOptions.eras.every((value: string, idx: number) => { return value === this.getCommandModeOptions().eras[idx]; }) || diff --git a/frontend/react/src/ui/panels/gamemastermenu.tsx b/frontend/react/src/ui/panels/gamemastermenu.tsx index a321a107..4b3d1a53 100644 --- a/frontend/react/src/ui/panels/gamemastermenu.tsx +++ b/frontend/react/src/ui/panels/gamemastermenu.tsx @@ -5,7 +5,7 @@ import { OlNumberInput } from "../components/olnumberinput"; import { getApp } from "../../olympusapp"; import { ServerStatus } from "../../interfaces"; import { CommandModeOptionsChangedEvent, ServerStatusUpdatedEvent } from "../../events"; -import { BLUE_COMMANDER, COMMAND_MODE_OPTIONS_DEFAULTS, ERAS_ORDER, GAME_MASTER, RED_COMMANDER } from "../../constants/constants"; +import { COMMAND_MODE_OPTIONS_DEFAULTS, ERAS_ORDER, GAME_MASTER } from "../../constants/constants"; import { secondsToTimeString } from "../../other/utils"; import { FaQuestionCircle } from "react-icons/fa"; import { FaMinus, FaPlus } from "react-icons/fa6"; diff --git a/frontend/react/src/ui/panels/header.tsx b/frontend/react/src/ui/panels/header.tsx index 8e089f25..95c07d18 100644 --- a/frontend/react/src/ui/panels/header.tsx +++ b/frontend/react/src/ui/panels/header.tsx @@ -19,15 +19,25 @@ import { FaChevronLeft, FaChevronRight, FaFloppyDisk } from "react-icons/fa6"; import { CommandModeOptionsChangedEvent, ConfigLoadedEvent, + EnabledCommandModesChangedEvent, HiddenTypesChangedEvent, MapOptionsChangedEvent, MapSourceChangedEvent, SessionDataChangedEvent, SessionDataSavedEvent, } from "../../events"; -import { BLUE_COMMANDER, COMMAND_MODE_OPTIONS_DEFAULTS, MAP_HIDDEN_TYPES_DEFAULTS, MAP_OPTIONS_DEFAULTS, RED_COMMANDER } from "../../constants/constants"; +import { + BLUE_COMMANDER, + COMMAND_MODE_OPTIONS_DEFAULTS, + GAME_MASTER, + LoginSubState, + MAP_HIDDEN_TYPES_DEFAULTS, + MAP_OPTIONS_DEFAULTS, + OlympusState, + RED_COMMANDER, +} from "../../constants/constants"; import { OlympusConfig } from "../../interfaces"; -import { FaCheck, FaSpinner } from "react-icons/fa"; +import { FaCheck, FaRedo, FaSpinner } from "react-icons/fa"; import { OlExpandingTooltip } from "../components/olexpandingtooltip"; export function Header() { @@ -44,6 +54,8 @@ export function Header() { const [isLatestVersion, setIsLatestVersion] = useState(false); const [isBetaVersion, setIsBetaVersion] = useState(false); const [isDevVersion, setIsDevVersion] = useState(false); + const [enabledCommandModes, setEnabledCommandModes] = useState([] as string[]); + const [loadingNewCommandMode, setLoadingNewCommandMode] = useState(false); useEffect(() => { HiddenTypesChangedEvent.on((hiddenTypes) => setMapHiddenTypes({ ...hiddenTypes })); @@ -60,9 +72,11 @@ export function Header() { }); CommandModeOptionsChangedEvent.on((commandModeOptions) => { setCommandModeOptions(commandModeOptions); + setLoadingNewCommandMode(false); }); SessionDataChangedEvent.on(() => setSavingSessionData(true)); SessionDataSavedEvent.on(() => setSavingSessionData(false)); + EnabledCommandModesChangedEvent.on((enabledCommandModes) => setEnabledCommandModes(enabledCommandModes)); /* Check if we are running the latest version */ const request = new Request("https://raw.githubusercontent.com/Pax1601/DCSOlympus/main/version.json"); @@ -213,14 +227,79 @@ export function Header() { )} + {commandModeOptions.commandMode === GAME_MASTER && ( +