import type { PlayerCharacter, PlayerCharacterId } from "@initiative/domain"; import { Pencil, Plus, Trash2, X } from "lucide-react"; import { useEffect } from "react"; import { PLAYER_COLOR_HEX, PLAYER_ICON_MAP } from "./player-icon-map"; import { Button } from "./ui/button"; import { ConfirmButton } from "./ui/confirm-button"; interface PlayerManagementProps { open: boolean; onClose: () => void; characters: readonly PlayerCharacter[]; onEdit: (pc: PlayerCharacter) => void; onDelete: (id: PlayerCharacterId) => void; onCreate: () => void; } export function PlayerManagement({ open, onClose, characters, onEdit, onDelete, onCreate, }: PlayerManagementProps) { useEffect(() => { if (!open) return; function handleKeyDown(e: KeyboardEvent) { if (e.key === "Escape") onClose(); } document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [open, onClose]); if (!open) return null; return ( // biome-ignore lint/a11y/noStaticElementInteractions: backdrop click to close
{/* biome-ignore lint/a11y/noStaticElementInteractions: prevent close when clicking modal content */}
e.stopPropagation()} >

Player Characters

{characters.length === 0 ? (

No player characters yet

) : (
{characters.map((pc) => { const Icon = pc.icon ? PLAYER_ICON_MAP[pc.icon] : undefined; const color = pc.color ? PLAYER_COLOR_HEX[pc.color] : undefined; return (
{Icon && ( )} {pc.name} AC {pc.ac} HP {pc.maxHp} } label="Delete player character" onConfirm={() => onDelete(pc.id)} size="icon-sm" className="text-muted-foreground" />
); })}
)}
); }