import React, { Suspense, lazy, useEffect } from "react" import { Layout, Space, Button, Tag, Spin } from "antd" import { MenuFoldOutlined, MenuUnfoldOutlined, FullscreenOutlined, FullscreenExitOutlined, } from "@ant-design/icons" import { Routes, Route, Navigate, useLocation } from "react-router-dom" import { useTranslation } from "react-i18next" import { WindowControls } from "./WindowControls" import appLogo from "../assets/logoHD.svg" const loadHome = () => import("./Home") const loadStudentManager = () => import("./StudentManager") const loadSettings = () => import("./Settings") const loadReasonManager = () => import("./ReasonManager") const loadScoreManager = () => import("./ScoreManager") const loadLeaderboard = () => import("./Leaderboard") const loadSettlementHistory = () => import("./SettlementHistory") const loadAutoScoreManager = () => import("./AutoScoreManager") const loadRewardSettings = () => import("./RewardSettings") const loadBoardManager = () => import("./BoardManager") const Home = lazy(() => loadHome().then((m) => ({ default: m.Home }))) const StudentManager = lazy(() => loadStudentManager().then((m) => ({ default: m.StudentManager }))) const Settings = lazy(() => loadSettings().then((m) => ({ default: m.Settings }))) const ReasonManager = lazy(() => loadReasonManager().then((m) => ({ default: m.ReasonManager }))) const ScoreManager = lazy(() => loadScoreManager().then((m) => ({ default: m.ScoreManager }))) const Leaderboard = lazy(() => loadLeaderboard().then((m) => ({ default: m.Leaderboard }))) const SettlementHistory = lazy(() => loadSettlementHistory().then((m) => ({ default: m.SettlementHistory })) ) const AutoScoreManager = lazy(() => loadAutoScoreManager().then((m) => ({ default: m.AutoScoreManager })) ) const RewardSettings = lazy(() => loadRewardSettings().then((m) => ({ default: m.RewardSettings }))) const BoardManager = lazy(() => loadBoardManager().then((m) => ({ default: m.BoardManager }))) const warmupRouteChunks = () => Promise.allSettled([ loadHome(), loadStudentManager(), loadSettings(), loadReasonManager(), loadScoreManager(), loadLeaderboard(), loadSettlementHistory(), loadAutoScoreManager(), loadRewardSettings(), loadBoardManager(), ]) const { Content } = Layout interface ContentAreaProps { permission: "admin" | "points" | "view" hasAnyPassword: boolean onAuthClick: () => void onLogout: () => void showWindowControls: boolean isPortraitMode: boolean sidebarCollapsed: boolean floatingExpand: boolean floatingExpanded: boolean onToggleSidebar: () => void immersiveMode: boolean isHomePage: boolean onToggleImmersiveMode: () => void showSidebarToggle?: boolean bottomInset?: number } export function ContentArea({ permission, hasAnyPassword, onAuthClick, onLogout, showWindowControls, isPortraitMode, sidebarCollapsed, floatingExpand, floatingExpanded, onToggleSidebar, immersiveMode, isHomePage, onToggleImmersiveMode, showSidebarToggle = true, bottomInset = 0, }: ContentAreaProps): React.JSX.Element { const { t } = useTranslation() const location = useLocation() const isSubPage = location.pathname !== "/" && !location.pathname.startsWith("/home") const shouldAnimateSubPage = isPortraitMode && isSubPage useEffect(() => { let cancelled = false let timer: ReturnType | undefined const runWarmup = () => { if (cancelled) return warmupRouteChunks().catch(() => void 0) } if ("requestIdleCallback" in window) { ;(window as any).requestIdleCallback(runWarmup, { timeout: 1500 }) } else { timer = setTimeout(runWarmup, 300) } return () => { cancelled = true if (timer) clearTimeout(timer) } }, []) const permissionTag = ( {permission === "admin" ? t("permissions.admin") : permission === "points" ? t("permissions.points") : t("permissions.view")} ) return (
{!immersiveMode && showSidebarToggle && (
{immersiveMode && (
SecScore SecScore
)}
{(immersiveMode || isHomePage) && ( )}
{showWindowControls && }
} >
} /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } />
) }