"use client" import { useState, useEffect, useMemo } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { toast } from "@/hooks/use-toast" import { FileText, Download, Eye, Calendar, User, X, Loader2 } from "lucide-react" import Sidebar from "@/components/Sidebar" import { useAuthLayout } from "@/hooks/useAuthLayout" import { reportsApi } from "@/services/reportsApi.mjs" interface Report { id: string; order_number: string; patient_id: string; status: string; exam: string; requested_by: string; cid_code: string; diagnosis: string; conclusion: string; content_html: string; content_json: any; hide_date: boolean; hide_signature: boolean; due_at: string; created_by: string; updated_by: string; created_at: string; updated_at: string; } export default function ReportsPage() { const [reports, setReports] = useState([]) const [selectedReport, setSelectedReport] = useState(null) const [isViewModalOpen, setIsViewModalOpen] = useState(false) const [isLoading, setIsLoading] = useState(true) const requiredRole = useMemo(() => ["paciente"], []); const { user, isLoading: isAuthLoading } = useAuthLayout({ requiredRole }); useEffect(() => { if (user) { const fetchReports = async () => { try { setIsLoading(true); const fetchedReports = await reportsApi.getReports(user.id); setReports(fetchedReports); } catch (error) { console.error("Erro ao buscar laudos:", error) toast({ title: "Erro ao buscar laudos", description: "Não foi possível carregar os laudos. Tente novamente.", variant: "destructive", }) } finally { setIsLoading(false); } } fetchReports() } }, [user?.id]) const handleViewReport = (reportId: string) => { const report = reports.find((r) => r.id === reportId) if (report) { setSelectedReport(report) setIsViewModalOpen(true) } } const handleDownloadReport = async (reportId: string) => { const report = reports.find((r) => r.id === reportId) if (!report) return try { toast({ title: "Preparando download...", description: "Gerando PDF do laudo médico", }) const htmlContent = report.content_html; const blob = new Blob([htmlContent], { type: "text/html" }) const url = URL.createObjectURL(blob) const link = document.createElement("a") link.href = url link.download = `laudo-${report.order_number}.html` document.body.appendChild(link) link.click() document.body.removeChild(link) URL.revokeObjectURL(url) toast({ title: "Download concluído!", description: "O laudo foi baixado com sucesso", }) } catch (error) { console.error("Erro ao baixar laudo:", error) toast({ title: "Erro no download", description: "Não foi possível baixar o laudo. Tente novamente.", variant: "destructive", }) } } const handleCloseModal = () => { setIsViewModalOpen(false) setSelectedReport(null) } const availableReports = reports.filter((report) => report.status.toLowerCase() === "draft") const pendingReports = reports.filter((report) => report.status.toLowerCase() !== "draft") if (isLoading || isAuthLoading) { return (
) } return (

Meus Laudos

Visualize e baixe seus laudos médicos e resultados de exames

Total de Laudos
{reports.length}
Disponíveis
{availableReports.length}
Pendentes
{pendingReports.length}
{availableReports.length > 0 && (

Laudos Disponíveis

{availableReports.map((report) => (
{report.exam} {report.requested_by} {new Date(report.created_at).toLocaleDateString("pt-BR")}
Finalizado

{report.diagnosis}

))}
)} {pendingReports.length > 0 && (

Laudos Pendentes

{pendingReports.map((report) => (
{report.exam} {report.requested_by} {new Date(report.created_at).toLocaleDateString("pt-BR")}
{report.status}

{report.diagnosis}

Laudo em processamento. Você será notificado quando estiver disponível.

))}
)} {reports.length === 0 && !isLoading && (

Nenhum laudo encontrado

Seus laudos médicos aparecerão aqui após a realização de exames.

)}
{selectedReport?.exam} {selectedReport?.order_number}
{selectedReport && (
)}
) }