File size: 2,702 Bytes
a566fb0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
import { useEffect, useState } from "react";
import LabSelection from "./login.jsx";
import { QueryClientProvider } from '@tanstack/react-query'
import { queryClientInstance } from '@/lib/query-client'
import NavigationTracker from '@/lib/NavigationTracker'
import { pagesConfig } from './pages.config'
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import PageNotFound from './lib/PageNotFound';
import { AuthProvider, useAuth } from '@/lib/AuthContext';
import UserNotRegisteredError from '@/components/UserNotRegisteredError';
const { Pages, Layout, mainPage } = pagesConfig;
const mainPageKey = mainPage ?? Object.keys(Pages)[0];
const MainPage = mainPageKey ? Pages[mainPageKey] : <></>;
const LayoutWrapper = ({ children, currentPageName }) => Layout ?
<Layout currentPageName={currentPageName}>{children}</Layout>
: <>{children}</>;
const AuthenticatedApp = () => {
const { isLoadingAuth, isLoadingPublicSettings, authError, navigateToLogin } = useAuth();
// Show loading spinner while checking app public settings or auth
if (isLoadingPublicSettings || isLoadingAuth) {
return (
<div className="fixed inset-0 flex items-center justify-center">
<div className="w-8 h-8 border-4 border-slate-200 border-t-slate-800 rounded-full animate-spin"></div>
</div>
);
}
// Handle authentication errors
if (authError) {
if (authError.type === 'user_not_registered') {
return <UserNotRegisteredError />;
} else if (authError.type === 'auth_required') {
// Redirect to login automatically
navigateToLogin();
return null;
}
}
// Render the main app
return (
<Routes>
<Route path="/" element={
<LayoutWrapper currentPageName={mainPageKey}>
<MainPage />
</LayoutWrapper>
} />
{Object.entries(Pages).map(([path, Page]) => (
<Route
key={path}
path={`/${path}`}
element={
<LayoutWrapper currentPageName={path}>
<Page />
</LayoutWrapper>
}
/>
))}
<Route path="*" element={<PageNotFound />} />
</Routes>
);
};
function App() {
const [labApproved, setLabApproved] = useState(false);
if (!labApproved) {
return <LabSelection onApproved={() => setLabApproved(true)} />;
}
return (
<AuthProvider>
<QueryClientProvider client={queryClientInstance}>
<Router>
<NavigationTracker />
<AuthenticatedApp />
</Router>
</QueryClientProvider>
</AuthProvider>
);
}
export default App; |