@qite/tide-booking-component 1.4.28 → 1.4.29

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.
@@ -25325,11 +25325,7 @@ var ItemPicker$1 = function (_a) {
25325
25325
  var _b = React.useState(false),
25326
25326
  isDropdownOpen = _b[0],
25327
25327
  setIsDropdownOpen = _b[1];
25328
- var _c = React.useState('down'),
25329
- openDirection = _c[0],
25330
- setOpenDirection = _c[1];
25331
25328
  var dropdownRef = React.useRef(null);
25332
- var dropdownMenuRef = React.useRef(null);
25333
25329
  var toggleButtonRef = React.useRef(null);
25334
25330
  var handlePick = function (picked) {
25335
25331
  setIsDropdownOpen(false);
@@ -25346,19 +25342,6 @@ var ItemPicker$1 = function (_a) {
25346
25342
  document.removeEventListener('mousedown', handleClickOutside);
25347
25343
  };
25348
25344
  }, []);
25349
- React.useEffect(
25350
- function () {
25351
- var _a, _b;
25352
- if (isDropdownOpen && toggleButtonRef.current) {
25353
- var buttonRect = toggleButtonRef.current.getBoundingClientRect();
25354
- var spaceBelow = window.innerHeight - buttonRect.bottom;
25355
- var spaceAbove = buttonRect.top;
25356
- var dropdownHeight = (_b = (_a = dropdownMenuRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) !== null && _b !== void 0 ? _b : 16;
25357
- setOpenDirection(spaceBelow < dropdownHeight && spaceAbove > spaceBelow ? 'up' : 'down');
25358
- }
25359
- },
25360
- [isDropdownOpen]
25361
- );
25362
25345
  return React__default['default'].createElement(
25363
25346
  'div',
25364
25347
  { className: 'dropdown__input ' + classModifier },
@@ -25383,7 +25366,7 @@ var ItemPicker$1 = function (_a) {
25383
25366
  isDropdownOpen &&
25384
25367
  React__default['default'].createElement(
25385
25368
  'ul',
25386
- { className: 'dropdown-menu dropdown-menu--'.concat(openDirection), ref: dropdownMenuRef },
25369
+ { className: 'dropdown-menu' },
25387
25370
  items.map(function (_a) {
25388
25371
  var label = _a.label,
25389
25372
  icon = _a.icon;
@@ -25454,18 +25437,18 @@ var TravelNationalityPicker = function () {
25454
25437
  var QSMContainer = function () {
25455
25438
  var dispatch = reactRedux.useDispatch();
25456
25439
  var isMobile = useMediaQuery('(max-width: 768px)');
25457
- var _a = reactRedux.useSelector(function (state) {
25458
- return state.qsm;
25459
- }),
25460
- mobileFilterType = _a.mobileFilterType,
25461
- fromDate = _a.fromDate,
25462
- toDate = _a.toDate;
25463
- var _b = React.useContext(QSMConfigurationContext),
25464
- searchFields = _b.searchFields,
25465
- askTravelers = _b.askTravelers,
25466
- submitIcon = _b.submitIcon,
25467
- submitLabel = _b.submitLabel,
25468
- onSubmit = _b.onSubmit;
25440
+ var qsmState = reactRedux.useSelector(function (state) {
25441
+ return state.qsm;
25442
+ });
25443
+ var mobileFilterType = qsmState.mobileFilterType,
25444
+ fromDate = qsmState.fromDate,
25445
+ toDate = qsmState.toDate;
25446
+ var _a = React.useContext(QSMConfigurationContext),
25447
+ searchFields = _a.searchFields,
25448
+ askTravelers = _a.askTravelers,
25449
+ submitIcon = _a.submitIcon,
25450
+ submitLabel = _a.submitLabel,
25451
+ onSubmit = _a.onSubmit;
25469
25452
  React.useEffect(
25470
25453
  function () {
25471
25454
  if (fromDate || toDate) return;
@@ -25491,6 +25474,58 @@ var QSMContainer = function () {
25491
25474
  dispatch(setFromDate((_a = value.fromDate) === null || _a === void 0 ? void 0 : _a.toISOString()));
25492
25475
  dispatch(setToDate((_b = value.toDate) === null || _b === void 0 ? void 0 : _b.toISOString()));
25493
25476
  };
25477
+ var handleSubmit = function () {
25478
+ if (!onSubmit) return;
25479
+ var selectedOrigin = qsmState.selectedOrigin,
25480
+ selectedDestination = qsmState.selectedDestination,
25481
+ selectedAirport = qsmState.selectedAirport,
25482
+ fromDate = qsmState.fromDate,
25483
+ toDate = qsmState.toDate,
25484
+ travelers = qsmState.travelers,
25485
+ selectedTravelClass = qsmState.selectedTravelClass,
25486
+ selectedTravelType = qsmState.selectedTravelType,
25487
+ selectedNationality = qsmState.selectedNationality,
25488
+ adults = qsmState.adults,
25489
+ kids = qsmState.kids,
25490
+ babies = qsmState.babies,
25491
+ rooms = qsmState.rooms,
25492
+ selectedFlexRange = qsmState.selectedFlexRange,
25493
+ language = qsmState.language;
25494
+ var payload = {
25495
+ selectedOrigin: selectedOrigin,
25496
+ selectedDestination: selectedDestination,
25497
+ selectedAirport: selectedAirport,
25498
+ fromDate: fromDate,
25499
+ toDate: toDate,
25500
+ travelers: travelers,
25501
+ travelClass: selectedTravelClass,
25502
+ travelType: selectedTravelType,
25503
+ nationality: selectedNationality,
25504
+ adults: adults,
25505
+ kids: kids,
25506
+ babies: babies,
25507
+ rooms: rooms,
25508
+ dateFlexibility: selectedFlexRange,
25509
+ language: language
25510
+ };
25511
+ addSearchFieldsToPayload(payload, searchFields, qsmState);
25512
+ onSubmit(payload);
25513
+ };
25514
+ var addSearchFieldsToPayload = function (payload, fields, state) {
25515
+ fields.forEach(function (field) {
25516
+ if (field.type === 'single') {
25517
+ var key = field.fieldKey;
25518
+ payload[key] = state[key];
25519
+ }
25520
+ if (field.type === 'double' && field.fields) {
25521
+ // recursively add each nested field
25522
+ field.fields.forEach(function (nestedField) {
25523
+ var key = nestedField.fieldKey;
25524
+ payload[key] = state[key];
25525
+ });
25526
+ }
25527
+ });
25528
+ };
25494
25529
  return React__default['default'].createElement(
25495
25530
  'div',
25496
25531
  { className: 'qsm' },
@@ -25660,7 +25695,7 @@ var QSMContainer = function () {
25660
25695
  askTravelers && React__default['default'].createElement(TravelInputGroup, null),
25661
25696
  React__default['default'].createElement(
25662
25697
  'button',
25663
- { type: 'button', className: 'cta', onClick: onSubmit },
25698
+ { type: 'button', className: 'cta', onClick: handleSubmit },
25664
25699
  submitIcon && submitIcon.toString().length > 0 && React__default['default'].createElement('span', null, submitIcon),
25665
25700
  React__default['default'].createElement('span', null, submitLabel)
25666
25701
  )
@@ -7,7 +7,6 @@ export interface QSMState {
7
7
  fromDate?: string;
8
8
  toDate?: string;
9
9
  travelers: any[];
10
- travelClass?: string;
11
10
  mobileFilterType: MobileFilterType;
12
11
  searchResults: TypeaheadOption[];
13
12
  activeSearchField: string | null;
@@ -25154,11 +25154,7 @@ var ItemPicker$1 = function (_a) {
25154
25154
  var _b = useState(false),
25155
25155
  isDropdownOpen = _b[0],
25156
25156
  setIsDropdownOpen = _b[1];
25157
- var _c = useState('down'),
25158
- openDirection = _c[0],
25159
- setOpenDirection = _c[1];
25160
25157
  var dropdownRef = useRef(null);
25161
- var dropdownMenuRef = useRef(null);
25162
25158
  var toggleButtonRef = useRef(null);
25163
25159
  var handlePick = function (picked) {
25164
25160
  setIsDropdownOpen(false);
@@ -25175,19 +25171,6 @@ var ItemPicker$1 = function (_a) {
25175
25171
  document.removeEventListener('mousedown', handleClickOutside);
25176
25172
  };
25177
25173
  }, []);
25178
- useEffect(
25179
- function () {
25180
- var _a, _b;
25181
- if (isDropdownOpen && toggleButtonRef.current) {
25182
- var buttonRect = toggleButtonRef.current.getBoundingClientRect();
25183
- var spaceBelow = window.innerHeight - buttonRect.bottom;
25184
- var spaceAbove = buttonRect.top;
25185
- var dropdownHeight = (_b = (_a = dropdownMenuRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) !== null && _b !== void 0 ? _b : 16;
25186
- setOpenDirection(spaceBelow < dropdownHeight && spaceAbove > spaceBelow ? 'up' : 'down');
25187
- }
25188
- },
25189
- [isDropdownOpen]
25190
- );
25191
25174
  return React.createElement(
25192
25175
  'div',
25193
25176
  { className: 'dropdown__input ' + classModifier },
@@ -25212,7 +25195,7 @@ var ItemPicker$1 = function (_a) {
25212
25195
  isDropdownOpen &&
25213
25196
  React.createElement(
25214
25197
  'ul',
25215
- { className: 'dropdown-menu dropdown-menu--'.concat(openDirection), ref: dropdownMenuRef },
25198
+ { className: 'dropdown-menu' },
25216
25199
  items.map(function (_a) {
25217
25200
  var label = _a.label,
25218
25201
  icon = _a.icon;
@@ -25283,18 +25266,18 @@ var TravelNationalityPicker = function () {
25283
25266
  var QSMContainer = function () {
25284
25267
  var dispatch = useDispatch();
25285
25268
  var isMobile = useMediaQuery('(max-width: 768px)');
25286
- var _a = useSelector(function (state) {
25287
- return state.qsm;
25288
- }),
25289
- mobileFilterType = _a.mobileFilterType,
25290
- fromDate = _a.fromDate,
25291
- toDate = _a.toDate;
25292
- var _b = useContext(QSMConfigurationContext),
25293
- searchFields = _b.searchFields,
25294
- askTravelers = _b.askTravelers,
25295
- submitIcon = _b.submitIcon,
25296
- submitLabel = _b.submitLabel,
25297
- onSubmit = _b.onSubmit;
25269
+ var qsmState = useSelector(function (state) {
25270
+ return state.qsm;
25271
+ });
25272
+ var mobileFilterType = qsmState.mobileFilterType,
25273
+ fromDate = qsmState.fromDate,
25274
+ toDate = qsmState.toDate;
25275
+ var _a = useContext(QSMConfigurationContext),
25276
+ searchFields = _a.searchFields,
25277
+ askTravelers = _a.askTravelers,
25278
+ submitIcon = _a.submitIcon,
25279
+ submitLabel = _a.submitLabel,
25280
+ onSubmit = _a.onSubmit;
25298
25281
  useEffect(
25299
25282
  function () {
25300
25283
  if (fromDate || toDate) return;
@@ -25320,6 +25303,58 @@ var QSMContainer = function () {
25320
25303
  dispatch(setFromDate((_a = value.fromDate) === null || _a === void 0 ? void 0 : _a.toISOString()));
25321
25304
  dispatch(setToDate((_b = value.toDate) === null || _b === void 0 ? void 0 : _b.toISOString()));
25322
25305
  };
25306
+ var handleSubmit = function () {
25307
+ if (!onSubmit) return;
25308
+ var selectedOrigin = qsmState.selectedOrigin,
25309
+ selectedDestination = qsmState.selectedDestination,
25310
+ selectedAirport = qsmState.selectedAirport,
25311
+ fromDate = qsmState.fromDate,
25312
+ toDate = qsmState.toDate,
25313
+ travelers = qsmState.travelers,
25314
+ selectedTravelClass = qsmState.selectedTravelClass,
25315
+ selectedTravelType = qsmState.selectedTravelType,
25316
+ selectedNationality = qsmState.selectedNationality,
25317
+ adults = qsmState.adults,
25318
+ kids = qsmState.kids,
25319
+ babies = qsmState.babies,
25320
+ rooms = qsmState.rooms,
25321
+ selectedFlexRange = qsmState.selectedFlexRange,
25322
+ language = qsmState.language;
25323
+ var payload = {
25324
+ selectedOrigin: selectedOrigin,
25325
+ selectedDestination: selectedDestination,
25326
+ selectedAirport: selectedAirport,
25327
+ fromDate: fromDate,
25328
+ toDate: toDate,
25329
+ travelers: travelers,
25330
+ travelClass: selectedTravelClass,
25331
+ travelType: selectedTravelType,
25332
+ nationality: selectedNationality,
25333
+ adults: adults,
25334
+ kids: kids,
25335
+ babies: babies,
25336
+ rooms: rooms,
25337
+ dateFlexibility: selectedFlexRange,
25338
+ language: language
25339
+ };
25340
+ addSearchFieldsToPayload(payload, searchFields, qsmState);
25341
+ onSubmit(payload);
25342
+ };
25343
+ var addSearchFieldsToPayload = function (payload, fields, state) {
25344
+ fields.forEach(function (field) {
25345
+ if (field.type === 'single') {
25346
+ var key = field.fieldKey;
25347
+ payload[key] = state[key];
25348
+ }
25349
+ if (field.type === 'double' && field.fields) {
25350
+ // recursively add each nested field
25351
+ field.fields.forEach(function (nestedField) {
25352
+ var key = nestedField.fieldKey;
25353
+ payload[key] = state[key];
25354
+ });
25355
+ }
25356
+ });
25357
+ };
25323
25358
  return React.createElement(
25324
25359
  'div',
25325
25360
  { className: 'qsm' },
@@ -25457,7 +25492,7 @@ var QSMContainer = function () {
25457
25492
  askTravelers && React.createElement(TravelInputGroup, null),
25458
25493
  React.createElement(
25459
25494
  'button',
25460
- { type: 'button', className: 'cta', onClick: onSubmit },
25495
+ { type: 'button', className: 'cta', onClick: handleSubmit },
25461
25496
  submitIcon && submitIcon.toString().length > 0 && React.createElement('span', null, submitIcon),
25462
25497
  React.createElement('span', null, submitLabel)
25463
25498
  )
@@ -7,7 +7,6 @@ export interface QSMState {
7
7
  fromDate?: string;
8
8
  toDate?: string;
9
9
  travelers: any[];
10
- travelClass?: string;
11
10
  mobileFilterType: MobileFilterType;
12
11
  searchResults: TypeaheadOption[];
13
12
  activeSearchField: string | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.28",
3
+ "version": "1.4.29",
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",
@@ -19,7 +19,8 @@ import { setFromDate, setToDate } from '../../store/qsm-slice';
19
19
  const QSMContainer: React.FC = () => {
20
20
  const dispatch = useDispatch();
21
21
  const isMobile = useMediaQuery('(max-width: 768px)');
22
- const { mobileFilterType, fromDate, toDate } = useSelector((state: QSMRootState) => state.qsm);
22
+ const qsmState = useSelector((state: QSMRootState) => state.qsm);
23
+ const { mobileFilterType, fromDate, toDate } = qsmState;
23
24
  const { searchFields, askTravelers, submitIcon, submitLabel, onSubmit } = useContext(QSMConfigurationContext);
24
25
 
25
26
  useEffect(() => {
@@ -46,6 +47,66 @@ const QSMContainer: React.FC = () => {
46
47
  dispatch(setToDate(value.toDate?.toISOString()));
47
48
  };
48
49
 
50
+ const handleSubmit = () => {
51
+ if (!onSubmit) return;
52
+
53
+ const {
54
+ selectedOrigin,
55
+ selectedDestination,
56
+ selectedAirport,
57
+ fromDate,
58
+ toDate,
59
+ travelers,
60
+ selectedTravelClass,
61
+ selectedTravelType,
62
+ selectedNationality,
63
+ adults,
64
+ kids,
65
+ babies,
66
+ rooms,
67
+ selectedFlexRange,
68
+ language
69
+ } = qsmState;
70
+
71
+ const payload = {
72
+ selectedOrigin,
73
+ selectedDestination,
74
+ selectedAirport,
75
+ fromDate,
76
+ toDate,
77
+ travelers,
78
+ travelClass: selectedTravelClass,
79
+ travelType: selectedTravelType,
80
+ nationality: selectedNationality,
81
+ adults,
82
+ kids,
83
+ babies,
84
+ rooms,
85
+ dateFlexibility: selectedFlexRange,
86
+ language
87
+ };
88
+
89
+ addSearchFieldsToPayload(payload, searchFields, qsmState);
90
+ onSubmit(payload);
91
+ };
92
+
93
+ const addSearchFieldsToPayload = (payload: any, fields: typeof searchFields, state: any) => {
94
+ fields.forEach((field) => {
95
+ if (field.type === 'single') {
96
+ const key = field.fieldKey;
97
+ payload[key] = state[key];
98
+ }
99
+
100
+ if (field.type === 'double' && field.fields) {
101
+ // recursively add each nested field
102
+ field.fields.forEach((nestedField) => {
103
+ const key = nestedField.fieldKey;
104
+ payload[key] = state[key];
105
+ });
106
+ }
107
+ });
108
+ };
109
+
49
110
  return (
50
111
  <div className="qsm">
51
112
  <div className="qsm__content">
@@ -159,7 +220,7 @@ const QSMContainer: React.FC = () => {
159
220
 
160
221
  {askTravelers && <TravelInputGroup />}
161
222
 
162
- <button type="button" className="cta" onClick={onSubmit}>
223
+ <button type="button" className="cta" onClick={handleSubmit}>
163
224
  {submitIcon && submitIcon.toString().length > 0 && <span>{submitIcon}</span>}
164
225
  <span>{submitLabel}</span>
165
226
  </button>
@@ -15,9 +15,7 @@ const ItemPicker: React.FC<ItemPickerProps> = ({ items, selection, label, placeh
15
15
  const dispatch = useDispatch();
16
16
 
17
17
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
18
- const [openDirection, setOpenDirection] = useState<'down' | 'up'>('down');
19
18
  const dropdownRef = useRef<HTMLDivElement | null>(null);
20
- const dropdownMenuRef = useRef<HTMLUListElement | null>(null);
21
19
  const toggleButtonRef = useRef<HTMLButtonElement | null>(null);
22
20
 
23
21
  const handlePick = (picked: string) => {
@@ -38,16 +36,6 @@ const ItemPicker: React.FC<ItemPickerProps> = ({ items, selection, label, placeh
38
36
  };
39
37
  }, []);
40
38
 
41
- useEffect(() => {
42
- if (isDropdownOpen && toggleButtonRef.current) {
43
- const buttonRect = toggleButtonRef.current.getBoundingClientRect();
44
- const spaceBelow = window.innerHeight - buttonRect.bottom;
45
- const spaceAbove = buttonRect.top;
46
- const dropdownHeight = dropdownMenuRef.current?.offsetHeight ?? 16;
47
- setOpenDirection(spaceBelow < dropdownHeight && spaceAbove > spaceBelow ? 'up' : 'down');
48
- }
49
- }, [isDropdownOpen]);
50
-
51
39
  return (
52
40
  <div className={'dropdown__input ' + classModifier}>
53
41
  <span className="dropdown__label">{label}</span>
@@ -60,7 +48,7 @@ const ItemPicker: React.FC<ItemPickerProps> = ({ items, selection, label, placeh
60
48
  <span className="arrow">&#9662;</span>
61
49
  </button>
62
50
  {isDropdownOpen && (
63
- <ul className={`dropdown-menu dropdown-menu--${openDirection}`} ref={dropdownMenuRef}>
51
+ <ul className="dropdown-menu">
64
52
  {items.map(({ label, icon }) => (
65
53
  <li
66
54
  key={label}
@@ -10,7 +10,6 @@ export interface QSMState {
10
10
  fromDate?: string;
11
11
  toDate?: string;
12
12
  travelers: any[];
13
- travelClass?: string;
14
13
  mobileFilterType: MobileFilterType;
15
14
  searchResults: TypeaheadOption[];
16
15
  activeSearchField: string | null;