@qite/tide-booking-component 1.4.103 → 1.4.105

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 (70) hide show
  1. package/build/build-cjs/index.js +2782 -1052
  2. package/build/build-cjs/src/search-results/components/excursions/day-by-day-excursions.d.ts +4 -0
  3. package/build/build-cjs/src/search-results/components/excursions/excursion-details.d.ts +3 -0
  4. package/build/build-cjs/src/search-results/components/excursions/excursion-results.d.ts +8 -0
  5. package/build/build-cjs/src/search-results/components/filters/filters.d.ts +2 -0
  6. package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -0
  7. package/build/build-cjs/src/search-results/store/search-results-selectors.d.ts +546 -0
  8. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +55 -8
  9. package/build/build-cjs/src/search-results/types.d.ts +40 -2
  10. package/build/build-cjs/src/search-results/utils/query-utils.d.ts +1 -0
  11. package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +8 -6
  12. package/build/build-cjs/src/shared/components/flyin/flyin.d.ts +4 -3
  13. package/build/build-cjs/src/shared/components/flyin/packaging-flights-flyin.d.ts +7 -0
  14. package/build/build-cjs/src/shared/utils/localization-util.d.ts +3 -0
  15. package/build/build-cjs/src/shared/utils/tide-api-utils.d.ts +6 -0
  16. package/build/build-esm/index.js +2735 -1023
  17. package/build/build-esm/src/search-results/components/excursions/day-by-day-excursions.d.ts +4 -0
  18. package/build/build-esm/src/search-results/components/excursions/excursion-details.d.ts +3 -0
  19. package/build/build-esm/src/search-results/components/excursions/excursion-results.d.ts +8 -0
  20. package/build/build-esm/src/search-results/components/filters/filters.d.ts +2 -0
  21. package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -0
  22. package/build/build-esm/src/search-results/store/search-results-selectors.d.ts +546 -0
  23. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +55 -8
  24. package/build/build-esm/src/search-results/types.d.ts +40 -2
  25. package/build/build-esm/src/search-results/utils/query-utils.d.ts +1 -0
  26. package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +8 -6
  27. package/build/build-esm/src/shared/components/flyin/flyin.d.ts +4 -3
  28. package/build/build-esm/src/shared/components/flyin/packaging-flights-flyin.d.ts +7 -0
  29. package/build/build-esm/src/shared/utils/localization-util.d.ts +3 -0
  30. package/build/build-esm/src/shared/utils/tide-api-utils.d.ts +6 -0
  31. package/package.json +2 -2
  32. package/src/booking-wizard/features/flight-options/index.tsx +6 -2
  33. package/src/search-results/components/excursions/day-by-day-excursions.tsx +169 -0
  34. package/src/search-results/components/excursions/excursion-details.tsx +340 -0
  35. package/src/search-results/components/excursions/excursion-results.tsx +186 -0
  36. package/src/search-results/components/filters/filters.tsx +8 -9
  37. package/src/search-results/components/hotel/hotel-accommodation-results.tsx +81 -24
  38. package/src/search-results/components/hotel/hotel-card.tsx +0 -3
  39. package/src/search-results/components/icon.tsx +1 -4
  40. package/src/search-results/components/search-results-container/search-results-container.tsx +208 -130
  41. package/src/search-results/store/search-results-selectors.ts +84 -0
  42. package/src/search-results/store/search-results-slice.ts +138 -15
  43. package/src/search-results/types.ts +55 -2
  44. package/src/search-results/utils/query-utils.ts +1 -0
  45. package/src/search-results/utils/search-results-utils.ts +310 -58
  46. package/src/shared/components/flyin/accommodation-flyin.tsx +4 -2
  47. package/src/shared/components/flyin/flights-flyin.tsx +3 -1
  48. package/src/shared/components/flyin/flyin.tsx +116 -21
  49. package/src/shared/components/flyin/group-tour-flyin.tsx +3 -1
  50. package/src/shared/components/flyin/packaging-flights-flyin.tsx +164 -0
  51. package/src/shared/translations/ar-SA.json +4 -2
  52. package/src/shared/translations/da-DK.json +4 -2
  53. package/src/shared/translations/de-DE.json +4 -2
  54. package/src/shared/translations/en-GB.json +4 -2
  55. package/src/shared/translations/es-ES.json +4 -2
  56. package/src/shared/translations/fr-BE.json +4 -2
  57. package/src/shared/translations/fr-FR.json +4 -2
  58. package/src/shared/translations/is-IS.json +4 -2
  59. package/src/shared/translations/it-IT.json +4 -2
  60. package/src/shared/translations/ja-JP.json +4 -2
  61. package/src/shared/translations/nl-BE.json +4 -2
  62. package/src/shared/translations/nl-NL.json +4 -2
  63. package/src/shared/translations/no-NO.json +4 -2
  64. package/src/shared/translations/pl-PL.json +4 -2
  65. package/src/shared/translations/pt-PT.json +4 -2
  66. package/src/shared/translations/sv-SE.json +4 -2
  67. package/src/shared/utils/localization-util.ts +14 -0
  68. package/src/shared/utils/tide-api-utils.ts +8 -0
  69. package/styles/components/_flyin.scss +16 -0
  70. package/styles/components/_search.scss +15 -2
@@ -1,8 +1,8 @@
1
- import React, { useContext } from 'react';
2
- import { HotelResult, SearchResultsConfiguration } from '../../types';
1
+ import React, { useContext, useState } from 'react';
2
+ import { FlyInType, HotelResult, SearchResultsConfiguration } from '../../types';
3
3
  import Spinner from '../spinner/spinner';
4
4
  import HotelCard from './hotel-card';
5
- import { useSelector } from 'react-redux';
5
+ import { useDispatch, useSelector } from 'react-redux';
6
6
  import { SearchResultsRootState } from '../../store/search-results-store';
7
7
  import { BookingPackageItem, PackagingAccommodationResponse, PortalQsmType } from '@qite/tide-client';
8
8
  import { format, parseISO } from 'date-fns';
@@ -10,9 +10,11 @@ import { calculateNights, formatPrice, getTranslations } from '../../../shared/u
10
10
  import SearchResultsConfigurationContext from '../../search-results-configuration-context';
11
11
  import { first } from 'lodash';
12
12
  import Icon from '../icon';
13
+ import { setFlyInIsOpen, setFlyInType } from '../../store/search-results-slice';
13
14
 
14
15
  interface HotelAccommodationResultsProps {
15
16
  isLoading: boolean;
17
+ isFlyIn?: boolean;
16
18
  }
17
19
 
18
20
  const getLocation = (locationName?: string, regionName?: string, countryName?: string, fallback?: string): string => {
@@ -71,7 +73,14 @@ const mapPackagingAccoResult = (searchResult: PackagingAccommodationResponse, cm
71
73
  };
72
74
  };
73
75
 
74
- const renderHotelResults = (results: HotelResult[], context: SearchResultsConfiguration, activeTab: string | null, translations: any) => {
76
+ const renderHotelResults = (
77
+ results: HotelResult[],
78
+ context: SearchResultsConfiguration,
79
+ activeTab: string | null,
80
+ translations: any,
81
+ selectedPackagingAccoResult?: HotelResult,
82
+ isFlyIn?: boolean
83
+ ) => {
75
84
  const renderedResults = results.map((result, index) => {
76
85
  const key = `${result.id ?? result.code}-${index}`;
77
86
 
@@ -86,19 +95,28 @@ const renderHotelResults = (results: HotelResult[], context: SearchResultsConfig
86
95
  return <HotelCard key={key} result={result} translations={translations} />;
87
96
  });
88
97
 
89
- return <div className={`search__results__cards ${activeTab ? `search__results__cards--${activeTab}` : ''}`}>{renderedResults}</div>;
98
+ return (
99
+ <div className={`search__results__cards ${activeTab ? `search__results__cards--${activeTab}` : ''}`}>
100
+ {selectedPackagingAccoResult && !isFlyIn && (
101
+ <HotelCard key={selectedPackagingAccoResult.code} result={selectedPackagingAccoResult} translations={translations} />
102
+ )}
103
+ {renderedResults}
104
+ </div>
105
+ );
90
106
  };
91
107
 
92
- const HotelAccommodationResults: React.FC<HotelAccommodationResultsProps> = ({ isLoading }) => {
108
+ const HotelAccommodationResults: React.FC<HotelAccommodationResultsProps> = ({ isLoading, isFlyIn }) => {
93
109
  const context = useContext(SearchResultsConfigurationContext);
94
-
110
+ const dispatch = useDispatch();
95
111
  if (!context) {
96
112
  return null;
97
113
  }
98
114
 
99
115
  const translations = getTranslations(context.languageCode ?? 'en-GB');
100
116
 
101
- const { filteredResults, filteredPackagingAccoResults, activeTab } = useSelector((state: SearchResultsRootState) => state.searchResults);
117
+ const { filteredResults, filteredPackagingAccoResults, packagingAccoResults, activeTab, flyInIsOpen, selectedPackagingAccoResultCode } = useSelector(
118
+ (state: SearchResultsRootState) => state.searchResults
119
+ );
102
120
 
103
121
  const cmsMap = React.useMemo(() => {
104
122
  const map = new Map();
@@ -147,26 +165,65 @@ const HotelAccommodationResults: React.FC<HotelAccommodationResultsProps> = ({ i
147
165
  const firstResultDay = firstResultDate ? format(parseISO(firstResultDate), 'd') : null;
148
166
  const firstResultMonth = firstResultDate ? format(parseISO(firstResultDate), 'MMM') : null;
149
167
 
168
+ const selectedPackagingAccoResult = React.useMemo(() => {
169
+ const selectedResult = packagingAccoResults.find((result) => result.code === selectedPackagingAccoResultCode);
170
+ if (selectedResult) {
171
+ return mapPackagingAccoResult(selectedResult, cmsMap.get(selectedResult.code), context.languageCode, translations);
172
+ }
173
+ }, [packagingAccoResults, selectedPackagingAccoResultCode, cmsMap, context.languageCode, translations]);
174
+
175
+ const visibleResults = React.useMemo(() => {
176
+ const shouldShowAll = context?.searchConfiguration.qsmType !== PortalQsmType.AccommodationAndFlight || isFlyIn;
177
+
178
+ if (shouldShowAll) {
179
+ return mappedResults;
180
+ }
181
+
182
+ if (selectedPackagingAccoResult) {
183
+ return mappedResults.filter((result) => result.code !== selectedPackagingAccoResult.code).slice(0, 2);
184
+ }
185
+
186
+ return mappedResults.slice(0, 3);
187
+ }, [context?.searchConfiguration.qsmType, mappedResults, isFlyIn, selectedPackagingAccoResult]);
188
+
189
+ const handleShowMoreHotels = (flyInType: FlyInType) => {
190
+ dispatch(setFlyInType(flyInType));
191
+ dispatch(setFlyInIsOpen(true));
192
+ };
193
+
150
194
  return (
151
195
  <>
152
- <div className="search__results__label search__results__label--secondary">
153
- <div className="search__results__label__date">
154
- {firstResultDay && firstResultMonth ? (
155
- <>
156
- <p className="search__results__label__date-date">{firstResultDay}</p>
157
- <p>{firstResultMonth}</p>
158
- </>
159
- ) : (
160
- <Icon name="ui-bed" height={16} fill="white" />
161
- )}
196
+ {!isFlyIn && (
197
+ <div className="search__results__label search__results__label--secondary">
198
+ <div className="search__results__label__date">
199
+ {firstResultDay && firstResultMonth ? (
200
+ <>
201
+ <p className="search__results__label__date-date">{firstResultDay}</p>
202
+ <p>{firstResultMonth}</p>
203
+ </>
204
+ ) : (
205
+ <Icon name="ui-bed" height={16} fill="white" />
206
+ )}
207
+ </div>
208
+ <div className="search__results__label__text">
209
+ <h3>
210
+ {translations.SRP.SELECT} <strong>{translations.SRP.ACCOMMODATION}</strong>
211
+ </h3>
212
+ </div>
162
213
  </div>
163
- <div className="search__results__label__text">
164
- <h3>
165
- {translations.SRP.SELECT} <strong>{translations.SRP.ACCOMMODATION}</strong>
166
- </h3>
214
+ )}
215
+ {isLoading ? (
216
+ <>{context.customSpinner ?? <Spinner />}</>
217
+ ) : (
218
+ renderHotelResults(visibleResults, context, activeTab, translations, selectedPackagingAccoResult, isFlyIn)
219
+ )}
220
+ {packagingAccoResults.length > 3 && !isFlyIn && (
221
+ <div className="search__results__cards__actions">
222
+ <button className="cta cta--secondary" onClick={() => handleShowMoreHotels('acco-results')}>
223
+ {translations.SRP.SHOW_MORE}
224
+ </button>
167
225
  </div>
168
- </div>
169
- {isLoading ? <>{context.customSpinner ?? <Spinner />}</> : renderHotelResults(mappedResults, context, activeTab, translations)}
226
+ )}
170
227
  {mappedResults.length === 0 && !isLoading && <div className="no-results">{translations.SRP.NO_RESULTS}</div>}
171
228
  </>
172
229
  );
@@ -34,9 +34,6 @@ const HotelCard: React.FC<HotelCardProps> = ({ result, translations }) => {
34
34
  onClick={() => handleChange(result.code)}>
35
35
  {selectedPackagingAccoResultCode === result.code ? translations?.SHARED.SELECTED : translations?.SHARED.SELECT}
36
36
  </button>
37
- {/* <button type="button" className="cta cta--select" onClick={() => console.log('Clicked on customCard with id:', result.id)}>
38
- {translations?.SRP.VIEW_DETAILS}
39
- </button> */}
40
37
  </div>
41
38
  </div>
42
39
  );
@@ -315,10 +315,7 @@ const Icon: React.FC<IconProps> = ({ name, className, title, width, height, fill
315
315
  fill={fill ?? 'currentColor'}>
316
316
  <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
317
317
  {title && <title>{title}</title>}
318
- <path
319
- d="M64 64C28.7 64 0 92.7 0 128l0 64C0 200.8 7.4 207.7 15.7 210.6 34.5 217.1 48 235 48 256s-13.5 38.9-32.3 45.4C7.4 304.3 0 311.2 0 320l0 64c0 35.3 28.7 64 64 64l448 0c35.3 0 64-28.7 64-64l0-64c0-8.8-7.4-15.7-15.7-18.6-18.8-6.5-32.3-24.4-32.3-45.4s13.5-38.9 32.3-45.4c8.3-2.9 15.7-9.8 15.7-18.6l0-64c0-35.3-28.7-64-64-64L64 64zM416 336l0-160-256 0 0 160 256 0zM112 160c0-17.7 14.3-32 32-32l288 0c17.7 0 32 14.3 32 32l0 192c0 17.7-14.3 32-32 32l-288 0c-17.7 0-32-14.3-32-32l0-192z"
320
- fill="currentColor"
321
- />
318
+ <path d="M64 64C28.7 64 0 92.7 0 128l0 64C0 200.8 7.4 207.7 15.7 210.6 34.5 217.1 48 235 48 256s-13.5 38.9-32.3 45.4C7.4 304.3 0 311.2 0 320l0 64c0 35.3 28.7 64 64 64l448 0c35.3 0 64-28.7 64-64l0-64c0-8.8-7.4-15.7-15.7-18.6-18.8-6.5-32.3-24.4-32.3-45.4s13.5-38.9 32.3-45.4c8.3-2.9 15.7-9.8 15.7-18.6l0-64c0-35.3-28.7-64-64-64L64 64zM416 336l0-160-256 0 0 160 256 0zM112 160c0-17.7 14.3-32 32-32l288 0c17.7 0 32 14.3 32 32l0 192c0 17.7-14.3 32-32 32l-288 0c-17.7 0-32-14.3-32-32l0-192z" />
322
319
  </svg>
323
320
  );
324
321