Files
ocean-cleanup/src/App.tsx
2025-11-16 16:00:51 +00:00

105 lines
2.5 KiB
TypeScript

import { ClerkProvider } from '@clerk/clerk-react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
// Import Leaflet CSS
import 'leaflet/dist/leaflet.css';
// Layout
import { Layout } from './components/layout';
// Auth components
import { ProtectedRoute, SignInPage, SignUpPage } from './components/auth';
// Pages
import {
HomePage,
MapPage,
ReportFormPage,
EventsPage,
AnalyticsPage
} from './pages';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5 minutes
retry: 1,
},
},
});
const clerkPubKey = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY;
if (!clerkPubKey) {
throw new Error('Missing Clerk Publishable Key');
}
function App() {
return (
<ClerkProvider publishableKey={clerkPubKey}>
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<Routes>
{/* Public routes */}
<Route path="/sign-in/*" element={<SignInPage />} />
<Route path="/sign-up/*" element={<SignUpPage />} />
{/* Routes with layout */}
<Route
path="/"
element={
<Layout>
<HomePage />
</Layout>
}
/>
<Route
path="/map"
element={
<Layout>
<MapPage />
</Layout>
}
/>
{/* Protected routes */}
<Route
path="/reports/new"
element={
<ProtectedRoute>
<Layout>
<ReportFormPage />
</Layout>
</ProtectedRoute>
}
/>
<Route
path="/events"
element={
<ProtectedRoute>
<Layout>
<EventsPage />
</Layout>
</ProtectedRoute>
}
/>
<Route
path="/analytics"
element={
<ProtectedRoute>
<Layout>
<AnalyticsPage />
</Layout>
</ProtectedRoute>
}
/>
</Routes>
</BrowserRouter>
</QueryClientProvider>
</ClerkProvider>
);
}
export default App;