import React, { useState, useEffect } from 'react'; function PatientForm({ onSave, onCancel,formData, setFormData,setCurrentPage }) { // Estado para controlar modal de feedback const [showMessage, setShowMessage] = useState(false); const [message, setMessage] = useState(''); const [messageType, setMessageType] = useState('success'); // 'success' ou 'danger' 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) const result = await response.json() return result.data } const ValidarCPF = async (cpf) => { let aviso let Erro = false const resultadoAPI = await ReceberRespostaAPIdoCPF(cpf) const valido = resultadoAPI.valido const ExisteNoBancoDeDados = resultadoAPI.existe if(valido === false){ aviso = 'CPF inválido' Erro = true } else if(ExisteNoBancoDeDados === true){ aviso = 'O CPF informado já está presente no sistema' 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; 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{ console.log(formData, value) 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 (e) => { e.preventDefault(); if (!formData.nome || !formData.cpf || !formData.sexo || !formData.data_nascimento){ console.log(formData) setMessage('Por favor, preencha: Nome, CPF, Gênero, Data de Nascimento .'); setMessageType('danger'); setShowMessage(true); return; } const CPFinvalido = await ValidarCPF(formData.cpf); if(CPFinvalido[0] === true){ setMessage(CPFinvalido[1]); setMessageType('danger'); setShowMessage(true); return } const pacienteSalvo = await onSave({ ...formData, id: 2, 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, }, }); setMessage('Paciente salvo com sucesso!'); setMessageType('success'); setShowMessage(true); const pacienteId = pacienteSalvo.id; try{ if (formData.foto) await uploadFotoPaciente(pacienteId, formData.foto); if (formData.anexos) await uploadAnexoPaciente(pacienteId, formData.anexos); } catch (error) { console.error(error); alert("Erro ao salvar paciente ou enviar arquivos."); } }; const uploadFotoPaciente = async (pacienteId, foto) => { const formDataUpload = new FormData(); formDataUpload.append('foto', foto); try { const res = await fetch(`https://suaapi.com/pacientes/${pacienteId}/foto`, { method: 'POST', headers: { 'Authorization': 'Bearer ' }, body: formDataUpload }); if (!res.ok) throw new Error('Erro ao enviar foto'); alert('Foto enviada com sucesso!'); } catch (err) { console.error(err); alert('Falha ao enviar foto'); } }; const uploadAnexoPaciente = async (pacienteId, anexo) => { const formDataUpload = new FormData(); formDataUpload.append('anexo', anexo); try { const res = await fetch(`https://suaapi.com/pacientes/${pacienteId}/anexos`, { method: 'POST', headers: { 'Authorization': 'Bearer ' }, body: formDataUpload }); if (!res.ok) throw new Error('Erro ao enviar anexo'); alert('Anexo enviado com sucesso!'); } catch (err) { console.error(err, 'deu erro'); } }; return (
{/* Modal de feedback */} {showMessage && (
)} {showMessage && (
{messageType === 'danger' ? 'Atenção' : 'Sucesso'}
{message}
)}

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 */}
); } export default PatientForm;