import { useEffect, type CSSProperties } from "react"; import { BOSS_CARD_RARITY_INFO } from "../game/bossCards"; import { useCombatStore } from "../game/combatStore"; import { useGameStore } from "../game/store"; import { classCanEquipItem, PLAYER_EQUIPMENT_OWNER_ID } from "../game/equipment"; import { compareEquipmentUpgrade, resolvedEquipmentLoadout, } from "../game/heirloomEquipment"; import { gearProfileFor } from "../game/specializationCatalog"; export const BOSS_LOOT_AUTO_DISMISS_MS = 10_000; export function scheduleBossLootAutoDismiss( rewardId: number, dismiss: (id: number) => void, ): () => void { const timeoutId = setTimeout(() => dismiss(rewardId), BOSS_LOOT_AUTO_DISMISS_MS); return () => clearTimeout(timeoutId); } function itemType(inventorySlot: string): string { return inventorySlot .split(/[-_]/) .filter(Boolean) .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`) .join(" "); } export function BossLootWindow() { const reward = useCombatStore((state) => state.bossLootRewards[0] ?? null); const classId = useCombatStore((state) => state.classId); const secondaryClassId = useCombatStore((state) => state.secondaryClassId); const specializationId = useCombatStore((state) => state.specializationId); const role = useCombatStore((state) => state.gearRole); const level = useCombatStore((state) => state.level); const equipment = useCombatStore((state) => state.equipment); const inventory = useCombatStore((state) => state.inventory); const visibleRewardId = reward?.id; useEffect(() => { if (visibleRewardId === undefined) return; return scheduleBossLootAutoDismiss( visibleRewardId, (rewardId) => useCombatStore.getState().dismissBossLootReward(rewardId), ); }, [visibleRewardId]); if (!reward) return null; const profile = gearProfileFor(classId, specializationId, role); const heirloomContext = { ownerId: PLAYER_EQUIPMENT_OWNER_ID, ownerKind: "player" as const, classId, secondaryClassId, specializationId, role, level, }; const loadout = resolvedEquipmentLoadout(equipment, inventory, heirloomContext); const dismiss = () => useCombatStore.getState().dismissBossLootReward(reward.id); const viewInventory = () => { dismiss(); useGameStore.getState().openOverlay("inventory"); }; return (
event.stopPropagation()} >

Boss defeated {reward.bossName}

Loot acquired automatically

{reward.cards?.rarities.map((rarity) =>

{BOSS_CARD_RARITY_INFO[rarity].label} Boss Card{reward.bossName} · Collection log

+1
)} {reward.items.map((item) => { const comparison = classCanEquipItem(classId, item, { secondaryClassId, level }) ? compareEquipmentUpgrade(item, loadout, profile, heirloomContext) : null; return

{item.name} {item.quality} · Item level {item.itemLevel} · {itemType(item.inventorySlot)} {comparison && {comparison.isUpgrade ? `Upgrade · +${comparison.scoreDelta.toFixed(1)} score` : `${comparison.scoreDelta.toFixed(1)} score`}}

{item.quantity > 1 ? ×{item.quantity} : null}
; })} {!reward.items.length && !reward.cards?.rarities.length ? (

No items dropped this time.

) : null}
); }