mautourco-components 0.2.93 → 0.2.95

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.
@@ -38,7 +38,6 @@ var DateTimePicker = function (_a) {
38
38
  var date = new Date(defaultValue);
39
39
  var dateRange = { from: date, to: date };
40
40
  var displayValue = format(date, 'dd/MM/yyyy');
41
- console.log('defaultValue', defaultValue, selectionMode, displayValue);
42
41
  return { value: displayValue, dateRange: dateRange };
43
42
  }
44
43
  }
@@ -82,7 +81,16 @@ var DateTimePicker = function (_a) {
82
81
  }
83
82
  }
84
83
  }
85
- if (!payload.dateRange && payload.time) {
84
+ else if (!payload.dateRange && !payload.time) {
85
+ // Handle clearing: return empty string for single mode, empty array for range mode
86
+ if (selectionMode === 'range') {
87
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange([]);
88
+ }
89
+ else {
90
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange('');
91
+ }
92
+ }
93
+ else if (!payload.dateRange && payload.time) {
86
94
  var timeStr = "".concat(payload.time.hour, ":").concat(payload.time.minute, " ").concat(payload.time.meridiem);
87
95
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(timeStr);
88
96
  }
@@ -168,10 +168,10 @@ var RoundTrip = function (_a) {
168
168
  onPaxChange === null || onPaxChange === void 0 ? void 0 : onPaxChange(newPaxData);
169
169
  };
170
170
  var handleDateRangeChange = function (dates) {
171
- if (Array.isArray(dates) && dates.length === 2) {
172
- setInternalArrivalDate(dates[0]);
173
- setInternalDepartureDate(dates[1]);
174
- onDatesChange === null || onDatesChange === void 0 ? void 0 : onDatesChange(dates[0], dates[1]);
171
+ if (Array.isArray(dates)) {
172
+ setInternalArrivalDate(dates === null || dates === void 0 ? void 0 : dates[0]);
173
+ setInternalDepartureDate(dates === null || dates === void 0 ? void 0 : dates[1]);
174
+ onDatesChange === null || onDatesChange === void 0 ? void 0 : onDatesChange(dates === null || dates === void 0 ? void 0 : dates[0], dates === null || dates === void 0 ? void 0 : dates[1]);
175
175
  }
176
176
  };
177
177
  // Helper to convert LocationData to LocationOption
@@ -216,8 +216,20 @@ var RoundTrip = function (_a) {
216
216
  internalPaxData.teens === 0 &&
217
217
  internalPaxData.children === 0 &&
218
218
  (internalPaxData.infants === undefined || internalPaxData.infants === 0)));
219
+ // Show error if checkEmpty is true and either date is missing
219
220
  var isDateEmpty = checkEmpty && (!internalArrivalDate || !internalDepartureDate ||
220
221
  internalArrivalDate === '' || internalDepartureDate === '');
222
+ // Check if user filled one date but not the other (even without checkEmpty)
223
+ var hasPartialDates = function () {
224
+ if (!checkEmpty)
225
+ return false;
226
+ if (!internalArrivalDate || !internalDepartureDate)
227
+ return true;
228
+ return internalArrivalDate === internalDepartureDate;
229
+ };
230
+ var isDateError = function () {
231
+ return isDateEmpty || hasPartialDates();
232
+ };
221
233
  var isPickupDropoffEmpty = checkEmpty && !internalPickupDropoffPoint;
222
234
  var isAccommodationEmpty = checkEmpty && !internalAccommodation;
223
235
  var pickupDropoffOptions = getPickupDropoffOptions();
@@ -237,6 +249,6 @@ var RoundTrip = function (_a) {
237
249
  };
238
250
  var defaultPickupDropoffOption = findLocationOption(pickupDropoffPoint, 'pickup-dropoff');
239
251
  var defaultAccommodationOption = findLocationOption(accommodation, 'accommodation');
240
- return (_jsx("div", { className: "round-trip ".concat(className), "data-round-trip-id": id, children: _jsxs("div", { className: "round-trip__content", children: [_jsx("div", { className: "round-trip__field round-trip__field--pax ".concat(isPaxEmpty ? 'round-trip__field--error' : ''), children: _jsx(PaxSelector, { label: "Number of pax", value: internalPaxData, onChange: handlePaxChange, placeholder: "2 pax", className: isPaxEmpty ? 'pax-selector--error' : '', scrollOnOpen: scrollOnOpen, checkEmpty: checkEmpty }) }), _jsxs("div", { className: "round-trip__field round-trip__field--dates", children: [_jsx(Text, { size: "sm", variant: "regular", className: "round-trip__field-label", children: "Arrival date - Departure date" }), _jsx(DateTimePicker, { placeholder: "DD/MM/YYYY - DD/MM/YYYY", mode: "calendar", iconPosition: "left", numberOfMonths: 2, iconBGFull: false, showChevron: true, onValueChange: handleDateRangeChange, selectionMode: "range", defaultValue: internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined, inputClassName: "round-trip__date-picker--input", state: isDateEmpty ? 'error' : undefined, scrollOnOpen: scrollOnOpen })] }), _jsx("div", { className: "round-trip__field round-trip__field--pickup-dropoff", children: _jsx(LocationDropdown, { label: "Pick up / Drop-off point", options: pickupDropoffOptions.options, groups: pickupDropoffOptions.groups, selectedValue: (internalPickupDropoffPoint === null || internalPickupDropoffPoint === void 0 ? void 0 : internalPickupDropoffPoint.id) || null, onSelectionChange: handlePickupDropoffChange, placeholder: "Select pick-up / drop-off point", direction: undefined, type: "airport-port", showGroupTitles: true, error: isPickupDropoffEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultPickupDropoffOption }) }), _jsx("div", { className: "round-trip__field round-trip__field--accommodation", children: _jsx(LocationDropdown, { label: "Accommodation", options: accommodationOptions.options, groups: accommodationOptions.groups, selectedValue: (internalAccommodation === null || internalAccommodation === void 0 ? void 0 : internalAccommodation.id) || null, onSelectionChange: handleAccommodationChange, placeholder: "Select accommodation", direction: "dropoff", type: "accommodation", showGroupTitles: false, error: isAccommodationEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultAccommodationOption }) })] }) }));
252
+ return (_jsx("div", { className: "round-trip ".concat(className), "data-round-trip-id": id, children: _jsxs("div", { className: "round-trip__content", children: [_jsx("div", { className: "round-trip__field round-trip__field--pax ".concat(isPaxEmpty ? 'round-trip__field--error' : ''), children: _jsx(PaxSelector, { label: "Number of pax", value: internalPaxData, onChange: handlePaxChange, placeholder: "2 pax", className: isPaxEmpty ? 'pax-selector--error' : '', scrollOnOpen: scrollOnOpen, checkEmpty: checkEmpty }) }), _jsxs("div", { className: "round-trip__field round-trip__field--dates", children: [_jsx(Text, { size: "sm", variant: "regular", className: "round-trip__field-label", children: "Arrival date - Departure date" }), _jsx(DateTimePicker, { placeholder: "DD/MM/YYYY - DD/MM/YYYY", mode: "calendar", iconPosition: "left", numberOfMonths: 2, iconBGFull: false, showChevron: true, onValueChange: handleDateRangeChange, selectionMode: "range", defaultValue: internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined, inputClassName: "round-trip__date-picker--input", state: isDateError() ? 'error' : undefined, scrollOnOpen: scrollOnOpen })] }), _jsx("div", { className: "round-trip__field round-trip__field--pickup-dropoff", children: _jsx(LocationDropdown, { label: "Pick up / Drop-off point", options: pickupDropoffOptions.options, groups: pickupDropoffOptions.groups, selectedValue: (internalPickupDropoffPoint === null || internalPickupDropoffPoint === void 0 ? void 0 : internalPickupDropoffPoint.id) || null, onSelectionChange: handlePickupDropoffChange, placeholder: "Select pick-up / drop-off point", direction: undefined, type: "airport-port", showGroupTitles: true, error: isPickupDropoffEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultPickupDropoffOption }) }), _jsx("div", { className: "round-trip__field round-trip__field--accommodation", children: _jsx(LocationDropdown, { label: "Accommodation", options: accommodationOptions.options, groups: accommodationOptions.groups, selectedValue: (internalAccommodation === null || internalAccommodation === void 0 ? void 0 : internalAccommodation.id) || null, onSelectionChange: handleAccommodationChange, placeholder: "Select accommodation", direction: "dropoff", type: "accommodation", showGroupTitles: false, error: isAccommodationEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultAccommodationOption }) })] }) }));
241
253
  };
242
254
  export default RoundTrip;
@@ -49,6 +49,7 @@ var SearchBarTransfer = function (_a) {
49
49
  var _j = useState(defaultRoundTripData), roundTripData = _j[0], setRoundTripData = _j[1];
50
50
  var _k = useState(initializeTransferLines(defaultTransferLines)), transferLines = _k[0], setTransferLines = _k[1];
51
51
  var _l = useState(null), error = _l[0], setError = _l[1];
52
+ var _m = useState(0), validationTrigger = _m[0], setValidationTrigger = _m[1];
52
53
  // Notify parent of changes
53
54
  useEffect(function () {
54
55
  var data = {
@@ -156,7 +157,6 @@ var SearchBarTransfer = function (_a) {
156
157
  // Find the last transfer line that has pax data
157
158
  for (var i = transferLines.length - 1; i >= 0; i--) {
158
159
  if (transferLines[i].paxData) {
159
- console.log({ i: i });
160
160
  return transferLines[i].paxData;
161
161
  }
162
162
  }
@@ -327,8 +327,7 @@ var SearchBarTransfer = function (_a) {
327
327
  }
328
328
  // Check if required fields are filled
329
329
  if (!roundTripData.paxData ||
330
- !roundTripData.arrivalDate ||
331
- !roundTripData.departureDate ||
330
+ roundTripData.arrivalDate === roundTripData.departureDate ||
332
331
  !roundTripData.pickupDropoffPoint ||
333
332
  !roundTripData.accommodation) {
334
333
  setError("Please fill in all the transfer details.");
@@ -367,6 +366,7 @@ var SearchBarTransfer = function (_a) {
367
366
  };
368
367
  // Handle search
369
368
  var handleSearch = function () {
369
+ setValidationTrigger(function (prev) { return prev + 1; });
370
370
  if (validateData()) {
371
371
  var data = {
372
372
  mode: mode,
@@ -377,7 +377,7 @@ var SearchBarTransfer = function (_a) {
377
377
  onSearch === null || onSearch === void 0 ? void 0 : onSearch(data);
378
378
  }
379
379
  };
380
- return (_jsxs("div", { className: "search-bar-transfer ".concat(className), children: [_jsxs("div", { className: "search-bar-transfer__header", children: [_jsx(Heading, { level: 5, variant: "bold", color: "accent", children: "Select your transfer details" }), _jsx("div", { className: "search-bar-transfer__mode-selector", children: _jsx(SegmentedButton, { options: modeOptions, value: mode, onChange: handleModeChange, name: "transfer-mode" }) })] }), mode === "roundtrip" ? (_jsxs(_Fragment, { children: [_jsx(RoundTrip, { id: "roundtrip-main", locations: locations, paxData: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.paxData, arrivalDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.arrivalDate, departureDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.departureDate, pickupDropoffPoint: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.pickupDropoffPoint, accommodation: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.accommodation, onChange: setRoundTripData, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }), _jsx("div", { className: "search-bar-transfer__transfer-type", children: renderTransferTypeButtons(handleAddTransferFromRoundTrip) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__transfer-type", children: [_jsx(Text, { size: "lg", variant: "bold", color: "subtle", as: "div", className: "search-bar-transfer__transfer-type-label", children: "Select a transfer type you want to add" }), renderTransferTypeButtons(handleAddTransfer)] }), transferLines.length === 0 && (_jsx(TransferLine, { id: "placeholder-transfer", type: "inter-hotel", locations: locations, onDataChange: function () { }, showDelete: false, disabled: true, scrollOnOpen: scrollOnOpen })), transferLines.length > 0 && (_jsx("div", { className: "search-bar-transfer__transfer-lines", children: (function () {
380
+ return (_jsxs("div", { className: "search-bar-transfer ".concat(className), children: [_jsxs("div", { className: "search-bar-transfer__header", children: [_jsx(Heading, { level: 5, variant: "bold", color: "accent", children: "Select your transfer details" }), _jsx("div", { className: "search-bar-transfer__mode-selector", children: _jsx(SegmentedButton, { options: modeOptions, value: mode, onChange: handleModeChange, name: "transfer-mode" }) })] }), mode === "roundtrip" ? (_jsxs(_Fragment, { children: [_jsx(RoundTrip, { id: "roundtrip-main", locations: locations, paxData: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.paxData, arrivalDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.arrivalDate, departureDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.departureDate, pickupDropoffPoint: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.pickupDropoffPoint, accommodation: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.accommodation, onChange: setRoundTripData, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, "roundtrip-".concat(validationTrigger)), _jsx("div", { className: "search-bar-transfer__transfer-type", children: renderTransferTypeButtons(handleAddTransferFromRoundTrip) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__transfer-type", children: [_jsx(Text, { size: "lg", variant: "bold", color: "subtle", as: "div", className: "search-bar-transfer__transfer-type-label", children: "Select a transfer type you want to add" }), renderTransferTypeButtons(handleAddTransfer)] }), transferLines.length === 0 && (_jsx(TransferLine, { id: "placeholder-transfer", type: "inter-hotel", locations: locations, onDataChange: function () { }, showDelete: false, disabled: true, scrollOnOpen: scrollOnOpen })), transferLines.length > 0 && (_jsx("div", { className: "search-bar-transfer__transfer-lines", children: (function () {
381
381
  // Group transfers by type
382
382
  var groupedTransfers = {
383
383
  arrival: [],
@@ -396,7 +396,7 @@ var SearchBarTransfer = function (_a) {
396
396
  departure: { label: "Departure", icon: "departure" },
397
397
  "inter-hotel": { label: "Inter-Hotel", icon: "building" },
398
398
  };
399
- return nonEmptyGroups.map(function (type, groupIndex) { return (_jsxs(React.Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__category-header", children: [_jsx(Icon, { name: categoryInfo[type].icon, size: "md" }), _jsx(Text, { size: "md", variant: "bold", color: "default", as: "span", children: categoryInfo[type].label })] }), groupedTransfers[type].map(function (line) { return (_jsx(TransferLine, { id: line.id, type: line.type, paxData: line.paxData, transferDate: line.transferDate, pickupPoint: line.pickupPoint, dropoffPoint: line.dropoffPoint, locations: locations, onDataChange: function (data) { return handleTransferLineChange(line.id, data); }, onDelete: function () { return handleDeleteTransferLine(line.id); }, showDelete: transferLines.length > 1, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, line.id)); }), groupIndex < nonEmptyGroups.length - 1 && (_jsx("svg", { className: "search-bar-transfer__divider", xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "1", viewBox: "0 0 1076 1", fill: "none", preserveAspectRatio: "none", children: _jsx("path", { d: "M0 0.5L1076 0.499906", stroke: "var(--color-border-medium, #A3A3A3)", strokeWidth: "1", strokeDasharray: "10 10" }) }))] }, type)); });
399
+ return nonEmptyGroups.map(function (type, groupIndex) { return (_jsxs(React.Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__category-header", children: [_jsx(Icon, { name: categoryInfo[type].icon, size: "md" }), _jsx(Text, { size: "md", variant: "bold", color: "default", as: "span", children: categoryInfo[type].label })] }), groupedTransfers[type].map(function (line) { return (_jsx(TransferLine, { id: line.id, type: line.type, paxData: line.paxData, transferDate: line.transferDate, pickupPoint: line.pickupPoint, dropoffPoint: line.dropoffPoint, locations: locations, onDataChange: function (data) { return handleTransferLineChange(line.id, data); }, onDelete: function () { return handleDeleteTransferLine(line.id); }, showDelete: transferLines.length > 1, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, "".concat(line.id, "-").concat(validationTrigger))); }), groupIndex < nonEmptyGroups.length - 1 && (_jsx("svg", { className: "search-bar-transfer__divider", xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "1", viewBox: "0 0 1076 1", fill: "none", preserveAspectRatio: "none", children: _jsx("path", { d: "M0 0.5L1076 0.499906", stroke: "var(--color-border-medium, #A3A3A3)", strokeWidth: "1", strokeDasharray: "10 10" }) }))] }, type)); });
400
400
  })() }))] })), _jsxs("div", { className: "search-bar-transfer__actions", children: [_jsx(Checkbox, { checked: sameVehicle, onChange: setSameVehicle, label: "Use the same vehicle for all your transfers" }), _jsxs("div", { className: "search-bar-transfer__cta", children: [error && (_jsx(Toast, { text: error, type: "danger" })), _jsx(Button, { variant: "primary", size: "lg", onClick: handleSearch, children: "Search" })] })] })] }));
401
401
  };
402
402
  export default SearchBarTransfer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mautourco-components",
3
- "version": "0.2.93",
3
+ "version": "0.2.95",
4
4
  "private": false,
5
5
  "description": "Bibliothèque de composants Mautourco pour le redesign",
6
6
  "main": "dist/index.js",
@@ -80,8 +80,6 @@ const DateTimePicker: React.FC<DateTimePickerProps> = ({
80
80
  const date = new Date(defaultValue);
81
81
  const dateRange = { from: date, to: date };
82
82
  const displayValue = format(date, 'dd/MM/yyyy');
83
- console.log('defaultValue', defaultValue, selectionMode, displayValue);
84
-
85
83
  return { value: displayValue, dateRange };
86
84
  }
87
85
  } catch (error) {
@@ -132,9 +130,14 @@ const DateTimePicker: React.FC<DateTimePickerProps> = ({
132
130
  onValueChange?.(dateStr);
133
131
  }
134
132
  }
135
- }
136
-
137
- if (!payload.dateRange && payload.time) {
133
+ } else if (!payload.dateRange && !payload.time) {
134
+ // Handle clearing: return empty string for single mode, empty array for range mode
135
+ if (selectionMode === 'range') {
136
+ onValueChange?.([]);
137
+ } else {
138
+ onValueChange?.('');
139
+ }
140
+ } else if (!payload.dateRange && payload.time) {
138
141
  const timeStr = `${payload.time.hour}:${payload.time.minute} ${payload.time.meridiem}`;
139
142
  onValueChange?.(timeStr);
140
143
  }
@@ -271,10 +271,10 @@ const RoundTrip: React.FC<RoundTripProps> = ({
271
271
  };
272
272
 
273
273
  const handleDateRangeChange = (dates: string | string[]) => {
274
- if (Array.isArray(dates) && dates.length === 2) {
275
- setInternalArrivalDate(dates[0]);
276
- setInternalDepartureDate(dates[1]);
277
- onDatesChange?.(dates[0], dates[1]);
274
+ if (Array.isArray(dates)) {
275
+ setInternalArrivalDate(dates?.[0]);
276
+ setInternalDepartureDate(dates?.[1]);
277
+ onDatesChange?.(dates?.[0], dates?.[1]);
278
278
  }
279
279
  };
280
280
 
@@ -324,8 +324,20 @@ const RoundTrip: React.FC<RoundTripProps> = ({
324
324
  internalPaxData.children === 0 &&
325
325
  (internalPaxData.infants === undefined || internalPaxData.infants === 0)));
326
326
 
327
+ // Show error if checkEmpty is true and either date is missing
327
328
  const isDateEmpty = checkEmpty && (!internalArrivalDate || !internalDepartureDate ||
328
329
  internalArrivalDate === '' || internalDepartureDate === '');
330
+
331
+ // Check if user filled one date but not the other (even without checkEmpty)
332
+ const hasPartialDates = (): boolean => {
333
+ if (!checkEmpty) return false;
334
+ if (!internalArrivalDate || !internalDepartureDate) return true;
335
+ return internalArrivalDate === internalDepartureDate;
336
+ };
337
+
338
+ const isDateError = (): boolean => {
339
+ return isDateEmpty || hasPartialDates();
340
+ };
329
341
 
330
342
  const isPickupDropoffEmpty = checkEmpty && !internalPickupDropoffPoint;
331
343
 
@@ -382,7 +394,7 @@ const RoundTrip: React.FC<RoundTripProps> = ({
382
394
  selectionMode="range"
383
395
  defaultValue={internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined}
384
396
  inputClassName="round-trip__date-picker--input"
385
- state={isDateEmpty ? 'error' : undefined}
397
+ state={isDateError() ? 'error' : undefined}
386
398
  scrollOnOpen={scrollOnOpen}
387
399
  />
388
400
  </div>
@@ -85,6 +85,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
85
85
  initializeTransferLines(defaultTransferLines)
86
86
  );
87
87
  const [error, setError] = useState<string | null>(null);
88
+ const [validationTrigger, setValidationTrigger] = useState<number>(0);
88
89
 
89
90
  // Notify parent of changes
90
91
  useEffect(() => {
@@ -207,8 +208,6 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
207
208
 
208
209
  for (let i = transferLines.length - 1; i >= 0; i--) {
209
210
  if (transferLines[i].paxData) {
210
- console.log({i});
211
-
212
211
  return transferLines[i].paxData;
213
212
  }
214
213
  }
@@ -425,8 +424,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
425
424
  // Check if required fields are filled
426
425
  if (
427
426
  !roundTripData.paxData ||
428
- !roundTripData.arrivalDate ||
429
- !roundTripData.departureDate ||
427
+ roundTripData.arrivalDate === roundTripData.departureDate ||
430
428
  !roundTripData.pickupDropoffPoint ||
431
429
  !roundTripData.accommodation
432
430
  ) {
@@ -467,6 +465,8 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
467
465
 
468
466
  // Handle search
469
467
  const handleSearch = () => {
468
+ setValidationTrigger(prev => prev + 1);
469
+
470
470
  if (validateData()) {
471
471
  const data: SearchBarTransferData = {
472
472
  mode,
@@ -501,6 +501,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
501
501
  {mode === "roundtrip" ? (
502
502
  <>
503
503
  <RoundTrip
504
+ key={`roundtrip-${validationTrigger}`}
504
505
  id="roundtrip-main"
505
506
  locations={locations}
506
507
  paxData={roundTripData?.paxData}
@@ -579,7 +580,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
579
580
  {/* Transfer lines in this category */}
580
581
  {groupedTransfers[type].map((line) => (
581
582
  <TransferLine
582
- key={line.id}
583
+ key={`${line.id}-${validationTrigger}`}
583
584
  id={line.id}
584
585
  type={line.type}
585
586
  paxData={line.paxData}