'use client'; import * as React from 'react'; import { useRouter } from 'next/navigation'; import { useMutation, useQuery } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Copy } from 'lucide-react'; import { createTenant, type CreateTenantResult } from '@/lib/api/tenants'; import { listPlanos } from '@/lib/api/planos'; import { createTenantSchema, type CreateTenantFormValues } from '@/lib/validators/tenants'; import { ApiError } from '@/lib/api/client'; import { toast } from '@/lib/toast'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { FormField } from '@/components/ui/form-field'; import { Input } from '@/components/ui/input'; import { ResponsiveDialog } from '@/components/ui/responsive-dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Separator } from '@/components/ui/separator'; export default function NovoTenantPage() { const router = useRouter(); const [created, setCreated] = React.useState(null); const { data: planos } = useQuery({ queryKey: ['master', 'planos', { ativo: true }], queryFn: () => listPlanos({ ativo: true }), }); const form = useForm({ resolver: zodResolver(createTenantSchema), defaultValues: { razao_social: '', nome_fantasia: '', documento: '', email_contato: '', telefone: '', plano_id: '', admin_nome: '', admin_email: '', admin_senha: '', }, }); const mutation = useMutation({ mutationFn: (values: CreateTenantFormValues) => createTenant({ razao_social: values.razao_social, nome_fantasia: values.nome_fantasia || undefined, documento: values.documento || undefined, email_contato: values.email_contato, telefone: values.telefone || undefined, plano_id: values.plano_id, dia_vencimento_mensalidade: values.dia_vencimento_mensalidade, admin: { nome: values.admin_nome, email: values.admin_email, senha: values.admin_senha || undefined, }, }), onSuccess: (result) => setCreated(result), onError: (err) => { toast.error(err instanceof ApiError ? err.message : 'Não foi possível criar o tenant.'); }, }); async function copySenha() { if (!created) return; try { await navigator.clipboard.writeText(created.admin.senha_provisoria); toast.success('Senha copiada.'); } catch { toast.error('Não foi possível copiar automaticamente — selecione e copie manualmente.'); } } return (

Novo tenant

Cadastro de um novo cliente da plataforma

mutation.mutate(values))} > Dados cadastrais
(v === '' ? undefined : Number(v)), })} />
Primeiro usuário (administrador do tenant)
{ if (!open && created) router.push(`/master/tenants/${created.tenant.id}`); }} title="Tenant criado com sucesso" description="Copie e repasse a senha provisória ao cliente agora — ela não será mostrada novamente." footer={ } > {created && (

Administrador

{created.admin.nome} · {created.admin.email}

Senha provisória

{created.admin.senha_provisoria}

Atenção: esta senha não fica salva em texto puro em nenhum lugar e não será exibida novamente. Copie e repasse ao cliente agora.

)}
); }