import { useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { api } from '../lib/api.js'; import { FORMAT_LABEL, serverLabel, timeAgo } from '../lib/labels.js'; import { getAccess } from '../lib/session.js'; import { useOverview } from '../lib/useMatch.js'; const GROUPS = [ { key: 'open', title: 'Offen', empty: 'Keine offenen Lobbys. Erstelle ein Match, um zu starten.' }, { key: 'running', title: 'Laufend', empty: 'Gerade läuft kein Match.' }, { key: 'closed', title: 'Abgeschlossen', empty: 'Noch keine abgeschlossenen Matches.' }, ]; export default function Overview() { const { matches } = useOverview(); return (

Match-Lobbys

Teams treten mit ihrem Einladungscode bei, die Captains führen das Map-Veto, der Server wird automatisch eingerichtet.

{matches === null ? (

Lade Matches …

) : (
{GROUPS.map((g) => { const list = matches.filter((m) => m.group === g.key); return (

{g.title} {list.length}

{list.length === 0 ?

{g.empty}

: (
    {list.map((m) => )}
)}
); })}
)}
); } function MatchRow({ match: m }) { const access = getAccess(m.id); const server = serverLabel(m.server); return (
  • {m.teamA} {m.seriesScore && m.format !== 'bo1' ? ( {m.seriesScore.A}:{m.seriesScore.B} ) : ( vs. )} {m.teamB}
    {m.currentMap && ( {m.currentMap.finished ? '' : Live} {m.currentMap.name} {m.currentMap.score.A}:{m.currentMap.score.B} )} {m.modeLabel} {FORMAT_LABEL[m.format]} {m.group === 'open' && {m.players.A + m.players.B}/{m.players.teamSize * 2} Spieler} {m.statusLabel} {access && Dein Zugang} {timeAgo(m.createdAt)}
  • ); } function CodeEntry() { const [code, setCode] = useState(''); const [error, setError] = useState(null); const navigate = useNavigate(); const submit = async (e) => { e.preventDefault(); setError(null); try { const res = await api('/access', { method: 'POST', body: { code } }); navigate(res.access === 'spectator' ? `/watch/${code.trim()}` : `/join/${code.trim()}`); } catch (err) { setError(err.message); } }; return (
    setCode(e.target.value)} placeholder="ABCD-EFGH" autoComplete="off" spellCheck="false" />
    {error &&

    {error}

    }
    ); }