"use client"; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Input from '@/components/ui/Input'; import Button from '@/components/ui/Button'; import { CheckCircleIcon } from '@heroicons/react/24/solid'; interface FormField { name: string; label: string; type: string; required: boolean; order: number; } interface SignupTemplate { id: string; name: string; description: string; slug: string; form_fields: FormField[]; enabled_modules: string[]; redirect_url?: string; success_message?: string; custom_logo_url?: string; custom_primary_color?: string; } export default function CustomSignupPage({ params }: { params: Promise<{ slug: string }> }) { const router = useRouter(); const [template, setTemplate] = useState(null); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [success, setSuccess] = useState(false); const [error, setError] = useState(''); const [formData, setFormData] = useState>({}); const [slug, setSlug] = useState(''); useEffect(() => { params.then(p => { setSlug(p.slug); }); }, [params]); useEffect(() => { if (slug) { loadTemplate(); } }, [slug]); const loadTemplate = async () => { try { const response = await fetch(`/api/signup-templates/slug/${slug}`); if (response.ok) { const data = await response.json(); setTemplate(data); // Inicializar formData com campos vazios const initialData: Record = {}; data.form_fields.forEach((field: FormField) => { initialData[field.name] = ''; }); setFormData(initialData); } else { setError('Template de cadastro não encontrado'); } } catch (err) { setError('Erro ao carregar formulário de cadastro'); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitting(true); setError(''); try { // Registro público via template const payload = { template_slug: slug, email: formData.email, password: formData.password, name: formData.company_name || formData.subdomain || 'Cliente', subdomain: formData.subdomain, company_name: formData.company_name, ...formData, // Incluir todos os campos adicionais }; const response = await fetch('/api/signup/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); if (response.ok) { setSuccess(true); // Redirecionar após 2 segundos setTimeout(() => { if (template?.redirect_url) { window.location.href = template.redirect_url; } else { router.push('/login'); } }, 2000); } else { const data = await response.json(); setError(data.error || 'Erro ao realizar cadastro'); } } catch (err) { setError('Erro ao processar cadastro'); } finally { setSubmitting(false); } }; const handleInputChange = (fieldName: string, value: string) => { setFormData(prev => ({ ...prev, [fieldName]: value, })); }; if (loading) { return (
); } if (error && !template) { return (
⚠️

Link Inválido

{error}

); } if (success) { return (

Cadastro Realizado!

{template?.success_message || 'Seu cadastro foi realizado com sucesso. Redirecionando...'}

); } const sortedFields = [...(template?.form_fields || [])].sort((a, b) => a.order - b.order); return (
{/* Logo personalizado */} {template?.custom_logo_url && (
Logo
)} {/* Cabeçalho */}

{template?.name}

{template?.description && (

{template.description}

)}
{/* Módulos incluídos */} {template && template.enabled_modules.length > 0 && (

Módulos incluídos:

{template.enabled_modules.map((module) => ( {module} ))}
)} {/* Formulário */}
{sortedFields.map((field) => ( handleInputChange(field.name, e.target.value)} required={field.required} placeholder={`Digite ${field.label.toLowerCase()}`} /> ))} {error && (

{error}

)}
{/* Link para login */}

Já tem uma conta?{' '} Fazer login

); }