/** * @file Game layout component rendering the main game UI. * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ /* eslint-disable max-lines -- Complex layout with many conditional renders */ /* eslint-disable max-lines-per-function -- Complex layout with many conditional renders */ /* eslint-disable complexity -- Many tab render paths */ /* eslint-disable max-statements -- Many state variables for multi-mode tab routing */ import { type JSX, useEffect, useState } from "react"; import { useGame } from "../../context/gameContext.js"; import { ResourceBar } from "../ui/resourceBar.js"; import { AboutPanel } from "./aboutPanel.js"; import { AchievementPanel } from "./achievementPanel.js"; import { AchievementToast } from "./achievementToast.js"; import { AdventurerPanel } from "./adventurerPanel.js"; import { ApotheosisPanel } from "./apotheosisPanel.js"; import { BattleModal } from "./battleModal.js"; import { BossPanel } from "./bossPanel.js"; import { CharacterSheetPanel } from "./characterSheetPanel.js"; import { ClickArea } from "./clickArea.js"; import { CodexPanel } from "./codexPanel.js"; import { CodexToast } from "./codexToast.js"; import { CompanionPanel } from "./companionPanel.js"; import { ConsecrationPanel } from "./consecrationPanel.js"; import { CraftingPanel } from "./craftingPanel.js"; import { DailyChallengePanel } from "./dailyChallengePanel.js"; import { DebugPanel } from "./debugPanel.js"; import { DisciplesPanel } from "./disciplesPanel.js"; import { EditProfileModal } from "./editProfileModal.js"; import { EnlightenmentPanel } from "./enlightenmentPanel.js"; import { EquipmentPanel } from "./equipmentPanel.js"; import { ExplorationPanel } from "./explorationPanel.js"; import { GoddessAchievementsPanel } from "./goddessAchievementsPanel.js"; import { GoddessBossPanel } from "./goddessBossPanel.js"; import { GoddessCraftingPanel } from "./goddessCraftingPanel.js"; import { GoddessEquipmentPanel } from "./goddessEquipmentPanel.js"; import { GoddessExplorationPanel } from "./goddessExplorationPanel.js"; import { GoddessQuestsPanel } from "./goddessQuestsPanel.js"; import { GoddessUpgradesPanel } from "./goddessUpgradesPanel.js"; import { GoddessZonesPanel } from "./goddessZonesPanel.js"; import { JoinCommunityModal } from "./joinCommunityModal.js"; import { LoginBonusModal } from "./loginBonusModal.js"; import { MilestoneToast } from "./milestoneToast.js"; import { OfflineModal } from "./offlineModal.js"; import { OutdatedSchemaModal } from "./outdatedSchemaModal.js"; import { PrestigePanel } from "./prestigePanel.js"; import { QuestPanel } from "./questPanel.js"; import { QuestCompleteToast, QuestFailedToast } from "./questToast.js"; import { StatisticsPanel } from "./statisticsPanel.js"; import { StoryPanel } from "./storyPanel.js"; import { StoryToast } from "./storyToast.js"; import { TranscendencePanel } from "./transcendencePanel.js"; import { UpgradePanel } from "./upgradePanel.js"; import { VampireAchievementsPanel } from "./vampireAchievementsPanel.js"; import { VampireBossPanel } from "./vampireBossPanel.js"; import { VampireQuestsPanel } from "./vampireQuestsPanel.js"; import { VampireThrallsPanel } from "./vampireThrallsPanel.js"; import { VampireZonesPanel } from "./vampireZonesPanel.js"; type Mode = "mortal" | "goddess" | "vampire"; type Tab = | "adventurers" | "upgrades" | "quests" | "bosses" | "equipment" | "achievements" | "prestige" | "transcendence" | "apotheosis" | "statistics" | "daily" | "codex" | "about" | "exploration" | "crafting" | "character" | "companions" | "story" | "debug"; type GoddessTab = | "goddess-zones" | "goddess-bosses" | "goddess-quests" | "disciples" | "goddess-equipment" | "goddess-upgrades" | "consecration" | "enlightenment" | "goddess-crafting" | "goddess-exploration" | "goddess-achievements"; type VampireTab = | "vampire-zones" | "vampire-bosses" | "vampire-quests" | "thralls" | "vampire-equipment" | "vampire-upgrades" | "siring" | "vampire-awakening" | "vampire-crafting" | "vampire-exploration" | "vampire-achievements"; const baseTabs: Array<{ id: Tab; label: string }> = [ { id: "adventurers", label: "âš”ī¸ Adventurers" }, { id: "upgrades", label: "🔧 Upgrades" }, { id: "quests", label: "📜 Quests" }, { id: "bosses", label: "👹 Bosses" }, { id: "equipment", label: "đŸ—Ąī¸ Equipment" }, { id: "exploration", label: "đŸ—ēī¸ Exploration" }, { id: "crafting", label: "âš—ī¸ Crafting" }, { id: "daily", label: "📅 Daily" }, { id: "prestige", label: "⭐ Prestige" }, { id: "transcendence", label: "🌌 Transcendence" }, { id: "apotheosis", label: "✨ Apotheosis" }, { id: "statistics", label: "📊 Statistics" }, { id: "companions", label: "đŸ‘Ĩ Companions" }, { id: "character", label: "📋 Character" }, { id: "achievements", label: "🏆 Achievements" }, { id: "story", label: "📖 Story" }, { id: "codex", label: "đŸ—ēī¸ Codex" }, { id: "about", label: "â„šī¸ About" }, { id: "debug", label: "🔧 Debug" }, ]; const vampireTabs: Array<{ id: VampireTab; label: string }> = [ { id: "vampire-zones", label: "đŸ—ēī¸ Zones" }, { id: "vampire-bosses", label: "🩸 Bosses" }, { id: "vampire-quests", label: "📜 Quests" }, { id: "thralls", label: "🧟 Thralls" }, { id: "vampire-equipment", label: "đŸĻ‡ Equipment" }, { id: "vampire-upgrades", label: "âš”ī¸ Upgrades" }, { id: "siring", label: "🩸 Siring" }, { id: "vampire-awakening", label: "💀 Awakening" }, { id: "vampire-crafting", label: "âš—ī¸ Crafting" }, { id: "vampire-exploration", label: "🌑 Exploration" }, { id: "vampire-achievements", label: "🏆 Achievements" }, ]; const goddessTabs: Array<{ id: GoddessTab; label: string }> = [ { id: "goddess-zones", label: "🌟 Zones" }, { id: "goddess-bosses", label: "đŸ‘ī¸ Bosses" }, { id: "goddess-quests", label: "đŸ“ŋ Quests" }, { id: "disciples", label: "🙏 Disciples" }, { id: "goddess-equipment", label: "🔮 Equipment" }, { id: "goddess-upgrades", label: "✨ Upgrades" }, { id: "consecration", label: "đŸ•¯ī¸ Consecration" }, { id: "enlightenment", label: "đŸ’Ģ Enlightenment" }, { id: "goddess-crafting", label: "âš—ī¸ Crafting" }, { id: "goddess-exploration", label: "🌌 Exploration" }, { id: "goddess-achievements", label: "🏆 Achievements" }, ]; const modes: Array = [ "mortal", "goddess", "vampire" ]; const modeLabels: Record = { goddess: "✨ Goddess", mortal: "âš”ī¸ Mortal", vampire: "🧛 Vampire", }; /** * Reads the saved active mode from localStorage, defaulting to "mortal". * @returns The saved mode or "mortal". */ const readSavedMode = (): Mode => { const saved = localStorage.getItem("elysium-active-mode"); if (saved === "goddess" || saved === "vampire") { return saved; } return "mortal"; }; /** * Renders the main game layout with tabs and panels. * @returns The JSX element. */ const GameLayout = (): JSX.Element => { const { state, isLoading, error, battleResult, dismissBattle, lastSavedAt, isSyncing, forceSync, unlockedCodexEntryIds: pendingCodexEntryIds, unlockedStoryChapterIds: pendingStoryChapterIds, loginBonus, dismissLoginBonus, schemaOutdated, } = useGame(); const [ activeMode, setActiveMode ] = useState(readSavedMode); const [ activeTab, setActiveTab ] = useState("adventurers"); const [ activeGoddessTab, setActiveGoddessTab ] = useState("goddess-zones"); const [ activeVampireTab, setActiveVampireTab ] = useState("vampire-zones"); const [ editingProfile, setEditingProfile ] = useState(false); const [ dismissedOutdatedWarning, setDismissedOutdatedWarning ] = useState(false); useEffect(() => { document.body.classList.toggle("goddess-mode", activeMode === "goddess"); document.body.classList.toggle("vampire-mode", activeMode === "vampire"); }, [ activeMode ]); if (isLoading) { return (

{"Loading your adventure..."}

); } if (error !== null && error !== "") { return (

{"Error: "} {error}

); } if (state === null) { return (

{"Loading..."}

); } const codexBadgeCount = pendingCodexEntryIds.length; const storyBadgeCount = pendingStoryChapterIds.length; function handleOpenEditProfile(): void { setEditingProfile(true); } function handleCloseEditProfile(): void { setEditingProfile(false); } function handleDismissOutdated(): void { setDismissedOutdatedWarning(true); } function handleSetMode(mode: Mode): void { localStorage.setItem("elysium-active-mode", mode); setActiveMode(mode); } return (
{schemaOutdated && !dismissedOutdatedWarning ? : null}
{loginBonus === null ? null : } {battleResult === null ? null : } {editingProfile ? : null}
{/* eslint-disable-next-line no-nested-ternary -- Three-way mode switch for tab bar */} {activeMode === "mortal" ? : activeMode === "goddess" ? : }
{activeMode === "mortal" && activeTab === "adventurers" && } {activeMode === "mortal" && activeTab === "upgrades" && } {activeMode === "mortal" && activeTab === "quests" && } {activeMode === "mortal" && activeTab === "bosses" && } {activeMode === "mortal" && activeTab === "equipment" && } {activeMode === "mortal" && activeTab === "achievements" && } {activeMode === "mortal" && activeTab === "prestige" && } {activeMode === "mortal" && activeTab === "transcendence" && } {activeMode === "mortal" && activeTab === "apotheosis" && } {activeMode === "mortal" && activeTab === "exploration" && } {activeMode === "mortal" && activeTab === "crafting" && } {activeMode === "mortal" && activeTab === "statistics" && } {activeMode === "mortal" && activeTab === "daily" && } {activeMode === "mortal" && activeTab === "companions" && } {activeMode === "mortal" && activeTab === "character" && } {activeMode === "mortal" && activeTab === "story" && } {activeMode === "mortal" && activeTab === "codex" && } {activeMode === "mortal" && activeTab === "about" && } {activeMode === "mortal" && activeTab === "debug" && } {activeMode === "goddess" && activeGoddessTab === "goddess-zones" && } {activeMode === "goddess" && activeGoddessTab === "goddess-bosses" && } {activeMode === "goddess" && activeGoddessTab === "goddess-quests" && } {activeMode === "goddess" && activeGoddessTab === "disciples" && } {activeMode === "goddess" && activeGoddessTab === "goddess-equipment" && } {activeMode === "goddess" && activeGoddessTab === "goddess-upgrades" && } {activeMode === "goddess" && activeGoddessTab === "consecration" && } {activeMode === "goddess" && activeGoddessTab === "enlightenment" && } {activeMode === "goddess" && activeGoddessTab === "goddess-crafting" && } {activeMode === "goddess" && activeGoddessTab === "goddess-exploration" && } {activeMode === "goddess" && activeGoddessTab === "goddess-achievements" && } {activeMode === "vampire" && activeVampireTab === "vampire-zones" && } {activeMode === "vampire" && activeVampireTab === "vampire-bosses" && } {activeMode === "vampire" && activeVampireTab === "vampire-quests" && } {activeMode === "vampire" && activeVampireTab === "thralls" && } {activeMode === "vampire" && activeVampireTab === "vampire-equipment" &&

{"đŸĻ‡ Vampire Equipment coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "vampire-upgrades" &&

{"âš”ī¸ Vampire Upgrades coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "siring" &&

{"🩸 Siring coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "vampire-awakening" &&

{"💀 Vampire Awakening coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "vampire-crafting" &&

{"âš—ī¸ Vampire Crafting coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "vampire-exploration" &&

{"🌑 Vampire Exploration coming soon..."}

} {activeMode === "vampire" && activeVampireTab === "vampire-achievements" && }
); }; export { GameLayout };