From 06905af34d8bf46b5a50bc6be4f2a8eeb69c19a2 Mon Sep 17 00:00:00 2001 From: Eduarda-SS <137419071+Eduarda-SS@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:27:18 -0300 Subject: [PATCH] Tratamento de erros da API --- src/assets/utils/apiHandler.jsx | 10 ++++ src/pages/Details.jsx | 41 +++++++++++++++-- src/pages/DoctorDetails.jsx | 38 +++++++++++++++- src/pages/DoctorEditPage.jsx | 76 +++++++++++++++++++++++++++---- src/pages/DoctorTable.jsx | 56 ++++++++++++++++++++--- src/pages/EditPage.jsx | 58 +++++++++++++++++++---- src/pages/Inicio.jsx | 44 ++++++++++++++++++ src/pages/Table.jsx | 81 +++++++++++++++++++++++++-------- 8 files changed, 353 insertions(+), 51 deletions(-) diff --git a/src/assets/utils/apiHandler.jsx b/src/assets/utils/apiHandler.jsx index e69de29..5e753b4 100644 --- a/src/assets/utils/apiHandler.jsx +++ b/src/assets/utils/apiHandler.jsx @@ -0,0 +1,10 @@ +export async function handleApiResponse(response) { + const data = await response.json(); + + if (!response.ok) { + // Throw the full error object (parsed JSON) so catch can handle it + throw data; + } + + return data; // Success case +} diff --git a/src/pages/Details.jsx b/src/pages/Details.jsx index 59cf032..eabbad7 100644 --- a/src/pages/Details.jsx +++ b/src/pages/Details.jsx @@ -1,23 +1,56 @@ import React, { useEffect, useState } from "react"; import avatarPlaceholder from '../assets/images/avatar_placeholder.png'; +import handleApiResponse from '../assets/utils/apiHandler'; const Details = ({ patientID, setCurrentPage }) => { const [paciente, setPaciente] = useState({}); + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); useEffect(() => { if (!patientID) return; fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${patientID}`) .then(res => res.json()) - - .then(result => {setPaciente(result.data)}) - .catch(err => console.error("Erro ao buscar paciente:", err)); + // .then(result => {setPaciente(result.data)}) + // .catch(err => console.error("Erro ao buscar paciente:", err)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }, [patientID]); - + //if (!paciente) return

Carregando...

; return ( <> + {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: + +
+ ))} +
+ )}

MediConnect


diff --git a/src/pages/DoctorDetails.jsx b/src/pages/DoctorDetails.jsx index 25a26e4..823b1be 100644 --- a/src/pages/DoctorDetails.jsx +++ b/src/pages/DoctorDetails.jsx @@ -1,22 +1,56 @@ import React, { useEffect, useState } from "react"; import avatarPlaceholder from '../assets/images/avatar_placeholder.png'; +import handleApiResponse from '../assets/utils/apiHandler'; const Details = ({ patientID, setCurrentPage }) => { const [paciente, setPaciente] = useState({}); + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); useEffect(() => { if (!patientID) return; fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${patientID}`) .then(res => res.json()) - .then(data => setPaciente(data)) - .catch(err => console.error("Erro ao buscar médico:", err)); + // .then(data => setPaciente(data)) + // .catch(err => console.error("Erro ao buscar médico:", err)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }, [patientID]); //if (!paciente) return

Carregando...

; return ( <> + {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )}

MediConnect


diff --git a/src/pages/DoctorEditPage.jsx b/src/pages/DoctorEditPage.jsx index f6467bf..6fd3a6a 100644 --- a/src/pages/DoctorEditPage.jsx +++ b/src/pages/DoctorEditPage.jsx @@ -1,12 +1,12 @@ import React from 'react' - import DoctorForm from '../components/doctors/DoctorForm' - +import handleApiResponse from '../assets/utils/apiHandler'; import {useEffect, useState} from 'react' const DoctorEditPage = ( {id}) => { - const [PatientToPUT, setPatientPUT] = useState({}) + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); var requestOptions = { method: 'GET', @@ -14,15 +14,51 @@ const DoctorEditPage = ( {id}) => { }; useEffect(() => { - - fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, requestOptions) .then(response => response.json()) - .then(result => result.data) - .then(data => console.log(data)) - .catch(error => console.log('error', error)); - + // .then(result => result.data) + // .then(data => console.log(data)) + // .catch(error => console.log('error', error)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); + + // .then(async (response) => { + // const data = await response.json(); + // if (!response.ok) { + // // response is 400, 401, 500 etc. + // throw data; // throw the parsed JSON error so it goes to catch + // } + + // return data; // return success data + // }) + // .then((result) => { + // console.log("Success data:", result); + // // here you would setState with result + // }) + // .catch((error) => { + // // error is the parsed JSON from the API + // console.error("API error:", error); + + // // Example: show main message + // alert(error.message); + + // // Example: show field errors if available + // if (error.details) { + // Object.entries(error.details).forEach(([field, messages]) => { + // console.log(`${field}:`, messages); + // }); + // } + // }); }, []) + const HandlePutPatient = () => { console.log('médico atualizado') @@ -33,7 +69,27 @@ fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, requestOpt return (
- + {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )} diff --git a/src/pages/DoctorTable.jsx b/src/pages/DoctorTable.jsx index b834137..1ee7ec1 100644 --- a/src/pages/DoctorTable.jsx +++ b/src/pages/DoctorTable.jsx @@ -1,9 +1,12 @@ import React, { useState, useEffect } from "react"; +import handleApiResponse from '../assets/utils/apiHandler'; function TableDoctor({ setCurrentPage, setPatientID }) { const [medicos, setMedicos] = useState([]); const [search, setSearch] = useState(""); const [filtroAniversariante, setFiltroAniversariante] = useState(false); + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); // Função para excluir médicos const deleteDoctor = async (id) => { @@ -16,8 +19,18 @@ function TableDoctor({ setCurrentPage, setPatientID }) { requestOptionsDelete ) .then((response) => response.text()) - .then((mensage) => console.log(mensage)) - .catch((error) => console.log("Deu problema", error)); + // .then((mensage) => console.log(mensage)) + // .catch((error) => console.log("Deu problema", error)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }; // Função para verificar se hoje é aniversário @@ -36,10 +49,20 @@ function TableDoctor({ setCurrentPage, setPatientID }) { useEffect(() => { fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes") .then((response) => response.json()) - .then((result) => setMedicos(result["data"])) - .catch((error) => - console.log("Erro para encontrar médicos no banco de dados", error) - ); + // .then((result) => setMedicos(result["data"])) + // .catch((error) => + // console.log("Erro para encontrar médicos no banco de dados", error) + // ); + .then(handleApiResponse) + .then((data) => { + setMedicos(result[data]); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }, []); // Filtrar médicos pelo campo de pesquisa e aniversariantes @@ -53,6 +76,27 @@ function TableDoctor({ setCurrentPage, setPatientID }) { return ( <> + {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )}

Lista de Médicos

diff --git a/src/pages/EditPage.jsx b/src/pages/EditPage.jsx index b204fd9..09263e0 100644 --- a/src/pages/EditPage.jsx +++ b/src/pages/EditPage.jsx @@ -1,11 +1,11 @@ import React from 'react' - -import PatientForm from '../components/patients/PatientForm' - import {useEffect, useState} from 'react' +import PatientForm from '../components/patients/PatientForm' +import handleApiResponse from '../assets/utils/apiHandler'; const EditPage = ( {id}) => { - + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); const [PatientToPUT, setPatientPUT] = useState({}) var requestOptions = { @@ -18,9 +18,19 @@ useEffect(() => { fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, requestOptions) .then(response => response.json()) - .then(result => result.data) - .then(data => setPatientPUT(data)) - .catch(error => console.log('error', error)); + // .then(result => result.data) + // .then(data => setPatientPUT(data)) + // .catch(error => console.log('error', error)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }, []) @@ -43,8 +53,18 @@ var requestOptions = { fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes/", requestOptions) .then(response => response.text()) - .then(result => console.log('ATUALIZADO COM SUCESSO',result)) - .catch(error => console.log('error', error)); + // .then(result => console.log('ATUALIZADO COM SUCESSO',result)) + // .catch(error => console.log('error', error)); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); } @@ -52,7 +72,27 @@ fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes/", requestOptions) return (
+ {errorMessage && ( +
+ {errorMessage} +
+ )} + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )} { const fetchPacientes = async () => { try { const res = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes"); + if (!response.ok) { + const errorData = await response.json(); + setErrorMessage(errorData.message || "Erro desconhecido"); + if (errorData.details) { + setFieldErrors(errorData.details); + } + return; + } const data = await res.json(); setPacientes(data.data); + setErrorMessage(""); + setFieldErrors({}); } catch (error) { console.error("Erro ao buscar pacientes:", error); + setErrorMessage("Falha na comunicação com o servidor"); } }; const fetchAgendamentos = async () => { try { const res = await fetch(); + if (!response.ok) { + const errorData = await response.json(); + setErrorMessage(errorData.message || "Erro desconhecido"); + if (errorData.details) { + setFieldErrors(errorData.details); + } + return; + } const data = await res.json(); setAgendamentos(data.data); } catch (error) { console.error("Erro ao buscar agendamentos:", error); + setErrorMessage("Falha na comunicação com o servidor"); } }; @@ -48,6 +70,28 @@ function Inicio({ setCurrentPage }) {
+ {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )} +
diff --git a/src/pages/Table.jsx b/src/pages/Table.jsx index 1ad96dd..745aa1f 100644 --- a/src/pages/Table.jsx +++ b/src/pages/Table.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from "react"; +import handleApiResponse from '../assets/utils/apiHandler'; function TablePaciente({ setCurrentPage, setPatientID }) { const [pacientes, setPacientes] = useState([]); @@ -6,8 +7,9 @@ function TablePaciente({ setCurrentPage, setPatientID }) { const [filtroConvenio, setFiltroConvenio] = useState("Todos"); const [filtroVIP, setFiltroVIP] = useState(false); const [filtroAniversariante, setFiltroAniversariante] = useState(false); - - + const [errorMessage, setErrorMessage] = useState(""); + const [fieldErrors, setFieldErrors] = useState({}); + const GetAnexos = async (id) => { var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); @@ -20,29 +22,32 @@ function TablePaciente({ setCurrentPage, setPatientID }) { try { const response = await fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}/anexos`, requestOptions); const result = await response.json(); - + if (!response.ok) { + const errorData = await response.json(); + setErrorMessage(errorData.message || "Erro desconhecido"); + if (errorData.details) { + setFieldErrors(errorData.details); + } + return; + } + setErrorMessage(""); + setFieldErrors({}); return result.data; // agora retorna corretamente } catch (error) { console.log('error', error); + setErrorMessage("Falha na comunicação com o servidor"); return []; } - } - - const DeleteAnexo = async (patientID) => { - - - const RespostaGetAnexos = await GetAnexos(patientID) + const RespostaGetAnexos = await GetAnexos(patientID) for(let i = 0; i < RespostaGetAnexos.length; i++){ const idAnexo = RespostaGetAnexos[i].id; console.log('anexos',RespostaGetAnexos) - - var myHeaders = new Headers(); myHeaders.append("Authorization", "Bearer "); @@ -69,9 +74,6 @@ function TablePaciente({ setCurrentPage, setPatientID }) { DeleteAnexo(id) - - - const requestOptionsDelete = { method: "DELETE", redirect: "follow" }; if (!window.confirm("Tem certeza que deseja excluir este paciente?")) return; @@ -117,22 +119,40 @@ function TablePaciente({ setCurrentPage, setPatientID }) { } ) .then((response) => response.json()) + .then(handleApiResponse) .then(() => { setPacientes((prev) => prev.map((p) => (p.id === id ? { ...p, convenio } : p)) ); + setErrorMessage(""); + setFieldErrors({}); }) - .catch((error) => console.log("Erro ao atualizar convênio:", error)); + // .catch((error) => console.log("Erro ao atualizar convênio:", error)); + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); }; // Requisição inicial para buscar pacientes useEffect(() => { fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes") - .then((response) => response.json()) - .then((result) => setPacientes(result["data"])) - .catch((error) => - console.log("Erro para encontrar pacientes no banco de dados", error) - ); + // .then((response) => response.json()) + // .then((result) => setPacientes(result["data"])) + // .catch((error) => + // console.log("Erro para encontrar pacientes no banco de dados", error) + // ); + .then(handleApiResponse) + .then((data) => { + setPaciente(data); + setErrorMessage(""); + setFieldErrors({}); + }) + .catch((error) => { + setErrorMessage(error.message || "Erro desconhecido"); + setFieldErrors(error.details || {}); + }); + }, []); // Função para verificar se hoje é aniversário do paciente @@ -167,6 +187,27 @@ function TablePaciente({ setCurrentPage, setPatientID }) {

Lista de Pacientes

+ {errorMessage && ( +
+ {errorMessage} +
+ )} + + {/* Mensagens de erro específicas */} + {Object.keys(fieldErrors).length > 0 && ( +
+ {Object.entries(fieldErrors).map(([campo, mensagens]) => ( +
+ {campo}: +
    + {mensagens.map((msg, idx) => ( +
  • {msg}
  • + ))} +
+
+ ))} +
+ )}