"use client"; import { useCallback, useMemo, useState } from "react"; import { Download, FileText, Image, Share2, Trash2, ShieldAlert, Clock, RefreshCw, MoreHorizontal, } from "lucide-react"; import { trpc } from "@/lib/trpc"; import { useToast } from "@/lib/toast"; import { DocumentStatus } from "@micprotocol/shared-types"; import { Button } from "@micprotocol/ui"; import { SectionHeader } from "@micprotocol/ui"; import { EmptyState } from "@micprotocol/ui"; import { Badge } from "@micprotocol/ui"; function DocumentTypeIcon({ mimeType }: { mimeType: string }) { if (mimeType === "application/pdf") return ; if (mimeType.startsWith("image/")) return ; return ; } function StatusBadge({ status }: { status: DocumentStatus }) { const config: Record = { draft: { color: "var(--text-tertiary)", bg: "var(--bg-tertiary)" }, active: { color: "var(--color-success)", bg: "color-mix(in srgb, var(--color-success) 12%, transparent)" }, revoked: { color: "var(--color-error)", bg: "color-mix(in srgb, var(--color-error) 12%, transparent)" }, flagged: { color: "var(--color-warning)", bg: "color-mix(in srgb, var(--color-warning) 12%, transparent)" }, quarantined: { color: "var(--color-destructive)", bg: "color-mix(in srgb, var(--color-destructive) 12%, transparent)" }, }; const c = config[status] || config.draft; return ( {status} ); } interface DocumentLibraryProps { workspaceId?: string; } export default function DocumentLibrary({ workspaceId }: DocumentLibraryProps) { const [search, setSearch] = useState(""); const [statusFilter, setStatusFilter] = useState(undefined); const { success, error } = useToast(); const { data, isLoading, refetch } = trpc.documents.list.useQuery( { search: search || undefined, status: statusFilter, page: 1, limit: 50, }, { retry: false, refetchOnWindowFocus: false } ); const removeDocument = trpc.documents.delete.useMutation({ onSuccess: () => { refetch(); success("Document deleted"); }, onError: (err) => { error(err.message || "Failed to delete document"); }, }); const documents = data?.items ?? []; const total = data?.total ?? 0; const handleDelete = useCallback( (id: string) => { if (window.confirm("Are you sure you want to delete this document?")) { removeDocument.mutate({ documentId: id }); } }, [removeDocument] ); return (
{/* KPI Cards */}
Total Documents
{total}
Active
{documents.filter((d) => d.status === "active").length}
Flagged
{documents.filter((d) => d.isForgeryFlagged).length}
Quarantined
{documents.filter((d) => d.status === "quarantined").length}
{/* Document List */}
setSearch(e.target.value)} placeholder="Search documents..." style={{ flex: 1, fontSize: "var(--text-sm)", padding: "var(--space-2) var(--space-3)" }} />
{isLoading && (
Loading documents...
)} {!isLoading && documents.length === 0 && ( } title="No documents yet" subtitle="Upload your first document to get started" /> )} {!isLoading && documents.length > 0 && ( {documents.map((doc: any) => ( ))}
Document Type Size Status Shares Actions
{doc.title}
{doc.description && (
{doc.description}
)}
{doc.mimeType.split("/").pop()?.toUpperCase()} {(doc.sizeBytes / 1024 / 1024).toFixed(2)} MB {doc.isForgeryFlagged && ( Flagged )} {doc.versionCount ?? 1}
)}
); }