import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { getServers, getAllDisplaySettings } from '../api' import { useUser } from '../context/UserContext' import ServerCard from '../components/ServerCard' import UserManagement from '../components/UserManagement' import ActivityLog from '../components/ActivityLog' import LoginModal from '../components/LoginModal' export default function Dashboard({ onLogout }) { const navigate = useNavigate() const { user, token, loading: userLoading, isSuperadmin, isModerator, role } = useUser() const [servers, setServers] = useState([]) const [displaySettings, setDisplaySettings] = useState({}) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [showUserMgmt, setShowUserMgmt] = useState(false) const [showActivityLog, setShowActivityLog] = useState(false) const [showLogin, setShowLogin] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const isGuest = user?.isGuest || role === 'guest' const isAuthenticated = !!token const fetchServers = async () => { try { const [data, settings] = await Promise.all([ getServers(token), getAllDisplaySettings(token) ]) setServers(data) setDisplaySettings(settings) setError('') } catch (err) { if (err.message.includes('401') || err.message.includes('403')) { if (isAuthenticated) { onLogout() } } else { setError('Verbindung zum Server fehlgeschlagen') } } finally { setLoading(false) } } useEffect(() => { if (!userLoading) { fetchServers() const interval = setInterval(fetchServers, 10000) return () => clearInterval(interval) } }, [token, userLoading]) const roleLabels = { user: 'Zuschauer', moderator: 'Moderator', superadmin: 'Admin' } if (userLoading) { return (
Laden...
) } const onlineCount = servers.filter(s => s.running).length document.title = 'Dashboard | Zeasy GSM' const totalPlayers = servers.reduce((sum, s) => sum + (s.players?.online || 0), 0) return (
{/* Header */}
LogoLogo Gameserver Management
{onlineCount}/{servers.length} online | {totalPlayers} Spieler
{isAuthenticated ? ( <> {/* Desktop Navigation */}
{isGuest ? ( <> Gast ) : ( <> {user?.avatar && user?.discordId && ( Avatar )}
{user?.username}
{roleLabels[role]}
{isSuperadmin && ( <> )} )}
{/* Mobile Burger Button */}
) : ( )}
{/* Mobile Dropdown Menu */} {mobileMenuOpen && isAuthenticated && (
{!isGuest && user?.avatar && user?.discordId && ( Avatar )}
{isGuest ? 'Gast' : user?.username}
{!isGuest &&
{roleLabels[role]}
}
{onlineCount}/{servers.length} online
{totalPlayers} Spieler
{isGuest ? ( ) : ( <> {isSuperadmin && ( <> )} )}
)}
{/* Main Content */}
{error && (
{error}
)} {loading ? (
Lade Server...
) : (
{servers.map((server, index) => (
navigate('/server/' + server.id)} isAuthenticated={isAuthenticated} isGuest={isGuest} displaySettings={displaySettings[server.id]} isModerator={isModerator} token={token} onServerAction={fetchServers} />
))}
)} {/* Discord Bot Invite Section */}

Discord Bot

Willst du Server-Status Updates auch auf deinem Discord?

Bot einladen
{/* Modals */} {showUserMgmt && ( setShowUserMgmt(false)} /> )} {showActivityLog && ( setShowActivityLog(false)} /> )} {showLogin && ( setShowLogin(false)} /> )}
) }