"use client"; import { Item, ItemContent, ItemDescription, ItemHeader, ItemMedia, ItemTitle, } from "@/components/ui/item"; import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext"; import { ShieldIcon, UsersIcon } from "lucide-react"; interface FactionCardProps { faction: { id: number; name: string; type: "majorFaction" | "minorFaction" | "corporation" | "special"; description?: { root: { type: string; children: { type: any; version: number; [k: string]: unknown; }[]; direction: ("ltr" | "rtl") | null; format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; indent: number; version: number; }; [k: string]: unknown; } | null; playableFaction?: boolean | null; startingFaction?: boolean | null; associatedCampaigns?: (number | { id: number; name: string })[] | null; }; } const typeColors: Record = { majorFaction: "bg-blue-500/20 text-blue-400", minorFaction: "bg-muted text-muted-foreground", corporation: "bg-amber-500/20 text-amber-400", special: "bg-purple-500/20 text-purple-400", }; const typeLabels: Record = { majorFaction: "Major Faction", minorFaction: "Minor Faction", corporation: "Corporation", special: "Special", }; export function FactionCard({ faction }: FactionCardProps) { const description = faction.description ? convertLexicalToPlaintext({ data: faction.description }) : null; const truncatedDescription = description && description.length > 150 ? description.slice(0, 150) + "…" : description; const campaignCount = faction.associatedCampaigns?.length ?? 0; return (
{faction.name}
{typeLabels[faction.type] ?? faction.type}
{truncatedDescription && (

{truncatedDescription}

)}
{faction.playableFaction && ( Playable )} {faction.startingFaction && ( Starting )} {campaignCount > 0 && ( {campaignCount} campaign{campaignCount !== 1 ? "s" : ""} )}
{truncatedDescription ?? "No description provided."}
); }