86 lines
2.7 KiB
TypeScript
86 lines
2.7 KiB
TypeScript
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||
|
|
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';
|
||
|
|
|
||
|
|
import { Layout } from '@/components/Layout';
|
||
|
|
import { RequireAdmin } from '@/components/RequireAdmin';
|
||
|
|
import { RequireAuth } from '@/components/RequireAuth';
|
||
|
|
import { AdminGroupsPage } from '@/pages/AdminGroupsPage';
|
||
|
|
import { AdminInvitationsPage } from '@/pages/AdminInvitationsPage';
|
||
|
|
import { AdminUsersPage } from '@/pages/AdminUsersPage';
|
||
|
|
import { HomePage } from '@/pages/HomePage';
|
||
|
|
import { LoginPage } from '@/pages/LoginPage';
|
||
|
|
import { ProfilePage } from '@/pages/ProfilePage';
|
||
|
|
import { RegisterPage } from '@/pages/RegisterPage';
|
||
|
|
import { SetupPage } from '@/pages/SetupPage';
|
||
|
|
import { AuthContext, useProvideAuth } from '@/lib/auth';
|
||
|
|
|
||
|
|
const queryClient = new QueryClient({
|
||
|
|
defaultOptions: {
|
||
|
|
queries: {
|
||
|
|
retry: false,
|
||
|
|
refetchOnWindowFocus: false,
|
||
|
|
staleTime: 30_000,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
function AuthProvider({ children }: { children: React.ReactNode }) {
|
||
|
|
const auth = useProvideAuth();
|
||
|
|
return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>;
|
||
|
|
}
|
||
|
|
|
||
|
|
function App() {
|
||
|
|
return (
|
||
|
|
<QueryClientProvider client={queryClient}>
|
||
|
|
<BrowserRouter>
|
||
|
|
<AuthProvider>
|
||
|
|
<Routes>
|
||
|
|
<Route element={<Layout />}>
|
||
|
|
<Route path="/login" element={<LoginPage />} />
|
||
|
|
<Route path="/setup" element={<SetupPage />} />
|
||
|
|
<Route path="/register" element={<RegisterPage />} />
|
||
|
|
{/* Home page stays public — it's an ops dashboard, not sensitive. */}
|
||
|
|
<Route path="/" element={<HomePage />} />
|
||
|
|
<Route
|
||
|
|
path="/profile"
|
||
|
|
element={
|
||
|
|
<RequireAuth>
|
||
|
|
<ProfilePage />
|
||
|
|
</RequireAuth>
|
||
|
|
}
|
||
|
|
/>
|
||
|
|
<Route
|
||
|
|
path="/admin/users"
|
||
|
|
element={
|
||
|
|
<RequireAdmin>
|
||
|
|
<AdminUsersPage />
|
||
|
|
</RequireAdmin>
|
||
|
|
}
|
||
|
|
/>
|
||
|
|
<Route
|
||
|
|
path="/admin/groups"
|
||
|
|
element={
|
||
|
|
<RequireAdmin>
|
||
|
|
<AdminGroupsPage />
|
||
|
|
</RequireAdmin>
|
||
|
|
}
|
||
|
|
/>
|
||
|
|
<Route
|
||
|
|
path="/admin/invitations"
|
||
|
|
element={
|
||
|
|
<RequireAdmin>
|
||
|
|
<AdminInvitationsPage />
|
||
|
|
</RequireAdmin>
|
||
|
|
}
|
||
|
|
/>
|
||
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
||
|
|
</Route>
|
||
|
|
</Routes>
|
||
|
|
</AuthProvider>
|
||
|
|
</BrowserRouter>
|
||
|
|
</QueryClientProvider>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
export default App;
|