import React, { useState, useRef, useCallback } from "react"; import { Link, useNavigate, useLocation } from "react-router-dom"; import "./DoctorForm.css"; import HorariosDisponibilidade from "../doctors/HorariosDisponibilidade"; const ENDPOINT_AVAILABILITY = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_availability"; 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, horarios: 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 handleAvailabilityUpdate = useCallback((newAvailability) => { setFormData((prev) => { if (JSON.stringify(prev.availability) !== JSON.stringify(newAvailability)) { return { ...prev, availability: newAvailability }; } return prev; }); }, []); 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 handleCreateAvailability = async (newAvailability) => { try { const response = await fetch(ENDPOINT_AVAILABILITY, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(newAvailability), }); const data = await response.json(); console.log("Disponibilidade criada :", data); alert("Disponibilidade criada com sucesso!"); } catch (error) { console.error("Erro ao criar disponibilidade:", error); alert("Erro ao criar disponibilidade."); } }; 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 }); if (formData.availability && formData.availability.length > 0) { } } catch (error) { console.error("Erro ao salvar médico:", error); alert("Erro ao salvar médico."); }; }; const handleModalClose = () => { setShowRequiredModal(false); }; return ( <> {/* Modal de Alerta */} {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

} )}
)} {/* Formulário Principal */}

MediConnect

{/* DADOS PESSOAIS */}

handleToggleCollapse("dadosPessoais")} > Dados Pessoais {collapsedSections.dadosPessoais ? "▲" : "▼"}

{/* Foto / Avatar */}
{avatarUrl ? ( Avatar do Médico ) : (
)}
{formData.foto && ( {formData.foto.name} )}
{/* Nome Completo */}
{/* Data de Nascimento */}
{/* CPF */}
{cpfError && (
{cpfError}
)}
{/* Estado do CRM */}
{/* CRM */}
{/* Especialização */}
{/* CONTATO */}

handleToggleCollapse("contato")} > Contato {collapsedSections.contato ? "▲" : "▼"}

{/* Email */}
{/* Telefone 1 (Principal) */}
{/* Telefone 2 (Opcional) */}
{/* ENDEREÇO */}

handleToggleCollapse("endereco")} > Endereço {collapsedSections.endereco ? "▲" : "▼"}

{/* CEP */}
{/* Rua */}
{/* Bairro */}
{/* Cidade */}
{/* Estado */}
{/* Número */}
{/* Complemento */}
{/* HORÁRIOS */}

handleToggleCollapse("horarios")} > Horários de Atendimento {collapsedSections.horarios ? "▲" : "▼"}

Defina seus horários de atendimento para cada dia da semana. Marque um dia para começar a adicionar blocos de tempo.

{/* BOTÕES DE AÇÃO */}
); } export default DoctorForm;