react-native-gesture-image-viewer 2.1.2 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +1 -1
  2. package/lib/module/GestureTrigger.js.map +1 -1
  3. package/lib/module/GestureViewer.js +23 -6
  4. package/lib/module/GestureViewer.js.map +1 -1
  5. package/lib/module/GestureViewerManager.js +26 -6
  6. package/lib/module/GestureViewerManager.js.map +1 -1
  7. package/lib/module/GestureViewerRegistry.js.map +1 -1
  8. package/lib/module/WebPagingFixStyle.js.map +1 -1
  9. package/lib/module/useGestureViewer.js +205 -229
  10. package/lib/module/useGestureViewer.js.map +1 -1
  11. package/lib/module/useGestureViewerController.js.map +1 -1
  12. package/lib/module/useGestureViewerEvent.js.map +1 -1
  13. package/lib/module/useGestureViewerPaging.js +68 -0
  14. package/lib/module/useGestureViewerPaging.js.map +1 -0
  15. package/lib/module/useGestureViewerPaging.types.js +4 -0
  16. package/lib/module/useGestureViewerPaging.types.js.map +1 -0
  17. package/lib/module/useGestureViewerPaging.web.js +241 -0
  18. package/lib/module/useGestureViewerPaging.web.js.map +1 -0
  19. package/lib/module/useGestureViewerState.js.map +1 -1
  20. package/lib/module/utils/index.js +23 -16
  21. package/lib/module/utils/index.js.map +1 -1
  22. package/lib/module/utils/tapZoom.js +34 -0
  23. package/lib/module/utils/tapZoom.js.map +1 -0
  24. package/lib/module/utils/webScroll.js +70 -0
  25. package/lib/module/utils/webScroll.js.map +1 -0
  26. package/lib/typescript/src/GestureTrigger.d.ts +1 -1
  27. package/lib/typescript/src/GestureTrigger.d.ts.map +1 -1
  28. package/lib/typescript/src/GestureViewer.d.ts.map +1 -1
  29. package/lib/typescript/src/GestureViewerManager.d.ts +5 -0
  30. package/lib/typescript/src/GestureViewerManager.d.ts.map +1 -1
  31. package/lib/typescript/src/GestureViewerRegistry.d.ts.map +1 -1
  32. package/lib/typescript/src/WebPagingFixStyle.d.ts.map +1 -1
  33. package/lib/typescript/src/types.d.ts.map +1 -1
  34. package/lib/typescript/src/useGestureViewer.d.ts +13 -11
  35. package/lib/typescript/src/useGestureViewer.d.ts.map +1 -1
  36. package/lib/typescript/src/useGestureViewerController.d.ts.map +1 -1
  37. package/lib/typescript/src/useGestureViewerEvent.d.ts.map +1 -1
  38. package/lib/typescript/src/useGestureViewerPaging.d.ts +3 -0
  39. package/lib/typescript/src/useGestureViewerPaging.d.ts.map +1 -0
  40. package/lib/typescript/src/useGestureViewerPaging.types.d.ts +32 -0
  41. package/lib/typescript/src/useGestureViewerPaging.types.d.ts.map +1 -0
  42. package/lib/typescript/src/useGestureViewerPaging.web.d.ts +3 -0
  43. package/lib/typescript/src/useGestureViewerPaging.web.d.ts.map +1 -0
  44. package/lib/typescript/src/useGestureViewerState.d.ts.map +1 -1
  45. package/lib/typescript/src/utils/index.d.ts +8 -1
  46. package/lib/typescript/src/utils/index.d.ts.map +1 -1
  47. package/lib/typescript/src/utils/tapZoom.d.ts +12 -0
  48. package/lib/typescript/src/utils/tapZoom.d.ts.map +1 -0
  49. package/lib/typescript/src/utils/webScroll.d.ts +18 -0
  50. package/lib/typescript/src/utils/webScroll.d.ts.map +1 -0
  51. package/package.json +86 -80
  52. package/src/GestureTrigger.tsx +9 -2
  53. package/src/GestureViewer.tsx +77 -28
  54. package/src/GestureViewerManager.ts +62 -12
  55. package/src/GestureViewerRegistry.ts +1 -0
  56. package/src/WebPagingFixStyle.tsx +1 -0
  57. package/src/types.ts +44 -32
  58. package/src/useGestureViewer.ts +292 -313
  59. package/src/useGestureViewerController.ts +1 -0
  60. package/src/useGestureViewerEvent.ts +5 -1
  61. package/src/useGestureViewerPaging.ts +112 -0
  62. package/src/useGestureViewerPaging.types.ts +34 -0
  63. package/src/useGestureViewerPaging.web.ts +390 -0
  64. package/src/useGestureViewerState.ts +1 -0
  65. package/src/utils/index.ts +48 -16
  66. package/src/utils/tapZoom.ts +44 -0
  67. package/src/utils/webScroll.ts +96 -0
@@ -1,11 +1,24 @@
1
1
  import { useCallback, useEffect, useMemo, useRef } from 'react';
2
- import { Platform, type ScrollViewProps, StyleSheet, useWindowDimensions, View } from 'react-native';
2
+ import {
3
+ Platform,
4
+ type ScrollViewProps,
5
+ StyleSheet,
6
+ useWindowDimensions,
7
+ View,
8
+ } from 'react-native';
3
9
  import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
4
10
  import Animated from 'react-native-reanimated';
11
+
5
12
  import { registry } from './GestureViewerRegistry';
6
13
  import type { GestureViewerProps } from './types';
7
14
  import { useGestureViewer } from './useGestureViewer';
8
- import { createLoopData, isFlashListLike, isFlatListLike, isScrollViewLike } from './utils';
15
+ import {
16
+ createLoopData,
17
+ isFlashListLike,
18
+ isFlatListLike,
19
+ isScrollViewLike,
20
+ shouldUseNativeScrollGesture,
21
+ } from './utils';
9
22
  import WebPagingFixStyle from './WebPagingFixStyle';
10
23
 
11
24
  export function GestureViewer<ItemT, LC>({
@@ -45,7 +58,10 @@ export function GestureViewer<ItemT, LC>({
45
58
  isPinching,
46
59
  dismissGesture,
47
60
  zoomGesture,
61
+ nativeScrollGesture,
62
+ onWebDoubleClick,
48
63
  onMomentumScrollEnd,
64
+ onScroll,
49
65
  onScrollBeginDrag,
50
66
  animatedStyle,
51
67
  backdropStyle,
@@ -122,7 +138,8 @@ export function GestureViewer<ItemT, LC>({
122
138
  horizontal: true,
123
139
  scrollEnabled: !isZoomed && !isRotated && !isPinching,
124
140
  showsHorizontalScrollIndicator: false,
125
- onMomentumScrollEnd: onMomentumScrollEnd,
141
+ onMomentumScrollEnd,
142
+ onScroll,
126
143
  onScrollBeginDrag,
127
144
  ...(enableSnapMode
128
145
  ? {
@@ -136,11 +153,37 @@ export function GestureViewer<ItemT, LC>({
136
153
  scrollEventThrottle: 16,
137
154
  removeClippedSubviews: true,
138
155
  }) satisfies ScrollViewProps,
139
- [width, itemSpacing, isZoomed, isRotated, isPinching, onMomentumScrollEnd, onScrollBeginDrag, enableSnapMode],
156
+ [
157
+ width,
158
+ itemSpacing,
159
+ isZoomed,
160
+ isRotated,
161
+ isPinching,
162
+ onMomentumScrollEnd,
163
+ onScroll,
164
+ onScrollBeginDrag,
165
+ enableSnapMode,
166
+ ],
140
167
  );
141
168
 
142
169
  const control = useMemo(() => ({ dismiss: handleDismiss }), [handleDismiss]);
143
170
 
171
+ const shouldWrapScrollableWithNativeGesture = shouldUseNativeScrollGesture(
172
+ Platform.OS,
173
+ Component,
174
+ );
175
+
176
+ const maybeWrapWithNativeScrollGesture = useCallback(
177
+ (children: React.ReactNode) => {
178
+ if (!shouldWrapScrollableWithNativeGesture) {
179
+ return children;
180
+ }
181
+
182
+ return <GestureDetector gesture={nativeScrollGesture}>{children}</GestureDetector>;
183
+ },
184
+ [nativeScrollGesture, shouldWrapScrollableWithNativeGesture],
185
+ );
186
+
144
187
  const listComponent = (
145
188
  <GestureHandlerRootView>
146
189
  <GestureDetector gesture={gesture}>
@@ -148,33 +191,39 @@ export function GestureViewer<ItemT, LC>({
148
191
  <Animated.View style={[styles.background, backdropStyleProps, backdropStyle]} />
149
192
  <Animated.View
150
193
  style={[styles.content, animatedStyle]}
194
+ {...(Platform.OS === 'web' && { onClick: onWebDoubleClick })}
151
195
  {...(Platform.OS === 'web' &&
152
196
  isFlashListLike(Component) && { dataSet: { 'flash-list-paging-enabled-fix': true } })}
153
197
  >
154
- {isScrollView ? (
155
- <Component ref={listRef} {...commonProps} {...listProps}>
156
- {loopData.map((item, index) => renderItem({ item, index }))}
157
- </Component>
158
- ) : (
159
- isFlatListLike(Component) && (
160
- <Component
161
- ref={listRef}
162
- {...commonProps}
163
- data={loopData}
164
- renderItem={renderItem}
165
- initialScrollIndex={enableLoop && data.length > 1 ? initialIndex + 1 : initialIndex}
166
- keyExtractor={keyExtractor}
167
- {...(isFlashListLike(Component)
168
- ? // NOTE - Deprecated estimatedItemSize for FlashList V2 (https://shopify.github.io/flash-list/docs/v2-changes#deprecated)
169
- { estimatedItemSize: width + itemSpacing }
170
- : { windowSize: 3, maxToRenderPerBatch: 3, getItemLayout })}
171
- // NOTE - https://github.com/necolas/react-native-web/issues/1299
172
- {...(Platform.OS === 'web' &&
173
- isFlatListLike(Component) && { dataSet: { 'flat-list-paging-enabled-fix': true } })}
174
- {...listProps}
175
- />
176
- )
177
- )}
198
+ {isScrollView
199
+ ? maybeWrapWithNativeScrollGesture(
200
+ <Component ref={listRef} {...commonProps} {...listProps}>
201
+ {loopData.map((item, index) => renderItem({ item, index }))}
202
+ </Component>,
203
+ )
204
+ : isFlatListLike(Component) &&
205
+ maybeWrapWithNativeScrollGesture(
206
+ <Component
207
+ ref={listRef}
208
+ {...commonProps}
209
+ data={loopData}
210
+ renderItem={renderItem}
211
+ initialScrollIndex={
212
+ enableLoop && data.length > 1 ? initialIndex + 1 : initialIndex
213
+ }
214
+ keyExtractor={keyExtractor}
215
+ {...(isFlashListLike(Component)
216
+ ? // NOTE - Deprecated estimatedItemSize for FlashList V2 (https://shopify.github.io/flash-list/docs/v2-changes#deprecated)
217
+ { estimatedItemSize: width + itemSpacing }
218
+ : { windowSize: 3, maxToRenderPerBatch: 3, getItemLayout })}
219
+ // NOTE - https://github.com/necolas/react-native-web/issues/1299
220
+ {...(Platform.OS === 'web' &&
221
+ isFlatListLike(Component) && {
222
+ dataSet: { 'flat-list-paging-enabled-fix': true },
223
+ })}
224
+ {...listProps}
225
+ />,
226
+ )}
178
227
  </Animated.View>
179
228
  <WebPagingFixStyle Component={Component} />
180
229
  </View>
@@ -1,4 +1,5 @@
1
1
  import { type SharedValue, withTiming } from 'react-native-reanimated';
2
+
2
3
  import type {
3
4
  GestureViewerEventCallback,
4
5
  GestureViewerEventData,
@@ -21,8 +22,10 @@ class GestureViewerManager {
21
22
  private rotation: SharedValue<number> | null = null;
22
23
  private translateX: SharedValue<number> | null = null;
23
24
  private translateY: SharedValue<number> | null = null;
25
+ private resetTransformCallback: (() => void) | null = null;
24
26
 
25
27
  private loopCallback: (() => void) | null = null;
28
+ private programmaticScrollVersion = 0;
26
29
 
27
30
  private listeners = new Set<(state: GestureViewerState) => void>();
28
31
  private eventListeners = new Map<GestureViewerEventType, Set<(data: any) => void>>();
@@ -41,7 +44,10 @@ class GestureViewerManager {
41
44
  };
42
45
  }
43
46
 
44
- addEventListener<T extends GestureViewerEventType>(eventType: T, callback: GestureViewerEventCallback<T>) {
47
+ addEventListener<T extends GestureViewerEventType>(
48
+ eventType: T,
49
+ callback: GestureViewerEventCallback<T>,
50
+ ) {
45
51
  if (!this.eventListeners.has(eventType)) {
46
52
  this.eventListeners.set(eventType, new Set());
47
53
  }
@@ -61,7 +67,10 @@ class GestureViewerManager {
61
67
  };
62
68
  }
63
69
 
64
- private emitEvent<T extends GestureViewerEventType>(eventType: T, data: GestureViewerEventData[T]) {
70
+ private emitEvent<T extends GestureViewerEventType>(
71
+ eventType: T,
72
+ data: GestureViewerEventData[T],
73
+ ) {
65
74
  const listeners = this.eventListeners.get(eventType);
66
75
 
67
76
  if (listeners) {
@@ -84,6 +93,10 @@ class GestureViewerManager {
84
93
  };
85
94
  }
86
95
 
96
+ getProgrammaticScrollVersion() {
97
+ return this.programmaticScrollVersion;
98
+ }
99
+
87
100
  setEnableLoop(enabled: boolean) {
88
101
  this.enableLoop = enabled;
89
102
  }
@@ -126,6 +139,10 @@ class GestureViewerManager {
126
139
  this.maxZoomScale = maxZoomScale;
127
140
  }
128
141
 
142
+ setResetTransformCallback(callback: (() => void) | null) {
143
+ this.resetTransformCallback = callback;
144
+ }
145
+
129
146
  notifyStateChange() {
130
147
  this.notifyListeners();
131
148
  }
@@ -154,7 +171,9 @@ class GestureViewerManager {
154
171
  }
155
172
 
156
173
  if (angle === 360) {
157
- this.rotation.value = withTiming(clockwise ? this.rotation.value + MAX_ANGLE : this.rotation.value - MAX_ANGLE);
174
+ this.rotation.value = withTiming(
175
+ clockwise ? this.rotation.value + MAX_ANGLE : this.rotation.value - MAX_ANGLE,
176
+ );
158
177
  return;
159
178
  }
160
179
 
@@ -164,7 +183,13 @@ class GestureViewerManager {
164
183
  };
165
184
 
166
185
  zoomIn = (multiplier = 0.25) => {
167
- if (!this.scale || !this.translateX || !this.translateY || multiplier < 0.01 || multiplier > 1) {
186
+ if (
187
+ !this.scale ||
188
+ !this.translateX ||
189
+ !this.translateY ||
190
+ multiplier < 0.01 ||
191
+ multiplier > 1
192
+ ) {
168
193
  return;
169
194
  }
170
195
 
@@ -186,7 +211,13 @@ class GestureViewerManager {
186
211
  };
187
212
 
188
213
  zoomOut = (multiplier = 0.25) => {
189
- if (!this.scale || !this.translateX || !this.translateY || multiplier < 0.01 || multiplier > 1) {
214
+ if (
215
+ !this.scale ||
216
+ !this.translateX ||
217
+ !this.translateY ||
218
+ multiplier < 0.01 ||
219
+ multiplier > 1
220
+ ) {
190
221
  return;
191
222
  }
192
223
 
@@ -214,7 +245,13 @@ class GestureViewerManager {
214
245
  };
215
246
 
216
247
  resetZoom = (scale = 1) => {
217
- if (!this.scale || !this.translateX || !this.translateY || scale <= 0 || scale > this.maxZoomScale) {
248
+ if (
249
+ !this.scale ||
250
+ !this.translateX ||
251
+ !this.translateY ||
252
+ scale <= 0 ||
253
+ scale > this.maxZoomScale
254
+ ) {
218
255
  return;
219
256
  }
220
257
 
@@ -228,7 +265,7 @@ class GestureViewerManager {
228
265
  return;
229
266
  }
230
267
 
231
- this.loopCallback = null;
268
+ this.cancelPendingLoopTransition();
232
269
 
233
270
  const { scrollTo } = createScrollAction(this.listRef, this.width);
234
271
 
@@ -237,9 +274,11 @@ class GestureViewerManager {
237
274
  this.loopCallback = () => {
238
275
  scrollTo(this.dataLength, false);
239
276
  this.updateCurrentIndex(this.dataLength - 1);
240
- this.loopCallback = null;
277
+ this.cancelPendingLoopTransition();
241
278
  };
242
279
 
280
+ this.resetTransformCallback?.();
281
+ this.programmaticScrollVersion += 1;
243
282
  scrollTo(0, true);
244
283
  return;
245
284
  }
@@ -248,13 +287,17 @@ class GestureViewerManager {
248
287
  this.loopCallback = () => {
249
288
  scrollTo(1, false);
250
289
  this.updateCurrentIndex(0);
251
- this.loopCallback = null;
290
+ this.cancelPendingLoopTransition();
252
291
  };
253
292
 
293
+ this.resetTransformCallback?.();
294
+ this.programmaticScrollVersion += 1;
254
295
  scrollTo(this.dataLength + 1, true);
255
296
  return;
256
297
  }
257
298
 
299
+ this.resetTransformCallback?.();
300
+ this.programmaticScrollVersion += 1;
258
301
  scrollTo(index + 1, true);
259
302
  this.updateCurrentIndex(index);
260
303
 
@@ -265,6 +308,8 @@ class GestureViewerManager {
265
308
  return;
266
309
  }
267
310
 
311
+ this.resetTransformCallback?.();
312
+ this.programmaticScrollVersion += 1;
268
313
  scrollTo(index, true);
269
314
  this.updateCurrentIndex(index);
270
315
  };
@@ -279,14 +324,18 @@ class GestureViewerManager {
279
324
  return true;
280
325
  }
281
326
 
282
- this.loopCallback = null;
327
+ this.cancelPendingLoopTransition();
283
328
  return true;
284
329
  };
285
330
 
286
- handleScrollBeginDrag = () => {
331
+ cancelPendingLoopTransition = () => {
287
332
  this.loopCallback = null;
288
333
  };
289
334
 
335
+ handleScrollBeginDrag = () => {
336
+ this.cancelPendingLoopTransition();
337
+ };
338
+
290
339
  goToPrevious = () => {
291
340
  this.goToIndex(this.currentIndex - 1);
292
341
  };
@@ -296,7 +345,7 @@ class GestureViewerManager {
296
345
  };
297
346
 
298
347
  cleanUp() {
299
- this.loopCallback = null;
348
+ this.cancelPendingLoopTransition();
300
349
  this.listeners.clear();
301
350
  this.listRef = null;
302
351
  this.enableHorizontalSwipe = true;
@@ -307,6 +356,7 @@ class GestureViewerManager {
307
356
  this.translateX = null;
308
357
  this.translateY = null;
309
358
  this.rotation = null;
359
+ this.resetTransformCallback = null;
310
360
  this.eventListeners.clear();
311
361
  }
312
362
 
@@ -1,4 +1,5 @@
1
1
  import type { View } from 'react-native';
2
+
2
3
  import GestureViewerManager from './GestureViewerManager';
3
4
 
4
5
  class GestureViewerRegistry {
@@ -1,4 +1,5 @@
1
1
  import { Platform } from 'react-native';
2
+
2
3
  import { isFlashListLike, isFlatListLike } from './utils';
3
4
 
4
5
  type WebPagingFixStyleProps = {
package/src/types.ts CHANGED
@@ -9,7 +9,10 @@ import type {
9
9
  ViewStyle,
10
10
  ViewToken,
11
11
  } from 'react-native';
12
- import type { FlatList as GHFlatList, ScrollView as GHScrollView } from 'react-native-gesture-handler';
12
+ import type {
13
+ FlatList as GHFlatList,
14
+ ScrollView as GHScrollView,
15
+ } from 'react-native-gesture-handler';
13
16
  import type { WithTimingConfig } from 'react-native-reanimated';
14
17
 
15
18
  export type FlatListComponent<ItemT> = typeof RNFlatList<ItemT> | typeof GHFlatList<ItemT>;
@@ -17,39 +20,43 @@ export type ScrollViewComponent = typeof RNScrollView | typeof GHScrollView;
17
20
 
18
21
  interface ViewabilityConfigCallbackPair<TItem> {
19
22
  viewabilityConfig: ViewabilityConfig;
20
- onViewableItemsChanged: ((info: { viewableItems: ViewToken<TItem>[]; changed: ViewToken<TItem>[] }) => void) | null;
23
+ onViewableItemsChanged:
24
+ | ((info: { viewableItems: ViewToken<TItem>[]; changed: ViewToken<TItem>[] }) => void)
25
+ | null;
21
26
  }
22
27
 
23
28
  // Helper type to instantiate generic components with specific type parameter
24
- export type InstantiateGeneric<ItemT, LC> = LC extends React.ComponentType<infer P>
25
- ? P extends Record<string, any>
26
- ? {
27
- [K in keyof P]: K extends 'data'
28
- ? ArrayLike<ItemT> | null | undefined
29
- : K extends 'renderItem'
30
- ? ListRenderItem<ItemT>
31
- : K extends 'keyExtractor'
32
- ? (item: ItemT, index: number) => string
33
- : K extends 'getItemType'
34
- ? (item: ItemT, index: number, extraData?: any) => string | number | undefined
35
- : K extends 'overrideItemLayout'
36
- ? (
37
- layout: { span?: number; size?: number },
38
- item: ItemT,
39
- index: number,
40
- maxColumns?: number,
41
- extraData?: any,
42
- ) => void
43
- : K extends 'onViewableItemsChanged'
44
- ? FlatListProps<ItemT>['onViewableItemsChanged']
45
- : K extends 'viewabilityConfigCallbackPairs'
46
- ? ViewabilityConfigCallbackPair<ItemT>[]
47
- : P[K];
48
- }
49
- : P
50
- : never;
29
+ export type InstantiateGeneric<ItemT, LC> =
30
+ LC extends React.ComponentType<infer P>
31
+ ? P extends Record<string, any>
32
+ ? {
33
+ [K in keyof P]: K extends 'data'
34
+ ? ArrayLike<ItemT> | null | undefined
35
+ : K extends 'renderItem'
36
+ ? ListRenderItem<ItemT>
37
+ : K extends 'keyExtractor'
38
+ ? (item: ItemT, index: number) => string
39
+ : K extends 'getItemType'
40
+ ? (item: ItemT, index: number, extraData?: any) => string | number | undefined
41
+ : K extends 'overrideItemLayout'
42
+ ? (
43
+ layout: { span?: number; size?: number },
44
+ item: ItemT,
45
+ index: number,
46
+ maxColumns?: number,
47
+ extraData?: any,
48
+ ) => void
49
+ : K extends 'onViewableItemsChanged'
50
+ ? FlatListProps<ItemT>['onViewableItemsChanged']
51
+ : K extends 'viewabilityConfigCallbackPairs'
52
+ ? ViewabilityConfigCallbackPair<ItemT>[]
53
+ : P[K];
54
+ }
55
+ : P
56
+ : never;
51
57
 
52
- export type GetComponentProps<ItemT, LC> = LC extends React.ComponentType<any> ? InstantiateGeneric<ItemT, LC> : never;
58
+ export type GetComponentProps<ItemT, LC> =
59
+ LC extends React.ComponentType<any> ? InstantiateGeneric<ItemT, LC> : never;
53
60
 
54
61
  type ConditionalListProps<ItemT, LC> = LC extends typeof RNFlatList<ItemT>
55
62
  ? React.ComponentProps<typeof RNFlatList<ItemT>>
@@ -123,7 +130,10 @@ export interface GestureViewerProps<ItemT, LC> {
123
130
  * @param helpers - Control helpers for the viewer. Currently includes `dismiss()`.
124
131
  * @returns A React element that wraps and renders the provided `children`.
125
132
  */
126
- renderContainer?: (children: React.ReactElement, helpers: { dismiss: () => void }) => React.ReactElement;
133
+ renderContainer?: (
134
+ children: React.ReactElement,
135
+ helpers: { dismiss: () => void },
136
+ ) => React.ReactElement;
127
137
  /**
128
138
  * Support for any list component like `ScrollView`, `FlatList`, `FlashList` through the `ListComponent` prop.
129
139
  */
@@ -422,4 +432,6 @@ export type GestureViewerEventData = {
422
432
  rotationChange: { rotation: number; previousRotation: number | null };
423
433
  };
424
434
 
425
- export type GestureViewerEventCallback<T extends GestureViewerEventType> = (data: GestureViewerEventData[T]) => void;
435
+ export type GestureViewerEventCallback<T extends GestureViewerEventType> = (
436
+ data: GestureViewerEventData[T],
437
+ ) => void;