import { useEffect, useState } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { toast } from "@/hooks/use-toast"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { Eye, Trash, Download, FolderOpen } from "lucide-react"; import { PatientUncheckedCreateInputObjectSchema, PdfFileUncheckedCreateInputObjectSchema, } from "@repo/db/usedSchemas"; import { DeleteConfirmationDialog } from "@/components/ui/deleteDialog"; import { PatientTable } from "@/components/patients/patient-table"; import { z } from "zod"; import { Sidebar } from "@/components/layout/sidebar"; import { TopAppBar } from "@/components/layout/top-app-bar"; const PatientSchema = ( PatientUncheckedCreateInputObjectSchema as unknown as z.ZodObject ).omit({ appointments: true, }); type Patient = z.infer; const PdfFileSchema = PdfFileUncheckedCreateInputObjectSchema as unknown as z.ZodObject; type PdfFile = z.infer; export default function DocumentsPage() { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [selectedPatient, setSelectedPatient] = useState(null); const [selectedGroupId, setSelectedGroupId] = useState(null); const [selectedPdfId, setSelectedPdfId] = useState(null); const [fileBlobUrl, setFileBlobUrl] = useState(null); const [isDeletePdfOpen, setIsDeletePdfOpen] = useState(false); const [currentPdf, setCurrentPdf] = useState(null); const toggleMobileMenu = () => setIsMobileMenuOpen((prev) => !prev); useEffect(() => { setSelectedGroupId(null); }, [selectedPatient]); const { data: groups = [] } = useQuery({ queryKey: ["groups", selectedPatient?.id], enabled: !!selectedPatient, queryFn: async () => { const res = await apiRequest( "GET", `/api/documents/pdf-groups/patient/${selectedPatient?.id}` ); return res.json(); }, }); const { data: groupPdfs = [] } = useQuery({ queryKey: ["groupPdfs", selectedGroupId], enabled: !!selectedGroupId, queryFn: async () => { const res = await apiRequest( "GET", `/api/documents/pdf-files/group/${selectedGroupId}` ); return res.json(); }, }); const deletePdfMutation = useMutation({ mutationFn: async (id: number) => { await apiRequest("DELETE", `/api/documents/pdf-files/${id}`); }, onSuccess: () => { setIsDeletePdfOpen(false); setCurrentPdf(null); if (selectedGroupId != null) { queryClient.invalidateQueries({ queryKey: ["groupPdfs", selectedGroupId], }); } toast({ title: "Success", description: "PDF deleted successfully!" }); }, onError: (error: any) => { toast({ title: "Error", description: error.message || "Failed to delete PDF", variant: "destructive", }); }, }); const handleConfirmDeletePdf = () => { if (currentPdf) { deletePdfMutation.mutate(currentPdf.id); } else { toast({ title: "Error", description: "No PDF selected for deletion.", variant: "destructive", }); } }; const handleViewPdf = async (pdfId: number) => { const res = await apiRequest("GET", `/api/documents/pdf-files/${pdfId}`); const arrayBuffer = await res.arrayBuffer(); const blob = new Blob([arrayBuffer], { type: "application/pdf" }); const url = URL.createObjectURL(blob); setFileBlobUrl(url); setSelectedPdfId(pdfId); }; const handleDownloadPdf = async (pdfId: number, filename: string) => { const res = await apiRequest("GET", `/api/documents/pdf-files/${pdfId}`); const arrayBuffer = await res.arrayBuffer(); const blob = new Blob([arrayBuffer], { type: "application/pdf" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; return (

Documents

View and manage recent uploaded claim PDFs

{selectedPatient && ( Document Groups for {selectedPatient.firstName}{" "} {selectedPatient.lastName} Select a group to view PDFs {groups.length === 0 ? (

No groups found for this patient.

) : ( groups.map((group: any) => ( )) )}
)} {selectedGroupId && ( PDFs in Group #{selectedGroupId} {groupPdfs.length === 0 ? (

No PDFs found in this group.

) : ( groupPdfs.map((pdf: any) => (
{pdf.filename}
)) )}
)} Patient Records Select a patient to view document groups setIsDeletePdfOpen(false)} entityName={`PDF #${currentPdf?.id}`} /> {fileBlobUrl && ( Viewing PDF #{selectedPdfId}