import { useEffect } from 'react';
import { LockKeyhole } from 'lucide-react';
import { AppShell, useRoute } from './components/app-shell';
import { EmptyState, PageHeader, Panel } from './components/ui';
import { useServer } from './context/server-context';
import { useI18n } from './lib/i18n';
import { canAccessRoute } from './lib/permissions';
import { AuditPage } from './pages/audit';
import { ClaimsPage } from './pages/claims';
import { ConsolePage } from './pages/console';
import { EconomyPage } from './pages/economy';
import { LoginPage } from './pages/login';
import { ModerationPage } from './pages/moderation';
import { MaintenancePage } from './pages/maintenance';
import { TriggersPage } from './pages/triggers';
import { MenusPage } from './pages/menus';
import { OverviewPage } from './pages/overview';
import { PlayersPage } from './pages/players';
import { PoliciesPage } from './pages/policies';
import { RollbackPage } from './pages/rollback';
import { SettingsPage } from './pages/settings';
const pages = {
overview: OverviewPage,
players: PlayersPage,
economy: EconomyPage,
triggers: TriggersPage,
menus: MenusPage,
policies: PoliciesPage,
audit: AuditPage,
console: ConsolePage,
settings: SettingsPage,
moderation: ModerationPage,
maintenance: MaintenancePage,
claims: ClaimsPage,
rollback: RollbackPage,
};
export function App() {
const [route, navigate] = useRoute();
const { session } = useServer();
const { t } = useI18n();
const Page = pages[route];
useEffect(() => {
document.title = `XFEServerManager · ${route}`;
}, [route]);
if (session?.authenticated === false) return <LoginPage />;
const denied = session?.authenticated === true && !canAccessRoute(session.actor, route);
return <AppShell route={route} navigate={navigate}>{denied ? (
<div className="page">
<PageHeader title={t('access.title')} description={t('access.description')} />
<Panel><EmptyState icon={<LockKeyhole />} title={t('access.title')} detail={t('access.detail')} /></Panel>
</div>
) : <Page />}</AppShell>;
}
import { useEffect } from 'react';
import { LockKeyhole } from 'lucide-react';
import { AppShell, useRoute } from './components/app-shell';
import { EmptyState, PageHeader, Panel } from './components/ui';
import { useServer } from './context/server-context';
import { useI18n } from './lib/i18n';
import { canAccessRoute } from './lib/permissions';
import { AuditPage } from './pages/audit';
import { ClaimsPage } from './pages/claims';
import { ConsolePage } from './pages/console';
import { EconomyPage } from './pages/economy';
import { LoginPage } from './pages/login';
import { ModerationPage } from './pages/moderation';
import { MaintenancePage } from './pages/maintenance';
import { TriggersPage } from './pages/triggers';
import { MenusPage } from './pages/menus';
import { OverviewPage } from './pages/overview';
import { PlayersPage } from './pages/players';
import { PoliciesPage } from './pages/policies';
import { RollbackPage } from './pages/rollback';
import { SettingsPage } from './pages/settings';
const pages = {
overview: OverviewPage,
players: PlayersPage,
economy: EconomyPage,
triggers: TriggersPage,
menus: MenusPage,
policies: PoliciesPage,
audit: AuditPage,
console: ConsolePage,
settings: SettingsPage,
moderation: ModerationPage,
maintenance: MaintenancePage,
claims: ClaimsPage,
rollback: RollbackPage,
};
export function App() {
const [route, navigate] = useRoute();
const { session } = useServer();
const { t } = useI18n();
const Page = pages[route];
useEffect(() => {
document.title = `XFEServerManager · ${route}`;
}, [route]);
if (session?.authenticated === false) return <LoginPage />;
const denied = session?.authenticated === true && !canAccessRoute(session.actor, route);
return <AppShell route={route} navigate={navigate}>{denied ? (
<div className="page">
<PageHeader title={t('access.title')} description={t('access.description')} />
<Panel><EmptyState icon={<LockKeyhole />} title={t('access.title')} detail={t('access.detail')} /></Panel>
</div>
) : <Page />}</AppShell>;
}