react-native-reanimated-carousel 5.0.0-beta.6 → 5.0.0-beta.8

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 (68) hide show
  1. package/README.md +32 -2
  2. package/lib/commonjs/components/CarouselLayout.js +1 -1
  3. package/lib/commonjs/components/CarouselLayout.js.map +1 -1
  4. package/lib/commonjs/components/ItemRenderer.js +1 -1
  5. package/lib/commonjs/components/ItemRenderer.js.map +1 -1
  6. package/lib/commonjs/components/ScrollViewGesture.js +1 -1
  7. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
  8. package/lib/commonjs/hooks/useOnProgressChange.js +1 -1
  9. package/lib/commonjs/hooks/useOnProgressChange.js.map +1 -1
  10. package/lib/commonjs/hooks/usePropsErrorBoundary.js +1 -1
  11. package/lib/commonjs/hooks/usePropsErrorBoundary.js.map +1 -1
  12. package/lib/commonjs/hooks/useVisibleRanges.js +1 -1
  13. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  14. package/lib/module/components/CarouselLayout.js +1 -1
  15. package/lib/module/components/CarouselLayout.js.map +1 -1
  16. package/lib/module/components/ItemRenderer.js +1 -1
  17. package/lib/module/components/ItemRenderer.js.map +1 -1
  18. package/lib/module/components/ScrollViewGesture.js +1 -1
  19. package/lib/module/components/ScrollViewGesture.js.map +1 -1
  20. package/lib/module/hooks/useOnProgressChange.js +1 -1
  21. package/lib/module/hooks/useOnProgressChange.js.map +1 -1
  22. package/lib/module/hooks/usePropsErrorBoundary.js +1 -1
  23. package/lib/module/hooks/usePropsErrorBoundary.js.map +1 -1
  24. package/lib/module/hooks/useVisibleRanges.js +1 -1
  25. package/lib/module/hooks/useVisibleRanges.js.map +1 -1
  26. package/lib/typescript/components/CarouselLayout.d.ts.map +1 -1
  27. package/lib/typescript/components/ItemRenderer.d.ts +1 -0
  28. package/lib/typescript/components/ItemRenderer.d.ts.map +1 -1
  29. package/lib/typescript/components/ScrollViewGesture.d.ts.map +1 -1
  30. package/lib/typescript/hooks/usePropsErrorBoundary.d.ts.map +1 -1
  31. package/lib/typescript/hooks/useVisibleRanges.d.ts +6 -0
  32. package/lib/typescript/hooks/useVisibleRanges.d.ts.map +1 -1
  33. package/lib/typescript/types.d.ts +1 -1
  34. package/package.json +4 -2
  35. package/src/components/CarouselLayout.tsx +4 -4
  36. package/src/components/ItemRenderer.tsx +11 -6
  37. package/src/components/ScrollViewGesture.tsx +8 -11
  38. package/src/hooks/useOnProgressChange.ts +1 -1
  39. package/src/hooks/usePropsErrorBoundary.ts +4 -3
  40. package/src/hooks/useVisibleRanges.tsx +80 -54
  41. package/src/types.ts +1 -1
  42. package/src/components/Carousel.test.tsx +0 -1215
  43. package/src/components/LazyView.test.tsx +0 -61
  44. package/src/components/Pagination/Pagination.test.tsx +0 -178
  45. package/src/components/rnr-demo.test.tsx +0 -53
  46. package/src/hooks/useAutoPlay.test.ts +0 -194
  47. package/src/hooks/useCarouselController.test.tsx +0 -1158
  48. package/src/hooks/useCheckMounted.test.ts +0 -47
  49. package/src/hooks/useCommonVariables.test.tsx +0 -384
  50. package/src/hooks/useInitProps.test.tsx +0 -134
  51. package/src/hooks/useLayoutConfig.test.tsx +0 -247
  52. package/src/hooks/useOffsetX.test.ts +0 -54
  53. package/src/hooks/useOnProgressChange.test.tsx +0 -207
  54. package/src/hooks/usePanGestureProxy.test.tsx +0 -368
  55. package/src/hooks/useUpdateGestureConfig.test.ts +0 -89
  56. package/src/hooks/useVisibleRanges.test.tsx +0 -347
  57. package/src/layouts/parallax.test.ts +0 -239
  58. package/src/layouts/stack.test.ts +0 -252
  59. package/src/store/index.test.tsx +0 -314
  60. package/src/utils/compute-gesture-translation.test.ts +0 -70
  61. package/src/utils/compute-offset-if-data-changed.test.ts +0 -133
  62. package/src/utils/compute-offset-if-size-changed.test.ts +0 -78
  63. package/src/utils/computed-with-auto-fill-data.test.ts +0 -298
  64. package/src/utils/deal-with-animation.test.ts +0 -181
  65. package/src/utils/handleroffset-direction.test.ts +0 -124
  66. package/src/utils/index.test.ts +0 -90
  67. package/src/utils/log.test.ts +0 -134
  68. package/src/utils/sanitize-animation-style.test.ts +0 -40
@@ -1,247 +0,0 @@
1
- import React from "react";
2
- import { View } from "react-native";
3
-
4
- import { renderHook } from "@testing-library/react-hooks";
5
-
6
- import { useLayoutConfig } from "./useLayoutConfig";
7
-
8
- describe("useLayoutConfig", () => {
9
- const defaultProps = {
10
- size: 300,
11
- vertical: false,
12
- };
13
- it("should return normal layout by default", () => {
14
- const { result } = renderHook(() =>
15
- useLayoutConfig({
16
- ...defaultProps,
17
- data: [],
18
- renderItem: () => <View />,
19
- loop: false,
20
- autoFillData: false,
21
- defaultIndex: 0,
22
- autoPlayInterval: 0,
23
- scrollAnimationDuration: 0,
24
- width: 0,
25
- height: 0,
26
- rawData: [],
27
- dataLength: 0,
28
- rawDataLength: 0,
29
- })
30
- );
31
-
32
- expect(result.current).toBeDefined();
33
- expect(typeof result.current).toBe("function");
34
- });
35
-
36
- it("should handle parallax mode", () => {
37
- const props = {
38
- ...defaultProps,
39
- mode: "parallax" as const,
40
- modeConfig: {
41
- parallaxScrollingScale: 0.9,
42
- parallaxScrollingOffset: 50,
43
- parallaxAdjacentItemScale: 0.8,
44
- },
45
- };
46
-
47
- const { result } = renderHook(() =>
48
- useLayoutConfig({
49
- ...props,
50
- data: [],
51
- renderItem: () => <View />,
52
- loop: false,
53
- autoFillData: false,
54
- defaultIndex: 0,
55
- autoPlayInterval: 0,
56
- scrollAnimationDuration: 0,
57
- width: 0,
58
- height: 0,
59
- rawData: [],
60
- dataLength: 0,
61
- rawDataLength: 0,
62
- })
63
- );
64
- const style = result.current(0); // Test with offset 0
65
-
66
- expect(style.transform).toBeDefined();
67
- expect(style.transform).toContainEqual({ translateX: 0 });
68
- expect(style.transform).toContainEqual({ scale: 0.9 });
69
- });
70
-
71
- it("should handle horizontal-stack mode", () => {
72
- const props = {
73
- ...defaultProps,
74
- mode: "horizontal-stack" as const,
75
- modeConfig: {
76
- snapDirection: "left" as const,
77
- showLength: 3,
78
- },
79
- };
80
-
81
- const { result } = renderHook(() =>
82
- useLayoutConfig({
83
- ...props,
84
- data: [],
85
- renderItem: () => <View />,
86
- loop: false,
87
- autoFillData: false,
88
- defaultIndex: 0,
89
- autoPlayInterval: 0,
90
- scrollAnimationDuration: 0,
91
- width: 0,
92
- height: 0,
93
- rawData: [],
94
- dataLength: 0,
95
- rawDataLength: 0,
96
- })
97
- );
98
- const style = result.current(0); // Test with offset 0
99
-
100
- expect(style.transform).toBeDefined();
101
- expect(style.zIndex).toBeDefined();
102
- expect(style.opacity).toBeDefined();
103
- });
104
-
105
- it("should handle vertical-stack mode", () => {
106
- const props = {
107
- ...defaultProps,
108
- mode: "vertical-stack" as const,
109
- modeConfig: {
110
- snapDirection: "left" as const,
111
- showLength: 3,
112
- },
113
- };
114
-
115
- const { result } = renderHook(() =>
116
- useLayoutConfig({
117
- ...props,
118
- data: [],
119
- renderItem: () => <View />,
120
- loop: false,
121
- autoFillData: false,
122
- defaultIndex: 0,
123
- autoPlayInterval: 0,
124
- scrollAnimationDuration: 0,
125
- width: 0,
126
- height: 0,
127
- rawData: [],
128
- dataLength: 0,
129
- rawDataLength: 0,
130
- })
131
- );
132
- const style = result.current(0); // Test with offset 0
133
-
134
- expect(style.transform).toBeDefined();
135
- expect(style.zIndex).toBeDefined();
136
- expect(style.opacity).toBeDefined();
137
- });
138
-
139
- it("should handle vertical orientation", () => {
140
- const props = {
141
- ...defaultProps,
142
- vertical: true,
143
- };
144
-
145
- const { result } = renderHook(() =>
146
- useLayoutConfig({
147
- ...props,
148
- data: [],
149
- renderItem: () => <View />,
150
- loop: false,
151
- autoFillData: false,
152
- defaultIndex: 0,
153
- autoPlayInterval: 0,
154
- scrollAnimationDuration: 0,
155
- width: 0,
156
- height: 0,
157
- rawData: [],
158
- dataLength: 0,
159
- rawDataLength: 0,
160
- })
161
- );
162
- const style = result.current(0); // Test with offset 0
163
-
164
- expect(style.transform).toBeDefined();
165
- expect(style.transform).toContainEqual({ translateY: 0 });
166
- });
167
-
168
- it("should handle different offsets", () => {
169
- const { result } = renderHook(() =>
170
- useLayoutConfig({
171
- ...defaultProps,
172
- data: [],
173
- renderItem: () => <View />,
174
- loop: false,
175
- autoFillData: false,
176
- defaultIndex: 0,
177
- autoPlayInterval: 0,
178
- scrollAnimationDuration: 0,
179
- width: 0,
180
- height: 0,
181
- rawData: [],
182
- dataLength: 0,
183
- rawDataLength: 0,
184
- })
185
- );
186
-
187
- const style1 = result.current(-1); // Previous item
188
- const style2 = result.current(0); // Current item
189
- const style3 = result.current(1); // Next item
190
-
191
- expect(style1.transform).toContainEqual({ translateX: -300 });
192
- expect(style2.transform).toContainEqual({ translateX: 0 });
193
- expect(style3.transform).toContainEqual({ translateX: 300 });
194
- });
195
-
196
- it("should memoize layout function", () => {
197
- const { result, rerender } = renderHook(() =>
198
- useLayoutConfig({
199
- ...defaultProps,
200
- data: [],
201
- renderItem: () => <View />,
202
- loop: false,
203
- autoFillData: false,
204
- defaultIndex: 0,
205
- autoPlayInterval: 0,
206
- scrollAnimationDuration: 0,
207
- width: 0,
208
- height: 0,
209
- rawData: [],
210
- dataLength: 0,
211
- rawDataLength: 0,
212
- })
213
- );
214
- const firstResult = result.current;
215
-
216
- rerender();
217
- expect(result.current).toBe(firstResult);
218
- });
219
-
220
- it("should update layout when props change", () => {
221
- const { result, rerender } = renderHook(
222
- (props) =>
223
- useLayoutConfig({
224
- ...props,
225
- data: [],
226
- renderItem: () => <View />,
227
- loop: false,
228
- autoFillData: false,
229
- defaultIndex: 0,
230
- autoPlayInterval: 0,
231
- scrollAnimationDuration: 0,
232
- width: 0,
233
- height: 0,
234
- rawData: [],
235
- dataLength: 0,
236
- rawDataLength: 0,
237
- }),
238
- {
239
- initialProps: defaultProps,
240
- }
241
- );
242
- const firstResult = result.current;
243
-
244
- rerender({ ...defaultProps, size: 400 });
245
- expect(result.current).not.toBe(firstResult);
246
- });
247
- });
@@ -1,54 +0,0 @@
1
- import { useSharedValue } from "react-native-reanimated";
2
-
3
- import { renderHook } from "@testing-library/react-hooks";
4
-
5
- import type { IOpts } from "./useOffsetX";
6
- import { useOffsetX } from "./useOffsetX";
7
- import type { IVisibleRanges } from "./useVisibleRanges";
8
-
9
- describe("useSharedValue", () => {
10
- it("should return the correct values", async () => {
11
- const hook = renderHook(() => {
12
- const range = useSharedValue({
13
- negativeRange: [7, 9],
14
- positiveRange: [0, 3],
15
- }) as IVisibleRanges;
16
- const inputs: Array<{
17
- config: IOpts;
18
- range: IVisibleRanges;
19
- }> = Array.from({ length: 10 }).map((_, index) => ({
20
- config: {
21
- dataLength: 10,
22
- handlerOffset: useSharedValue(-0),
23
- index,
24
- loop: false,
25
- size: 393,
26
- },
27
- range,
28
- }));
29
-
30
- return inputs.map((input) => {
31
- const { config, range } = input;
32
-
33
- return useOffsetX(config, range);
34
- });
35
- });
36
-
37
- const expected = hook.result.current.map((v) => v.value).slice();
38
-
39
- expect(expected).toMatchInlineSnapshot(`
40
- [
41
- 0,
42
- 393,
43
- 786,
44
- 1179,
45
- 9007199254740991,
46
- 9007199254740991,
47
- 9007199254740991,
48
- 2751,
49
- 3144,
50
- 3537,
51
- ]
52
- `);
53
- });
54
- });
@@ -1,207 +0,0 @@
1
- import { useSharedValue } from "react-native-reanimated";
2
-
3
- import { renderHook } from "@testing-library/react-hooks";
4
-
5
- import { useOnProgressChange } from "./useOnProgressChange";
6
-
7
- // Mock Reanimated and Easing
8
- jest.mock("react-native-reanimated", () => {
9
- let reactionCallback: ((value: any) => void) | null = null;
10
-
11
- return {
12
- useSharedValue: jest.fn((initialValue) => ({
13
- value: initialValue,
14
- })),
15
- useAnimatedReaction: jest.fn((deps, cb) => {
16
- reactionCallback = cb;
17
- const depsResult = deps();
18
- cb(depsResult);
19
- return () => {
20
- reactionCallback = null;
21
- };
22
- }),
23
- Easing: {
24
- bezier: () => ({
25
- factory: () => 0,
26
- }),
27
- },
28
- // Export the helper function for testing
29
- __triggerReaction: (value: any) => {
30
- if (reactionCallback) reactionCallback(value);
31
- },
32
- };
33
- });
34
-
35
- jest.mock("react-native-worklets", () => {
36
- const mockScheduleOnRN = jest.fn((fn, ...args) => fn(...args));
37
- return {
38
- scheduleOnRN: mockScheduleOnRN,
39
- mockScheduleOnRN,
40
- };
41
- });
42
-
43
- // Mock computedOffsetXValueWithAutoFillData
44
- jest.mock("../utils/computed-with-auto-fill-data", () => ({
45
- computedOffsetXValueWithAutoFillData: jest.fn(({ value }) => value),
46
- }));
47
-
48
- describe("useOnProgressChange", () => {
49
- const mockOffsetX = useSharedValue(0);
50
- const mockSizeReady = useSharedValue(true);
51
- const mockOnProgressChange = jest.fn();
52
- const { __triggerReaction } = jest.requireMock("react-native-reanimated");
53
-
54
- beforeEach(() => {
55
- jest.clearAllMocks();
56
- mockOffsetX.value = 0;
57
- });
58
-
59
- it("should handle progress change with function callback", () => {
60
- renderHook(() =>
61
- useOnProgressChange({
62
- size: 300,
63
- sizeReady: mockSizeReady,
64
- autoFillData: false,
65
- loop: false,
66
- offsetX: mockOffsetX,
67
- rawDataLength: 5,
68
- onProgressChange: mockOnProgressChange,
69
- })
70
- );
71
-
72
- mockOffsetX.value = -300; // Move to next slide
73
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
74
- expect(mockOnProgressChange).toHaveBeenCalledWith(-300, 1);
75
- });
76
-
77
- it("should handle progress change with shared value", () => {
78
- const progressValue = useSharedValue(0);
79
- renderHook(() =>
80
- useOnProgressChange({
81
- size: 300,
82
- sizeReady: mockSizeReady,
83
- autoFillData: false,
84
- loop: false,
85
- offsetX: mockOffsetX,
86
- rawDataLength: 5,
87
- onProgressChange: progressValue,
88
- })
89
- );
90
-
91
- mockOffsetX.value = -300; // Move to next slide
92
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
93
- expect(progressValue.value).toBe(1);
94
- });
95
-
96
- it("should handle loop mode", () => {
97
- renderHook(() =>
98
- useOnProgressChange({
99
- size: 300,
100
- sizeReady: mockSizeReady,
101
- autoFillData: false,
102
- loop: true,
103
- offsetX: mockOffsetX,
104
- rawDataLength: 5,
105
- onProgressChange: mockOnProgressChange,
106
- })
107
- );
108
-
109
- mockOffsetX.value = -1500; // Move to last slide
110
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
111
- expect(mockOnProgressChange).toHaveBeenCalledWith(-1500, 5);
112
- });
113
-
114
- it("should handle autoFillData mode", () => {
115
- renderHook(() =>
116
- useOnProgressChange({
117
- size: 300,
118
- sizeReady: mockSizeReady,
119
- autoFillData: true,
120
- loop: false,
121
- offsetX: mockOffsetX,
122
- rawDataLength: 3,
123
- onProgressChange: mockOnProgressChange,
124
- })
125
- );
126
-
127
- mockOffsetX.value = -300; // Move to next slide
128
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
129
- expect(mockOnProgressChange).toHaveBeenCalledWith(-300, 1);
130
- });
131
-
132
- it("should clamp values when not in loop mode", () => {
133
- renderHook(() =>
134
- useOnProgressChange({
135
- size: 300,
136
- sizeReady: mockSizeReady,
137
- autoFillData: false,
138
- loop: false,
139
- offsetX: mockOffsetX,
140
- rawDataLength: 3,
141
- onProgressChange: mockOnProgressChange,
142
- })
143
- );
144
-
145
- mockOffsetX.value = 300; // Try to move before first slide
146
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
147
- expect(mockOnProgressChange).toHaveBeenCalledWith(0, 0);
148
-
149
- mockOffsetX.value = -900; // Try to move after last slide
150
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
151
- expect(mockOnProgressChange).toHaveBeenCalledWith(-600, 2);
152
- });
153
-
154
- it("should handle positive offset values", () => {
155
- renderHook(() =>
156
- useOnProgressChange({
157
- size: 300,
158
- sizeReady: mockSizeReady,
159
- autoFillData: false,
160
- loop: true,
161
- offsetX: mockOffsetX,
162
- rawDataLength: 5,
163
- onProgressChange: mockOnProgressChange,
164
- })
165
- );
166
-
167
- mockOffsetX.value = 300; // Move backwards
168
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
169
- expect(mockOnProgressChange).toHaveBeenCalledWith(300, 4);
170
- });
171
-
172
- it("should not call onProgressChange if not provided", () => {
173
- renderHook(() =>
174
- useOnProgressChange({
175
- size: 300,
176
- sizeReady: mockSizeReady,
177
- autoFillData: false,
178
- loop: false,
179
- offsetX: mockOffsetX,
180
- rawDataLength: 5,
181
- })
182
- );
183
-
184
- mockOffsetX.value = -300; // Move to next slide
185
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeReady.value });
186
- // Should not throw any errors or call any callbacks
187
- });
188
-
189
- it("should not trigger progress change when size is not ready", () => {
190
- const mockSizeNotReady = useSharedValue(false);
191
- renderHook(() =>
192
- useOnProgressChange({
193
- size: 300,
194
- sizeReady: mockSizeNotReady,
195
- autoFillData: false,
196
- loop: false,
197
- offsetX: mockOffsetX,
198
- rawDataLength: 5,
199
- onProgressChange: mockOnProgressChange,
200
- })
201
- );
202
-
203
- mockOffsetX.value = -300; // Move to next slide
204
- __triggerReaction({ offset: mockOffsetX.value, ready: mockSizeNotReady.value });
205
- expect(mockOnProgressChange).not.toHaveBeenCalled();
206
- });
207
- });