import React, { useState, useEffect } from 'react'; function PatientForm({ onSave, onCancel, formData, setFormData }) { const [errorModalMsg, setErrorModalMsg] = useState(""); // Estado para controlar a exibição do modal e os dados do paciente existente const [showModal, setShowModal] = useState(false); const [showModal404, setShowModal404] = useState(false); const [pacienteExistente, setPacienteExistente] = useState(null); const [showSuccessModal, setShowSuccessModal] = useState(false); const FormatTelefones = (valor) => { const digits = String(valor).replace(/\D/g, '').slice(0, 11); return digits .replace(/(\d)/, '($1') .replace(/(\d{2})(\d)/, '$1) $2' ) .replace(/(\d)(\d{4})/, '$1 $2') .replace(/(\d{4})(\d{4})/, '$1-$2') } const ReceberRespostaAPIdoCPF = async (cpf) =>{ var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); myHeaders.append("Content-Type", "application/json"); var raw = JSON.stringify({ "cpf": cpf }); var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; const response = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes/validar-cpf", requestOptions) if (!response.ok) { throw new Error('Erro na API de validação de CPF. Status: ' + response.status); } const result = await response.json() return result.data } // Função para buscar os dados completos do paciente pelo ID const BuscarPacientePorId = async (id) => { var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); var requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; try { const response = await fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, requestOptions); const result = await response.json(); return result.data; } catch (error) { console.error("Erro ao buscar paciente por ID:", error); return null; } }; const ValidarCPF = async (cpf) => { let aviso let Erro = false try { const resultadoAPI = await ReceberRespostaAPIdoCPF(cpf) const valido = resultadoAPI.valido const ExisteNoBancoDeDados = resultadoAPI.existe const idPaciente = resultadoAPI.id_paciente if(valido === false){ aviso = 'CPF inválido' Erro = true } else if(ExisteNoBancoDeDados === true){ const paciente = await BuscarPacientePorId(idPaciente); if (paciente) { setPacienteExistente(paciente); setShowModal(true); } Erro = true } } catch (error) { console.error("Erro na validação do CPF:", error); setShowModal404(true); Erro = true; } return [Erro,aviso] } const FormatCPF = (valor) => { const digits = String(valor).replace(/\D/g, '').slice(0, 11); return digits .replace(/(\d{3})(\d)/, '$1.$2') .replace(/(\d{3})(\d)/, '$1.$2') .replace(/(\d{3})(\d{1,2})$/, '$1-$2'); } // Estado para armazenar a URL da foto do avatar const [avatarUrl, setAvatarUrl] = useState(null); // Estado para controlar quais seções estão colapsadas const [collapsedSections, setCollapsedSections] = useState({ dadosPessoais: true, // Alterado para true para a seção ficar aberta por padrão infoMedicas: false, infoConvenio: false, endereco: false, contato: false, }); // Função para alternar o estado de colapso de uma seção const handleToggleCollapse = (section) => { setCollapsedSections(prevState => ({ ...prevState, [section]: !prevState[section] })); }; // Lógica para calcular o IMC useEffect(() => { const peso = parseFloat(formData.peso); const altura = parseFloat(formData.altura); if (peso > 0 && altura > 0) { const imcCalculado = peso / (altura * altura); setFormData(prev => ({ ...prev, imc: imcCalculado.toFixed(2) })); } else { setFormData(prev => ({ ...prev, imc: '' })); } }, [formData.peso, formData.altura]); const [enderecoData, setEnderecoData] = useState({}) useEffect(() => {setEnderecoData(formData.endereco || {}); console.log(enderecoData)}, [formData.endereco]) const [contato, setContato] = useState({}) useEffect(() => {setContato(formData.contato || {})}, [formData.contato]) const handleChange = (e) => { const { name, value, type, checked, files } = e.target; console.log(formData, name) if (type === 'checkbox') { setFormData({ ...formData, [name]: checked }); } else if (type === 'file') { setFormData({ ...formData, [name]: files[0] }); // Lógica para pré-visualizar a imagem no avatar if (name === 'foto' && files[0]) { const reader = new FileReader(); reader.onloadend = () => { setAvatarUrl(reader.result); }; reader.readAsDataURL(files[0]); } else if (name === 'foto' && !files[0]) { setAvatarUrl(null); // Limpa o avatar se nenhum arquivo for selecionado }} if (name.includes('cpf')) { setFormData({...formData, cpf:FormatCPF(value) }); } else if (name.includes('telefone')) { let telefoneFormatado = FormatTelefones(value); setContato(prev => ({ ...prev, [name]: telefoneFormatado })); }else if (name === 'email') { setContato(prev => ({ ...prev, email: value })); }else if(name.includes('endereco')) { setEnderecoData(prev => ({ ...prev, [name.split('.')[1]]: value })); }else{ setFormData({ ...formData, [name]: value }); } }; const handleCepBlur = async () => { const cep = formData.cep.replace(/\D/g, ''); if (cep.length === 8) { try { const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`); const data = await response.json(); if (!data.erro) { setFormData((prev) => ({ ...prev, rua: data.logradouro || '', bairro: data.bairro || '', cidade: data.localidade || '', estado: data.uf || '' })); } else { alert('CEP não encontrado!'); } } catch (error) { alert('Erro ao buscar o CEP.'); } } }; const handleSubmit = async () => { if (!formData.nome || !formData.cpf || !formData.sexo || !formData.data_nascimento){ setErrorModalMsg('Por favor, preencha Nome, CPF, Gênero e data de nascimento.'); setShowModal404(true); return; } const [CPFinvalido] = await ValidarCPF(formData.cpf); if(CPFinvalido === true){ return; } onSave({ ...formData, endereco: { cep: enderecoData.cep, cidade: enderecoData.cidade, estado: enderecoData.estado, bairro: enderecoData.bairro, logradouro: enderecoData.logradouro, numero: enderecoData.numero, complemento: enderecoData.complemento, }, contato: { email: contato.email, telefone1: contato.telefone1, telefone2: contato.telefone2, telefone3: contato.telefone3, }, infoMedicas: { tipoSanguineo: formData.tipoSanguineo, peso: formData.peso, altura: formData.altura, imc: formData.imc, alergias: formData.alergias, }, infoConvenio: { convenio: formData.convenio, plano: formData.plano, numeroMatricula: formData.numeroMatricula, validadeCarteira: formData.validadeCarteira, validadeIndeterminada: formData.validadeIndeterminada, pacienteVip: formData.pacienteVip, }, }); setShowSuccessModal(true); }; return (

MediConnect

{/* DADOS PESSOAIS */}

handleToggleCollapse('dadosPessoais')} style={{ fontSize: '1.8rem' }}> Dados Pessoais {collapsedSections.dadosPessoais ? '▲' : '▼'}

{/* AVATAR E INPUT DE FOTO */}
{avatarUrl ? ( Avatar do Paciente ) : (
)}
{formData.foto && {formData.foto.name}}
{/* CADASTRO */}
{/* CAMPOS MOVIDOS */}
{formData.anexos ? formData.anexos.name : 'Nenhum arquivo escolhido'}
{/* INFORMAÇÕES MÉDICAS */}

handleToggleCollapse('infoMedicas')} style={{ fontSize: '1.8rem' }}> Informações Médicas {collapsedSections.infoMedicas ? '▲' : '▼'}

{/* INFORMAÇÕES DE CONVÊNIO */}

handleToggleCollapse('infoConvenio')} style={{ fontSize: '1.8rem' }}> Informações de convênio {collapsedSections.infoConvenio ? '▲' : '▼'}

{/* PACIENTE VIP */}
{/* ENDEREÇO */}

handleToggleCollapse('endereco')} style={{ fontSize: '1.8rem' }}> Endereço {collapsedSections.endereco ? '▲' : '▼'}

{/* CONTATO */}

handleToggleCollapse('contato')} style={{ fontSize: '1.8rem' }}> Contato {collapsedSections.contato ? '▲' : '▼'}

{/* Botões */}
{/* Modal para paciente existente */} {showModal && pacienteExistente && (
Ops! Este CPF já está cadastrado
Foto do Paciente

ID do Paciente: {pacienteExistente.id}

Nome Completo: {pacienteExistente.nome}

CPF: {pacienteExistente.cpf}

Data de Nascimento: {pacienteExistente.data_nascimento}

Telefone: {pacienteExistente.contato.telefone1}

)} {/* Modal de sucesso ao salvar paciente */} {showSuccessModal && (
Paciente salvo com sucesso!

O cadastro do paciente foi realizado com sucesso.

)} {showModal404 && (
Atenção

{errorModalMsg || '(Erro 404).Por favor, tente novamente mais tarde'}

)}
); } export default PatientForm;