-
-
-
-
-
-
-
- {/* INPUT: Data de Atendimento (usada para habilitar a busca de horários) */}
-
-
+
+
+
+
+
+
-
- {isModoEmergencia ? (
- // MODO EMERGÊNCIA: Input type="time" simples, sem restrição
- <>
-
-
-
-
-
-
-
-
- >
- ) : // MODO PADRÃO
- isReadyForSchedule ? (
- // ESTADO 2: Médico e Data ESCOLHIDOS -> Restringe para grade (SELECT)
- <>
-
-
- {carregandoHorarios ? (
-
- ) : (
-
- )}
-
-
-
-
-
-
- >
- ) : (
- // ESTADO 1: Médico ou Data PENDENTE -> Permite entrada de tempo livre (INPUT TYPE="TIME")
- <>
-
-
-
-
-
-
-
-
- >
- )}
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
};
-export default FormNovaConsulta;
+export default FormNovaConsulta;
\ No newline at end of file
diff --git a/src/components/TrocardePerfis.jsx b/src/components/TrocardePerfis.jsx
index d340b7f..87b2482 100644
--- a/src/components/TrocardePerfis.jsx
+++ b/src/components/TrocardePerfis.jsx
@@ -33,6 +33,7 @@ const TrocardePerfis = () => {
{ key: "medico", label: "Médico", route: "/medico" },
{ key: "financeiro", label: "Financeiro", route: "/financeiro" },
{ key: "admin", label: "Administração", route: "/admin" },
+ { key: "paciente", label: "Paciente", route: "/paciente" },
].filter(
(opt) =>
showProfiles?.includes(opt.key) || showProfiles?.includes("admin")
diff --git a/src/components/doctors/DoctorForm.jsx b/src/components/doctors/DoctorForm.jsx
index 4de5b56..45ec0bf 100644
--- a/src/components/doctors/DoctorForm.jsx
+++ b/src/components/doctors/DoctorForm.jsx
@@ -1,35 +1,37 @@
-import React, { useState, useRef } from "react";
-import { Link, useNavigate, useLocation } from "react-router-dom";
+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);
+ 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");
+ .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);
+ 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");
+ .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, "");
-
+ 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);
@@ -44,17 +46,15 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
}
resto = 11 - (soma % 11);
let digito2 = resto === 10 || resto === 11 ? 0 : resto;
-
- return (
- digito1 === parseInt(cpfLimpo.charAt(9)) &&
- digito2 === parseInt(cpfLimpo.charAt(10))
- );
+
+
+ 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 [cpfError, setCpfError] = useState('');
const nomeRef = useRef(null);
const cpfRef = useRef(null);
@@ -70,59 +70,63 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
});
const handleToggleCollapse = (section) => {
- setCollapsedSections((prevState) => ({
+ setCollapsedSections(prevState => ({
...prevState,
- [section]: !prevState[section],
+ [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));
+ setEmptyFields(prev => prev.filter(field => field !== name));
}
- if (name === "cpf" && cpfError) {
- setCpfError("");
+
+ if (name === 'cpf' && cpfError) {
+ setCpfError('');
}
- if (type === "checkbox") {
- setFormData((prev) => ({ ...prev, [name]: checked }));
- } else if (type === "file") {
- setFormData((prev) => ({ ...prev, [name]: files[0] }));
+ if (type === 'checkbox') {
+ setFormData(prev => ({ ...prev, [name]: checked }));
+ } else if (type === 'file') {
+ setFormData(prev => ({ ...prev, [name]: files[0] }));
- if (name === "foto" && 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]) {
+ } 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, "");
+ } 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");
+ setCpfError('CPF inválido');
} else {
- setCpfError("");
+ setCpfError('');
}
}
- } else if (name.includes("phone")) {
+ } else if (name.includes('phone')) {
let telefoneFormatado = FormatTelefones(value);
- setFormData((prev) => ({ ...prev, [name]: telefoneFormatado }));
+ setFormData(prev => ({ ...prev, [name]: telefoneFormatado }));
} else {
- setFormData((prev) => ({ ...prev, [name]: value }));
+ setFormData(prev => ({ ...prev, [name]: value }));
}
};
const handleCepBlur = async () => {
- const cep = formData.cep?.replace(/\D/g, "");
+ const cep = formData.cep?.replace(/\D/g, '');
if (cep && cep.length === 8) {
try {
const response = await fetch(`https://viacep.com.br/ws/${cep}/json/`);
@@ -130,49 +134,50 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
if (!data.erro) {
setFormData((prev) => ({
...prev,
- street: data.logradouro || "",
- neighborhood: data.bairro || "",
- city: data.localidade || "",
- state: data.uf || "",
+ street: data.logradouro || '',
+ neighborhood: data.bairro || '',
+ city: data.localidade || '',
+ state: data.uf || ''
}));
} else {
setShowRequiredModal(true);
- setEmptyFields(["cep"]);
+ setEmptyFields(['cep']);
}
} catch (error) {
setShowRequiredModal(true);
- setEmptyFields(["cep"]);
+ setEmptyFields(['cep']);
}
}
};
+
const scrollToEmptyField = (fieldName) => {
let fieldRef = null;
-
+
switch (fieldName) {
- case "full_name":
+ case 'full_name':
fieldRef = nomeRef;
- setCollapsedSections((prev) => ({ ...prev, dadosPessoais: true }));
+ setCollapsedSections(prev => ({ ...prev, dadosPessoais: true }));
break;
- case "cpf":
+ case 'cpf':
fieldRef = cpfRef;
- setCollapsedSections((prev) => ({ ...prev, dadosPessoais: true }));
+ setCollapsedSections(prev => ({ ...prev, dadosPessoais: true }));
break;
- case "email":
+ case 'email':
fieldRef = emailRef;
- setCollapsedSections((prev) => ({ ...prev, contato: true }));
+ setCollapsedSections(prev => ({ ...prev, contato: true }));
break;
- case "phone_mobile":
+ case 'phone_mobile':
fieldRef = telefoneRef;
- setCollapsedSections((prev) => ({ ...prev, contato: true }));
+ setCollapsedSections(prev => ({ ...prev, contato: true }));
break;
- case "crm_uf":
+ case 'crm_uf':
fieldRef = crmUfRef;
- setCollapsedSections((prev) => ({ ...prev, dadosPessoais: true }));
+ setCollapsedSections(prev => ({ ...prev, dadosPessoais: true }));
break;
- case "crm":
+ case 'crm':
fieldRef = crmRef;
- setCollapsedSections((prev) => ({ ...prev, dadosPessoais: true }));
+ setCollapsedSections(prev => ({ ...prev, dadosPessoais: true }));
break;
default:
return;
@@ -181,20 +186,21 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
setTimeout(() => {
if (fieldRef.current) {
- fieldRef.current.scrollIntoView({
- behavior: "smooth",
- block: "center",
+ 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)";
-
+
+
+ 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 = "";
+ fieldRef.current.style.border = '';
+ fieldRef.current.style.boxShadow = '';
}
}, 3000);
}
@@ -204,17 +210,18 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
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 (!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]);
@@ -223,23 +230,26 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
return;
}
- const cpfLimpo = formData.cpf.replace(/\D/g, "");
+
+ 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);
+ 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);
+ setEmptyFields(['cpf']);
+ setCpfError('CPF inválido');
+ setTimeout(() => scrollToEmptyField('cpf'), 500);
return;
}
+
try {
await onSave({ ...formData });
@@ -290,16 +300,7 @@ function DoctorForm({ onSave, onCancel, formData, setFormData, isLoading }) {
alignItems: "center",
}}
>
-
- Atenção
-
+
Atenção