@one-am/react-native-simple-image-slider 0.2.2 → 0.3.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.
Files changed (72) hide show
  1. package/README.md +26 -3
  2. package/lib/commonjs/@types/icons.js +6 -0
  3. package/lib/commonjs/@types/icons.js.map +1 -0
  4. package/lib/commonjs/@types/pinch-to-zoom.js +6 -0
  5. package/lib/commonjs/@types/pinch-to-zoom.js.map +1 -0
  6. package/lib/commonjs/@types/slider.js +6 -0
  7. package/lib/commonjs/@types/slider.js.map +1 -0
  8. package/lib/commonjs/BaseSimpleImageSlider.js +9 -3
  9. package/lib/commonjs/BaseSimpleImageSlider.js.map +1 -1
  10. package/lib/commonjs/FullScreenImageSlider.js +21 -8
  11. package/lib/commonjs/FullScreenImageSlider.js.map +1 -1
  12. package/lib/commonjs/PageCounter.js +26 -24
  13. package/lib/commonjs/PageCounter.js.map +1 -1
  14. package/lib/commonjs/PinchToZoom.js +14 -16
  15. package/lib/commonjs/PinchToZoom.js.map +1 -1
  16. package/lib/commonjs/SimpleImageSlider.js +4 -1
  17. package/lib/commonjs/SimpleImageSlider.js.map +1 -1
  18. package/lib/commonjs/icons/IconX.js +42 -0
  19. package/lib/commonjs/icons/IconX.js.map +1 -0
  20. package/lib/commonjs/index.js +7 -0
  21. package/lib/commonjs/index.js.map +1 -1
  22. package/lib/module/@types/icons.js +2 -0
  23. package/lib/module/@types/icons.js.map +1 -0
  24. package/lib/module/@types/pinch-to-zoom.js +2 -0
  25. package/lib/module/@types/pinch-to-zoom.js.map +1 -0
  26. package/lib/module/@types/slider.js +2 -0
  27. package/lib/module/@types/slider.js.map +1 -0
  28. package/lib/module/BaseSimpleImageSlider.js +9 -3
  29. package/lib/module/BaseSimpleImageSlider.js.map +1 -1
  30. package/lib/module/FullScreenImageSlider.js +21 -8
  31. package/lib/module/FullScreenImageSlider.js.map +1 -1
  32. package/lib/module/PageCounter.js +26 -23
  33. package/lib/module/PageCounter.js.map +1 -1
  34. package/lib/module/PinchToZoom.js +14 -16
  35. package/lib/module/PinchToZoom.js.map +1 -1
  36. package/lib/module/SimpleImageSlider.js +4 -1
  37. package/lib/module/SimpleImageSlider.js.map +1 -1
  38. package/lib/module/icons/IconX.js +33 -0
  39. package/lib/module/icons/IconX.js.map +1 -0
  40. package/lib/module/index.js +2 -1
  41. package/lib/module/index.js.map +1 -1
  42. package/lib/typescript/src/@types/icons.d.ts +6 -0
  43. package/lib/typescript/src/@types/icons.d.ts.map +1 -0
  44. package/lib/typescript/src/@types/pinch-to-zoom.d.ts +9 -0
  45. package/lib/typescript/src/@types/pinch-to-zoom.d.ts.map +1 -0
  46. package/lib/typescript/src/@types/slider.d.ts +5 -0
  47. package/lib/typescript/src/@types/slider.d.ts.map +1 -0
  48. package/lib/typescript/src/BaseSimpleImageSlider.d.ts +10 -8
  49. package/lib/typescript/src/BaseSimpleImageSlider.d.ts.map +1 -1
  50. package/lib/typescript/src/FullScreenImageSlider.d.ts +38 -3
  51. package/lib/typescript/src/FullScreenImageSlider.d.ts.map +1 -1
  52. package/lib/typescript/src/PageCounter.d.ts +9 -0
  53. package/lib/typescript/src/PageCounter.d.ts.map +1 -1
  54. package/lib/typescript/src/PinchToZoom.d.ts +36 -6
  55. package/lib/typescript/src/PinchToZoom.d.ts.map +1 -1
  56. package/lib/typescript/src/SimpleImageSlider.d.ts +13 -1
  57. package/lib/typescript/src/SimpleImageSlider.d.ts.map +1 -1
  58. package/lib/typescript/src/icons/IconX.d.ts +5 -0
  59. package/lib/typescript/src/icons/IconX.d.ts.map +1 -0
  60. package/lib/typescript/src/index.d.ts +3 -1
  61. package/lib/typescript/src/index.d.ts.map +1 -1
  62. package/package.json +3 -5
  63. package/src/@types/icons.ts +6 -0
  64. package/src/@types/pinch-to-zoom.ts +9 -0
  65. package/src/@types/slider.ts +5 -0
  66. package/src/BaseSimpleImageSlider.tsx +13 -16
  67. package/src/FullScreenImageSlider.tsx +49 -16
  68. package/src/PageCounter.tsx +26 -25
  69. package/src/PinchToZoom.tsx +49 -28
  70. package/src/SimpleImageSlider.tsx +10 -5
  71. package/src/icons/IconX.tsx +24 -0
  72. package/src/index.tsx +5 -0
@@ -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
- onPinchStart?: () => void;
26
- onPinchEnd?: () => void;
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
- onTranslationChange?: (
32
- x: SharedValue<number>,
33
- y: SharedValue<number>,
34
- scale: SharedValue<number>
35
- ) => void;
36
- onRequestClose?: () => void;
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
- onRequestClose,
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 (onRequestClose) {
122
- runOnJS(onRequestClose)();
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
- onPinchEnd,
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 (onRequestClose) {
200
- runOnJS(onRequestClose)();
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
- onRequestClose,
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.value,
283
- translationX: translationX.value,
284
- translationY: translationY.value,
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)(translationX, translationY, scale);
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
- type BaseSimpleImageSliderProps,
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={onItemPress ?? openFullScreen}
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
  };