import React, { useState, useEffect } from 'react'; import { Routes, Route, useNavigate, useLocation } from 'react-router-dom'; import Layout from './components/Layout'; import Dashboard from './pages/Dashboard'; import PlayerProfile from './pages/PlayerProfile'; import SetupGuide from './pages/SetupGuide'; import Projects from './pages/Projects'; import Organizations from './pages/Organizations'; import Cities from './pages/Cities'; import CityProfile from './pages/CityProfile'; import ProjectProfile from './pages/ProjectProfile'; import DatapackGenerator from './pages/DatapackGenerator'; import DatabaseManager from './pages/DatabaseManager'; import LinkPlayer from './pages/LinkPlayer'; import AdminPage from './pages/Admin'; import { dbService } from './services/DatabaseService'; import { authService } from './services/AuthService'; import { DiscordUser } from './types'; function App() { const navigate = useNavigate(); const location = useLocation(); // Auth state const [user, setUser] = useState(null); const [authChecked, setAuthChecked] = useState(false); // State for data from DB (Async) const [players, setPlayers] = useState(dbService.getPlayers()); const [orgs, setOrgs] = useState(dbService.getOrgs()); const [projects, setProjects] = useState(dbService.getProjects()); // Subscribe to DB updates (when fetch completes or edits happen) useEffect(() => { const unsub = dbService.subscribe(() => { setPlayers([...dbService.getPlayers()]); setOrgs([...dbService.getOrgs()]); setProjects([...dbService.getProjects()]); }); return unsub; }, []); // Subscribe to auth updates useEffect(() => { const unsub = authService.subscribe((currentUser) => { setUser(currentUser); setAuthChecked(true); // If user is logged in but not linked, redirect to link page if (currentUser && !currentUser.linkedPlayerUuid) { navigate('/link-player'); } else if (currentUser && currentUser.linkedPlayerUuid) { // User is fully authenticated, redirect from link page if needed if (location.pathname === '/link-player') { navigate('/'); } } }); return unsub; }, [navigate, location.pathname]); const navigateToPlayer = (id: string) => { navigate(`/players/${id}`); }; const navigateToProject = (id: string) => { navigate(`/projects/${id}`); }; const navigateToOrg = (id: string) => { const org = orgs.find(o => o.id === id); if (org?.type === 'City') { navigate(`/cities/${id}`); } else { navigate(`/organizations/${id}`); } }; const handleNavigate = (path: string) => { navigate(path); }; // Determine active tab from current path const getActiveTab = () => { const path = location.pathname; if (path === '/') return 'dashboard'; if (path.startsWith('/players')) return 'players'; if (path.startsWith('/cities')) return 'cities'; if (path.startsWith('/projects')) return 'projects'; if (path.startsWith('/organizations')) return 'organizations'; if (path.startsWith('/admin')) return 'admin'; if (path === '/setup') return 'setup'; if (path === '/datapack') return 'datapack'; if (path === '/link-player') return 'link-player'; return 'dashboard'; }; const activeTab = getActiveTab(); return ( {/* Auth Route */} } /> {/* Main Routes */} } /> } /> } /> {/* Player Routes */}

Bürgerverzeichnis

{players.map(player => (
navigateToPlayer(player.uuid)} className="group bg-surface border border-border p-4 rounded-xl cursor-pointer hover:border-accentInfo/50 transition-all duration-200 hover:shadow-card" >
{player.username}
{player.tags.slice(0, 2).map(t => {t})}
))}
} /> } /> {/* City Routes */} navigateToOrg(id)} />} /> } /> {/* Organization Routes */} navigateToOrg(id)} />} /> } /> {/* Project Routes */} navigateToProject(id)} />} /> navigate('/projects')} onSelectPlayer={navigateToPlayer} onSelectOrg={navigateToOrg} />} /> {/* Admin Routes */} navigate('/')} />} /> {/* Fallback */}
404

Seite nicht gefunden

} />
); } export default App;