@one-am/react-native-simple-image-slider 0.2.2 → 0.3.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.
- package/README.md +29 -3
- package/lib/commonjs/@types/icons.js +6 -0
- package/lib/commonjs/@types/icons.js.map +1 -0
- package/lib/commonjs/@types/pinch-to-zoom.js +6 -0
- package/lib/commonjs/@types/pinch-to-zoom.js.map +1 -0
- package/lib/commonjs/@types/slider.js +6 -0
- package/lib/commonjs/@types/slider.js.map +1 -0
- package/lib/commonjs/BaseSimpleImageSlider.js +9 -3
- package/lib/commonjs/BaseSimpleImageSlider.js.map +1 -1
- package/lib/commonjs/FullScreenImageSlider.js +21 -8
- package/lib/commonjs/FullScreenImageSlider.js.map +1 -1
- package/lib/commonjs/PageCounter.js +26 -24
- package/lib/commonjs/PageCounter.js.map +1 -1
- package/lib/commonjs/PinchToZoom.js +14 -16
- package/lib/commonjs/PinchToZoom.js.map +1 -1
- package/lib/commonjs/SimpleImageSlider.js +4 -1
- package/lib/commonjs/SimpleImageSlider.js.map +1 -1
- package/lib/commonjs/icons/IconX.js +42 -0
- package/lib/commonjs/icons/IconX.js.map +1 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/@types/icons.js +2 -0
- package/lib/module/@types/icons.js.map +1 -0
- package/lib/module/@types/pinch-to-zoom.js +2 -0
- package/lib/module/@types/pinch-to-zoom.js.map +1 -0
- package/lib/module/@types/slider.js +2 -0
- package/lib/module/@types/slider.js.map +1 -0
- package/lib/module/BaseSimpleImageSlider.js +9 -3
- package/lib/module/BaseSimpleImageSlider.js.map +1 -1
- package/lib/module/FullScreenImageSlider.js +21 -8
- package/lib/module/FullScreenImageSlider.js.map +1 -1
- package/lib/module/PageCounter.js +26 -23
- package/lib/module/PageCounter.js.map +1 -1
- package/lib/module/PinchToZoom.js +14 -16
- package/lib/module/PinchToZoom.js.map +1 -1
- package/lib/module/SimpleImageSlider.js +4 -1
- package/lib/module/SimpleImageSlider.js.map +1 -1
- package/lib/module/icons/IconX.js +33 -0
- package/lib/module/icons/IconX.js.map +1 -0
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/@types/icons.d.ts +6 -0
- package/lib/typescript/src/@types/icons.d.ts.map +1 -0
- package/lib/typescript/src/@types/pinch-to-zoom.d.ts +9 -0
- package/lib/typescript/src/@types/pinch-to-zoom.d.ts.map +1 -0
- package/lib/typescript/src/@types/slider.d.ts +5 -0
- package/lib/typescript/src/@types/slider.d.ts.map +1 -0
- package/lib/typescript/src/BaseSimpleImageSlider.d.ts +10 -8
- package/lib/typescript/src/BaseSimpleImageSlider.d.ts.map +1 -1
- package/lib/typescript/src/FullScreenImageSlider.d.ts +38 -3
- package/lib/typescript/src/FullScreenImageSlider.d.ts.map +1 -1
- package/lib/typescript/src/PageCounter.d.ts +9 -0
- package/lib/typescript/src/PageCounter.d.ts.map +1 -1
- package/lib/typescript/src/PinchToZoom.d.ts +36 -6
- package/lib/typescript/src/PinchToZoom.d.ts.map +1 -1
- package/lib/typescript/src/SimpleImageSlider.d.ts +13 -1
- package/lib/typescript/src/SimpleImageSlider.d.ts.map +1 -1
- package/lib/typescript/src/icons/IconX.d.ts +5 -0
- package/lib/typescript/src/icons/IconX.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +7 -9
- package/src/@types/icons.ts +6 -0
- package/src/@types/pinch-to-zoom.ts +9 -0
- package/src/@types/slider.ts +5 -0
- package/src/BaseSimpleImageSlider.tsx +13 -16
- package/src/FullScreenImageSlider.tsx +49 -16
- package/src/PageCounter.tsx +26 -25
- package/src/PinchToZoom.tsx +49 -28
- package/src/SimpleImageSlider.tsx +10 -5
- package/src/icons/IconX.tsx +24 -0
- package/src/index.tsx +5 -0
package/src/PinchToZoom.tsx
CHANGED
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
import Animated, {
|
|
9
9
|
cancelAnimation,
|
|
10
10
|
runOnJS,
|
|
11
|
-
type SharedValue,
|
|
12
11
|
useAnimatedReaction,
|
|
13
12
|
useAnimatedStyle,
|
|
14
13
|
useSharedValue,
|
|
@@ -17,38 +16,63 @@ import Animated, {
|
|
|
17
16
|
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
18
17
|
import { clamp } from './utils/clamp';
|
|
19
18
|
import * as Haptics from 'expo-haptics';
|
|
19
|
+
import type { PinchToZoomStatus } from './@types/pinch-to-zoom';
|
|
20
20
|
|
|
21
21
|
export type PinchToZoomProps = PropsWithChildren<{
|
|
22
|
+
/**
|
|
23
|
+
* @description The minimum zoom scale of the image.
|
|
24
|
+
* @default 1
|
|
25
|
+
*/
|
|
22
26
|
minimumZoomScale?: number;
|
|
27
|
+
/**
|
|
28
|
+
* @description The maximum zoom scale of the image.
|
|
29
|
+
* @default 8
|
|
30
|
+
*/
|
|
23
31
|
maximumZoomScale?: number;
|
|
32
|
+
/**
|
|
33
|
+
* @description Additional styles or styles to override default style of the container View.
|
|
34
|
+
*/
|
|
24
35
|
style?: StyleProp<ViewStyle>;
|
|
25
|
-
|
|
26
|
-
|
|
36
|
+
/**
|
|
37
|
+
* @description Whether all gestures should be disabled or not.
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
27
40
|
disabled?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* @description Callback that is called when the layout of the container changes.
|
|
43
|
+
* @param {LayoutChangeEvent} e The layout change event.
|
|
44
|
+
*/
|
|
28
45
|
onLayout?: (e: LayoutChangeEvent) => void;
|
|
46
|
+
/**
|
|
47
|
+
* @description Callback that is called when the scale of the image changes to a value different from `minimumZoomScale`.
|
|
48
|
+
*/
|
|
29
49
|
onScaleChange?: () => void;
|
|
50
|
+
/**
|
|
51
|
+
* @description Callback that is called when the scale of the image changes to `minimumZoomScale`.
|
|
52
|
+
*/
|
|
30
53
|
onScaleReset?: () => void;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
) => void;
|
|
36
|
-
|
|
54
|
+
/**
|
|
55
|
+
* @description Callback that is called when either the translation or the scale of the image change.
|
|
56
|
+
* @param {PinchToZoomStatus} status The current status.
|
|
57
|
+
*/
|
|
58
|
+
onTranslationChange?: (status: PinchToZoomStatus) => void;
|
|
59
|
+
/**
|
|
60
|
+
* @description Callback that is called when gestures should lead to the item being dismissed.
|
|
61
|
+
*/
|
|
62
|
+
onDismiss?: () => void;
|
|
37
63
|
}>;
|
|
38
64
|
|
|
39
65
|
export default function PinchToZoom({
|
|
40
66
|
minimumZoomScale = 1,
|
|
41
67
|
maximumZoomScale = 8,
|
|
42
68
|
style: propStyle,
|
|
43
|
-
onPinchStart,
|
|
44
|
-
onPinchEnd,
|
|
45
69
|
disabled,
|
|
46
70
|
onLayout,
|
|
47
71
|
onTranslationChange,
|
|
48
72
|
onScaleChange,
|
|
49
73
|
onScaleReset,
|
|
50
74
|
children,
|
|
51
|
-
|
|
75
|
+
onDismiss,
|
|
52
76
|
}: PinchToZoomProps) {
|
|
53
77
|
const { height: windowHeight } = useWindowDimensions();
|
|
54
78
|
|
|
@@ -76,7 +100,6 @@ export default function PinchToZoom({
|
|
|
76
100
|
cancelAnimation(scale);
|
|
77
101
|
prevScale.value = scale.value;
|
|
78
102
|
offsetScale.value = scale.value;
|
|
79
|
-
if (onPinchStart) runOnJS(onPinchStart)();
|
|
80
103
|
if (onScaleChange) runOnJS(onScaleChange)();
|
|
81
104
|
})
|
|
82
105
|
.onUpdate((e) => {
|
|
@@ -118,8 +141,8 @@ export default function PinchToZoom({
|
|
|
118
141
|
isPinching.value = false;
|
|
119
142
|
|
|
120
143
|
if (scale.value < minimumZoomScale / 2 && prevScale.value <= minimumZoomScale) {
|
|
121
|
-
if (
|
|
122
|
-
runOnJS(
|
|
144
|
+
if (onDismiss) {
|
|
145
|
+
runOnJS(onDismiss)();
|
|
123
146
|
}
|
|
124
147
|
} else if (scale.value < minimumZoomScale) {
|
|
125
148
|
runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Light);
|
|
@@ -134,8 +157,6 @@ export default function PinchToZoom({
|
|
|
134
157
|
prevScale.value = 0;
|
|
135
158
|
prevTranslationX.value = translationX.value;
|
|
136
159
|
prevTranslationY.value = translationY.value;
|
|
137
|
-
|
|
138
|
-
if (onPinchEnd) runOnJS(onPinchEnd)();
|
|
139
160
|
}),
|
|
140
161
|
|
|
141
162
|
[
|
|
@@ -145,7 +166,6 @@ export default function PinchToZoom({
|
|
|
145
166
|
scale,
|
|
146
167
|
prevScale,
|
|
147
168
|
offsetScale,
|
|
148
|
-
onPinchStart,
|
|
149
169
|
onScaleChange,
|
|
150
170
|
maximumZoomScale,
|
|
151
171
|
isPinching,
|
|
@@ -156,8 +176,7 @@ export default function PinchToZoom({
|
|
|
156
176
|
viewWidth.value,
|
|
157
177
|
viewHeight.value,
|
|
158
178
|
minimumZoomScale,
|
|
159
|
-
|
|
160
|
-
onRequestClose,
|
|
179
|
+
onDismiss,
|
|
161
180
|
onScaleReset,
|
|
162
181
|
]
|
|
163
182
|
);
|
|
@@ -196,8 +215,8 @@ export default function PinchToZoom({
|
|
|
196
215
|
Math.abs(translationX.value) > viewWidth.value / 2 ||
|
|
197
216
|
Math.abs(translationY.value) > viewHeight.value / 2
|
|
198
217
|
) {
|
|
199
|
-
if (
|
|
200
|
-
runOnJS(
|
|
218
|
+
if (onDismiss) {
|
|
219
|
+
runOnJS(onDismiss)();
|
|
201
220
|
}
|
|
202
221
|
} else {
|
|
203
222
|
runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Light);
|
|
@@ -227,7 +246,7 @@ export default function PinchToZoom({
|
|
|
227
246
|
[
|
|
228
247
|
disabled,
|
|
229
248
|
minimumZoomScale,
|
|
230
|
-
|
|
249
|
+
onDismiss,
|
|
231
250
|
prevScale.value,
|
|
232
251
|
prevTranslationX,
|
|
233
252
|
prevTranslationY,
|
|
@@ -279,14 +298,16 @@ export default function PinchToZoom({
|
|
|
279
298
|
useAnimatedReaction(
|
|
280
299
|
() => {
|
|
281
300
|
return {
|
|
282
|
-
scale: scale
|
|
283
|
-
|
|
284
|
-
|
|
301
|
+
scale: scale,
|
|
302
|
+
translation: {
|
|
303
|
+
x: translationX,
|
|
304
|
+
y: translationY,
|
|
305
|
+
},
|
|
285
306
|
};
|
|
286
307
|
},
|
|
287
|
-
() => {
|
|
308
|
+
(prepared) => {
|
|
288
309
|
if (onTranslationChange) {
|
|
289
|
-
runOnJS(onTranslationChange)(
|
|
310
|
+
runOnJS(onTranslationChange)(prepared);
|
|
290
311
|
}
|
|
291
312
|
},
|
|
292
313
|
[onTranslationChange]
|
|
@@ -2,15 +2,20 @@ import React, { forwardRef, useCallback, useRef, useState } from 'react';
|
|
|
2
2
|
import { FlashList } from '@shopify/flash-list';
|
|
3
3
|
import mergeRefs from 'merge-refs';
|
|
4
4
|
import FullScreenImageSlider from './FullScreenImageSlider';
|
|
5
|
-
import BaseListImageSlider, {
|
|
6
|
-
|
|
7
|
-
type SimpleImageSliderItem,
|
|
8
|
-
} from './BaseSimpleImageSlider';
|
|
5
|
+
import BaseListImageSlider, { type BaseSimpleImageSliderProps } from './BaseSimpleImageSlider';
|
|
6
|
+
import type { SimpleImageSliderItem } from './@types/slider';
|
|
9
7
|
|
|
10
8
|
export type SimpleImageSliderProps = BaseSimpleImageSliderProps & {
|
|
9
|
+
/**
|
|
10
|
+
* @description Whether the full screen mode is enabled or not. **Caution:** when this is enabled, the `onItemPress` prop will be ignored.
|
|
11
|
+
* @default false
|
|
12
|
+
*/
|
|
11
13
|
fullScreenEnabled?: boolean;
|
|
12
14
|
};
|
|
13
15
|
|
|
16
|
+
/**
|
|
17
|
+
* @description A simple image slider that displays images in a list and can show a {@link FullScreenImageSlider} on press.
|
|
18
|
+
*/
|
|
14
19
|
const SimpleImageSlider = forwardRef<FlashList<SimpleImageSliderItem>, SimpleImageSliderProps>(
|
|
15
20
|
function ListImageSlider(
|
|
16
21
|
{ data, fullScreenEnabled = false, onItemPress, onViewableItemChange, ...props },
|
|
@@ -49,7 +54,7 @@ const SimpleImageSlider = forwardRef<FlashList<SimpleImageSliderItem>, SimpleIma
|
|
|
49
54
|
{...props}
|
|
50
55
|
data={data}
|
|
51
56
|
ref={mergeRefs(ref, listRef)}
|
|
52
|
-
onItemPress={
|
|
57
|
+
onItemPress={openFullScreen ?? onItemPress}
|
|
53
58
|
onViewableItemChange={internalOnViewableItemChange}
|
|
54
59
|
/>
|
|
55
60
|
{fullScreenEnabled ? (
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Svg, { Path } from 'react-native-svg';
|
|
3
|
+
import type { IconsProps } from '../@types/icons';
|
|
4
|
+
|
|
5
|
+
function IconX({ size = 24, color = '#1f2937', stroke = 2, ...props }: IconsProps) {
|
|
6
|
+
return (
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
<Svg
|
|
10
|
+
width={size}
|
|
11
|
+
height={size}
|
|
12
|
+
viewBox="0 0 24 24"
|
|
13
|
+
strokeWidth={stroke}
|
|
14
|
+
stroke={color}
|
|
15
|
+
fill="none"
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
<Path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
|
19
|
+
<Path d="M18 6l-12 12" />
|
|
20
|
+
<Path d="M6 6l12 12" />
|
|
21
|
+
</Svg>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
export default IconX;
|
package/src/index.tsx
CHANGED
|
@@ -2,6 +2,8 @@ import StyledComponentsThemeProvider from './StyledComponentsThemeProvider';
|
|
|
2
2
|
import BaseListImageSlider, { type BaseSimpleImageSliderProps } from './BaseSimpleImageSlider';
|
|
3
3
|
import SimpleImageSlider, { type SimpleImageSliderProps } from './SimpleImageSlider';
|
|
4
4
|
import FullScreenImageSlider, { type FullScreenImageSliderProps } from './FullScreenImageSlider';
|
|
5
|
+
import PinchToZoom, { type PinchToZoomProps } from './PinchToZoom';
|
|
6
|
+
import type { SimpleImageSliderItem } from './@types/slider';
|
|
5
7
|
|
|
6
8
|
export {
|
|
7
9
|
StyledComponentsThemeProvider as SimpleImageSliderThemeProvider,
|
|
@@ -11,4 +13,7 @@ export {
|
|
|
11
13
|
type SimpleImageSliderProps,
|
|
12
14
|
FullScreenImageSlider,
|
|
13
15
|
type FullScreenImageSliderProps,
|
|
16
|
+
PinchToZoom,
|
|
17
|
+
type PinchToZoomProps,
|
|
18
|
+
type SimpleImageSliderItem,
|
|
14
19
|
};
|