@roomstay/frontend 2.6.83 → 2.6.85
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/dist/151.bundle.js +1 -0
- package/dist/177.bundle.js +1 -0
- package/dist/279.bundle.js +1 -0
- package/dist/288.bundle.js +1 -0
- package/dist/370.bundle.js +1 -0
- package/dist/375.bundle.js +1 -0
- package/dist/430.bundle.js +1 -0
- package/dist/439.bundle.js +1 -0
- package/dist/446.bundle.js +1 -0
- package/dist/449.bundle.js +1 -0
- package/dist/535.bundle.js +2 -0
- package/dist/535.bundle.js.LICENSE.txt +30 -0
- package/dist/537.bundle.js +1 -0
- package/dist/619.bundle.js +1 -0
- package/dist/625.bundle.js +1 -0
- package/dist/686.bundle.js +1 -0
- package/dist/873.bundle.js +1 -0
- package/dist/972.bundle.js +1 -0
- package/dist/978.bundle.js +1 -0
- package/dist/984.bundle.js +1 -0
- package/dist/main.bundle.js +1 -0
- package/dist/src/api/AvailabilityAPI.d.ts +16 -1
- package/dist/src/api/AvailabilityAPI.js +69 -4
- package/dist/src/api/AvailabilityAPI.js.map +1 -1
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js +1 -0
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
- package/dist/src/components/steps/room/AvailableUpgradesModal.js +96 -28
- package/dist/src/components/steps/room/AvailableUpgradesModal.js.map +1 -1
- package/dist/src/components/steps/room/LargeRateCard.d.ts +10 -0
- package/dist/src/components/steps/room/LargeRateCard.js +120 -0
- package/dist/src/components/steps/room/LargeRateCard.js.map +1 -0
- package/dist/src/components/steps/room/LargeRoomCard.js +9 -3
- package/dist/src/components/steps/room/LargeRoomCard.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextType.d.ts +1 -2
- package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +2 -0
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
- package/dist/src/hooks/AutoFocusOnSelect.d.ts +23 -1
- package/dist/src/hooks/AutoFocusOnSelect.js +3 -3
- package/dist/src/hooks/AutoFocusOnSelect.js.map +1 -1
- package/dist/src/models/Api/HotelDTO.d.ts +2 -0
- package/dist/src/models/Api/HotelDTO.js.map +1 -1
- package/dist/src/models/Api/IEventReservation.d.ts +5 -0
- package/dist/src/models/Api/IEventReservation.js.map +1 -1
- package/dist/src/models/Client/Hotel/Company.d.ts +2 -0
- package/dist/src/models/Client/Hotel/Company.js.map +1 -1
- package/dist/src/models/Client/Hotel/Hotel.d.ts +2 -0
- package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
- package/dist/src/models/Room/RoomRate.d.ts +5 -1
- package/dist/src/models/Room/RoomRate.js +5 -1
- package/dist/src/models/Room/RoomRate.js.map +1 -1
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js +5 -0
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js.map +1 -1
- package/dist/src/providers/feature/RoomUpsellFeature.d.ts +10 -0
- package/dist/src/providers/feature/RoomUpsellFeature.js +10 -0
- package/dist/src/providers/feature/RoomUpsellFeature.js.map +1 -1
- package/dist/src/translations/Translation.d.ts +7 -0
- package/dist/src/translations/Translation.js +7 -0
- package/dist/src/translations/Translation.js.map +1 -1
- package/dist/src/translations/languages/en-gb.js +7 -0
- package/dist/src/translations/languages/en-gb.js.map +1 -1
- package/dist/src/util/Analytics/Analytics.d.ts +2 -0
- package/dist/src/util/Analytics/Analytics.js +4 -0
- package/dist/src/util/Analytics/Analytics.js.map +1 -1
- package/dist/src/util/Analytics/GoogleAnalytics4.js +4 -4
- package/dist/src/util/Analytics/GoogleAnalytics4.js.map +1 -1
- package/dist/src/util/Analytics/UniversalAnalytics.js +1 -1
- package/dist/src/util/Analytics/UniversalAnalytics.js.map +1 -1
- package/dist/src/util/DataLayer.d.ts +1 -0
- package/dist/src/util/DataLayer.js +10 -4
- package/dist/src/util/DataLayer.js.map +1 -1
- package/dist/test.bundle.js +1 -0
- package/dist/vendors.bundle.js +2 -0
- package/dist/vendors.bundle.js.LICENSE.txt +114 -0
- package/package.json +6 -3
|
@@ -27,6 +27,7 @@ export default class AvailabilityAPI extends BaseAPI {
|
|
|
27
27
|
private ratePlansData;
|
|
28
28
|
private cachedMinNightStay;
|
|
29
29
|
private cachedAvailability;
|
|
30
|
+
private cachedHasMinStayUpsellOpportunities;
|
|
30
31
|
private calendar;
|
|
31
32
|
private arrivalMinNightStay;
|
|
32
33
|
private arrivalMaxNightStay;
|
|
@@ -57,6 +58,15 @@ export default class AvailabilityAPI extends BaseAPI {
|
|
|
57
58
|
} | null>;
|
|
58
59
|
invalidateAvailability: (basketRow: BasketRow, hotelId: string) => Promise<void>;
|
|
59
60
|
fetchMinNightStayData: (basketRow: BasketRow, hotelID: string, memberNumber?: string) => Promise<any>;
|
|
61
|
+
/**
|
|
62
|
+
* Check if minimum stay upsell opportunities exist.
|
|
63
|
+
*/
|
|
64
|
+
hasMinStayUpsellOpportunities(basketRow: BasketRow, hotelId: string, memberNumber?: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Fetches availability data with minimum stay extensions.
|
|
67
|
+
* This is used for finding upsell opportunities that require extending the stay.
|
|
68
|
+
*/
|
|
69
|
+
fetchMinimumStayExtensions: (basketRow: BasketRow, hotelId: string, memberNumber?: string) => Promise<Room[] | undefined>;
|
|
60
70
|
/**
|
|
61
71
|
* Fetches availability data.
|
|
62
72
|
*
|
|
@@ -65,9 +75,10 @@ export default class AvailabilityAPI extends BaseAPI {
|
|
|
65
75
|
* @param memberNumber - (Optional) The membership number of the user.
|
|
66
76
|
* @param ignoreRoomFilter - If true, skips sending the room code filter in the API request. Default: false.
|
|
67
77
|
* @param eager - If true, returns alternative availability if selected dates are unavailable
|
|
78
|
+
* @param findMinStayExtensions - If true, returns availability for extended dates to meet minimum stay requirements. Default: false.
|
|
68
79
|
* @returns The fetched availability data.
|
|
69
80
|
*/
|
|
70
|
-
fetchAvailabilityData: (basketRow: BasketRow, hotelId: string, memberNumber?: string, ignoreRoomFilter?: boolean, eager?: boolean) => Promise<Room[] | undefined>;
|
|
81
|
+
fetchAvailabilityData: (basketRow: BasketRow, hotelId: string, memberNumber?: string, ignoreRoomFilter?: boolean, eager?: boolean, findMinStayExtensions?: boolean) => Promise<Room[] | undefined>;
|
|
71
82
|
private parseRoomsFromAvailability;
|
|
72
83
|
fetchAvailability: ({ fromDate, toDate, adults, children, infants, promoCode, roomCode, promoOnly, hotelId, }: {
|
|
73
84
|
fromDate: dayjs.Dayjs;
|
|
@@ -80,6 +91,10 @@ export default class AvailabilityAPI extends BaseAPI {
|
|
|
80
91
|
promoOnly?: boolean;
|
|
81
92
|
hotelId: string;
|
|
82
93
|
}) => Promise<any>;
|
|
94
|
+
/**
|
|
95
|
+
* TODO: This logic is repeated multiple times throughout this file, we should try and refactor parts of this file to use this function.
|
|
96
|
+
*/
|
|
97
|
+
private getQueryIDParams;
|
|
83
98
|
private getQueryID;
|
|
84
99
|
}
|
|
85
100
|
export {};
|
|
@@ -62,6 +62,7 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
62
62
|
this.roomTypesData = null;
|
|
63
63
|
this.ratePlansData = null;
|
|
64
64
|
this.cachedMinNightStay = {};
|
|
65
|
+
this.cachedHasMinStayUpsellOpportunities = {};
|
|
65
66
|
this.calendar = {};
|
|
66
67
|
this.arrivalMinNightStay = {};
|
|
67
68
|
this.arrivalMaxNightStay = {};
|
|
@@ -263,6 +264,13 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
263
264
|
}));
|
|
264
265
|
return this.cachedMidNightStayPromises[id];
|
|
265
266
|
});
|
|
267
|
+
/**
|
|
268
|
+
* Fetches availability data with minimum stay extensions.
|
|
269
|
+
* This is used for finding upsell opportunities that require extending the stay.
|
|
270
|
+
*/
|
|
271
|
+
this.fetchMinimumStayExtensions = (basketRow, hotelId, memberNumber) => __awaiter(this, void 0, void 0, function* () {
|
|
272
|
+
return this.fetchAvailabilityData(basketRow, hotelId, memberNumber, false, false, true);
|
|
273
|
+
});
|
|
266
274
|
/**
|
|
267
275
|
* Fetches availability data.
|
|
268
276
|
*
|
|
@@ -271,9 +279,10 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
271
279
|
* @param memberNumber - (Optional) The membership number of the user.
|
|
272
280
|
* @param ignoreRoomFilter - If true, skips sending the room code filter in the API request. Default: false.
|
|
273
281
|
* @param eager - If true, returns alternative availability if selected dates are unavailable
|
|
282
|
+
* @param findMinStayExtensions - If true, returns availability for extended dates to meet minimum stay requirements. Default: false.
|
|
274
283
|
* @returns The fetched availability data.
|
|
275
284
|
*/
|
|
276
|
-
this.fetchAvailabilityData = (basketRow_1, hotelId_1, memberNumber_1, ...args_1) => __awaiter(this, [basketRow_1, hotelId_1, memberNumber_1, ...args_1], void 0, function* (basketRow, hotelId, memberNumber, ignoreRoomFilter = false, eager = false) {
|
|
285
|
+
this.fetchAvailabilityData = (basketRow_1, hotelId_1, memberNumber_1, ...args_1) => __awaiter(this, [basketRow_1, hotelId_1, memberNumber_1, ...args_1], void 0, function* (basketRow, hotelId, memberNumber, ignoreRoomFilter = false, eager = false, findMinStayExtensions = false) {
|
|
277
286
|
var _a;
|
|
278
287
|
const today = (0, dayjs_1.default)();
|
|
279
288
|
if (!basketRow) {
|
|
@@ -295,7 +304,20 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
295
304
|
oneNightStay = true;
|
|
296
305
|
toDate = fromDate.add(1, 'day');
|
|
297
306
|
}
|
|
298
|
-
const id = this.getQueryID([
|
|
307
|
+
const id = this.getQueryID([
|
|
308
|
+
hotelId,
|
|
309
|
+
fromDate,
|
|
310
|
+
toDate,
|
|
311
|
+
adults,
|
|
312
|
+
children,
|
|
313
|
+
infants,
|
|
314
|
+
promoCode,
|
|
315
|
+
roomCodeParam,
|
|
316
|
+
RoomstayThemeEngine_1.default.selectedLang,
|
|
317
|
+
oneNightStay,
|
|
318
|
+
memberNumber,
|
|
319
|
+
findMinStayExtensions,
|
|
320
|
+
]);
|
|
299
321
|
// Don't parse warnings when we're making a cross-hotel availability request
|
|
300
322
|
if (this.cachedAvailability[id]) {
|
|
301
323
|
if (this.availabilityWarnings[id]) {
|
|
@@ -314,12 +336,12 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
314
336
|
this.fetchDataPromise[id] = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
315
337
|
var _a, _b;
|
|
316
338
|
try {
|
|
317
|
-
const json = yield this.get(BaseAPI_1.APIEndpoint.Availability, Object.assign(Object.assign({ checkInDate: fromDate, checkOutDate: toDate, adults,
|
|
339
|
+
const json = yield this.get(BaseAPI_1.APIEndpoint.Availability, Object.assign(Object.assign(Object.assign({ checkInDate: fromDate, checkOutDate: toDate, adults,
|
|
318
340
|
children,
|
|
319
341
|
infants,
|
|
320
342
|
promoCode,
|
|
321
343
|
promoOnly,
|
|
322
|
-
memberNumber }, (eager && { searchType: 'eager' })), (roomCodeParam ? { roomCode: roomCodeParam } : {})), '', hotelId);
|
|
344
|
+
memberNumber }, (eager && { searchType: 'eager' })), (roomCodeParam ? { roomCode: roomCodeParam } : {})), (findMinStayExtensions ? { findMinStayExtensions: 'true' } : {})), '', hotelId);
|
|
323
345
|
this.fetchDataPromise[id] = null;
|
|
324
346
|
if (eager && json.alternativeAvailability) {
|
|
325
347
|
// There was no availability for the currently selected dates, but we eagerly searched and found alternative dates with availability.
|
|
@@ -333,6 +355,7 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
333
355
|
}
|
|
334
356
|
const roomArray = this.parseRoomsFromAvailability(json, oneNightStay);
|
|
335
357
|
this.cachedAvailability[id] = roomArray;
|
|
358
|
+
this.cachedHasMinStayUpsellOpportunities[id] = json.hasMinStayUpsellOpportunities || false;
|
|
336
359
|
resolve(roomArray);
|
|
337
360
|
if ((_a = json.warnings) === null || _a === void 0 ? void 0 : _a.length) {
|
|
338
361
|
this.availabilityWarnings[id] = json.warnings.map((warning) => warning.message);
|
|
@@ -375,6 +398,14 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
375
398
|
var _a;
|
|
376
399
|
return (_a = this.crossSellHotelInfo[String(hotelId)]) !== null && _a !== void 0 ? _a : {};
|
|
377
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* Check if minimum stay upsell opportunities exist.
|
|
403
|
+
*/
|
|
404
|
+
hasMinStayUpsellOpportunities(basketRow, hotelId, memberNumber) {
|
|
405
|
+
const params = this.getQueryIDParams(basketRow, hotelId, memberNumber);
|
|
406
|
+
const id = this.getQueryID(params);
|
|
407
|
+
return this.cachedHasMinStayUpsellOpportunities[id] || false;
|
|
408
|
+
}
|
|
378
409
|
// TODO: Add a type for the JSON response
|
|
379
410
|
parseRoomsFromAvailability(json, oneNightStay = false) {
|
|
380
411
|
const dateToObject = (data) => {
|
|
@@ -468,6 +499,40 @@ class AvailabilityAPI extends BaseAPI_1.default {
|
|
|
468
499
|
}
|
|
469
500
|
return [];
|
|
470
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* TODO: This logic is repeated multiple times throughout this file, we should try and refactor parts of this file to use this function.
|
|
504
|
+
*/
|
|
505
|
+
getQueryIDParams(basketRow, hotelId, memberNumber, ignoreRoomFilter = false, findMinStayExtensions = false) {
|
|
506
|
+
var _a;
|
|
507
|
+
const today = (0, dayjs_1.default)();
|
|
508
|
+
const adults = basketRow.getAdults();
|
|
509
|
+
const children = basketRow.getChildren();
|
|
510
|
+
const infants = basketRow.getInfants();
|
|
511
|
+
const promoCode = basketRow.getPromoCode();
|
|
512
|
+
const enableRoomCodeFilter = basketRow.getEnableRoomCodeFilter();
|
|
513
|
+
const roomCodeParam = ignoreRoomFilter ? '' : enableRoomCodeFilter ? basketRow.getRoomCode() : '';
|
|
514
|
+
let toDate = basketRow.getEndDate();
|
|
515
|
+
const fromDate = ((_a = basketRow.getStartDate()) === null || _a === void 0 ? void 0 : _a.isBefore(today, 'day')) ? today : basketRow.getStartDate();
|
|
516
|
+
let oneNightStay = false;
|
|
517
|
+
if (fromDate.isSameOrAfter(toDate, 'date')) {
|
|
518
|
+
oneNightStay = true;
|
|
519
|
+
toDate = fromDate.add(1, 'day');
|
|
520
|
+
}
|
|
521
|
+
return [
|
|
522
|
+
hotelId,
|
|
523
|
+
fromDate,
|
|
524
|
+
toDate,
|
|
525
|
+
adults,
|
|
526
|
+
children,
|
|
527
|
+
infants,
|
|
528
|
+
promoCode,
|
|
529
|
+
roomCodeParam,
|
|
530
|
+
RoomstayThemeEngine_1.default.selectedLang,
|
|
531
|
+
oneNightStay,
|
|
532
|
+
memberNumber,
|
|
533
|
+
findMinStayExtensions,
|
|
534
|
+
];
|
|
535
|
+
}
|
|
471
536
|
}
|
|
472
537
|
AvailabilityAPI.policyMappings = { guarantee: {}, cancel: {} };
|
|
473
538
|
AvailabilityAPI.maxNightPrice = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailabilityAPI.js","sourceRoot":"/","sources":["src/api/AvailabilityAPI.ts"],"names":[],"mappings":"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","sourcesContent":["import { EGuaranteePolicyDepositMode, IAvailability, IAvailabilityGuaranteePolicyDetails, IPromoCodeDetails } from '@roomstay/core';\nimport dayjs from 'dayjs';\nimport GetAvailabilityError from 'errors/GetAvailabilityError';\nimport { NoHotelSelectedError } from 'errors/NoHotelSelectedError';\nimport { RoomstayError } from 'errors/RoomstayError';\nimport { BasketContextErrorHandler } from 'handlers/BasketContextErrorHandler';\n\nimport BaseAPI, { API_DATE_FORMAT, APIEndpoint } from '@/api/BaseAPI';\nimport BasketRow, { EPromoCodeStatus } from '@/models/BasketRow';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomRateNight from '@/models/Room/RoomRateNight';\nimport RoomstayThemeEngine from '@/providers/RoomstayThemeEngine';\ninterface IPriceByDay {\n [date: string]: number;\n}\ninterface INightStayByDay {\n [date: string]: number;\n}\n\ntype AvailabilityParams = {\n checkInDate: string;\n checkOutDate: string;\n adults: string;\n children: string;\n infants: string;\n promoCode?: string;\n promoOnly?: string;\n roomCode?: string;\n memberNumber?: string;\n includeHotelInfo: string;\n};\n\ntype NullableAvailabilityGuaranteePolicyDetails = Omit<IAvailabilityGuaranteePolicyDetails, 'depositMode'> & {\n depositMode: EGuaranteePolicyDepositMode | null;\n};\n\nexport default class AvailabilityAPI extends BaseAPI {\n public static policyMappings: { guarantee: { [name: string]: NullableAvailabilityGuaranteePolicyDetails }; cancel: { [name: string]: string } } = { guarantee: {}, cancel: {} };\n public static maxNightPrice = 0;\n public static minNightPrice: number | null = null;\n private roomTypesData: any = null;\n private ratePlansData: any = null;\n private cachedMinNightStay: { [id: string]: any } = {};\n private cachedAvailability: { [id: string]: Room[] };\n private calendar: { [id: string]: IPriceByDay } = {};\n private arrivalMinNightStay: { [id: string]: INightStayByDay } = {};\n private arrivalMaxNightStay: { [id: string]: INightStayByDay } = {};\n private crossSellHotelInfo: { [hotelId: string]: any } = {};\n private calendarWarnings: { [id: string]: string[] } = {};\n private availabilityWarnings: { [id: string]: string[] } = {};\n private rooms: { [code: string]: Room };\n private rates: { [code: string]: RoomRate };\n private fetchDataPromise: { [dateRange: string]: Promise<Room[]> | null } = {};\n private calendarPromises: {\n [id: string]: Promise<{\n prices: IPriceByDay;\n arrivalMinNightStay: INightStayByDay;\n arrivalMaxNightStay: INightStayByDay;\n }>;\n } = {};\n private cachedMidNightStayPromises: { [id: string]: Promise<any> } = {};\n private promoCodeDetails: { [code: string]: IPromoCodeDetails } = {};\n\n public constructor() {\n super();\n\n this.rooms = {};\n this.rates = {};\n\n this.cachedAvailability = {};\n }\n\n public getCrossSellHotelInfo(hotelId: number | string) {\n return this.crossSellHotelInfo[String(hotelId)] ?? {};\n }\n\n public getCheapestPricePerDay = async (\n fromDate: dayjs.Dayjs,\n toDate: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelId: string,\n memberNumber: string | number = '',\n isCrossSell = false\n ): Promise<{ [date: string]: number }> => {\n let dayPricingData = null;\n if (fromDate === undefined) {\n return {};\n }\n\n try {\n const response = await this.fetchCalendar(fromDate, adults, children, infants, promoCode, roomCode, hotelId, memberNumber, undefined, isCrossSell);\n dayPricingData = response?.prices;\n } catch (ex) {\n if (!(ex instanceof GetAvailabilityError)) {\n throw ex;\n } else {\n return {};\n }\n }\n\n if (!dayPricingData) {\n return {};\n }\n\n const daysBetween = toDate.diff(fromDate, 'day');\n const prices: any = {};\n\n for (let i = 0; i <= daysBetween; i++) {\n const currentDay = fromDate.add(i, 'day');\n prices[currentDay.format(API_DATE_FORMAT)] = dayPricingData[currentDay.format(API_DATE_FORMAT)];\n }\n\n return prices;\n };\n\n public getCheapestPriceForDay = async (\n day: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelID: string,\n memberNumber: string | number = '',\n parseErrors = true\n ): Promise<{\n price: number;\n perCent: number;\n arrivalMinNightStay: number;\n arrivalMaxNightStay: number;\n } | null> => {\n if (!day || day.isBefore(dayjs(), 'date')) return null;\n\n let dataForQuery = null;\n try {\n dataForQuery = await this.fetchCalendar(day, adults, children, infants, promoCode, roomCode, hotelID, memberNumber, parseErrors, false);\n } catch (ex) {\n console.log(ex);\n }\n\n if (!dataForQuery?.prices) {\n return null;\n }\n\n const priceForDay = dataForQuery.prices[day.format(API_DATE_FORMAT)];\n const arrivalMinNightStay = dataForQuery.arrivalMinNightStay[day.format(API_DATE_FORMAT)];\n const arrivalMaxNightStay = dataForQuery.arrivalMaxNightStay[day.format(API_DATE_FORMAT)];\n\n return {\n price: priceForDay,\n perCent: 0,\n arrivalMinNightStay,\n arrivalMaxNightStay,\n };\n };\n\n public fetchCalendar = async (\n month: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelId: string,\n memberNumber: number | string = '',\n parseErrors = true,\n isCrossSell = false\n ): Promise<{\n prices: IPriceByDay;\n arrivalMinNightStay: INightStayByDay;\n arrivalMaxNightStay: INightStayByDay;\n } | null> => {\n month = month ?? dayjs();\n\n let fromMonth = month.startOf('month');\n fromMonth = Number(fromMonth.format('M')) % 2 === 0 ? fromMonth.subtract(1, 'month') : (fromMonth = month);\n\n fromMonth = fromMonth.startOf('month');\n\n const now = dayjs();\n if (fromMonth.isBefore(now, 'date')) {\n fromMonth = now;\n }\n\n const toMonth = fromMonth.add(1, 'month').endOf('month');\n\n const fromDatePretty = fromMonth.format(API_DATE_FORMAT);\n const toDatePretty = toMonth.format(API_DATE_FORMAT);\n\n const targetHotel = hotelId;\n\n if (!targetHotel) {\n return null;\n }\n\n const id = this.getQueryID([targetHotel, fromDatePretty, toDatePretty, adults, children, infants, promoCode, roomCode, isCrossSell, memberNumber]);\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (this.calendar[id] && parseErrors) {\n if (this.calendarWarnings[id]) {\n BasketContextErrorHandler.handleAvailabilityWarnings(this.calendarWarnings[id]);\n } else {\n BasketContextErrorHandler.handlePromoSuccess(promoCode);\n }\n\n return {\n prices: this.calendar[id],\n arrivalMinNightStay: this.arrivalMinNightStay[id],\n arrivalMaxNightStay: this.arrivalMaxNightStay[id],\n };\n }\n\n if (!!this.calendarPromises[id]) {\n return this.calendarPromises[id];\n }\n\n this.calendarPromises[id] = new Promise(async (resolve, reject) => {\n const searchParams: AvailabilityParams = {\n checkInDate: fromDatePretty,\n checkOutDate: toDatePretty,\n adults: `${adults}`,\n children: `${children}`,\n infants: `${infants}`,\n promoCode: `${promoCode}`,\n includeHotelInfo: isCrossSell ? `0` : `1`,\n memberNumber: `${memberNumber}`,\n ...(roomCode ? { roomCode } : {}),\n };\n\n const queryParams = new URLSearchParams(searchParams);\n\n const apiPath = `${this.getApiPath()}availability/calendar/${targetHotel}?${queryParams.toString()}`;\n\n const response = await fetch(apiPath, {\n credentials: 'omit',\n headers: await BaseAPI.getBaseHeaders(),\n });\n\n if (response.ok) {\n const json = await response.json();\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (parseErrors) {\n if (json.warnings && json.warnings.length) {\n BasketContextErrorHandler.handleAvailabilityWarnings(json.warnings);\n this.calendarWarnings[id] = json.warnings;\n } else {\n BasketContextErrorHandler.handlePromoSuccess(promoCode);\n }\n }\n\n Object.values(json.prices).forEach((price: any) => {\n if (!AvailabilityAPI.minNightPrice || Number(price) < AvailabilityAPI.minNightPrice) {\n AvailabilityAPI.minNightPrice = Number(price);\n }\n\n if (AvailabilityAPI.maxNightPrice < Number(price)) {\n AvailabilityAPI.maxNightPrice = Number(price);\n }\n });\n\n if (hotelId) {\n this.crossSellHotelInfo[String(hotelId)] = json.hotel;\n }\n this.arrivalMinNightStay[id] = json?.arrivalMinNightStay ?? {};\n this.arrivalMaxNightStay[id] = json?.arrivalMaxNightStay ?? {};\n this.calendar[id] = json.prices;\n resolve({\n prices: this.calendar[id],\n arrivalMinNightStay: this.arrivalMinNightStay[id],\n arrivalMaxNightStay: this.arrivalMaxNightStay[id],\n });\n } else {\n reject(new GetAvailabilityError(fromMonth, toMonth));\n }\n });\n\n return this.calendarPromises[id];\n };\n\n public invalidateAvailability = async (basketRow: BasketRow, hotelId: string) => {\n const today = dayjs();\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCode();\n const roomCode = basketRow.getRoomCode();\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([hotelId, fromDate, toDate, adults, children, infants, promoCode, roomCode, RoomstayThemeEngine.selectedLang, oneNightStay]);\n delete this.cachedAvailability[id];\n };\n\n public fetchMinNightStayData = async (basketRow: BasketRow, hotelID: string, memberNumber?: string) => {\n // TODO: refactor this breakdown.\n\n if (!basketRow) {\n return;\n }\n\n if (!hotelID) {\n throw new NoHotelSelectedError();\n }\n\n const today = dayjs();\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCode();\n const roomCode = basketRow.getRoomCode();\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([hotelID, fromDate, toDate, adults, children, promoCode, roomCode, RoomstayThemeEngine.selectedLang, oneNightStay, memberNumber]);\n\n if (this.cachedMinNightStay[id]) {\n return this.cachedMinNightStay[id];\n }\n\n if (!!this.cachedMidNightStayPromises[id]) {\n return this.cachedMidNightStayPromises[id];\n }\n\n this.cachedMidNightStayPromises[id] = new Promise(async (resolve) => {\n const json = await this.get(\n APIEndpoint.MinNightStay,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n memberNumber,\n ...(roomCode ? { roomCode } : {}),\n },\n '',\n hotelID\n );\n\n delete this.cachedMidNightStayPromises[id];\n this.cachedMinNightStay[id] = json;\n\n resolve(this.cachedMinNightStay[id]);\n });\n\n return this.cachedMidNightStayPromises[id];\n };\n\n /**\n * Fetches availability data.\n *\n * @param basketRow - The basket row containing booking details.\n * @param hotelId - The unique identifier of the hotel.\n * @param memberNumber - (Optional) The membership number of the user.\n * @param ignoreRoomFilter - If true, skips sending the room code filter in the API request. Default: false.\n * @param eager - If true, returns alternative availability if selected dates are unavailable\n * @returns The fetched availability data.\n */\n public fetchAvailabilityData = async (basketRow: BasketRow, hotelId: string, memberNumber?: string, ignoreRoomFilter = false, eager = false) => {\n const today = dayjs();\n\n if (!basketRow) {\n return;\n }\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCodeStatus() === EPromoCodeStatus.Forbidden ? '' : basketRow.getPromoCode();\n const promoOnly = basketRow.getPromoOnly();\n const enableRoomCodeFilter = basketRow.getEnableRoomCodeFilter();\n // If ignoreRoomFilter true, skips sending the room code filter\n // Otherwise, if the the URL's room parameter is present, send the room code filter\n const roomCodeParam = ignoreRoomFilter ? '' : enableRoomCodeFilter ? basketRow.getRoomCode() : '';\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([hotelId, fromDate, toDate, adults, children, infants, promoCode, roomCodeParam, RoomstayThemeEngine.selectedLang, oneNightStay, memberNumber]);\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (this.cachedAvailability[id]) {\n if (this.availabilityWarnings[id]) {\n BasketContextErrorHandler.handleAvailabilityWarnings(this.availabilityWarnings[id]);\n } else {\n const promoCodeDetails = this.promoCodeDetails[promoCode];\n BasketContextErrorHandler.handlePromoSuccess(promoCode, promoCodeDetails?.oneTimeUseOnly);\n }\n\n return this.cachedAvailability[id];\n }\n\n if (!!this.fetchDataPromise[id]) {\n return this.fetchDataPromise[id];\n } else {\n this.fetchDataPromise[id] = new Promise<Room[]>(async (resolve, reject) => {\n try {\n const json: IAvailability = await this.get(\n APIEndpoint.Availability,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n promoOnly,\n memberNumber,\n ...(eager && { searchType: 'eager' }),\n ...(roomCodeParam ? { roomCode: roomCodeParam } : {}),\n },\n '',\n hotelId\n );\n\n this.fetchDataPromise[id] = null;\n\n if (eager && json.alternativeAvailability) {\n // There was no availability for the currently selected dates, but we eagerly searched and found alternative dates with availability.\n\n const roomArray = this.parseRoomsFromAvailability(json.alternativeAvailability.availability, oneNightStay);\n\n const checkInDate = json.alternativeAvailability.checkInDate;\n const checkOutDate = json.alternativeAvailability.checkOutDate;\n\n basketRow.setStartDate(dayjs(checkInDate));\n basketRow.setEndDate(dayjs(checkOutDate));\n\n resolve(roomArray);\n return;\n }\n\n const roomArray = this.parseRoomsFromAvailability(json, oneNightStay);\n\n this.cachedAvailability[id] = roomArray;\n resolve(roomArray);\n\n if (json.warnings?.length) {\n this.availabilityWarnings[id] = json.warnings.map((warning) => warning.message);\n BasketContextErrorHandler.handleAvailabilityWarnings(json.warnings);\n } else {\n if (json.promoCodeDetails) {\n this.promoCodeDetails[promoCode] = json.promoCodeDetails;\n }\n BasketContextErrorHandler.handlePromoSuccess(promoCode, json.promoCodeDetails?.oneTimeUseOnly);\n }\n\n resolve([]);\n } catch (ex) {\n reject();\n }\n }).catch((reason) => {\n throw new RoomstayError('Failed to load calendar availability');\n });\n\n return this.fetchDataPromise[id];\n }\n };\n\n // TODO: Add a type for the JSON response\n private parseRoomsFromAvailability(json: any, oneNightStay = false): Room[] {\n const dateToObject = (data: any) => {\n data.validUntil = dayjs(data.validUntil);\n data.cachedSince = dayjs(data.cachedSince);\n\n return data;\n };\n\n Object.keys(json.guaranteePolicies).map((code) => {\n if (json.guaranteePolicyDetails?.[code]?.depositMode) {\n AvailabilityAPI.policyMappings.guarantee[code] = json.guaranteePolicyDetails[code];\n } else {\n // For backward compatibility and SynXis\n AvailabilityAPI.policyMappings.guarantee[code] = {\n code,\n name: code,\n longDescription: json.guaranteePolicies[code],\n hide: false,\n depositMode: null,\n };\n }\n });\n\n if (json.cancelPolicies) {\n Object.keys(json.cancelPolicies).map((code) => {\n AvailabilityAPI.policyMappings.cancel[code] = json.cancelPolicies[code];\n });\n }\n\n const rooms: { [rate: string]: Room } = {};\n\n if (json.roomTypes) {\n const allRoomsByKey = Object.keys(json.roomTypes);\n if (allRoomsByKey.length) {\n this.roomTypesData = dateToObject(json.roomTypes);\n\n allRoomsByKey.forEach((roomCode: any) => {\n this.roomTypesData[roomCode].code = roomCode;\n this.rooms[roomCode] = Room.fromData(this.roomTypesData[roomCode]);\n this.rooms[roomCode].code = roomCode;\n rooms[roomCode] = this.rooms[roomCode];\n });\n }\n }\n\n if (json.ratePlans) {\n const allRatesByKey = Object.keys(json.ratePlans);\n if (allRatesByKey.length) {\n this.ratePlansData = dateToObject(json.ratePlans);\n\n allRatesByKey.forEach((rateCode: any) => {\n this.ratePlansData[rateCode].code = rateCode;\n\n this.rates[rateCode] = RoomRate.fromData(this.ratePlansData[rateCode]);\n });\n }\n }\n\n if (json.roomNights) {\n const roomNights = json.roomNights;\n\n const allNightsByKey = Object.keys(roomNights);\n\n let first = true;\n if (allNightsByKey.length) {\n allNightsByKey.forEach((date: string) => {\n const day = dayjs(date);\n Object.keys(roomNights[date]).forEach((roomCode: string) => {\n Object.keys(roomNights[date][roomCode].rates).forEach((rateKey) => {\n const nightData = roomNights[date][roomCode].rates[rateKey];\n\n if (first) {\n const rate = RoomRate.fromData(this.ratePlansData[rateKey]);\n rate.code = rateKey;\n rooms[roomCode].addRate(rate);\n }\n\n if (oneNightStay && Object.keys(rooms[roomCode]?.getRate(rateKey)?.nightRates ?? {}).length) {\n return;\n }\n\n const rateNight = new RoomRateNight();\n rateNight.available = roomNights[date][roomCode].available.toString();\n rateNight.cost = nightData.cost.toString();\n rateNight.discount = nightData.discount.toString();\n rateNight.total = nightData.total.toString();\n rateNight.tax = nightData.tax.toString();\n rateNight.fee = nightData.fee.toString();\n rateNight.date = day;\n\n if (nightData.fees) {\n for (const fee of nightData.fees) {\n rateNight.fees.push({ name: fee.name, amount: fee.amount });\n }\n }\n\n (rooms[roomCode].getRate(rateKey) as RoomRate).nightRates[date] = rateNight;\n });\n });\n\n first = false;\n });\n }\n\n return Object.values(rooms);\n }\n\n return [];\n }\n\n public fetchAvailability = async ({\n fromDate,\n toDate,\n adults,\n children,\n infants,\n promoCode,\n roomCode,\n promoOnly,\n hotelId,\n }: {\n fromDate: dayjs.Dayjs;\n toDate: dayjs.Dayjs;\n adults: number;\n children?: number;\n infants: number;\n promoCode?: string;\n roomCode?: string;\n promoOnly?: boolean;\n hotelId: string;\n }) => {\n if (!fromDate || !toDate) return;\n\n return await this.get(\n APIEndpoint.Availability,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n promoOnly,\n ...(roomCode ? { roomCode } : {}),\n },\n '',\n hotelId\n );\n };\n\n private getQueryID = (params: any[]) => {\n return params.map((param) => (param && param.format ? param.format(API_DATE_FORMAT) : param)).join('-');\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AvailabilityAPI.js","sourceRoot":"/","sources":["src/api/AvailabilityAPI.ts"],"names":[],"mappings":"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","sourcesContent":["import { EGuaranteePolicyDepositMode, IAvailability, IAvailabilityGuaranteePolicyDetails, IPromoCodeDetails } from '@roomstay/core';\nimport dayjs from 'dayjs';\nimport GetAvailabilityError from 'errors/GetAvailabilityError';\nimport { NoHotelSelectedError } from 'errors/NoHotelSelectedError';\nimport { RoomstayError } from 'errors/RoomstayError';\nimport { BasketContextErrorHandler } from 'handlers/BasketContextErrorHandler';\n\nimport BaseAPI, { API_DATE_FORMAT, APIEndpoint } from '@/api/BaseAPI';\nimport BasketRow, { EPromoCodeStatus } from '@/models/BasketRow';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomRateNight from '@/models/Room/RoomRateNight';\nimport RoomstayThemeEngine from '@/providers/RoomstayThemeEngine';\ninterface IPriceByDay {\n [date: string]: number;\n}\ninterface INightStayByDay {\n [date: string]: number;\n}\n\ntype AvailabilityParams = {\n checkInDate: string;\n checkOutDate: string;\n adults: string;\n children: string;\n infants: string;\n promoCode?: string;\n promoOnly?: string;\n roomCode?: string;\n memberNumber?: string;\n includeHotelInfo: string;\n};\n\ntype NullableAvailabilityGuaranteePolicyDetails = Omit<IAvailabilityGuaranteePolicyDetails, 'depositMode'> & {\n depositMode: EGuaranteePolicyDepositMode | null;\n};\n\nexport default class AvailabilityAPI extends BaseAPI {\n public static policyMappings: { guarantee: { [name: string]: NullableAvailabilityGuaranteePolicyDetails }; cancel: { [name: string]: string } } = { guarantee: {}, cancel: {} };\n public static maxNightPrice = 0;\n public static minNightPrice: number | null = null;\n private roomTypesData: any = null;\n private ratePlansData: any = null;\n private cachedMinNightStay: { [id: string]: any } = {};\n private cachedAvailability: { [id: string]: Room[] };\n private cachedHasMinStayUpsellOpportunities: { [id: string]: boolean } = {};\n private calendar: { [id: string]: IPriceByDay } = {};\n private arrivalMinNightStay: { [id: string]: INightStayByDay } = {};\n private arrivalMaxNightStay: { [id: string]: INightStayByDay } = {};\n private crossSellHotelInfo: { [hotelId: string]: any } = {};\n private calendarWarnings: { [id: string]: string[] } = {};\n private availabilityWarnings: { [id: string]: string[] } = {};\n private rooms: { [code: string]: Room };\n private rates: { [code: string]: RoomRate };\n private fetchDataPromise: { [dateRange: string]: Promise<Room[]> | null } = {};\n private calendarPromises: {\n [id: string]: Promise<{\n prices: IPriceByDay;\n arrivalMinNightStay: INightStayByDay;\n arrivalMaxNightStay: INightStayByDay;\n }>;\n } = {};\n private cachedMidNightStayPromises: { [id: string]: Promise<any> } = {};\n private promoCodeDetails: { [code: string]: IPromoCodeDetails } = {};\n\n public constructor() {\n super();\n\n this.rooms = {};\n this.rates = {};\n\n this.cachedAvailability = {};\n }\n\n public getCrossSellHotelInfo(hotelId: number | string) {\n return this.crossSellHotelInfo[String(hotelId)] ?? {};\n }\n\n public getCheapestPricePerDay = async (\n fromDate: dayjs.Dayjs,\n toDate: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelId: string,\n memberNumber: string | number = '',\n isCrossSell = false\n ): Promise<{ [date: string]: number }> => {\n let dayPricingData = null;\n if (fromDate === undefined) {\n return {};\n }\n\n try {\n const response = await this.fetchCalendar(fromDate, adults, children, infants, promoCode, roomCode, hotelId, memberNumber, undefined, isCrossSell);\n dayPricingData = response?.prices;\n } catch (ex) {\n if (!(ex instanceof GetAvailabilityError)) {\n throw ex;\n } else {\n return {};\n }\n }\n\n if (!dayPricingData) {\n return {};\n }\n\n const daysBetween = toDate.diff(fromDate, 'day');\n const prices: any = {};\n\n for (let i = 0; i <= daysBetween; i++) {\n const currentDay = fromDate.add(i, 'day');\n prices[currentDay.format(API_DATE_FORMAT)] = dayPricingData[currentDay.format(API_DATE_FORMAT)];\n }\n\n return prices;\n };\n\n public getCheapestPriceForDay = async (\n day: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelID: string,\n memberNumber: string | number = '',\n parseErrors = true\n ): Promise<{\n price: number;\n perCent: number;\n arrivalMinNightStay: number;\n arrivalMaxNightStay: number;\n } | null> => {\n if (!day || day.isBefore(dayjs(), 'date')) return null;\n\n let dataForQuery = null;\n try {\n dataForQuery = await this.fetchCalendar(day, adults, children, infants, promoCode, roomCode, hotelID, memberNumber, parseErrors, false);\n } catch (ex) {\n console.log(ex);\n }\n\n if (!dataForQuery?.prices) {\n return null;\n }\n\n const priceForDay = dataForQuery.prices[day.format(API_DATE_FORMAT)];\n const arrivalMinNightStay = dataForQuery.arrivalMinNightStay[day.format(API_DATE_FORMAT)];\n const arrivalMaxNightStay = dataForQuery.arrivalMaxNightStay[day.format(API_DATE_FORMAT)];\n\n return {\n price: priceForDay,\n perCent: 0,\n arrivalMinNightStay,\n arrivalMaxNightStay,\n };\n };\n\n public fetchCalendar = async (\n month: dayjs.Dayjs,\n adults: number,\n children: number,\n infants: number,\n promoCode: string,\n roomCode: string,\n hotelId: string,\n memberNumber: number | string = '',\n parseErrors = true,\n isCrossSell = false\n ): Promise<{\n prices: IPriceByDay;\n arrivalMinNightStay: INightStayByDay;\n arrivalMaxNightStay: INightStayByDay;\n } | null> => {\n month = month ?? dayjs();\n\n let fromMonth = month.startOf('month');\n fromMonth = Number(fromMonth.format('M')) % 2 === 0 ? fromMonth.subtract(1, 'month') : (fromMonth = month);\n\n fromMonth = fromMonth.startOf('month');\n\n const now = dayjs();\n if (fromMonth.isBefore(now, 'date')) {\n fromMonth = now;\n }\n\n const toMonth = fromMonth.add(1, 'month').endOf('month');\n\n const fromDatePretty = fromMonth.format(API_DATE_FORMAT);\n const toDatePretty = toMonth.format(API_DATE_FORMAT);\n\n const targetHotel = hotelId;\n\n if (!targetHotel) {\n return null;\n }\n\n const id = this.getQueryID([targetHotel, fromDatePretty, toDatePretty, adults, children, infants, promoCode, roomCode, isCrossSell, memberNumber]);\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (this.calendar[id] && parseErrors) {\n if (this.calendarWarnings[id]) {\n BasketContextErrorHandler.handleAvailabilityWarnings(this.calendarWarnings[id]);\n } else {\n BasketContextErrorHandler.handlePromoSuccess(promoCode);\n }\n\n return {\n prices: this.calendar[id],\n arrivalMinNightStay: this.arrivalMinNightStay[id],\n arrivalMaxNightStay: this.arrivalMaxNightStay[id],\n };\n }\n\n if (!!this.calendarPromises[id]) {\n return this.calendarPromises[id];\n }\n\n this.calendarPromises[id] = new Promise(async (resolve, reject) => {\n const searchParams: AvailabilityParams = {\n checkInDate: fromDatePretty,\n checkOutDate: toDatePretty,\n adults: `${adults}`,\n children: `${children}`,\n infants: `${infants}`,\n promoCode: `${promoCode}`,\n includeHotelInfo: isCrossSell ? `0` : `1`,\n memberNumber: `${memberNumber}`,\n ...(roomCode ? { roomCode } : {}),\n };\n\n const queryParams = new URLSearchParams(searchParams);\n\n const apiPath = `${this.getApiPath()}availability/calendar/${targetHotel}?${queryParams.toString()}`;\n\n const response = await fetch(apiPath, {\n credentials: 'omit',\n headers: await BaseAPI.getBaseHeaders(),\n });\n\n if (response.ok) {\n const json = await response.json();\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (parseErrors) {\n if (json.warnings && json.warnings.length) {\n BasketContextErrorHandler.handleAvailabilityWarnings(json.warnings);\n this.calendarWarnings[id] = json.warnings;\n } else {\n BasketContextErrorHandler.handlePromoSuccess(promoCode);\n }\n }\n\n Object.values(json.prices).forEach((price: any) => {\n if (!AvailabilityAPI.minNightPrice || Number(price) < AvailabilityAPI.minNightPrice) {\n AvailabilityAPI.minNightPrice = Number(price);\n }\n\n if (AvailabilityAPI.maxNightPrice < Number(price)) {\n AvailabilityAPI.maxNightPrice = Number(price);\n }\n });\n\n if (hotelId) {\n this.crossSellHotelInfo[String(hotelId)] = json.hotel;\n }\n this.arrivalMinNightStay[id] = json?.arrivalMinNightStay ?? {};\n this.arrivalMaxNightStay[id] = json?.arrivalMaxNightStay ?? {};\n this.calendar[id] = json.prices;\n resolve({\n prices: this.calendar[id],\n arrivalMinNightStay: this.arrivalMinNightStay[id],\n arrivalMaxNightStay: this.arrivalMaxNightStay[id],\n });\n } else {\n reject(new GetAvailabilityError(fromMonth, toMonth));\n }\n });\n\n return this.calendarPromises[id];\n };\n\n public invalidateAvailability = async (basketRow: BasketRow, hotelId: string) => {\n const today = dayjs();\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCode();\n const roomCode = basketRow.getRoomCode();\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([hotelId, fromDate, toDate, adults, children, infants, promoCode, roomCode, RoomstayThemeEngine.selectedLang, oneNightStay]);\n delete this.cachedAvailability[id];\n };\n\n public fetchMinNightStayData = async (basketRow: BasketRow, hotelID: string, memberNumber?: string) => {\n // TODO: refactor this breakdown.\n\n if (!basketRow) {\n return;\n }\n\n if (!hotelID) {\n throw new NoHotelSelectedError();\n }\n\n const today = dayjs();\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCode();\n const roomCode = basketRow.getRoomCode();\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([hotelID, fromDate, toDate, adults, children, promoCode, roomCode, RoomstayThemeEngine.selectedLang, oneNightStay, memberNumber]);\n\n if (this.cachedMinNightStay[id]) {\n return this.cachedMinNightStay[id];\n }\n\n if (!!this.cachedMidNightStayPromises[id]) {\n return this.cachedMidNightStayPromises[id];\n }\n\n this.cachedMidNightStayPromises[id] = new Promise(async (resolve) => {\n const json = await this.get(\n APIEndpoint.MinNightStay,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n memberNumber,\n ...(roomCode ? { roomCode } : {}),\n },\n '',\n hotelID\n );\n\n delete this.cachedMidNightStayPromises[id];\n this.cachedMinNightStay[id] = json;\n\n resolve(this.cachedMinNightStay[id]);\n });\n\n return this.cachedMidNightStayPromises[id];\n };\n\n /**\n * Check if minimum stay upsell opportunities exist.\n */\n public hasMinStayUpsellOpportunities(basketRow: BasketRow, hotelId: string, memberNumber?: string): boolean {\n const params = this.getQueryIDParams(basketRow, hotelId, memberNumber);\n const id = this.getQueryID(params);\n\n return this.cachedHasMinStayUpsellOpportunities[id] || false;\n }\n\n /**\n * Fetches availability data with minimum stay extensions.\n * This is used for finding upsell opportunities that require extending the stay.\n */\n public fetchMinimumStayExtensions = async (basketRow: BasketRow, hotelId: string, memberNumber?: string) => {\n return this.fetchAvailabilityData(basketRow, hotelId, memberNumber, false, false, true);\n };\n\n /**\n * Fetches availability data.\n *\n * @param basketRow - The basket row containing booking details.\n * @param hotelId - The unique identifier of the hotel.\n * @param memberNumber - (Optional) The membership number of the user.\n * @param ignoreRoomFilter - If true, skips sending the room code filter in the API request. Default: false.\n * @param eager - If true, returns alternative availability if selected dates are unavailable\n * @param findMinStayExtensions - If true, returns availability for extended dates to meet minimum stay requirements. Default: false.\n * @returns The fetched availability data.\n */\n public fetchAvailabilityData = async (basketRow: BasketRow, hotelId: string, memberNumber?: string, ignoreRoomFilter = false, eager = false, findMinStayExtensions = false) => {\n const today = dayjs();\n\n if (!basketRow) {\n return;\n }\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCodeStatus() === EPromoCodeStatus.Forbidden ? '' : basketRow.getPromoCode();\n const promoOnly = basketRow.getPromoOnly();\n const enableRoomCodeFilter = basketRow.getEnableRoomCodeFilter();\n // If ignoreRoomFilter true, skips sending the room code filter\n // Otherwise, if the the URL's room parameter is present, send the room code filter\n const roomCodeParam = ignoreRoomFilter ? '' : enableRoomCodeFilter ? basketRow.getRoomCode() : '';\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n const id = this.getQueryID([\n hotelId,\n fromDate,\n toDate,\n adults,\n children,\n infants,\n promoCode,\n roomCodeParam,\n RoomstayThemeEngine.selectedLang,\n oneNightStay,\n memberNumber,\n findMinStayExtensions,\n ]);\n\n // Don't parse warnings when we're making a cross-hotel availability request\n if (this.cachedAvailability[id]) {\n if (this.availabilityWarnings[id]) {\n BasketContextErrorHandler.handleAvailabilityWarnings(this.availabilityWarnings[id]);\n } else {\n const promoCodeDetails = this.promoCodeDetails[promoCode];\n BasketContextErrorHandler.handlePromoSuccess(promoCode, promoCodeDetails?.oneTimeUseOnly);\n }\n\n return this.cachedAvailability[id];\n }\n\n if (!!this.fetchDataPromise[id]) {\n return this.fetchDataPromise[id];\n } else {\n this.fetchDataPromise[id] = new Promise<Room[]>(async (resolve, reject) => {\n try {\n const json: IAvailability = await this.get(\n APIEndpoint.Availability,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n promoOnly,\n memberNumber,\n ...(eager && { searchType: 'eager' }),\n ...(roomCodeParam ? { roomCode: roomCodeParam } : {}),\n ...(findMinStayExtensions ? { findMinStayExtensions: 'true' } : {}),\n },\n '',\n hotelId\n );\n\n this.fetchDataPromise[id] = null;\n\n if (eager && json.alternativeAvailability) {\n // There was no availability for the currently selected dates, but we eagerly searched and found alternative dates with availability.\n\n const roomArray = this.parseRoomsFromAvailability(json.alternativeAvailability.availability, oneNightStay);\n\n const checkInDate = json.alternativeAvailability.checkInDate;\n const checkOutDate = json.alternativeAvailability.checkOutDate;\n\n basketRow.setStartDate(dayjs(checkInDate));\n basketRow.setEndDate(dayjs(checkOutDate));\n\n resolve(roomArray);\n return;\n }\n\n const roomArray = this.parseRoomsFromAvailability(json, oneNightStay);\n\n this.cachedAvailability[id] = roomArray;\n this.cachedHasMinStayUpsellOpportunities[id] = json.hasMinStayUpsellOpportunities || false;\n\n resolve(roomArray);\n\n if (json.warnings?.length) {\n this.availabilityWarnings[id] = json.warnings.map((warning) => warning.message);\n BasketContextErrorHandler.handleAvailabilityWarnings(json.warnings);\n } else {\n if (json.promoCodeDetails) {\n this.promoCodeDetails[promoCode] = json.promoCodeDetails;\n }\n BasketContextErrorHandler.handlePromoSuccess(promoCode, json.promoCodeDetails?.oneTimeUseOnly);\n }\n\n resolve([]);\n } catch (ex) {\n reject();\n }\n }).catch((reason) => {\n throw new RoomstayError('Failed to load calendar availability');\n });\n\n return this.fetchDataPromise[id];\n }\n };\n\n // TODO: Add a type for the JSON response\n private parseRoomsFromAvailability(json: any, oneNightStay = false): Room[] {\n const dateToObject = (data: any) => {\n data.validUntil = dayjs(data.validUntil);\n data.cachedSince = dayjs(data.cachedSince);\n\n return data;\n };\n\n Object.keys(json.guaranteePolicies).map((code) => {\n if (json.guaranteePolicyDetails?.[code]?.depositMode) {\n AvailabilityAPI.policyMappings.guarantee[code] = json.guaranteePolicyDetails[code];\n } else {\n // For backward compatibility and SynXis\n AvailabilityAPI.policyMappings.guarantee[code] = {\n code,\n name: code,\n longDescription: json.guaranteePolicies[code],\n hide: false,\n depositMode: null,\n };\n }\n });\n\n if (json.cancelPolicies) {\n Object.keys(json.cancelPolicies).map((code) => {\n AvailabilityAPI.policyMappings.cancel[code] = json.cancelPolicies[code];\n });\n }\n\n const rooms: { [rate: string]: Room } = {};\n\n if (json.roomTypes) {\n const allRoomsByKey = Object.keys(json.roomTypes);\n if (allRoomsByKey.length) {\n this.roomTypesData = dateToObject(json.roomTypes);\n\n allRoomsByKey.forEach((roomCode: any) => {\n this.roomTypesData[roomCode].code = roomCode;\n this.rooms[roomCode] = Room.fromData(this.roomTypesData[roomCode]);\n this.rooms[roomCode].code = roomCode;\n rooms[roomCode] = this.rooms[roomCode];\n });\n }\n }\n\n if (json.ratePlans) {\n const allRatesByKey = Object.keys(json.ratePlans);\n if (allRatesByKey.length) {\n this.ratePlansData = dateToObject(json.ratePlans);\n\n allRatesByKey.forEach((rateCode: any) => {\n this.ratePlansData[rateCode].code = rateCode;\n\n this.rates[rateCode] = RoomRate.fromData(this.ratePlansData[rateCode]);\n });\n }\n }\n\n if (json.roomNights) {\n const roomNights = json.roomNights;\n\n const allNightsByKey = Object.keys(roomNights);\n\n let first = true;\n if (allNightsByKey.length) {\n allNightsByKey.forEach((date: string) => {\n const day = dayjs(date);\n Object.keys(roomNights[date]).forEach((roomCode: string) => {\n Object.keys(roomNights[date][roomCode].rates).forEach((rateKey) => {\n const nightData = roomNights[date][roomCode].rates[rateKey];\n\n if (first) {\n const rate = RoomRate.fromData(this.ratePlansData[rateKey]);\n rate.code = rateKey;\n rooms[roomCode].addRate(rate);\n }\n\n if (oneNightStay && Object.keys(rooms[roomCode]?.getRate(rateKey)?.nightRates ?? {}).length) {\n return;\n }\n\n const rateNight = new RoomRateNight();\n rateNight.available = roomNights[date][roomCode].available.toString();\n rateNight.cost = nightData.cost.toString();\n rateNight.discount = nightData.discount.toString();\n rateNight.total = nightData.total.toString();\n rateNight.tax = nightData.tax.toString();\n rateNight.fee = nightData.fee.toString();\n rateNight.date = day;\n\n if (nightData.fees) {\n for (const fee of nightData.fees) {\n rateNight.fees.push({ name: fee.name, amount: fee.amount });\n }\n }\n\n (rooms[roomCode].getRate(rateKey) as RoomRate).nightRates[date] = rateNight;\n });\n });\n\n first = false;\n });\n }\n\n return Object.values(rooms);\n }\n\n return [];\n }\n\n public fetchAvailability = async ({\n fromDate,\n toDate,\n adults,\n children,\n infants,\n promoCode,\n roomCode,\n promoOnly,\n hotelId,\n }: {\n fromDate: dayjs.Dayjs;\n toDate: dayjs.Dayjs;\n adults: number;\n children?: number;\n infants: number;\n promoCode?: string;\n roomCode?: string;\n promoOnly?: boolean;\n hotelId: string;\n }) => {\n if (!fromDate || !toDate) return;\n\n return await this.get(\n APIEndpoint.Availability,\n {\n checkInDate: fromDate,\n checkOutDate: toDate,\n\n adults,\n children,\n infants,\n promoCode,\n promoOnly,\n ...(roomCode ? { roomCode } : {}),\n },\n '',\n hotelId\n );\n };\n\n /**\n * TODO: This logic is repeated multiple times throughout this file, we should try and refactor parts of this file to use this function.\n */\n private getQueryIDParams(basketRow: BasketRow, hotelId: string, memberNumber?: string, ignoreRoomFilter = false, findMinStayExtensions = false) {\n const today = dayjs();\n\n const adults = basketRow.getAdults();\n const children = basketRow.getChildren();\n const infants = basketRow.getInfants();\n const promoCode = basketRow.getPromoCode();\n const enableRoomCodeFilter = basketRow.getEnableRoomCodeFilter();\n const roomCodeParam = ignoreRoomFilter ? '' : enableRoomCodeFilter ? basketRow.getRoomCode() : '';\n\n let toDate = basketRow.getEndDate();\n const fromDate = basketRow.getStartDate()?.isBefore(today, 'day') ? today : basketRow.getStartDate();\n\n let oneNightStay = false;\n if (fromDate.isSameOrAfter(toDate, 'date')) {\n oneNightStay = true;\n toDate = fromDate.add(1, 'day');\n }\n\n return [\n hotelId,\n fromDate,\n toDate,\n adults,\n children,\n infants,\n promoCode,\n roomCodeParam,\n RoomstayThemeEngine.selectedLang,\n oneNightStay,\n memberNumber,\n findMinStayExtensions,\n ];\n }\n\n private getQueryID = (params: any[]) => {\n return params.map((param) => (param && param.format ? param.format(API_DATE_FORMAT) : param)).join('-');\n };\n}\n"]}
|
package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js
CHANGED
|
@@ -52,6 +52,7 @@ const EnhancedPhoneNumberField = (props, ref) => {
|
|
|
52
52
|
const { onDropdownClosed, onItemSelected, onTriggerClicked, isDropdownOpen, isFocused } = (0, AutoFocusOnSelect_1.useAutoFocusOnSelect)({
|
|
53
53
|
ref: innerRef.current,
|
|
54
54
|
onlyAutoOpenWhenInputEmpty: true,
|
|
55
|
+
disableOpenOnFocus: true,
|
|
55
56
|
});
|
|
56
57
|
const { t } = (0, react_i18next_1.useTranslation)();
|
|
57
58
|
const organizedCountries = (0, react_1.useMemo)(() => {
|
package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnhancedPhoneNumberField.js","sourceRoot":"/","sources":["src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.tsx"],"names":[],"mappings":"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","sourcesContent":["import './EnhancedPhoneNumberField.global.scss';\n\nimport classNames from 'classnames';\nimport React, { ChangeEvent, ForwardRefRenderFunction, PropsWithChildren, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport { useAutoFocusOnSelect } from '@/hooks/AutoFocusOnSelect';\nimport { convertCountryCodeToFlag, CountryType, ListOfCountriesAndCodes } from '@/models/CountryCodesAndNumbers';\n\nimport { Select } from '../../Select/Select';\n\nexport interface EnhancedPhoneNumberField extends PropsWithChildren<any> {\n validationStatus?: 'success' | 'error';\n name?: string;\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n}\n\nconst PHONE_AND_PREFIX_SPLIT = ' ';\n\nconst EnhancedPhoneNumberField: ForwardRefRenderFunction<HTMLInputElement, EnhancedPhoneNumberField> = (props, ref) => {\n const innerRef = useRef<HTMLInputElement>(null);\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(ref, () => innerRef.current);\n const { onDropdownClosed, onItemSelected, onTriggerClicked, isDropdownOpen, isFocused } = useAutoFocusOnSelect({\n ref: innerRef.current,\n onlyAutoOpenWhenInputEmpty: true,\n });\n\n const { t } = useTranslation();\n\n const organizedCountries: CountryType[] = useMemo(() => {\n return ListOfCountriesAndCodes.sort((a, b) => {\n return `${(a.suggested ? '000' : '') + a.label}`.localeCompare(`${(b.suggested ? '000' : '') + b.label}`);\n });\n }, [ListOfCountriesAndCodes]);\n\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n\n const { validationStatus, name, onChange, value } = props;\n\n const [selectedCountry, subscriberCode] = useMemo(() => {\n const [prefix, number] = value?.split(PHONE_AND_PREFIX_SPLIT) ?? [];\n\n if (prefix) {\n const selectedCountry = organizedCountries.find(({ phone }) => prefix === phone) || organizedCountries[0];\n return [selectedCountry, number];\n }\n\n return [organizedCountries[0], ''];\n }, [value]);\n\n const getOption = (key: CountryType['code']): CountryType => {\n return organizedCountries.find(({ code }) => code === key) as CountryType;\n };\n\n const raiseOnChangeEvent = (prefix?: CountryType, suffix?: string) => {\n let newSuffix = suffix ?? subscriberCode;\n\n if (newSuffix.startsWith('0')) {\n newSuffix = newSuffix.substring(1);\n }\n\n const newValue = `${prefix?.phone ?? selectedCountry.phone}${PHONE_AND_PREFIX_SPLIT}${newSuffix}`;\n\n if (value != newValue) {\n onChange?.({ target: { name, value: newValue } } as any);\n }\n };\n\n const onInputChanged = (e: ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n raiseOnChangeEvent(undefined, value);\n };\n\n const onPrefixChanged = (selectedCountry: CountryType) => {\n onItemSelected();\n raiseOnChangeEvent(selectedCountry, undefined);\n };\n\n const fieldClasses = classNames('rs-enhanced-phone-field', {\n [`--${validationStatus}`]: !!validationStatus,\n '--focused': isFocused,\n '--disabled': props.disabled,\n });\n const onCountryClick = (country: CountryType) => {\n onPrefixChanged(country);\n return;\n };\n\n return (\n <div className={fieldClasses}>\n <div className=\"rs-enhanced-phone-field--country\" onClick={onTriggerClicked}>\n <div className=\"rs-enhanced-phone-field--country-icon\">{convertCountryCodeToFlag(selectedCountry.code)}</div>\n <Icon icon={IconType.Dropdown} />\n </div>\n <div className=\"rs-enhanced-phone-field--number\">\n <span className=\"rs-enhanced-phone-field--number-prefix\">+{selectedCountry.phone}</span>\n <input\n disabled={props.disabled}\n ref={innerRef}\n placeholder={t(Translation.Step.Confirmation.Inputs.Phone) + ' *'}\n type=\"number\"\n style={{ paddingLeft: selectedCountry.phone.length * 8 + 20 + 'px' }}\n onChange={onInputChanged}\n value={subscriberCode}\n />\n\n <div className=\"rs-enhanced-phone-field--number-status\"></div>\n </div>\n <div className=\"rs-enhanced-phone-field--anchor\" ref={setContainer}></div>\n <Select<CountryType, 'code'>\n open={isDropdownOpen}\n onClose={onDropdownClosed}\n target={container}\n options={organizedCountries}\n value={selectedCountry.code}\n onChange={(value) => onCountryClick(getOption(value))}\n labelName=\"code\"\n keyName=\"code\"\n renderOption={(country) => (\n <div className=\"rs-enhanced-phone-field--suggest-list-country\">\n <div className=\"rs-enhanced-phone-field--suggest-list-country-icon\">{convertCountryCodeToFlag(country?.code as string)}</div>\n <div className=\"rs-enhanced-phone-field--suggest-list-country-name\">\n {country?.label} <span>+{country?.phone}</span>\n </div>\n </div>\n )}\n />\n </div>\n );\n};\n\nexport default React.forwardRef<HTMLInputElement, React.PropsWithChildren<EnhancedPhoneNumberField>>(EnhancedPhoneNumberField);\n"]}
|
|
1
|
+
{"version":3,"file":"EnhancedPhoneNumberField.js","sourceRoot":"/","sources":["src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.tsx"],"names":[],"mappings":"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","sourcesContent":["import './EnhancedPhoneNumberField.global.scss';\n\nimport classNames from 'classnames';\nimport React, { ChangeEvent, ForwardRefRenderFunction, PropsWithChildren, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport { useAutoFocusOnSelect } from '@/hooks/AutoFocusOnSelect';\nimport { convertCountryCodeToFlag, CountryType, ListOfCountriesAndCodes } from '@/models/CountryCodesAndNumbers';\n\nimport { Select } from '../../Select/Select';\n\nexport interface EnhancedPhoneNumberField extends PropsWithChildren<any> {\n validationStatus?: 'success' | 'error';\n name?: string;\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n disabled?: boolean;\n}\n\nconst PHONE_AND_PREFIX_SPLIT = ' ';\n\nconst EnhancedPhoneNumberField: ForwardRefRenderFunction<HTMLInputElement, EnhancedPhoneNumberField> = (props, ref) => {\n const innerRef = useRef<HTMLInputElement>(null);\n useImperativeHandle<HTMLInputElement | null, HTMLInputElement | null>(ref, () => innerRef.current);\n const { onDropdownClosed, onItemSelected, onTriggerClicked, isDropdownOpen, isFocused } = useAutoFocusOnSelect({\n ref: innerRef.current,\n onlyAutoOpenWhenInputEmpty: true,\n disableOpenOnFocus: true,\n });\n\n const { t } = useTranslation();\n\n const organizedCountries: CountryType[] = useMemo(() => {\n return ListOfCountriesAndCodes.sort((a, b) => {\n return `${(a.suggested ? '000' : '') + a.label}`.localeCompare(`${(b.suggested ? '000' : '') + b.label}`);\n });\n }, [ListOfCountriesAndCodes]);\n\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n\n const { validationStatus, name, onChange, value } = props;\n\n const [selectedCountry, subscriberCode] = useMemo(() => {\n const [prefix, number] = value?.split(PHONE_AND_PREFIX_SPLIT) ?? [];\n\n if (prefix) {\n const selectedCountry = organizedCountries.find(({ phone }) => prefix === phone) || organizedCountries[0];\n return [selectedCountry, number];\n }\n\n return [organizedCountries[0], ''];\n }, [value]);\n\n const getOption = (key: CountryType['code']): CountryType => {\n return organizedCountries.find(({ code }) => code === key) as CountryType;\n };\n\n const raiseOnChangeEvent = (prefix?: CountryType, suffix?: string) => {\n let newSuffix = suffix ?? subscriberCode;\n\n if (newSuffix.startsWith('0')) {\n newSuffix = newSuffix.substring(1);\n }\n\n const newValue = `${prefix?.phone ?? selectedCountry.phone}${PHONE_AND_PREFIX_SPLIT}${newSuffix}`;\n\n if (value != newValue) {\n onChange?.({ target: { name, value: newValue } } as any);\n }\n };\n\n const onInputChanged = (e: ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n raiseOnChangeEvent(undefined, value);\n };\n\n const onPrefixChanged = (selectedCountry: CountryType) => {\n onItemSelected();\n raiseOnChangeEvent(selectedCountry, undefined);\n };\n\n const fieldClasses = classNames('rs-enhanced-phone-field', {\n [`--${validationStatus}`]: !!validationStatus,\n '--focused': isFocused,\n '--disabled': props.disabled,\n });\n const onCountryClick = (country: CountryType) => {\n onPrefixChanged(country);\n return;\n };\n\n return (\n <div className={fieldClasses}>\n <div className=\"rs-enhanced-phone-field--country\" onClick={onTriggerClicked}>\n <div className=\"rs-enhanced-phone-field--country-icon\">{convertCountryCodeToFlag(selectedCountry.code)}</div>\n <Icon icon={IconType.Dropdown} />\n </div>\n <div className=\"rs-enhanced-phone-field--number\">\n <span className=\"rs-enhanced-phone-field--number-prefix\">+{selectedCountry.phone}</span>\n <input\n disabled={props.disabled}\n ref={innerRef}\n placeholder={t(Translation.Step.Confirmation.Inputs.Phone) + ' *'}\n type=\"number\"\n style={{ paddingLeft: selectedCountry.phone.length * 8 + 20 + 'px' }}\n onChange={onInputChanged}\n value={subscriberCode}\n />\n\n <div className=\"rs-enhanced-phone-field--number-status\"></div>\n </div>\n <div className=\"rs-enhanced-phone-field--anchor\" ref={setContainer}></div>\n <Select<CountryType, 'code'>\n open={isDropdownOpen}\n onClose={onDropdownClosed}\n target={container}\n options={organizedCountries}\n value={selectedCountry.code}\n onChange={(value) => onCountryClick(getOption(value))}\n labelName=\"code\"\n keyName=\"code\"\n renderOption={(country) => (\n <div className=\"rs-enhanced-phone-field--suggest-list-country\">\n <div className=\"rs-enhanced-phone-field--suggest-list-country-icon\">{convertCountryCodeToFlag(country?.code as string)}</div>\n <div className=\"rs-enhanced-phone-field--suggest-list-country-name\">\n {country?.label} <span>+{country?.phone}</span>\n </div>\n </div>\n )}\n />\n </div>\n );\n};\n\nexport default React.forwardRef<HTMLInputElement, React.PropsWithChildren<EnhancedPhoneNumberField>>(EnhancedPhoneNumberField);\n"]}
|