import { useEffect, useMemo, useState } from 'react'; import { Routes, Route, NavLink, Navigate } from 'react-router-dom'; import { apiGet } from './api.js'; import Devlogs from './pages/Devlogs.jsx'; import Changelog from './pages/Changelog.jsx'; import Roadmap from './pages/Roadmap.jsx'; import Galerie from './pages/Galerie.jsx'; import Level from './pages/Level.jsx'; import Events from './pages/Events.jsx'; import Commits from './pages/Commits.jsx'; import Settings from './pages/Settings.jsx'; import Profil from './pages/Profil.jsx'; function DiscordMark() { return ( ); } /* Aufsteigende Neon-Partikel wie auf der Platform-Seite */ function Particles() { const particles = useMemo( () => Array.from({ length: 24 }, (_, i) => ({ id: i, left: `${Math.random() * 100}%`, dur: `${6 + Math.random() * 8}s`, delay: `${Math.random() * 8}s`, })), [] ); return ( ); } export default function App() { // Login-Status einmal beim Laden holen const [me, setMe] = useState({ user: null, admin: false, scopes: [], loading: true }); const [scrolled, setScrolled] = useState(false); // Member-Gate: OAuth war okay, aber User ist nicht auf dem Discord (?gate=1) const [gated, setGated] = useState(() => new URLSearchParams(window.location.search).has('gate')); const [invite, setInvite] = useState(null); useEffect(() => { apiGet('/api/me') .then((data) => setMe({ scopes: [], ...data, loading: false })) .catch(() => setMe({ user: null, admin: false, scopes: [], loading: false })); }, []); useEffect(() => { if (gated) apiGet('/api/invite').then((d) => setInvite(d.invite)).catch(() => {}); }, [gated]); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 24); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); return (
D4RKST3R
{me.loading ? null : me.user ? (
{me.user.avatar && } {me.user.username}
) : ( Login )}
{gated && (
🚪 Der Login ist Mitgliedern des Discord-Servers vorbehalten — tritt erst dem Server bei und logg dich dann nochmal ein. {invite && ( Zum Discord )}
)} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } />
); }