Files
Cs2-Mapveto/client/src/App.jsx
T
mregosar f7520a6ca7 Frontend, README und Konfigurationsvorlage
React-Oberfläche mit Übersicht, Match-Erstellung, Beitritt über Team- und
Zuschauercodes, Teamkarten, visuellem Map-Veto, Serie und Serverpanel.
README beschreibt Einrichtung, Umgebungsvariablen, Rollen, Veto-Abläufe,
Serveradapter und CSTV-Zuschauerzugang.
2026-10-25 17:02:18 +01:00

51 lines
2.0 KiB
React
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useEffect, useState } from 'react';
import { Link, Route, Routes } from 'react-router-dom';
import { api } from './lib/api.js';
import Overview from './pages/Overview.jsx';
import CreateMatch from './pages/CreateMatch.jsx';
import MatchPage from './pages/MatchPage.jsx';
import { JoinPage, WatchPage } from './pages/AccessPages.jsx';
export default function App() {
const [config, setConfig] = useState(null);
const [configError, setConfigError] = useState(null);
useEffect(() => {
api('/config').then(setConfig).catch((e) => setConfigError(e.message));
}, []);
return (
<div className="app">
<header className="topbar">
<Link to="/" className="brand" aria-label="Zur Übersicht">
<svg viewBox="0 0 32 32" width="26" height="26" aria-hidden="true">
<path d="M4 4h24l-4 24H8z" fill="var(--ct)" />
<path d="M10 10l12 12M22 10L10 22" stroke="var(--bg)" strokeWidth="3" />
</svg>
<span>CS2 Mapveto</span>
</Link>
{config?.server.simulated && (
<span className="demo-flag" title="SERVER_ADAPTER=demo – es werden keine echten CS2-Server gestartet">
Demo-Modus: keine echten Server
</span>
)}
<nav>
<Link to="/" className="nav-link">Übersicht</Link>
<Link to="/neu" className="btn btn-primary btn-sm">Match erstellen</Link>
</nav>
</header>
<main className="content">
{configError && <div className="alert alert-error">Backend nicht erreichbar: {configError}</div>}
<Routes>
<Route path="/" element={<Overview />} />
<Route path="/neu" element={<CreateMatch config={config} />} />
<Route path="/m/:id" element={<MatchPage />} />
<Route path="/join/:code" element={<JoinPage config={config} />} />
<Route path="/watch/:code" element={<WatchPage />} />
<Route path="*" element={<div className="empty"><h2>Seite nicht gefunden</h2><Link to="/">Zur Übersicht</Link></div>} />
</Routes>
</main>
</div>
);
}