'use client' import React, { useMemo, useState } from 'react' import { ClipboardDocumentIcon } from '@heroicons/react/24/outline' import { createReferralLink } from '../hooks/generateReferralLink' import { useToast } from '../../components/toast/toastComponent' import { useTranslation } from '../../i18n/useTranslation' interface Props { onCreated?: () => void | Promise } export default function GenerateReferralLinkWidget({ onCreated }: Props) { const { t } = useTranslation() const { showToast } = useToast() // Defaults: Unlimited + Never expires const [maxUses, setMaxUses] = useState('-1') const [expiresInDays, setExpiresInDays] = useState('-1') // Track which select is locking the other: 'max' | 'exp' | null const [lockedBy, setLockedBy] = useState<'max' | 'exp' | null>('max') const [generatedLink, setGeneratedLink] = useState('') const [isCopying, setIsCopying] = useState(false) const [isGenerating, setIsGenerating] = useState(false) const expiryOptions = useMemo( () => [ { value: '1', label: t('referralManagement.expiry1Day') }, { value: '2', label: t('referralManagement.expiry2Days') }, { value: '3', label: t('referralManagement.expiry3Days') }, { value: '4', label: t('referralManagement.expiry4Days') }, { value: '5', label: t('referralManagement.expiry5Days') }, { value: '6', label: t('referralManagement.expiry6Days') }, { value: '7', label: t('referralManagement.expiry7Days') }, { value: '-1', label: t('referralManagement.expiryNever') }, ], [t] ) const maxUsesOptions = useMemo( () => [ { value: '1', label: t('referralManagement.maxUses1') }, { value: '5', label: t('referralManagement.maxUses5') }, { value: '10', label: t('referralManagement.maxUses10') }, { value: '50', label: t('referralManagement.maxUses50') }, { value: '-1', label: t('referralManagement.maxUsesUnlimited') }, ], [t] ) // Handlers that enforce coupling const onChangeMaxUses = (val: string) => { setMaxUses(val) if (val === '-1') { // Unlimited -> force never expires, lock expires setExpiresInDays('-1') setLockedBy('max') } else { // Unlock if this was the locker if (lockedBy === 'max') setLockedBy(null) } } const onChangeExpires = (val: string) => { setExpiresInDays(val) if (val === '-1') { // Never expires -> force unlimited, lock max uses setMaxUses('-1') setLockedBy('exp') } else { // Unlock if this was the locker if (lockedBy === 'exp') setLockedBy(null) } } const onGenerate = async () => { setIsGenerating(true) setGeneratedLink('') try { const payload = { expiresInDays: parseInt(expiresInDays, 10), maxUses: parseInt(maxUses, 10), } const res = await createReferralLink(payload) console.log('✅ Referral create result:', res) const body: any = res.body const url = body?.data?.url || body?.data?.link || body?.url || body?.link || (body?.data?.code ? `${window.location.origin}/signup?ref=${body.data.code}` : '') || (body?.code ? `${window.location.origin}/signup?ref=${body.code}` : '') if (url) setGeneratedLink(url) if (res.ok) { showToast({ variant: 'success', title: t('referralManagement.createLink'), message: t('referralManagement.createSuccess'), }) } else { showToast({ variant: 'error', title: t('referralManagement.createLink'), message: body?.message || body?.error || t('referralManagement.createError'), }) } if (res.ok && onCreated) await onCreated() } catch { showToast({ variant: 'error', title: t('referralManagement.createLink'), message: t('referralManagement.createError'), }) } finally { setIsGenerating(false) } } const onCopy = async () => { if (!generatedLink) return try { setIsCopying(true) await navigator.clipboard.writeText(generatedLink) showToast({ variant: 'success', title: t('referralManagement.copyLink'), message: t('referralManagement.copiedMessage'), }) setTimeout(() => setIsCopying(false), 800) } catch { showToast({ variant: 'error', title: t('referralManagement.copyFailed'), message: t('referralManagement.copyFailedMessage'), }) setIsCopying(false) } } const disableExpires = lockedBy === 'max' const disableMaxUses = lockedBy === 'exp' return (

{t('referralManagement.generateTitle')}

{disableMaxUses &&

{t('referralManagement.lockedByNeverExpires')}

}
{disableExpires &&

{t('referralManagement.lockedByUnlimited')}

}
{generatedLink && (
{generatedLink}
)}
) }