'use client' import React, { useState } from 'react' import dynamic from 'next/dynamic' import { MagnifyingGlassPlus, MagnifyingGlassMinus, ArrowLeft, ArrowRight } from '@phosphor-icons/react' // Dynamically import react-pdf with no SSR const Document = dynamic( () => import('react-pdf').then((mod) => mod.Document), { ssr: false } ) const Page = dynamic( () => import('react-pdf').then((mod) => mod.Page), { ssr: false } ) // Configure PDF.js worker if (typeof window !== 'undefined') { import('react-pdf').then((pdfjs) => { pdfjs.pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.pdfjs.version}/build/pdf.worker.min.mjs` }) } interface PDFViewerProps { url: string scale: number onZoomIn: () => void onZoomOut: () => void } export function PDFViewer({ url, scale, onZoomIn, onZoomOut }: PDFViewerProps) { const [numPages, setNumPages] = useState(null) const [pageNumber, setPageNumber] = useState(1) const [error, setError] = useState(null) const [isLoading, setIsLoading] = useState(true) const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => { setNumPages(numPages) setPageNumber(1) setError(null) setIsLoading(false) } const changePage = (offset: number) => { setPageNumber(prevPageNumber => { const newPageNumber = prevPageNumber + offset if (newPageNumber < 1 || newPageNumber > (numPages || 1)) { return prevPageNumber } return newPageNumber }) } if (!url) { return
No PDF to display
} return (
{Math.round(scale * 100)}% {numPages && ( <>
Page {pageNumber} of {numPages} )}
{typeof window !== 'undefined' && url && ( { console.warn('PDF load error:', err) setError('Unable to load PDF. The file might be corrupted or in an unsupported format.') setIsLoading(false) }} loading={
Loading PDF...
} error={
Failed to load PDF
{error || 'The file might be corrupted or in an unsupported format.'}
} className="flex justify-center" > {!isLoading && !error && (
Loading page...
} /> )} )}
) }