@@ -31,6 +31,11 @@ interface PdfViewerProps {
3131 name : string ;
3232}
3333
34+ interface WheelZoomProps {
35+ documentId : string ;
36+ viewerRef : React . RefObject < HTMLDivElement > ;
37+ }
38+
3439function useBreakpoint ( ) {
3540 const [ width , setWidth ] = useState ( ( ) => window . innerWidth ) ;
3641
@@ -243,6 +248,30 @@ const Controls = memo(function Controls({documentId, toggleFullscreen, isFullscr
243248 )
244249} ) ;
245250
251+ function WheelZoom ( { documentId, viewerRef} : WheelZoomProps ) {
252+ const { provides : zoomProv } = useZoom ( documentId ) ;
253+
254+ const handleWheel = useCallback ( ( e : WheelEvent ) => {
255+ if ( e . ctrlKey && zoomProv ) {
256+ e . preventDefault ( ) ;
257+ if ( e . deltaY < 0 ) {
258+ zoomProv . zoomIn ( ) ;
259+ } else {
260+ zoomProv . zoomOut ( ) ;
261+ }
262+ }
263+ } , [ zoomProv ] ) ;
264+
265+ useEffect ( ( ) => {
266+ const viewer = viewerRef . current ;
267+ if ( ! viewer ) return ;
268+ viewer . addEventListener ( "wheel" , handleWheel , { passive : false } ) ;
269+ return ( ) => viewer . removeEventListener ( "wheel" , handleWheel ) ;
270+ } , [ handleWheel ] ) ;
271+
272+ return null ;
273+ }
274+
246275export default function PDFViewer ( { url, name } : PdfViewerProps ) {
247276 const { engine, isLoading } = usePdfiumEngine ( ) ;
248277 const { isMobile, isSmall} = useBreakpoint ( ) ;
@@ -301,6 +330,7 @@ export default function PDFViewer({ url, name }: PdfViewerProps) {
301330 { ( { activeDocumentId } ) =>
302331 activeDocumentId && (
303332 < >
333+ < WheelZoom documentId = { activeDocumentId } viewerRef = { viewerRef } />
304334 { ( isMobile && ! isFullscreen ) &&
305335 < Controls
306336 documentId = { activeDocumentId }
0 commit comments