import {
BrowserRouter,
Routes,
Route,
NavLink,
useLocation,
} from "react-router-dom";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ThemeProvider } from "@mui/material/styles";
import {
AppBar,
Typography,
Box,
Tabs,
Tab,
Container,
CssBaseline,
Chip,
useMediaQuery,
Button,
Stack,
Card,
CardContent,
CircularProgress,
} from "@mui/material";
import { useEffect, useMemo } from "react";
import { AuthProvider, useAuth } from "react-oidc-context";
import { Dashboard } from "./pages/Dashboard";
import { Monitoring } from "./pages/Monitoring";
import { Media } from "./pages/Media";
import { UsersPage } from "./pages/Users";
import { FileBrowser } from "./pages/FileBrowser";
import { getAppTheme } from "./theme";
import { getOidcConfig, isOidcConfigured, setAccessToken } from "./auth";
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false } },
});
function Shell({
darkMode,
authLabel,
onSignOut,
}: {
darkMode: boolean;
authLabel?: string;
onSignOut?: () => void;
}) {
const location = useLocation();
const current = location.pathname;
const isMobile = useMediaQuery("(max-width: 900px)");
return (
<>
M
Manage
Media operations dashboard
{authLabel && (
)}
{onSignOut && (
)}
} />
} />
} />
} />
} />
>
);
}
function LoadingScreen({ label }: { label: string }) {
return (
{label}
);
}
function SignInScreen({ onSignIn }: { onSignIn: () => void }) {
return (
Sign in required
Use your Authentik account to access Manage.
);
}
function AuthenticatedApp({ darkMode }: { darkMode: boolean }) {
const auth = useAuth();
useEffect(() => {
setAccessToken(auth.user?.access_token ?? null);
}, [auth.user?.access_token]);
const authLabel = useMemo(() => {
const profile = auth.user?.profile as Record | undefined;
return String(
profile?.name ??
profile?.preferred_username ??
profile?.email ??
auth.user?.profile?.sub ??
"Authenticated",
);
}, [auth.user]);
if (auth.isLoading || auth.activeNavigator) {
return ;
}
if (auth.error) {
return (
);
}
if (!auth.isAuthenticated) {
return void auth.signinRedirect()} />;
}
return (
void auth.signoutRedirect()}
/>
);
}
function AppInner() {
const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
const theme = useMemo(
() => getAppTheme(prefersDarkMode ? "dark" : "light"),
[prefersDarkMode],
);
return (
{isOidcConfigured() ? (
) : (
)}
);
}
export default function App() {
return ;
}