@times-components/ts-components 1.145.1-7e7a12feaf05c514789e802bf49cadca92e6a2b9.10 → 1.145.1-840c3cbc6021aef0e28e52412d33f016c55bc0b4.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.
Files changed (136) hide show
  1. package/dist/components/travel-mini-cta/index.d.ts +3 -0
  2. package/dist/components/travel-mini-cta/index.js +84 -0
  3. package/dist/components/travel-mini-cta/styles.d.ts +42 -0
  4. package/dist/components/travel-mini-cta/styles.js +273 -0
  5. package/dist/components/travel-mini-cta/travel-mini-cta.stories.d.ts +110 -0
  6. package/dist/components/travel-mini-cta/travel-mini-cta.stories.js +121 -0
  7. package/dist/components/travel-mini-cta/types.d.ts +10 -0
  8. package/dist/components/{trip-cards → travel-mini-cta}/types.js +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +2 -2
  11. package/dist/utils/applyDarkMode.d.ts +1 -0
  12. package/dist/utils/applyDarkMode.js +12 -0
  13. package/dist/utils/getMediaQuery.d.ts +11 -0
  14. package/dist/utils/getMediaQuery.js +19 -0
  15. package/dist/utils/index.d.ts +2 -0
  16. package/dist/utils/index.js +3 -0
  17. package/package.json +3 -3
  18. package/rnw.js +1 -1
  19. package/src/components/travel-mini-cta/index.tsx +161 -0
  20. package/src/components/travel-mini-cta/styles.ts +336 -0
  21. package/src/components/travel-mini-cta/travel-mini-cta.stories.tsx +157 -0
  22. package/src/components/travel-mini-cta/types.ts +10 -0
  23. package/src/index.ts +1 -2
  24. package/src/utils/applyDarkMode.ts +12 -0
  25. package/src/utils/getMediaQuery.ts +25 -0
  26. package/src/utils/index.ts +2 -0
  27. package/dist/components/carousel-component/CarouselComponent.stories.d.ts +0 -1
  28. package/dist/components/carousel-component/CarouselComponent.stories.js +0 -146
  29. package/dist/components/carousel-component/CarouselItem.d.ts +0 -3
  30. package/dist/components/carousel-component/CarouselItem.js +0 -11
  31. package/dist/components/carousel-component/DefaultNavigationArrow.d.ts +0 -8
  32. package/dist/components/carousel-component/DefaultNavigationArrow.js +0 -6
  33. package/dist/components/carousel-component/DefaultPageDot.d.ts +0 -8
  34. package/dist/components/carousel-component/DefaultPageDot.js +0 -4
  35. package/dist/components/carousel-component/__tests__/CarouselComponent.test.d.ts +0 -1
  36. package/dist/components/carousel-component/__tests__/CarouselComponent.test.js +0 -163
  37. package/dist/components/carousel-component/__tests__/CarouselItem.test.d.ts +0 -1
  38. package/dist/components/carousel-component/__tests__/CarouselItem.test.js +0 -80
  39. package/dist/components/carousel-component/__tests__/DefaultNavigationArrow.test.d.ts +0 -1
  40. package/dist/components/carousel-component/__tests__/DefaultNavigationArrow.test.js +0 -62
  41. package/dist/components/carousel-component/__tests__/DefaultPageDot.test.d.ts +0 -1
  42. package/dist/components/carousel-component/__tests__/DefaultPageDot.test.js +0 -68
  43. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.d.ts +0 -1
  44. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.js +0 -459
  45. package/dist/components/carousel-component/hooks/useCarousel.d.ts +0 -2
  46. package/dist/components/carousel-component/hooks/useCarousel.js +0 -175
  47. package/dist/components/carousel-component/index.d.ts +0 -4
  48. package/dist/components/carousel-component/index.js +0 -20
  49. package/dist/components/carousel-component/styles.d.ts +0 -27
  50. package/dist/components/carousel-component/styles.js +0 -169
  51. package/dist/components/carousel-component/types.d.ts +0 -53
  52. package/dist/components/carousel-component/types.js +0 -2
  53. package/dist/components/trip-cards/SkeletonCard.d.ts +0 -6
  54. package/dist/components/trip-cards/SkeletonCard.js +0 -21
  55. package/dist/components/trip-cards/TripCard.d.ts +0 -3
  56. package/dist/components/trip-cards/TripCard.js +0 -49
  57. package/dist/components/trip-cards/TripCards.stories.d.ts +0 -1
  58. package/dist/components/trip-cards/TripCards.stories.js +0 -189
  59. package/dist/components/trip-cards/TripCardsLayout.d.ts +0 -3
  60. package/dist/components/trip-cards/TripCardsLayout.js +0 -37
  61. package/dist/components/trip-cards/__tests__/SkeletonCard.test.d.ts +0 -1
  62. package/dist/components/trip-cards/__tests__/SkeletonCard.test.js +0 -139
  63. package/dist/components/trip-cards/__tests__/TripCard.test.d.ts +0 -1
  64. package/dist/components/trip-cards/__tests__/TripCard.test.js +0 -95
  65. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.d.ts +0 -1
  66. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.js +0 -277
  67. package/dist/components/trip-cards/__tests__/assets.test.d.ts +0 -1
  68. package/dist/components/trip-cards/__tests__/assets.test.js +0 -165
  69. package/dist/components/trip-cards/__tests__/helpers.test.d.ts +0 -1
  70. package/dist/components/trip-cards/__tests__/helpers.test.js +0 -216
  71. package/dist/components/trip-cards/__tests__/index.test.d.ts +0 -1
  72. package/dist/components/trip-cards/__tests__/index.test.js +0 -433
  73. package/dist/components/trip-cards/__tests__/mockData.test.d.ts +0 -1
  74. package/dist/components/trip-cards/__tests__/mockData.test.js +0 -57
  75. package/dist/components/trip-cards/__tests__/skeletonStyles.test.d.ts +0 -1
  76. package/dist/components/trip-cards/__tests__/skeletonStyles.test.js +0 -194
  77. package/dist/components/trip-cards/assets/BoatIcon.d.ts +0 -1
  78. package/dist/components/trip-cards/assets/BoatIcon.js +0 -4
  79. package/dist/components/trip-cards/assets/CalendarIcon.d.ts +0 -1
  80. package/dist/components/trip-cards/assets/CalendarIcon.js +0 -4
  81. package/dist/components/trip-cards/assets/ChevronRightIcon.d.ts +0 -1
  82. package/dist/components/trip-cards/assets/ChevronRightIcon.js +0 -4
  83. package/dist/components/trip-cards/assets/LocationIcon.d.ts +0 -1
  84. package/dist/components/trip-cards/assets/LocationIcon.js +0 -4
  85. package/dist/components/trip-cards/assets/MoonIcon.d.ts +0 -1
  86. package/dist/components/trip-cards/assets/MoonIcon.js +0 -4
  87. package/dist/components/trip-cards/assets/index.d.ts +0 -6
  88. package/dist/components/trip-cards/assets/index.js +0 -7
  89. package/dist/components/trip-cards/helpers.d.ts +0 -4
  90. package/dist/components/trip-cards/helpers.js +0 -115
  91. package/dist/components/trip-cards/index.d.ts +0 -4
  92. package/dist/components/trip-cards/index.js +0 -70
  93. package/dist/components/trip-cards/mockData.d.ts +0 -3
  94. package/dist/components/trip-cards/mockData.js +0 -317
  95. package/dist/components/trip-cards/skeletonStyles.d.ts +0 -9
  96. package/dist/components/trip-cards/skeletonStyles.js +0 -37
  97. package/dist/components/trip-cards/styles.d.ts +0 -38
  98. package/dist/components/trip-cards/styles.js +0 -401
  99. package/dist/components/trip-cards/types.d.ts +0 -119
  100. package/src/components/carousel-component/CarouselComponent.stories.tsx +0 -220
  101. package/src/components/carousel-component/CarouselItem.tsx +0 -25
  102. package/src/components/carousel-component/DefaultNavigationArrow.tsx +0 -37
  103. package/src/components/carousel-component/DefaultPageDot.tsx +0 -20
  104. package/src/components/carousel-component/__tests__/CarouselComponent.test.tsx +0 -259
  105. package/src/components/carousel-component/__tests__/CarouselItem.test.tsx +0 -140
  106. package/src/components/carousel-component/__tests__/DefaultNavigationArrow.test.tsx +0 -153
  107. package/src/components/carousel-component/__tests__/DefaultPageDot.test.tsx +0 -105
  108. package/src/components/carousel-component/hooks/__tests__/useCarousel.test.ts +0 -625
  109. package/src/components/carousel-component/hooks/useCarousel.ts +0 -231
  110. package/src/components/carousel-component/index.tsx +0 -92
  111. package/src/components/carousel-component/styles.ts +0 -185
  112. package/src/components/carousel-component/types.ts +0 -62
  113. package/src/components/trip-cards/SkeletonCard.tsx +0 -62
  114. package/src/components/trip-cards/TripCard.tsx +0 -143
  115. package/src/components/trip-cards/TripCards.stories.tsx +0 -254
  116. package/src/components/trip-cards/TripCardsLayout.tsx +0 -108
  117. package/src/components/trip-cards/__tests__/SkeletonCard.test.tsx +0 -169
  118. package/src/components/trip-cards/__tests__/TripCard.test.tsx +0 -120
  119. package/src/components/trip-cards/__tests__/TripCardsLayout.test.tsx +0 -532
  120. package/src/components/trip-cards/__tests__/assets.test.tsx +0 -206
  121. package/src/components/trip-cards/__tests__/helpers.test.ts +0 -266
  122. package/src/components/trip-cards/__tests__/index.test.tsx +0 -495
  123. package/src/components/trip-cards/__tests__/mockData.test.ts +0 -67
  124. package/src/components/trip-cards/__tests__/skeletonStyles.test.tsx +0 -256
  125. package/src/components/trip-cards/assets/BoatIcon.tsx +0 -17
  126. package/src/components/trip-cards/assets/CalendarIcon.tsx +0 -17
  127. package/src/components/trip-cards/assets/ChevronRightIcon.tsx +0 -20
  128. package/src/components/trip-cards/assets/LocationIcon.tsx +0 -17
  129. package/src/components/trip-cards/assets/MoonIcon.tsx +0 -17
  130. package/src/components/trip-cards/assets/index.ts +0 -7
  131. package/src/components/trip-cards/helpers.ts +0 -150
  132. package/src/components/trip-cards/index.tsx +0 -119
  133. package/src/components/trip-cards/mockData.ts +0 -345
  134. package/src/components/trip-cards/skeletonStyles.ts +0 -46
  135. package/src/components/trip-cards/styles.ts +0 -446
  136. package/src/components/trip-cards/types.ts +0 -128
@@ -1,625 +0,0 @@
1
- import React from 'react';
2
- import { renderHook, act } from '@testing-library/react-hooks';
3
- import { useCarousel } from '../useCarousel';
4
-
5
- describe('useCarousel', () => {
6
- beforeEach(() => {
7
- jest.useFakeTimers();
8
- });
9
-
10
- afterEach(() => {
11
- jest.runOnlyPendingTimers();
12
- jest.useRealTimers();
13
- });
14
-
15
- it('initializes with correct default values', () => {
16
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
17
-
18
- expect(result.current.currentPage).toBe(0);
19
- expect(result.current.totalPages).toBe(5);
20
- expect(result.current.isScrolling).toBe(false);
21
- });
22
-
23
- it('calculates correct totalPages', () => {
24
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 3 }));
25
-
26
- expect(result.current.totalPages).toBe(4);
27
- });
28
-
29
- it('provides navigation functions', () => {
30
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
31
-
32
- expect(typeof result.current.handleNext).toBe('function');
33
- expect(typeof result.current.handlePrevious).toBe('function');
34
- expect(typeof result.current.scrollToPage).toBe('function');
35
- });
36
-
37
- it('provides mouse event handlers for drag functionality', () => {
38
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
39
-
40
- expect(typeof result.current.handleMouseDown).toBe('function');
41
- expect(typeof result.current.handleMouseUp).toBe('function');
42
- expect(typeof result.current.handleMouseLeave).toBe('function');
43
- });
44
-
45
- it('handles single page correctly', () => {
46
- const { result } = renderHook(() => useCarousel(2, { itemsPerPage: 2 }));
47
-
48
- expect(result.current.totalPages).toBe(1);
49
-
50
- act(() => {
51
- result.current.handleNext();
52
- });
53
-
54
- expect(result.current.currentPage).toBe(0);
55
- });
56
-
57
- it('handles empty items', () => {
58
- const { result } = renderHook(() => useCarousel(0, { itemsPerPage: 2 }));
59
-
60
- expect(result.current.totalPages).toBe(0);
61
- expect(result.current.currentPage).toBe(0);
62
- });
63
-
64
- it('updates totalPages when totalItems changes', () => {
65
- const { result, rerender } = renderHook(
66
- ({ total }) => useCarousel(total, { itemsPerPage: 2 }),
67
- { initialProps: { total: 10 } }
68
- );
69
-
70
- expect(result.current.totalPages).toBe(5);
71
-
72
- rerender({ total: 6 });
73
-
74
- expect(result.current.totalPages).toBe(3);
75
- });
76
-
77
- it('cleans up timeout on unmount', () => {
78
- const { unmount } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
79
-
80
- unmount();
81
-
82
- expect(jest.getTimerCount()).toBe(0);
83
- });
84
-
85
- it('defaults to itemsPerPage of 2 when not provided', () => {
86
- const { result } = renderHook(() => useCarousel(10, {}));
87
-
88
- expect(result.current.totalPages).toBe(5);
89
- });
90
-
91
- it('handles itemsPerPage of 1', () => {
92
- const { result } = renderHook(() => useCarousel(5, { itemsPerPage: 1 }));
93
-
94
- expect(result.current.totalPages).toBe(5);
95
- });
96
-
97
- it('handles large number of items', () => {
98
- const { result } = renderHook(() =>
99
- useCarousel(1000, { itemsPerPage: 10 })
100
- );
101
-
102
- expect(result.current.totalPages).toBe(100);
103
- });
104
-
105
- it('handles odd number of items with even itemsPerPage', () => {
106
- const { result } = renderHook(() => useCarousel(5, { itemsPerPage: 2 }));
107
-
108
- expect(result.current.totalPages).toBe(3);
109
- });
110
-
111
- it('provides carouselRef', () => {
112
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
113
-
114
- expect(result.current.carouselRef).toBeDefined();
115
- expect(typeof result.current.carouselRef).toBe('object');
116
- });
117
-
118
- it('updates when itemsPerPage option changes', () => {
119
- const { result, rerender } = renderHook(
120
- ({ itemsPerPage }) => useCarousel(10, { itemsPerPage }),
121
- { initialProps: { itemsPerPage: 2 } }
122
- );
123
-
124
- expect(result.current.totalPages).toBe(5);
125
-
126
- rerender({ itemsPerPage: 5 });
127
-
128
- expect(result.current.totalPages).toBe(2);
129
- });
130
-
131
- it('handles itemsPerPage greater than total items', () => {
132
- const { result } = renderHook(() => useCarousel(3, { itemsPerPage: 10 }));
133
-
134
- expect(result.current.totalPages).toBe(1);
135
- });
136
-
137
- it('calls onPageChange when provided in options', () => {
138
- const onPageChange = jest.fn();
139
- const { result } = renderHook(() =>
140
- useCarousel(10, { itemsPerPage: 2, onPageChange })
141
- );
142
-
143
- expect(result.current.currentPage).toBe(0);
144
- expect(onPageChange).not.toHaveBeenCalled();
145
- });
146
-
147
- it('handles mouseDown without carouselRef', () => {
148
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
149
-
150
- const mockEvent = ({
151
- preventDefault: jest.fn(),
152
- pageX: 100
153
- } as unknown) as React.MouseEvent;
154
-
155
- expect(result.current.carouselRef.current).toBeNull();
156
- act(() => {
157
- result.current.handleMouseDown(mockEvent);
158
- });
159
-
160
- expect(mockEvent.preventDefault).not.toHaveBeenCalled();
161
- });
162
-
163
- it('calls onPageChange when scrolling to a page', () => {
164
- const onPageChange = jest.fn();
165
- const { result } = renderHook(() =>
166
- useCarousel(10, { itemsPerPage: 2, onPageChange })
167
- );
168
-
169
- const mockCard1: Partial<HTMLElement> = { offsetLeft: 0 };
170
- const mockCard2: Partial<HTMLElement> = { offsetLeft: 400 };
171
- const mockChildren = [
172
- mockCard1,
173
- mockCard2,
174
- mockCard1,
175
- mockCard2,
176
- mockCard1
177
- ];
178
-
179
- const mockCarousel = {
180
- scrollLeft: 0,
181
- children: mockChildren,
182
- scrollTo: jest.fn(),
183
- addEventListener: jest.fn(),
184
- removeEventListener: jest.fn()
185
- };
186
-
187
- (result.current.carouselRef as any).current = mockCarousel;
188
-
189
- act(() => {
190
- result.current.scrollToPage(1);
191
- jest.runAllTimers();
192
- });
193
- expect(onPageChange).toHaveBeenCalledWith(1);
194
- expect(mockCarousel.scrollTo).toHaveBeenCalled();
195
- });
196
-
197
- it('returns undefined cleanup when carousel is not mounted', () => {
198
- const { result, unmount } = renderHook(() =>
199
- useCarousel(10, { itemsPerPage: 2 })
200
- );
201
-
202
- expect(result.current.carouselRef.current).toBeNull();
203
-
204
- unmount();
205
- });
206
-
207
- it('handles handleMouseUp when not dragging', () => {
208
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
209
-
210
- const mockEvent = ({
211
- pageX: 100
212
- } as unknown) as React.MouseEvent;
213
-
214
- act(() => {
215
- result.current.handleMouseUp(mockEvent);
216
- });
217
-
218
- expect(result.current.currentPage).toBe(0);
219
- });
220
-
221
- it('handles handleMouseLeave when not dragging', () => {
222
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
223
-
224
- const mockEvent = ({
225
- pageX: 100
226
- } as unknown) as React.MouseEvent;
227
-
228
- act(() => {
229
- result.current.handleMouseLeave(mockEvent);
230
- });
231
-
232
- expect(result.current.currentPage).toBe(0);
233
- });
234
-
235
- it('handles complete mouse drag interaction', () => {
236
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
237
-
238
- const mockCarousel = {
239
- scrollLeft: 0,
240
- children: [],
241
- scrollTo: jest.fn(),
242
- style: { cursor: 'grab' },
243
- addEventListener: jest.fn(),
244
- removeEventListener: jest.fn()
245
- };
246
-
247
- (result.current.carouselRef as any).current = mockCarousel;
248
-
249
- const mouseDownEvent = ({
250
- preventDefault: jest.fn(),
251
- pageX: 200
252
- } as unknown) as React.MouseEvent;
253
-
254
- const mouseUpEvent = ({
255
- pageX: 100
256
- } as unknown) as React.MouseEvent;
257
-
258
- act(() => {
259
- result.current.handleMouseDown(mouseDownEvent);
260
- });
261
-
262
- expect(mouseDownEvent.preventDefault).toHaveBeenCalled();
263
- expect(mockCarousel.style.cursor).toBe('grabbing');
264
-
265
- act(() => {
266
- result.current.handleMouseUp(mouseUpEvent);
267
- });
268
-
269
- expect(mockCarousel.style.cursor).toBe('grab');
270
- });
271
-
272
- it('handles mouseUp with small drag distance', () => {
273
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
274
-
275
- const mockCarousel = {
276
- scrollLeft: 0,
277
- children: [],
278
- scrollTo: jest.fn(),
279
- style: { cursor: 'grab' },
280
- addEventListener: jest.fn(),
281
- removeEventListener: jest.fn()
282
- };
283
-
284
- (result.current.carouselRef as any).current = mockCarousel;
285
-
286
- act(() => {
287
- result.current.handleMouseDown(({
288
- preventDefault: jest.fn(),
289
- pageX: 100
290
- } as unknown) as React.MouseEvent);
291
- });
292
-
293
- act(() => {
294
- result.current.handleMouseUp(({
295
- pageX: 90
296
- } as unknown) as React.MouseEvent);
297
- });
298
-
299
- expect(result.current.currentPage).toBe(0);
300
- });
301
-
302
- it('handles mouseLeave during active drag', () => {
303
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
304
-
305
- const mockCarousel = {
306
- scrollLeft: 0,
307
- children: [],
308
- scrollTo: jest.fn(),
309
- style: { cursor: 'grab' },
310
- addEventListener: jest.fn(),
311
- removeEventListener: jest.fn()
312
- };
313
-
314
- (result.current.carouselRef as any).current = mockCarousel;
315
-
316
- act(() => {
317
- result.current.handleMouseDown(({
318
- preventDefault: jest.fn(),
319
- pageX: 100
320
- } as unknown) as React.MouseEvent);
321
- });
322
-
323
- expect(mockCarousel.style.cursor).toBe('grabbing');
324
-
325
- const mouseLeaveEvent = ({
326
- pageX: 120
327
- } as unknown) as React.MouseEvent;
328
-
329
- act(() => {
330
- result.current.handleMouseLeave(mouseLeaveEvent);
331
- });
332
-
333
- expect(mockCarousel.style.cursor).toBe('grab');
334
- });
335
-
336
- it('scrollToPage handles case with no children', () => {
337
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
338
-
339
- const mockCarousel = {
340
- children: [],
341
- scrollTo: jest.fn(),
342
- addEventListener: jest.fn(),
343
- removeEventListener: jest.fn()
344
- };
345
-
346
- (result.current.carouselRef as any).current = mockCarousel;
347
-
348
- act(() => {
349
- result.current.scrollToPage(1);
350
- });
351
-
352
- expect(mockCarousel.scrollTo).not.toHaveBeenCalled();
353
- });
354
-
355
- it('handlePrevious and handleNext navigate correctly', () => {
356
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
357
-
358
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
359
- offsetLeft: i * 200
360
- })) as HTMLElement[];
361
-
362
- const mockCarousel = {
363
- children: mockCards,
364
- scrollTo: jest.fn(),
365
- addEventListener: jest.fn(),
366
- removeEventListener: jest.fn()
367
- };
368
-
369
- (result.current.carouselRef as any).current = mockCarousel;
370
-
371
- act(() => {
372
- result.current.handleNext();
373
- jest.runAllTimers();
374
- });
375
-
376
- expect(result.current.currentPage).toBe(1);
377
-
378
- act(() => {
379
- result.current.handlePrevious();
380
- jest.runAllTimers();
381
- });
382
-
383
- expect(result.current.currentPage).toBe(0);
384
- });
385
-
386
- it('drag triggers navigation', () => {
387
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
388
-
389
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
390
- offsetLeft: i * 200
391
- })) as HTMLElement[];
392
-
393
- const mockCarousel = {
394
- children: mockCards,
395
- scrollTo: jest.fn(),
396
- style: { cursor: 'grab' },
397
- addEventListener: jest.fn(),
398
- removeEventListener: jest.fn()
399
- };
400
-
401
- (result.current.carouselRef as any).current = mockCarousel;
402
-
403
- act(() => {
404
- result.current.handleMouseDown(({
405
- preventDefault: jest.fn(),
406
- pageX: 200
407
- } as unknown) as React.MouseEvent);
408
- });
409
-
410
- act(() => {
411
- result.current.handleMouseUp(({
412
- pageX: 100
413
- } as unknown) as React.MouseEvent);
414
- });
415
-
416
- act(() => {
417
- jest.runAllTimers();
418
- });
419
-
420
- expect(result.current.currentPage).toBe(1);
421
- });
422
-
423
- it('provides touch event handlers', () => {
424
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
425
-
426
- expect(typeof result.current.handleTouchStart).toBe('function');
427
- expect(typeof result.current.handleTouchMove).toBe('function');
428
- expect(typeof result.current.handleTouchEnd).toBe('function');
429
- });
430
-
431
- it('handles touch swipe right to left (next)', () => {
432
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
433
-
434
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
435
- offsetLeft: i * 200
436
- })) as HTMLElement[];
437
-
438
- const mockCarousel = {
439
- children: mockCards,
440
- scrollTo: jest.fn(),
441
- addEventListener: jest.fn(),
442
- removeEventListener: jest.fn()
443
- };
444
-
445
- (result.current.carouselRef as any).current = mockCarousel;
446
-
447
- act(() => {
448
- result.current.handleTouchStart(({
449
- touches: [{ clientX: 200 }]
450
- } as unknown) as React.TouchEvent);
451
- });
452
-
453
- act(() => {
454
- result.current.handleTouchMove(({
455
- touches: [{ clientX: 150 }]
456
- } as unknown) as React.TouchEvent);
457
- });
458
-
459
- act(() => {
460
- jest.runAllTimers();
461
- });
462
-
463
- expect(result.current.currentPage).toBe(1);
464
-
465
- act(() => {
466
- result.current.handleTouchEnd();
467
- });
468
- });
469
-
470
- it('handles touch swipe left to right (previous)', () => {
471
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
472
-
473
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
474
- offsetLeft: i * 200
475
- })) as HTMLElement[];
476
-
477
- const mockCarousel = {
478
- children: mockCards,
479
- scrollTo: jest.fn(),
480
- addEventListener: jest.fn(),
481
- removeEventListener: jest.fn()
482
- };
483
-
484
- (result.current.carouselRef as any).current = mockCarousel;
485
-
486
- // First navigate to page 1
487
- act(() => {
488
- result.current.scrollToPage(1);
489
- jest.runAllTimers();
490
- });
491
-
492
- expect(result.current.currentPage).toBe(1);
493
-
494
- // Then swipe left to right (previous)
495
- act(() => {
496
- result.current.handleTouchStart(({
497
- touches: [{ clientX: 100 }]
498
- } as unknown) as React.TouchEvent);
499
- });
500
-
501
- act(() => {
502
- result.current.handleTouchMove(({
503
- touches: [{ clientX: 150 }]
504
- } as unknown) as React.TouchEvent);
505
- });
506
-
507
- act(() => {
508
- jest.runAllTimers();
509
- });
510
-
511
- expect(result.current.currentPage).toBe(0);
512
-
513
- act(() => {
514
- result.current.handleTouchEnd();
515
- });
516
- });
517
-
518
- it('handles touch swipe with small distance (no navigation)', () => {
519
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
520
-
521
- const mockCarousel = {
522
- children: [],
523
- scrollTo: jest.fn(),
524
- addEventListener: jest.fn(),
525
- removeEventListener: jest.fn()
526
- };
527
-
528
- (result.current.carouselRef as any).current = mockCarousel;
529
-
530
- act(() => {
531
- result.current.handleTouchStart(({
532
- touches: [{ clientX: 100 }]
533
- } as unknown) as React.TouchEvent);
534
- });
535
-
536
- act(() => {
537
- result.current.handleTouchMove(({
538
- touches: [{ clientX: 115 }]
539
- } as unknown) as React.TouchEvent);
540
- });
541
-
542
- expect(result.current.currentPage).toBe(0);
543
-
544
- act(() => {
545
- result.current.handleTouchEnd();
546
- });
547
- });
548
-
549
- it('ignores touch move when no touch start', () => {
550
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
551
-
552
- const mockCarousel = {
553
- children: [],
554
- scrollTo: jest.fn(),
555
- addEventListener: jest.fn(),
556
- removeEventListener: jest.fn()
557
- };
558
-
559
- (result.current.carouselRef as any).current = mockCarousel;
560
-
561
- act(() => {
562
- result.current.handleTouchMove(({
563
- touches: [{ clientX: 150 }]
564
- } as unknown) as React.TouchEvent);
565
- });
566
-
567
- expect(result.current.currentPage).toBe(0);
568
- });
569
-
570
- it('ignores touch move when already swiping', () => {
571
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
572
-
573
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
574
- offsetLeft: i * 200
575
- })) as HTMLElement[];
576
-
577
- const mockCarousel = {
578
- children: mockCards,
579
- scrollTo: jest.fn(),
580
- addEventListener: jest.fn(),
581
- removeEventListener: jest.fn()
582
- };
583
-
584
- (result.current.carouselRef as any).current = mockCarousel;
585
-
586
- act(() => {
587
- result.current.handleTouchStart(({
588
- touches: [{ clientX: 200 }]
589
- } as unknown) as React.TouchEvent);
590
- });
591
-
592
- act(() => {
593
- result.current.handleTouchMove(({
594
- touches: [{ clientX: 150 }]
595
- } as unknown) as React.TouchEvent);
596
- });
597
-
598
- // Second touch move should be ignored
599
- act(() => {
600
- result.current.handleTouchMove(({
601
- touches: [{ clientX: 100 }]
602
- } as unknown) as React.TouchEvent);
603
- });
604
-
605
- act(() => {
606
- jest.runAllTimers();
607
- });
608
-
609
- expect(result.current.currentPage).toBe(1);
610
- });
611
-
612
- it('handles touch start without carousel ref', () => {
613
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
614
-
615
- (result.current.carouselRef as any).current = null;
616
-
617
- act(() => {
618
- result.current.handleTouchStart(({
619
- touches: [{ clientX: 100 }]
620
- } as unknown) as React.TouchEvent);
621
- });
622
-
623
- expect(result.current.currentPage).toBe(0);
624
- });
625
- });