import { useEffect, useState } from "react"; import { Link, useParams, useSearchParams } from "react-router-dom"; import { Character, getCharacter } from "../api/characters"; const ABILITY_NAMES: Record = { STR: "Stärke", DEX: "Geschicklichkeit", CON: "Konstitution", INT: "Intelligenz", WIS: "Weisheit", CHA: "Charisma", }; const ABILITY_ORDER = ["STR", "DEX", "CON", "INT", "WIS", "CHA"]; function orderedStats(stats: Record): [string, number][] { const known = ABILITY_ORDER.filter((key) => key in stats).map( (key) => [key, stats[key]] as [string, number], ); const unknown = Object.entries(stats).filter(([key]) => !ABILITY_ORDER.includes(key)); return [...known, ...unknown]; } function modifier(score: number): string { const mod = Math.floor((score - 10) / 2); return mod >= 0 ? `+${mod}` : `${mod}`; } export default function CharacterDetail() { const { characterId } = useParams<{ characterId: string }>(); const [searchParams] = useSearchParams(); const backGameId = searchParams.get("back"); const [character, setCharacter] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!characterId) return; getCharacter(characterId) .then(setCharacter) .finally(() => setLoading(false)); }, [characterId]); if (loading) return

Lädt…

; if (!character) return

Charakter nicht gefunden.

; return (
{backGameId && ( ← Zurück zum Spiel )}

{character.name}

{character.race ?? "?"} · {character.char_class ?? "?"} · Stufe {character.level}

{Object.keys(character.stats).length > 0 && (

Attribute

{orderedStats(character.stats).map(([key, value]) => (
{ABILITY_NAMES[key] ?? key}
{value}
{modifier(value)}
))}
)} {Object.keys(character.combat_stats).length > 0 && (

Kampfwerte

{Object.entries(character.combat_stats).map(([key, value]) => (
{key}
{value}
))}
)} {character.abilities.length > 0 && (

Fähigkeiten & Merkmale

{character.abilities.map((ability, i) => (

{ability.name}

{ability.description}

))}
)} {character.equipment.length > 0 && (

Ausrüstung

    {character.equipment.map((item, i) => (
  • {item}
  • ))}
)}

Hintergrundgeschichte

{character.description || "Noch keine Beschreibung."}
); }