@times-components/ts-components 1.145.1-cfea81c4084e6f91221ea00fec9fc730d5b933cb.4 → 1.145.1-e871182934034874ea6a75e1e684090e5504df44.2

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 +86 -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 +164 -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 -314
  45. package/dist/components/carousel-component/hooks/useCarousel.d.ts +0 -2
  46. package/dist/components/carousel-component/hooks/useCarousel.js +0 -140
  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 -30
  50. package/dist/components/carousel-component/styles.js +0 -120
  51. package/dist/components/carousel-component/types.d.ts +0 -46
  52. package/dist/components/carousel-component/types.js +0 -2
  53. package/dist/components/trip-cards/SkeletonCard.d.ts +0 -2
  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 -47
  57. package/dist/components/trip-cards/TripCards.stories.d.ts +0 -1
  58. package/dist/components/trip-cards/TripCards.stories.js +0 -40
  59. package/dist/components/trip-cards/TripCardsLayout.d.ts +0 -3
  60. package/dist/components/trip-cards/TripCardsLayout.js +0 -26
  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 -135
  71. package/dist/components/trip-cards/__tests__/index.test.d.ts +0 -1
  72. package/dist/components/trip-cards/__tests__/index.test.js +0 -437
  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 -74
  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 -323
  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 -39
  98. package/dist/components/trip-cards/styles.js +0 -387
  99. package/dist/components/trip-cards/types.d.ts +0 -87
  100. package/src/components/carousel-component/CarouselComponent.stories.tsx +0 -220
  101. package/src/components/carousel-component/CarouselItem.tsx +0 -20
  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 -438
  109. package/src/components/carousel-component/hooks/useCarousel.ts +0 -187
  110. package/src/components/carousel-component/index.tsx +0 -88
  111. package/src/components/carousel-component/styles.ts +0 -140
  112. package/src/components/carousel-component/types.ts +0 -51
  113. package/src/components/trip-cards/SkeletonCard.tsx +0 -54
  114. package/src/components/trip-cards/TripCard.tsx +0 -135
  115. package/src/components/trip-cards/TripCards.stories.tsx +0 -67
  116. package/src/components/trip-cards/TripCardsLayout.tsx +0 -75
  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 -165
  122. package/src/components/trip-cards/__tests__/index.test.tsx +0 -499
  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 -99
  132. package/src/components/trip-cards/index.tsx +0 -104
  133. package/src/components/trip-cards/mockData.ts +0 -351
  134. package/src/components/trip-cards/skeletonStyles.ts +0 -46
  135. package/src/components/trip-cards/styles.ts +0 -426
  136. package/src/components/trip-cards/types.ts +0 -91
@@ -1,105 +0,0 @@
1
- import React from 'react';
2
- import { render, screen, fireEvent } from '@testing-library/react';
3
- import '@testing-library/jest-dom';
4
- import { DefaultPageDot } from '../DefaultPageDot';
5
-
6
- describe('DefaultPageDot', () => {
7
- const mockOnClick = jest.fn();
8
-
9
- beforeEach(() => {
10
- mockOnClick.mockClear();
11
- });
12
-
13
- it('renders active dot', () => {
14
- render(<DefaultPageDot active={true} onClick={mockOnClick} index={0} />);
15
-
16
- const button = screen.getByRole('button');
17
- expect(button).toBeInTheDocument();
18
- });
19
-
20
- it('renders inactive dot', () => {
21
- render(<DefaultPageDot active={false} onClick={mockOnClick} index={0} />);
22
-
23
- const button = screen.getByRole('button');
24
- expect(button).toBeInTheDocument();
25
- });
26
-
27
- it('calls onClick when clicked', () => {
28
- render(<DefaultPageDot active={false} onClick={mockOnClick} index={0} />);
29
-
30
- const button = screen.getByRole('button');
31
- fireEvent.click(button);
32
-
33
- expect(mockOnClick).toHaveBeenCalledTimes(1);
34
- });
35
-
36
- it('renders multiple dots with different indices', () => {
37
- const { rerender } = render(
38
- <DefaultPageDot active={true} onClick={mockOnClick} index={0} />
39
- );
40
-
41
- expect(screen.getByRole('button')).toBeInTheDocument();
42
-
43
- rerender(<DefaultPageDot active={false} onClick={mockOnClick} index={1} />);
44
-
45
- expect(screen.getByRole('button')).toBeInTheDocument();
46
- });
47
-
48
- it('handles active state changes', () => {
49
- const { rerender } = render(
50
- <DefaultPageDot active={false} onClick={mockOnClick} index={0} />
51
- );
52
-
53
- const button = screen.getByRole('button');
54
- expect(button).toBeInTheDocument();
55
-
56
- rerender(<DefaultPageDot active={true} onClick={mockOnClick} index={0} />);
57
-
58
- expect(button).toBeInTheDocument();
59
- });
60
-
61
- it('applies different styling for active vs inactive state', () => {
62
- const { container, rerender } = render(
63
- <DefaultPageDot active={false} onClick={mockOnClick} index={0} />
64
- );
65
-
66
- const inactiveButton = container.querySelector('button');
67
- expect(inactiveButton).toBeInTheDocument();
68
-
69
- rerender(<DefaultPageDot active={true} onClick={mockOnClick} index={0} />);
70
-
71
- const activeButton = container.querySelector('button');
72
- expect(activeButton).toBeInTheDocument();
73
- });
74
-
75
- it('renders as a button element', () => {
76
- render(<DefaultPageDot active={true} onClick={mockOnClick} index={0} />);
77
-
78
- const button = screen.getByRole('button');
79
- expect(button.tagName).toBe('BUTTON');
80
- });
81
-
82
- it('passes correct index to onClick handler', () => {
83
- const { rerender } = render(
84
- <DefaultPageDot active={false} onClick={mockOnClick} index={2} />
85
- );
86
-
87
- const button = screen.getByRole('button');
88
- fireEvent.click(button);
89
-
90
- expect(mockOnClick).toHaveBeenCalledTimes(1);
91
-
92
- rerender(<DefaultPageDot active={false} onClick={mockOnClick} index={5} />);
93
-
94
- fireEvent.click(button);
95
- expect(mockOnClick).toHaveBeenCalledTimes(2);
96
- });
97
-
98
- it('is focusable for keyboard navigation', () => {
99
- render(<DefaultPageDot active={false} onClick={mockOnClick} index={0} />);
100
-
101
- const button = screen.getByRole('button');
102
- button.focus();
103
- expect(document.activeElement).toBe(button);
104
- });
105
- });
@@ -1,438 +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.handleMouseMove).toBe('function');
42
- expect(typeof result.current.handleMouseUp).toBe('function');
43
- expect(typeof result.current.handleMouseLeave).toBe('function');
44
- });
45
-
46
- it('handles single page correctly', () => {
47
- const { result } = renderHook(() => useCarousel(2, { itemsPerPage: 2 }));
48
-
49
- expect(result.current.totalPages).toBe(1);
50
-
51
- act(() => {
52
- result.current.handleNext();
53
- });
54
-
55
- expect(result.current.currentPage).toBe(0);
56
- });
57
-
58
- it('handles empty items', () => {
59
- const { result } = renderHook(() => useCarousel(0, { itemsPerPage: 2 }));
60
-
61
- expect(result.current.totalPages).toBe(0);
62
- expect(result.current.currentPage).toBe(0);
63
- });
64
-
65
- it('updates totalPages when totalItems changes', () => {
66
- const { result, rerender } = renderHook(
67
- ({ total }) => useCarousel(total, { itemsPerPage: 2 }),
68
- { initialProps: { total: 10 } }
69
- );
70
-
71
- expect(result.current.totalPages).toBe(5);
72
-
73
- rerender({ total: 6 });
74
-
75
- expect(result.current.totalPages).toBe(3);
76
- });
77
-
78
- it('cleans up timeout on unmount', () => {
79
- const { unmount } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
80
-
81
- unmount();
82
-
83
- expect(jest.getTimerCount()).toBe(0);
84
- });
85
-
86
- it('defaults to itemsPerPage of 2 when not provided', () => {
87
- const { result } = renderHook(() => useCarousel(10, {}));
88
-
89
- expect(result.current.totalPages).toBe(5);
90
- });
91
-
92
- it('handles itemsPerPage of 1', () => {
93
- const { result } = renderHook(() => useCarousel(5, { itemsPerPage: 1 }));
94
-
95
- expect(result.current.totalPages).toBe(5);
96
- });
97
-
98
- it('handles large number of items', () => {
99
- const { result } = renderHook(() =>
100
- useCarousel(1000, { itemsPerPage: 10 })
101
- );
102
-
103
- expect(result.current.totalPages).toBe(100);
104
- });
105
-
106
- it('handles odd number of items with even itemsPerPage', () => {
107
- const { result } = renderHook(() => useCarousel(5, { itemsPerPage: 2 }));
108
-
109
- expect(result.current.totalPages).toBe(3);
110
- });
111
-
112
- it('provides carouselRef', () => {
113
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
114
-
115
- expect(result.current.carouselRef).toBeDefined();
116
- expect(typeof result.current.carouselRef).toBe('object');
117
- });
118
-
119
- it('updates when itemsPerPage option changes', () => {
120
- const { result, rerender } = renderHook(
121
- ({ itemsPerPage }) => useCarousel(10, { itemsPerPage }),
122
- { initialProps: { itemsPerPage: 2 } }
123
- );
124
-
125
- expect(result.current.totalPages).toBe(5);
126
-
127
- rerender({ itemsPerPage: 5 });
128
-
129
- expect(result.current.totalPages).toBe(2);
130
- });
131
-
132
- it('handles itemsPerPage greater than total items', () => {
133
- const { result } = renderHook(() => useCarousel(3, { itemsPerPage: 10 }));
134
-
135
- expect(result.current.totalPages).toBe(1);
136
- });
137
-
138
- it('calls onPageChange when provided in options', () => {
139
- const onPageChange = jest.fn();
140
- const { result } = renderHook(() =>
141
- useCarousel(10, { itemsPerPage: 2, onPageChange })
142
- );
143
-
144
- expect(result.current.currentPage).toBe(0);
145
- expect(onPageChange).not.toHaveBeenCalled();
146
- });
147
-
148
- it('handles mouseDown without carouselRef', () => {
149
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
150
-
151
- const mockEvent = ({
152
- preventDefault: jest.fn(),
153
- pageX: 100
154
- } as unknown) as React.MouseEvent;
155
-
156
- expect(result.current.carouselRef.current).toBeNull();
157
- act(() => {
158
- result.current.handleMouseDown(mockEvent);
159
- });
160
-
161
- expect(mockEvent.preventDefault).not.toHaveBeenCalled();
162
- });
163
-
164
- it('calls onPageChange when scrolling to a page', () => {
165
- const onPageChange = jest.fn();
166
- const { result } = renderHook(() =>
167
- useCarousel(10, { itemsPerPage: 2, onPageChange })
168
- );
169
-
170
- const mockCard1: Partial<HTMLElement> = { offsetLeft: 0 };
171
- const mockCard2: Partial<HTMLElement> = { offsetLeft: 400 };
172
- const mockChildren = [
173
- mockCard1,
174
- mockCard2,
175
- mockCard1,
176
- mockCard2,
177
- mockCard1
178
- ];
179
-
180
- const mockCarousel = {
181
- scrollLeft: 0,
182
- children: mockChildren,
183
- scrollTo: jest.fn(),
184
- addEventListener: jest.fn(),
185
- removeEventListener: jest.fn()
186
- };
187
-
188
- (result.current.carouselRef as any).current = mockCarousel;
189
-
190
- act(() => {
191
- result.current.scrollToPage(1);
192
- jest.runAllTimers();
193
- });
194
- expect(onPageChange).toHaveBeenCalledWith(1);
195
- expect(mockCarousel.scrollTo).toHaveBeenCalled();
196
- });
197
-
198
- it('returns undefined cleanup when carousel is not mounted', () => {
199
- const { result, unmount } = renderHook(() =>
200
- useCarousel(10, { itemsPerPage: 2 })
201
- );
202
-
203
- expect(result.current.carouselRef.current).toBeNull();
204
-
205
- unmount();
206
- });
207
-
208
- it('handles handleMouseMove when not dragging', () => {
209
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
210
-
211
- const mockEvent = ({
212
- preventDefault: jest.fn(),
213
- pageX: 100
214
- } as unknown) as React.MouseEvent;
215
-
216
- act(() => {
217
- result.current.handleMouseMove(mockEvent);
218
- });
219
-
220
- expect(mockEvent.preventDefault).not.toHaveBeenCalled();
221
- });
222
-
223
- it('handles handleMouseUp when not dragging', () => {
224
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
225
-
226
- const mockEvent = ({
227
- pageX: 100
228
- } as unknown) as React.MouseEvent;
229
-
230
- act(() => {
231
- result.current.handleMouseUp(mockEvent);
232
- });
233
-
234
- expect(result.current.currentPage).toBe(0);
235
- });
236
-
237
- it('handles handleMouseLeave when not dragging', () => {
238
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
239
-
240
- act(() => {
241
- result.current.handleMouseLeave();
242
- });
243
-
244
- expect(result.current.currentPage).toBe(0);
245
- });
246
-
247
- it('handles complete mouse drag interaction', () => {
248
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
249
-
250
- const mockCarousel = {
251
- scrollLeft: 0,
252
- children: [],
253
- scrollTo: jest.fn(),
254
- style: { cursor: 'grab' },
255
- addEventListener: jest.fn(),
256
- removeEventListener: jest.fn()
257
- };
258
-
259
- (result.current.carouselRef as any).current = mockCarousel;
260
-
261
- const mouseDownEvent = ({
262
- preventDefault: jest.fn(),
263
- pageX: 200
264
- } as unknown) as React.MouseEvent;
265
-
266
- const mouseMoveEvent = ({
267
- preventDefault: jest.fn(),
268
- pageX: 150
269
- } as unknown) as React.MouseEvent;
270
-
271
- const mouseUpEvent = ({
272
- pageX: 100
273
- } as unknown) as React.MouseEvent;
274
-
275
- act(() => {
276
- result.current.handleMouseDown(mouseDownEvent);
277
- });
278
-
279
- expect(mouseDownEvent.preventDefault).toHaveBeenCalled();
280
- expect(mockCarousel.style.cursor).toBe('grabbing');
281
-
282
- act(() => {
283
- result.current.handleMouseMove(mouseMoveEvent);
284
- });
285
-
286
- expect(mouseMoveEvent.preventDefault).toHaveBeenCalled();
287
-
288
- act(() => {
289
- result.current.handleMouseUp(mouseUpEvent);
290
- });
291
-
292
- expect(mockCarousel.style.cursor).toBe('grab');
293
- });
294
-
295
- it('handles mouseUp with small drag distance', () => {
296
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
297
-
298
- const mockCarousel = {
299
- scrollLeft: 0,
300
- children: [],
301
- scrollTo: jest.fn(),
302
- style: { cursor: 'grab' },
303
- addEventListener: jest.fn(),
304
- removeEventListener: jest.fn()
305
- };
306
-
307
- (result.current.carouselRef as any).current = mockCarousel;
308
-
309
- act(() => {
310
- result.current.handleMouseDown(({
311
- preventDefault: jest.fn(),
312
- pageX: 100
313
- } as unknown) as React.MouseEvent);
314
- });
315
-
316
- act(() => {
317
- result.current.handleMouseUp(({
318
- pageX: 90
319
- } as unknown) as React.MouseEvent);
320
- });
321
-
322
- expect(result.current.currentPage).toBe(0);
323
- });
324
-
325
- it('handles mouseLeave during active drag', () => {
326
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
327
-
328
- const mockCarousel = {
329
- style: { cursor: 'grab' },
330
- addEventListener: jest.fn(),
331
- removeEventListener: jest.fn()
332
- };
333
-
334
- (result.current.carouselRef as any).current = mockCarousel;
335
-
336
- act(() => {
337
- result.current.handleMouseDown(({
338
- preventDefault: jest.fn(),
339
- pageX: 100
340
- } as unknown) as React.MouseEvent);
341
- });
342
-
343
- expect(mockCarousel.style.cursor).toBe('grabbing');
344
-
345
- act(() => {
346
- result.current.handleMouseLeave();
347
- });
348
-
349
- expect(mockCarousel.style.cursor).toBe('grab');
350
- });
351
-
352
- it('scrollToPage handles case with no children', () => {
353
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
354
-
355
- const mockCarousel = {
356
- children: [],
357
- scrollTo: jest.fn(),
358
- addEventListener: jest.fn(),
359
- removeEventListener: jest.fn()
360
- };
361
-
362
- (result.current.carouselRef as any).current = mockCarousel;
363
-
364
- act(() => {
365
- result.current.scrollToPage(1);
366
- });
367
-
368
- expect(mockCarousel.scrollTo).not.toHaveBeenCalled();
369
- });
370
-
371
- it('handlePrevious and handleNext navigate correctly', () => {
372
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
373
-
374
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
375
- offsetLeft: i * 200
376
- })) as HTMLElement[];
377
-
378
- const mockCarousel = {
379
- children: mockCards,
380
- scrollTo: jest.fn(),
381
- addEventListener: jest.fn(),
382
- removeEventListener: jest.fn()
383
- };
384
-
385
- (result.current.carouselRef as any).current = mockCarousel;
386
-
387
- act(() => {
388
- result.current.handleNext();
389
- jest.runAllTimers();
390
- });
391
-
392
- expect(result.current.currentPage).toBe(1);
393
-
394
- act(() => {
395
- result.current.handlePrevious();
396
- jest.runAllTimers();
397
- });
398
-
399
- expect(result.current.currentPage).toBe(0);
400
- });
401
-
402
- it('drag triggers navigation', () => {
403
- const { result } = renderHook(() => useCarousel(10, { itemsPerPage: 2 }));
404
-
405
- const mockCards = Array.from({ length: 5 }, (_, i) => ({
406
- offsetLeft: i * 200
407
- })) as HTMLElement[];
408
-
409
- const mockCarousel = {
410
- children: mockCards,
411
- scrollTo: jest.fn(),
412
- style: { cursor: 'grab' },
413
- addEventListener: jest.fn(),
414
- removeEventListener: jest.fn()
415
- };
416
-
417
- (result.current.carouselRef as any).current = mockCarousel;
418
-
419
- act(() => {
420
- result.current.handleMouseDown(({
421
- preventDefault: jest.fn(),
422
- pageX: 200
423
- } as unknown) as React.MouseEvent);
424
- });
425
-
426
- act(() => {
427
- result.current.handleMouseUp(({
428
- pageX: 100
429
- } as unknown) as React.MouseEvent);
430
- });
431
-
432
- act(() => {
433
- jest.runAllTimers();
434
- });
435
-
436
- expect(result.current.currentPage).toBe(1);
437
- });
438
- });