forked from RiseUP/riseup-squad23
146 lines
5.7 KiB
JavaScript
146 lines
5.7 KiB
JavaScript
import React, { useState, useEffect, useCallback } from "react";
|
|
import { Link } from "react-router-dom";
|
|
|
|
const ENDPOINT_LISTAR = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_availability";
|
|
|
|
const DisponibilidadesDoctorPage = () => {
|
|
const [disponibilidades, setDisponibilidades] = useState([]);
|
|
const [loading, setLoading] = useState(false);
|
|
const [filtroMedicoId, setFiltroMedicoId] = useState("");
|
|
const [filtroActive, setFiltroActive] = useState("true");
|
|
const [medicoValido, setMedicoValido] = useState(false);
|
|
|
|
const fetchDisponibilidades = useCallback(async (doctorId, activeStatus) => {
|
|
setLoading(true);
|
|
let url = `${ENDPOINT_LISTAR}?select=*`;
|
|
if (doctorId) url += `&doctor_id=eq.${doctorId}`;
|
|
if (activeStatus === "true" || activeStatus === "false") url += `&active=eq.${activeStatus}`;
|
|
|
|
try {
|
|
const response = await fetch(url);
|
|
const result = await response.json();
|
|
setDisponibilidades(Array.isArray(result) ? result : []);
|
|
setMedicoValido(Array.isArray(result) && result.length > 0);
|
|
} catch (error) {
|
|
setDisponibilidades([]);
|
|
setMedicoValido(false);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (filtroMedicoId) {
|
|
fetchDisponibilidades(filtroMedicoId, filtroActive);
|
|
} else {
|
|
setDisponibilidades([]);
|
|
setMedicoValido(false);
|
|
}
|
|
}, [filtroMedicoId, filtroActive, fetchDisponibilidades]);
|
|
|
|
return (
|
|
<div id="main-content">
|
|
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
|
|
<h1 style={{ fontSize: "1.5rem", fontWeight: "bold", color: "#333" }}>
|
|
Disponibilidades por Médico
|
|
</h1>
|
|
<Link
|
|
to={medicoValido ? `../medicos/${filtroMedicoId}/edit` : "#"}
|
|
className="btn-primary"
|
|
style={{
|
|
padding: "10px 20px",
|
|
fontSize: "14px",
|
|
whiteSpace: "nowrap",
|
|
textDecoration: "none",
|
|
display: "inline-block",
|
|
opacity: medicoValido ? 1 : 0.6,
|
|
pointerEvents: medicoValido ? "auto" : "none",
|
|
}}
|
|
>
|
|
+ Gerenciar Disponibilidades
|
|
</Link>
|
|
</div>
|
|
|
|
<div className="atendimento-eprocura">
|
|
<div className="busca-atendimento">
|
|
<div>
|
|
<i className="fa-solid fa-user-doctor"></i>
|
|
<input
|
|
type="text"
|
|
placeholder="Filtrar por ID do Médico..."
|
|
value={filtroMedicoId}
|
|
onChange={(e) => setFiltroMedicoId(e.target.value)}
|
|
style={{ border: "1px solid #ccc", borderRadius: "4px", padding: "5px" }}
|
|
/>
|
|
</div>
|
|
<div>
|
|
<i className="fa-solid fa-check-circle"></i>
|
|
<select
|
|
value={filtroActive}
|
|
onChange={(e) => setFiltroActive(e.target.value)}
|
|
style={{ padding: "8px", border: "1px solid #ccc", borderRadius: "4px" }}
|
|
>
|
|
<option value="true">Ativas</option>
|
|
<option value="false">Inativas</option>
|
|
<option value="">Todas</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<section className="calendario-ou-filaespera">
|
|
<div className="fila-container">
|
|
<h2 className="fila-titulo">
|
|
Disponibilidades Encontradas ({disponibilidades.length})
|
|
</h2>
|
|
|
|
{loading ? (
|
|
<p className="text-center py-10">Carregando disponibilidades...</p>
|
|
) : disponibilidades.length === 0 ? (
|
|
<p className="text-center py-10">
|
|
Nenhuma disponibilidade encontrada para os filtros aplicados.
|
|
</p>
|
|
) : (
|
|
<table className="fila-tabela" style={{ width: "100%", borderCollapse: "collapse" }}>
|
|
<thead>
|
|
<tr>
|
|
{["ID", "ID Médico", "Dia da Semana", "Início", "Término", "Intervalo (min)", "Tipo Consulta", "Status"].map(
|
|
(header) => (
|
|
<th
|
|
key={header}
|
|
style={{ padding: "10px", borderBottom: "2px solid #ddd", textAlign: "left" }}
|
|
>
|
|
{header}
|
|
</th>
|
|
)
|
|
)}
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{disponibilidades.map((disp, index) => (
|
|
<tr key={disp.id || index} style={{ borderBottom: "1px solid #eee" }}>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.id || "N/A"}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.doctor_id}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.weekday}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.start_time || "N/A"}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.end_time || "N/A"}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.slot_minutes}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>{disp.appointment_type}</td>
|
|
<td style={{ padding: "10px", fontSize: "0.9em" }}>
|
|
<span className={`status-tag ${disp.active ? "legenda-item-realizado" : "legenda-item-cancelado"}`}>
|
|
{disp.active ? "Ativa" : "Inativa"}
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
)}
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default DisponibilidadesDoctorPage;
|