Backend: - Characters-Modul (CRUD, HP-Tracking, Conditions) - Pathbuilder 2e JSON Import Service - Claude API Integration für automatische Übersetzungen - Translations-Modul mit Datenbank-Caching - Prisma Schema erweitert (Character, Abilities, Skills, Feats, Items, Resources) Frontend: - Kampagnen-Detailseite mit Mitglieder- und Charakterverwaltung - Charakter erstellen Modal - Pathbuilder Import Modal (Datei-Upload + JSON-Paste) - Logo-Integration (Dimension 47 + Zeasy) - Cinzel Font für Branding Weitere Änderungen: - Auth 401 Redirect Fix für Login-Seite - PROGRESS.md mit Projektfortschritt Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
import { LoginPage, RegisterPage, useAuthStore } from '@/features/auth';
|
|
import { CampaignsPage, CampaignDetailPage } from '@/features/campaigns';
|
|
import { CharacterSheetPage } from '@/features/characters';
|
|
import { ProtectedRoute } from '@/shared/components/protected-route';
|
|
import { Layout } from '@/shared/components/layout';
|
|
|
|
// Create a client
|
|
const queryClient = new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
retry: 1,
|
|
},
|
|
},
|
|
});
|
|
|
|
function AppContent() {
|
|
const { checkAuth, isAuthenticated } = useAuthStore();
|
|
|
|
useEffect(() => {
|
|
checkAuth();
|
|
}, [checkAuth]);
|
|
|
|
return (
|
|
<Routes>
|
|
{/* Public Routes */}
|
|
<Route
|
|
path="/login"
|
|
element={
|
|
isAuthenticated ? <Navigate to="/" replace /> : <LoginPage />
|
|
}
|
|
/>
|
|
<Route
|
|
path="/register"
|
|
element={
|
|
isAuthenticated ? <Navigate to="/" replace /> : <RegisterPage />
|
|
}
|
|
/>
|
|
|
|
{/* Protected Routes */}
|
|
<Route element={<ProtectedRoute />}>
|
|
<Route element={<Layout />}>
|
|
<Route path="/" element={<CampaignsPage />} />
|
|
<Route path="/campaigns/:id" element={<CampaignDetailPage />} />
|
|
<Route path="/campaigns/:id/characters/:characterId" element={<CharacterSheetPage />} />
|
|
<Route path="/library" element={<div>Library (TODO)</div>} />
|
|
</Route>
|
|
</Route>
|
|
|
|
{/* Fallback */}
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
);
|
|
}
|
|
|
|
function App() {
|
|
return (
|
|
<QueryClientProvider client={queryClient}>
|
|
<BrowserRouter>
|
|
<AppContent />
|
|
</BrowserRouter>
|
|
</QueryClientProvider>
|
|
);
|
|
}
|
|
|
|
export default App;
|