diff --git a/src/App.js b/src/App.js index 1f44f21..d6ab73c 100644 --- a/src/App.js +++ b/src/App.js @@ -1,15 +1,12 @@ import { useState } from "react"; import PerfilSecretaria from "./perfis/perfil_secretaria/PerfilSecretaria"; -import { AuthProvider } from "./components/utils/AuthProvider"; + function App() { return (
- - -
); } diff --git a/src/components/patients/PatientForm.jsx b/src/components/patients/PatientForm.jsx index 21f2887..7a437c0 100644 --- a/src/components/patients/PatientForm.jsx +++ b/src/components/patients/PatientForm.jsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import {Link} from 'react-router-dom' // formatar número // formatar CPF -import { FormatTelefones,FormatPeso } from '../utils/Formatar/Format'; +import { FormatTelefones,FormatPeso, FormatCPF } from '../utils/Formatar/Format'; function PatientForm({ onSave, onCancel, formData, setFormData }) { const [errorModalMsg, setErrorModalMsg] = useState(""); @@ -12,87 +12,6 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { const [pacienteExistente, setPacienteExistente] = useState(null); const [showSuccessModal, setShowSuccessModal] = useState(false); - 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 @@ -130,15 +49,13 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { const handleChange = (e) => { const { name, value, type, checked, files } = e.target; - console.log(formData, name) + console.log(formData, name, checked) - if (type === 'checkbox') { - setFormData({ ...formData, [name]: checked }); - } else if (type === 'file') { + if (type === 'file') { setFormData({ ...formData, [name]: files[0] }); // Lógica para pré-visualizar a imagem no avatar - if (name === 'foto' && files[0]) { + if (name === 'foto' && files[0]) { const reader = new FileReader(); reader.onloadend = () => { setAvatarUrl(reader.result); @@ -149,13 +66,16 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { }} - if (name.includes('cpf')) { + else if (name.includes('cpf')) { setFormData({...formData, cpf:FormatCPF(value) }); } else if (name.includes('phone')) { setFormData({ ...formData, [name]: FormatTelefones(value) }); }else if(name.includes('weight') || name.includes('bmi') || name.includes('height')){ setFormData({...formData,[name]: FormatPeso(value) }) - }else{ + }else if(name.includes('rn') || name.includes('vip')){ + setFormData({ ...formData, [name]: checked }); + } + else{ setFormData({ ...formData, [name]: value }); } }; @@ -190,15 +110,11 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { } - const [CPFinvalido] = await ValidarCPF(formData.cpf); - if(CPFinvalido === true){ - - } - + onSave({ ...formData,bmi:12.0 }); - setShowSuccessModal(true); + }; return ( @@ -371,7 +287,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { {/* CAMPOS MOVIDOS */}
- +
@@ -422,10 +338,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) {
-
- - -
+ @@ -473,7 +386,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { {/* PACIENTE VIP */}
- + @@ -561,7 +474,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { Salvar Paciente - + @@ -571,51 +484,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) { {/* 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 */} diff --git a/src/components/utils/Formatar/Format.js b/src/components/utils/Formatar/Format.js index 47bf709..a05e132 100644 --- a/src/components/utils/Formatar/Format.js +++ b/src/components/utils/Formatar/Format.js @@ -20,4 +20,12 @@ const FormatTelefones = (valor) => { } - export {FormatTelefones, FormatPeso} \ No newline at end of file + 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'); + } + + export {FormatTelefones, FormatPeso, FormatCPF} \ No newline at end of file diff --git a/src/data/sidebar-items.json b/src/data/sidebar-items.json index 81762b6..5edc8a4 100644 --- a/src/data/sidebar-items.json +++ b/src/data/sidebar-items.json @@ -10,18 +10,6 @@ "icon": "house" }, - { - "name": "Cadastro de Pacientes", - "url": "/pacientes/cadastro", - "icon": "heart-pulse-fill" - }, - - { - "name": "Cadastro do Médico", - "url": "/medicos/cadastro", - "icon": "capsule" - }, - { "name": "Lista de Pacientes", "icon": "clipboard-heart-fill", diff --git a/src/pages/Details.jsx b/src/pages/Details.jsx index 38ef1db..964ba13 100644 --- a/src/pages/Details.jsx +++ b/src/pages/Details.jsx @@ -3,7 +3,7 @@ import avatarPlaceholder from '../assets/images/avatar_placeholder.png'; import { useParams } from "react-router-dom"; import API_KEY from "../components/utils/apiKeys"; import {GetByID} from "../components/utils/Functions-Endpoints/Patient" - +import { Link } from "react-router-dom"; import { useAuth } from "../components/utils/AuthProvider"; @@ -89,16 +89,29 @@ const Details = () => {

MediConnect


+ + +
+ +
- {paciente.nome || "Nome Completo"} + {paciente.full_name || "Nome Completo"}

{paciente.cpf || "CPF"}

+ + + +
@@ -114,7 +127,7 @@ const Details = () => {
-

{paciente.nome_social || "-"}

+

{paciente.social_name || "-"}

@@ -134,55 +147,55 @@ const Details = () => {
-

{paciente.outros_documentos?.tipo || "-"}

+

{paciente.document_type || "-"}

-

{paciente.outros_documentos?.numero || "-"}

+

{paciente.document_number || "-"}

-

{paciente.etnia || "-"}

+

{paciente.ethnicity || "-"}

-

{paciente.raca || "-"}

+

{paciente.race || "-"}

-

{paciente.etniaRaca || "-"}

+

{paciente.naturality || "-"}

-

{paciente.profissao || "-"}

+

{paciente.profession || "-"}

-

{paciente.nome_mae || "-"}

+

{paciente.mother_name || "-"}

-

{paciente.profissao_mae || "-"}

+

{paciente.mother_profession || "-"}

-

{paciente.nome_pai || "-"}

+

{paciente.father_name || "-"}

-

{paciente.profissao_pai || "-"}

+

{paciente.father_profession || "-"}

-

{paciente.nome_responsavel || "-"}

+

{paciente.guardian_name || "-"}

-

{paciente.cpf_responsavel || "-"}

+

{paciente.guardian_cpf || "-"}

-

{paciente.estado_civil || "-"}

+

{paciente.marital_status || "-"}

@@ -190,17 +203,17 @@ const Details = () => {
-

{paciente.outro_id || "-"}

+

{paciente.legacy_code || "-"}

- +
-

{paciente.observacoes || "-"}

+

{paciente.notes || "-"}

@@ -219,15 +232,7 @@ const Details = () => {

-

)}
-
- - setSelectedFile(e.target.files[0])} accept="image/*"/> - {selectedFile && {selectedFile.name}} - -
+ @@ -238,23 +243,19 @@ const Details = () => {
-

{paciente.tipoSanguineo || "-"}

+

{paciente.blood_type || "-"}

-

{paciente.peso || "-"}

+

{paciente.weight_kg || "-"}

-

{paciente.altura || "-"}

+

{paciente.height_m || "-"}

-

{paciente.imc || "-"}

-
-
- -

{paciente.alergias || "-"}

+

{paciente.bmi || "-"}

@@ -288,7 +289,7 @@ const Details = () => {
- +
@@ -302,31 +303,31 @@ const Details = () => {
-

{paciente.endereco?.cep || "-"}

+

{paciente.cep || "-"}

-

{paciente.endereco?.logradouro || "-"}

+

{paciente.street || "-"}

-

{paciente.endereco?.bairro || "-"}

+

{paciente.neighborhood || "-"}

-

{paciente.endereco?.cidade || "-"}

+

{paciente.city || "-"}

-

{paciente.endereco?.estado || "-"}

+

{paciente.state || "-"}

-

{paciente.endereco?.numero || "-"}

+

{paciente.number || "-"}

-

{paciente.endereco?.complemento || "-"}

+

{paciente.complement || "-"}

@@ -338,19 +339,19 @@ const Details = () => {
-

{paciente.contato?.email || "-"}

+

{paciente.email || "-"}

-

{paciente.contato?.celular || "-"}

+

{paciente.phone_mobile || "-"}

-

{paciente.contato?.telefone2 || "-"}

+

{paciente.phone1 || "-"}

-

{paciente.contato?.telefone3 || "-"}

+

{paciente.phone2 || "-"}

diff --git a/src/pages/DoctorCadastroManager.jsx b/src/pages/DoctorCadastroManager.jsx index a4764fb..4b29732 100644 --- a/src/pages/DoctorCadastroManager.jsx +++ b/src/pages/DoctorCadastroManager.jsx @@ -4,11 +4,13 @@ import React, { useState } from 'react'; import { useAuth } from '../components/utils/AuthProvider'; import DoctorForm from '../components/doctors/DoctorForm'; import API_KEY from '../components/utils/apiKeys'; +import { Navigate, useNavigate } from 'react-router-dom'; function DoctorCadastroManager( ) { const [DoctorDict, setDoctorDict] = useState({}) - + const navigate = useNavigate(); + const { getAuthorizationHeader, isAuthenticated } = useAuth(); // Estado do modal de sucesso @@ -40,10 +42,10 @@ function DoctorCadastroManager( ) { try { const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1//doctors", requestOptions); - const result = await response.json(); - console.log("Médico salvo no backend:", result); - - return result; + + console.log("Médico salvo no backend:", response); + + return response; } catch (error) { console.error("Erro ao salvar Médico:", error); throw error; @@ -80,7 +82,7 @@ function DoctorCadastroManager( ) { {navigate('/medicos')}} formData={DoctorDict} setFormData={setDoctorDict} /> diff --git a/src/pages/DoctorDetails.jsx b/src/pages/DoctorDetails.jsx index e3182c7..ee270c9 100644 --- a/src/pages/DoctorDetails.jsx +++ b/src/pages/DoctorDetails.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react"; import avatarPlaceholder from '../assets/images/avatar_placeholder.png'; -import { useParams } from "react-router-dom"; +import { useParams,Link } from "react-router-dom"; import { GetDoctorByID } from "../components/utils/Functions-Endpoints/Doctor"; import { useAuth } from "../components/utils/AuthProvider"; @@ -34,9 +34,11 @@ const Details = ({setCurrentPage }) => {

MediConnect


- + + +
@@ -46,9 +48,11 @@ const Details = ({setCurrentPage }) => {

{doctor.cpf || "CPF"}

- + + +
diff --git a/src/pages/DoctorTable.jsx b/src/pages/DoctorTable.jsx index be2c0aa..b2f2b2c 100644 --- a/src/pages/DoctorTable.jsx +++ b/src/pages/DoctorTable.jsx @@ -4,7 +4,7 @@ import { useAuth } from "../components/utils/AuthProvider"; import { Link } from "react-router-dom"; function TableDoctor({ setCurrentPage, setPatientID }) { - const {getAuthorizationHeader, isAuthenticated} = useAuth(); + const {getAuthorizationHeader, isAuthenticated} = useAuth(); const [medicos, setMedicos] = useState([]); const [search, setSearch] = useState(""); @@ -95,12 +95,14 @@ function TableDoctor({ setCurrentPage, setPatientID }) {

Médicos Cadastrados

- + + +
diff --git a/src/pages/EditPage.jsx b/src/pages/EditPage.jsx index 5b1ccda..56b2ac8 100644 --- a/src/pages/EditPage.jsx +++ b/src/pages/EditPage.jsx @@ -5,9 +5,10 @@ import PatientForm from '../components/patients/PatientForm' import {useEffect, useState} from 'react' import { GetByID } from '../components/utils/Functions-Endpoints/Patient' import API_KEY from '../components/utils/apiKeys' -import { useParams } from 'react-router-dom' +import {useNavigate, useParams } from 'react-router-dom' import { useAuth } from '../components/utils/AuthProvider' const EditPage = ( {id, setCurrentPage}) => { + const navigate = useNavigate() const Parametros = useParams() const [PatientToPUT, setPatientPUT] = useState({}) @@ -53,10 +54,18 @@ const HandlePutPatient = async () => { const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients?id=eq.${PatientID}`,requestOptions); // se o backend retorna JSON - const result = await response.json(); - console.log("ATUALIZADO COM SUCESSO", result); - - return result; + console.log("Resposta do servidor:", response.ok); + if(response.ok === false){ + const errorText = await response.text(); + console.error("Erro ao atualizar paciente:", errorText); + } + else{ + + console.log("ATUALIZADO COM SUCESSO"); + navigate('/pacientes') + } + + return response; } catch (error) { console.error("Erro ao atualizar paciente:", error); throw error; diff --git a/src/pages/Inicio.jsx b/src/pages/Inicio.jsx index f383422..68c91de 100644 --- a/src/pages/Inicio.jsx +++ b/src/pages/Inicio.jsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import { FaUser, FaUserPlus, FaCalendarAlt, FaCalendarCheck } from 'react-icons/fa'; import './style/Inicio.css'; import { useAuth } from '../components/utils/AuthProvider'; +import { Link } from 'react-router-dom'; function Inicio({ setCurrentPage }) { const {setAuthTokens} = useAuth() @@ -10,8 +11,6 @@ function Inicio({ setCurrentPage }) { useEffect(() => { - - var myHeaders = new Headers(); myHeaders.append("apikey", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl1YW5xZnN3aGJlcmtvZXZ0bWZyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTQ5NTQzNjksImV4cCI6MjA3MDUzMDM2OX0.g8Fm4XAvtX46zifBZnYVH4tVuQkqUH6Ia9CXQj4DztQ"); diff --git a/src/pages/PatientCadastroManager.jsx b/src/pages/PatientCadastroManager.jsx index 08d2fc2..300e261 100644 --- a/src/pages/PatientCadastroManager.jsx +++ b/src/pages/PatientCadastroManager.jsx @@ -2,8 +2,10 @@ import {useState} from 'react'; import PatientForm from '../components/patients/PatientForm'; import API_KEY from '../components/utils/apiKeys'; import { useAuth } from '../components/utils/AuthProvider'; +import { useNavigate } from 'react-router-dom'; function PatientCadastroManager( {setCurrentPage} ) { - + const navigate = useNavigate() + const [showModal, setShowModal] = useState(false); const { getAuthorizationHeader, isAuthenticated } = useAuth(); const [formData, setFormData] = useState({}) @@ -11,7 +13,6 @@ function PatientCadastroManager( {setCurrentPage} ) { const handleSavePatient = async (patientData) => { const authHeader = getAuthorizationHeader(); - var myHeaders = new Headers(); myHeaders.append("Content-Type", "application/json"); myHeaders.append("apikey", API_KEY) @@ -30,34 +31,72 @@ function PatientCadastroManager( {setCurrentPage} ) { redirect: 'follow' }; + + // 23505 - cpf duplicadoo + // 23514 - cpf invalido try { const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients", requestOptions); - const result = await response.json(); - console.log("Paciente salvo no backend:", result); - - return result; - } catch (error) { - console.error("Erro ao salvar paciente:", error); - throw error; + console.log(response.ok, 'aqui') + + if(response.ok === false){ + const data = await response.json(); + console.log("Erro ao salvar paciente:", data); + if (data.code === "23505") { + setShowModal(true); + } } + else{ + + console.log("ATUALIZADO COM SUCESSO"); + navigate('/pacientes') + } + } catch (error) { + console.error("Erro ao salvar paciente:", error); + throw error; + } }; return ( <>
+ + {showModal &&( +
+
+
+
+
Ops! Este CPF já está cadastrado
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
)} +

Cadastro de Pacientes

- {/* Aqui está a lógica principal: */} - {/* Se a view for 'list', mostramos a lista com o botão. */} - {/* Se for 'form', mostramos o formulário de cadastro. */} - {setCurrentPage('table')}} + onCancel={() => {navigate('/pacientes')}} formData={formData} setFormData={setFormData} />