import "react-pdf/dist/Page/TextLayer.css"; import "react-pdf/dist/Page/AnnotationLayer.css"; import { convertFileSrc } from "@tauri-apps/api/core"; import "./PdfViewer.css"; import type { PDFDocumentProxy } from "pdfjs-dist"; import { useEffect, useRef, useState } from "react"; import { Document, Page } from "react-pdf"; import { useContainerSize } from "../../hooks/useContainerQuery"; import { fireAndForget } from "../../lib/fireAndForget"; fireAndForget( import("react-pdf").then(({ pdfjs }) => { pdfjs.GlobalWorkerOptions.workerSrc = new URL( "pdfjs-dist/build/pdf.worker.min.mjs", import.meta.url, ).toString(); }), ); interface Props { bodyPath?: string; data?: Uint8Array; } const options = { cMapUrl: "/cmaps/", standardFontDataUrl: "/standard_fonts/", }; export function PdfViewer({ bodyPath, data }: Props) { const containerRef = useRef(null); const [numPages, setNumPages] = useState(); const [src, setSrc] = useState(); const { width: containerWidth } = useContainerSize(containerRef); useEffect(() => { if (bodyPath) { setSrc(convertFileSrc(bodyPath)); } else if (data) { // Create a copy to avoid "Buffer is already detached" errors // This happens when the ArrayBuffer is transferred/detached elsewhere const dataCopy = new Uint8Array(data); setSrc({ data: dataCopy }); } else { setSrc(undefined); } }, [bodyPath, data]); const onDocumentLoadSuccess = ({ numPages: nextNumPages }: PDFDocumentProxy): void => { setNumPages(nextNumPages); }; return (
{Array.from({ length: numPages ?? 0 }, (_, index) => ( ))}
); }