mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 18:19:43 +00:00
Give support read-only visibility into purchase history, streak locality fields, notification preferences, the dares loop, couples quiz sessions, invite-code lookup, and recent live-draw activity, all backed by resources already allow-listed in the admin repository.
258 lines
12 KiB
TypeScript
Executable File
258 lines
12 KiB
TypeScript
Executable File
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import { AuthProvider, PERMISSION_KEYS } from '@/contexts/AuthContext';
|
|
import { ProtectedRoute } from '@/components/ProtectedRoute';
|
|
import { AppLayout } from '@/components/layout/AppLayout';
|
|
import { LoginPage } from '@/pages/LoginPage';
|
|
import { DashboardPage } from '@/pages/DashboardPage';
|
|
import { CategoriesPage } from '@/pages/content/CategoriesPage';
|
|
import { PacksPage } from '@/pages/content/PacksPage';
|
|
import { QuestionsPage } from '@/pages/content/QuestionsPage';
|
|
import { QuestionAnalyticsPage } from '@/pages/content/QuestionAnalyticsPage';
|
|
import { TagsPage } from '@/pages/content/TagsPage';
|
|
import { DarePacksPage } from '@/pages/content/DarePacksPage';
|
|
import { DaresPage } from '@/pages/content/DaresPage';
|
|
import { QuizQuestionsPage } from '@/pages/content/QuizQuestionsPage';
|
|
import { UsersPage } from '@/pages/users/UsersPage';
|
|
import { UserDetailPage } from '@/pages/users/UserDetailPage';
|
|
import { CouplesPage } from '@/pages/users/CouplesPage';
|
|
import { MatchChatPage } from '@/pages/users/MatchChatPage';
|
|
import { AuditLogsPage } from '@/pages/AuditLogsPage';
|
|
import { AdminsPage } from '@/pages/admins/AdminsPage';
|
|
import { RedemptionCodesPage } from '@/pages/RedemptionCodesPage';
|
|
import { FeedbackPage } from '@/pages/FeedbackPage';
|
|
import { UsageInsightsPage } from '@/pages/UsageInsightsPage';
|
|
import { UserActivityPage } from '@/pages/activity/UserActivityPage';
|
|
import { SentDaresPage } from '@/pages/activity/SentDaresPage';
|
|
import { LiveDrawSessionsPage } from '@/pages/activity/LiveDrawSessionsPage';
|
|
import { AiSettingsPage } from '@/pages/AiSettingsPage';
|
|
import { AppSettingsPage } from '@/pages/AppSettingsPage';
|
|
import { FlaggedMessagesPage } from '@/pages/FlaggedMessagesPage';
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<Routes>
|
|
{/* Public routes */}
|
|
<Route path="/login" element={<LoginPage />} />
|
|
|
|
{/* Protected routes */}
|
|
<Route
|
|
element={
|
|
<ProtectedRoute>
|
|
<AppLayout />
|
|
</ProtectedRoute>
|
|
}
|
|
>
|
|
{/* Dashboard */}
|
|
<Route path="/" element={<DashboardPage />} />
|
|
|
|
{/* Content management */}
|
|
<Route
|
|
path="/categories"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_CATEGORIES}>
|
|
<CategoriesPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/categories/:categoryId/packs"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_PACKS}>
|
|
<PacksPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/categories/:categoryId/dare-packs"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_PACKS}>
|
|
<DarePacksPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/packs/:packId/questions"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_QUESTIONS}>
|
|
<QuestionsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/question-analytics"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_QUESTIONS}>
|
|
<QuestionAnalyticsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/tags"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_PACKS}>
|
|
<TagsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/dare-packs"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_PACKS}>
|
|
<DarePacksPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/dare-packs/:packId/dares"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_QUESTIONS}>
|
|
<DaresPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/quiz-questions"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_QUESTIONS}>
|
|
<QuizQuestionsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* User management */}
|
|
<Route
|
|
path="/users"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_USERS}>
|
|
<UsersPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/users/:userId"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_USERS}>
|
|
<UserDetailPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/users/:userId/matches/:matchId"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_CHATS}>
|
|
<MatchChatPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/usage-insights"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_USERS}>
|
|
<UsageInsightsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/couples"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_USERS}>
|
|
<CouplesPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/activity"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_ACTIVITY}>
|
|
<UserActivityPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/activity/sent-dares"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_ACTIVITY}>
|
|
<SentDaresPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/activity/live-draw"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_USERS}>
|
|
<LiveDrawSessionsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
|
|
{/* System */}
|
|
<Route
|
|
path="/admins"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_ADMINS}>
|
|
<AdminsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/redemption-codes"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_CODES}>
|
|
<RedemptionCodesPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/audit-logs"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_AUDIT_LOGS}>
|
|
<AuditLogsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/feedback"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_FEEDBACK}>
|
|
<FeedbackPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/ai-settings"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_AI_CONFIG}>
|
|
<AiSettingsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/flagged-messages"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.VIEW_CHATS}>
|
|
<FlaggedMessagesPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/app-settings"
|
|
element={
|
|
<ProtectedRoute requiredPermission={PERMISSION_KEYS.MANAGE_APP_CONFIG}>
|
|
<AppSettingsPage />
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
</Route>
|
|
|
|
{/* Catch all - redirect to dashboard */}
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
);
|
|
}
|
|
|
|
export default App;
|