import type { CombatLogEntry } from '../game' import type { RunBossCoinAward } from '../combat/rewardSummaries' import type { DungeonReward, LootRoll } from '../profile' type BonusItem = NonNullable export function LevelGain({ previousLevel, newLevel, talentPointsGained, }: { previousLevel: number | null newLevel: number | null talentPointsGained: number }) { if (!previousLevel || !newLevel || talentPointsGained <= 0) return null return (

Level {previousLevel} to {newLevel} +{talentPointsGained} talent point

) } export function AbilityUnlocks({ abilities, }: { abilities: DungeonReward['unlockedAbilities'] }) { return ( <> {abilities.map((ability) => (

{ability.glyph} Ability Unlocked: {ability.name}

))} ) } export function RewardXpSummary({ reward, }: { reward: { experienceGained: number previousLevel: number | null newLevel: number | null talentPointsGained: number unlockedAbilities: DungeonReward['unlockedAbilities'] } }) { return ( <>

+{reward.experienceGained} XP

) } export function BonusItemReward({ item, eyebrow, compact = false, }: { item?: BonusItem | null eyebrow?: string compact?: boolean }) { if (!item) return null if (compact) { return (

{item.glyph} {item.name} x{item.quantity} {item.duplicate ? ` (owned x${item.quantityAfter})` : ''}

) } return (
{eyebrow &&

{eyebrow}

}
{item.glyph} {item.name} Item Level {item.itemLevel} x{item.quantity} {item.duplicate && (owned x{item.quantityAfter})}
) } export function LootRollList({ rolls, expectedRolls, }: { rolls: LootRoll[] expectedRolls: number }) { return (
{rolls.map((roll) => (
{roll.encounterName} {[ ...roll.items.map((item) => `${item.glyph} ${item.name} x${item.quantity}${item.duplicate ? ` (owned x${item.quantityAfter})` : ''}`), ...(roll.petAwarded ? [`* ${roll.petAwarded.petName}${roll.petAwarded.duplicate ? ` (owned x${roll.petAwarded.quantityAfter})` : ''}`] : []), ].join(', ') || 'No components dropped'}
))} {rolls.length < expectedRolls && Finishing loot rolls...}
) } export function PvpRunLootList({ loot, emptyLabel = 'No boss coins awarded', }: { loot: RunBossCoinAward[] emptyLabel?: string }) { return (
{loot.length > 0 ? loot.map((item, index) => (
{item.sourceLabel} {item.glyph} {item.name} x{item.quantity} {item.duplicate ? ` (owned x${item.quantityAfter})` : ''}
)) : (
Boss Coins {emptyLabel}
)}
) } export function ResultLogToggle({ log, showEndLog, onToggle, }: { log: CombatLogEntry[] showEndLog: boolean onToggle: () => void }) { if (log.length === 0) return null return ( <> {showEndLog && (
{log.slice().reverse().map((entry) => (
{entry.text}
))}
)} ) } export function RematchControls({ requested, message, onRematch, }: { requested: boolean message: string onRematch: () => void }) { return ( <> {message &&

{message}

} ) }