react-native-gesture-image-viewer 2.4.0 → 3.0.0-beta.1

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 (138) hide show
  1. package/README.md +5 -3
  2. package/lib/module/GestureViewer.js +96 -147
  3. package/lib/module/GestureViewer.js.map +1 -1
  4. package/lib/module/GestureViewerManager.js +49 -105
  5. package/lib/module/GestureViewerManager.js.map +1 -1
  6. package/lib/module/gestureViewerAnimation.js +18 -0
  7. package/lib/module/gestureViewerAnimation.js.map +1 -0
  8. package/lib/module/gestureViewerGestures.js +12 -0
  9. package/lib/module/gestureViewerGestures.js.map +1 -0
  10. package/lib/module/gestureViewerPaging.js +66 -0
  11. package/lib/module/gestureViewerPaging.js.map +1 -0
  12. package/lib/module/gestureViewerRenderWindow.js +29 -0
  13. package/lib/module/gestureViewerRenderWindow.js.map +1 -0
  14. package/lib/module/getWebContentProps.js +6 -0
  15. package/lib/module/getWebContentProps.js.map +1 -0
  16. package/lib/module/getWebContentProps.web.js +8 -0
  17. package/lib/module/getWebContentProps.web.js.map +1 -0
  18. package/lib/module/platformTapGestures.js +4 -0
  19. package/lib/module/platformTapGestures.js.map +1 -0
  20. package/lib/module/platformTapGestures.web.js +4 -0
  21. package/lib/module/platformTapGestures.web.js.map +1 -0
  22. package/lib/module/renderWindow.js +160 -0
  23. package/lib/module/renderWindow.js.map +1 -0
  24. package/lib/module/useGestureViewer.js +459 -211
  25. package/lib/module/useGestureViewer.js.map +1 -1
  26. package/lib/module/useGestureViewerController.js +3 -3
  27. package/lib/module/useGestureViewerController.js.map +1 -1
  28. package/lib/module/useGestureViewerManagerBridge.js +85 -0
  29. package/lib/module/useGestureViewerManagerBridge.js.map +1 -0
  30. package/lib/module/useGestureViewerPaging.js +168 -79
  31. package/lib/module/useGestureViewerPaging.js.map +1 -1
  32. package/lib/module/useWebClickHandler.js +7 -0
  33. package/lib/module/useWebClickHandler.js.map +1 -0
  34. package/lib/module/useWebClickHandler.web.js +85 -0
  35. package/lib/module/useWebClickHandler.web.js.map +1 -0
  36. package/lib/module/useWebSingleTapTimer.js +12 -0
  37. package/lib/module/useWebSingleTapTimer.js.map +1 -0
  38. package/lib/module/useWebSingleTapTimer.web.js +25 -0
  39. package/lib/module/useWebSingleTapTimer.web.js.map +1 -0
  40. package/lib/module/utils/index.js +0 -77
  41. package/lib/module/utils/index.js.map +1 -1
  42. package/lib/module/utils/tapZoom.js +4 -3
  43. package/lib/module/utils/tapZoom.js.map +1 -1
  44. package/lib/typescript/src/GestureViewer.d.ts +1 -1
  45. package/lib/typescript/src/GestureViewer.d.ts.map +1 -1
  46. package/lib/typescript/src/GestureViewerManager.d.ts +20 -20
  47. package/lib/typescript/src/GestureViewerManager.d.ts.map +1 -1
  48. package/lib/typescript/src/gestureViewerAnimation.d.ts +15 -0
  49. package/lib/typescript/src/gestureViewerAnimation.d.ts.map +1 -0
  50. package/lib/typescript/src/gestureViewerGestures.d.ts +10 -0
  51. package/lib/typescript/src/gestureViewerGestures.d.ts.map +1 -0
  52. package/lib/typescript/src/gestureViewerPaging.d.ts +13 -0
  53. package/lib/typescript/src/gestureViewerPaging.d.ts.map +1 -0
  54. package/lib/typescript/src/gestureViewerRenderWindow.d.ts +15 -0
  55. package/lib/typescript/src/gestureViewerRenderWindow.d.ts.map +1 -0
  56. package/lib/typescript/src/getWebContentProps.d.ts +3 -0
  57. package/lib/typescript/src/getWebContentProps.d.ts.map +1 -0
  58. package/lib/typescript/src/getWebContentProps.web.d.ts +5 -0
  59. package/lib/typescript/src/getWebContentProps.web.d.ts.map +1 -0
  60. package/lib/typescript/src/platformTapGestures.d.ts +2 -0
  61. package/lib/typescript/src/platformTapGestures.d.ts.map +1 -0
  62. package/lib/typescript/src/platformTapGestures.web.d.ts +2 -0
  63. package/lib/typescript/src/platformTapGestures.web.d.ts.map +1 -0
  64. package/lib/typescript/src/renderWindow.d.ts +44 -0
  65. package/lib/typescript/src/renderWindow.d.ts.map +1 -0
  66. package/lib/typescript/src/types.d.ts +36 -53
  67. package/lib/typescript/src/types.d.ts.map +1 -1
  68. package/lib/typescript/src/useGestureViewer.d.ts +11 -10
  69. package/lib/typescript/src/useGestureViewer.d.ts.map +1 -1
  70. package/lib/typescript/src/useGestureViewerController.d.ts +1 -1
  71. package/lib/typescript/src/useGestureViewerManagerBridge.d.ts +28 -0
  72. package/lib/typescript/src/useGestureViewerManagerBridge.d.ts.map +1 -0
  73. package/lib/typescript/src/useGestureViewerPaging.d.ts +33 -2
  74. package/lib/typescript/src/useGestureViewerPaging.d.ts.map +1 -1
  75. package/lib/typescript/src/useWebClickHandler.d.ts +35 -0
  76. package/lib/typescript/src/useWebClickHandler.d.ts.map +1 -0
  77. package/lib/typescript/src/useWebClickHandler.web.d.ts +36 -0
  78. package/lib/typescript/src/useWebClickHandler.web.d.ts.map +1 -0
  79. package/lib/typescript/src/useWebSingleTapTimer.d.ts +6 -0
  80. package/lib/typescript/src/useWebSingleTapTimer.d.ts.map +1 -0
  81. package/lib/typescript/src/useWebSingleTapTimer.web.d.ts +6 -0
  82. package/lib/typescript/src/useWebSingleTapTimer.web.d.ts.map +1 -0
  83. package/lib/typescript/src/utils/index.d.ts +0 -20
  84. package/lib/typescript/src/utils/index.d.ts.map +1 -1
  85. package/lib/typescript/src/utils/tapZoom.d.ts.map +1 -1
  86. package/package.json +2 -2
  87. package/src/GestureViewer.tsx +113 -208
  88. package/src/GestureViewerManager.ts +77 -122
  89. package/src/gestureViewerAnimation.ts +18 -0
  90. package/src/gestureViewerGestures.ts +20 -0
  91. package/src/gestureViewerPaging.ts +116 -0
  92. package/src/gestureViewerRenderWindow.ts +56 -0
  93. package/src/getWebContentProps.ts +5 -0
  94. package/src/getWebContentProps.web.ts +5 -0
  95. package/src/platformTapGestures.ts +1 -0
  96. package/src/platformTapGestures.web.ts +1 -0
  97. package/src/renderWindow.ts +253 -0
  98. package/src/types.ts +34 -100
  99. package/src/useGestureViewer.ts +665 -275
  100. package/src/useGestureViewerController.ts +3 -3
  101. package/src/useGestureViewerManagerBridge.ts +118 -0
  102. package/src/useGestureViewerPaging.ts +306 -112
  103. package/src/useWebClickHandler.ts +44 -0
  104. package/src/useWebClickHandler.web.ts +146 -0
  105. package/src/useWebSingleTapTimer.ts +10 -0
  106. package/src/useWebSingleTapTimer.web.ts +30 -0
  107. package/src/utils/index.ts +0 -102
  108. package/src/utils/tapZoom.ts +4 -3
  109. package/lib/module/WebPagingFixStyle.js +0 -25
  110. package/lib/module/WebPagingFixStyle.js.map +0 -1
  111. package/lib/module/scheduleInitialScroll.js +0 -21
  112. package/lib/module/scheduleInitialScroll.js.map +0 -1
  113. package/lib/module/useGestureViewerPaging.types.js +0 -4
  114. package/lib/module/useGestureViewerPaging.types.js.map +0 -1
  115. package/lib/module/useGestureViewerPaging.web.js +0 -291
  116. package/lib/module/useGestureViewerPaging.web.js.map +0 -1
  117. package/lib/module/utils/FlashList.js +0 -9
  118. package/lib/module/utils/FlashList.js.map +0 -1
  119. package/lib/module/utils/webScroll.js +0 -70
  120. package/lib/module/utils/webScroll.js.map +0 -1
  121. package/lib/typescript/src/WebPagingFixStyle.d.ts +0 -6
  122. package/lib/typescript/src/WebPagingFixStyle.d.ts.map +0 -1
  123. package/lib/typescript/src/scheduleInitialScroll.d.ts +0 -3
  124. package/lib/typescript/src/scheduleInitialScroll.d.ts.map +0 -1
  125. package/lib/typescript/src/useGestureViewerPaging.types.d.ts +0 -42
  126. package/lib/typescript/src/useGestureViewerPaging.types.d.ts.map +0 -1
  127. package/lib/typescript/src/useGestureViewerPaging.web.d.ts +0 -3
  128. package/lib/typescript/src/useGestureViewerPaging.web.d.ts.map +0 -1
  129. package/lib/typescript/src/utils/FlashList.d.ts +0 -2
  130. package/lib/typescript/src/utils/FlashList.d.ts.map +0 -1
  131. package/lib/typescript/src/utils/webScroll.d.ts +0 -18
  132. package/lib/typescript/src/utils/webScroll.d.ts.map +0 -1
  133. package/src/WebPagingFixStyle.tsx +0 -25
  134. package/src/scheduleInitialScroll.ts +0 -36
  135. package/src/useGestureViewerPaging.types.ts +0 -42
  136. package/src/useGestureViewerPaging.web.ts +0 -453
  137. package/src/utils/FlashList.ts +0 -7
  138. package/src/utils/webScroll.ts +0 -96
@@ -1,453 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState, type MouseEvent } from 'react';
2
- import type { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
3
-
4
- import type {
5
- UseGestureViewerPagingArgs,
6
- UseGestureViewerPagingResult,
7
- WebClickTarget,
8
- } from './useGestureViewerPaging.types';
9
- import { applyTapZoomAtPoint } from './utils/tapZoom';
10
- import {
11
- getWebAutoPlayTargetPhysicalIndex,
12
- getWebScrollPhysicalIndex,
13
- resolveWebScrollFinalState,
14
- } from './utils/webScroll';
15
-
16
- type WebScrollActor = 'idle' | 'user' | 'autoplay';
17
-
18
- type WebScrollRuntime = {
19
- actor: WebScrollActor;
20
- isAutoplayPausedByUser: boolean;
21
- lastSettledPhysicalIndex: number;
22
- latestOffsetX: number;
23
- latestRawPhysicalIndex: number;
24
- lastProgrammaticScrollVersion: number;
25
- settleTimer: ReturnType<typeof setTimeout> | null;
26
- resumeAutoplayTimer: ReturnType<typeof setTimeout> | null;
27
- };
28
-
29
- export function useGestureViewerPaging({
30
- adjustedInitialIndex,
31
- autoPlay,
32
- autoPlayInterval,
33
- currentIndex,
34
- dataLength,
35
- enableDoubleTapZoom,
36
- enableHorizontalSwipe,
37
- enableLoop,
38
- height,
39
- onSingleTap,
40
- isRotated,
41
- isZoomed,
42
- itemSpacing,
43
- manager,
44
- maxZoomScale,
45
- scale,
46
- scrollTo,
47
- syncCurrentIndex,
48
- syncPendingIndex,
49
- translateX,
50
- translateY,
51
- width,
52
- }: UseGestureViewerPagingArgs): UseGestureViewerPagingResult {
53
- const [activeListIndex, setActiveListIndex] = useState(adjustedInitialIndex);
54
- const activeResetItemSpacing = adjustedInitialIndex > 0 ? itemSpacing : 0;
55
- const activeResetWidth = adjustedInitialIndex > 0 ? width : 0;
56
- const webSingleTapTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
57
-
58
- const webScrollRuntimeRef = useRef<WebScrollRuntime>({
59
- actor: 'idle',
60
- isAutoplayPausedByUser: false,
61
- lastSettledPhysicalIndex: adjustedInitialIndex,
62
- latestOffsetX: adjustedInitialIndex * (width + itemSpacing),
63
- latestRawPhysicalIndex: adjustedInitialIndex,
64
- lastProgrammaticScrollVersion: 0,
65
- settleTimer: null,
66
- resumeAutoplayTimer: null,
67
- });
68
-
69
- const clearWebSingleTapTimer = useCallback(() => {
70
- if (webSingleTapTimerRef.current) {
71
- clearTimeout(webSingleTapTimerRef.current);
72
- webSingleTapTimerRef.current = null;
73
- }
74
- }, []);
75
-
76
- const clearWebSettleTimer = useCallback(() => {
77
- const runtime = webScrollRuntimeRef.current;
78
-
79
- if (runtime.settleTimer) {
80
- clearTimeout(runtime.settleTimer);
81
- runtime.settleTimer = null;
82
- }
83
- }, []);
84
-
85
- const clearWebAutoplayResumeTimer = useCallback(() => {
86
- const runtime = webScrollRuntimeRef.current;
87
-
88
- if (runtime.resumeAutoplayTimer) {
89
- clearTimeout(runtime.resumeAutoplayTimer);
90
- runtime.resumeAutoplayTimer = null;
91
- }
92
- }, []);
93
-
94
- const scheduleWebAutoplayResume = useCallback(() => {
95
- const runtime = webScrollRuntimeRef.current;
96
-
97
- clearWebAutoplayResumeTimer();
98
- runtime.resumeAutoplayTimer = setTimeout(() => {
99
- runtime.isAutoplayPausedByUser = false;
100
- runtime.resumeAutoplayTimer = null;
101
- }, 800);
102
- }, [clearWebAutoplayResumeTimer]);
103
-
104
- const pauseWebAutoplayWithoutPagingInteraction = useCallback(() => {
105
- const runtime = webScrollRuntimeRef.current;
106
-
107
- runtime.isAutoplayPausedByUser = true;
108
- runtime.actor = 'idle';
109
- clearWebAutoplayResumeTimer();
110
- }, [clearWebAutoplayResumeTimer]);
111
-
112
- const beginWebUserInteraction = useCallback(
113
- (force = false) => {
114
- const runtime = webScrollRuntimeRef.current;
115
-
116
- if (!force && runtime.actor === 'autoplay') {
117
- return;
118
- }
119
-
120
- runtime.actor = 'user';
121
- runtime.isAutoplayPausedByUser = true;
122
- clearWebAutoplayResumeTimer();
123
- },
124
- [clearWebAutoplayResumeTimer],
125
- );
126
-
127
- const beginWebAutoplayScroll = useCallback(() => {
128
- const runtime = webScrollRuntimeRef.current;
129
-
130
- runtime.actor = 'autoplay';
131
- runtime.isAutoplayPausedByUser = false;
132
- runtime.lastProgrammaticScrollVersion = manager?.getProgrammaticScrollVersion() ?? 0;
133
- clearWebAutoplayResumeTimer();
134
- }, [clearWebAutoplayResumeTimer, manager]);
135
-
136
- const syncProgrammaticActorFromManager = useCallback(() => {
137
- const runtime = webScrollRuntimeRef.current;
138
- const nextVersion = manager?.getProgrammaticScrollVersion() ?? 0;
139
-
140
- if (nextVersion === runtime.lastProgrammaticScrollVersion) {
141
- return;
142
- }
143
-
144
- runtime.actor = 'autoplay';
145
- runtime.isAutoplayPausedByUser = false;
146
- runtime.lastProgrammaticScrollVersion = nextVersion;
147
- clearWebAutoplayResumeTimer();
148
- }, [clearWebAutoplayResumeTimer, manager]);
149
-
150
- const finalizeWebScroll = useCallback(
151
- (offsetX: number, source: 'scroll' | 'momentum' = 'scroll') => {
152
- if (!enableHorizontalSwipe || dataLength <= 0) {
153
- return;
154
- }
155
-
156
- const runtime = webScrollRuntimeRef.current;
157
- const settledByActor = runtime.actor;
158
-
159
- clearWebSettleTimer();
160
- runtime.latestOffsetX = offsetX;
161
-
162
- const settledState = resolveWebScrollFinalState({
163
- dataLength,
164
- enableLoop,
165
- lastSettledPhysicalIndex: runtime.lastSettledPhysicalIndex,
166
- offsetX,
167
- pageWidth: width + itemSpacing,
168
- });
169
-
170
- if (!settledState) {
171
- return;
172
- }
173
-
174
- const { logicalIndex, rawPhysicalIndex, settledPhysicalIndex } = settledState;
175
-
176
- if (source === 'scroll' && runtime.latestRawPhysicalIndex !== rawPhysicalIndex) {
177
- return;
178
- }
179
-
180
- if (rawPhysicalIndex !== settledPhysicalIndex) {
181
- const crossedLoopBoundary =
182
- enableLoop &&
183
- dataLength > 1 &&
184
- (rawPhysicalIndex === 0 || rawPhysicalIndex === dataLength + 1);
185
-
186
- scrollTo(settledPhysicalIndex, !crossedLoopBoundary);
187
- }
188
-
189
- runtime.lastSettledPhysicalIndex = settledPhysicalIndex;
190
- runtime.latestOffsetX = settledPhysicalIndex * (width + itemSpacing);
191
- runtime.actor = 'idle';
192
- manager?.cancelPendingLoopTransition();
193
- setActiveListIndex(settledPhysicalIndex);
194
- syncCurrentIndex(logicalIndex);
195
-
196
- if (settledByActor === 'user') {
197
- scheduleWebAutoplayResume();
198
- }
199
- },
200
- [
201
- clearWebSettleTimer,
202
- dataLength,
203
- enableHorizontalSwipe,
204
- enableLoop,
205
- itemSpacing,
206
- manager,
207
- scheduleWebAutoplayResume,
208
- scrollTo,
209
- syncCurrentIndex,
210
- width,
211
- ],
212
- );
213
-
214
- const scheduleWebScrollSettle = useCallback(
215
- (offsetX: number) => {
216
- const runtime = webScrollRuntimeRef.current;
217
-
218
- runtime.latestOffsetX = offsetX;
219
- runtime.latestRawPhysicalIndex = getWebScrollPhysicalIndex(offsetX, width + itemSpacing);
220
- clearWebSettleTimer();
221
- runtime.settleTimer = setTimeout(() => {
222
- finalizeWebScroll(runtime.latestOffsetX, 'scroll');
223
- }, 180);
224
- },
225
- [clearWebSettleTimer, finalizeWebScroll, itemSpacing, width],
226
- );
227
-
228
- useEffect(() => {
229
- const runtime = webScrollRuntimeRef.current;
230
-
231
- runtime.actor = 'idle';
232
- runtime.isAutoplayPausedByUser = false;
233
- runtime.lastSettledPhysicalIndex = adjustedInitialIndex;
234
- runtime.latestOffsetX = adjustedInitialIndex * (activeResetWidth + activeResetItemSpacing);
235
- runtime.latestRawPhysicalIndex = adjustedInitialIndex;
236
- runtime.lastProgrammaticScrollVersion = manager?.getProgrammaticScrollVersion() ?? 0;
237
- setActiveListIndex(adjustedInitialIndex);
238
- clearWebSettleTimer();
239
- clearWebAutoplayResumeTimer();
240
- }, [
241
- activeResetItemSpacing,
242
- activeResetWidth,
243
- adjustedInitialIndex,
244
- clearWebAutoplayResumeTimer,
245
- clearWebSettleTimer,
246
- dataLength,
247
- manager,
248
- ]);
249
-
250
- useEffect(() => {
251
- const runtime = webScrollRuntimeRef.current;
252
-
253
- runtime.actor = 'idle';
254
- runtime.isAutoplayPausedByUser = false;
255
- runtime.latestOffsetX = runtime.lastSettledPhysicalIndex * (width + itemSpacing);
256
- runtime.latestRawPhysicalIndex = runtime.lastSettledPhysicalIndex;
257
- runtime.lastProgrammaticScrollVersion = manager?.getProgrammaticScrollVersion() ?? 0;
258
- clearWebSettleTimer();
259
- clearWebAutoplayResumeTimer();
260
- }, [clearWebAutoplayResumeTimer, clearWebSettleTimer, itemSpacing, manager, width]);
261
-
262
- useEffect(() => {
263
- return () => {
264
- clearWebSingleTapTimer();
265
- clearWebSettleTimer();
266
- clearWebAutoplayResumeTimer();
267
- };
268
- }, [clearWebAutoplayResumeTimer, clearWebSettleTimer, clearWebSingleTapTimer]);
269
-
270
- useEffect(() => {
271
- if (
272
- !autoPlay ||
273
- dataLength <= 1 ||
274
- isZoomed ||
275
- isRotated ||
276
- (!enableLoop && currentIndex === dataLength - 1)
277
- ) {
278
- return;
279
- }
280
-
281
- const intervalMs = Math.max(250, Math.floor(autoPlayInterval || 0));
282
-
283
- if (!Number.isFinite(intervalMs)) {
284
- return;
285
- }
286
-
287
- const interval = setInterval(() => {
288
- if (isZoomed || isRotated) {
289
- return;
290
- }
291
-
292
- const runtime = webScrollRuntimeRef.current;
293
-
294
- if (runtime.actor !== 'idle' || runtime.isAutoplayPausedByUser || runtime.settleTimer) {
295
- return;
296
- }
297
-
298
- const targetPhysicalIndex = getWebAutoPlayTargetPhysicalIndex({
299
- currentIndex,
300
- dataLength,
301
- enableLoop,
302
- });
303
-
304
- if (targetPhysicalIndex === null) {
305
- return;
306
- }
307
-
308
- beginWebAutoplayScroll();
309
- runtime.latestOffsetX = targetPhysicalIndex * (width + itemSpacing);
310
- scrollTo(targetPhysicalIndex, true);
311
- scheduleWebScrollSettle(runtime.latestOffsetX);
312
- }, intervalMs);
313
-
314
- return () => clearInterval(interval);
315
- }, [
316
- autoPlay,
317
- autoPlayInterval,
318
- beginWebAutoplayScroll,
319
- currentIndex,
320
- dataLength,
321
- enableLoop,
322
- isRotated,
323
- isZoomed,
324
- itemSpacing,
325
- scheduleWebScrollSettle,
326
- scrollTo,
327
- width,
328
- ]);
329
-
330
- const onScroll = useCallback(
331
- (event: NativeSyntheticEvent<NativeScrollEvent>) => {
332
- if (!enableHorizontalSwipe) {
333
- return;
334
- }
335
-
336
- const offsetX = event.nativeEvent.contentOffset.x;
337
- const runtime = webScrollRuntimeRef.current;
338
- const pendingState = resolveWebScrollFinalState({
339
- dataLength,
340
- enableLoop,
341
- lastSettledPhysicalIndex: runtime.lastSettledPhysicalIndex,
342
- offsetX,
343
- pageWidth: width + itemSpacing,
344
- });
345
-
346
- if (pendingState) {
347
- syncPendingIndex(pendingState.logicalIndex);
348
- }
349
-
350
- syncProgrammaticActorFromManager();
351
- beginWebUserInteraction();
352
- scheduleWebScrollSettle(offsetX);
353
- },
354
- [
355
- beginWebUserInteraction,
356
- dataLength,
357
- enableHorizontalSwipe,
358
- enableLoop,
359
- itemSpacing,
360
- scheduleWebScrollSettle,
361
- syncPendingIndex,
362
- syncProgrammaticActorFromManager,
363
- width,
364
- ],
365
- );
366
-
367
- const onMomentumScrollEnd = useCallback(
368
- (event: NativeSyntheticEvent<NativeScrollEvent>) => {
369
- if (!enableHorizontalSwipe) {
370
- return;
371
- }
372
-
373
- finalizeWebScroll(event.nativeEvent.contentOffset.x, 'momentum');
374
- },
375
- [enableHorizontalSwipe, finalizeWebScroll],
376
- );
377
-
378
- const onScrollBeginDrag = useCallback(() => {
379
- beginWebUserInteraction(true);
380
- clearWebSettleTimer();
381
- manager?.handleScrollBeginDrag();
382
- }, [beginWebUserInteraction, clearWebSettleTimer, manager]);
383
-
384
- const onWebClick = useCallback(
385
- (event: MouseEvent<WebClickTarget>) => {
386
- const detail = event.detail;
387
- const rect = event.currentTarget.getBoundingClientRect();
388
- const resolvedX = event.clientX - rect.left;
389
- const resolvedY = event.clientY - rect.top;
390
-
391
- if (!enableDoubleTapZoom) {
392
- if (!onSingleTap) {
393
- return;
394
- }
395
-
396
- clearWebSingleTapTimer();
397
- onSingleTap(resolvedX, resolvedY);
398
- return;
399
- }
400
-
401
- if (detail === 2) {
402
- clearWebSingleTapTimer();
403
-
404
- pauseWebAutoplayWithoutPagingInteraction();
405
- scheduleWebAutoplayResume();
406
-
407
- applyTapZoomAtPoint({
408
- x: resolvedX,
409
- y: resolvedY,
410
- width,
411
- height,
412
- maxZoomScale,
413
- scale,
414
- translateX,
415
- translateY,
416
- });
417
- return;
418
- }
419
-
420
- if (detail !== 1 || !onSingleTap) {
421
- return;
422
- }
423
-
424
- clearWebSingleTapTimer();
425
-
426
- webSingleTapTimerRef.current = setTimeout(() => {
427
- onSingleTap(resolvedX, resolvedY);
428
- webSingleTapTimerRef.current = null;
429
- }, 250);
430
- },
431
- [
432
- clearWebSingleTapTimer,
433
- enableDoubleTapZoom,
434
- height,
435
- maxZoomScale,
436
- onSingleTap,
437
- pauseWebAutoplayWithoutPagingInteraction,
438
- scale,
439
- scheduleWebAutoplayResume,
440
- translateX,
441
- translateY,
442
- width,
443
- ],
444
- );
445
-
446
- return {
447
- activeListIndex,
448
- onMomentumScrollEnd,
449
- onScroll,
450
- onScrollBeginDrag,
451
- onWebClick,
452
- };
453
- }
@@ -1,7 +0,0 @@
1
- export let FlashList: any = null;
2
-
3
- try {
4
- FlashList = require('@shopify/flash-list').FlashList;
5
- } catch {
6
- FlashList = null;
7
- }
@@ -1,96 +0,0 @@
1
- export const getWebScrollPhysicalIndex = (offsetX: number, pageWidth: number): number => {
2
- if (!Number.isFinite(offsetX) || !Number.isFinite(pageWidth) || pageWidth <= 0) {
3
- return 0;
4
- }
5
-
6
- return Math.max(0, Math.round(offsetX / pageWidth));
7
- };
8
-
9
- export const resolveWebScrollFinalState = ({
10
- dataLength,
11
- enableLoop,
12
- lastSettledPhysicalIndex,
13
- offsetX,
14
- pageWidth,
15
- }: {
16
- offsetX: number;
17
- pageWidth: number;
18
- lastSettledPhysicalIndex: number;
19
- dataLength: number;
20
- enableLoop: boolean;
21
- }): { logicalIndex: number; rawPhysicalIndex: number; settledPhysicalIndex: number } | null => {
22
- if (
23
- dataLength <= 0 ||
24
- !Number.isFinite(offsetX) ||
25
- !Number.isFinite(pageWidth) ||
26
- pageWidth <= 0
27
- ) {
28
- return null;
29
- }
30
-
31
- const maxPhysicalIndex = enableLoop && dataLength > 1 ? dataLength + 1 : dataLength - 1;
32
- const rawPhysicalIndex = getWebScrollPhysicalIndex(offsetX, pageWidth);
33
-
34
- if (enableLoop && dataLength > 1) {
35
- const isWrappingBackward = lastSettledPhysicalIndex === 1 && rawPhysicalIndex >= dataLength;
36
- const isWrappingForward = lastSettledPhysicalIndex === dataLength && rawPhysicalIndex <= 1;
37
-
38
- if (isWrappingBackward || rawPhysicalIndex === 0) {
39
- return {
40
- logicalIndex: dataLength - 1,
41
- rawPhysicalIndex,
42
- settledPhysicalIndex: dataLength,
43
- };
44
- }
45
-
46
- if (isWrappingForward || rawPhysicalIndex >= dataLength + 1) {
47
- return {
48
- logicalIndex: 0,
49
- rawPhysicalIndex,
50
- settledPhysicalIndex: 1,
51
- };
52
- }
53
- }
54
-
55
- const targetPhysicalIndex = Math.max(0, Math.min(maxPhysicalIndex, rawPhysicalIndex));
56
-
57
- if (enableLoop && dataLength > 1) {
58
- return {
59
- logicalIndex: targetPhysicalIndex - 1,
60
- rawPhysicalIndex,
61
- settledPhysicalIndex: targetPhysicalIndex,
62
- };
63
- }
64
-
65
- return {
66
- logicalIndex: targetPhysicalIndex,
67
- rawPhysicalIndex,
68
- settledPhysicalIndex: targetPhysicalIndex,
69
- };
70
- };
71
-
72
- export const getWebAutoPlayTargetPhysicalIndex = ({
73
- currentIndex,
74
- dataLength,
75
- enableLoop,
76
- }: {
77
- currentIndex: number;
78
- dataLength: number;
79
- enableLoop: boolean;
80
- }): number | null => {
81
- if (dataLength <= 1) {
82
- return null;
83
- }
84
-
85
- if (enableLoop && currentIndex === dataLength - 1) {
86
- return dataLength + 1;
87
- }
88
-
89
- const nextIndex = currentIndex + 1;
90
-
91
- if (nextIndex >= dataLength) {
92
- return null;
93
- }
94
-
95
- return enableLoop ? nextIndex + 1 : nextIndex;
96
- };