import React, { useState, useEffect } from 'react'; 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'; // Ensure this file exists or remove import if not import LinkPlayer from './pages/LinkPlayer'; import AdminPage from './pages/Admin'; import { dbService } from './services/DatabaseService'; import { authService } from './services/AuthService'; import { DiscordUser } from './types'; import { Icons } from './components/IconSet'; function App() { const [activeTab, setActiveTab] = useState('dashboard'); const [selectedPlayerId, setSelectedPlayerId] = useState(null); const [selectedCityId, setSelectedCityId] = useState(null); const [selectedProjectId, setSelectedProjectId] = useState(null); const [selectedOrgId, setSelectedOrgId] = useState(null); // 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) { setActiveTab('link-player'); } else if (currentUser && currentUser.linkedPlayerUuid) { // User is fully authenticated, redirect to dashboard if on link page if (activeTab === 'link-player') { setActiveTab('dashboard'); } } }); return unsub; }, [activeTab]); const handleNavigate = (tab: string) => { setActiveTab(tab); if (tab !== 'players') setSelectedPlayerId(null); if (tab !== 'cities') setSelectedCityId(null); if (tab !== 'projects') setSelectedProjectId(null); if (tab !== 'organizations') setSelectedOrgId(null); }; const navigateToPlayer = (id: string) => { setSelectedPlayerId(id); setActiveTab('players'); }; const navigateToProject = (id: string) => { setSelectedProjectId(id); setActiveTab('projects'); }; const navigateToOrg = (id: string) => { const org = orgs.find(o => o.id === id); if (org?.type === 'City') { setSelectedCityId(id); setActiveTab('cities'); } else { setSelectedOrgId(id); setActiveTab('organizations'); } }; const renderContent = () => { // Show link player page if user is logged in but not linked if (activeTab === 'link-player') { return ; } if (activeTab === 'dashboard') return ; if (activeTab === 'projects') { if (selectedProjectId) { const project = projects.find(p => p.id === selectedProjectId); if (project) return ( setSelectedProjectId(null)} onSelectPlayer={navigateToPlayer} onSelectOrg={navigateToOrg} /> ); } return ; } if (activeTab === 'organizations') { if (selectedOrgId) { const org = orgs.find(o => o.id === selectedOrgId); if (org) return ( setSelectedOrgId(null)} backLabel="Zurück zum Verzeichnis" onSelectPlayer={navigateToPlayer} onSelectProject={navigateToProject} /> ); } return ; } if (activeTab === 'setup') return ; if (activeTab === 'datapack') return ; if (activeTab === 'cities') { if (selectedCityId) { const city = orgs.find(o => o.id === selectedCityId); if (city) return ( setSelectedCityId(null)} backLabel="Zurück zu Städte" onSelectPlayer={navigateToPlayer} onSelectProject={navigateToProject} /> ); } return ; } if (activeTab === 'players') { if (selectedPlayerId) { const player = players.find(p => p.uuid === selectedPlayerId); if (player) return setSelectedPlayerId(null)} />; } return (

Bürgerverzeichnis

{players.map(player => (
setSelectedPlayerId(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})}
))}
); } // Admin panel (only for admins) if (activeTab === 'admin') { return setActiveTab('dashboard')} />; } // Placeholder for database manager if user navigates there (needs explicit page or component) if (activeTab === 'database') { return
Datenbank wird jetzt über das Backend (SQLite) verwaltet.
} return (

Modul {activeTab} wird derzeit gewartet.

); }; return ( {renderContent()} ); } export default App;