'use client'; import * as React from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogClose, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { ChevronLeft, ChevronRight, ZoomIn, ZoomOut, Download, Loader2, Maximize, Minimize, } from 'lucide-react'; import { Document, Page, pdfjs } from 'react-pdf'; import 'react-pdf/dist/esm/Page/AnnotationLayer.css'; import 'react-pdf/dist/esm/Page/TextLayer.css'; import { cn } from '@/lib/utils'; // Configure the worker to load pdfs. pdfjs.GlobalWorkerOptions.workerSrc = `/pdf.worker.min.js`; interface PdfViewerProps { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; fileUrl: string; fileName: string; } export function PdfViewer({ isOpen, onOpenChange, fileUrl, fileName, }: PdfViewerProps) { const [numPages, setNumPages] = React.useState(null); const [pageNumber, setPageNumber] = React.useState(1); const [scale, setScale] = React.useState(1.0); const [isLoading, setIsLoading] = React.useState(true); const [isFullscreen, setIsFullscreen] = React.useState(false); const viewerRef = React.useRef(null); function onDocumentLoadSuccess({ numPages }: { numPages: number }) { setNumPages(numPages); setPageNumber(1); setIsLoading(false); } function onDocumentLoadError(error: Error) { console.error('Failed to load PDF:', error); setIsLoading(false); } const goToPrevPage = () => { setPageNumber((prevPageNumber) => Math.max(prevPageNumber - 1, 1)); }; const goToNextPage = () => { setPageNumber((prevPageNumber) => Math.min(prevPageNumber + 1, numPages || 1) ); }; const zoomIn = () => { setScale((prevScale) => Math.min(prevScale + 0.2, 3)); }; const zoomOut = () => { setScale((prevScale) => Math.max(prevScale - 0.2, 0.5)); }; const toggleFullscreen = () => { if (!viewerRef.current) return; if (!document.fullscreenElement) { viewerRef.current.requestFullscreen().catch(err => { console.error(`Error attempting to enable full-screen mode: ${err.message} (${err.name})`); }); } else { document.exitFullscreen(); } }; React.useEffect(() => { const handleFullscreenChange = () => { setIsFullscreen(!!document.fullscreenElement); }; document.addEventListener('fullscreenchange', handleFullscreenChange); return () => document.removeEventListener('fullscreenchange', handleFullscreenChange); }, []); React.useEffect(() => { if (isOpen) { setIsLoading(true); setNumPages(null); setPageNumber(1); setScale(1.0); } }, [isOpen, fileUrl]); return (
{fileName}
{isLoading && (
)}
{Math.round(scale * 100)}%
Page {pageNumber} of {numPages || '...'}
); }