'use client' import { useState } from 'react' import type { RecruitRewardView } from '@/lib/recruit-claim' const ICON_BASE = 'https://wotlk.ultimowow.com/static/images/wow/icons/tiny' function claimError(message?: string): string { switch (message) { case 'requirementsNotMet': return 'Aún no cumples los requisitos para esta recompensa.' case 'alreadyClaimed': return 'Esta recompensa ya fue reclamada.' case 'invalidCharacter': return 'Personaje no válido.' case 'notFound': return 'Recompensa no encontrada.' default: return 'No se pudo reclamar la recompensa. Inténtalo de nuevo.' } } /** * Panel de Recluta a un amigo: estadísticas de la cuenta + tabla de recompensas * (objetivo, objeto y estado) con botón para reclamar las disponibles. */ export function RecruitPanel({ rewards, characters, level80Count, isRecruited, recruitedCount, }: { rewards: RecruitRewardView[] characters: string[] level80Count: number isRecruited: boolean recruitedCount: number }) { const [character, setCharacter] = useState(characters[0] ?? '') const [busyId, setBusyId] = useState(null) const [msg, setMsg] = useState<{ ok: boolean; text: string } | null>(null) const claimedCount = rewards.filter((r) => r.claimed).length const available = rewards.filter((r) => !r.claimed && level80Count >= r.required_friends) async function claim(reward: RecruitRewardView) { if (busyId !== null || !character) return setBusyId(reward.id) setMsg(null) try { const res = await fetch('/api/recruit/claim', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin', body: JSON.stringify({ rewardId: reward.id, character }), }) const d: { success?: boolean; message?: string } = await res.json() if (d.success) { window.location.reload() return } setMsg({ ok: false, text: claimError(d.message) }) setBusyId(null) } catch { setMsg({ ok: false, text: claimError() }) setBusyId(null) } } function rewardCell(r: RecruitRewardView) { const [quality, icon] = (r.icon_class || '').split(' ') return ( <> {r.reward_name} {r.item_quantity > 1 ? ` x${r.item_quantity}` : ''} ) } return ( <>

Cuenta reclutada: {isRecruited ? 'Sí' : 'No'}

Amigos reclutados: {recruitedCount}

Amigos reclutados al nivel 80: {level80Count}

Recompensas reclamadas: {claimedCount}/{rewards.length}


{characters.length > 0 && (

Recibir recompensas en:{' '}

)} {msg &&

{msg.text}

} {rewards.map((r) => { const eligible = level80Count >= r.required_friends return ( ) })}
Amigos reclutados Recompensa Estado
{r.required_friends} {r.required_friends === 1 ? 'amigo' : 'amigos'} al nivel 80 {rewardCell(r)} {r.claimed ? ( Reclamado ) : eligible ? ( ) : ( Sin reclamar )}


RECOMPENSAS DISPONIBLES


{available.length === 0 ? ( Recluta amigos para poder reclamar las recompensas ) : ( Tienes {available.length} recompensa{available.length === 1 ? '' : 's'} lista{available.length === 1 ? '' : 's'} para reclamar )} ) }