// src/pages/LaudoManager.jsx import React, { useState, useEffect } from "react"; import "./LaudoStyle.css"; // Importa o CSS externo /* ===== Mock data (simula APIDOG) ===== */ function mockFetchLaudos() { return [ { id: "LAU-300551296", pedido: 300551296, data: "29/07/2025", paciente: { nome: "Sarah Mariana Oliveira", cpf: "616.869.070-**", nascimento: "1990-03-25", convenio: "Unimed" }, solicitante: "Sandro Rangel Santos", exame: "US - Abdome Total", conteudo: "RELATÓRIO MÉDICO\n\nAchados: Imagens compatíveis com ...\nConclusão: Órgãos sem alterações significativas.", status: "rascunho" }, { id: "LAU-300659170", pedido: 300659170, data: "29/07/2025", paciente: { nome: "Laissa Helena Marquetti", cpf: "950.684.57-**", nascimento: "1986-09-12", convenio: "Bradesco" }, solicitante: "Sandro Rangel Santos", exame: "US - Mamária Bilateral", conteudo: "RELATÓRIO MÉDICO\n\nAchados: text...", status: "liberado" }, { id: "LAU-300658301", pedido: 300658301, data: "28/07/2025", paciente: { nome: "Vera Lúcia Oliveira Santos", cpf: "928.005.**", nascimento: "1979-02-02", convenio: "Particular" }, solicitante: "Dr. Fulano", exame: "US - Transvaginal", conteudo: "RELATÓRIO MÉDICO\n\nAchados: ...", status: "entregue" } ]; } function mockDeleteLaudo(id) { return new Promise((res) => setTimeout(() => res({ ok: true }), 500)); } /* ===== Componente ===== */ export default function LaudoManager() { const [laudos, setLaudos] = useState([]); const [openDropdownId, setOpenDropdownId] = useState(null); /* viewerLaudo é usado para mostrar o editor/leitura; previewLaudo é usado para a pré-visualização (sem bloquear) */ const [viewerLaudo, setViewerLaudo] = useState(null); const [previewLaudo, setPreviewLaudo] = useState(null); const [showPreview, setShowPreview] = useState(false); const [showConfirmDelete, setShowConfirmDelete] = useState(false); const [toDelete, setToDelete] = useState(null); const [loadingDelete, setLoadingDelete] = useState(false); /* notificação simples (sem backdrop) para 'sem permissão' */ const [showNoPermission, setShowNoPermission] = useState(false); /* pesquisa */ const [query, setQuery] = useState(""); /* Para simplificar: eu assumo aqui que estamos na visão da secretaria */ const isSecretary = true; // permanece true (somente leitura) useEffect(() => { // Importa os dados mock apenas const data = mockFetchLaudos(); setLaudos(data); }, []); // Fecha dropdown ao clicar fora useEffect(() => { function onDocClick(e) { if (e.target.closest && e.target.closest('.action-btn')) return; if (e.target.closest && e.target.closest('.dropdown')) return; setOpenDropdownId(null); } document.addEventListener('click', onDocClick); return () => document.removeEventListener('click', onDocClick); }, []); function toggleDropdown(id, e) { e.stopPropagation(); setOpenDropdownId(prev => (prev === id ? null : id)); } /* (botao editar) */ function handleOpenViewer(laudo) { setOpenDropdownId(null); if (isSecretary) { // (notificação sem bloquear) setShowNoPermission(true); return; } setViewerLaudo(laudo); } /* (botao imprimir) */ function handlePrint(laudo) { // evitar bug: fechar viewer antes de abrir preview setViewerLaudo(null); setPreviewLaudo(laudo); setShowPreview(true); setOpenDropdownId(null); } /* (botao excluir) */ function handleRequestDelete(laudo) { setToDelete(laudo); setOpenDropdownId(null); setShowConfirmDelete(true); } /* (funcionalidade do botao de excluir) */ async function doConfirmDelete(confirm) { if (!toDelete) return; if (!confirm) { setShowConfirmDelete(false); setToDelete(null); return; } setLoadingDelete(true); try { const resp = await mockDeleteLaudo(toDelete.id); if (resp.ok || resp === true) { // removo o laudo da lista local setLaudos(curr => curr.filter(l => l.id !== toDelete.id)); setShowConfirmDelete(false); setToDelete(null); alert("Laudo excluído com sucesso."); } else { alert("Erro ao excluir. Tente novamente."); } } catch (err) { alert("Erro de rede ao excluir."); } finally { setLoadingDelete(false); } } /* filtro de pesquisa (por pedido ou nome do paciente) */ const normalized = (s = "") => String(s).toLowerCase(); const filteredLaudos = laudos.filter(l => { const q = normalized(query).trim(); if (!q) return true; if (normalized(l.pedido).includes(q)) return true; if (normalized(l.paciente?.nome).includes(q)) return true; return false; }); return (
{line}
))}