@@ -6,23 +6,33 @@ import "react-pdf/dist/Page/TextLayer.css";
66import React , { ChangeEvent , useEffect , useRef , useState } from "react" ;
77import { Page , pdfjs } from "react-pdf" ;
88import { Reader } from "../src/index" ;
9- import { PageChangeEvent , ReaderAPI , RenderPageProps } from "../src/types" ;
9+ import {
10+ PageChangeEvent ,
11+ ReaderAPI ,
12+ RenderPageProps ,
13+ VirtualItemAndOffset ,
14+ } from "../src/types" ;
1015import TestHighlightsLayer from "./TestHighlights" ;
1116import { highlightData } from "./highlightData" ;
1217
18+ type ZoomMode = "default" | "zoom-in" | "zoom-out" ;
19+
1320pdfjs . GlobalWorkerOptions . workerSrc = `//unpkg.com/pdfjs-dist@${ pdfjs . version } /build/pdf.worker.min.mjs` ;
1421
1522const LoadingComponent = ( ) => {
1623 return < div > Overidden Loading</ div > ;
1724} ;
1825
1926function App ( ) {
27+ const [ zoomMode , setZoomMode ] = useState < ZoomMode > ( "default" ) ;
2028 const [ pageNum , setPageNum ] = useState < number | null > ( null ) ;
2129 const [ scale , setScale ] = useState < number | null > ( 0.75 ) ;
2230 const [ file , setFile ] = useState < string > ( "pdf-open-parameters.pdf" ) ;
2331 const [ wantPage , setWantPage ] = useState < number | null > ( null ) ;
2432 const [ readerAPI , setReaderAPI ] = useState < ReaderAPI | null > ( null ) ;
2533 const [ offset , setOffset ] = useState < number | null > ( null ) ;
34+ const [ virtualItemAndOffset , setVirtualItemAndOffset ] =
35+ useState < VirtualItemAndOffset | null > ( null ) ;
2636 const [ isLoaded , setIsLoaded ] = useState < boolean > ( false ) ;
2737 const initialHighlight = useRef ( false ) ;
2838
@@ -80,6 +90,41 @@ function App() {
8090 // debugger;
8191 } ;
8292
93+ const toggleZoomMode = ( ) => {
94+ setZoomMode ( ( prevMode ) => {
95+ if ( prevMode === "default" ) return "zoom-in" ;
96+ if ( prevMode === "zoom-in" ) return "zoom-out" ;
97+ return "default" ;
98+ } ) ;
99+ } ;
100+
101+ const handleReaderClick = ( event : React . MouseEvent < HTMLDivElement > ) => {
102+ if ( zoomMode === "default" || ! readerAPI ) return ;
103+
104+ const rect = event . currentTarget . getBoundingClientRect ( ) ;
105+ const point = {
106+ top : event . clientY - rect . top ,
107+ left : event . clientX - rect . left ,
108+ } ;
109+
110+ if ( zoomMode === "zoom-in" ) {
111+ readerAPI . increaseZoom ( 2 , point ) ;
112+ } else if ( zoomMode === "zoom-out" ) {
113+ readerAPI . decreaseZoom ( 1 , point ) ;
114+ }
115+ } ;
116+
117+ const getCursorForZoomMode = ( mode : ZoomMode ) => {
118+ switch ( mode ) {
119+ case "zoom-in" :
120+ return "zoom-in" ;
121+ case "zoom-out" :
122+ return "zoom-out" ;
123+ default :
124+ return "auto" ;
125+ }
126+ } ;
127+
83128 useEffect ( ( ) => {
84129 if ( ! readerAPI || initialHighlight . current ) return ;
85130 readerAPI ?. jumpToHighlightArea ( highlightData [ 0 ] ) ;
@@ -156,6 +201,24 @@ function App() {
156201 jump to highlight
157202 </ button >
158203 < div style = { { display : "flex" } } >
204+ < button
205+ onClick = { ( ) => {
206+ const res = readerAPI ?. getVirtualItemAndOffsetAt ( ) ;
207+ setVirtualItemAndOffset ( res ?? null ) ;
208+ } }
209+ >
210+ get item and offset
211+ </ button >
212+ { virtualItemAndOffset && (
213+ < div >
214+ < div > Index: { virtualItemAndOffset . index } </ div >
215+ < div >
216+ Offset: { virtualItemAndOffset . percentageOffsetY . toPrecision ( 4 ) }
217+ </ div >
218+ </ div >
219+ ) }
220+ </ div >
221+ < div style = { { display : "flex" , flexDirection : "column" } } >
159222 < button
160223 onClick = { ( ) => {
161224 readerAPI ?. decreaseZoom ( ) ;
@@ -178,6 +241,9 @@ function App() {
178241 zoom default
179242 </ button >
180243 < div > { readerAPI ?. scale ?. toString ( ) . substring ( 0 , 3 ) } </ div >
244+ < button onClick = { toggleZoomMode } style = { { marginLeft : "10px" } } >
245+ Zoom Mode: { zoomMode }
246+ </ button >
181247 </ div >
182248 < div style = { { display : "flex" } } >
183249 < button
@@ -199,12 +265,14 @@ function App() {
199265 </ div >
200266 < div
201267 style = { {
202- width : "700px " ,
268+ width : "900px " ,
203269 height : "800px" ,
204270 borderColor : "gray" ,
205271 borderWidth : "1px" ,
206272 borderStyle : "solid" ,
273+ cursor : getCursorForZoomMode ( zoomMode ) ,
207274 } }
275+ onClick = { handleReaderClick }
208276 >
209277 < Reader
210278 file = { file }
0 commit comments