'use client' import { useState } from 'react' import { useTranslations } from 'next-intl' import { useRouter } from '@/i18n/navigation' import type { RecruitRewardView } from '@/lib/recruit-claim' export function RecruitClaim({ rewards, characters, level80Count, }: { rewards: RecruitRewardView[] characters: string[] level80Count: number }) { const t = useTranslations('RecruitClaim') const router = useRouter() const [character, setCharacter] = useState(characters[0] ?? '') const [busyId, setBusyId] = useState(null) const [msg, setMsg] = useState<{ ok: boolean; text: string } | null>(null) 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() setMsg({ ok: Boolean(d.success), text: t(d.message ?? 'deliveryError', { reward: reward.reward_name, character }) }) if (d.success) router.refresh() } catch { setMsg({ ok: false, text: t('deliveryError') }) } finally { setBusyId(null) } } return (

{t('level80Friends')}: {level80Count}

{characters.length > 0 ? (

{t('deliverTo')}

) : (

{t('noCharacters')}

)}
{msg && {msg.text}}
{rewards.length === 0 ? (

{t('noRewards')}

) : (
{rewards.map((r) => { const eligible = level80Count >= r.required_friends return (
{r.reward_name}

{t('requires', { n: r.required_friends })} · item {r.item_id} ×{r.item_quantity}


{r.claimed ? ( {t('claimed')} ) : ( )}
) })}
)}
) }