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 Commits from './pages/Commits.jsx'; import Settings from './pages/Settings.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, loading: true }); const [scrolled, setScrolled] = useState(false); useEffect(() => { apiGet('/api/me') .then((data) => setMe({ ...data, loading: false })) .catch(() => setMe({ user: null, admin: false, loading: false })); }, []); 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 )}
} /> } /> } /> } /> } /> } /> } /> } />
); }