- Add MFA enrollment UI in new Settings page with QR code and backup secret - Add TOTP challenge step to login flow for enrolled users - Check AAL after login and show TOTP input when aal2 required - Add disable MFA option with TOTP re-verification - Only show MFA options for email/password users (not OAuth) - Add Settings link to user dropdown menu Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
import { Routes, Route, Navigate } from 'react-router-dom'
|
|
import { Layout, ProtectedRoute, AdminRoute } from './components'
|
|
import { AdminLayout } from './components/admin'
|
|
import {
|
|
AuthCallback,
|
|
GenlockeDetail,
|
|
GenlockeList,
|
|
Home,
|
|
JournalEntryPage,
|
|
Login,
|
|
NewGenlocke,
|
|
NewRun,
|
|
RunList,
|
|
RunEncounters,
|
|
Settings,
|
|
Signup,
|
|
Stats,
|
|
} from './pages'
|
|
import {
|
|
AdminGames,
|
|
AdminGameDetail,
|
|
AdminPokemon,
|
|
AdminRouteDetail,
|
|
AdminEvolutions,
|
|
AdminRuns,
|
|
AdminGenlockes,
|
|
AdminGenlockeDetail,
|
|
} from './pages/admin'
|
|
|
|
function App() {
|
|
return (
|
|
<Routes>
|
|
<Route path="/" element={<Layout />}>
|
|
<Route index element={<Home />} />
|
|
<Route path="login" element={<Login />} />
|
|
<Route path="signup" element={<Signup />} />
|
|
<Route path="auth/callback" element={<AuthCallback />} />
|
|
<Route path="runs" element={<RunList />} />
|
|
<Route path="runs/new" element={<ProtectedRoute><NewRun /></ProtectedRoute>} />
|
|
<Route path="runs/:runId" element={<RunEncounters />} />
|
|
<Route path="runs/:runId/journal/:entryId" element={<JournalEntryPage />} />
|
|
<Route path="genlockes" element={<GenlockeList />} />
|
|
<Route path="genlockes/new" element={<ProtectedRoute><NewGenlocke /></ProtectedRoute>} />
|
|
<Route path="genlockes/:genlockeId" element={<GenlockeDetail />} />
|
|
<Route path="stats" element={<Stats />} />
|
|
<Route path="settings" element={<ProtectedRoute><Settings /></ProtectedRoute>} />
|
|
<Route
|
|
path="runs/:runId/encounters"
|
|
element={<Navigate to=".." relative="path" replace />}
|
|
/>
|
|
<Route path="admin" element={<AdminRoute><AdminLayout /></AdminRoute>}>
|
|
<Route index element={<Navigate to="/admin/games" replace />} />
|
|
<Route path="games" element={<AdminGames />} />
|
|
<Route path="games/:gameId" element={<AdminGameDetail />} />
|
|
<Route path="games/:gameId/routes/:routeId" element={<AdminRouteDetail />} />
|
|
<Route path="pokemon" element={<AdminPokemon />} />
|
|
<Route path="evolutions" element={<AdminEvolutions />} />
|
|
<Route path="runs" element={<AdminRuns />} />
|
|
<Route path="genlockes" element={<AdminGenlockes />} />
|
|
<Route path="genlockes/:genlockeId" element={<AdminGenlockeDetail />} />
|
|
</Route>
|
|
</Route>
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
export default App
|