react-native-gesture-image-viewer 0.3.1 → 0.4.0
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 +335 -14
- package/lib/module/GestureImageViewer.js +19 -14
- package/lib/module/GestureImageViewer.js.map +1 -1
- package/lib/module/useGestureImageViewer.js +3 -2
- package/lib/module/useGestureImageViewer.js.map +1 -1
- package/lib/typescript/src/GestureImageViewer.d.ts +1 -1
- package/lib/typescript/src/GestureImageViewer.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +1 -0
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/useGestureImageViewer.d.ts +1 -1
- package/lib/typescript/src/useGestureImageViewer.d.ts.map +1 -1
- package/package.json +25 -5
- package/src/GestureImageViewer.tsx +26 -30
- package/src/types.ts +1 -0
- package/src/useGestureImageViewer.ts +3 -1
package/README.md
CHANGED
|
@@ -1,33 +1,354 @@
|
|
|
1
|
-
#
|
|
1
|
+
# React Native Gesture Image Viewer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> English | [한국어](./README-ko_kr.md)
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Overview
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Have you ever struggled with implementing complex gesture handling and animations when building image galleries or content viewers in React Native?
|
|
8
|
+
|
|
9
|
+
Existing libraries often have limited customization options or performance issues. `react-native-gesture-image-viewer` is a high-performance **universal gesture viewer** library built on React Native Reanimated and Gesture Handler, providing complete customization and intuitive gesture support for not only images but also videos, custom components, and any other content.
|
|
10
|
+
|
|
11
|
+
### Key Features
|
|
12
|
+
|
|
13
|
+
- ✅ **Complete Gesture Support** - Pinch zoom, double-tap zoom, swipe navigation, vertical drag dismiss
|
|
14
|
+
- ✅ **High-Performance Animations** - Smooth 60fps animations powered by React Native Reanimated
|
|
15
|
+
- ✅ **Full Customization** - Complete control over components, styles, and behaviors
|
|
16
|
+
- ✅ **External Control API** - Programmatic control from buttons or other components
|
|
17
|
+
- ✅ **Multi-Instance Management** - ID-based independent management of multiple viewers
|
|
18
|
+
- ✅ **Flexible Integration** - Use with FlatList, FlashList, Expo Image, FastImage, and more
|
|
19
|
+
- ✅ **Full TypeScript Support** - Type safety and enhanced developer experience
|
|
20
|
+
- ✅ **Cross-Platform** - iOS, Android, and Web support
|
|
21
|
+
- ✅ **Easy-to-Use API** - Intuitive and simple implementation without complex setup
|
|
22
|
+
- ✅ **Various Environment Support** - Expo Go and New Architecture support
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
### Examples & Demo
|
|
27
|
+
- [📁 Example Project](/example/) - Real implementation code with various use cases
|
|
28
|
+
- [🤖 Expo Go](https://snack.expo.dev/@harang/react-native-gesture-image-viewer) - Try it instantly on Snack Expo
|
|
29
|
+
|
|
30
|
+
### Prerequisites
|
|
31
|
+
|
|
32
|
+
> [!IMPORTANT]
|
|
33
|
+
> `react-native-gesture-image-viewer` is a high-performance viewer library built on [`react-native-reanimated`](https://www.npmjs.com/package/react-native-reanimated) and [`react-native-gesture-handler`](https://www.npmjs.com/package/react-native-gesture-handler).
|
|
34
|
+
> Therefore, you must install React Native Reanimated and Gesture Handler before using this library. Please refer to the official documentation of these libraries for detailed setup guides.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install react-native-reanimated
|
|
38
|
+
npm install react-native-gesture-handler
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
#### Minimum Requirements
|
|
42
|
+
|
|
43
|
+
|Library|Minimum Version|
|
|
44
|
+
|:--|:--:|
|
|
45
|
+
|`react`|`>=18.0.0`|
|
|
46
|
+
|`react-native`|`>=0.75.0`|
|
|
47
|
+
|`react-native-gesture-handler`|`>=2.24.0`|
|
|
48
|
+
|`react-native-reanimated`|`>=3.0.0`|
|
|
49
|
+
|
|
50
|
+
#### [React Native Reanimated Setup](https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/getting-started/)
|
|
51
|
+
|
|
52
|
+
Add the plugin to your `babel.config.js`:
|
|
53
|
+
|
|
54
|
+
```js
|
|
55
|
+
// babel.config.js
|
|
56
|
+
module.exports = {
|
|
57
|
+
presets: [
|
|
58
|
+
... // don't add it here :)
|
|
59
|
+
],
|
|
60
|
+
plugins: [
|
|
61
|
+
...
|
|
62
|
+
// for web
|
|
63
|
+
'@babel/plugin-proposal-export-namespace-from',
|
|
64
|
+
// react-native-reanimated/plugin has to be listed last.
|
|
65
|
+
'react-native-reanimated/plugin',
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Wrap your Metro config with `wrapWithReanimatedMetroConfig` in `metro.config.js`:
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const {
|
|
74
|
+
wrapWithReanimatedMetroConfig,
|
|
75
|
+
} = require('react-native-reanimated/metro-config');
|
|
76
|
+
|
|
77
|
+
const config = {
|
|
78
|
+
// Your existing Metro configuration options
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
module.exports = wrapWithReanimatedMetroConfig(config);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### [react-native-gesture-handler Setup](https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/installation)
|
|
85
|
+
|
|
86
|
+
- `react-native-gesture-handler` generally doesn't require additional setup, but please refer to the official documentation for your specific environment.
|
|
87
|
+
- For [using gestures in Android modals](https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/installation#android), you would normally need to wrap modal content with `GestureHandlerRootView`. However, this library already includes `GestureHandlerRootView` internally, so no additional wrapping is needed when using modals.
|
|
88
|
+
|
|
89
|
+
### Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# npm
|
|
8
93
|
npm install react-native-gesture-image-viewer
|
|
94
|
+
|
|
95
|
+
# pnpm
|
|
96
|
+
pnpm add react-native-gesture-image-viewer
|
|
97
|
+
|
|
98
|
+
# yarn
|
|
99
|
+
yarn add react-native-gesture-image-viewer
|
|
100
|
+
|
|
101
|
+
# bun
|
|
102
|
+
bun add react-native-gesture-image-viewer
|
|
9
103
|
```
|
|
10
104
|
|
|
11
105
|
## Usage
|
|
12
106
|
|
|
107
|
+
### Basic Usage
|
|
13
108
|
|
|
14
|
-
|
|
15
|
-
|
|
109
|
+
`react-native-gesture-image-viewer` is a library focused purely on gesture interactions for complete customization.
|
|
110
|
+
You can create a viewer using any `Modal` of your choice as shown below:
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
import { Image, Modal } from 'react-native';
|
|
114
|
+
import { GestureImageViewer } from 'react-native-gesture-image-viewer';
|
|
16
115
|
|
|
17
|
-
|
|
116
|
+
function App() {
|
|
117
|
+
const images = [...];
|
|
118
|
+
const [visible, setVisible] = useState(false);
|
|
18
119
|
|
|
19
|
-
|
|
120
|
+
// Wrap with useCallback for performance optimization
|
|
121
|
+
const renderImage = useCallback((imageUrl: string) => {
|
|
122
|
+
return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} resizeMode="contain" />;
|
|
123
|
+
}, []);
|
|
124
|
+
|
|
125
|
+
return (
|
|
126
|
+
<Modal visible={visible} onRequestClose={() => setVisible(false)}>
|
|
127
|
+
<GestureImageViewer
|
|
128
|
+
data={images}
|
|
129
|
+
renderImage={renderImage}
|
|
130
|
+
onDismiss={() => setVisible(false)}
|
|
131
|
+
/>
|
|
132
|
+
</Modal>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
20
135
|
```
|
|
21
136
|
|
|
137
|
+
### Gesture Features
|
|
22
138
|
|
|
23
|
-
|
|
139
|
+
`react-native-gesture-image-viewer` supports various gestures essential for viewers. All gestures are enabled by default.
|
|
24
140
|
|
|
25
|
-
|
|
141
|
+
```tsx
|
|
142
|
+
function App() {
|
|
143
|
+
return (
|
|
144
|
+
<GestureImageViewer
|
|
145
|
+
data={images}
|
|
146
|
+
renderImage={renderImage}
|
|
147
|
+
enableDismissGesture
|
|
148
|
+
enableSwipeGesture
|
|
149
|
+
enableZoomGesture
|
|
150
|
+
enableDoubleTapGesture
|
|
151
|
+
enableZoomPanGesture
|
|
152
|
+
/>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
```
|
|
26
156
|
|
|
27
|
-
|
|
157
|
+
|Property|Description|Default|
|
|
158
|
+
|:--:|:-----|:--:|
|
|
159
|
+
|`enableDismissGesture`|Calls `onDismiss` function when swiping down. Useful for closing modals with downward swipe gestures.|`true`|
|
|
160
|
+
|`enableSwipeGesture`|Controls left/right swipe gestures. When `false`, horizontal gestures are disabled.|`true`|
|
|
161
|
+
|`enableZoomGesture`|Controls two-finger pinch gestures. When `false`, two-finger zoom gestures are disabled.|`true`|
|
|
162
|
+
|`enableDoubleTapGesture`|Controls double-tap zoom gestures. When `false`, double-tap zoom gestures are disabled.|`true`|
|
|
163
|
+
|`enableZoomPanGesture`|Only works when zoom is active, allows moving item position when zoomed. When `false`, gesture movement is disabled during zoom.|`true`|
|
|
164
|
+
|
|
165
|
+
### Custom Components
|
|
166
|
+
|
|
167
|
+
`react-native-gesture-image-viewer` offers powerful complete component customization. You can create gesture-supported items with not only images but any component you want.
|
|
168
|
+
|
|
169
|
+
#### List Components
|
|
170
|
+
|
|
171
|
+
Support for `FlatList`, `FlashList`, `ScrollView` (⚠️ coming soon), and other list components through the `ListComponent` prop.
|
|
172
|
+
You can also customize the props of each supported list component through `listProps`.
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
function App() {
|
|
176
|
+
return (
|
|
177
|
+
<GestureImageViewer
|
|
178
|
+
data={images}
|
|
179
|
+
ListComponent={FlatList}
|
|
180
|
+
listProps={{
|
|
181
|
+
// ....
|
|
182
|
+
}}
|
|
183
|
+
/>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
```
|
|
28
187
|
|
|
29
|
-
|
|
188
|
+
#### Content Components
|
|
30
189
|
|
|
31
|
-
|
|
190
|
+
You can inject various types of content components like `expo-image`, `FastImage`, etc., through the `renderImage` prop to use gestures.
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
import { GestureImageViewer } from 'react-native-gesture-image-viewer';
|
|
194
|
+
import { Image } from 'expo-image';
|
|
195
|
+
|
|
196
|
+
function App() {
|
|
197
|
+
const renderImage = useCallback((imageUrl: string) => {
|
|
198
|
+
return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} contentFit="contain" />;
|
|
199
|
+
}, []);
|
|
200
|
+
|
|
201
|
+
return (
|
|
202
|
+
<GestureImageViewer
|
|
203
|
+
data={images}
|
|
204
|
+
renderImage={renderImage}
|
|
205
|
+
/>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### External Control API
|
|
211
|
+
|
|
212
|
+
`react-native-gesture-image-viewer` provides powerful hooks for programmatic control from buttons or other components.
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
import { GestureImageViewer, useImageViewerController } from 'react-native-gesture-image-viewer';
|
|
216
|
+
|
|
217
|
+
function App() {
|
|
218
|
+
const { goToIndex, goToPrevious, goToNext, currentIndex, totalCount } = useImageViewerController();
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<View>
|
|
222
|
+
<GestureImageViewer
|
|
223
|
+
data={images}
|
|
224
|
+
renderImage={renderImage}
|
|
225
|
+
/>
|
|
226
|
+
<View
|
|
227
|
+
style={{
|
|
228
|
+
position: 'absolute',
|
|
229
|
+
bottom: 40,
|
|
230
|
+
left: 0,
|
|
231
|
+
right: 0,
|
|
232
|
+
gap: 10,
|
|
233
|
+
flexDirection: 'column',
|
|
234
|
+
}}
|
|
235
|
+
>
|
|
236
|
+
<Feather.Button name="chevron-left" onPress={goToPrevious} />
|
|
237
|
+
<Button title="Jump to index 2" onPress={() => goToIndex(2)} />
|
|
238
|
+
<Feather.Button name="chevron-right" onPress={goToNext} />
|
|
239
|
+
<Text>{`${currentIndex + 1} / ${totalCount}`}</Text>
|
|
240
|
+
</View>
|
|
241
|
+
</View>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Style Customization
|
|
247
|
+
|
|
248
|
+
You can customize the styling of `GestureImageViewer`.
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
import { GestureImageViewer } from 'react-native-gesture-image-viewer';
|
|
252
|
+
|
|
253
|
+
function App() {
|
|
254
|
+
return (
|
|
255
|
+
<GestureImageViewer
|
|
256
|
+
animateBackdrop={false}
|
|
257
|
+
width={400}
|
|
258
|
+
itemSpacing={20}
|
|
259
|
+
containerStyle={{ /* ... */ }}
|
|
260
|
+
backdropStyle={{ backgroundColor: 'rgba(0, 0, 0, 0.90)' }}
|
|
261
|
+
renderContainer={(children) => <View style={{ flex: 1 }}>{children}</View>}
|
|
262
|
+
/>
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
|Property|Description|Default|
|
|
268
|
+
|:--:|:-----|:--:|
|
|
269
|
+
|`animateBackdrop`|By default, the background `opacity` gradually decreases from 1 to 0 during downward swipe gestures. When `false`, this animation is disabled.|`true`|
|
|
270
|
+
|`width`|The width of content items. Default is window width.|`Dimensions width`|
|
|
271
|
+
|`itemSpacing`|Specifies the spacing between list items.|`0`|
|
|
272
|
+
|`containerStyle`|Allows custom styling of the container that wraps the list component.|`flex: 1`|
|
|
273
|
+
|`backdropStyle`|Allows customization of the viewer's background style.|`backgroundColor: black; StyleSheet.absoluteFill;`|
|
|
274
|
+
|`renderContainer`|Allows custom wrapper component around `<GestureImageViewer />`.||
|
|
275
|
+
|
|
276
|
+
### Multi-Instance Management
|
|
277
|
+
|
|
278
|
+
When you want to efficiently manage multiple `GestureImageViewer` instances, you can use the `id` prop to use multiple `GestureImageViewer` components.
|
|
279
|
+
`GestureImageViewer` automatically removes instances from memory when components are unmounted, so no manual memory management is required.
|
|
280
|
+
|
|
281
|
+
> The default `id` value is `default`.
|
|
282
|
+
|
|
283
|
+
```tsx
|
|
284
|
+
import { GestureImageViewer, useImageViewerController } from 'react-native-gesture-image-viewer';
|
|
285
|
+
|
|
286
|
+
const firstViewerId = 'firstViewerId';
|
|
287
|
+
const secondViewerId = 'secondViewerId';
|
|
288
|
+
|
|
289
|
+
function App() {
|
|
290
|
+
const { currentIndex: firstCurrentIndex, totalCount: firstTotalCount } = useImageViewerController(firstViewerId);
|
|
291
|
+
const { currentIndex: secondCurrentIndex, totalCount: secondTotalCount } = useImageViewerController(secondViewerId);
|
|
292
|
+
|
|
293
|
+
return (
|
|
294
|
+
<View>
|
|
295
|
+
<GestureImageViewer
|
|
296
|
+
id={firstViewerId}
|
|
297
|
+
data={images}
|
|
298
|
+
renderImage={renderImage}
|
|
299
|
+
/>
|
|
300
|
+
<GestureImageViewer
|
|
301
|
+
id={secondViewerId}
|
|
302
|
+
data={images}
|
|
303
|
+
renderImage={renderImage}
|
|
304
|
+
/>
|
|
305
|
+
</View>
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Additional Props
|
|
311
|
+
|
|
312
|
+
#### `onIndexChange`
|
|
313
|
+
The `onIndexChange` callback function is called when the `index` value changes.
|
|
314
|
+
|
|
315
|
+
```tsx
|
|
316
|
+
import { GestureImageViewer } from 'react-native-gesture-image-viewer';
|
|
317
|
+
|
|
318
|
+
function App() {
|
|
319
|
+
const [currentIndex, setCurrentIndex] = useState(0);
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<GestureImageViewer
|
|
323
|
+
onIndexChange={setCurrentIndex}
|
|
324
|
+
/>
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### `initialIndex` (default: `0`)
|
|
330
|
+
Sets the initial index value.
|
|
331
|
+
|
|
332
|
+
#### `dismissThreshold` (default: `80`)
|
|
333
|
+
`dismissThreshold` controls when `onDismiss` is called by applying a threshold value during vertical gestures.
|
|
334
|
+
|
|
335
|
+
#### `resistance` (default: `2`)
|
|
336
|
+
`resistance` controls the range of vertical movement by applying resistance during vertical gestures.
|
|
337
|
+
|
|
338
|
+
#### `maxZoomScale` (default: `2`)
|
|
339
|
+
Controls the maximum zoom scale multiplier.
|
|
340
|
+
|
|
341
|
+
## Performance Optimization Tips
|
|
342
|
+
|
|
343
|
+
- Wrap the `renderImage` function with `useCallback` to prevent unnecessary re-renders.
|
|
344
|
+
- For large images, we recommend using `FastImage` or `expo-image`.
|
|
345
|
+
- For handling many images, we recommend using `FlashList`.
|
|
346
|
+
- Test on actual devices (performance may be limited in simulators).
|
|
347
|
+
|
|
348
|
+
## Contributing
|
|
349
|
+
|
|
350
|
+
For details on how to contribute to the project and set up the development environment, please refer to the [Contributing Guide](CONTRIBUTING.md).
|
|
351
|
+
|
|
352
|
+
## License
|
|
32
353
|
|
|
33
|
-
|
|
354
|
+
[MIT](./LICENSE)
|
|
@@ -26,6 +26,7 @@ export function GestureImageViewer({
|
|
|
26
26
|
backdropStyle: backdropStyleProps,
|
|
27
27
|
containerStyle,
|
|
28
28
|
initialIndex = 0,
|
|
29
|
+
itemSpacing = 0,
|
|
29
30
|
...props
|
|
30
31
|
}) {
|
|
31
32
|
const {
|
|
@@ -33,7 +34,6 @@ export function GestureImageViewer({
|
|
|
33
34
|
} = useWindowDimensions();
|
|
34
35
|
const width = customWidth || screenWidth;
|
|
35
36
|
const {
|
|
36
|
-
currentIndex,
|
|
37
37
|
flatListRef,
|
|
38
38
|
isZoomed,
|
|
39
39
|
dismissGesture,
|
|
@@ -46,28 +46,29 @@ export function GestureImageViewer({
|
|
|
46
46
|
data,
|
|
47
47
|
width,
|
|
48
48
|
initialIndex,
|
|
49
|
+
itemSpacing,
|
|
49
50
|
...props
|
|
50
51
|
});
|
|
51
52
|
const renderItem = useCallback(({
|
|
52
53
|
item,
|
|
53
54
|
index
|
|
54
55
|
}) => {
|
|
55
|
-
|
|
56
|
-
return /*#__PURE__*/_jsx(Animated.View, {
|
|
56
|
+
return /*#__PURE__*/_jsx(View, {
|
|
57
57
|
style: [{
|
|
58
|
-
width,
|
|
58
|
+
width: width,
|
|
59
59
|
height: '100%',
|
|
60
60
|
justifyContent: 'center',
|
|
61
|
-
alignItems: 'center'
|
|
62
|
-
|
|
61
|
+
alignItems: 'center',
|
|
62
|
+
marginHorizontal: itemSpacing / 2
|
|
63
|
+
}],
|
|
63
64
|
children: renderImage(item, index)
|
|
64
65
|
});
|
|
65
|
-
}, [width,
|
|
66
|
+
}, [width, itemSpacing, renderImage]);
|
|
66
67
|
const getItemLayout = useCallback((_, index) => ({
|
|
67
|
-
length: width,
|
|
68
|
-
offset: width * index,
|
|
68
|
+
length: width + itemSpacing,
|
|
69
|
+
offset: (width + itemSpacing) * index,
|
|
69
70
|
index
|
|
70
|
-
}), [width]);
|
|
71
|
+
}), [width, itemSpacing]);
|
|
71
72
|
const keyExtractor = useCallback((item, index) => `image-${index}-${item}`, []);
|
|
72
73
|
const gesture = useMemo(() => {
|
|
73
74
|
return Gesture.Race(dismissGesture, zoomGesture);
|
|
@@ -83,15 +84,14 @@ export function GestureImageViewer({
|
|
|
83
84
|
style: [styles.container, containerStyle],
|
|
84
85
|
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
85
86
|
style: [styles.background, backdropStyleProps, backdropStyle]
|
|
86
|
-
}), /*#__PURE__*/_jsx(View, {
|
|
87
|
-
style: styles.content,
|
|
87
|
+
}), /*#__PURE__*/_jsx(Animated.View, {
|
|
88
|
+
style: [styles.content, animatedStyle],
|
|
88
89
|
children: /*#__PURE__*/_jsx(ListComponent, {
|
|
89
90
|
ref: flatListRef,
|
|
90
91
|
data: data,
|
|
91
92
|
renderItem: renderItem,
|
|
92
93
|
keyExtractor: keyExtractor,
|
|
93
94
|
horizontal: true,
|
|
94
|
-
pagingEnabled: true,
|
|
95
95
|
scrollEnabled: !isZoomed,
|
|
96
96
|
showsHorizontalScrollIndicator: false,
|
|
97
97
|
onMomentumScrollEnd: onMomentumScrollEnd,
|
|
@@ -99,7 +99,12 @@ export function GestureImageViewer({
|
|
|
99
99
|
initialScrollIndex: initialIndex,
|
|
100
100
|
windowSize: 3,
|
|
101
101
|
maxToRenderPerBatch: 3,
|
|
102
|
-
removeClippedSubviews: true
|
|
102
|
+
removeClippedSubviews: true,
|
|
103
|
+
snapToInterval: width + itemSpacing,
|
|
104
|
+
estimatedItemSize: width + itemSpacing,
|
|
105
|
+
snapToAlignment: "center",
|
|
106
|
+
decelerationRate: "fast",
|
|
107
|
+
scrollEventThrottle: 16
|
|
103
108
|
// NOTE - https://github.com/necolas/react-native-web/issues/1299
|
|
104
109
|
,
|
|
105
110
|
...(Platform.OS === 'web' && {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useMemo","Platform","StyleSheet","useWindowDimensions","View","FlatList","Gesture","GestureDetector","GestureHandlerRootView","Animated","registry","useGestureImageViewer","jsx","_jsx","jsxs","_jsxs","WebPagingFix","OS","children","GestureImageViewer","id","data","renderImage","renderContainer","ListComponent","width","customWidth","listProps","backdropStyle","backdropStyleProps","containerStyle","initialIndex","
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useMemo","Platform","StyleSheet","useWindowDimensions","View","FlatList","Gesture","GestureDetector","GestureHandlerRootView","Animated","registry","useGestureImageViewer","jsx","_jsx","jsxs","_jsxs","WebPagingFix","OS","children","GestureImageViewer","id","data","renderImage","renderContainer","ListComponent","width","customWidth","listProps","backdropStyle","backdropStyleProps","containerStyle","initialIndex","itemSpacing","props","screenWidth","flatListRef","isZoomed","dismissGesture","zoomGesture","onMomentumScrollEnd","animatedStyle","renderItem","item","index","style","height","justifyContent","alignItems","marginHorizontal","getItemLayout","_","length","offset","keyExtractor","gesture","Race","createManager","deleteManager","listComponent","styles","container","background","content","ref","horizontal","scrollEnabled","showsHorizontalScrollIndicator","initialScrollIndex","windowSize","maxToRenderPerBatch","removeClippedSubviews","snapToInterval","estimatedItemSize","snapToAlignment","decelerationRate","scrollEventThrottle","dataSet","create","flex","position","top","left","right","bottom","backgroundColor"],"sourceRoot":"../../src","sources":["GestureImageViewer.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,6 +22,7 @@ export const useGestureImageViewer = ({
|
|
|
22
22
|
enableDoubleTapGesture = true,
|
|
23
23
|
enableZoomPanGesture = true,
|
|
24
24
|
maxZoomScale = 2,
|
|
25
|
+
itemSpacing = 0,
|
|
25
26
|
id = 'default'
|
|
26
27
|
}) => {
|
|
27
28
|
const {
|
|
@@ -107,7 +108,7 @@ export const useGestureImageViewer = ({
|
|
|
107
108
|
return;
|
|
108
109
|
}
|
|
109
110
|
const contentOffset = event.nativeEvent.contentOffset;
|
|
110
|
-
const newIndex = Math.round(contentOffset.x / width);
|
|
111
|
+
const newIndex = Math.round(contentOffset.x / (width + itemSpacing));
|
|
111
112
|
if (newIndex !== currentIndex && newIndex >= 0 && newIndex < dataLength) {
|
|
112
113
|
if (manager) {
|
|
113
114
|
manager.setCurrentIndex(newIndex);
|
|
@@ -121,7 +122,7 @@ export const useGestureImageViewer = ({
|
|
|
121
122
|
startScale.value = withTiming(1);
|
|
122
123
|
scale.value = withTiming(1);
|
|
123
124
|
}
|
|
124
|
-
}, [manager, currentIndex, dataLength, width, enableSwipeGesture, translateX, translateY, scale, initialTranslateX, initialTranslateY, startScale]);
|
|
125
|
+
}, [manager, currentIndex, dataLength, width, itemSpacing, enableSwipeGesture, translateX, translateY, scale, initialTranslateX, initialTranslateY, startScale]);
|
|
125
126
|
const dismissGesture = useMemo(() => {
|
|
126
127
|
return Gesture.Pan().minDistance(10).averageTouches(true).activeOffsetY([-10, 10]).failOffsetX([-10, 10]).enabled(!isZoomed).onUpdate(event => {
|
|
127
128
|
translateY.value = event.translationY / resistance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","InteractionManager","useWindowDimensions","Gesture","Easing","interpolate","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","registry","useGestureImageViewer","data","initialIndex","onIndexChange","onDismiss","width","customWidth","dismissThreshold","resistance","animateBackdrop","enableDismissGesture","enableSwipeGesture","enableZoomGesture","enableDoubleTapGesture","enableZoomPanGesture","maxZoomScale","id","screenWidth","height","screenHeight","isZoomed","setIsZoomed","currentIndex","setCurrentIndex","manager","setManager","unsubscribeRef","initialTranslateY","initialTranslateX","startScale","translateY","translateX","scale","backdropOpacity","flatListRef","dataLength","length","value","currentScale","handleManagerChange","current","getState","subscribe","state","unsubscribeFromRegistry","subscribeToManager","setDataLength","setEnableSwipeGesture","notifyStateChange","setFlatListRef","runAfterInteractions","scrollToIndex","index","animated","cancel","onMomentumScrollEnd","event","contentOffset","nativeEvent","newIndex","Math","round","x","dismissGesture","Pan","minDistance","averageTouches","activeOffsetY","failOffsetX","enabled","onUpdate","translationY","onEnd","damping","stiffness","zoomPinchGesture","Pinch","onBegin","duration","easing","bezier","zoomPanGesture","maxTranslateX","maxTranslateY","max","min","translationX","doubleTapGesture","Tap","numberOfTaps","nextScale","zoomGesture","Simultaneous","animatedStyle","transform","backdropStyle","opacity"],"sourceRoot":"../../src","sources":["useGestureImageViewer.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","InteractionManager","useWindowDimensions","Gesture","Easing","interpolate","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","withSpring","withTiming","registry","useGestureImageViewer","data","initialIndex","onIndexChange","onDismiss","width","customWidth","dismissThreshold","resistance","animateBackdrop","enableDismissGesture","enableSwipeGesture","enableZoomGesture","enableDoubleTapGesture","enableZoomPanGesture","maxZoomScale","itemSpacing","id","screenWidth","height","screenHeight","isZoomed","setIsZoomed","currentIndex","setCurrentIndex","manager","setManager","unsubscribeRef","initialTranslateY","initialTranslateX","startScale","translateY","translateX","scale","backdropOpacity","flatListRef","dataLength","length","value","currentScale","handleManagerChange","current","getState","subscribe","state","unsubscribeFromRegistry","subscribeToManager","setDataLength","setEnableSwipeGesture","notifyStateChange","setFlatListRef","runAfterInteractions","scrollToIndex","index","animated","cancel","onMomentumScrollEnd","event","contentOffset","nativeEvent","newIndex","Math","round","x","dismissGesture","Pan","minDistance","averageTouches","activeOffsetY","failOffsetX","enabled","onUpdate","translationY","onEnd","damping","stiffness","zoomPinchGesture","Pinch","onBegin","duration","easing","bezier","zoomPanGesture","maxTranslateX","maxTranslateY","max","min","translationX","doubleTapGesture","Tap","numberOfTaps","nextScale","zoomGesture","Simultaneous","animatedStyle","transform","backdropStyle","opacity"],"sourceRoot":"../../src","sources":["useGestureImageViewer.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACzE,SACEC,kBAAkB,EAGlBC,mBAAmB,QACd,cAAc;AACrB,SAASC,OAAO,QAAQ,8BAA8B;AACtD,SACEC,MAAM,EACNC,WAAW,EACXC,OAAO,EACPC,mBAAmB,EACnBC,gBAAgB,EAChBC,cAAc,EACdC,UAAU,EACVC,UAAU,QACL,yBAAyB;AAEhC,SAASC,QAAQ,QAAQ,0BAAuB;AAQhD,OAAO,MAAMC,qBAAqB,GAAGA,CAAU;EAC7CC,IAAI;EACJC,YAAY,GAAG,CAAC;EAChBC,aAAa;EACbC,SAAS;EACTC,KAAK,EAAEC,WAAW;EAClBC,gBAAgB,GAAG,EAAE;EACrBC,UAAU,GAAG,CAAC;EACd;EACA;EACAC,eAAe,GAAG,IAAI;EACtBC,oBAAoB,GAAG,IAAI;EAC3BC,kBAAkB,GAAG,IAAI;EACzBC,iBAAiB,GAAG,IAAI;EACxBC,sBAAsB,GAAG,IAAI;EAC7BC,oBAAoB,GAAG,IAAI;EAC3BC,YAAY,GAAG,CAAC;EAChBC,WAAW,GAAG,CAAC;EACfC,EAAE,GAAG;AACwB,CAAC,KAAK;EACnC,MAAM;IAAEZ,KAAK,EAAEa,WAAW;IAAEC,MAAM,EAAEC;EAAa,CAAC,GAAG/B,mBAAmB,CAAC,CAAC;EAC1E,MAAMgB,KAAK,GAAGC,WAAW,IAAIY,WAAW;EAExC,MAAM,CAACG,QAAQ,EAAEC,WAAW,CAAC,GAAGnC,QAAQ,CAAC,KAAK,CAAC;EAE/C,MAAM,CAACoC,YAAY,EAAEC,eAAe,CAAC,GAAGrC,QAAQ,CAACe,YAAY,CAAC;EAC9D,MAAM,CAACuB,OAAO,EAAEC,UAAU,CAAC,GAAGvC,QAAQ,CAA4B,IAAI,CAAC;EAEvE,MAAMwC,cAAc,GAAGzC,MAAM,CAAsB,IAAI,CAAC;EAExD,MAAM0C,iBAAiB,GAAGhC,cAAc,CAAC,CAAC,CAAC;EAC3C,MAAMiC,iBAAiB,GAAGjC,cAAc,CAAC,CAAC,CAAC;EAC3C,MAAMkC,UAAU,GAAGlC,cAAc,CAAC,CAAC,CAAC;EAEpC,MAAMmC,UAAU,GAAGnC,cAAc,CAAC,CAAC,CAAC;EACpC,MAAMoC,UAAU,GAAGpC,cAAc,CAAC,CAAC,CAAC;EACpC,MAAMqC,KAAK,GAAGrC,cAAc,CAAC,CAAC,CAAC;EAC/B,MAAMsC,eAAe,GAAGtC,cAAc,CAAC,CAAC,CAAC;EAEzC,MAAMuC,WAAW,GAAGjD,MAAM,CAAM,IAAI,CAAC;EAErC,MAAMkD,UAAU,GAAGnC,IAAI,EAAEoC,MAAM,IAAI,CAAC;EAEpC3C,mBAAmB,CACjB,MAAMuC,KAAK,CAACK,KAAK,EAChBC,YAAY,IAAK;IAChB9C,OAAO,CAAC6B,WAAW,CAAC,CAACiB,YAAY,GAAG,CAAC,CAAC;EACxC,CACF,CAAC;EAEDvD,SAAS,CAAC,MAAM;IACd,MAAMwD,mBAAmB,GAAIf,OAAkC,IAAK;MAClEE,cAAc,CAACc,OAAO,GAAG,CAAC;MAC1Bd,cAAc,CAACc,OAAO,GAAG,IAAI;MAE7Bf,UAAU,CAACD,OAAO,CAAC;MAEnB,IAAIA,OAAO,EAAE;QACXD,eAAe,CAACC,OAAO,CAACiB,QAAQ,CAAC,CAAC,CAACnB,YAAY,CAAC;QAChDI,cAAc,CAACc,OAAO,GAAGhB,OAAO,CAACkB,SAAS,CAAEC,KAAK,IAAK;UACpDpB,eAAe,CAACoB,KAAK,CAACrB,YAAY,CAAC;QACrC,CAAC,CAAC;QACF;MACF;MAEAC,eAAe,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAMqB,uBAAuB,GAAG9C,QAAQ,CAAC+C,kBAAkB,CAAC7B,EAAE,EAAEuB,mBAAmB,CAAC;IAEpF,OAAO,MAAM;MACXK,uBAAuB,CAAC,CAAC;MACzBlB,cAAc,CAACc,OAAO,GAAG,CAAC;IAC5B,CAAC;EACH,CAAC,EAAE,CAACxB,EAAE,CAAC,CAAC;EAERjC,SAAS,CAAC,MAAM;IACd,IAAI,CAACyC,OAAO,EAAE;MACZ;IACF;IAEAA,OAAO,CAACsB,aAAa,CAACX,UAAU,CAAC;IACjCX,OAAO,CAACuB,qBAAqB,CAACrC,kBAAkB,CAAC;IACjDc,OAAO,CAACD,eAAe,CAACtB,YAAY,CAAC;IACrCuB,OAAO,CAACwB,iBAAiB,CAAC,CAAC;EAC7B,CAAC,EAAE,CAACb,UAAU,EAAEzB,kBAAkB,EAAET,YAAY,EAAEuB,OAAO,CAAC,CAAC;EAE3DzC,SAAS,CAAC,MAAM;IACd,IAAI,CAACyC,OAAO,IAAI,CAACU,WAAW,CAACM,OAAO,EAAE;MACpC;IACF;IAEAhB,OAAO,CAACyB,cAAc,CAACf,WAAW,CAACM,OAAO,CAAC;EAC7C,CAAC,EAAE,CAAChB,OAAO,CAAC,CAAC;EAEbzC,SAAS,CAAC,MAAM;IACdmB,aAAa,GAAGoB,YAAY,CAAC;EAC/B,CAAC,EAAE,CAACA,YAAY,EAAEpB,aAAa,CAAC,CAAC;EAEjCnB,SAAS,CAAC,MAAM;IACd+C,UAAU,CAACO,KAAK,GAAG,CAAC;IACpBN,UAAU,CAACM,KAAK,GAAG,CAAC;IACpBL,KAAK,CAACK,KAAK,GAAG,CAAC;IACfJ,eAAe,CAACI,KAAK,GAAG,CAAC;IACzBR,UAAU,CAACQ,KAAK,GAAG,CAAC;IAEpB,IAAIpC,YAAY,IAAI,CAAC,IAAI,CAACiC,WAAW,CAACM,OAAO,EAAE;MAC7C;IACF;IAEA,MAAMU,oBAAoB,GAAG/D,kBAAkB,CAAC+D,oBAAoB,CAAC,MAAM;MACzEhB,WAAW,CAACM,OAAO,EAAEW,aAAa,CAAC;QACjCC,KAAK,EAAEnD,YAAY;QACnBoD,QAAQ,EAAE;MACZ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAM;MACXH,oBAAoB,EAAEI,MAAM,CAAC,CAAC;IAChC,CAAC;EACH,CAAC,EAAE,CAACrD,YAAY,EAAE6B,UAAU,EAAEG,eAAe,EAAEF,UAAU,EAAEC,KAAK,EAAEH,UAAU,CAAC,CAAC;EAE9E,MAAM0B,mBAAmB,GAAGzE,WAAW,CACpC0E,KAA8C,IAAK;IAClD,IAAI,CAAC9C,kBAAkB,EAAE;MACvB;IACF;IAEA,MAAM+C,aAAa,GAAGD,KAAK,CAACE,WAAW,CAACD,aAAa;IACrD,MAAME,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACJ,aAAa,CAACK,CAAC,IAAI1D,KAAK,GAAGW,WAAW,CAAC,CAAC;IAEpE,IAAI4C,QAAQ,KAAKrC,YAAY,IAAIqC,QAAQ,IAAI,CAAC,IAAIA,QAAQ,GAAGxB,UAAU,EAAE;MACvE,IAAIX,OAAO,EAAE;QACXA,OAAO,CAACD,eAAe,CAACoC,QAAQ,CAAC;QACjCpC,eAAe,CAACoC,QAAQ,CAAC;QACzBnC,OAAO,CAACwB,iBAAiB,CAAC,CAAC;MAC7B;MAEAjB,UAAU,CAACM,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MAChCiC,UAAU,CAACO,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MAChC+B,iBAAiB,CAACS,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MACvC8B,iBAAiB,CAACU,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MACvCgC,UAAU,CAACQ,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MAChCmC,KAAK,CAACK,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;IAC7B;EACF,CAAC,EACD,CACE2B,OAAO,EACPF,YAAY,EACZa,UAAU,EACV/B,KAAK,EACLW,WAAW,EACXL,kBAAkB,EAClBqB,UAAU,EACVD,UAAU,EACVE,KAAK,EACLJ,iBAAiB,EACjBD,iBAAiB,EACjBE,UAAU,CAEd,CAAC;EAED,MAAMkC,cAAc,GAAG/E,OAAO,CAAC,MAAM;IACnC,OAAOK,OAAO,CAAC2E,GAAG,CAAC,CAAC,CACjBC,WAAW,CAAC,EAAE,CAAC,CACfC,cAAc,CAAC,IAAI,CAAC,CACpBC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACxBC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CACtBC,OAAO,CAAC,CAACjD,QAAQ,CAAC,CAClBkD,QAAQ,CAAEd,KAAK,IAAK;MACnB1B,UAAU,CAACO,KAAK,GAAGmB,KAAK,CAACe,YAAY,GAAGhE,UAAU;IACpD,CAAC,CAAC,CACDiE,KAAK,CAAEhB,KAAK,IAAK;MAChB,SAAS;;MAET,IAAIA,KAAK,CAACe,YAAY,GAAGjE,gBAAgB,IAAIG,oBAAoB,IAAIN,SAAS,EAAE;QAC9EX,OAAO,CAACW,SAAS,CAAC,CAAC,CAAC;QACpB;MACF;MAEA2B,UAAU,CAACO,KAAK,GAAGzC,UAAU,CAAC,CAAC,EAAE;QAC/B6E,OAAO,EAAE,EAAE;QACXC,SAAS,EAAE;MACb,CAAC,CAAC;IACJ,CAAC,CAAC;EACN,CAAC,EAAE,CAAC5C,UAAU,EAAExB,gBAAgB,EAAEG,oBAAoB,EAAEN,SAAS,EAAEI,UAAU,EAAEa,QAAQ,CAAC,CAAC;EAEzF,MAAMuD,gBAAgB,GAAG3F,OAAO,CAAC,MAAM;IACrC,OAAOK,OAAO,CAACuF,KAAK,CAAC,CAAC,CACnBP,OAAO,CAAC1D,iBAAiB,CAAC,CAC1BkE,OAAO,CAAC,MAAM;MACbhD,UAAU,CAACQ,KAAK,GAAGL,KAAK,CAACK,KAAK;IAChC,CAAC,CAAC,CACDiC,QAAQ,CAAEd,KAAK,IAAK;MACnBxB,KAAK,CAACK,KAAK,GAAGR,UAAU,CAACQ,KAAK,GAAGmB,KAAK,CAACxB,KAAK;IAC9C,CAAC,CAAC,CACDwC,KAAK,CAAC,MAAM;MACX,IAAIxC,KAAK,CAACK,KAAK,GAAGvB,YAAY,EAAE;QAC9BkB,KAAK,CAACK,KAAK,GAAGxC,UAAU,CAACiB,YAAY,EAAE;UACrCgE,QAAQ,EAAE,GAAG;UACbC,MAAM,EAAEzF,MAAM,CAAC0F,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;QAC5C,CAAC,CAAC;QACF;MACF;MAEA,IAAIhD,KAAK,CAACK,KAAK,GAAG,CAAC,EAAE;QACnBL,KAAK,CAACK,KAAK,GAAGxC,UAAU,CAAC,CAAC,EAAE;UAC1BiF,QAAQ,EAAE,GAAG;UACbC,MAAM,EAAEzF,MAAM,CAAC0F,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;QAC5C,CAAC,CAAC;QACFjD,UAAU,CAACM,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;QAChCiC,UAAU,CAACO,KAAK,GAAGxC,UAAU,CAAC,CAAC,CAAC;MAClC;IACF,CAAC,CAAC;EACN,CAAC,EAAE,CAACmC,KAAK,EAAErB,iBAAiB,EAAEG,YAAY,EAAEiB,UAAU,EAAED,UAAU,EAAED,UAAU,CAAC,CAAC;EAEhF,MAAMoD,cAAc,GAAGjG,OAAO,CAAC,MAAM;IACnC,OAAOK,OAAO,CAAC2E,GAAG,CAAC,CAAC,CACjBK,OAAO,CAACxD,oBAAoB,IAAIO,QAAQ,CAAC,CACzCyD,OAAO,CAAC,MAAM;MACbjD,iBAAiB,CAACS,KAAK,GAAGN,UAAU,CAACM,KAAK;MAC1CV,iBAAiB,CAACU,KAAK,GAAGP,UAAU,CAACO,KAAK;IAC5C,CAAC,CAAC,CACDiC,QAAQ,CAAEd,KAAK,IAAK;MACnB,SAAS;;MAET,IAAIxB,KAAK,CAACK,KAAK,GAAG,CAAC,EAAE;QACnB,MAAM6C,aAAa,GAAG,CAAC9E,KAAK,GAAG4B,KAAK,CAACK,KAAK,GAAGjC,KAAK,IAAI,CAAC;QACvD,MAAM+E,aAAa,GAAG,CAAChE,YAAY,GAAGa,KAAK,CAACK,KAAK,GAAGlB,YAAY,IAAI,CAAC;QAErEY,UAAU,CAACM,KAAK,GAAGuB,IAAI,CAACwB,GAAG,CACzB,CAACF,aAAa,EACdtB,IAAI,CAACyB,GAAG,CAACH,aAAa,EAAEtD,iBAAiB,CAACS,KAAK,GAAGmB,KAAK,CAAC8B,YAAY,CACtE,CAAC;QACDxD,UAAU,CAACO,KAAK,GAAGuB,IAAI,CAACwB,GAAG,CACzB,CAACD,aAAa,EACdvB,IAAI,CAACyB,GAAG,CAACF,aAAa,EAAExD,iBAAiB,CAACU,KAAK,GAAGmB,KAAK,CAACe,YAAY,CACtE,CAAC;MACH;IACF,CAAC,CAAC;EACN,CAAC,EAAE,CACDxC,UAAU,EACVD,UAAU,EACVjB,oBAAoB,EACpBO,QAAQ,EACRY,KAAK,EACLJ,iBAAiB,EACjBD,iBAAiB,EACjBvB,KAAK,EACLe,YAAY,CACb,CAAC;EAEF,MAAMoE,gBAAgB,GAAGvG,OAAO,CAAC,MAAM;IACrC,OAAOK,OAAO,CAACmG,GAAG,CAAC,CAAC,CACjBnB,OAAO,CAACzD,sBAAsB,CAAC,CAC/B6E,YAAY,CAAC,CAAC,CAAC,CACfjB,KAAK,CAAC,MAAM;MACX,MAAMkB,SAAS,GAAG1D,KAAK,CAACK,KAAK,GAAG,CAAC,GAAG,CAAC,GAAGvB,YAAY;MAEpDiB,UAAU,CAACM,KAAK,GAAGxC,UAAU,CAAC,CAAC,EAAE;QAC/BiF,QAAQ,EAAE,GAAG;QACbC,MAAM,EAAEzF,MAAM,CAAC0F,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;MAC5C,CAAC,CAAC;MACFlD,UAAU,CAACO,KAAK,GAAGxC,UAAU,CAAC,CAAC,EAAE;QAC/BiF,QAAQ,EAAE,GAAG;QACbC,MAAM,EAAEzF,MAAM,CAAC0F,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;MAC5C,CAAC,CAAC;MAEFhD,KAAK,CAACK,KAAK,GAAGxC,UAAU,CAAC6F,SAAS,EAAE;QAClCZ,QAAQ,EAAE,GAAG;QACbC,MAAM,EAAEzF,MAAM,CAAC0F,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;MAC5C,CAAC,CAAC;IACJ,CAAC,CAAC;EACN,CAAC,EAAE,CAAChD,KAAK,EAAEpB,sBAAsB,EAAEE,YAAY,EAAEiB,UAAU,EAAED,UAAU,CAAC,CAAC;EAEzE,MAAM6D,WAAW,GAAG3G,OAAO,CAAC,MAAM;IAChC,OAAOK,OAAO,CAACuG,YAAY,CAACjB,gBAAgB,EAAEM,cAAc,EAAEM,gBAAgB,CAAC;EACjF,CAAC,EAAE,CAACZ,gBAAgB,EAAEM,cAAc,EAAEM,gBAAgB,CAAC,CAAC;EAExD,MAAMM,aAAa,GAAGnG,gBAAgB,CAAC,MAAM;IAC3C,OAAO;MACLoG,SAAS,EAAE,CAAC;QAAEhE,UAAU,EAAEA,UAAU,CAACO;MAAM,CAAC,EAAE;QAAEN,UAAU,EAAEA,UAAU,CAACM;MAAM,CAAC,EAAE;QAAEL,KAAK,EAAEA,KAAK,CAACK;MAAM,CAAC;IACxG,CAAC;EACH,CAAC,CAAC;EAEF,MAAM0D,aAAa,GAAGrG,gBAAgB,CAAC,MAAM;IAC3C,IAAI,CAACc,eAAe,IAAIwB,KAAK,CAACK,KAAK,GAAG,CAAC,EAAE;MACvC,OAAO;QAAE2D,OAAO,EAAE;MAAE,CAAC;IACvB;IAEA,MAAMA,OAAO,GAAGzG,WAAW,CAACuC,UAAU,CAACO,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;IAExE,OAAO;MAAE2D;IAAQ,CAAC;EACpB,CAAC,EAAE,CAACxF,eAAe,CAAC,CAAC;EAErB,OAAO;IACLc,YAAY;IACZa,UAAU;IACVL,UAAU;IACVI,WAAW;IACXd,QAAQ;IAER2C,cAAc;IACd4B,WAAW;IAEXpC,mBAAmB;IAEnBsC,aAAa;IACbE;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { GestureImageViewerProps } from './types';
|
|
2
|
-
export declare function GestureImageViewer<T = any>({ id, data, renderImage, renderContainer, ListComponent, width: customWidth, listProps, backdropStyle: backdropStyleProps, containerStyle, initialIndex, ...props }: GestureImageViewerProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function GestureImageViewer<T = any>({ id, data, renderImage, renderContainer, ListComponent, width: customWidth, listProps, backdropStyle: backdropStyleProps, containerStyle, initialIndex, itemSpacing, ...props }: GestureImageViewerProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=GestureImageViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/GestureImageViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAWvD,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC1C,EAAc,EACd,IAAI,EACJ,WAAW,EACX,eAAe,EACf,aAAwB,EACxB,KAAK,EAAE,WAAW,EAClB,SAAS,EACT,aAAa,EAAE,kBAAkB,EACjC,cAAc,EACd,YAAgB,EAChB,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"GestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/GestureImageViewer.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAWvD,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,EAC1C,EAAc,EACd,IAAI,EACJ,WAAW,EACX,eAAe,EACf,aAAwB,EACxB,KAAK,EAAE,WAAW,EAClB,SAAS,EACT,aAAa,EAAE,kBAAkB,EACjC,cAAc,EACd,YAAgB,EAChB,WAAe,EACf,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CA8F5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,GAAG;IAC9C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IAC5D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,GAAG;IAC9C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;IAC5D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;IACvE,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;CACjD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type NativeScrollEvent, type NativeSyntheticEvent } from 'react-native';
|
|
2
2
|
import type { GestureImageViewerProps } from './types';
|
|
3
3
|
type UseGestureImageViewerProps<T = any> = Omit<GestureImageViewerProps<T>, 'renderImage' | 'renderContainer' | 'ListComponent' | 'listProps' | 'containerStyle' | 'backdropStyle'>;
|
|
4
|
-
export declare const useGestureImageViewer: <T = any>({ data, initialIndex, onIndexChange, onDismiss, width: customWidth, dismissThreshold, resistance, animateBackdrop, enableDismissGesture, enableSwipeGesture, enableZoomGesture, enableDoubleTapGesture, enableZoomPanGesture, maxZoomScale, id, }: UseGestureImageViewerProps<T>) => {
|
|
4
|
+
export declare const useGestureImageViewer: <T = any>({ data, initialIndex, onIndexChange, onDismiss, width: customWidth, dismissThreshold, resistance, animateBackdrop, enableDismissGesture, enableSwipeGesture, enableZoomGesture, enableDoubleTapGesture, enableZoomPanGesture, maxZoomScale, itemSpacing, id, }: UseGestureImageViewerProps<T>) => {
|
|
5
5
|
currentIndex: number;
|
|
6
6
|
dataLength: number;
|
|
7
7
|
translateY: import("react-native-reanimated").SharedValue<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/useGestureImageViewer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;AActB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,KAAK,0BAA0B,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAC7C,uBAAuB,CAAC,CAAC,CAAC,EAC1B,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,gBAAgB,GAAG,eAAe,CACvG,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,GAAG,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"useGestureImageViewer.d.ts","sourceRoot":"","sources":["../../../src/useGestureImageViewer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAE1B,MAAM,cAAc,CAAC;AActB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,KAAK,0BAA0B,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAC7C,uBAAuB,CAAC,CAAC,CAAC,EAC1B,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,WAAW,GAAG,gBAAgB,GAAG,eAAe,CACvG,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,GAAG,GAAG,EAAE,gQAmB5C,0BAA0B,CAAC,CAAC,CAAC;;;;;;;;iCAwGpB,oBAAoB,CAAC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;CA2LlD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-gesture-image-viewer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "🖼️ A highly customizable and easy-to-use React Native image viewer with gesture support and external controls",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -43,7 +43,27 @@
|
|
|
43
43
|
"keywords": [
|
|
44
44
|
"react-native",
|
|
45
45
|
"ios",
|
|
46
|
-
"android"
|
|
46
|
+
"android",
|
|
47
|
+
"web",
|
|
48
|
+
"expo",
|
|
49
|
+
"image-viewer",
|
|
50
|
+
"image-gallery",
|
|
51
|
+
"gesture",
|
|
52
|
+
"pinch-to-zoom",
|
|
53
|
+
"swipe",
|
|
54
|
+
"zoom",
|
|
55
|
+
"customizable",
|
|
56
|
+
"modal",
|
|
57
|
+
"carousel",
|
|
58
|
+
"slider",
|
|
59
|
+
"photo-viewer",
|
|
60
|
+
"image-carousel",
|
|
61
|
+
"touch-gestures",
|
|
62
|
+
"react-native-reanimated",
|
|
63
|
+
"react-native-gesture-handler",
|
|
64
|
+
"lightbox",
|
|
65
|
+
"gallery",
|
|
66
|
+
"viewer"
|
|
47
67
|
],
|
|
48
68
|
"repository": {
|
|
49
69
|
"type": "git",
|
|
@@ -64,7 +84,7 @@
|
|
|
64
84
|
"@changesets/cli": "^2.29.5",
|
|
65
85
|
"@commitlint/config-conventional": "^19.6.0",
|
|
66
86
|
"@evilmartians/lefthook": "^1.5.0",
|
|
67
|
-
"@react-native/babel-preset": "0.
|
|
87
|
+
"@react-native/babel-preset": "0.79.5",
|
|
68
88
|
"@types/babel__core": "^7",
|
|
69
89
|
"@types/jest": "^29.5.5",
|
|
70
90
|
"@types/react": "^19.0.12",
|
|
@@ -72,7 +92,7 @@
|
|
|
72
92
|
"del-cli": "^5.1.0",
|
|
73
93
|
"jest": "^29.7.0",
|
|
74
94
|
"react": "19.0.0",
|
|
75
|
-
"react-native": "0.79.
|
|
95
|
+
"react-native": "0.79.5",
|
|
76
96
|
"react-native-builder-bob": "^0.40.12",
|
|
77
97
|
"react-native-gesture-handler": "^2.24.0",
|
|
78
98
|
"react-native-reanimated": "^3.18.0",
|
|
@@ -25,59 +25,51 @@ export function GestureImageViewer<T = any>({
|
|
|
25
25
|
backdropStyle: backdropStyleProps,
|
|
26
26
|
containerStyle,
|
|
27
27
|
initialIndex = 0,
|
|
28
|
+
itemSpacing = 0,
|
|
28
29
|
...props
|
|
29
30
|
}: GestureImageViewerProps<T>) {
|
|
30
31
|
const { width: screenWidth } = useWindowDimensions();
|
|
31
32
|
|
|
32
33
|
const width = customWidth || screenWidth;
|
|
33
34
|
|
|
34
|
-
const {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} = useGestureImageViewer({
|
|
44
|
-
id,
|
|
45
|
-
data,
|
|
46
|
-
width,
|
|
47
|
-
initialIndex,
|
|
48
|
-
...props,
|
|
49
|
-
});
|
|
35
|
+
const { flatListRef, isZoomed, dismissGesture, zoomGesture, onMomentumScrollEnd, animatedStyle, backdropStyle } =
|
|
36
|
+
useGestureImageViewer({
|
|
37
|
+
id,
|
|
38
|
+
data,
|
|
39
|
+
width,
|
|
40
|
+
initialIndex,
|
|
41
|
+
itemSpacing,
|
|
42
|
+
...props,
|
|
43
|
+
});
|
|
50
44
|
|
|
51
45
|
const renderItem = useCallback(
|
|
52
46
|
({ item, index }: { item: T; index: number }) => {
|
|
53
|
-
const isActive = index === currentIndex;
|
|
54
|
-
|
|
55
47
|
return (
|
|
56
|
-
<
|
|
48
|
+
<View
|
|
57
49
|
style={[
|
|
58
50
|
{
|
|
59
|
-
width,
|
|
51
|
+
width: width,
|
|
60
52
|
height: '100%',
|
|
61
53
|
justifyContent: 'center',
|
|
62
54
|
alignItems: 'center',
|
|
55
|
+
marginHorizontal: itemSpacing / 2,
|
|
63
56
|
},
|
|
64
|
-
isActive && animatedStyle,
|
|
65
57
|
]}
|
|
66
58
|
>
|
|
67
59
|
{renderImage(item, index)}
|
|
68
|
-
</
|
|
60
|
+
</View>
|
|
69
61
|
);
|
|
70
62
|
},
|
|
71
|
-
[width,
|
|
63
|
+
[width, itemSpacing, renderImage],
|
|
72
64
|
);
|
|
73
65
|
|
|
74
66
|
const getItemLayout = useCallback(
|
|
75
67
|
(_: any, index: number) => ({
|
|
76
|
-
length: width,
|
|
77
|
-
offset: width * index,
|
|
68
|
+
length: width + itemSpacing,
|
|
69
|
+
offset: (width + itemSpacing) * index,
|
|
78
70
|
index,
|
|
79
71
|
}),
|
|
80
|
-
[width],
|
|
72
|
+
[width, itemSpacing],
|
|
81
73
|
);
|
|
82
74
|
|
|
83
75
|
const keyExtractor = useCallback((item: T, index: number) => `image-${index}-${item}`, []);
|
|
@@ -97,14 +89,13 @@ export function GestureImageViewer<T = any>({
|
|
|
97
89
|
<GestureDetector gesture={gesture}>
|
|
98
90
|
<View style={[styles.container, containerStyle]}>
|
|
99
91
|
<Animated.View style={[styles.background, backdropStyleProps, backdropStyle]} />
|
|
100
|
-
<View style={styles.content}>
|
|
92
|
+
<Animated.View style={[styles.content, animatedStyle]}>
|
|
101
93
|
<ListComponent
|
|
102
94
|
ref={flatListRef}
|
|
103
95
|
data={data}
|
|
104
96
|
renderItem={renderItem}
|
|
105
97
|
keyExtractor={keyExtractor}
|
|
106
98
|
horizontal
|
|
107
|
-
pagingEnabled
|
|
108
99
|
scrollEnabled={!isZoomed}
|
|
109
100
|
showsHorizontalScrollIndicator={false}
|
|
110
101
|
onMomentumScrollEnd={onMomentumScrollEnd}
|
|
@@ -112,12 +103,17 @@ export function GestureImageViewer<T = any>({
|
|
|
112
103
|
initialScrollIndex={initialIndex}
|
|
113
104
|
windowSize={3}
|
|
114
105
|
maxToRenderPerBatch={3}
|
|
115
|
-
removeClippedSubviews
|
|
106
|
+
removeClippedSubviews
|
|
107
|
+
snapToInterval={width + itemSpacing}
|
|
108
|
+
estimatedItemSize={width + itemSpacing}
|
|
109
|
+
snapToAlignment="center"
|
|
110
|
+
decelerationRate="fast"
|
|
111
|
+
scrollEventThrottle={16}
|
|
116
112
|
// NOTE - https://github.com/necolas/react-native-web/issues/1299
|
|
117
113
|
{...(Platform.OS === 'web' && { dataSet: { 'paging-enabled-fix': true } })}
|
|
118
114
|
{...listProps}
|
|
119
115
|
/>
|
|
120
|
-
</View>
|
|
116
|
+
</Animated.View>
|
|
121
117
|
<WebPagingFix />
|
|
122
118
|
</View>
|
|
123
119
|
</GestureDetector>
|
package/src/types.ts
CHANGED
|
@@ -42,6 +42,7 @@ export const useGestureImageViewer = <T = any>({
|
|
|
42
42
|
enableDoubleTapGesture = true,
|
|
43
43
|
enableZoomPanGesture = true,
|
|
44
44
|
maxZoomScale = 2,
|
|
45
|
+
itemSpacing = 0,
|
|
45
46
|
id = 'default',
|
|
46
47
|
}: UseGestureImageViewerProps<T>) => {
|
|
47
48
|
const { width: screenWidth, height: screenHeight } = useWindowDimensions();
|
|
@@ -153,7 +154,7 @@ export const useGestureImageViewer = <T = any>({
|
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
const contentOffset = event.nativeEvent.contentOffset;
|
|
156
|
-
const newIndex = Math.round(contentOffset.x / width);
|
|
157
|
+
const newIndex = Math.round(contentOffset.x / (width + itemSpacing));
|
|
157
158
|
|
|
158
159
|
if (newIndex !== currentIndex && newIndex >= 0 && newIndex < dataLength) {
|
|
159
160
|
if (manager) {
|
|
@@ -175,6 +176,7 @@ export const useGestureImageViewer = <T = any>({
|
|
|
175
176
|
currentIndex,
|
|
176
177
|
dataLength,
|
|
177
178
|
width,
|
|
179
|
+
itemSpacing,
|
|
178
180
|
enableSwipeGesture,
|
|
179
181
|
translateX,
|
|
180
182
|
translateY,
|