import { useState } from 'react'; import React from 'react'; import { useNavigate } from 'react-router-dom'; import PatientForm from '../components/patients/PatientForm'; import API_KEY from '../components/utils/apiKeys'; import { useAuth } from '../components/utils/AuthProvider'; import './style/PatientCadastroManager.css'; function PatientCadastroManager({ setCurrentPage }) { const navigate = useNavigate() const [showModal, setShowModal] = useState(false); const [infosModal, setInfosModal] = useState({ title: '', message: '' }); const [isLoading, setIsLoading] = useState(false); const { getAuthorizationHeader, isAuthenticated } = useAuth(); const [formData, setFormData] = useState({}) const validarCPF = (cpf) => { cpf = cpf.replace(/\D/g, ''); if (cpf.length !== 11) return false; if (/^(\d)\1+$/.test(cpf)) return false; let soma = 0; let resto; for (let i = 1; i <= 9; i++) { soma = soma + parseInt(cpf.substring(i - 1, i)) * (11 - i); } resto = (soma * 10) % 11; if ((resto === 10) || (resto === 11)) resto = 0; if (resto !== parseInt(cpf.substring(9, 10))) return false; soma = 0; for (let i = 1; i <= 10; i++) { soma = soma + parseInt(cpf.substring(i - 1, i)) * (12 - i); } resto = (soma * 10) % 11; if ((resto === 10) || (resto === 11)) resto = 0; if (resto !== parseInt(cpf.substring(10, 11))) return false; return true; } const handleSavePatient = async (patientData) => { setIsLoading(true); try { if (!isAuthenticated) { throw new Error('Usuário não autenticado'); } const authHeader = getAuthorizationHeader(); if (!authHeader) { throw new Error('Header de autorização não encontrado'); } const cpfLimpo = patientData.cpf.replace(/\D/g, ''); if (!validarCPF(cpfLimpo)) { throw new Error('CPF inválido. Por favor, verifique o número digitado.'); } var myHeaders = new Headers(); myHeaders.append("Content-Type", "application/json"); myHeaders.append("apikey", API_KEY); myHeaders.append("Authorization", authHeader); myHeaders.append("Prefer", "return=representation"); const cleanedData = { full_name: patientData.full_name, cpf: patientData.cpf, email: patientData.email, phone_mobile: patientData.phone_mobile, birth_date: patientData.birth_date || null, sex: patientData.sex === 'Masculino' ? 'M' : patientData.sex === 'Feminino' ? 'F' : patientData.sex || null, social_name: patientData.social_name || null, rg: patientData.rg || null, blood_type: patientData.blood_type || null, weight_kg: patientData.weight_kg ? parseFloat(patientData.weight_kg) : null, height_m: patientData.height_m ? parseFloat(patientData.height_m) : null, bmi: patientData.bmi ? parseFloat(patientData.bmi) : null, notes: patientData.notes || null, mother_name: patientData.mother_name || null, father_name: patientData.father_name || null, guardian_name: patientData.guardian_name || null, guardian_cpf: patientData.guardian_cpf ? patientData.guardian_cpf.replace(/\D/g, '') : null, marital_status: patientData.marital_status || null, profession: patientData.profession || null, naturality: patientData.naturality || null, nationality: patientData.nationality || null, race: patientData.race || null, cep: patientData.cep || null, street: patientData.street || null, number: patientData.number || null, complement: patientData.complement || null, neighborhood: patientData.neighborhood || null, city: patientData.city || null, state: patientData.state || null, phone1: patientData.phone1 || null, phone2: patientData.phone2 || null }; if (!cleanedData.full_name || !cleanedData.cpf || !cleanedData.email || !cleanedData.phone_mobile) { throw new Error('Dados obrigatórios faltando: nome, CPF, email e telefone são necessários'); } var raw = JSON.stringify(cleanedData); var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients", requestOptions); let responseData; try { responseData = await response.json(); } catch (jsonError) { responseData = { error: 'Resposta inválida da API' }; } if (!response.ok) { let errorMessage = 'Erro ao salvar paciente'; if (response.status === 401) { errorMessage = 'Não autorizado. Verifique suas credenciais.'; } else if (response.status === 403) { errorMessage = 'Acesso proibido. Verifique suas permissões.'; } else if (response.status === 409) { errorMessage = 'Já existe um paciente cadastrado com este CPF.'; } else if (response.status === 400) { errorMessage = `Dados inválidos: ${responseData.details || responseData.message || 'Verifique os campos'}`; } else if (response.status === 422) { errorMessage = `Dados de entrada inválidos: ${responseData.details || 'Verifique o formato dos dados'}`; } else if (response.status >= 500) { errorMessage = 'Erro interno do servidor. Tente novamente mais tarde.'; } else { errorMessage = `Erro ${response.status}: ${responseData.message || responseData.error || 'Erro desconhecido'}`; } throw new Error(errorMessage); } setInfosModal({ title: 'Sucesso', message: 'O cadastro do paciente foi realizado com sucesso.' }); setShowModal(true); setTimeout(() => { setShowModal(false); navigate('/secretaria/pacientes'); }, 2000); } catch (error) { setInfosModal({ title: 'Erro', message: error.message || 'Não foi possível conectar ao servidor. Verifique sua internet e tente novamente.' }); setShowModal(true); } finally { setIsLoading(false); } }; return ( <>
{showModal && (
{infosModal.title}

{infosModal.message}

{infosModal.title === 'Erro' && (

)}
)}

Cadastro de Pacientes

{isLoading && (
Salvando paciente...
)}
navigate('/secretaria/pacientes')} formData={formData} setFormData={setFormData} isLoading={isLoading} />
); } export default PatientCadastroManager;