"use client"; import type React from "react"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { Upload, Plus, X, ChevronDown } from "lucide-react"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { useToast } from "@/hooks/use-toast"; import SecretaryLayout from "@/components/secretary-layout"; export default function NovoPacientePage() { const [anexosOpen, setAnexosOpen] = useState(false); const [anexos, setAnexos] = useState([]); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); const { toast } = useToast(); const adicionarAnexo = () => { setAnexos([...anexos, `Documento ${anexos.length + 1}`]); }; const removerAnexo = (index: number) => { setAnexos(anexos.filter((_, i) => i !== index)); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (isLoading) return; setIsLoading(true); const form = e.currentTarget; const formData = new FormData(form); const apiPayload = { nome: formData.get("nome") as string, nome_social: (formData.get("nomeSocial") as string) || null, cpf: formData.get("cpf") as string, rg: (formData.get("rg") as string) || null, outros_documentos: (formData.get("outrosDocumentosTipo") as string) || (formData.get("outrosDocumentosNumero") as string) ? { tipo: (formData.get("outrosDocumentosTipo") as string) || undefined, numero: (formData.get("outrosDocumentosNumero") as string) || undefined, } : null, sexo: (formData.get("sexo") as string) || null, data_nascimento: (formData.get("dataNascimento") as string) || null, etnia: (formData.get("etnia") as string) || null, raca: (formData.get("raca") as string) || null, naturalidade: (formData.get("naturalidade") as string) || null, nacionalidade: (formData.get("nacionalidade") as string) || null, profissao: (formData.get("profissao") as string) || null, estado_civil: (formData.get("estadoCivil") as string) || null, nome_mae: (formData.get("nomeMae") as string) || null, profissao_mae: (formData.get("profissaoMae") as string) || null, nome_pai: (formData.get("nomePai") as string) || null, profissao_pai: (formData.get("profissaoPai") as string) || null, nome_responsavel: (formData.get("nomeResponsavel") as string) || null, cpf_responsavel: (formData.get("cpfResponsavel") as string) || null, nome_esposo: (formData.get("nomeEsposo") as string) || null, rn_na_guia_convenio: Boolean(formData.get("rnGuia")), codigo_legado: (formData.get("codigoLegado") as string) || null, contato: { email: (formData.get("email") as string) || null, celular: (formData.get("celular") as string) || null, telefone1: (formData.get("telefone1") as string) || null, telefone2: (formData.get("telefone2") as string) || null, }, endereco: { cep: (formData.get("cep") as string) || null, logradouro: (formData.get("endereco") as string) || null, numero: (formData.get("numero") as string) || null, complemento: (formData.get("complemento") as string) || null, bairro: (formData.get("bairro") as string) || null, cidade: (formData.get("cidade") as string) || null, estado: (formData.get("estado") as string) || null, referencia: null, }, observacoes: (formData.get("observacoes") as string) || null, // Campos de convênio (opcionais, se a API aceitar) convenio: (formData.get("convenio") as string) || null, plano: (formData.get("plano") as string) || null, numero_matricula: (formData.get("numeroMatricula") as string) || null, validade_carteira: (formData.get("validadeCarteira") as string) || null, }; const errors: string[] = []; const nome = apiPayload.nome?.trim() || ""; if (!nome || nome.length < 2 || nome.length > 255) errors.push("Nome deve ter entre 2 e 255 caracteres."); const cpf = apiPayload.cpf || ""; if (!/^\d{3}\.\d{3}\.\d{3}-\d{2}$/.test(cpf)) errors.push("CPF deve estar no formato XXX.XXX.XXX-XX."); const sexo = apiPayload.sexo; const allowedSexo = ["masculino", "feminino", "outro"]; if (!sexo || !allowedSexo.includes(sexo)) errors.push("Sexo é obrigatório e deve ser masculino, feminino ou outro."); if (!apiPayload.data_nascimento) errors.push("Data de nascimento é obrigatória."); const celular = apiPayload.contato?.celular || ""; if (celular && !/^\+55 \(\d{2}\) \d{4,5}-\d{4}$/.test(celular)) errors.push("Celular deve estar no formato +55 (XX) XXXXX-XXXX."); const cep = apiPayload.endereco?.cep || ""; if (cep && !/^\d{5}-\d{3}$/.test(cep)) errors.push("CEP deve estar no formato XXXXX-XXX."); const uf = apiPayload.endereco?.estado || ""; if (uf && uf.length !== 2) errors.push("Estado (UF) deve ter 2 caracteres."); if (errors.length) { toast({ title: "Corrija os campos", description: errors[0] }); setIsLoading(false); return; } try { const res = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(apiPayload), }); if (!res.ok) { const msg = `Erro ao salvar (HTTP ${res.status})`; throw new Error(msg); } let message = "Paciente cadastrado com sucesso"; try { const payload = await res.json(); if (payload?.success === false) { throw new Error(payload?.message || "A API retornou erro"); } if (payload?.message) message = String(payload.message); } catch {} toast({ title: "Sucesso", description: message, }); router.push("/secretary/pacientes"); } catch (err: any) { toast({ title: "Erro", description: err?.message || "Não foi possível cadastrar o paciente", }); } finally { setIsLoading(false); } }; return (

Novo Paciente

Cadastre um novo paciente no sistema

Dados Pessoais