react-native-reanimated-carousel 4.0.0-alpha.5 → 4.0.0-alpha.7

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 (88) hide show
  1. package/lib/commonjs/{layouts → components}/BaseLayout.js +4 -2
  2. package/lib/commonjs/components/BaseLayout.js.map +1 -0
  3. package/lib/commonjs/components/Carousel.js +8 -5
  4. package/lib/commonjs/components/Carousel.js.map +1 -1
  5. package/lib/commonjs/components/ScrollViewGesture.js +34 -30
  6. package/lib/commonjs/components/ScrollViewGesture.js.map +1 -1
  7. package/lib/commonjs/hooks/useCarouselController.js +4 -3
  8. package/lib/commonjs/hooks/useCarouselController.js.map +1 -1
  9. package/lib/commonjs/hooks/useLayoutConfig.js.map +1 -1
  10. package/lib/commonjs/hooks/useOffsetX.js +9 -6
  11. package/lib/commonjs/hooks/useOffsetX.js.map +1 -1
  12. package/lib/commonjs/hooks/useOffsetX.test.js +53 -0
  13. package/lib/commonjs/hooks/useOffsetX.test.js.map +1 -0
  14. package/lib/commonjs/hooks/usePanGestureProxy.js +84 -0
  15. package/lib/commonjs/hooks/usePanGestureProxy.js.map +1 -0
  16. package/lib/commonjs/hooks/usePanGestureProxy.test.js +397 -0
  17. package/lib/commonjs/hooks/usePanGestureProxy.test.js.map +1 -0
  18. package/lib/commonjs/hooks/useUpdateGestureConfig.js.map +1 -1
  19. package/lib/commonjs/hooks/useVisibleRanges.js +20 -8
  20. package/lib/commonjs/hooks/useVisibleRanges.js.map +1 -1
  21. package/lib/commonjs/hooks/useVisibleRanges.test.js +162 -0
  22. package/lib/commonjs/hooks/useVisibleRanges.test.js.map +1 -0
  23. package/lib/commonjs/utils/handleroffset-direction.js +5 -5
  24. package/lib/commonjs/utils/handleroffset-direction.js.map +1 -1
  25. package/lib/commonjs/utils/handleroffset-direction.test.js +46 -0
  26. package/lib/commonjs/utils/handleroffset-direction.test.js.map +1 -0
  27. package/lib/module/{layouts → components}/BaseLayout.js +4 -2
  28. package/lib/module/components/BaseLayout.js.map +1 -0
  29. package/lib/module/components/Carousel.js +7 -4
  30. package/lib/module/components/Carousel.js.map +1 -1
  31. package/lib/module/components/ScrollViewGesture.js +36 -31
  32. package/lib/module/components/ScrollViewGesture.js.map +1 -1
  33. package/lib/module/hooks/useCarouselController.js +4 -3
  34. package/lib/module/hooks/useCarouselController.js.map +1 -1
  35. package/lib/module/hooks/useLayoutConfig.js.map +1 -1
  36. package/lib/module/hooks/useOffsetX.js +9 -6
  37. package/lib/module/hooks/useOffsetX.js.map +1 -1
  38. package/lib/module/hooks/useOffsetX.test.js +48 -0
  39. package/lib/module/hooks/useOffsetX.test.js.map +1 -0
  40. package/lib/module/hooks/usePanGestureProxy.js +71 -0
  41. package/lib/module/hooks/usePanGestureProxy.js.map +1 -0
  42. package/lib/module/hooks/usePanGestureProxy.test.js +383 -0
  43. package/lib/module/hooks/usePanGestureProxy.test.js.map +1 -0
  44. package/lib/module/hooks/useUpdateGestureConfig.js.map +1 -1
  45. package/lib/module/hooks/useVisibleRanges.js +20 -8
  46. package/lib/module/hooks/useVisibleRanges.js.map +1 -1
  47. package/lib/module/hooks/useVisibleRanges.test.js +157 -0
  48. package/lib/module/hooks/useVisibleRanges.test.js.map +1 -0
  49. package/lib/module/utils/handleroffset-direction.js +5 -5
  50. package/lib/module/utils/handleroffset-direction.js.map +1 -1
  51. package/lib/module/utils/handleroffset-direction.test.js +41 -0
  52. package/lib/module/utils/handleroffset-direction.test.js.map +1 -0
  53. package/lib/typescript/hooks/useCarouselController.d.ts +2 -1
  54. package/lib/typescript/hooks/useLayoutConfig.d.ts +1 -1
  55. package/lib/typescript/hooks/useOffsetX.test.d.ts +1 -0
  56. package/lib/typescript/hooks/usePanGestureProxy.d.ts +9 -0
  57. package/lib/typescript/hooks/usePanGestureProxy.test.d.ts +1 -0
  58. package/lib/typescript/hooks/useUpdateGestureConfig.d.ts +3 -2
  59. package/lib/typescript/hooks/useVisibleRanges.d.ts +1 -0
  60. package/lib/typescript/hooks/useVisibleRanges.test.d.ts +1 -0
  61. package/lib/typescript/types.d.ts +5 -0
  62. package/lib/typescript/utils/handleroffset-direction.d.ts +2 -1
  63. package/lib/typescript/utils/handleroffset-direction.test.d.ts +1 -0
  64. package/package.json +2 -1
  65. package/src/{layouts → components}/BaseLayout.tsx +10 -8
  66. package/src/components/Carousel.tsx +5 -2
  67. package/src/components/ScrollViewGesture.tsx +48 -43
  68. package/src/hooks/useCarouselController.tsx +16 -13
  69. package/src/hooks/useLayoutConfig.ts +1 -1
  70. package/src/hooks/useOffsetX.test.ts +54 -0
  71. package/src/hooks/useOffsetX.ts +33 -31
  72. package/src/hooks/usePanGestureProxy.test.tsx +377 -0
  73. package/src/hooks/usePanGestureProxy.ts +110 -0
  74. package/src/hooks/useUpdateGestureConfig.ts +4 -2
  75. package/src/hooks/useVisibleRanges.test.tsx +179 -0
  76. package/src/hooks/useVisibleRanges.tsx +25 -9
  77. package/src/types.ts +5 -0
  78. package/src/utils/handleroffset-direction.test.ts +52 -0
  79. package/src/utils/handleroffset-direction.ts +12 -9
  80. package/lib/commonjs/layouts/BaseLayout.js.map +0 -1
  81. package/lib/commonjs/layouts/ParallaxLayout.js +0 -84
  82. package/lib/commonjs/layouts/ParallaxLayout.js.map +0 -1
  83. package/lib/module/layouts/BaseLayout.js.map +0 -1
  84. package/lib/module/layouts/ParallaxLayout.js +0 -61
  85. package/lib/module/layouts/ParallaxLayout.js.map +0 -1
  86. package/lib/typescript/layouts/ParallaxLayout.d.ts +0 -13
  87. package/src/layouts/ParallaxLayout.tsx +0 -141
  88. /package/lib/typescript/{layouts → components}/BaseLayout.d.ts +0 -0
@@ -0,0 +1,383 @@
1
+ import React from "react";
2
+ import { Text } from "react-native";
3
+ import { Gesture, GestureDetector, GestureHandlerRootView, State } from "react-native-gesture-handler";
4
+ import { cleanup, render } from "@testing-library/react-native";
5
+ import { fireGestureHandler, getByGestureTestId } from "react-native-gesture-handler/jest-utils";
6
+ import { usePanGestureProxy } from "./usePanGestureProxy";
7
+ beforeEach(cleanup);
8
+
9
+ const mockedEventHandlers = () => {
10
+ return {
11
+ begin: jest.fn(),
12
+ start: jest.fn(),
13
+ active: jest.fn(),
14
+ end: jest.fn(),
15
+ fail: jest.fn(),
16
+ cancel: jest.fn(),
17
+ finish: jest.fn()
18
+ };
19
+ };
20
+
21
+ const mockedEventHandlersFromUser = () => {
22
+ return {
23
+ begin: jest.fn(),
24
+ start: jest.fn(),
25
+ active: jest.fn(),
26
+ end: jest.fn(),
27
+ fail: jest.fn(),
28
+ cancel: jest.fn(),
29
+ finish: jest.fn()
30
+ };
31
+ };
32
+
33
+ describe("Using RNGH v2 gesture API", () => {
34
+ function SingleHandler(_ref) {
35
+ let {
36
+ handlers,
37
+ handlersFromUser,
38
+ treatStartAsUpdate
39
+ } = _ref;
40
+ const pan = usePanGestureProxy({
41
+ onConfigurePanGesture: gesture => {
42
+ // This is user's customizations
43
+ gesture.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onBegin(handlersFromUser.begin).onUpdate(handlersFromUser.active).onEnd(handlersFromUser.end).onFinalize(handlers.finish).withTestId("pan");
44
+ },
45
+ onGestureBegin: handlers.begin,
46
+ onGestureUpdate: handlers.active,
47
+ onGestureEnd: handlers.end,
48
+ options: {
49
+ enabled: true
50
+ }
51
+ });
52
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
53
+ gesture: pan
54
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
55
+ }
56
+
57
+ function RacingHandlers(_ref2) {
58
+ let {
59
+ tapHandlers,
60
+ panHandlers
61
+ } = _ref2;
62
+ const tap = Gesture.Tap().onBegin(tapHandlers.begin).onEnd(tapHandlers.end).withTestId("tap");
63
+ const pan = usePanGestureProxy({
64
+ onConfigurePanGesture: _ => {
65
+ _.onFinalize(panHandlers.finish).withTestId("pan");
66
+ },
67
+ onGestureBegin: panHandlers.begin,
68
+ onGestureUpdate: panHandlers.active,
69
+ onGestureEnd: panHandlers.end,
70
+ options: {
71
+ enabled: true
72
+ }
73
+ });
74
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
75
+ gesture: Gesture.Race(tap, pan)
76
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
77
+ }
78
+
79
+ it("sends events to handlers", () => {
80
+ const tapHandlers = mockedEventHandlers();
81
+ const panHandlers = mockedEventHandlers();
82
+ render( /*#__PURE__*/React.createElement(RacingHandlers, {
83
+ tapHandlers: tapHandlers,
84
+ panHandlers: panHandlers
85
+ }));
86
+ fireGestureHandler(getByGestureTestId("pan"), [{
87
+ state: State.BEGAN
88
+ }, {
89
+ state: State.ACTIVE
90
+ }, {
91
+ state: State.END
92
+ }]);
93
+ expect(panHandlers.begin).toBeCalledWith(expect.objectContaining({
94
+ state: State.BEGAN
95
+ }));
96
+ expect(panHandlers.finish).toBeCalled();
97
+ expect(tapHandlers.begin).not.toBeCalled();
98
+ });
99
+ it("sends events with additional data to handlers", () => {
100
+ const panHandlers = mockedEventHandlers();
101
+ const panHandlersFromUser = mockedEventHandlersFromUser();
102
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
103
+ handlers: panHandlers,
104
+ handlersFromUser: panHandlersFromUser,
105
+ treatStartAsUpdate: true
106
+ }));
107
+ fireGestureHandler(getByGestureTestId("pan"), [{
108
+ state: State.BEGAN,
109
+ translationX: 0
110
+ }, {
111
+ state: State.ACTIVE,
112
+ translationX: 10
113
+ }, {
114
+ translationX: 20
115
+ }, {
116
+ translationX: 20
117
+ }, {
118
+ state: State.END,
119
+ translationX: 30
120
+ }]);
121
+ expect(panHandlersFromUser.begin).toBeCalledTimes(1);
122
+ expect(panHandlersFromUser.active).toBeCalledTimes(2);
123
+ expect(panHandlersFromUser.end).toBeCalledTimes(1);
124
+ expect(panHandlers.active).toBeCalledTimes(3);
125
+ expect(panHandlers.active).toHaveBeenLastCalledWith(expect.objectContaining({
126
+ translationX: 20
127
+ }));
128
+ });
129
+ });
130
+ describe("Event list validation", () => {
131
+ function SingleHandler(_ref3) {
132
+ let {
133
+ handlers,
134
+ handlersFromUser,
135
+ treatStartAsUpdate
136
+ } = _ref3;
137
+ const pan = usePanGestureProxy({
138
+ onConfigurePanGesture: _ => {
139
+ _.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onBegin(handlersFromUser.begin).onUpdate(handlersFromUser.active).onEnd(handlersFromUser.end).onFinalize(handlers.finish).withTestId("pan");
140
+ },
141
+ onGestureBegin: handlers.begin,
142
+ onGestureUpdate: handlers.active,
143
+ onGestureEnd: handlers.end,
144
+ options: {
145
+ enabled: true
146
+ }
147
+ });
148
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
149
+ gesture: pan
150
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
151
+ }
152
+
153
+ it("throws error when oldState doesn't correspond to previous event's state", () => {
154
+ const panHandlers = mockedEventHandlers();
155
+ const panHandlersFromUser = mockedEventHandlersFromUser();
156
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
157
+ handlers: panHandlers,
158
+ handlersFromUser: panHandlersFromUser
159
+ }));
160
+ expect(() => {
161
+ fireGestureHandler(getByGestureTestId("pan"), [{
162
+ oldState: State.UNDETERMINED,
163
+ state: State.BEGAN,
164
+ x: 0,
165
+ y: 10
166
+ }, {
167
+ oldState: State.UNDETERMINED,
168
+ state: State.ACTIVE,
169
+ x: 1,
170
+ y: 11
171
+ }]);
172
+ }).toThrow("when state changes, oldState should be the same as previous event' state");
173
+ });
174
+ it.each([[State.END], [State.FAILED], [State.CANCELLED]])("correctly handles events ending with state %s", lastState => {
175
+ const panHandlers = mockedEventHandlers();
176
+ const panHandlersFromUser = mockedEventHandlersFromUser();
177
+ render( /*#__PURE__*/React.createElement(SingleHandler, {
178
+ handlers: panHandlers,
179
+ handlersFromUser: panHandlersFromUser
180
+ }));
181
+ fireGestureHandler(getByGestureTestId("pan"), [{
182
+ state: State.BEGAN
183
+ }, {
184
+ state: State.ACTIVE
185
+ }, {
186
+ state: lastState
187
+ }]);
188
+ expect(panHandlersFromUser.begin).toBeCalledTimes(1);
189
+ expect(panHandlersFromUser.active).toBeCalledTimes(0);
190
+ expect(panHandlersFromUser.end).toBeCalledTimes(1);
191
+ if (lastState === State.END) expect(panHandlers.end).toBeCalled();else expect(panHandlers.finish).toBeCalledWith(expect.any(Object), false);
192
+ });
193
+ });
194
+ describe("Filling event list with defaults", () => {
195
+ function RacingTapAndPan(_ref4) {
196
+ let {
197
+ handlers,
198
+ treatStartAsUpdate
199
+ } = _ref4;
200
+ const tap = Gesture.Tap().onBegin(handlers.begin).onEnd(handlers.end).withTestId("tap");
201
+ const pan = usePanGestureProxy({
202
+ onConfigurePanGesture: _ => {
203
+ _.onStart(treatStartAsUpdate ? handlers.active : handlers.start).onFinalize(handlers.finish).withTestId("pan");
204
+ },
205
+ onGestureBegin: handlers.begin,
206
+ onGestureUpdate: handlers.active,
207
+ onGestureEnd: handlers.end,
208
+ options: {
209
+ enabled: true
210
+ }
211
+ });
212
+ return /*#__PURE__*/React.createElement(GestureHandlerRootView, null, /*#__PURE__*/React.createElement(GestureDetector, {
213
+ gesture: Gesture.Exclusive(pan, tap)
214
+ }, /*#__PURE__*/React.createElement(Text, null, "v2 API test")));
215
+ }
216
+
217
+ it("fills oldState if not passed", () => {
218
+ const handlers = mockedEventHandlers();
219
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
220
+ handlers: handlers,
221
+ treatStartAsUpdate: true
222
+ }));
223
+ fireGestureHandler(getByGestureTestId("pan"), [{
224
+ state: State.BEGAN
225
+ }, {
226
+ state: State.ACTIVE
227
+ }, {
228
+ state: State.ACTIVE
229
+ }, {
230
+ state: State.ACTIVE
231
+ }, {
232
+ state: State.END
233
+ }]);
234
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
235
+ oldState: State.UNDETERMINED
236
+ }));
237
+ expect(handlers.active).nthCalledWith(1, expect.objectContaining({
238
+ oldState: State.BEGAN
239
+ }));
240
+ expect(handlers.active).lastCalledWith(expect.not.objectContaining({
241
+ oldState: expect.anything()
242
+ }));
243
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
244
+ oldState: State.ACTIVE
245
+ }), true);
246
+ });
247
+ it("fills missing ACTIVE states", () => {
248
+ const panHandlers = mockedEventHandlers();
249
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
250
+ handlers: panHandlers,
251
+ treatStartAsUpdate: true
252
+ }));
253
+ fireGestureHandler(getByGestureTestId("pan"), [{
254
+ state: State.BEGAN,
255
+ x: 0,
256
+ y: 10
257
+ }, {
258
+ state: State.ACTIVE,
259
+ x: 1,
260
+ y: 11
261
+ }, {
262
+ x: 2,
263
+ y: 12
264
+ }, {
265
+ x: 3,
266
+ y: 13
267
+ }, {
268
+ state: State.END,
269
+ x: 4,
270
+ y: 14
271
+ }]);
272
+ expect(panHandlers.active).toBeCalledTimes(3);
273
+ expect(panHandlers.active).toHaveBeenLastCalledWith(expect.objectContaining({
274
+ x: 3,
275
+ y: 13
276
+ }));
277
+ });
278
+ it("fills BEGIN and END events for discrete handlers", () => {
279
+ const handlers = mockedEventHandlers();
280
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
281
+ handlers: handlers,
282
+ treatStartAsUpdate: true
283
+ }));
284
+ fireGestureHandler(getByGestureTestId("tap"), [{
285
+ x: 5
286
+ }]);
287
+ expect(handlers.begin).toBeCalledTimes(1);
288
+ expect(handlers.end).toBeCalledTimes(1);
289
+ });
290
+ it("with FAILED event, fills BEGIN event for discrete handlers", () => {
291
+ const handlers = mockedEventHandlers();
292
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
293
+ handlers: handlers,
294
+ treatStartAsUpdate: true
295
+ }));
296
+ fireGestureHandler(getByGestureTestId("tap"), [{
297
+ state: State.FAILED
298
+ }]);
299
+ expect(handlers.begin).toBeCalledTimes(1);
300
+ expect(handlers.end).toBeCalledTimes(1);
301
+ expect(handlers.end).toBeCalledWith(expect.anything(), false);
302
+ });
303
+ it("uses event data from first event in filled BEGIN, ACTIVE events", () => {
304
+ const handlers = mockedEventHandlers();
305
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
306
+ handlers: handlers,
307
+ treatStartAsUpdate: true
308
+ }));
309
+ fireGestureHandler(getByGestureTestId("pan"), [{
310
+ x: 120
311
+ }]);
312
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
313
+ x: 120
314
+ }));
315
+ expect(handlers.active).toHaveBeenNthCalledWith(1, expect.objectContaining({
316
+ x: 120
317
+ }));
318
+ });
319
+ it("uses event data from last event in filled END events", () => {
320
+ const handlers = mockedEventHandlers();
321
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
322
+ handlers: handlers,
323
+ treatStartAsUpdate: true
324
+ }));
325
+ fireGestureHandler(getByGestureTestId("pan"), [{
326
+ x: 120,
327
+ state: State.FAILED
328
+ }]);
329
+ expect(handlers.begin).toBeCalledTimes(1);
330
+ expect(handlers.active).toBeCalledTimes(1);
331
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
332
+ x: 120
333
+ }), false);
334
+ });
335
+ it("uses event data filled events", () => {
336
+ const handlers = mockedEventHandlers();
337
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
338
+ handlers: handlers,
339
+ treatStartAsUpdate: true
340
+ }));
341
+ fireGestureHandler(getByGestureTestId("pan"), [{
342
+ x: 5,
343
+ y: 15
344
+ }, {
345
+ x: 6,
346
+ y: 16
347
+ }, {
348
+ x: 7,
349
+ y: 17
350
+ }]);
351
+ expect(handlers.begin).toBeCalledWith(expect.objectContaining({
352
+ x: 5,
353
+ y: 15
354
+ }));
355
+ expect(handlers.active).toBeCalledTimes(3);
356
+ expect(handlers.end).toBeCalledWith(expect.objectContaining({
357
+ x: 7,
358
+ y: 17
359
+ }), true);
360
+ });
361
+ it("fills BEGIN and END events when they're not present, for discrete handlers", () => {
362
+ const handlers = mockedEventHandlers();
363
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
364
+ handlers: handlers,
365
+ treatStartAsUpdate: true
366
+ }));
367
+ fireGestureHandler(getByGestureTestId("tap"));
368
+ expect(handlers.begin).toBeCalledTimes(1);
369
+ expect(handlers.end).toHaveBeenCalledTimes(1);
370
+ });
371
+ it("fills BEGIN, ACTIVE and END events when they're not present, for continuous handlers", () => {
372
+ const handlers = mockedEventHandlers();
373
+ render( /*#__PURE__*/React.createElement(RacingTapAndPan, {
374
+ handlers: handlers,
375
+ treatStartAsUpdate: true
376
+ }));
377
+ fireGestureHandler(getByGestureTestId("pan"));
378
+ expect(handlers.begin).toBeCalledTimes(1);
379
+ expect(handlers.active).toBeCalledTimes(1);
380
+ expect(handlers.end).toHaveBeenCalledTimes(1);
381
+ });
382
+ });
383
+ //# sourceMappingURL=usePanGestureProxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["usePanGestureProxy.test.tsx"],"names":["React","Text","Gesture","GestureDetector","GestureHandlerRootView","State","cleanup","render","fireGestureHandler","getByGestureTestId","usePanGestureProxy","beforeEach","mockedEventHandlers","begin","jest","fn","start","active","end","fail","cancel","finish","mockedEventHandlersFromUser","describe","SingleHandler","handlers","handlersFromUser","treatStartAsUpdate","pan","onConfigurePanGesture","gesture","onStart","onBegin","onUpdate","onEnd","onFinalize","withTestId","onGestureBegin","onGestureUpdate","onGestureEnd","options","enabled","RacingHandlers","tapHandlers","panHandlers","tap","Tap","_","Race","it","state","BEGAN","ACTIVE","END","expect","toBeCalledWith","objectContaining","toBeCalled","not","panHandlersFromUser","translationX","toBeCalledTimes","toHaveBeenLastCalledWith","oldState","UNDETERMINED","x","y","toThrow","each","FAILED","CANCELLED","lastState","any","Object","RacingTapAndPan","Exclusive","nthCalledWith","lastCalledWith","anything","toHaveBeenNthCalledWith","toHaveBeenCalledTimes"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,cAArB;AAEA,SAASC,OAAT,EAAkBC,eAAlB,EAAmCC,sBAAnC,EAA2DC,KAA3D,QAAwE,8BAAxE;AAEA,SAASC,OAAT,EAAkBC,MAAlB,QAAgC,+BAAhC;AACA,SAASC,kBAAT,EAA6BC,kBAA7B,QAAuD,yCAAvD;AAEA,SAASC,kBAAT,QAAmC,sBAAnC;AAEAC,UAAU,CAACL,OAAD,CAAV;;AAEA,MAAMM,mBAAmB,GAAG,MAAM;AAChC,SAAO;AACLC,IAAAA,KAAK,EAAEC,IAAI,CAACC,EAAL,EADF;AAELC,IAAAA,KAAK,EAAEF,IAAI,CAACC,EAAL,EAFF;AAGLE,IAAAA,MAAM,EAAEH,IAAI,CAACC,EAAL,EAHH;AAILG,IAAAA,GAAG,EAAEJ,IAAI,CAACC,EAAL,EAJA;AAKLI,IAAAA,IAAI,EAAEL,IAAI,CAACC,EAAL,EALD;AAMLK,IAAAA,MAAM,EAAEN,IAAI,CAACC,EAAL,EANH;AAOLM,IAAAA,MAAM,EAAEP,IAAI,CAACC,EAAL;AAPH,GAAP;AASD,CAVD;;AAYA,MAAMO,2BAA2B,GAAG,MAAM;AACxC,SAAO;AACLT,IAAAA,KAAK,EAAEC,IAAI,CAACC,EAAL,EADF;AAELC,IAAAA,KAAK,EAAEF,IAAI,CAACC,EAAL,EAFF;AAGLE,IAAAA,MAAM,EAAEH,IAAI,CAACC,EAAL,EAHH;AAILG,IAAAA,GAAG,EAAEJ,IAAI,CAACC,EAAL,EAJA;AAKLI,IAAAA,IAAI,EAAEL,IAAI,CAACC,EAAL,EALD;AAMLK,IAAAA,MAAM,EAAEN,IAAI,CAACC,EAAL,EANH;AAOLM,IAAAA,MAAM,EAAEP,IAAI,CAACC,EAAL;AAPH,GAAP;AASD,CAVD;;AAYAQ,QAAQ,CAAC,2BAAD,EAA8B,MAAM;AAO1C,WAASC,aAAT,OAA+F;AAAA,QAAxE;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,gBAAZ;AAA8BC,MAAAA;AAA9B,KAAwE;AAC7F,UAAMC,GAAG,GAAGlB,kBAAkB,CAAC;AAC7BmB,MAAAA,qBAAqB,EAAGC,OAAD,IAAyB;AAC9C;AACAA,QAAAA,OAAO,CACJC,OADH,CACWJ,kBAAkB,GAAGF,QAAQ,CAACR,MAAZ,GAAqBQ,QAAQ,CAACT,KAD3D,EAEGgB,OAFH,CAEWN,gBAAgB,CAACb,KAF5B,EAGGoB,QAHH,CAGYP,gBAAgB,CAACT,MAH7B,EAIGiB,KAJH,CAISR,gBAAgB,CAACR,GAJ1B,EAKGiB,UALH,CAKcV,QAAQ,CAACJ,MALvB,EAMGe,UANH,CAMc,KANd;AAOD,OAV4B;AAW7BC,MAAAA,cAAc,EAAEZ,QAAQ,CAACZ,KAXI;AAY7ByB,MAAAA,eAAe,EAAEb,QAAQ,CAACR,MAZG;AAa7BsB,MAAAA,YAAY,EAAEd,QAAQ,CAACP,GAbM;AAc7BsB,MAAAA,OAAO,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAdoB,KAAD,CAA9B;AAiBA,wBACE,oBAAC,sBAAD,qBACE,oBAAC,eAAD;AAAiB,MAAA,OAAO,EAAEb;AAA1B,oBACE,oBAAC,IAAD,QAAM,aAAN,CADF,CADF,CADF;AAOD;;AAOD,WAASc,cAAT,QAA2E;AAAA,QAAnD;AAAEC,MAAAA,WAAF;AAAeC,MAAAA;AAAf,KAAmD;AACzE,UAAMC,GAAG,GAAG3C,OAAO,CAAC4C,GAAR,GACTd,OADS,CACDW,WAAW,CAAC9B,KADX,EAETqB,KAFS,CAEHS,WAAW,CAACzB,GAFT,EAGTkB,UAHS,CAGE,KAHF,CAAZ;AAKA,UAAMR,GAAG,GAAGlB,kBAAkB,CAAC;AAC7BmB,MAAAA,qBAAqB,EAAGkB,CAAD,IAAmB;AACxCA,QAAAA,CAAC,CACEZ,UADH,CACcS,WAAW,CAACvB,MAD1B,EAEGe,UAFH,CAEc,KAFd;AAGD,OAL4B;AAM7BC,MAAAA,cAAc,EAAEO,WAAW,CAAC/B,KANC;AAO7ByB,MAAAA,eAAe,EAAEM,WAAW,CAAC3B,MAPA;AAQ7BsB,MAAAA,YAAY,EAAEK,WAAW,CAAC1B,GARG;AAS7BsB,MAAAA,OAAO,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAToB,KAAD,CAA9B;AAYA,wBACE,oBAAC,sBAAD,qBACE,oBAAC,eAAD;AAAiB,MAAA,OAAO,EAAEvC,OAAO,CAAC8C,IAAR,CAAaH,GAAb,EAAkBjB,GAAlB;AAA1B,oBACE,oBAAC,IAAD,QAAM,aAAN,CADF,CADF,CADF;AAOD;;AAEDqB,EAAAA,EAAE,CAAC,0BAAD,EAA6B,MAAM;AACnC,UAAMN,WAAW,GAAG/B,mBAAmB,EAAvC;AACA,UAAMgC,WAAW,GAAGhC,mBAAmB,EAAvC;AACAL,IAAAA,MAAM,eACJ,oBAAC,cAAD;AAAgB,MAAA,WAAW,EAAEoC,WAA7B;AAA0C,MAAA,WAAW,EAAEC;AAAvD,MADI,CAAN;AAIApC,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C;AAAf,KADwD,EAExD;AAAED,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C;AAAf,KAFwD,EAGxD;AAAEF,MAAAA,KAAK,EAAE7C,KAAK,CAACgD;AAAf,KAHwD,CAAxC,CAAlB;AAKAC,IAAAA,MAAM,CAACV,WAAW,CAAC/B,KAAb,CAAN,CAA0B0C,cAA1B,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAEN,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C;AAAf,KAAxB,CADF;AAGAG,IAAAA,MAAM,CAACV,WAAW,CAACvB,MAAb,CAAN,CAA2BoC,UAA3B;AACAH,IAAAA,MAAM,CAACX,WAAW,CAAC9B,KAAb,CAAN,CAA0B6C,GAA1B,CAA8BD,UAA9B;AACD,GAjBC,CAAF;AAmBAR,EAAAA,EAAE,CAAC,+CAAD,EAAkD,MAAM;AACxD,UAAML,WAAW,GAAGhC,mBAAmB,EAAvC;AACA,UAAM+C,mBAAmB,GAAGrC,2BAA2B,EAAvD;AACAf,IAAAA,MAAM,eAAC,oBAAC,aAAD;AAAe,MAAA,QAAQ,EAAEqC,WAAzB;AAAsC,MAAA,gBAAgB,EAAEe,mBAAxD;AAA6E,MAAA,kBAAkB;AAA/F,MAAD,CAAN;AACAnD,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C,KAAf;AAAsBS,MAAAA,YAAY,EAAE;AAApC,KADwD,EAExD;AAAEV,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C,MAAf;AAAuBQ,MAAAA,YAAY,EAAE;AAArC,KAFwD,EAGxD;AAAEA,MAAAA,YAAY,EAAE;AAAhB,KAHwD,EAIxD;AAAEA,MAAAA,YAAY,EAAE;AAAhB,KAJwD,EAKxD;AAAEV,MAAAA,KAAK,EAAE7C,KAAK,CAACgD,GAAf;AAAoBO,MAAAA,YAAY,EAAE;AAAlC,KALwD,CAAxC,CAAlB;AAQAN,IAAAA,MAAM,CAACK,mBAAmB,CAAC9C,KAArB,CAAN,CAAkCgD,eAAlC,CAAkD,CAAlD;AACAP,IAAAA,MAAM,CAACK,mBAAmB,CAAC1C,MAArB,CAAN,CAAmC4C,eAAnC,CAAmD,CAAnD;AACAP,IAAAA,MAAM,CAACK,mBAAmB,CAACzC,GAArB,CAAN,CAAgC2C,eAAhC,CAAgD,CAAhD;AAEAP,IAAAA,MAAM,CAACV,WAAW,CAAC3B,MAAb,CAAN,CAA2B4C,eAA3B,CAA2C,CAA3C;AACAP,IAAAA,MAAM,CAACV,WAAW,CAAC3B,MAAb,CAAN,CAA2B6C,wBAA3B,CACER,MAAM,CAACE,gBAAP,CAAwB;AAAEI,MAAAA,YAAY,EAAE;AAAhB,KAAxB,CADF;AAGD,GApBC,CAAF;AAqBD,CA1GO,CAAR;AA4GArC,QAAQ,CAAC,uBAAD,EAA0B,MAAM;AAOtC,WAASC,aAAT,QAA+F;AAAA,QAAxE;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,gBAAZ;AAA8BC,MAAAA;AAA9B,KAAwE;AAC7F,UAAMC,GAAG,GAAGlB,kBAAkB,CAAC;AAC7BmB,MAAAA,qBAAqB,EAAGkB,CAAD,IAAmB;AACxCA,QAAAA,CAAC,CACEhB,OADH,CACWJ,kBAAkB,GAAGF,QAAQ,CAACR,MAAZ,GAAqBQ,QAAQ,CAACT,KAD3D,EAEGgB,OAFH,CAEWN,gBAAgB,CAACb,KAF5B,EAGGoB,QAHH,CAGYP,gBAAgB,CAACT,MAH7B,EAIGiB,KAJH,CAISR,gBAAgB,CAACR,GAJ1B,EAKGiB,UALH,CAKcV,QAAQ,CAACJ,MALvB,EAMGe,UANH,CAMc,KANd;AAOD,OAT4B;AAU7BC,MAAAA,cAAc,EAAEZ,QAAQ,CAACZ,KAVI;AAW7ByB,MAAAA,eAAe,EAAEb,QAAQ,CAACR,MAXG;AAY7BsB,MAAAA,YAAY,EAAEd,QAAQ,CAACP,GAZM;AAa7BsB,MAAAA,OAAO,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAboB,KAAD,CAA9B;AAgBA,wBACE,oBAAC,sBAAD,qBACE,oBAAC,eAAD;AAAiB,MAAA,OAAO,EAAEb;AAA1B,oBACE,oBAAC,IAAD,QAAM,aAAN,CADF,CADF,CADF;AAOD;;AAEDqB,EAAAA,EAAE,CAAC,yEAAD,EAA4E,MAAM;AAClF,UAAML,WAAW,GAAGhC,mBAAmB,EAAvC;AACA,UAAM+C,mBAAmB,GAAGrC,2BAA2B,EAAvD;AACAf,IAAAA,MAAM,eAAC,oBAAC,aAAD;AAAe,MAAA,QAAQ,EAAEqC,WAAzB;AAAsC,MAAA,gBAAgB,EAAEe;AAAxD,MAAD,CAAN;AAEAL,IAAAA,MAAM,CAAC,MAAM;AACX9C,MAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEsD,QAAAA,QAAQ,EAAE1D,KAAK,CAAC2D,YAAlB;AAAgCd,QAAAA,KAAK,EAAE7C,KAAK,CAAC8C,KAA7C;AAAoDc,QAAAA,CAAC,EAAE,CAAvD;AAA0DC,QAAAA,CAAC,EAAE;AAA7D,OADwD,EAExD;AAAEH,QAAAA,QAAQ,EAAE1D,KAAK,CAAC2D,YAAlB;AAAgCd,QAAAA,KAAK,EAAE7C,KAAK,CAAC+C,MAA7C;AAAqDa,QAAAA,CAAC,EAAE,CAAxD;AAA2DC,QAAAA,CAAC,EAAE;AAA9D,OAFwD,CAAxC,CAAlB;AAID,KALK,CAAN,CAKGC,OALH,CAME,0EANF;AAQD,GAbC,CAAF;AAeAlB,EAAAA,EAAE,CAACmB,IAAH,CAAQ,CAAC,CAAC/D,KAAK,CAACgD,GAAP,CAAD,EAAc,CAAChD,KAAK,CAACgE,MAAP,CAAd,EAA8B,CAAChE,KAAK,CAACiE,SAAP,CAA9B,CAAR,EACE,+CADF,EAEGC,SAAD,IAAe;AACb,UAAM3B,WAAW,GAAGhC,mBAAmB,EAAvC;AACA,UAAM+C,mBAAmB,GAAGrC,2BAA2B,EAAvD;AACAf,IAAAA,MAAM,eAAC,oBAAC,aAAD;AAAe,MAAA,QAAQ,EAAEqC,WAAzB;AAAsC,MAAA,gBAAgB,EAAEe;AAAxD,MAAD,CAAN;AACAnD,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C;AAAf,KADwD,EAExD;AAAED,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C;AAAf,KAFwD,EAGxD;AAAEF,MAAAA,KAAK,EAAEqB;AAAT,KAHwD,CAAxC,CAAlB;AAMAjB,IAAAA,MAAM,CAACK,mBAAmB,CAAC9C,KAArB,CAAN,CAAkCgD,eAAlC,CAAkD,CAAlD;AACAP,IAAAA,MAAM,CAACK,mBAAmB,CAAC1C,MAArB,CAAN,CAAmC4C,eAAnC,CAAmD,CAAnD;AACAP,IAAAA,MAAM,CAACK,mBAAmB,CAACzC,GAArB,CAAN,CAAgC2C,eAAhC,CAAgD,CAAhD;AAEA,QAAIU,SAAS,KAAKlE,KAAK,CAACgD,GAAxB,EACEC,MAAM,CAACV,WAAW,CAAC1B,GAAb,CAAN,CAAwBuC,UAAxB,GADF,KAIEH,MAAM,CAACV,WAAW,CAACvB,MAAb,CAAN,CAA2BkC,cAA3B,CAA0CD,MAAM,CAACkB,GAAP,CAAWC,MAAX,CAA1C,EAA8D,KAA9D;AACH,GArBH;AAuBD,CAvEO,CAAR;AAyEAlD,QAAQ,CAAC,kCAAD,EAAqC,MAAM;AAMjD,WAASmD,eAAT,QAGyB;AAAA,QAHA;AACvBjD,MAAAA,QADuB;AAEvBE,MAAAA;AAFuB,KAGA;AACvB,UAAMkB,GAAG,GAAG3C,OAAO,CAAC4C,GAAR,GACTd,OADS,CACDP,QAAQ,CAACZ,KADR,EAETqB,KAFS,CAEHT,QAAQ,CAACP,GAFN,EAGTkB,UAHS,CAGE,KAHF,CAAZ;AAKA,UAAMR,GAAG,GAAGlB,kBAAkB,CAAC;AAC7BmB,MAAAA,qBAAqB,EAAGkB,CAAD,IAAmB;AACxCA,QAAAA,CAAC,CACEhB,OADH,CACWJ,kBAAkB,GAAGF,QAAQ,CAACR,MAAZ,GAAqBQ,QAAQ,CAACT,KAD3D,EAEGmB,UAFH,CAEcV,QAAQ,CAACJ,MAFvB,EAGGe,UAHH,CAGc,KAHd;AAID,OAN4B;AAO7BC,MAAAA,cAAc,EAAEZ,QAAQ,CAACZ,KAPI;AAQ7ByB,MAAAA,eAAe,EAAEb,QAAQ,CAACR,MARG;AAS7BsB,MAAAA,YAAY,EAAEd,QAAQ,CAACP,GATM;AAU7BsB,MAAAA,OAAO,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AAVoB,KAAD,CAA9B;AAaA,wBACE,oBAAC,sBAAD,qBACE,oBAAC,eAAD;AAAiB,MAAA,OAAO,EAAEvC,OAAO,CAACyE,SAAR,CAAkB/C,GAAlB,EAAuBiB,GAAvB;AAA1B,oBACE,oBAAC,IAAD,QAAM,aAAN,CADF,CADF,CADF;AAOD;;AAEDI,EAAAA,EAAE,CAAC,8BAAD,EAAiC,MAAM;AACvC,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAoBC,kBAAkB,CAAC,KAAD,CAAtC,EAA+C,CAC/D;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C;AAAf,KAD+D,EAE/D;AAAED,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C;AAAf,KAF+D,EAG/D;AAAEF,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C;AAAf,KAH+D,EAI/D;AAAEF,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C;AAAf,KAJ+D,EAK/D;AAAEF,MAAAA,KAAK,EAAE7C,KAAK,CAACgD;AAAf,KAL+D,CAA/C,CAAlB;AAQAC,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuB0C,cAAvB,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAEO,MAAAA,QAAQ,EAAE1D,KAAK,CAAC2D;AAAlB,KAAxB,CADF;AAGAV,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB2D,aAAxB,CACE,CADF,EAEEtB,MAAM,CAACE,gBAAP,CAAwB;AAAEO,MAAAA,QAAQ,EAAE1D,KAAK,CAAC8C;AAAlB,KAAxB,CAFF;AAIAG,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB4D,cAAxB,CACEvB,MAAM,CAACI,GAAP,CAAWF,gBAAX,CAA4B;AAAEO,MAAAA,QAAQ,EAAET,MAAM,CAACwB,QAAP;AAAZ,KAA5B,CADF;AAGAxB,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqBqC,cAArB,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAEO,MAAAA,QAAQ,EAAE1D,KAAK,CAAC+C;AAAlB,KAAxB,CADF,EAEE,IAFF;AAID,GAzBC,CAAF;AA2BAH,EAAAA,EAAE,CAAC,6BAAD,EAAgC,MAAM;AACtC,UAAML,WAAW,GAAGhC,mBAAmB,EAAvC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEqC,WAA3B;AAAwC,MAAA,kBAAkB;AAA1D,MAAD,CAAN;AACApC,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAAC8C,KAAf;AAAsBc,MAAAA,CAAC,EAAE,CAAzB;AAA4BC,MAAAA,CAAC,EAAE;AAA/B,KADwD,EAExD;AAAEhB,MAAAA,KAAK,EAAE7C,KAAK,CAAC+C,MAAf;AAAuBa,MAAAA,CAAC,EAAE,CAA1B;AAA6BC,MAAAA,CAAC,EAAE;AAAhC,KAFwD,EAGxD;AAAED,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAHwD,EAIxD;AAAED,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAJwD,EAKxD;AAAEhB,MAAAA,KAAK,EAAE7C,KAAK,CAACgD,GAAf;AAAoBY,MAAAA,CAAC,EAAE,CAAvB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KALwD,CAAxC,CAAlB;AAQAZ,IAAAA,MAAM,CAACV,WAAW,CAAC3B,MAAb,CAAN,CAA2B4C,eAA3B,CAA2C,CAA3C;AACAP,IAAAA,MAAM,CAACV,WAAW,CAAC3B,MAAb,CAAN,CAA2B6C,wBAA3B,CACER,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAAxB,CADF;AAGD,GAfC,CAAF;AAiBAjB,EAAAA,EAAE,CAAC,kDAAD,EAAqD,MAAM;AAC3D,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CAAC;AAAEwD,MAAAA,CAAC,EAAE;AAAL,KAAD,CAAxC,CAAlB;AACAX,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuBgD,eAAvB,CAAuC,CAAvC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqB2C,eAArB,CAAqC,CAArC;AACD,GANC,CAAF;AAQAZ,EAAAA,EAAE,CAAC,4DAAD,EAA+D,MAAM;AACrE,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEyC,MAAAA,KAAK,EAAE7C,KAAK,CAACgE;AAAf,KADwD,CAAxC,CAAlB;AAGAf,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuBgD,eAAvB,CAAuC,CAAvC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqB2C,eAArB,CAAqC,CAArC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqBqC,cAArB,CAAoCD,MAAM,CAACwB,QAAP,EAApC,EAAuD,KAAvD;AACD,GATC,CAAF;AAWA7B,EAAAA,EAAE,CAAC,iEAAD,EAAoE,MAAM;AAC1E,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CAAC;AAAEwD,MAAAA,CAAC,EAAE;AAAL,KAAD,CAAxC,CAAlB;AACAX,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuB0C,cAAvB,CAAsCD,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE;AAAL,KAAxB,CAAtC;AACAX,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB8D,uBAAxB,CACE,CADF,EAEEzB,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE;AAAL,KAAxB,CAFF;AAID,GATC,CAAF;AAWAhB,EAAAA,EAAE,CAAC,sDAAD,EAAyD,MAAM;AAC/D,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEwD,MAAAA,CAAC,EAAE,GAAL;AAAUf,MAAAA,KAAK,EAAE7C,KAAK,CAACgE;AAAvB,KADwD,CAAxC,CAAlB;AAGAf,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuBgD,eAAvB,CAAuC,CAAvC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB4C,eAAxB,CAAwC,CAAxC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqBqC,cAArB,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE;AAAL,KAAxB,CADF,EAEE,KAFF;AAID,GAZC,CAAF;AAcAhB,EAAAA,EAAE,CAAC,+BAAD,EAAkC,MAAM;AACxC,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,EAAwC,CACxD;AAAEwD,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KADwD,EAExD;AAAED,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAFwD,EAGxD;AAAED,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAHwD,CAAxC,CAAlB;AAKAZ,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuB0C,cAAvB,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAAxB,CADF;AAGAZ,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB4C,eAAxB,CAAwC,CAAxC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqBqC,cAArB,CACED,MAAM,CAACE,gBAAP,CAAwB;AAAES,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAAxB,CADF,EAEE,IAFF;AAID,GAhBC,CAAF;AAkBAjB,EAAAA,EAAE,CAAC,4EAAD,EAA+E,MAAM;AACrF,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,CAAlB;AACA6C,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuBgD,eAAvB,CAAuC,CAAvC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqB8D,qBAArB,CAA2C,CAA3C;AACD,GANC,CAAF;AAQA/B,EAAAA,EAAE,CAAC,sFAAD,EAAyF,MAAM;AAC/F,UAAMxB,QAAQ,GAAGb,mBAAmB,EAApC;AACAL,IAAAA,MAAM,eAAC,oBAAC,eAAD;AAAiB,MAAA,QAAQ,EAAEkB,QAA3B;AAAqC,MAAA,kBAAkB;AAAvD,MAAD,CAAN;AACAjB,IAAAA,kBAAkB,CAAaC,kBAAkB,CAAC,KAAD,CAA/B,CAAlB;AACA6C,IAAAA,MAAM,CAAC7B,QAAQ,CAACZ,KAAV,CAAN,CAAuBgD,eAAvB,CAAuC,CAAvC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACR,MAAV,CAAN,CAAwB4C,eAAxB,CAAwC,CAAxC;AACAP,IAAAA,MAAM,CAAC7B,QAAQ,CAACP,GAAV,CAAN,CAAqB8D,qBAArB,CAA2C,CAA3C;AACD,GAPC,CAAF;AAQD,CA/JO,CAAR","sourcesContent":["import React from \"react\";\nimport { Text } from \"react-native\";\nimport type { PanGesture, PanGestureHandler, TapGesture } from \"react-native-gesture-handler\";\nimport { Gesture, GestureDetector, GestureHandlerRootView, State } from \"react-native-gesture-handler\";\n\nimport { cleanup, render } from \"@testing-library/react-native\";\nimport { fireGestureHandler, getByGestureTestId } from \"react-native-gesture-handler/jest-utils\";\n\nimport { usePanGestureProxy } from \"./usePanGestureProxy\";\n\nbeforeEach(cleanup);\n\nconst mockedEventHandlers = () => {\n return {\n begin: jest.fn(),\n start: jest.fn(),\n active: jest.fn(),\n end: jest.fn(),\n fail: jest.fn(),\n cancel: jest.fn(),\n finish: jest.fn(),\n };\n};\n\nconst mockedEventHandlersFromUser = () => {\n return {\n begin: jest.fn(),\n start: jest.fn(),\n active: jest.fn(),\n end: jest.fn(),\n fail: jest.fn(),\n cancel: jest.fn(),\n finish: jest.fn(),\n };\n};\n\ndescribe(\"Using RNGH v2 gesture API\", () => {\n interface SingleHandlerProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n handlersFromUser: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function SingleHandler({ handlers, handlersFromUser, treatStartAsUpdate }: SingleHandlerProps) {\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (gesture: PanGesture) => {\n // This is user's customizations\n gesture\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onBegin(handlersFromUser.begin)\n .onUpdate(handlersFromUser.active)\n .onEnd(handlersFromUser.end)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={pan}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n interface RacingHandlersProps {\n tapHandlers: ReturnType<typeof mockedEventHandlers>\n panHandlers: ReturnType<typeof mockedEventHandlers>\n }\n\n function RacingHandlers({ tapHandlers, panHandlers }: RacingHandlersProps) {\n const tap = Gesture.Tap()\n .onBegin(tapHandlers.begin)\n .onEnd(tapHandlers.end)\n .withTestId(\"tap\");\n\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onFinalize(panHandlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: panHandlers.begin,\n onGestureUpdate: panHandlers.active,\n onGestureEnd: panHandlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={Gesture.Race(tap, pan)}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"sends events to handlers\", () => {\n const tapHandlers = mockedEventHandlers();\n const panHandlers = mockedEventHandlers();\n render(\n <RacingHandlers tapHandlers={tapHandlers} panHandlers={panHandlers} />,\n );\n\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: State.END },\n ]);\n expect(panHandlers.begin).toBeCalledWith(\n expect.objectContaining({ state: State.BEGAN }),\n );\n expect(panHandlers.finish).toBeCalled();\n expect(tapHandlers.begin).not.toBeCalled();\n });\n\n it(\"sends events with additional data to handlers\", () => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN, translationX: 0 },\n { state: State.ACTIVE, translationX: 10 },\n { translationX: 20 },\n { translationX: 20 },\n { state: State.END, translationX: 30 },\n ]);\n\n expect(panHandlersFromUser.begin).toBeCalledTimes(1);\n expect(panHandlersFromUser.active).toBeCalledTimes(2);\n expect(panHandlersFromUser.end).toBeCalledTimes(1);\n\n expect(panHandlers.active).toBeCalledTimes(3);\n expect(panHandlers.active).toHaveBeenLastCalledWith(\n expect.objectContaining({ translationX: 20 }),\n );\n });\n});\n\ndescribe(\"Event list validation\", () => {\n interface SingleHandlerProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n handlersFromUser: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function SingleHandler({ handlers, handlersFromUser, treatStartAsUpdate }: SingleHandlerProps) {\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onBegin(handlersFromUser.begin)\n .onUpdate(handlersFromUser.active)\n .onEnd(handlersFromUser.end)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={pan}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"throws error when oldState doesn't correspond to previous event's state\", () => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} />);\n\n expect(() => {\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { oldState: State.UNDETERMINED, state: State.BEGAN, x: 0, y: 10 },\n { oldState: State.UNDETERMINED, state: State.ACTIVE, x: 1, y: 11 },\n ]);\n }).toThrow(\n \"when state changes, oldState should be the same as previous event' state\",\n );\n });\n\n it.each([[State.END], [State.FAILED], [State.CANCELLED]])(\n \"correctly handles events ending with state %s\",\n (lastState) => {\n const panHandlers = mockedEventHandlers();\n const panHandlersFromUser = mockedEventHandlersFromUser();\n render(<SingleHandler handlers={panHandlers} handlersFromUser={panHandlersFromUser} />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: lastState },\n ]);\n\n expect(panHandlersFromUser.begin).toBeCalledTimes(1);\n expect(panHandlersFromUser.active).toBeCalledTimes(0);\n expect(panHandlersFromUser.end).toBeCalledTimes(1);\n\n if (lastState === State.END)\n expect(panHandlers.end).toBeCalled();\n\n else\n expect(panHandlers.finish).toBeCalledWith(expect.any(Object), false);\n },\n );\n});\n\ndescribe(\"Filling event list with defaults\", () => {\n interface RacingTapAndPanProps {\n handlers: ReturnType<typeof mockedEventHandlers>\n treatStartAsUpdate?: boolean\n }\n\n function RacingTapAndPan({\n handlers,\n treatStartAsUpdate,\n }: RacingTapAndPanProps) {\n const tap = Gesture.Tap()\n .onBegin(handlers.begin)\n .onEnd(handlers.end)\n .withTestId(\"tap\");\n\n const pan = usePanGestureProxy({\n onConfigurePanGesture: (_: PanGesture) => {\n _\n .onStart(treatStartAsUpdate ? handlers.active : handlers.start)\n .onFinalize(handlers.finish)\n .withTestId(\"pan\");\n },\n onGestureBegin: handlers.begin,\n onGestureUpdate: handlers.active,\n onGestureEnd: handlers.end,\n options: { enabled: true },\n });\n\n return (\n <GestureHandlerRootView>\n <GestureDetector gesture={Gesture.Exclusive(pan, tap)}>\n <Text>v2 API test</Text>\n </GestureDetector>\n </GestureHandlerRootView>\n );\n }\n\n it(\"fills oldState if not passed\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGestureHandler>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN },\n { state: State.ACTIVE },\n { state: State.ACTIVE },\n { state: State.ACTIVE },\n { state: State.END },\n ]);\n\n expect(handlers.begin).toBeCalledWith(\n expect.objectContaining({ oldState: State.UNDETERMINED }),\n );\n expect(handlers.active).nthCalledWith(\n 1,\n expect.objectContaining({ oldState: State.BEGAN }),\n );\n expect(handlers.active).lastCalledWith(\n expect.not.objectContaining({ oldState: expect.anything() }),\n );\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ oldState: State.ACTIVE }),\n true,\n );\n });\n\n it(\"fills missing ACTIVE states\", () => {\n const panHandlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={panHandlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { state: State.BEGAN, x: 0, y: 10 },\n { state: State.ACTIVE, x: 1, y: 11 },\n { x: 2, y: 12 },\n { x: 3, y: 13 },\n { state: State.END, x: 4, y: 14 },\n ]);\n\n expect(panHandlers.active).toBeCalledTimes(3);\n expect(panHandlers.active).toHaveBeenLastCalledWith(\n expect.objectContaining({ x: 3, y: 13 }),\n );\n });\n\n it(\"fills BEGIN and END events for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"), [{ x: 5 }]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledTimes(1);\n });\n\n it(\"with FAILED event, fills BEGIN event for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"), [\n { state: State.FAILED },\n ]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledWith(expect.anything(), false);\n });\n\n it(\"uses event data from first event in filled BEGIN, ACTIVE events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [{ x: 120 }]);\n expect(handlers.begin).toBeCalledWith(expect.objectContaining({ x: 120 }));\n expect(handlers.active).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({ x: 120 }),\n );\n });\n\n it(\"uses event data from last event in filled END events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { x: 120, state: State.FAILED },\n ]);\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.active).toBeCalledTimes(1);\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ x: 120 }),\n false,\n );\n });\n\n it(\"uses event data filled events\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"), [\n { x: 5, y: 15 },\n { x: 6, y: 16 },\n { x: 7, y: 17 },\n ]);\n expect(handlers.begin).toBeCalledWith(\n expect.objectContaining({ x: 5, y: 15 }),\n );\n expect(handlers.active).toBeCalledTimes(3);\n expect(handlers.end).toBeCalledWith(\n expect.objectContaining({ x: 7, y: 17 }),\n true,\n );\n });\n\n it(\"fills BEGIN and END events when they're not present, for discrete handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<TapGesture>(getByGestureTestId(\"tap\"));\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.end).toHaveBeenCalledTimes(1);\n });\n\n it(\"fills BEGIN, ACTIVE and END events when they're not present, for continuous handlers\", () => {\n const handlers = mockedEventHandlers();\n render(<RacingTapAndPan handlers={handlers} treatStartAsUpdate />);\n fireGestureHandler<PanGesture>(getByGestureTestId(\"pan\"));\n expect(handlers.begin).toBeCalledTimes(1);\n expect(handlers.active).toBeCalledTimes(1);\n expect(handlers.end).toHaveBeenCalledTimes(1);\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["useUpdateGestureConfig.ts"],"names":["useEffect","useUpdateGestureConfig","gesture","config","enabled"],"mappings":"AAAA,SAASA,SAAT,QAA0B,OAA1B;AAGA,OAAO,MAAMC,sBAAsB,GAAG,CAACC,OAAD,EAAsBC,MAAtB,KAEhC;AACJ,QAAM;AAAEC,IAAAA;AAAF,MAAcD,MAApB;AAEAH,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI,OAAOI,OAAP,KAAmB,WAAvB,EACEF,OAAO,CAACE,OAAR,CAAgBA,OAAhB;AACH,GAHQ,EAGN,CAACA,OAAD,EAAUF,OAAV,CAHM,CAAT;AAID,CATM","sourcesContent":["import { useEffect } from \"react\";\nimport type { PanGesture } from \"react-native-gesture-handler\";\n\nexport const useUpdateGestureConfig = (gesture: PanGesture, config: {\n enabled?: boolean\n}) => {\n const { enabled } = config;\n\n useEffect(() => {\n if (typeof enabled !== \"undefined\")\n gesture.enabled(enabled);\n }, [enabled, gesture]);\n};\n"]}
1
+ {"version":3,"sources":["useUpdateGestureConfig.ts"],"names":["useEffect","useUpdateGestureConfig","gesture","config","enabled"],"mappings":"AAAA,SAASA,SAAT,QAA0B,OAA1B;AAOA,OAAO,MAAMC,sBAAsB,GAAG,CAACC,OAAD,EAAsBC,MAAtB,KAAgD;AACpF,QAAM;AAAEC,IAAAA;AAAF,MAAcD,MAApB;AAEAH,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI,OAAOI,OAAP,KAAmB,WAAvB,EACEF,OAAO,CAACE,OAAR,CAAgBA,OAAhB;AACH,GAHQ,EAGN,CAACA,OAAD,EAAUF,OAAV,CAHM,CAAT;AAID,CAPM","sourcesContent":["import { useEffect } from \"react\";\nimport type { PanGesture } from \"react-native-gesture-handler\";\n\nexport interface GestureConfig {\n enabled?: boolean\n}\n\nexport const useUpdateGestureConfig = (gesture: PanGesture, config: GestureConfig) => {\n const { enabled } = config;\n\n useEffect(() => {\n if (typeof enabled !== \"undefined\")\n gesture.enabled(enabled);\n }, [enabled, gesture]);\n};\n"]}
@@ -4,16 +4,27 @@ export function useVisibleRanges(options) {
4
4
  total = 0,
5
5
  viewSize,
6
6
  translation,
7
- windowSize: _windowSize = 0
7
+ windowSize: _windowSize,
8
+ loop
8
9
  } = options;
9
- const windowSize = total <= _windowSize ? total : _windowSize;
10
+ const windowSize = _windowSize !== null && _windowSize !== void 0 ? _windowSize : total;
10
11
  const ranges = useDerivedValue(() => {
11
12
  const positiveCount = Math.round(windowSize / 2);
12
13
  const negativeCount = windowSize - positiveCount;
13
- let curIndex = Math.round(-translation.value / viewSize);
14
- curIndex = curIndex < 0 ? curIndex % total + total : curIndex;
15
- const negativeRange = [(curIndex - negativeCount + total) % total, (curIndex - 1 + total) % total];
16
- const positiveRange = [(curIndex + total) % total, (curIndex + positiveCount + total) % total];
14
+ let currentIndex = Math.round(-translation.value / viewSize);
15
+ currentIndex = currentIndex < 0 ? currentIndex % total + total : currentIndex;
16
+
17
+ if (!loop) {
18
+ // Adjusting negative range if the carousel is not loopable.
19
+ // So, It will be only displayed the positive items.
20
+ return {
21
+ negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],
22
+ positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)]
23
+ };
24
+ }
25
+
26
+ const negativeRange = [(currentIndex - negativeCount + total) % total, (currentIndex - 1 + total) % total];
27
+ const positiveRange = [(currentIndex + total) % total, (currentIndex + positiveCount + total) % total];
17
28
 
18
29
  if (negativeRange[0] < total && negativeRange[0] > negativeRange[1]) {
19
30
  negativeRange[1] = total - 1;
@@ -23,13 +34,14 @@ export function useVisibleRanges(options) {
23
34
  if (positiveRange[0] > positiveRange[1]) {
24
35
  negativeRange[1] = total - 1;
25
36
  positiveRange[0] = 0;
26
- }
37
+ } // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})
38
+
27
39
 
28
40
  return {
29
41
  negativeRange,
30
42
  positiveRange
31
43
  };
32
- }, [total, windowSize, translation]);
44
+ }, [loop, total, windowSize, translation]);
33
45
  return ranges;
34
46
  }
35
47
  //# sourceMappingURL=useVisibleRanges.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["useVisibleRanges.tsx"],"names":["useDerivedValue","useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","ranges","positiveCount","Math","round","negativeCount","curIndex","value","negativeRange","positiveRange"],"mappings":"AACA,SAASA,eAAT,QAAgC,yBAAhC;AAOA,OAAO,SAASC,gBAAT,CAA0BC,OAA1B,EAKY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,WAAW,GAAG;AAJtB,MAKFL,OALJ;AAOA,QAAMI,UAAU,GAAGH,KAAK,IAAII,WAAT,GAAuBJ,KAAvB,GAA+BI,WAAlD;AAEA,QAAMC,MAAM,GAAGR,eAAe,CAAC,MAAM;AACnC,UAAMS,aAAa,GAAGC,IAAI,CAACC,KAAL,CAAWL,UAAU,GAAG,CAAxB,CAAtB;AACA,UAAMM,aAAa,GAAGN,UAAU,GAAGG,aAAnC;AACA,QAAII,QAAQ,GAAGH,IAAI,CAACC,KAAL,CAAW,CAACN,WAAW,CAACS,KAAb,GAAqBV,QAAhC,CAAf;AACAS,IAAAA,QAAQ,GAAGA,QAAQ,GAAG,CAAX,GAAgBA,QAAQ,GAAGV,KAAZ,GAAqBA,KAApC,GAA4CU,QAAvD;AACA,UAAME,aAAa,GAAG,CACpB,CAACF,QAAQ,GAAGD,aAAX,GAA2BT,KAA5B,IAAqCA,KADjB,EAEpB,CAACU,QAAQ,GAAG,CAAX,GAAeV,KAAhB,IAAyBA,KAFL,CAAtB;AAIA,UAAMa,aAAa,GAAG,CACpB,CAACH,QAAQ,GAAGV,KAAZ,IAAqBA,KADD,EAEpB,CAACU,QAAQ,GAAGJ,aAAX,GAA2BN,KAA5B,IAAqCA,KAFjB,CAAtB;;AAIA,QAAIY,aAAa,CAAC,CAAD,CAAb,GAAmBZ,KAAnB,IAA4BY,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAAhE,EAAqE;AACnEA,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBZ,KAAK,GAAG,CAA3B;AACAa,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD;;AACD,QAAIA,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAApC,EAAyC;AACvCD,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBZ,KAAK,GAAG,CAA3B;AACAa,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD;;AACD,WAAO;AAAED,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,KAAP;AACD,GAtB6B,EAsB3B,CAACb,KAAD,EAAQG,UAAR,EAAoBD,WAApB,CAtB2B,CAA9B;AAwBA,SAAOG,MAAP;AACD","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { useDerivedValue } from \"react-native-reanimated\";\n\nexport type IVisibleRanges = Animated.SharedValue<{\n negativeRange: number[]\n positiveRange: number[]\n}>;\n\nexport function useVisibleRanges(options: {\n total: number\n viewSize: number\n windowSize?: number\n translation: Animated.SharedValue<number>\n}): IVisibleRanges {\n const {\n total = 0,\n viewSize,\n translation,\n windowSize: _windowSize = 0,\n } = options;\n\n const windowSize = total <= _windowSize ? total : _windowSize;\n\n const ranges = useDerivedValue(() => {\n const positiveCount = Math.round(windowSize / 2);\n const negativeCount = windowSize - positiveCount;\n let curIndex = Math.round(-translation.value / viewSize);\n curIndex = curIndex < 0 ? (curIndex % total) + total : curIndex;\n const negativeRange = [\n (curIndex - negativeCount + total) % total,\n (curIndex - 1 + total) % total,\n ];\n const positiveRange = [\n (curIndex + total) % total,\n (curIndex + positiveCount + total) % total,\n ];\n if (negativeRange[0] < total && negativeRange[0] > negativeRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n if (positiveRange[0] > positiveRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n return { negativeRange, positiveRange };\n }, [total, windowSize, translation]);\n\n return ranges;\n}\n"]}
1
+ {"version":3,"sources":["useVisibleRanges.tsx"],"names":["useDerivedValue","useVisibleRanges","options","total","viewSize","translation","windowSize","_windowSize","loop","ranges","positiveCount","Math","round","negativeCount","currentIndex","value","negativeRange","positiveRange"],"mappings":"AACA,SAASA,eAAT,QAAgC,yBAAhC;AAOA,OAAO,SAASC,gBAAT,CAA0BC,OAA1B,EAMY;AACjB,QAAM;AACJC,IAAAA,KAAK,GAAG,CADJ;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,WAHI;AAIJC,IAAAA,UAAU,EAAEC,WAJR;AAKJC,IAAAA;AALI,MAMFN,OANJ;AAQA,QAAMI,UAAU,GAAGC,WAAH,aAAGA,WAAH,cAAGA,WAAH,GAAkBJ,KAAlC;AAEA,QAAMM,MAAM,GAAGT,eAAe,CAAC,MAAM;AACnC,UAAMU,aAAa,GAAGC,IAAI,CAACC,KAAL,CAAWN,UAAU,GAAG,CAAxB,CAAtB;AACA,UAAMO,aAAa,GAAGP,UAAU,GAAGI,aAAnC;AAEA,QAAII,YAAY,GAAGH,IAAI,CAACC,KAAL,CAAW,CAACP,WAAW,CAACU,KAAb,GAAqBX,QAAhC,CAAnB;AACAU,IAAAA,YAAY,GAAGA,YAAY,GAAG,CAAf,GAAoBA,YAAY,GAAGX,KAAhB,GAAyBA,KAA5C,GAAoDW,YAAnE;;AAEA,QAAI,CAACN,IAAL,EAAW;AACT;AACA;AACA,aAAO;AACLQ,QAAAA,aAAa,EAAE,CAAC,IAAIF,YAAJ,IAAoBR,UAAU,GAAG,CAAjC,CAAD,EAAsC,IAAIQ,YAA1C,CADV;AAELG,QAAAA,aAAa,EAAE,CAAC,IAAIH,YAAL,EAAmBA,YAAY,IAAIR,UAAU,GAAG,CAAjB,CAA/B;AAFV,OAAP;AAID;;AAED,UAAMU,aAAa,GAAG,CACpB,CAACF,YAAY,GAAGD,aAAf,GAA+BV,KAAhC,IAAyCA,KADrB,EAEpB,CAACW,YAAY,GAAG,CAAf,GAAmBX,KAApB,IAA6BA,KAFT,CAAtB;AAKA,UAAMc,aAAa,GAAG,CACpB,CAACH,YAAY,GAAGX,KAAhB,IAAyBA,KADL,EAEpB,CAACW,YAAY,GAAGJ,aAAf,GAA+BP,KAAhC,IAAyCA,KAFrB,CAAtB;;AAKA,QAAIa,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAnB,IAA4Ba,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAAhE,EAAqE;AACnEA,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD;;AACD,QAAIA,aAAa,CAAC,CAAD,CAAb,GAAmBA,aAAa,CAAC,CAAD,CAApC,EAAyC;AACvCD,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmBb,KAAK,GAAG,CAA3B;AACAc,MAAAA,aAAa,CAAC,CAAD,CAAb,GAAmB,CAAnB;AACD,KAjCkC,CAkCnC;;;AACA,WAAO;AAAED,MAAAA,aAAF;AAAiBC,MAAAA;AAAjB,KAAP;AACD,GApC6B,EAoC3B,CAACT,IAAD,EAAOL,KAAP,EAAcG,UAAd,EAA0BD,WAA1B,CApC2B,CAA9B;AAsCA,SAAOI,MAAP;AACD","sourcesContent":["import type Animated from \"react-native-reanimated\";\nimport { useDerivedValue } from \"react-native-reanimated\";\n\nexport type IVisibleRanges = Animated.SharedValue<{\n negativeRange: number[]\n positiveRange: number[]\n}>;\n\nexport function useVisibleRanges(options: {\n total: number\n viewSize: number\n windowSize?: number\n translation: Animated.SharedValue<number>\n loop?: boolean\n}): IVisibleRanges {\n const {\n total = 0,\n viewSize,\n translation,\n windowSize: _windowSize,\n loop,\n } = options;\n\n const windowSize = _windowSize ?? total;\n\n const ranges = useDerivedValue(() => {\n const positiveCount = Math.round(windowSize / 2);\n const negativeCount = windowSize - positiveCount;\n\n let currentIndex = Math.round(-translation.value / viewSize);\n currentIndex = currentIndex < 0 ? (currentIndex % total) + total : currentIndex;\n\n if (!loop) {\n // Adjusting negative range if the carousel is not loopable.\n // So, It will be only displayed the positive items.\n return {\n negativeRange: [0 + currentIndex - (windowSize - 1), 0 + currentIndex],\n positiveRange: [0 + currentIndex, currentIndex + (windowSize - 1)],\n };\n }\n\n const negativeRange = [\n (currentIndex - negativeCount + total) % total,\n (currentIndex - 1 + total) % total,\n ];\n\n const positiveRange = [\n (currentIndex + total) % total,\n (currentIndex + positiveCount + total) % total,\n ];\n\n if (negativeRange[0] < total && negativeRange[0] > negativeRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n if (positiveRange[0] > positiveRange[1]) {\n negativeRange[1] = total - 1;\n positiveRange[0] = 0;\n }\n // console.log({ negativeRange, positiveRange ,total,windowSize,a:total <= _windowSize})\n return { negativeRange, positiveRange };\n }, [loop, total, windowSize, translation]);\n\n return ranges;\n}\n"]}