1+ // components/ui/pdfViewer.tsx
12"use client" ;
2- import { useState , useEffect , useCallback } from "react" ;
3- import { Viewer , Worker } from "@react-pdf-viewer/core" ;
4- import "@react-pdf-viewer/core/lib/styles/index.css" ;
5- import { defaultLayoutPlugin } from "@react-pdf-viewer/default-layout" ;
6- import "@react-pdf-viewer/default-layout/lib/styles/index.css" ;
3+ import { useState } from 'react' ;
4+ import { Document , Page , pdfjs } from 'react-pdf' ;
5+ import 'react-pdf/dist/esm/Page/AnnotationLayer.css' ;
6+ import 'react-pdf/dist/esm/Page/TextLayer.css' ;
77
8- const PdfViewer = ( { url } : { url : string } ) => {
9- const defaultLayoutPluginInstance = defaultLayoutPlugin ( ) ;
10-
11- const [ scale , setScale ] = useState ( 1.3 ) ;
12-
13- const calculateScale = useCallback ( ( ) => {
14- const width = window . innerWidth ;
15- return width < 768 ? 0.65 : 1.3 ;
16- } , [ ] ) ;
8+ pdfjs . GlobalWorkerOptions . workerSrc = `//unpkg.com/pdfjs-dist@${ pdfjs . version } /build/pdf.worker.min.js` ;
179
18- useEffect ( ( ) => {
19- const handleResize = ( ) => {
20- setScale ( calculateScale ( ) ) ;
21- } ;
22-
23- setScale ( calculateScale ( ) ) ;
24- window . addEventListener ( "resize" , handleResize ) ;
10+ const PdfViewer = ( { url } : { url : string } ) => {
11+ const [ numPages , setNumPages ] = useState < number > ( ) ;
12+ const [ pageNumber , setPageNumber ] = useState ( 1 ) ;
2513
26- return ( ) => window . removeEventListener ( "resize" , handleResize ) ;
27- } , [ calculateScale ] ) ;
14+ function onDocumentLoadSuccess ( { numPages } : { numPages : number } ) {
15+ setNumPages ( numPages ) ;
16+ }
2817
2918 return (
30- < div className = "h-screen w-screen" >
31- < Worker workerUrl = "https://unpkg.com/[email protected] /build/pdf.worker.min.js" > 32- < Viewer
33- fileUrl = { url }
34- initialPage = { 0 }
35- enableSmoothScroll
36- defaultScale = { scale }
37- theme = { "dark" }
38- plugins = { [ defaultLayoutPluginInstance ] }
19+ < div className = "h-screen w-screen overflow-auto flex flex-col items-center" >
20+ < Document
21+ file = { url }
22+ onLoadSuccess = { onDocumentLoadSuccess }
23+ className = "max-w-full"
24+ >
25+ < Page
26+ pageNumber = { pageNumber }
27+ renderTextLayer = { false }
28+ renderAnnotationLayer = { false }
29+ width = { window . innerWidth > 768 ? 800 : window . innerWidth * 0.9 }
3930 />
40- </ Worker >
31+ </ Document >
32+ < div className = "text-center mt-4" >
33+ < p > Page { pageNumber } of { numPages } </ p >
34+ { numPages && (
35+ < div className = "flex justify-center space-x-4 mt-2" >
36+ < button
37+ onClick = { ( ) => setPageNumber ( prev => Math . max ( 1 , prev - 1 ) ) }
38+ disabled = { pageNumber <= 1 }
39+ className = "px-4 py-2 bg-blue-500 text-white disabled:opacity-50"
40+ >
41+ Previous
42+ </ button >
43+ < button
44+ onClick = { ( ) => setPageNumber ( prev => Math . min ( numPages , prev + 1 ) ) }
45+ disabled = { pageNumber >= ( numPages || 0 ) }
46+ className = "px-4 py-2 bg-blue-500 text-white disabled:opacity-50"
47+ >
48+ Next
49+ </ button >
50+ </ div >
51+ ) }
52+ </ div >
4153 </ div >
4254 ) ;
4355} ;
4456
45- export default PdfViewer ;
57+ export default PdfViewer ;
0 commit comments