-
-
Notifications
You must be signed in to change notification settings - Fork 250
Expand file tree
/
Copy pathuse-zoom-gesture.ts
More file actions
44 lines (38 loc) · 1.39 KB
/
use-zoom-gesture.ts
File metadata and controls
44 lines (38 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { useLayoutEffect, useRef } from '@framework';
import { useCapability } from '@embedpdf/core/@framework';
import { ViewportPlugin, useViewportElement } from '@embedpdf/plugin-viewport/@framework';
import { setupZoomGestures, ZoomGestureOptions } from '../utils/zoom-gesture-logic';
import { useZoomCapability } from './use-zoom';
export type { ZoomGestureOptions };
export function useZoomGesture(documentId: string, options: ZoomGestureOptions = {}) {
const { provides: viewportProvides } = useCapability<ViewportPlugin>('viewport');
const { provides: zoomProvides } = useZoomCapability();
const viewportElementRef = useViewportElement();
const elementRef = useRef<HTMLDivElement>(null);
// Use useLayoutEffect to set up zoom gestures synchronously before paint
// This prevents flashing and layout jumps that occur with useEffect
useLayoutEffect(() => {
const element = elementRef.current;
const container = viewportElementRef?.current;
if (!element || !container || !zoomProvides) {
return;
}
return setupZoomGestures({
element,
container,
documentId,
zoomProvides,
viewportGap: viewportProvides?.getViewportGap() || 0,
options,
});
}, [
viewportProvides,
zoomProvides,
documentId,
viewportElementRef,
options.enablePinch,
options.enableWheel,
options.zoomStep,
]);
return { elementRef };
}