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 { Play } from "./pages/Play";
import { Roles } from "./pages/Roles";
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
} />
} />
} />
} />
} />
} />
} />
} />
}
/>
);
}