"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import type { Asset, Loadout } from "@/payload-types"; import { Button } from "@/components/ui/button"; import { Combobox } from "@/components/ui/combobox"; import { Item, ItemContent, ItemHeader, ItemTitle } from "@/components/ui/item"; import { Wardrobe } from "./Wardrobe"; import { WardrobeSlotPicker } from "./WardrobeSlotPicker"; import { getAssetTypeLabel, getLoadoutSlot, getWardrobeSlot, type LoadoutSlots, type LockerGridItem, WARDROBE_SLOT_LAYOUT, } from "@/lib/locker"; import { equipLoadout, setLoadoutSlot } from "@/app/(frontend)/locker/actions"; import { getAssetIcon } from "./LockerGrid"; interface WardrobePanelProps { userName: string; loadouts: Loadout[]; equippedLoadout: Loadout | null; items: LockerGridItem[]; } function resolveSlotAsset( value: LoadoutSlots[keyof LoadoutSlots], items: LockerGridItem[], ): Asset | null { if (value == null) return null; if (typeof value === "object" && "id" in value) return value as Asset; const id = value as number; return items.find((i) => i.assetId === id)?.asset ?? null; } function resolveSlotDisplayName(asset: Asset, items: LockerGridItem[]): string { const custom = items.find((i) => i.assetId === asset.id)?.equipment?.customName?.trim(); return custom || asset.name; } export function WardrobePanel({ userName, loadouts, equippedLoadout, items }: WardrobePanelProps) { const router = useRouter(); const [pickerSlot, setPickerSlot] = useState(null); const [busy, setBusy] = useState(false); const slots = (equippedLoadout?.slots ?? {}) as LoadoutSlots; async function handleEquip(loadoutId: number) { setBusy(true); const res = await equipLoadout(loadoutId); setBusy(false); if (res.success) router.refresh(); } async function handlePick(slotName: string, assetId: number | null) { if (!equippedLoadout) return { success: false, error: "No loadout equipped." }; setBusy(true); const res = await setLoadoutSlot(equippedLoadout.id, slotName, assetId); setBusy(false); if (res.success) { setPickerSlot(null); router.refresh(); } return res; } const pickerLayout = pickerSlot ? getWardrobeSlot(pickerSlot) : null; const pickerConfig = pickerSlot ? getLoadoutSlot(pickerSlot) : null; const pickerValue = pickerSlot ? (slots[pickerSlot as keyof LoadoutSlots] ?? null) : null; const filled = equippedLoadout ? WARDROBE_SLOT_LAYOUT.filter((layout) => slots[layout.name] != null) : []; return (
Character setPickerSlot(name)} />

{equippedLoadout ? "Select a slot block to equip gear from your locker." : "Equip a loadout to start dressing your character."}

Equipped Loadout {loadouts.length === 0 ? (

You have no loadouts yet. Head to the Loadouts tab to create one, then come back here to equip it.

) : (
handleEquip(Number(v))} disabled={busy} placeholder={ equippedLoadout ? equippedLoadout.name : "Select a loadout to equip" } searchPlaceholder="Search loadouts..." options={loadouts.map((l) => ({ value: String(l.id), label: l.name, }))} /> {equippedLoadout && ( )}
{!equippedLoadout && (

Choose a loadout above. It becomes the active loadout that the wardrobe reflects.

)}
)}
Current Equipment {filled.length === 0 ? (

Nothing equipped. Select a loadout above and click its equipment slots.

) : (
{filled.map((layout) => { const asset = resolveSlotAsset(slots[layout.name], items); if (!asset) return null; return ( ); })}
)}

{userName}, you have {items.length.toLocaleString()} distinct items in your locker.

{pickerLayout && pickerConfig && ( { if (!open) setPickerSlot(null); }} slot={pickerConfig} items={items} currentValue={pickerValue} busy={busy} onPick={(assetId) => handlePick(pickerLayout.name, assetId)} /> )}
); }