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.
- package/README.md +1 -1
- package/lib/module/GestureTrigger.js.map +1 -1
- package/lib/module/GestureViewer.js +23 -6
- package/lib/module/GestureViewer.js.map +1 -1
- package/lib/module/GestureViewerManager.js +26 -6
- package/lib/module/GestureViewerManager.js.map +1 -1
- package/lib/module/GestureViewerRegistry.js.map +1 -1
- package/lib/module/WebPagingFixStyle.js.map +1 -1
- package/lib/module/useGestureViewer.js +205 -229
- package/lib/module/useGestureViewer.js.map +1 -1
- package/lib/module/useGestureViewerController.js.map +1 -1
- package/lib/module/useGestureViewerEvent.js.map +1 -1
- package/lib/module/useGestureViewerPaging.js +68 -0
- package/lib/module/useGestureViewerPaging.js.map +1 -0
- package/lib/module/useGestureViewerPaging.types.js +4 -0
- package/lib/module/useGestureViewerPaging.types.js.map +1 -0
- package/lib/module/useGestureViewerPaging.web.js +241 -0
- package/lib/module/useGestureViewerPaging.web.js.map +1 -0
- package/lib/module/useGestureViewerState.js.map +1 -1
- package/lib/module/utils/index.js +23 -16
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/tapZoom.js +34 -0
- package/lib/module/utils/tapZoom.js.map +1 -0
- package/lib/module/utils/webScroll.js +70 -0
- package/lib/module/utils/webScroll.js.map +1 -0
- package/lib/typescript/src/GestureTrigger.d.ts +1 -1
- package/lib/typescript/src/GestureTrigger.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewer.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewerManager.d.ts +5 -0
- package/lib/typescript/src/GestureViewerManager.d.ts.map +1 -1
- package/lib/typescript/src/GestureViewerRegistry.d.ts.map +1 -1
- package/lib/typescript/src/WebPagingFixStyle.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewer.d.ts +13 -11
- package/lib/typescript/src/useGestureViewer.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerController.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerEvent.d.ts.map +1 -1
- package/lib/typescript/src/useGestureViewerPaging.d.ts +3 -0
- package/lib/typescript/src/useGestureViewerPaging.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerPaging.types.d.ts +32 -0
- package/lib/typescript/src/useGestureViewerPaging.types.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerPaging.web.d.ts +3 -0
- package/lib/typescript/src/useGestureViewerPaging.web.d.ts.map +1 -0
- package/lib/typescript/src/useGestureViewerState.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +8 -1
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/tapZoom.d.ts +12 -0
- package/lib/typescript/src/utils/tapZoom.d.ts.map +1 -0
- package/lib/typescript/src/utils/webScroll.d.ts +18 -0
- package/lib/typescript/src/utils/webScroll.d.ts.map +1 -0
- package/package.json +86 -80
- package/src/GestureTrigger.tsx +9 -2
- package/src/GestureViewer.tsx +77 -28
- package/src/GestureViewerManager.ts +62 -12
- package/src/GestureViewerRegistry.ts +1 -0
- package/src/WebPagingFixStyle.tsx +1 -0
- package/src/types.ts +44 -32
- package/src/useGestureViewer.ts +292 -313
- package/src/useGestureViewerController.ts +1 -0
- package/src/useGestureViewerEvent.ts +5 -1
- package/src/useGestureViewerPaging.ts +112 -0
- package/src/useGestureViewerPaging.types.ts +34 -0
- package/src/useGestureViewerPaging.web.ts +390 -0
- package/src/useGestureViewerState.ts +1 -0
- package/src/utils/index.ts +48 -16
- package/src/utils/tapZoom.ts +44 -0
- package/src/utils/webScroll.ts +96 -0
package/src/GestureViewer.tsx
CHANGED
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
2
|
-
import {
|
|
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 {
|
|
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
|
|
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
|
-
[
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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>(
|
|
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>(
|
|
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(
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
327
|
+
this.cancelPendingLoopTransition();
|
|
283
328
|
return true;
|
|
284
329
|
};
|
|
285
330
|
|
|
286
|
-
|
|
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.
|
|
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
|
|
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 {
|
|
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:
|
|
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> =
|
|
25
|
-
|
|
26
|
-
?
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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> =
|
|
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?: (
|
|
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> = (
|
|
435
|
+
export type GestureViewerEventCallback<T extends GestureViewerEventType> = (
|
|
436
|
+
data: GestureViewerEventData[T],
|
|
437
|
+
) => void;
|