"use client" import { Document, Page, pdfjs } from "react-pdf" import { useCallback, useState } from "react" import "react-pdf/dist/Page/AnnotationLayer.css" import "react-pdf/dist/Page/TextLayer.css" // Configure PDF.js worker to use local package pdfjs.GlobalWorkerOptions.workerSrc = new URL( "pdfjs-dist/build/pdf.worker.min.mjs", import.meta.url, ).toString() interface PdfViewerProps { url: string | null | undefined } export function PdfViewer({ url }: PdfViewerProps) { const [numPages, setNumPages] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [retryKey, setRetryKey] = useState(0) if (!url) { return (
No PDF URL provided
) } function onDocumentLoadSuccess({ numPages }: { numPages: number }) { setNumPages(numPages) setLoading(false) setError(null) } // On first failure, wait briefly then force a re-mount of the Document // component to retry (covers transient R2 timing issues). // On second failure, give up and show the error state. const onDocumentLoadError = useCallback( (err: Error) => { if (retryKey === 0) { setTimeout(() => { setRetryKey(1) setLoading(true) setError(null) }, 500) return } setError(err.message || "Failed to load PDF") setLoading(false) }, [retryKey], ) return (
{loading && (
Loading PDF…
)} {error && (
Error: {error}
)}
{numPages && (
{Array.from(new Array(numPages), (_, index) => ( ))}
)}
) }