import React, { useState, useRef } from 'react'; import { Link, useNavigate, useLocation } from 'react-router-dom'; function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) { const navigate = useNavigate(); const location = useLocation(); 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 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'); }; const validarCPF = (cpf) => { const cpfLimpo = cpf.replace(/\D/g, ''); if (cpfLimpo.length !== 11) return false; if (/^(\d)\1+$/.test(cpfLimpo)) return false; let soma = 0; for (let i = 0; i < 9; i++) { soma += parseInt(cpfLimpo.charAt(i)) * (10 - i); } let resto = 11 - (soma % 11); let digito1 = resto === 10 || resto === 11 ? 0 : resto; soma = 0; for (let i = 0; i < 10; i++) { soma += parseInt(cpfLimpo.charAt(i)) * (11 - i); } resto = 11 - (soma % 11); let digito2 = resto === 10 || resto === 11 ? 0 : resto; return digito1 === parseInt(cpfLimpo.charAt(9)) && digito2 === parseInt(cpfLimpo.charAt(10)); }; const [avatarUrl, setAvatarUrl] = useState(null); const [showRequiredModal, setShowRequiredModal] = useState(false); const [emptyFields, setEmptyFields] = useState([]); const [cpfError, setCpfError] = useState(''); const nomeRef = useRef(null); const cpfRef = useRef(null); const emailRef = useRef(null); const telefoneRef = useRef(null); const crmUfRef = useRef(null); const crmRef = useRef(null); const [collapsedSections, setCollapsedSections] = useState({ dadosPessoais: true, contato: false, endereco: false, }); const handleToggleCollapse = (section) => { setCollapsedSections(prevState => ({ ...prevState, [section]: !prevState[section] })); }; const handleChange = (e) => { const { name, value, type, checked, files } = e.target; if (value && emptyFields.includes(name)) { setEmptyFields(prev => prev.filter(field => field !== name)); } if (name === 'cpf' && cpfError) { setCpfError(''); } if (type === 'checkbox') { setFormData(prev => ({ ...prev, [name]: checked })); } else if (type === 'file') { setFormData(prev => ({ ...prev, [name]: files[0] })); 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); } } else if (name.includes('cpf')) { let cpfFormatado = FormatCPF(value); setFormData(prev => ({ ...prev, [name]: cpfFormatado })); const cpfLimpo = cpfFormatado.replace(/\D/g, ''); if (cpfLimpo.length === 11) { if (!validarCPF(cpfFormatado)) { setCpfError('CPF inválido'); } else { setCpfError(''); } } } else if (name.includes('phone')) { let telefoneFormatado = FormatTelefones(value); setFormData(prev => ({ ...prev, [name]: telefoneFormatado })); } else { setFormData(prev => ({ ...prev, [name]: value })); } }; const handleCepBlur = async () => { const cep = formData.cep?.replace(/\D/g, ''); if (cep && 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, street: data.logradouro || '', neighborhood: data.bairro || '', city: data.localidade || '', state: data.uf || '' })); } else { setShowRequiredModal(true); setEmptyFields(['cep']); } } catch (error) { setShowRequiredModal(true); setEmptyFields(['cep']); } } }; const scrollToEmptyField = (fieldName) => { let fieldRef = null; switch (fieldName) { case 'full_name': fieldRef = nomeRef; setCollapsedSections(prev => ({ ...prev, dadosPessoais: true })); break; case 'cpf': fieldRef = cpfRef; setCollapsedSections(prev => ({ ...prev, dadosPessoais: true })); break; case 'email': fieldRef = emailRef; setCollapsedSections(prev => ({ ...prev, contato: true })); break; case 'phone_mobile': fieldRef = telefoneRef; setCollapsedSections(prev => ({ ...prev, contato: true })); break; case 'crm_uf': fieldRef = crmUfRef; setCollapsedSections(prev => ({ ...prev, dadosPessoais: true })); break; case 'crm': fieldRef = crmRef; setCollapsedSections(prev => ({ ...prev, dadosPessoais: true })); break; default: return; } setTimeout(() => { if (fieldRef.current) { fieldRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' }); fieldRef.current.focus(); fieldRef.current.style.border = '2px solid #dc3545'; fieldRef.current.style.boxShadow = '0 0 0 0.2rem rgba(220, 53, 69, 0.25)'; setTimeout(() => { if (fieldRef.current) { fieldRef.current.style.border = ''; fieldRef.current.style.boxShadow = ''; } }, 3000); } }, 300); }; const handleSubmit = async () => { const missingFields = []; if (!formData.full_name) missingFields.push('full_name'); if (!formData.cpf) missingFields.push('cpf'); if (!formData.email) missingFields.push('email'); if (!formData.phone_mobile) missingFields.push('phone_mobile'); if (!formData.crm_uf) missingFields.push('crm_uf'); if (!formData.crm) missingFields.push('crm'); if (missingFields.length > 0) { setEmptyFields(missingFields); setShowRequiredModal(true); setTimeout(() => { if (missingFields.length > 0) { scrollToEmptyField(missingFields[0]); } }, 500); return; } const cpfLimpo = formData.cpf.replace(/\D/g, ''); if (cpfLimpo.length !== 11) { setShowRequiredModal(true); setEmptyFields(['cpf']); setCpfError('CPF deve ter 11 dígitos'); setTimeout(() => scrollToEmptyField('cpf'), 500); return; } if (!validarCPF(formData.cpf)) { setShowRequiredModal(true); setEmptyFields(['cpf']); setCpfError('CPF inválido'); setTimeout(() => scrollToEmptyField('cpf'), 500); return; } try { await onSave({ ...formData }); } catch (error) { throw error; } }; const handleModalClose = () => { setShowRequiredModal(false); }; return ( <> {showRequiredModal && (
Atenção

{cpfError ? 'Problema com o CPF:' : 'Por favor, preencha:'}

{cpfError ? (

{cpfError}

) : ( <> {!formData.full_name &&

- Nome

} {!formData.cpf &&

- CPF

} {!formData.email &&

- Email

} {!formData.phone_mobile &&

- Telefone

} {!formData.crm_uf &&

- Estado do CRM

} {!formData.crm &&

- CRM

} )}
)}

MediConnect

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

{avatarUrl ? ( Avatar do Médico ) : (
)}
{formData.foto && {formData.foto.name}}
{cpfError && (
{cpfError}
)}

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

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

); } export default DoctorForm;