@qite/tide-booking-component 1.4.39 → 1.4.41

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 (91) hide show
  1. package/build/build-cjs/booking-wizard/types.d.ts +1 -0
  2. package/build/build-cjs/content/image-card-grid/index.d.ts +4 -0
  3. package/build/build-cjs/content/image-card-grid/types.d.ts +12 -0
  4. package/build/build-cjs/index.d.ts +2 -1
  5. package/build/build-cjs/index.js +9620 -2315
  6. package/build/build-cjs/qsm/store/qsm-slice.d.ts +4 -2
  7. package/build/build-cjs/qsm/types.d.ts +2 -1
  8. package/build/build-cjs/search-results/components/filters/flight-filters.d.ts +8 -0
  9. package/build/build-cjs/search-results/components/flight/flight-accommodation-results.d.ts +4 -1
  10. package/build/build-cjs/search-results/components/flight/flight-option.d.ts +7 -0
  11. package/build/build-cjs/search-results/components/flight/flight-search-context/index.d.ts +36 -0
  12. package/build/build-cjs/search-results/components/icon.d.ts +1 -0
  13. package/build/build-cjs/search-results/components/item-picker/index.d.ts +5 -3
  14. package/build/build-cjs/search-results/components/search-results-container/flight-search-results.d.ts +6 -0
  15. package/build/build-cjs/search-results/store/search-results-slice.d.ts +2 -0
  16. package/build/build-cjs/search-results/types.d.ts +31 -1
  17. package/build/build-cjs/search-results/utils/flight-utils.d.ts +16 -0
  18. package/build/build-cjs/shared/components/flyin.d.ts +9 -0
  19. package/build/build-cjs/shared/components/icon.d.ts +10 -0
  20. package/build/build-cjs/shared/types.d.ts +6 -0
  21. package/build/build-cjs/shared/utils/localization-util.d.ts +21 -0
  22. package/build/build-esm/booking-wizard/types.d.ts +1 -0
  23. package/build/build-esm/content/image-card-grid/index.d.ts +4 -0
  24. package/build/build-esm/content/image-card-grid/types.d.ts +12 -0
  25. package/build/build-esm/index.d.ts +2 -1
  26. package/build/build-esm/index.js +9496 -2304
  27. package/build/build-esm/qsm/store/qsm-slice.d.ts +4 -2
  28. package/build/build-esm/qsm/types.d.ts +2 -1
  29. package/build/build-esm/search-results/components/filters/flight-filters.d.ts +8 -0
  30. package/build/build-esm/search-results/components/flight/flight-accommodation-results.d.ts +4 -1
  31. package/build/build-esm/search-results/components/flight/flight-option.d.ts +7 -0
  32. package/build/build-esm/search-results/components/flight/flight-search-context/index.d.ts +36 -0
  33. package/build/build-esm/search-results/components/icon.d.ts +1 -0
  34. package/build/build-esm/search-results/components/item-picker/index.d.ts +5 -3
  35. package/build/build-esm/search-results/components/search-results-container/flight-search-results.d.ts +6 -0
  36. package/build/build-esm/search-results/store/search-results-slice.d.ts +2 -0
  37. package/build/build-esm/search-results/types.d.ts +31 -1
  38. package/build/build-esm/search-results/utils/flight-utils.d.ts +16 -0
  39. package/build/build-esm/shared/components/flyin.d.ts +9 -0
  40. package/build/build-esm/shared/components/icon.d.ts +10 -0
  41. package/build/build-esm/shared/types.d.ts +6 -0
  42. package/build/build-esm/shared/utils/localization-util.d.ts +21 -0
  43. package/package.json +4 -3
  44. package/rollup.config.js +2 -2
  45. package/src/booking-product/components/dates.tsx +1 -1
  46. package/src/booking-wizard/features/booking/booking-slice.ts +4 -2
  47. package/src/booking-wizard/types.ts +1 -0
  48. package/src/content/components/slider.tsx +1 -1
  49. package/src/content/image-card-grid/index.tsx +34 -0
  50. package/src/content/image-card-grid/types.ts +13 -0
  51. package/src/index.ts +2 -1
  52. package/src/qsm/components/QSMContainer/qsm-container.tsx +38 -26
  53. package/src/qsm/components/search-input-group/index.tsx +0 -1
  54. package/src/qsm/components/travel-input/index.tsx +4 -4
  55. package/src/qsm/components/travel-input-group/index.tsx +4 -3
  56. package/src/qsm/store/qsm-slice.ts +7 -1
  57. package/src/qsm/types.ts +3 -1
  58. package/src/search-results/components/filters/flight-filters.tsx +671 -0
  59. package/src/search-results/components/flight/flight-accommodation-results.tsx +20 -562
  60. package/src/search-results/components/flight/flight-option.tsx +243 -0
  61. package/src/search-results/components/flight/flight-search-context/index.tsx +508 -0
  62. package/src/search-results/components/hotel/hotel-card.tsx +0 -1
  63. package/src/search-results/components/icon.tsx +84 -44
  64. package/src/search-results/components/item-picker/index.tsx +16 -11
  65. package/src/search-results/components/search-results-container/flight-search-results.tsx +120 -0
  66. package/src/search-results/components/search-results-container/search-results-container.tsx +85 -70
  67. package/src/search-results/store/search-results-slice.ts +6 -0
  68. package/src/search-results/types.ts +37 -1
  69. package/src/search-results/utils/flight-utils.ts +106 -0
  70. package/src/shared/components/flyin.tsx +622 -0
  71. package/src/shared/components/icon.tsx +826 -0
  72. package/src/shared/translations/ar-SA.json +13 -1
  73. package/src/shared/translations/da-DK.json +13 -1
  74. package/src/shared/translations/de-DE.json +13 -1
  75. package/src/shared/translations/en-GB.json +13 -1
  76. package/src/shared/translations/es-ES.json +13 -1
  77. package/src/shared/translations/fr-BE.json +13 -1
  78. package/src/shared/translations/fr-FR.json +13 -1
  79. package/src/shared/translations/is-IS.json +13 -1
  80. package/src/shared/translations/it-IT.json +13 -1
  81. package/src/shared/translations/ja-JP.json +13 -1
  82. package/src/shared/translations/nl-BE.json +13 -1
  83. package/src/shared/translations/nl-NL.json +13 -1
  84. package/src/shared/translations/no-NO.json +13 -1
  85. package/src/shared/translations/pl-PL.json +13 -1
  86. package/src/shared/translations/pt-PT.json +13 -1
  87. package/src/shared/translations/sv-SE.json +13 -1
  88. package/src/shared/types.ts +7 -0
  89. package/src/shared/utils/localization-util.ts +71 -0
  90. package/styles/booking-search-results.scss +1 -0
  91. package/styles/components/_flyin.scss +541 -0
@@ -0,0 +1,243 @@
1
+ import React, { useContext, useState } from 'react';
2
+ import { durationTicksInHoursString, formatPrice, getTranslations, longFormatDate, timeFromDateTime } from '../../../shared/utils/localization-util';
3
+ import Icon from '../icon';
4
+ import { ExtendedFlightSearchResponseItem } from '../../types';
5
+ import SearchResultsConfigurationContext from '../../search-results-configuration-context';
6
+ import { getArrivalSegment, getDepartureSegment, getFlightSegments, getNumberOfStopsLabel } from '../../utils/flight-utils';
7
+ import { useDispatch, useSelector } from 'react-redux';
8
+ import { setSelectedFlight } from '../../store/search-results-slice';
9
+ import { SearchResultsRootState } from '../../store/search-results-store';
10
+
11
+ interface FlightOptionProps {
12
+ item: ExtendedFlightSearchResponseItem;
13
+ }
14
+
15
+ const FlightOption: React.FC<FlightOptionProps> = ({ item }) => {
16
+ const dispatch = useDispatch();
17
+ const { selectedFlightId } = useSelector((state: SearchResultsRootState) => state.searchResults);
18
+ const context = useContext(SearchResultsConfigurationContext);
19
+ const language = context?.languageCode ?? 'en-GB';
20
+ const translations = getTranslations(context?.languageCode ?? 'en-GB');
21
+
22
+ const [isOutwardOpen, setIsOutwardOpen] = useState(false);
23
+ const [isReturnOpen, setIsReturnOpen] = useState(false);
24
+
25
+ const handleSelect = (flightGuid: string) => {
26
+ dispatch(setSelectedFlight(flightGuid));
27
+ };
28
+
29
+ return (
30
+ <div className="search__result-card">
31
+ <div className="flight">
32
+ <div className="flight__option">
33
+ <div className="flight__content">
34
+ <div className="flight__flights">
35
+ <div className="flight__flight">
36
+ <div className="flight__flight__header">
37
+ <div className="flight__status__container"></div>
38
+ <div className="flight__price">
39
+ <span className="price">{formatPrice(item.price, 'EUR', context?.languageCode ?? 'en-GB')}</span>
40
+ <button
41
+ type="button"
42
+ className={`cta ${selectedFlightId === item.guid ? 'cta--selected' : 'cta--select'}`}
43
+ onClick={() => handleSelect(item.guid)}>
44
+ {selectedFlightId === item.guid ? 'Selected' : 'Select'}
45
+ </button>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ {item.outward && (
50
+ <div className="flight__flight">
51
+ <div className="flight__flight__container">
52
+ <div className="flight__flight__wrapper">
53
+ <div className="flight__logo__wrapper">
54
+ <img src={`https://media.tidesoftware.be/media/shared/Airlines/${item.airlineCode}.png?height=256`} alt="" className="flight__logo" />
55
+ <span>{item.airlineName}</span>
56
+ </div>
57
+ <div className="flight__info">
58
+ <div className="flight__info__times">
59
+ <strong>
60
+ {timeFromDateTime(getDepartureSegment(item.outward)?.departureDateTime)} {getDepartureSegment(item.outward)?.departureAirportCode}
61
+ </strong>
62
+ <p>{longFormatDate(getDepartureSegment(item.outward)?.departureDateTime, language)}</p>
63
+ </div>
64
+ <div className="flight__info__duration">
65
+ <p>{durationTicksInHoursString(item.outward.durationInTicks)}</p>
66
+ <div className="flight__info__duration__stops">
67
+ <div className="flight__info__duration__stop" />
68
+ </div>
69
+ <span>{getNumberOfStopsLabel(item.outward, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}</span>
70
+ </div>
71
+ <div className="flight__info__times flight__info__times--arrival">
72
+ <strong>
73
+ {timeFromDateTime(getArrivalSegment(item.outward)?.arrivalDateTime)} {getArrivalSegment(item.outward)?.arrivalAirportCode}
74
+ </strong>
75
+ <p>{longFormatDate(getArrivalSegment(item.outward)?.arrivalDateTime, language)}</p>
76
+ {/* <span className="flight__info__times__days">+1 day</span> */}
77
+ </div>
78
+ </div>
79
+ </div>
80
+
81
+ <div className="flight__detail__btn__wrapper">
82
+ <div
83
+ className={`flight__detail__btn ${isOutwardOpen ? 'flight__detail__btn--active' : ''}`}
84
+ onClick={() => setIsOutwardOpen((prev) => !prev)}>
85
+ <Icon name="ui-chevron" className="flight__detail__btn__arrow" width={16} height={16} />
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <div className={`flight__detail ${isOutwardOpen ? 'flight__detail--active' : ''}`}>
91
+ {getFlightSegments(item.outward).map((segment) => (
92
+ <>
93
+ <div key={segment.flightNumber} className="flight__info">
94
+ <div className="flight__info__times__wrapper">
95
+ <div className="flight__info__times">
96
+ <p>{timeFromDateTime(segment.departureDateTime)}</p>
97
+ <strong>{segment.departureAirportCode}</strong>
98
+ <p>{longFormatDate(segment.departureDateTime, language)}</p>
99
+ </div>
100
+ <div>
101
+ <Icon name="ui-plane-depart" width={30} height={20} />
102
+ </div>
103
+ </div>
104
+ <div className="flight__info__duration">
105
+ <p>{durationTicksInHoursString(segment.durationInTicks)}</p>
106
+ <div className="flight__info__duration__stops" />
107
+ <span>{segment.marketingAirlineName}</span>
108
+ <strong>{segment.operatingFlightNumber}</strong>
109
+ </div>
110
+ <div className="flight__info__times__wrapper flight__info__times__wrapper--arrival">
111
+ <div>
112
+ <Icon name="ui-plane-arrive" width={30} height={20} />
113
+ </div>
114
+ <div className="flight__info__times flight__info__times--arrival">
115
+ <p>{timeFromDateTime(segment.arrivalDateTime)}</p>
116
+ <strong>{segment.arrivalAirportCode}</strong>
117
+ <p>{longFormatDate(segment.arrivalDateTime, language)}</p>
118
+ </div>
119
+ </div>
120
+ </div>
121
+
122
+ {segment.transferTimeInTicks && (
123
+ <div className="flight__info">
124
+ <div className="flight__info__times" />
125
+ <div className="flight__info__duration flight__info__duration--waittime">
126
+ <div className="flight__info__duration__stops flight__info__duration__stops--stoptime">
127
+ <Icon name="ui-clock" width={24} height={24} />
128
+ </div>
129
+ <div className="flight__info__duration__stoptime">
130
+ <span>Stop time</span>
131
+ <strong>{durationTicksInHoursString(segment.transferTimeInTicks)}</strong>
132
+ </div>
133
+ </div>
134
+ <div className="flight__info__times flight__info__times--arrival" />
135
+ </div>
136
+ )}
137
+ </>
138
+ ))}
139
+ </div>
140
+ </div>
141
+ )}
142
+ {item.return && (
143
+ <div className="flight__flight">
144
+ <div className="flight__flight__container">
145
+ <div className="flight__flight__wrapper">
146
+ <div className="flight__logo__wrapper">
147
+ <img src={`https://media.tidesoftware.be/media/shared/Airlines/${item.airlineCode}.png?height=256`} alt="" className="flight__logo" />
148
+ <span>{item.airlineName}</span>
149
+ </div>
150
+ <div className="flight__info">
151
+ <div className="flight__info__times">
152
+ <strong>
153
+ {timeFromDateTime(getDepartureSegment(item.return)?.departureDateTime)} {getDepartureSegment(item.return)?.departureAirportCode}
154
+ </strong>
155
+ <p>{longFormatDate(getDepartureSegment(item.return)?.departureDateTime, language)}</p>
156
+ </div>
157
+ <div className="flight__info__duration">
158
+ <p>{durationTicksInHoursString(item.return.durationInTicks)}</p>
159
+ <div className="flight__info__duration__stops">
160
+ <div className="flight__info__duration__stop" />
161
+ </div>
162
+ <span>{getNumberOfStopsLabel(item.return, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}</span>
163
+ </div>
164
+ <div className="flight__info__times flight__info__times--arrival">
165
+ <strong>
166
+ {timeFromDateTime(getArrivalSegment(item.return)?.arrivalDateTime)} {getArrivalSegment(item.return)?.arrivalAirportCode}
167
+ </strong>
168
+ <p>{longFormatDate(getArrivalSegment(item.return)?.arrivalDateTime, language)}</p>
169
+ {/* <span className="flight__info__times__days">+1 day</span> */}
170
+ </div>
171
+ </div>
172
+ </div>
173
+
174
+ <div className="flight__detail__btn__wrapper">
175
+ <div
176
+ className={`flight__detail__btn ${isReturnOpen ? 'flight__detail__btn--active' : ''}`}
177
+ onClick={() => setIsReturnOpen((prev) => !prev)}>
178
+ <Icon name="ui-chevron" className="flight__detail__btn__arrow" width={16} height={16} />
179
+ </div>
180
+ </div>
181
+ </div>
182
+
183
+ <div className={`flight__detail ${isReturnOpen ? 'flight__detail--active' : ''}`}>
184
+ {getFlightSegments(item.return).map((segment) => (
185
+ <>
186
+ <div key={segment.flightNumber} className="flight__info">
187
+ <div className="flight__info__times__wrapper">
188
+ <div className="flight__info__times">
189
+ <p>{timeFromDateTime(segment.departureDateTime)}</p>
190
+ <strong>{segment.departureAirportCode}</strong>
191
+ <p>{longFormatDate(segment.departureDateTime, language)}</p>
192
+ </div>
193
+ <div>
194
+ <Icon name="ui-plane-depart" width={30} height={20} />
195
+ </div>
196
+ </div>
197
+ <div className="flight__info__duration">
198
+ <p>{durationTicksInHoursString(segment.durationInTicks)}</p>
199
+ <div className="flight__info__duration__stops" />
200
+ <span>{segment.marketingAirlineName}</span>
201
+ <strong>{segment.operatingFlightNumber}</strong>
202
+ </div>
203
+ <div className="flight__info__times__wrapper flight__info__times__wrapper--arrival">
204
+ <div>
205
+ <Icon name="ui-plane-arrive" width={30} height={20} />
206
+ </div>
207
+ <div className="flight__info__times flight__info__times--arrival">
208
+ <p>{timeFromDateTime(segment.arrivalDateTime)}</p>
209
+ <strong>{segment.arrivalAirportCode}</strong>
210
+ <p>{longFormatDate(segment.arrivalDateTime, language)}</p>
211
+ </div>
212
+ </div>
213
+ </div>
214
+
215
+ {segment.transferTimeInTicks && (
216
+ <div className="flight__info">
217
+ <div className="flight__info__times" />
218
+ <div className="flight__info__duration flight__info__duration--waittime">
219
+ <div className="flight__info__duration__stops flight__info__duration__stops--stoptime">
220
+ <Icon name="ui-clock" width={24} height={24} />
221
+ </div>
222
+ <div className="flight__info__duration__stoptime">
223
+ <span>Stop time</span>
224
+ <strong>{durationTicksInHoursString(segment.transferTimeInTicks)}</strong>
225
+ </div>
226
+ </div>
227
+ <div className="flight__info__times flight__info__times--arrival" />
228
+ </div>
229
+ )}
230
+ </>
231
+ ))}
232
+ </div>
233
+ </div>
234
+ )}
235
+ </div>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ );
241
+ };
242
+
243
+ export default FlightOption;