import { useEffect, useRef, useState } from "react"; import { Navigate, NavLink, Route, Routes, useLocation } from "react-router-dom"; import { useAuth } from "./auth"; import { ChangeCredentials } from "./pages/ChangeCredentials"; import { GamePage } from "./pages/GamePage"; import { Library } from "./pages/Library"; import { Login } from "./pages/Login"; import { NewGame } from "./pages/NewGame"; import { ModEditor } from "./pages/ModEditor"; import { Play } from "./pages/Play"; import { Roles } from "./pages/Roles"; import { Saves } from "./pages/Saves"; import { TranslationEditor } from "./pages/TranslationEditor"; import { Users } from "./pages/Users"; import { useTheme } from "./theme"; import { Icon } from "./ui/Icon"; import { useSpatialNav } from "./ui/nav"; import { THEME_ICON, THEME_LABEL } from "./ui/ThemeButton"; import { UploadProvider } from "./uploads"; function RequirePerm({ perm, children }: { perm: string; children: JSX.Element }) { const { can } = useAuth(); return can(perm) ? children : (

Нет доступа к этой странице.

); } function UserMenu() { const { me, logout, can } = useAuth(); const { choice, cycle } = useTheme(); const [open, setOpen] = useState(false); const ref = useRef(null); const { pathname } = useLocation(); useEffect(() => setOpen(false), [pathname]); useEffect(() => { if (!open) return; const onDown = (e: MouseEvent) => !ref.current?.contains(e.target as Node) && setOpen(false); const onKey = (e: KeyboardEvent) => e.key === "Escape" && setOpen(false); document.addEventListener("mousedown", onDown); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDown); document.removeEventListener("keydown", onKey); }; }, [open]); if (!me) return null; return (
{open && (
{me.username}
{me.role.name}
Аккаунт и пароль Сохранения {(can("users.manage") || can("roles.manage")) &&
Администрирование
} {can("users.manage") && ( Пользователи )} {can("roles.manage") && ( Роли и права )}
)}
); } export function App() { const { me, loading, can } = useAuth(); useSpatialNav(); if (loading) return
; if (!me) return ; if (me.must_change_password || me.must_change_username) return ; return ( } />
PGames
} /> } /> } /> } /> } /> } /> } /> } /> } /> } />
} /> ); }