2026-10-16 09:31:45 -06:00
|
|
|
import type { ReactNode } from "react";
|
2026-10-16 07:40:29 -06:00
|
|
|
import { Navigate, useParams } from "react-router";
|
2026-10-16 09:31:45 -06:00
|
|
|
import { homePath, isScreen, orderScreens, type Screen } from "../auth/roles";
|
2026-10-16 07:40:29 -06:00
|
|
|
import { useAuth } from "../auth/useAuth";
|
|
|
|
|
import { AdminPage } from "./admin/AdminPage";
|
2026-10-16 09:31:45 -06:00
|
|
|
import { ClericalHome } from "./clerical/ClericalHome";
|
2026-10-16 07:40:29 -06:00
|
|
|
import { PlaceholderScreen } from "./PlaceholderScreen";
|
|
|
|
|
|
2026-10-16 09:31:45 -06:00
|
|
|
/** A page under a screen, like /clerical/projects/7. Users without the screen go to their first screen. */
|
|
|
|
|
export function RequireScreen({ screen, children }: { screen: Screen; children: ReactNode }) {
|
|
|
|
|
const { me } = useAuth();
|
|
|
|
|
if (!me) return null;
|
|
|
|
|
if (!orderScreens(me.screens).includes(screen)) return <Navigate to={homePath(me.screens)} replace />;
|
|
|
|
|
return <>{children}</>;
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-16 07:40:29 -06:00
|
|
|
/** /:screen. An unknown screen, or one the user does not have, goes to the user's first screen. */
|
|
|
|
|
export function ScreenRoute() {
|
|
|
|
|
const { screen } = useParams();
|
|
|
|
|
const { me } = useAuth();
|
|
|
|
|
if (!me) return null;
|
|
|
|
|
const allowed = orderScreens(me.screens);
|
|
|
|
|
if (!isScreen(screen) || !allowed.includes(screen)) return <Navigate to={homePath(me.screens)} replace />;
|
|
|
|
|
if (screen === "admin") return <AdminPage />;
|
2026-10-16 09:31:45 -06:00
|
|
|
if (screen === "clerical") return <ClericalHome />;
|
2026-10-16 07:40:29 -06:00
|
|
|
return <PlaceholderScreen key={screen} screen={screen} />;
|
|
|
|
|
}
|