import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useAuth } from '@/lib/auth'; import { api } from '@/lib/api'; import { useToast } from '@/hooks/useToast'; import { Phone, RefreshCw, Plus, X, ArrowLeft, Info } from 'lucide-react'; export default function WhatsAppNumbers() { const { t } = useTranslation(); const { token } = useAuth(); const toast = useToast(); const [numbers, setNumbers] = useState([]); const [loading, setLoading] = useState(true); const [showRegister, setShowRegister] = useState(false); const [regStep, setRegStep] = useState<1 | 2>(1); const [regOrgId, setRegOrgId] = useState(''); const [regPhoneNumberId, setRegPhoneNumberId] = useState(''); const [regPin, setRegPin] = useState(''); const [regCode, setRegCode] = useState(''); const [regLoading, setRegLoading] = useState(false); const [regError, setRegError] = useState(''); const [orgOptions, setOrgOptions] = useState<{ id: string; name: string }[]>([]); async function load() { if (!token) return; setLoading(true); try { const data = await api.get('/v1/super-admin/whatsapp/numbers', token); setNumbers(data.data ?? []); } catch { toast.error(t('super_admin.err_load_numbers')); } finally { setLoading(false); } } useEffect(() => { load(); }, [token]); async function loadOrgs() { if (!token) return; try { const data = await api.get('/v1/super-admin/organizations?limit=100', token); setOrgOptions(data.data ?? []); } catch { /* ignore */ } } function openModal() { setRegStep(1); setRegOrgId(''); setRegPhoneNumberId(''); setRegPin(''); setRegCode(''); setRegError(''); setRegLoading(false); setShowRegister(true); loadOrgs(); } function closeModal() { setShowRegister(false); setRegStep(1); setRegOrgId(''); setRegPhoneNumberId(''); setRegPin(''); setRegCode(''); setRegError(''); setRegLoading(false); } async function handleRegister() { setRegError(''); if (!regOrgId) { setRegError(t('super_admin.wa_select_org_error')); return; } if (!regPhoneNumberId || !/^\d{12,18}$/.test(regPhoneNumberId)) { setRegError(t('super_admin.wa_phone_id_error')); return; } const pin = regPin.trim() === '' ? '000000' : regPin.trim(); if (!/^\d{6}$/.test(pin)) { setRegError(t('super_admin.wa_pin_error')); return; } setRegLoading(true); try { const res = await api.post('/v1/super-admin/whatsapp/numbers/register', { orgId: regOrgId, phoneNumberId: regPhoneNumberId, pin, }, token); if (res.ok) { setRegStep(2); } else { setRegError(res.metaResponse?.detail || res.metaResponse?.message || t('super_admin.wa_reg_error')); } } catch (e: any) { setRegError(e?.message || t('super_admin.wa_net_error')); } finally { setRegLoading(false); } } async function handleVerify() { setRegError(''); if (!regCode || !/^\d{4,8}$/.test(regCode)) { setRegError(t('super_admin.wa_otp_error')); return; } setRegLoading(true); try { const res = await api.post('/v1/super-admin/whatsapp/numbers/verify', { orgId: regOrgId, phoneNumberId: regPhoneNumberId, code: regCode, }, token); if (res.ok) { toast.success(t('super_admin.wa_number_registered')); closeModal(); load(); } else { setRegError(res.metaResponse?.detail || res.metaResponse?.message || t('super_admin.wa_otp_invalid')); } } catch (e: any) { setRegError(e?.message || t('super_admin.wa_net_error')); } finally { setRegLoading(false); } } const selectedOrg = orgOptions.find(o => o.id === regOrgId); return (

{t('super_admin.wa_numbers_title')}

{t('super_admin.wa_numbers_total', { count: numbers.length })}

{loading ? (
{t('super_admin.org_loading')}
) : numbers.length === 0 ? (

{t('super_admin.wa_no_numbers')}

) : (
{numbers.map(n => ( ))}
{t('super_admin.col_number')} {t('super_admin.col_org')} {t('super_admin.col_id')} {t('super_admin.col_added_at')}
{n.displayPhone} {n.organization?.name || '—'} {n.id} {new Date(n.createdAt).toLocaleDateString()}
)}
{showRegister && (

{t('super_admin.wa_register_title')}

{t('super_admin.wa_step', { step: regStep })}

{regStep === 1 && (
setRegPhoneNumberId(e.target.value.replace(/\D/g, ''))} placeholder="123456789012345" maxLength={18} className="w-full bg-slate-800 border border-slate-700 text-white text-sm rounded-lg px-3 py-2 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent font-mono" />

{t('super_admin.phone_id_hint')}

setRegPin(e.target.value.replace(/\D/g, ''))} placeholder="000000" maxLength={6} className="w-full bg-slate-800 border border-slate-700 text-white text-sm rounded-lg px-3 py-2 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent font-mono tracking-widest" />

{t('super_admin.pin_hint')}

{regError && (

{regError}

)}
)} {regStep === 2 && (

{t('super_admin.label_org')} : {selectedOrg?.name || regOrgId}

{t('super_admin.label_phone_number_id')} : {regPhoneNumberId}

{t('super_admin.wa_otp_hint')}

setRegCode(e.target.value.replace(/\D/g, ''))} placeholder="123456" maxLength={8} className="w-full bg-slate-800 border border-slate-700 text-white text-sm rounded-lg px-3 py-2 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent font-mono tracking-widest text-center text-lg" autoFocus />
{regError && (

{regError}

)}
)}
)}
); }