phase 3 bug fixing

This commit is contained in:
2026-05-07 00:55:46 +02:00
parent ce2aa2c776
commit 200c4f43ea
29 changed files with 1337 additions and 62 deletions
+37 -32
View File
@@ -1,6 +1,7 @@
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { AppShell } from './components/layout/AppShell'
import { AuthProvider } from './contexts/AuthContext'
import { RepoListSkeleton } from './ui/Skeleton'
import { Suspense, lazy, useEffect } from 'react'
import { bootstrapCSRF } from './api/client'
@@ -10,33 +11,30 @@ const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30_000,
retry: 1,
retry: false,
placeholderData: (prev: unknown) => prev,
},
},
})
// Pages — code-split per route
const DashboardPage = lazy(() => import('./pages/DashboardPage'))
const ReposPage = lazy(() => import('./pages/ReposPage'))
const RepoPage = lazy(() => import('./pages/RepoPage'))
const RepoPRsPage = lazy(() => import('./pages/RepoPRsPage'))
const PRDetailPage = lazy(() => import('./pages/PRDetailPage'))
const PRsPage = lazy(() => import('./pages/PRsPage'))
const PipelinesPage = lazy(() => import('./pages/PipelinesPage'))
const ProfilePage = lazy(() => import('./pages/ProfilePage'))
const ExplorePage = lazy(() => import('./pages/ExplorePage'))
const SettingsPage = lazy(() => import('./pages/SettingsPage'))
function PageLoader() {
return <div className="p-6"><RepoListSkeleton /></div>
}
const LoginPage = lazy(() => import('./pages/LoginPage'))
const RegisterPage = lazy(() => import('./pages/RegisterPage'))
const DashboardPage = lazy(() => import('./pages/DashboardPage'))
const ReposPage = lazy(() => import('./pages/ReposPage'))
const RepoPage = lazy(() => import('./pages/RepoPage'))
const RepoPRsPage = lazy(() => import('./pages/RepoPRsPage'))
const PRDetailPage = lazy(() => import('./pages/PRDetailPage'))
const PRsPage = lazy(() => import('./pages/PRsPage'))
const PipelinesPage = lazy(() => import('./pages/PipelinesPage'))
const ProfilePage = lazy(() => import('./pages/ProfilePage'))
const ExplorePage = lazy(() => import('./pages/ExplorePage'))
const SettingsPage = lazy(() => import('./pages/SettingsPage'))
function S({ children }: { children: React.ReactNode }) {
return <Suspense fallback={<PageLoader />}>{children}</Suspense>
return <Suspense fallback={<div className="p-6"><RepoListSkeleton /></div>}>{children}</Suspense>
}
// Primes the CSRF cookie once when the SPA mounts
function CSRFBootstrap() {
useEffect(() => { bootstrapCSRF() }, [])
return null
@@ -47,21 +45,28 @@ export default function App() {
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<CSRFBootstrap />
<Routes>
<Route element={<AppShell />}>
<Route index element={<S><DashboardPage /></S>} />
<Route path="repos" element={<S><ReposPage /></S>} />
<Route path="repos/:owner/:repo" element={<S><RepoPage /></S>} />
<Route path="repos/:owner/:repo/pulls" element={<S><RepoPRsPage /></S>} />
<Route path="repos/:owner/:repo/pulls/:prId" element={<S><PRDetailPage /></S>} />
<Route path="pulls" element={<S><PRsPage /></S>} />
<Route path="pipelines" element={<S><PipelinesPage /></S>} />
<Route path="explore" element={<S><ExplorePage /></S>} />
<Route path="profile" element={<S><ProfilePage /></S>} />
<Route path="settings" element={<S><SettingsPage /></S>} />
<Route path="*" element={<Navigate to="/" replace />} />
</Route>
</Routes>
<AuthProvider>
<Routes>
{/* Public — no shell */}
<Route path="login" element={<S><LoginPage /></S>} />
<Route path="register" element={<S><RegisterPage /></S>} />
{/* App shell wraps all authenticated pages */}
<Route element={<AppShell />}>
<Route index element={<S><DashboardPage /></S>} />
<Route path="repos" element={<S><ReposPage /></S>} />
<Route path="repos/:owner/:repo" element={<S><RepoPage /></S>} />
<Route path="repos/:owner/:repo/pulls" element={<S><RepoPRsPage /></S>} />
<Route path="repos/:owner/:repo/pulls/:prId" element={<S><PRDetailPage /></S>} />
<Route path="pulls" element={<S><PRsPage /></S>} />
<Route path="pipelines" element={<S><PipelinesPage /></S>} />
<Route path="explore" element={<S><ExplorePage /></S>} />
<Route path="profile" element={<S><ProfilePage /></S>} />
<Route path="settings" element={<S><SettingsPage /></S>} />
<Route path="*" element={<Navigate to="/" replace />} />
</Route>
</Routes>
</AuthProvider>
</BrowserRouter>
</QueryClientProvider>
)