@times-components/ts-components 1.146.2-0f9388fe36c532b90db3f35d17847fc17a611f1e.44 → 1.146.2-784617dc4a33959b8795da1d7f425c9929322fae.24

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 (138) hide show
  1. package/dist/components/travel-mini-cta/__tests__/index.test.js +262 -0
  2. package/dist/components/travel-mini-cta/index.d.ts +10 -0
  3. package/dist/components/travel-mini-cta/index.js +93 -0
  4. package/dist/components/travel-mini-cta/styles.d.ts +42 -0
  5. package/dist/components/travel-mini-cta/styles.js +268 -0
  6. package/dist/components/travel-mini-cta/travel-mini-cta.stories.js +8 -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/__tests__/__snapshots__/index.test.tsx.snap +211 -0
  20. package/src/components/travel-mini-cta/__tests__/index.test.tsx +330 -0
  21. package/src/components/travel-mini-cta/index.tsx +190 -0
  22. package/src/components/travel-mini-cta/styles.ts +331 -0
  23. package/src/components/travel-mini-cta/travel-mini-cta.stories.tsx +23 -0
  24. package/src/components/travel-mini-cta/types.ts +10 -0
  25. package/src/index.ts +1 -2
  26. package/src/utils/applyDarkMode.ts +12 -0
  27. package/src/utils/getMediaQuery.ts +25 -0
  28. package/src/utils/index.ts +2 -0
  29. package/dist/components/carousel-component/CarouselComponent.stories.js +0 -146
  30. package/dist/components/carousel-component/CarouselItem.d.ts +0 -3
  31. package/dist/components/carousel-component/CarouselItem.js +0 -12
  32. package/dist/components/carousel-component/DefaultNavigationArrow.d.ts +0 -8
  33. package/dist/components/carousel-component/DefaultNavigationArrow.js +0 -6
  34. package/dist/components/carousel-component/DefaultPageDot.d.ts +0 -8
  35. package/dist/components/carousel-component/DefaultPageDot.js +0 -4
  36. package/dist/components/carousel-component/__tests__/CarouselComponent.test.d.ts +0 -1
  37. package/dist/components/carousel-component/__tests__/CarouselComponent.test.js +0 -163
  38. package/dist/components/carousel-component/__tests__/CarouselItem.test.d.ts +0 -1
  39. package/dist/components/carousel-component/__tests__/CarouselItem.test.js +0 -80
  40. package/dist/components/carousel-component/__tests__/DefaultNavigationArrow.test.d.ts +0 -1
  41. package/dist/components/carousel-component/__tests__/DefaultNavigationArrow.test.js +0 -62
  42. package/dist/components/carousel-component/__tests__/DefaultPageDot.test.d.ts +0 -1
  43. package/dist/components/carousel-component/__tests__/DefaultPageDot.test.js +0 -68
  44. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.d.ts +0 -1
  45. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.js +0 -459
  46. package/dist/components/carousel-component/hooks/useCarousel.d.ts +0 -2
  47. package/dist/components/carousel-component/hooks/useCarousel.js +0 -167
  48. package/dist/components/carousel-component/index.d.ts +0 -4
  49. package/dist/components/carousel-component/index.js +0 -20
  50. package/dist/components/carousel-component/styles.d.ts +0 -28
  51. package/dist/components/carousel-component/styles.js +0 -172
  52. package/dist/components/carousel-component/types.d.ts +0 -53
  53. package/dist/components/carousel-component/types.js +0 -2
  54. package/dist/components/trip-cards/SkeletonCard.d.ts +0 -7
  55. package/dist/components/trip-cards/SkeletonCard.js +0 -22
  56. package/dist/components/trip-cards/TripCard.d.ts +0 -3
  57. package/dist/components/trip-cards/TripCard.js +0 -49
  58. package/dist/components/trip-cards/TripCards.stories.d.ts +0 -1
  59. package/dist/components/trip-cards/TripCards.stories.js +0 -159
  60. package/dist/components/trip-cards/TripCardsLayout.d.ts +0 -3
  61. package/dist/components/trip-cards/TripCardsLayout.js +0 -56
  62. package/dist/components/trip-cards/__tests__/SkeletonCard.test.d.ts +0 -1
  63. package/dist/components/trip-cards/__tests__/SkeletonCard.test.js +0 -139
  64. package/dist/components/trip-cards/__tests__/TripCard.test.d.ts +0 -1
  65. package/dist/components/trip-cards/__tests__/TripCard.test.js +0 -95
  66. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.d.ts +0 -1
  67. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.js +0 -314
  68. package/dist/components/trip-cards/__tests__/assets.test.d.ts +0 -1
  69. package/dist/components/trip-cards/__tests__/assets.test.js +0 -165
  70. package/dist/components/trip-cards/__tests__/helpers.test.d.ts +0 -1
  71. package/dist/components/trip-cards/__tests__/helpers.test.js +0 -220
  72. package/dist/components/trip-cards/__tests__/index.test.js +0 -478
  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 -11
  90. package/dist/components/trip-cards/helpers.js +0 -138
  91. package/dist/components/trip-cards/index.d.ts +0 -4
  92. package/dist/components/trip-cards/index.js +0 -68
  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 -43
  98. package/dist/components/trip-cards/styles.js +0 -404
  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 -26
  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 -229
  110. package/src/components/carousel-component/index.tsx +0 -92
  111. package/src/components/carousel-component/styles.ts +0 -188
  112. package/src/components/carousel-component/types.ts +0 -62
  113. package/src/components/trip-cards/SkeletonCard.tsx +0 -64
  114. package/src/components/trip-cards/TripCard.tsx +0 -140
  115. package/src/components/trip-cards/TripCards.stories.tsx +0 -224
  116. package/src/components/trip-cards/TripCardsLayout.tsx +0 -145
  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 -583
  120. package/src/components/trip-cards/__tests__/assets.test.tsx +0 -206
  121. package/src/components/trip-cards/__tests__/helpers.test.ts +0 -272
  122. package/src/components/trip-cards/__tests__/index.test.tsx +0 -550
  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 -176
  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 -450
  136. package/src/components/trip-cards/types.ts +0 -128
  137. /package/dist/components/{trip-cards → travel-mini-cta}/__tests__/index.test.d.ts +0 -0
  138. /package/dist/components/{carousel-component/CarouselComponent.stories.d.ts → travel-mini-cta/travel-mini-cta.stories.d.ts} +0 -0
@@ -1,220 +0,0 @@
1
- import { transformApiResult, fetchCruiseCards } from '../helpers';
2
- const mockApiResult = {
3
- post_id: 34246,
4
- cruise_id: 2074350,
5
- cruise_title: 'Mediterranean from Barcelona',
6
- cruise_line: {
7
- name: 'MSC Cruises',
8
- link: 'https://example.com/cruise-lines/msc-cruises/',
9
- logo: 'https://example.com/msc-logo.png'
10
- },
11
- ship: {
12
- name: 'MSC Seaside',
13
- link: 'https://example.com/ships/msc-seaside/',
14
- image: 'https://example.com/ship-image.jpg'
15
- },
16
- departs: '2025-10-21',
17
- ends: '2025-10-28',
18
- date_label: 'Oct 21 - Oct 28, 2025',
19
- destination: ['Mediterranean'],
20
- duration: 7,
21
- itinerary: ['Barcelona', 'Naples', 'Rome', 'Marseille'],
22
- prices: {
23
- cheapest_price: 2000,
24
- inside: 'Enquire now',
25
- outside: 'Enquire now',
26
- balcony: '2000',
27
- suite: 'Enquire now'
28
- },
29
- was_prices: {
30
- inside: 0,
31
- outside: 0,
32
- balcony: 2500,
33
- suite: 0
34
- },
35
- link: 'https://example.com/cruises/mediterranean-from-barcelona',
36
- campaigns: ['Special Offer'],
37
- extras: {
38
- date: 'Oct 2025 - Oct 2025',
39
- duration: 'Seven Days',
40
- destination: 'Mediterranean',
41
- info: 'Seven nights onboard a four-star ship'
42
- }
43
- };
44
- describe('transformApiResult', () => {
45
- it('transforms API result to TripCardApiData format', () => {
46
- const result = transformApiResult(mockApiResult);
47
- expect(result).toEqual({
48
- cruise_id: '2074350',
49
- image: 'https://example.com/ship-image.jpg',
50
- offer_label: 'Special Offer',
51
- headline: 'Mediterranean from Barcelona',
52
- date: 'Oct 2025 - Oct 2025',
53
- duration: 'Seven Days',
54
- route: 'Barcelona → Marseille',
55
- ship: 'MSC Seaside',
56
- original_price: '£2500',
57
- price: '£2000',
58
- logo: 'https://example.com/msc-logo.png',
59
- logo_url: 'https://example.com/cruise-lines/msc-cruises/',
60
- cta_url: 'https://example.com/cruises/mediterranean-from-barcelona',
61
- cta_text: 'View Itinerary'
62
- });
63
- });
64
- it('formats price as "Enquire now" when price is 0', () => {
65
- const resultWithZeroPrice = {
66
- ...mockApiResult,
67
- prices: { ...mockApiResult.prices, cheapest_price: 0 }
68
- };
69
- const result = transformApiResult(resultWithZeroPrice);
70
- expect(result.price).toBe('Enquire now');
71
- });
72
- it('formats price as "Enquire now" when price is "Enquire now"', () => {
73
- const resultWithEnquire = {
74
- ...mockApiResult,
75
- prices: { ...mockApiResult.prices, cheapest_price: 'Enquire now' }
76
- };
77
- const result = transformApiResult(resultWithEnquire);
78
- expect(result.price).toBe('Enquire now');
79
- });
80
- it('formats numeric price with £ symbol', () => {
81
- const result = transformApiResult(mockApiResult);
82
- expect(result.price).toBe('£2000');
83
- });
84
- it('returns undefined original_price when was_price is 0', () => {
85
- const resultWithZeroWasPrice = {
86
- ...mockApiResult,
87
- was_prices: { ...mockApiResult.was_prices, balcony: 0 }
88
- };
89
- const result = transformApiResult(resultWithZeroWasPrice);
90
- expect(result.original_price).toBeUndefined();
91
- });
92
- it('returns undefined original_price when was_price is "Enquire now"', () => {
93
- const resultWithEnquireWasPrice = {
94
- ...mockApiResult,
95
- was_prices: { ...mockApiResult.was_prices, balcony: 0 },
96
- prices: {
97
- ...mockApiResult.prices,
98
- cheapest_price: 'Enquire now',
99
- balcony: 'Enquire now'
100
- }
101
- };
102
- const result = transformApiResult(resultWithEnquireWasPrice);
103
- expect(result.original_price).toBeUndefined();
104
- });
105
- it('formats route with start and end for long itineraries', () => {
106
- const result = transformApiResult(mockApiResult);
107
- expect(result.route).toBe('Barcelona → Marseille');
108
- });
109
- it('formats route with all stops for short itineraries', () => {
110
- const resultWithShortItinerary = {
111
- ...mockApiResult,
112
- itinerary: ['Barcelona', 'Rome']
113
- };
114
- const result = transformApiResult(resultWithShortItinerary);
115
- expect(result.route).toBe('Barcelona → Rome');
116
- });
117
- it('returns undefined offer_label when no campaigns', () => {
118
- const resultWithNoCampaigns = {
119
- ...mockApiResult,
120
- campaigns: []
121
- };
122
- const result = transformApiResult(resultWithNoCampaigns);
123
- expect(result.offer_label).toBeUndefined();
124
- });
125
- it('uses data from extras object', () => {
126
- const result = transformApiResult(mockApiResult);
127
- expect(result.date).toBe('Oct 2025 - Oct 2025');
128
- expect(result.duration).toBe('Seven Days');
129
- });
130
- it('handles string prices correctly', () => {
131
- const resultWithStringPrice = {
132
- ...mockApiResult,
133
- prices: { ...mockApiResult.prices, cheapest_price: '£1500pp' }
134
- };
135
- const result = transformApiResult(resultWithStringPrice);
136
- expect(result.price).toBe('£1500pp');
137
- });
138
- });
139
- describe('fetchCruiseCards', () => {
140
- beforeEach(() => {
141
- global.fetch = jest.fn();
142
- });
143
- afterEach(() => {
144
- jest.resetAllMocks();
145
- });
146
- it('filters out offers with past departure dates', async () => {
147
- const futureDate = new Date();
148
- futureDate.setFullYear(futureDate.getFullYear() + 1);
149
- const futureDateString = futureDate.toISOString().split('T')[0];
150
- const validOffer = {
151
- ...mockApiResult,
152
- cruise_id: 1,
153
- departs: futureDateString // Future date
154
- };
155
- const pastOffer = {
156
- ...mockApiResult,
157
- cruise_id: 2,
158
- departs: '2024-01-01' // Past date
159
- };
160
- const mockResponse = {
161
- results: [validOffer, pastOffer]
162
- };
163
- global.fetch.mockResolvedValueOnce({
164
- ok: true,
165
- json: async () => mockResponse
166
- });
167
- const result = await fetchCruiseCards([1, 2]);
168
- // Should only include the valid offer with future date
169
- expect(result).toHaveLength(1);
170
- expect(result[0]).toBeDefined();
171
- expect(result[0].cruise_id).toBe('1');
172
- });
173
- it('filters out offers with invalid date format', async () => {
174
- const futureDate = new Date();
175
- futureDate.setFullYear(futureDate.getFullYear() + 1);
176
- const futureDateString = futureDate.toISOString().split('T')[0];
177
- const validOffer = {
178
- ...mockApiResult,
179
- cruise_id: 1,
180
- departs: futureDateString
181
- };
182
- const invalidDateOffer = {
183
- ...mockApiResult,
184
- cruise_id: 2,
185
- departs: 'invalid-date'
186
- };
187
- const mockResponse = {
188
- results: [validOffer, invalidDateOffer]
189
- };
190
- global.fetch.mockResolvedValueOnce({
191
- ok: true,
192
- json: async () => mockResponse
193
- });
194
- const result = await fetchCruiseCards([1, 2]);
195
- expect(result).toHaveLength(1);
196
- expect(result[0]).toBeDefined();
197
- expect(result[0].cruise_id).toBe('1');
198
- });
199
- it('includes offers departing today', async () => {
200
- const today = new Date();
201
- const todayString = today.toISOString().split('T')[0];
202
- const todayOffer = {
203
- ...mockApiResult,
204
- cruise_id: 1,
205
- departs: todayString
206
- };
207
- const mockResponse = {
208
- results: [todayOffer]
209
- };
210
- global.fetch.mockResolvedValueOnce({
211
- ok: true,
212
- json: async () => mockResponse
213
- });
214
- const result = await fetchCruiseCards([1]);
215
- expect(result).toHaveLength(1);
216
- expect(result[0]).toBeDefined();
217
- expect(result[0].cruise_id).toBe('1');
218
- });
219
- });
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJpcC1jYXJkcy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUdsRSxNQUFNLGFBQWEsR0FBb0I7SUFDckMsT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsT0FBTztJQUNsQixZQUFZLEVBQUUsOEJBQThCO0lBQzVDLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSwrQ0FBK0M7UUFDckQsSUFBSSxFQUFFLGtDQUFrQztLQUN6QztJQUNELElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSx3Q0FBd0M7UUFDOUMsS0FBSyxFQUFFLG9DQUFvQztLQUM1QztJQUNELE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUksRUFBRSxZQUFZO0lBQ2xCLFVBQVUsRUFBRSx1QkFBdUI7SUFDbkMsV0FBVyxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQzlCLFFBQVEsRUFBRSxDQUFDO0lBQ1gsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDO0lBQ3ZELE1BQU0sRUFBRTtRQUNOLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsS0FBSyxFQUFFLGFBQWE7S0FDckI7SUFDRCxVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxFQUFFLElBQUk7UUFDYixLQUFLLEVBQUUsQ0FBQztLQUNUO0lBQ0QsSUFBSSxFQUFFLDBEQUEwRDtJQUNoRSxT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