Files
Dimension-47/client/src/App.tsx
Alexander Zielonka 94335ecd12 feat: Charaktere-Modul mit Pathbuilder Import
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>
2026-01-18 20:36:44 +01:00

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;