import {useEffect, useState} from 'react'; import ProfileMenu from "Frontend/components/ProfileMenu"; import {Button, Divider, Link, Navbar, NavbarBrand, NavbarContent, NavbarItem, Tooltip} from "@heroui/react"; import GameyfinLogo from "Frontend/components/theming/GameyfinLogo"; import * as PackageJson from "../../../../package.json"; import {Outlet, useLocation, useNavigate} from "react-router"; import {useAuth} from "Frontend/util/auth"; import { ArrowLeftIcon, DiceSixIcon, DiscIcon, HeartIcon, HouseIcon, ListMagnifyingGlassIcon, SignInIcon } from "@phosphor-icons/react"; import Confetti, {ConfettiProps} from "react-confetti-boom"; import {useTheme} from "next-themes"; import {useUserPreferenceService} from "Frontend/util/user-preference-service"; import SearchBar from "Frontend/components/general/SearchBar"; import {useSnapshot} from "valtio/react"; import {gameState} from "Frontend/state/GameState"; import ScanProgressPopover from "Frontend/components/general/ScanProgressPopover"; import {isAdmin} from "Frontend/util/utils"; export default function MainLayout() { const navigate = useNavigate(); const location = useLocation(); const auth = useAuth(); const userPreferenceService = useUserPreferenceService(); const {setTheme} = useTheme(); const isSearchPage = location.pathname.startsWith("/search"); const isHomePage = location.pathname === "/"; const [isExploding, setIsExploding] = useState(false); const games = useSnapshot(gameState).games; useEffect(() => { userPreferenceService.sync() .then(() => loadUserTheme().catch(console.error)) .catch(console.error); }, [auth.state.user]); const confettiProps: ConfettiProps = { mode: 'boom', x: 0.5, y: 1, particleCount: 1000, spreadDeg: 90, launchSpeed: 4, effectInterval: 10000 } async function loadUserTheme() { let syncedTheme = await userPreferenceService.get("preferred-theme") if (syncedTheme !== undefined) { setTheme(syncedTheme); } } function easterEgg() { if (isExploding) return; setIsExploding(true); if (confettiProps.mode === "boom") { setTimeout(() => setIsExploding(false), confettiProps.effectInterval); } } function getRandomGameId() { return games[Math.floor(Math.random() * games.length)].id; } return (