import { StrictMode, Suspense, lazy, useEffect } from 'react';
import { createRoot } from 'react-dom/client';
import { BrowserRouter, Route, Routes, useLocation, useNavigate } from 'react-router';
import 'pretendard/dist/web/variable/pretendardvariable-dynamic-subset.css';
import './styles/global.css';
import { ConnectionBanner, Toasts } from './components/ui';
import { useSession } from './store/session';
import { toast } from './store/toast';
import { Home } from './pages/Home';
import { SiteHeader } from './components/SiteHeader';
const JoinPage = lazy(() => import('./pages/JoinPage'));
const RoomPage = lazy(() => import('./pages/RoomPage'));
const GamePage = lazy(() => import('./pages/GamePage'));
const MePage = lazy(() => import('./pages/MePage'));
const RulesPage = lazy(() => import('./pages/RulesPage'));
const NotFound = lazy(() => import('./pages/NotFound'));
const AdminApp = lazy(() => import('./pages/admin/AdminApp'));
const GamesPage = lazy(() => import('./pages/GamesPage'));
function Announcement() {
const text = useSession((s) => s.announcement);
const maintenance = useSession((s) => s.maintenance);
if (!text && !maintenance) return null;
return (
{maintenance && 'π μ κ² μ€ Β· '}
{text || 'μ λ°©μ μ μ λ§λ€ μ μμ΄μ.'}
);
}
function Shell() {
const loaded = useSession((s) => s.loaded);
const nav = useNavigate();
const loc = useLocation();
useEffect(() => {
void useSession.getState().refresh();
const onUnauthorized = () => void useSession.getState().refresh();
window.addEventListener('bg:unauthorized', onUnauthorized);
return () => window.removeEventListener('bg:unauthorized', onUnauthorized);
}, []);
useEffect(() => {
const q = new URLSearchParams(loc.search);
if (q.get('linked') === '1') toast('λμ€μ½λ κ³μ κ³Ό μ°κ²°νμ΄μ.');
if (q.get('login') === 'failed') toast('λμ€μ½λ λ‘κ·ΈμΈμ μ€ν¨νμ΄μ. λ€μ μλν΄ μ£ΌμΈμ.', 'error');
if (q.get('login') === 'banned') toast('μ΄μ©μ΄ μ νλ κ³μ μ΄μμ.', 'error', 6000);
if (q.has('linked') || q.has('login')) {
q.delete('linked');
q.delete('login');
nav({ pathname: loc.pathname, search: q.toString() }, { replace: true });
}
}, [loc.search]); // eslint-disable-line react-hooks/exhaustive-deps
if (!loaded) return λΆλ¬μ€λ μ€β¦
;
return (
<>
λΆλ¬μ€λ μ€β¦}>
} />
} />
} />
} />
} />
} />
} />
} />
} />
>
);
}
createRoot(document.getElementById('root')!).render(
,
);