@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.
- package/build/build-cjs/index.js +2782 -1052
- package/build/build-cjs/src/search-results/components/excursions/day-by-day-excursions.d.ts +4 -0
- package/build/build-cjs/src/search-results/components/excursions/excursion-details.d.ts +3 -0
- package/build/build-cjs/src/search-results/components/excursions/excursion-results.d.ts +8 -0
- package/build/build-cjs/src/search-results/components/filters/filters.d.ts +2 -0
- package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -0
- package/build/build-cjs/src/search-results/store/search-results-selectors.d.ts +546 -0
- package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +55 -8
- package/build/build-cjs/src/search-results/types.d.ts +40 -2
- package/build/build-cjs/src/search-results/utils/query-utils.d.ts +1 -0
- package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +8 -6
- package/build/build-cjs/src/shared/components/flyin/flyin.d.ts +4 -3
- package/build/build-cjs/src/shared/components/flyin/packaging-flights-flyin.d.ts +7 -0
- package/build/build-cjs/src/shared/utils/localization-util.d.ts +3 -0
- package/build/build-cjs/src/shared/utils/tide-api-utils.d.ts +6 -0
- package/build/build-esm/index.js +2735 -1023
- package/build/build-esm/src/search-results/components/excursions/day-by-day-excursions.d.ts +4 -0
- package/build/build-esm/src/search-results/components/excursions/excursion-details.d.ts +3 -0
- package/build/build-esm/src/search-results/components/excursions/excursion-results.d.ts +8 -0
- package/build/build-esm/src/search-results/components/filters/filters.d.ts +2 -0
- package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -0
- package/build/build-esm/src/search-results/store/search-results-selectors.d.ts +546 -0
- package/build/build-esm/src/search-results/store/search-results-slice.d.ts +55 -8
- package/build/build-esm/src/search-results/types.d.ts +40 -2
- package/build/build-esm/src/search-results/utils/query-utils.d.ts +1 -0
- package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +8 -6
- package/build/build-esm/src/shared/components/flyin/flyin.d.ts +4 -3
- package/build/build-esm/src/shared/components/flyin/packaging-flights-flyin.d.ts +7 -0
- package/build/build-esm/src/shared/utils/localization-util.d.ts +3 -0
- package/build/build-esm/src/shared/utils/tide-api-utils.d.ts +6 -0
- package/package.json +2 -2
- package/src/booking-wizard/features/flight-options/index.tsx +6 -2
- package/src/search-results/components/excursions/day-by-day-excursions.tsx +169 -0
- package/src/search-results/components/excursions/excursion-details.tsx +340 -0
- package/src/search-results/components/excursions/excursion-results.tsx +186 -0
- package/src/search-results/components/filters/filters.tsx +8 -9
- package/src/search-results/components/hotel/hotel-accommodation-results.tsx +81 -24
- package/src/search-results/components/hotel/hotel-card.tsx +0 -3
- package/src/search-results/components/icon.tsx +1 -4
- package/src/search-results/components/search-results-container/search-results-container.tsx +208 -130
- package/src/search-results/store/search-results-selectors.ts +84 -0
- package/src/search-results/store/search-results-slice.ts +138 -15
- package/src/search-results/types.ts +55 -2
- package/src/search-results/utils/query-utils.ts +1 -0
- package/src/search-results/utils/search-results-utils.ts +310 -58
- package/src/shared/components/flyin/accommodation-flyin.tsx +4 -2
- package/src/shared/components/flyin/flights-flyin.tsx +3 -1
- package/src/shared/components/flyin/flyin.tsx +116 -21
- package/src/shared/components/flyin/group-tour-flyin.tsx +3 -1
- package/src/shared/components/flyin/packaging-flights-flyin.tsx +164 -0
- package/src/shared/translations/ar-SA.json +4 -2
- package/src/shared/translations/da-DK.json +4 -2
- package/src/shared/translations/de-DE.json +4 -2
- package/src/shared/translations/en-GB.json +4 -2
- package/src/shared/translations/es-ES.json +4 -2
- package/src/shared/translations/fr-BE.json +4 -2
- package/src/shared/translations/fr-FR.json +4 -2
- package/src/shared/translations/is-IS.json +4 -2
- package/src/shared/translations/it-IT.json +4 -2
- package/src/shared/translations/ja-JP.json +4 -2
- package/src/shared/translations/nl-BE.json +4 -2
- package/src/shared/translations/nl-NL.json +4 -2
- package/src/shared/translations/no-NO.json +4 -2
- package/src/shared/translations/pl-PL.json +4 -2
- package/src/shared/translations/pt-PT.json +4 -2
- package/src/shared/translations/sv-SE.json +4 -2
- package/src/shared/utils/localization-util.ts +14 -0
- package/src/shared/utils/tide-api-utils.ts +8 -0
- package/styles/components/_flyin.scss +16 -0
- 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 = (
|
|
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
|
|
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(
|
|
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
|
-
|
|
153
|
-
<div className="
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
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
|
|