"use client"; import { useState, useEffect } from 'react'; import { PlusIcon, LinkIcon, PencilSquareIcon, TrashIcon, ClipboardDocumentIcon } from '@heroicons/react/24/outline'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; import Dialog from '@/components/ui/Dialog'; 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; is_active: boolean; usage_count: number; created_at: string; } const AVAILABLE_FIELDS = [ { name: 'email', label: 'E-mail', type: 'email', required: true }, { name: 'password', label: 'Senha', type: 'password', required: true }, { name: 'subdomain', label: 'Subdomínio', type: 'text', required: true }, { name: 'company_name', label: 'Nome da Empresa', type: 'text', required: false }, { name: 'cnpj', label: 'CNPJ', type: 'text', required: false }, { name: 'phone', label: 'Telefone', type: 'tel', required: false }, { name: 'address', label: 'Endereço', type: 'text', required: false }, { name: 'city', label: 'Cidade', type: 'text', required: false }, { name: 'state', label: 'Estado', type: 'text', required: false }, { name: 'zipcode', label: 'CEP', type: 'text', required: false }, ]; const AVAILABLE_MODULES = [ 'CRM', 'ERP', 'PROJECTS', 'FINANCIAL', 'INVENTORY', 'HR', ]; export default function SignupTemplatesPage() { const [templates, setTemplates] = useState([]); const [loading, setLoading] = useState(true); const [showDialog, setShowDialog] = useState(false); const [editingTemplate, setEditingTemplate] = useState(null); // Form state const [formData, setFormData] = useState({ name: '', description: '', slug: '', redirect_url: '', success_message: '', }); const [selectedFields, setSelectedFields] = useState([]); const [selectedModules, setSelectedModules] = useState([]); useEffect(() => { loadTemplates(); }, []); const loadTemplates = async () => { try { const token = localStorage.getItem('token'); const response = await fetch('/api/admin/signup-templates', { headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); setTemplates(data || []); } } catch (error) { console.error('Erro ao carregar templates:', error); } finally { setLoading(false); } }; const handleFieldToggle = (field: typeof AVAILABLE_FIELDS[0]) => { // Campos obrigatórios não podem ser removidos if (field.required) return; setSelectedFields(prev => { const exists = prev.find(f => f.name === field.name); if (exists) { return prev.filter(f => f.name !== field.name); } else { return [...prev, { ...field, order: prev.length + 1 }]; } }); }; const handleModuleToggle = (module: string) => { setSelectedModules(prev => { if (prev.includes(module)) { return prev.filter(m => m !== module); } else { return [...prev, module]; } }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const template = { ...formData, form_fields: selectedFields, enabled_modules: selectedModules, is_active: true, }; try { const token = localStorage.getItem('token'); const url = editingTemplate ? `/api/admin/signup-templates/${editingTemplate.id}` : '/api/admin/signup-templates'; const method = editingTemplate ? 'PUT' : 'POST'; const response = await fetch(url, { method, headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify(template), }); if (response.ok) { loadTemplates(); handleCloseDialog(); } } catch (error) { console.error('Erro ao salvar template:', error); } }; const handleDelete = async (id: string) => { if (!confirm('Tem certeza que deseja deletar este template?')) return; try { const token = localStorage.getItem('token'); const response = await fetch(`/api/admin/signup-templates/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { loadTemplates(); } } catch (error) { console.error('Erro ao deletar template:', error); } }; const handleEdit = (template: SignupTemplate) => { setEditingTemplate(template); setFormData({ name: template.name, description: template.description, slug: template.slug, redirect_url: template.redirect_url || '', success_message: template.success_message || '', }); setSelectedFields(template.form_fields); setSelectedModules(template.enabled_modules); setShowDialog(true); }; const handleCloseDialog = () => { setShowDialog(false); setEditingTemplate(null); setFormData({ name: '', description: '', slug: '', redirect_url: '', success_message: '', }); // Sempre iniciar com os campos obrigatórios selecionados const requiredFields = AVAILABLE_FIELDS.filter(f => f.required).map((f, idx) => ({ ...f, order: idx + 1 })); setSelectedFields(requiredFields); setSelectedModules([]); }; // Inicializar com campos obrigatórios na primeira renderização useEffect(() => { const requiredFields = AVAILABLE_FIELDS.filter(f => f.required).map((f, idx) => ({ ...f, order: idx + 1 })); if (selectedFields.length === 0) { setSelectedFields(requiredFields); } }, []); const copyToClipboard = (slug: string) => { const url = `${window.location.origin}/cadastro/${slug}`; navigator.clipboard.writeText(url); alert('Link copiado para a área de transferência!'); }; return (

Links de Cadastro

Crie links personalizados de cadastro com campos e módulos específicos

{loading ? (
) : templates.length === 0 ? (

Nenhum link criado

Crie seu primeiro link de cadastro personalizado

) : (
{templates.map((template) => (

{template.name}

{template.description}

/cadastro/{template.slug}
Campos: {template.form_fields.map((field) => ( {field.label} ))}
Módulos: {template.enabled_modules.map((module) => ( {module} ))}
{template.usage_count}
cadastros
))}
)} {/* Dialog de Criação/Edição */}
setFormData({ ...formData, name: e.target.value })} required /> setFormData({ ...formData, slug: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') })} required placeholder="ex: crm-rapido" />
setFormData({ ...formData, description: e.target.value })} />
{AVAILABLE_FIELDS.map((field) => { const isSelected = selectedFields.some(f => f.name === field.name); const isRequired = field.required; return ( ); })}

Os campos Email, Senha e Subdomínio são obrigatórios e não podem ser removidos

{AVAILABLE_MODULES.map((module) => ( ))}
); }