// Rahmen der Bot-Produktseite — eigene Navigation, orange Leitfarbe. // Das Dashboard ist dieselbe Config-Seite wie bisher, nur unter /dashboard. import { useEffect, useState } from 'react'; import { Routes, Route, NavLink, Navigate, useLocation } from 'react-router-dom'; import { apiGet } from './api.js'; import BotLanding from './pages/BotLanding.jsx'; import BotFeatures from './pages/BotFeatures.jsx'; import BotCommands from './pages/BotCommands.jsx'; import Settings from './pages/Settings.jsx'; import Impressum from './pages/Impressum.jsx'; import Datenschutz from './pages/Datenschutz.jsx'; import { IconMenu, IconX } from './icons.jsx'; import { useT, LangSwitch } from './i18n.jsx'; export default function BotApp() { const [me, setMe] = useState({ user: null, admin: false, scopes: [], loading: true }); const [scrolled, setScrolled] = useState(false); const [drawer, setDrawer] = useState(false); const [hub, setHub] = useState(null); const location = useLocation(); const { t } = useT(); useEffect(() => { setDrawer(false); }, [location.pathname]); useEffect(() => { apiGet('/api/me') .then((data) => setMe({ scopes: [], ...data, loading: false })) .catch(() => setMe({ user: null, admin: false, scopes: [], loading: false })); apiGet('/api/legal').then((d) => setHub(d.split ? d.hubUrl : null)).catch(() => {}); }, []); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 24); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); const canDashboard = me.admin || me.scopes?.length > 0; return (
D4RKBOT.
{me.loading ? null : me.user ? ( {me.user.avatar && } {me.user.username} ) : ( {t('nav.signIn')} )}
{drawer && ( )}
} /> } /> } /> } /> } /> } /> } />
); }