'use client'; import { useEffect, useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { Button, Card, CardContent, CardHeader, CardTitle } from '@horux/shared-ui'; import { apiClient } from '@/lib/api/client'; import { useAuthStore } from '@/stores/auth-store'; import { CheckCircle2, Clock, AlertTriangle, Loader2 } from 'lucide-react'; import Link from 'next/link'; interface InvitationData { id: string; tenantId: string; plan: string; durationDays: number; status: string; expiresAt: string; tenant: { nombre: string; rfc: string; } | null; } export default function InvitacionTrialPage() { const params = useParams(); const router = useRouter(); const { user } = useAuthStore(); const token = typeof params.token === 'string' ? params.token : ''; const [invitation, setInvitation] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [accepting, setAccepting] = useState(false); const [accepted, setAccepted] = useState(false); useEffect(() => { if (!token) { setError('Token de invitación inválido'); setLoading(false); return; } apiClient.get(`/invitations/trial/token/${token}`) .then((res) => { setInvitation(res.data); setLoading(false); }) .catch((err: any) => { setError(err.response?.data?.message || 'Invitación no encontrada o expirada'); setLoading(false); }); }, [token]); async function handleAccept() { if (!token) return; setAccepting(true); setError(''); try { await apiClient.post(`/invitations/trial/${token}/accept`); setAccepted(true); setTimeout(() => { router.push('/configuracion/planes-despacho'); }, 2000); } catch (err: any) { setError(err.response?.data?.message || 'Error al aceptar la invitación'); } finally { setAccepting(false); } } if (loading) { return (
); } if (error && !invitation) { return (
Invitación no válida

{error}

); } if (accepted) { return (
¡Invitación aceptada!

Tu despacho ahora tiene acceso a Business Control Prueba por {invitation?.durationDays} días.

Redirigiendo a tu panel...

); } const isExpired = invitation ? new Date(invitation.expiresAt) < new Date() : false; const isPending = invitation?.status === 'pending'; const planDisplay = invitation?.plan === 'business_control' ? 'Business Control' : invitation?.plan; return (
Invitación especial

Has sido invitado a probar {planDisplay}

Despacho {invitation?.tenant?.nombre || '—'}
Plan {planDisplay}
Duración {invitation?.durationDays} días
Expira el {invitation?.expiresAt ? new Date(invitation.expiresAt).toLocaleDateString('es-MX') : '—'}

¿Qué incluye?

  • • Hasta 100 RFCs
  • • Usuarios ilimitados
  • • API de integración
  • • SAT incremental
  • • Todas las funciones de Business Control
{error && (

{error}

)} {!user ? (

Debes iniciar sesión con la cuenta del dueño del despacho para aceptar esta invitación.

) : isExpired || !isPending ? (

Esta invitación ya no está disponible ({invitation?.status}).

) : ( )}
); }