@qite/tide-booking-component 1.4.1 → 1.4.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "React Booking wizard & Booking product component for Tide",
5
5
  "main": "build/build-cjs/index.js",
6
6
  "module": "build/build-esm/index.js",
@@ -69,7 +69,7 @@
69
69
  "uuid": "^8.3.2"
70
70
  },
71
71
  "dependencies": {
72
- "@qite/tide-client": "^1.1.90",
72
+ "@qite/tide-client": "^1.1.94",
73
73
  "react-html-comment": "^2.0.16"
74
74
  }
75
75
  }
@@ -3,8 +3,11 @@ import { Gender } from "@qite/tide-client";
3
3
  import {
4
4
  BookingPackageAddress,
5
5
  BookingPackageBookRequest,
6
+ BookingPackageEntryLineFlightMetaData,
7
+ BookingPackageFlight,
6
8
  BookingPackagePax,
7
9
  BookingPackageRequest,
10
+ BookingPackageRoomOption,
8
11
  } from "@qite/tide-client/build/types";
9
12
  import { createSelector } from "@reduxjs/toolkit";
10
13
  import { format, parseISO } from "date-fns";
@@ -67,6 +70,9 @@ export const selectPackageFlights = (state: RootState) => ({
67
70
  return: state.booking.package?.returnFlights,
68
71
  });
69
72
 
73
+ export const selectFlightMetaData = (state: RootState) =>
74
+ state.booking.package?.flightInfo.metaData;
75
+
70
76
  export const selectActiveOption = (state: RootState) =>
71
77
  state.booking.package?.options.find((x) => x.isSelected);
72
78
 
@@ -94,6 +100,24 @@ export const selectPackageAirportGroups = createSelector(
94
100
  )
95
101
  );
96
102
 
103
+ export const selectRoomOptionDepartureFlightsMetaData = createSelector(
104
+ selectActiveOption,
105
+ selectFlightMetaData,
106
+ (ativeOption, flightMetaData) => {
107
+ const roomOptions = ativeOption?.rooms.map(r => r.options.filter(o => o.isSelected).shift());
108
+ return roomOptions?.map(ro => flightMetaData?.find(f => f.entryLineGuid === ro?.entryLineGuid)?.flightMetaData).filter(f => f !== undefined) ?? [];
109
+ }
110
+ );
111
+
112
+ export const selectRoomOptionReturnFlightsMetaData = createSelector(
113
+ selectActiveOption,
114
+ selectFlightMetaData,
115
+ (ativeOption, flightMetaData) => {
116
+ const roomOptions = ativeOption?.rooms.map(r => r.options.filter(o => o.isSelected).reverse().shift());
117
+ return roomOptions?.map(ro => flightMetaData?.find(f => f.entryLineGuid === ro?.entryLineGuid)?.flightMetaData).filter(f => f !== undefined) ?? [];
118
+ }
119
+ );
120
+
97
121
  export const selectApiSettings = (state: RootState) => state.apiSettings;
98
122
 
99
123
  export const selectIsUnavailable = (state: RootState) =>
@@ -157,7 +181,7 @@ export const selectBookingAttributes = (state: RootState) =>
157
181
  export const selectBookingNumber = (state: RootState) =>
158
182
  state.booking.bookingNumber;
159
183
 
160
- export const selectIsOption = (state: RootState) =>
184
+ export const selectIsOption = (state: RootState) =>
161
185
  state.booking.isOption;
162
186
 
163
187
  export const selectBookingRooms = (state: RootState) =>
@@ -5,6 +5,8 @@ import {
5
5
  selectIsOnRequest,
6
6
  selectPackageRooms,
7
7
  selectReturnFlight,
8
+ selectRoomOptionDepartureFlightsMetaData,
9
+ selectRoomOptionReturnFlightsMetaData,
8
10
  } from "../booking/selectors";
9
11
  import { getDateText, getTravelersText } from "./sidebar-util";
10
12
  import { selectFormRooms } from "../travelers-form/travelers-form-slice";
@@ -39,7 +41,9 @@ const SidebarContainer: React.FC<SidebarProps> = ({
39
41
  const rooms = useSelector(selectFormRooms);
40
42
  const travelerRooms = getTravelersText(rooms);
41
43
  const departureFlight = useSelector(selectDepartureFlight);
44
+ const departureFlightMetaData = departureFlight?.flightMetaData ?? useSelector(selectRoomOptionDepartureFlightsMetaData)?.[0];
42
45
  const returnFlight = useSelector(selectReturnFlight);
46
+ const returnFlightMetaData = returnFlight?.flightMetaData ?? useSelector(selectRoomOptionReturnFlightsMetaData)?.[0];
43
47
  const isFetchingProductOptions = useSelector(selectIsFetchingProductOptions);
44
48
  const isFetchingPriceDetails = useSelector(selectIsFetchingPriceDetails);
45
49
  const accommodations = useSelector(selectPackageRooms);
@@ -59,8 +63,8 @@ const SidebarContainer: React.FC<SidebarProps> = ({
59
63
  : undefined
60
64
  }
61
65
  travelerRooms={travelerRooms}
62
- departureFlight={departureFlight}
63
- returnFlight={returnFlight}
66
+ departureFlightMetaData={departureFlightMetaData}
67
+ returnFlightMetaData={returnFlightMetaData}
64
68
  basePrice={useSelector(selectBasePrice)}
65
69
  totalPrice={useSelector(selectTotalPrice)}
66
70
  includedCosts={useSelector(selectSeparatePackagePriceDetails)}
@@ -1,4 +1,4 @@
1
- import { BookingPackageFlight } from "@qite/tide-client/build/types";
1
+ import { BookingPackageFlightMetaData } from "@qite/tide-client/build/types";
2
2
  import { first, last } from "lodash";
3
3
  import React from "react";
4
4
  import { useSelector } from "react-redux";
@@ -7,11 +7,11 @@ import { getAirlines, getDateText, parseFlightLines } from "./sidebar-util";
7
7
 
8
8
  interface SidebarFlightProps {
9
9
  title: string;
10
- flight: BookingPackageFlight;
10
+ flightMetaData: BookingPackageFlightMetaData;
11
11
  }
12
12
 
13
- const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flight }) => {
14
- const flightLines = parseFlightLines(flight.flightMetaData);
13
+ const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flightMetaData }) => {
14
+ const flightLines = parseFlightLines(flightMetaData);
15
15
  const firstFlight = first(flightLines);
16
16
  const lastFlight = last(flightLines);
17
17
  const translations = useSelector(selectTranslations);
@@ -43,9 +43,9 @@ const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flight }) => {
43
43
 
44
44
  <div className="pricing-summary__row">
45
45
  <div className="pricing-summary__property">
46
- {flight.flightMetaData.flightLines.length > 1 && (
46
+ {flightMetaData.flightLines.length > 1 && (
47
47
  <i>
48
- {flight.flightMetaData.flightLines.length - 1}
48
+ {flightMetaData.flightLines.length - 1}
49
49
  {"x "}
50
50
  {translations.SIDEBAR.CHANGES}
51
51
  </i>
@@ -53,7 +53,7 @@ const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flight }) => {
53
53
  </div>
54
54
  <div className="pricing-summary__value">{getAirlines(flightLines)}</div>
55
55
  </div>
56
- {flight.flightMetaData.luggageIncluded && (
56
+ {flightMetaData.luggageIncluded && (
57
57
  <div className="pricing-summary__row">
58
58
  <div className="pricing-summary__property"></div>
59
59
  <div className="pricing-summary__value">
@@ -1,5 +1,5 @@
1
1
  import {
2
- BookingPackageFlight,
2
+ BookingPackageFlightMetaData,
3
3
  BookingPackageRoom,
4
4
  BookingPriceDetail
5
5
  } from "@qite/tide-client/build/types";
@@ -21,8 +21,8 @@ interface SidebarProps {
21
21
  travelerRooms?: string[];
22
22
  startDateText?: string;
23
23
  endDateText?: string;
24
- departureFlight?: BookingPackageFlight;
25
- returnFlight?: BookingPackageFlight;
24
+ departureFlightMetaData?: BookingPackageFlightMetaData;
25
+ returnFlightMetaData?: BookingPackageFlightMetaData;
26
26
  basePrice?: number;
27
27
  totalPrice?: number;
28
28
  remainingAmountText?: string;
@@ -44,8 +44,8 @@ const Sidebar: React.FC<SidebarProps> = ({
44
44
  travelerRooms,
45
45
  startDateText,
46
46
  endDateText,
47
- departureFlight,
48
- returnFlight,
47
+ departureFlightMetaData,
48
+ returnFlightMetaData,
49
49
  basePrice,
50
50
  totalPrice,
51
51
  includedCosts,
@@ -136,15 +136,15 @@ const Sidebar: React.FC<SidebarProps> = ({
136
136
  </div>
137
137
 
138
138
  {isLoading && loaderComponent}
139
- {!isLoading && departureFlight && returnFlight && (
139
+ {!isLoading && departureFlightMetaData && returnFlightMetaData && (
140
140
  <>
141
141
  <SidebarFlight
142
142
  title={translations.SIDEBAR.DEPARTURE_FLIGHT}
143
- flight={departureFlight}
143
+ flightMetaData={departureFlightMetaData}
144
144
  />
145
145
  <SidebarFlight
146
146
  title={translations.SIDEBAR.ARRIVAL_FLIGHT}
147
- flight={returnFlight}
147
+ flightMetaData={returnFlightMetaData}
148
148
  />
149
149
  </>
150
150
  )}
@@ -284,7 +284,7 @@ const Summary: React.FC<SummaryProps> = () => {
284
284
  </div>
285
285
  </div>
286
286
  {rooms.map((r, rIndex) => (
287
- <div className="form__row">
287
+ <div className="form__row" key={rIndex}>
288
288
  <div className="form__group">
289
289
  <div className="form__region-header">
290
290
  <h5 className="form__region-heading">
@@ -371,61 +371,58 @@ const Summary: React.FC<SummaryProps> = () => {
371
371
  <div className="form__row">
372
372
  <div className="form__group">
373
373
  <ul className="list list--booking-summary">
374
- <li>
375
- <h6>{activeOption?.name}</h6>
376
- <ul>
377
- {activeOption?.rooms.map((r, ri) => {
378
- const roomOption = r.options.find(
379
- (x) => x.isSelected
380
- );
381
- return (
382
- <li key={ri} className="list__item">
383
- {roomOption?.accommodationName}
384
- {!isNil(roomOption?.regimeName) && ", "}
385
- {roomOption?.regimeName}
386
- </li>
387
- );
374
+ {activeOption?.rooms.flatMap((r) => r.options).filter(x => x.isSelected).map((roomOption, roomOptionIndex) => (<>
375
+ <li key={roomOptionIndex}>
376
+ <h6>{roomOption?.productName}</h6>
377
+ <ul>
378
+ <li className="list__item">
379
+ {roomOption?.accommodationName}
380
+ {!isNil(roomOption?.regimeName) && ", "}
381
+ {roomOption?.regimeName}
382
+ </li>
383
+ </ul>
384
+ <p>
385
+ ({roomOption?.from === roomOption?.to
386
+ ? getDateText(roomOption?.from)
387
+ : <>{getDateText(roomOption?.from)} &gt; {getDateText(roomOption?.to)}</>})
388
+ </p>
389
+ </li>
390
+ {!isEmpty(activeOption?.groups) &&
391
+ activeOption?.groups.map((x, i) => {
392
+ if (!x.options.some((y) => y.isSelected)) return;
393
+
394
+ return <SummaryBookingOption key={i} group={x} />;
388
395
  })}
389
- </ul>
390
- <p>
391
- ({getDateText(activeOption?.fromDate)} &gt;{" "}
392
- {getDateText(activeOption?.toDate)})
393
- </p>
394
- </li>
395
- {!isEmpty(activeOption?.groups) &&
396
- activeOption?.groups.map((x, i) => {
397
- if (!x.options.some((y) => y.isSelected)) return;
398
-
399
- return <SummaryBookingOption key={i} group={x} />;
400
- })}
401
- {!isEmpty(activeOption?.optionUnits) &&
402
- activeOption?.optionUnits.map((x, i) => (
403
- <SummaryBookingOptionUnit key={i} unit={x} />
404
- ))}
405
- {!isEmpty(activeOption?.optionPax) &&
406
- activeOption?.optionPax.map((x, i) => (
407
- <SummaryBookingOptionPax key={i} pax={x} />
408
- ))}
409
- {packageDetails?.outwardFlights &&
410
- packageDetails.outwardFlights
411
- .filter((x) => x.isSelected)
412
- .map((flight, i) => (
413
- <SummaryFlight
414
- key={i}
415
- flight={flight}
416
- header={translations.SIDEBAR.DEPARTURE_FLIGHT}
417
- />
396
+ {!isEmpty(activeOption?.optionUnits) &&
397
+ activeOption?.optionUnits.map((x, i) => (
398
+ <SummaryBookingOptionUnit key={i} unit={x} />
418
399
  ))}
419
- {packageDetails?.returnFlights &&
420
- packageDetails.returnFlights
421
- .filter((x) => x.isSelected)
422
- .map((flight, i) => (
423
- <SummaryFlight
424
- key={i}
425
- flight={flight}
426
- header={translations.SIDEBAR.ARRIVAL_FLIGHT}
427
- />
400
+ {!isEmpty(activeOption?.optionPax) &&
401
+ activeOption?.optionPax.map((x, i) => (
402
+ <SummaryBookingOptionPax key={i} pax={x} />
403
+ ))}
404
+ {packageDetails?.outwardFlights &&
405
+ packageDetails.outwardFlights
406
+ .filter((x) => x.isSelected)
407
+ .map((flight, i) => (
408
+ <SummaryFlight
409
+ key={i}
410
+ flight={flight}
411
+ header={translations.SIDEBAR.DEPARTURE_FLIGHT}
412
+ />
413
+ ))}
414
+ {packageDetails?.returnFlights &&
415
+ packageDetails.returnFlights
416
+ .filter((x) => x.isSelected)
417
+ .map((flight, i) => (
418
+ <SummaryFlight
419
+ key={i}
420
+ flight={flight}
421
+ header={translations.SIDEBAR.ARRIVAL_FLIGHT}
422
+ />
428
423
  ))}
424
+ </>
425
+ ))}
429
426
  </ul>
430
427
  </div>
431
428
  </div>