import { Link } from 'react-router-dom'; import { ApiError, api } from '../lib/api'; import { REASON_LABEL, rueckkehrArt } from '../lib/format'; import type { Character, CharacterMember } from '../lib/types'; /** * Wer einen CC nutzt. Bei einem Gruppen-CC kann ein Einzelner ausfallen, * ohne die übrigen zu berühren - dann steht er hier, bis er zurückkehrt. */ export default function MemberList({ character, currentPlayerId, canEdit, onChanged, onError, }: { character: Character; currentPlayerId: number; canEdit: boolean; onChanged: () => void; onError: (message: string) => void; }) { const alle = character.members ?? []; const aktiv = alle.filter((m) => !m.leftAt); // Wer ausgefallen ist, kann zurückkehren - wer gegangen ist, nicht. const ruhend = alle.filter((m) => m.leftAt && m.inactiveReason); const ehemalig = alle.filter((m) => m.leftAt && !m.inactiveReason); if (aktiv.length <= 1 && ruhend.length === 0 && ehemalig.length === 0) return null; const austragen = async (playerId: number, name: string) => { if (!window.confirm(`"${name}" aus "${character.name}" austragen?`)) return; try { await api(`/api/characters/${character.id}/members/${playerId}`, { method: 'DELETE' }); onChanged(); } catch (err) { onError(err instanceof ApiError ? err.message : 'Austragen fehlgeschlagen'); } }; const zurueckholen = async (mitglied: CharacterMember) => { const art = rueckkehrArt(mitglied.inactiveReason); const name = mitglied.player.displayName; let reason: string | undefined; if (art === 'admin') { const eingabe = window.prompt( `"${name}" ist im Rollenspiel gestorben. Womit kehrt er zurück?`, ); if (!eingabe?.trim()) return; reason = eingabe.trim(); } let useKind: string | undefined; if (art === 'bezahlt') { const kulanz = window.confirm( `Die Rückkehr von "${name}" kostet ein Guthaben.\n\nOK = Kulanz-Redesign, Abbrechen = bezahltes Redesign.`, ); useKind = kulanz ? 'REDESIGN_KULANZ' : 'REDESIGN_PAID'; } try { await api(`/api/characters/${character.id}/members/${mitglied.playerId}/reactivate`, { method: 'POST', body: { ...(useKind ? { useKind } : {}), ...(reason ? { reason } : {}) }, }); onChanged(); } catch (err) { onError(err instanceof ApiError ? err.message : 'Rückkehr fehlgeschlagen'); } }; return (
{aktiv.map((mitglied) => ( {mitglied.playerId === currentPlayerId ? ( {mitglied.player.displayName} ) : ( {mitglied.player.displayName} )} {canEdit && aktiv.length > 1 && ( )} ))} {ruhend.map((mitglied) => ( {mitglied.player.displayName} {mitglied.inactiveReason ? REASON_LABEL[mitglied.inactiveReason] : 'Inaktiv'} {canEdit && ( )} ))} {ehemalig.length > 0 && ( früher:{' '} {ehemalig .map((m) => m.successor ? `${m.player.displayName} (jetzt ${m.successor.name})` : m.player.displayName, ) .join(', ')} )}
); }