@roomstay/frontend 1.5.8 → 1.6.0-1
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/661.bundle.js +1 -1
- package/dist/main.bundle.js +1 -1
- package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js +13 -10
- package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js.map +1 -1
- package/dist/src/components/steps/room/RoomList.js +1 -1
- package/dist/src/components/steps/room/RoomList.js.map +1 -1
- package/dist/src/components/steps/room/roomDetails/roomRates/MembersOnlyRow.js.map +1 -1
- package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.d.ts +7 -0
- package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.js +30 -0
- package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.js.map +1 -0
- package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js +5 -1
- package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextType.d.ts +2 -0
- package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js +12 -8
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextType.type.d.ts +3 -1
- package/dist/src/contexts/CompanyContext/CompanyContextType.type.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +9 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
- package/dist/src/events/RoomstayEventManager.d.ts +1 -1
- package/dist/src/events/RoomstayEventManager.js +23 -4
- package/dist/src/events/RoomstayEventManager.js.map +1 -1
- package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.d.ts +7 -0
- package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.js +15 -0
- package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.js.map +1 -0
- package/dist/src/events/actions/Promotion/PromotionAddedEvent.d.ts +7 -0
- package/dist/src/events/actions/Promotion/PromotionAddedEvent.js +15 -0
- package/dist/src/events/actions/Promotion/PromotionAddedEvent.js.map +1 -0
- package/dist/src/events/actions/Promotion/PromotionClickedEvent.d.ts +7 -0
- package/dist/src/events/actions/Promotion/PromotionClickedEvent.js +15 -0
- package/dist/src/events/actions/Promotion/PromotionClickedEvent.js.map +1 -0
- package/dist/src/events/actions/Promotion/PromotionRemovedEvent.d.ts +7 -0
- package/dist/src/events/actions/Promotion/PromotionRemovedEvent.js +15 -0
- package/dist/src/events/actions/Promotion/PromotionRemovedEvent.js.map +1 -0
- package/dist/src/events/index.d.ts +1 -0
- package/dist/src/events/index.js +1 -0
- package/dist/src/events/index.js.map +1 -1
- package/dist/src/hooks/EventHook.d.ts +1 -1
- package/dist/src/hooks/EventHook.js +2 -2
- package/dist/src/hooks/EventHook.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/Promotion/IPromotion.type.d.ts +26 -0
- package/dist/src/models/Promotion/IPromotion.type.js +3 -0
- package/dist/src/models/Promotion/IPromotion.type.js.map +1 -0
- package/dist/src/providers/PromotionProvider.d.ts +14 -0
- package/dist/src/providers/PromotionProvider.js +210 -0
- package/dist/src/providers/PromotionProvider.js.map +1 -0
- package/dist/test.bundle.js +1 -1
- package/dist/tests/offline/entry/RSCompany.js +39 -0
- package/dist/tests/offline/entry/RSCompany.js.map +1 -1
- package/dist/vendors.bundle.js +1 -1
- package/package.json +1 -1
package/dist/src/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export * from './providers/CurrencyProvider';
|
|
|
34
34
|
export { default as CurrencyProvider } from './providers/CurrencyProvider';
|
|
35
35
|
export { default as FeatureProvider } from './providers/FeatureProvider';
|
|
36
36
|
export { default as RatePillProvider } from './providers/RatePillProvider';
|
|
37
|
+
export * from './providers/PromotionProvider';
|
|
37
38
|
export { default as ConfirmationVerifyFeature } from './providers/feature/ConfirmationVerifyFeature';
|
|
38
39
|
export { default as DatePickerTypeFeature } from './providers/feature/DatePickerTypeFeature';
|
|
39
40
|
export { default as FeaturedPromoFeature } from './providers/feature/FeaturedPromoFeature';
|
|
@@ -69,7 +70,7 @@ export * from './hooks/EventHook';
|
|
|
69
70
|
/** @deprecated use `roomstay.events` instead */
|
|
70
71
|
export { default as RoomstayEventManager } from './events/RoomstayEventManager';
|
|
71
72
|
export declare const events: {
|
|
72
|
-
on: (eventType: string | import("./events/RoomstayEvent").RoomstayEvent, callback: import("./events/RoomstayEventManager").RoomstayEventCallback) => boolean;
|
|
73
|
+
on: (eventType: string | import("./events/RoomstayEvent").RoomstayEvent, callback: import("./events/RoomstayEventManager").RoomstayEventCallback, id?: string) => boolean;
|
|
73
74
|
raise: (event: import("./events/RoomstayEvent").RoomstayEvent) => Promise<void>;
|
|
74
75
|
};
|
|
75
76
|
export * from './events/index';
|
package/dist/src/index.js
CHANGED
|
@@ -80,6 +80,7 @@ var FeatureProvider_1 = require("./providers/FeatureProvider");
|
|
|
80
80
|
Object.defineProperty(exports, "FeatureProvider", { enumerable: true, get: function () { return FeatureProvider_1.default; } });
|
|
81
81
|
var RatePillProvider_1 = require("./providers/RatePillProvider");
|
|
82
82
|
Object.defineProperty(exports, "RatePillProvider", { enumerable: true, get: function () { return RatePillProvider_1.default; } });
|
|
83
|
+
__exportStar(require("./providers/PromotionProvider"), exports);
|
|
83
84
|
// Features
|
|
84
85
|
var ConfirmationVerifyFeature_1 = require("./providers/feature/ConfirmationVerifyFeature");
|
|
85
86
|
Object.defineProperty(exports, "ConfirmationVerifyFeature", { enumerable: true, get: function () { return ConfirmationVerifyFeature_1.default; } });
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,sFAA+E;AAC/E,8DAAuD;AACvD,8DAAuD;AACvD,oEAA6D;AAC7D,oDAA6C;AAE7C,kCAAkC;AAClC,aAAa;AACb,kCAAkC;AAClC,wEAAiE;AAEjE,aAAa;AACA,QAAA,KAAK,GAAG,QAAQ,CAAC;AAE9B,+CAA+C;AAAtC,+GAAA,cAAc,OAAA;AACvB,qDAAwC;AAA/B,wGAAA,IAAI,OAAA;AAEb,aAAa;AACb,wFAAsE;AACtE,sFAAoE;AACpE,sFAAoE;AACpE,sEAAoD;AAEpD,kDAA4D;AAAnD,4FAAA,OAAO,OAAQ;AACxB,4DAA0C;AAC1C,4DAA0C;AAE1C,wDAAkE;AAAzD,kGAAA,OAAO,OAAW;AAC3B,0DAAoE;AAA3D,oGAAA,OAAO,OAAY;AAC5B,yEAAmF;AAA1E,wGAAA,OAAO,OAAc;AAC9B,sEAAgF;AAAvE,0GAAA,OAAO,OAAe;AAC/B,0DAAoE;AAA3D,oGAAA,OAAO,OAAY;AAE5B,4DAAsE;AAA7D,sGAAA,OAAO,OAAa;AAC7B,8DAAwE;AAA/D,gHAAA,OAAO,OAAkB;AAClC,0DAAoE;AAA3D,oGAAA,OAAO,OAAY;AAE5B,6DAA2C;AAC3C,oDAA8D;AAArD,8FAAA,OAAO,OAAS;AACzB,0DAAoE;AAA3D,oGAAA,OAAO,OAAY;AAE5B,+EAAoF;AAA3E,4HAAA,uBAAuB,OAAA;AAChC,+EAAyF;AAAhF,sHAAA,OAAO,OAAqB;AAErC,mHAA6H;AAApH,kJAAA,OAAO,OAAmC;AAEnD,oGAAkF;AAClF,0EAAwD;AAExD,iEAA+C;AAE/C,gFAA8D;AAC9D,uFAAmG;AAA1F,gIAAA,OAAO,OAA2B;AAE3C,UAAU;AACV,yEAAmF;AAA1E,4GAAA,OAAO,OAAgB;AAEhC,YAAY;AACZ,+DAA6C;AAC7C,+DAA6C;AAC7C,iEAA2E;AAAlE,oHAAA,OAAO,OAAoB;AACpC,+DAAyE;AAAhE,kHAAA,OAAO,OAAmB;AACnC,iEAA2E;AAAlE,oHAAA,OAAO,OAAoB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import StepConfirmation from './pages/steps/StepConfirmation/StepConfirmation';\nimport StepDate from './pages/steps/StepDate/StepDate';\nimport StepRoom from './pages/steps/StepRoom/StepRoom';\nimport StepThanks from './pages/steps/StepThanks/StepThanks';\nimport StepManager from './util/StepManager';\n\n// TODO: Look into resolving this.\n// @ts-ignore\nimport * as ReactRaw from 'react';\nimport RoomstayEventManager from './events/RoomstayEventManager';\n\n// @ts-ignore\nexport const react = ReactRaw;\n\nexport { useTranslation } from 'react-i18next';\nexport { Link } from 'react-router-dom';\n\n// Components\nexport * from './engines/FullPageBookingEngine/FullPageBookingEngine';\nexport * from './engines/InlineRoomMiniEngine/InlineRoomMiniEngine';\nexport * from './engines/RecentSearchesEngine/RecentSearchesEngine';\nexport * from './engines/CustomEngine/CustomEngine';\n\nexport { default as Icon } from './components/generic/Icon';\nexport * from './components/generic/Icon';\nexport * from './components/generic/Text';\n\nexport { default as TextBox } from './components/generic/TextBox';\nexport { default as TextArea } from './components/generic/TextArea';\nexport { default as InputGroup } from './components/generic/InputGroup/InputGroup';\nexport { default as RadioFields } from './components/generic/radio/RadioFields';\nexport { default as Checkbox } from './components/generic/Checkbox';\n\nexport { default as LineBreak } from './components/generic/LineBreak';\nexport { default as AutoAutoHeight } from './animations/AutoAutoHeight';\nexport { default as Headline } from './components/generic/Headline';\n\nexport * from './components/generic/Alert';\nexport { default as Alert } from './components/generic/Alert';\nexport { default as BEButton } from './components/generic/BEButton';\n\nexport { BE_NO_ROOMS_FOUND_BLOCK } from './components/steps/room/NoRoomsFoundBlock';\nexport { default as NoRoomsFoundBlock } from './components/steps/room/NoRoomsFoundBlock';\n\nexport { default as StepConfirmationCountrySelector } from './components/steps/confirmation/StepConfirmationCountrySelector';\n\nexport * from './components/steps/confirmation/StepConfirmationCommentsComponent';\nexport * from './components/summary/BESummaryPerkBlock';\n\nexport * from './components/summary/BESummary';\n\nexport * from './components/steps/room/StepRoomBestRateAlert';\nexport { default as StepNoRoomBestRateAlert } from './components/steps/room/StepRoomBestRateAlert';\n\n// Loaders\nexport { default as SmallSpinner } from './components/generic/loader/SmallSpinner';\n\n// Providers\nexport * from './providers/LanguageProvider';\nexport * from './providers/CurrencyProvider';\nexport { default as CurrencyProvider } from './providers/CurrencyProvider';\nexport { default as FeatureProvider } from './providers/FeatureProvider';\nexport { default as RatePillProvider } from './providers/RatePillProvider';\nexport * from './providers/PromotionProvider';\n\n// Features\n\nexport { default as ConfirmationVerifyFeature } from './providers/feature/ConfirmationVerifyFeature';\nexport { default as DatePickerTypeFeature } from './providers/feature/DatePickerTypeFeature';\nexport { default as FeaturedPromoFeature } from './providers/feature/FeaturedPromoFeature';\nexport { default as InlineAddonStepFeature } from './providers/feature/InlineAddonStepFeature';\nexport { default as RoomUpsellFeature } from './providers/feature/RoomUpsellFeature';\nexport { default as ShowIATANumberOnCheckoutFeature } from './providers/feature/ShowIATANumberOnCheckoutFeature';\nexport { default as E164PhoneNumberFieldFeature } from './providers/feature/E164PhoneNumberFieldFeature';\n\n// Contexts\nexport * from '@frontend/contexts';\n\nexport { default as ConfirmationFormContext } from './contexts/ConfirmationFormContext';\n\nexport { default as SessionProvider } from './providers/SessionProvider';\nexport * from './providers/RoomstayThemeEngine';\nexport { default as RoomstayThemeEngine } from './providers/RoomstayThemeEngine';\nexport { registerReplacement, withDI } from './providers/DIProvider';\n\nexport { default as DataLayer } from './util/DataLayer';\nexport * from './util/DataLayer';\n\n// Models\nexport * from './models/Client/Hotel/Hotel';\nexport * from './models/Client/Hotel/HotelPerk';\n\nexport * from './models/Client/Hotel/DistanceUnitType.types';\nexport * from './models/Client/Hotel/WeekdayStartsOn.types';\n\nexport * from './models/Client/Hotel/Company';\n\nexport { default as API } from './api/BookingAPI';\n\n// Steps\nexport { default as StepManager } from './util/StepManager';\n\nexport { default as StepAddon } from './pages/steps/StepAddon/StepAddon';\nexport { default as StepDate } from './pages/steps/StepDate/StepDate';\nexport { default as StepConfirmation } from './pages/steps/StepConfirmation/StepConfirmation';\nexport { default as StepHotel } from './pages/steps/StepHotel/StepHotel';\nexport { default as StepRoom } from './pages/steps/StepRoom/StepRoom';\nexport { default as StepThanks } from './pages/steps/StepThanks/StepThanks';\n\nexport * from './translations/Translation';\n\n// Util\n\nexport * from './util/Color';\n\n// Hooks\n\nexport * from './hooks/CurrentHotelHook';\nexport * from './hooks/EventHook';\n\n/** @deprecated use `roomstay.events` instead */\nexport { default as RoomstayEventManager } from './events/RoomstayEventManager';\n\nexport const events = {\n on: RoomstayEventManager.addEvent,\n raise: RoomstayEventManager.raise,\n};\n\nexport * from './events/index';\n\n//@ts-ignore\nexport const Version = RS_VERSION;\n\nStepManager.currentSteps = {\n 0: StepDate,\n 10: StepRoom,\n 20: StepConfirmation,\n 30: StepThanks,\n};\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as dayjs from 'dayjs';
|
|
2
|
+
export declare type IPromotionApplication = {
|
|
3
|
+
checkInDate?: string;
|
|
4
|
+
checkOutDate?: string;
|
|
5
|
+
adults?: number;
|
|
6
|
+
children?: number;
|
|
7
|
+
promoCode?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare type IPromotionTestCriteria = {
|
|
10
|
+
checkInDate: dayjs.Dayjs;
|
|
11
|
+
checkOutDate: dayjs.Dayjs;
|
|
12
|
+
adults: number;
|
|
13
|
+
children: number;
|
|
14
|
+
promoCode: string;
|
|
15
|
+
};
|
|
16
|
+
export declare type IPromotion = {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
requireMemberPromotion?: boolean;
|
|
20
|
+
memberOnlyModalTitle?: string;
|
|
21
|
+
memberOnlyModalButtonText?: string;
|
|
22
|
+
memberOnlyDisableDefaultPromo?: boolean;
|
|
23
|
+
memberOnlyModalImage?: string;
|
|
24
|
+
testCriteria: (criteria: IPromotionTestCriteria) => Promise<boolean>;
|
|
25
|
+
onApply: (criteria: IPromotionTestCriteria) => IPromotionApplication;
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPromotion.type.js","sourceRoot":"/","sources":["src/models/Promotion/IPromotion.type.ts"],"names":[],"mappings":"","sourcesContent":["import * as dayjs from 'dayjs';\n\nexport type IPromotionApplication = {\n checkInDate?: string;\n checkOutDate?: string;\n\n adults?: number;\n children?: number;\n\n promoCode?: string;\n};\n\nexport type IPromotionTestCriteria = {\n checkInDate: dayjs.Dayjs;\n checkOutDate: dayjs.Dayjs;\n\n adults: number;\n children: number;\n\n promoCode: string;\n};\n\nexport type IPromotion = {\n name: string;\n description: string;\n\n requireMemberPromotion?: boolean;\n\n memberOnlyModalTitle?: string;\n memberOnlyModalButtonText?: string;\n memberOnlyDisableDefaultPromo?: boolean;\n memberOnlyModalImage?: string;\n\n testCriteria: (criteria: IPromotionTestCriteria) => Promise<boolean>;\n onApply: (criteria: IPromotionTestCriteria) => IPromotionApplication;\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BasketContextType } from '@frontend/contexts';
|
|
2
|
+
import BasketRow from 'models/BasketRow';
|
|
3
|
+
import { IPromotion } from 'models/Promotion/IPromotion.type';
|
|
4
|
+
export declare const registerPromotion: (promotion: IPromotion) => void;
|
|
5
|
+
export declare const removePromotion: (promotion: IPromotion) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Used by the Basket context to bind to state.
|
|
8
|
+
*/
|
|
9
|
+
export declare const usePromotionContainer: ({ selectedBasketRow, updateBasketRow }: {
|
|
10
|
+
selectedBasketRow: BasketRow;
|
|
11
|
+
updateBasketRow: BasketContextType['updateBasketRow'];
|
|
12
|
+
}) => {
|
|
13
|
+
loadedPromotion: IPromotion;
|
|
14
|
+
};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.usePromotionContainer = exports.removePromotion = exports.registerPromotion = void 0;
|
|
13
|
+
const contexts_1 = require("@frontend/contexts");
|
|
14
|
+
const dayjs = require("dayjs");
|
|
15
|
+
const MemberOnlyFenceSignUp_1 = require("events/actions/MemberOnlyFence/MemberOnlyFenceSignUp");
|
|
16
|
+
const PromotionAddedEvent_1 = require("events/actions/Promotion/PromotionAddedEvent");
|
|
17
|
+
const PromotionClickedEvent_1 = require("events/actions/Promotion/PromotionClickedEvent");
|
|
18
|
+
const PromotionRemovedEvent_1 = require("events/actions/Promotion/PromotionRemovedEvent");
|
|
19
|
+
const RoomstayEventManager_1 = require("events/RoomstayEventManager");
|
|
20
|
+
const EventHook_1 = require("hooks/EventHook");
|
|
21
|
+
const react_1 = require("react");
|
|
22
|
+
let _loadedPromotions = [];
|
|
23
|
+
let basketContextLoaded = false;
|
|
24
|
+
exports.registerPromotion = (promotion) => {
|
|
25
|
+
if (basketContextLoaded) {
|
|
26
|
+
RoomstayEventManager_1.default.raise(new PromotionAddedEvent_1.PromotionAddEvent(promotion));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);
|
|
30
|
+
if (promoIndex === -1) {
|
|
31
|
+
_loadedPromotions.push(promotion);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
_loadedPromotions[promoIndex] = promotion;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.removePromotion = (promotion) => {
|
|
39
|
+
if (basketContextLoaded) {
|
|
40
|
+
RoomstayEventManager_1.default.raise(new PromotionRemovedEvent_1.PromotionRemoveEvent(promotion));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);
|
|
44
|
+
if (promoIndex !== -1) {
|
|
45
|
+
_loadedPromotions.splice(promoIndex, 1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getPromoIndex = (name, promoList) => {
|
|
50
|
+
for (let i = 0; i < promoList.length; i++) {
|
|
51
|
+
if (promoList[i].name === name) {
|
|
52
|
+
return i;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return -1;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Used by the Basket context to bind to state.
|
|
59
|
+
*/
|
|
60
|
+
exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
|
|
61
|
+
const ccx = react_1.useContext(contexts_1.CompanyContext);
|
|
62
|
+
const [bump, setBump] = react_1.useState(0);
|
|
63
|
+
const [allPromotions, setAllPromotions] = react_1.useState(_loadedPromotions !== null && _loadedPromotions !== void 0 ? _loadedPromotions : []);
|
|
64
|
+
// TODO: Current implementation only supports a single promotion. In the future there will be multiple promotion locations
|
|
65
|
+
const [loadedPromotion, setLoadedPromotion] = react_1.useState(null);
|
|
66
|
+
const { on } = EventHook_1.useEvent();
|
|
67
|
+
react_1.useEffect(() => {
|
|
68
|
+
basketContextLoaded = true;
|
|
69
|
+
const updateBasketRowContext = (promotion) => {
|
|
70
|
+
if (!promotion) {
|
|
71
|
+
// We don't care about non promo sign ups;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (selectedBasketRow) {
|
|
75
|
+
const criteria = {
|
|
76
|
+
checkInDate: selectedBasketRow.getStartDate(),
|
|
77
|
+
checkOutDate: selectedBasketRow.getEndDate(),
|
|
78
|
+
adults: selectedBasketRow.getAdults(),
|
|
79
|
+
children: selectedBasketRow.getChildren(),
|
|
80
|
+
promoCode: selectedBasketRow.getPromoCode(),
|
|
81
|
+
};
|
|
82
|
+
const { checkInDate, checkOutDate, adults, children, promoCode } = promotion.onApply(criteria);
|
|
83
|
+
if (checkInDate) {
|
|
84
|
+
selectedBasketRow.setStartDate(dayjs(checkInDate));
|
|
85
|
+
}
|
|
86
|
+
if (checkOutDate) {
|
|
87
|
+
selectedBasketRow.setEndDate(dayjs(checkOutDate));
|
|
88
|
+
}
|
|
89
|
+
if (adults) {
|
|
90
|
+
selectedBasketRow.setAdults(adults);
|
|
91
|
+
}
|
|
92
|
+
if (children) {
|
|
93
|
+
selectedBasketRow.setChildren(children);
|
|
94
|
+
}
|
|
95
|
+
if (promoCode) {
|
|
96
|
+
selectedBasketRow.setPromoCode(promoCode);
|
|
97
|
+
}
|
|
98
|
+
updateBasketRow(selectedBasketRow);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
on(PromotionAddedEvent_1.PromotionAddEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
102
|
+
if (event === null || event === void 0 ? void 0 : event.promotion) {
|
|
103
|
+
setAllPromotions((oldPromotions) => {
|
|
104
|
+
const promoIndex = getPromoIndex(event.promotion.name, oldPromotions);
|
|
105
|
+
if (promoIndex === -1) {
|
|
106
|
+
return [...oldPromotions, event.promotion];
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
oldPromotions[promoIndex] = event.promotion;
|
|
110
|
+
return oldPromotions;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}), 'root');
|
|
115
|
+
on(PromotionRemovedEvent_1.PromotionRemoveEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
116
|
+
if (event === null || event === void 0 ? void 0 : event.promotion) {
|
|
117
|
+
setAllPromotions((oldPromotions) => {
|
|
118
|
+
if (oldPromotions.length === 0) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
return oldPromotions.filter((promo) => {
|
|
122
|
+
if (promo.name !== event.promotion.name) {
|
|
123
|
+
return promo;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
setBump((a) => a + 1);
|
|
129
|
+
}
|
|
130
|
+
}), 'root');
|
|
131
|
+
on(PromotionClickedEvent_1.PromotionClickedEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
132
|
+
const { promotion } = event;
|
|
133
|
+
if (!promotion) {
|
|
134
|
+
// We shouldn't be here, but just in case we are...
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!ccx.signedInUser && promotion.requireMemberPromotion) {
|
|
138
|
+
ccx.openMemberSignupModal(promotion);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
updateBasketRowContext(promotion);
|
|
142
|
+
}
|
|
143
|
+
}), 'root');
|
|
144
|
+
on(MemberOnlyFenceSignUp_1.MemberOnlyFenceSignUp, (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
145
|
+
updateBasketRowContext(event.promotion);
|
|
146
|
+
}), 'root');
|
|
147
|
+
}, [ccx.signedInUser, selectedBasketRow, allPromotions, setAllPromotions, loadedPromotion, setLoadedPromotion]);
|
|
148
|
+
react_1.useEffect(() => {
|
|
149
|
+
if (selectedBasketRow) {
|
|
150
|
+
const criteria = {
|
|
151
|
+
checkInDate: selectedBasketRow.getStartDate(),
|
|
152
|
+
checkOutDate: selectedBasketRow.getEndDate(),
|
|
153
|
+
adults: selectedBasketRow.getAdults(),
|
|
154
|
+
children: selectedBasketRow.getChildren(),
|
|
155
|
+
promoCode: selectedBasketRow.getPromoCode(),
|
|
156
|
+
};
|
|
157
|
+
onPromotionCriteriaChanged(criteria);
|
|
158
|
+
}
|
|
159
|
+
}, [
|
|
160
|
+
selectedBasketRow,
|
|
161
|
+
selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getAdults(),
|
|
162
|
+
selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getChildren(),
|
|
163
|
+
selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getArrivalDate(),
|
|
164
|
+
selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getEndDate(),
|
|
165
|
+
selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getPromoCode(),
|
|
166
|
+
allPromotions,
|
|
167
|
+
bump,
|
|
168
|
+
]);
|
|
169
|
+
react_1.useEffect(() => {
|
|
170
|
+
if (!loadedPromotion) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let loadedExists = false;
|
|
174
|
+
for (const promotion of allPromotions) {
|
|
175
|
+
if (promotion.name === loadedPromotion.name) {
|
|
176
|
+
loadedExists = true;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!loadedExists) {
|
|
181
|
+
setLoadedPromotion(null);
|
|
182
|
+
}
|
|
183
|
+
}, [allPromotions, loadedPromotion]);
|
|
184
|
+
/**
|
|
185
|
+
* Checks all the registered promotions, and returns the first one that matches the criteria.
|
|
186
|
+
*
|
|
187
|
+
* @param criteria
|
|
188
|
+
*/
|
|
189
|
+
const checkPromotions = (criteria) => __awaiter(void 0, void 0, void 0, function* () {
|
|
190
|
+
for (const promotion of allPromotions) {
|
|
191
|
+
if (yield promotion.testCriteria(criteria)) {
|
|
192
|
+
return promotion;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
});
|
|
197
|
+
const onPromotionCriteriaChanged = (criteria) => {
|
|
198
|
+
checkPromotions(criteria)
|
|
199
|
+
.then((promo) => {
|
|
200
|
+
setLoadedPromotion(promo);
|
|
201
|
+
})
|
|
202
|
+
.catch(() => {
|
|
203
|
+
setLoadedPromotion(null);
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
return {
|
|
207
|
+
loadedPromotion,
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=PromotionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromotionProvider.js","sourceRoot":"/","sources":["src/providers/PromotionProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BasketContextType, CompanyContext } from '@frontend/contexts';\nimport * as dayjs from 'dayjs';\nimport { MemberOnlyFenceSignUp } from 'events/actions/MemberOnlyFence/MemberOnlyFenceSignUp';\nimport { PromotionAddEvent } from 'events/actions/Promotion/PromotionAddedEvent';\nimport { PromotionClickedEvent } from 'events/actions/Promotion/PromotionClickedEvent';\nimport { PromotionRemoveEvent } from 'events/actions/Promotion/PromotionRemovedEvent';\nimport RoomstayEventManager from 'events/RoomstayEventManager';\nimport { useEvent } from 'hooks/EventHook';\nimport BasketRow from 'models/BasketRow';\nimport { IPromotion, IPromotionTestCriteria } from 'models/Promotion/IPromotion.type';\nimport { useContext, useEffect, useState } from 'react';\n\nlet _loadedPromotions: IPromotion[] = [];\nlet basketContextLoaded = false;\n\nexport const registerPromotion = (promotion: IPromotion) => {\n if (basketContextLoaded) {\n RoomstayEventManager.raise(new PromotionAddEvent(promotion));\n } else {\n const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);\n\n if (promoIndex === -1) {\n _loadedPromotions.push(promotion);\n } else {\n _loadedPromotions[promoIndex] = promotion;\n }\n }\n};\n\nexport const removePromotion = (promotion: IPromotion) => {\n if (basketContextLoaded) {\n RoomstayEventManager.raise(new PromotionRemoveEvent(promotion));\n } else {\n const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);\n\n if (promoIndex !== -1) {\n _loadedPromotions.splice(promoIndex, 1);\n }\n }\n};\n\nconst getPromoIndex = (name: string, promoList: IPromotion[]) => {\n for (let i = 0; i < promoList.length; i++) {\n if (promoList[i].name === name) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Used by the Basket context to bind to state.\n */\nexport const usePromotionContainer = ({ selectedBasketRow, updateBasketRow }: { selectedBasketRow: BasketRow; updateBasketRow: BasketContextType['updateBasketRow'] }) => {\n const ccx = useContext(CompanyContext);\n\n const [bump, setBump] = useState(0);\n const [allPromotions, setAllPromotions] = useState<IPromotion[]>(_loadedPromotions ?? []);\n\n // TODO: Current implementation only supports a single promotion. In the future there will be multiple promotion locations\n const [loadedPromotion, setLoadedPromotion] = useState<IPromotion>(null);\n\n const { on } = useEvent();\n\n useEffect(() => {\n basketContextLoaded = true;\n\n const updateBasketRowContext = (promotion: IPromotion) => {\n if (!promotion) {\n // We don't care about non promo sign ups;\n return;\n }\n\n if (selectedBasketRow) {\n const criteria = {\n checkInDate: selectedBasketRow.getStartDate(),\n checkOutDate: selectedBasketRow.getEndDate(),\n adults: selectedBasketRow.getAdults(),\n children: selectedBasketRow.getChildren(),\n promoCode: selectedBasketRow.getPromoCode(),\n };\n\n const { checkInDate, checkOutDate, adults, children, promoCode } = promotion.onApply(criteria);\n\n if (checkInDate) {\n selectedBasketRow.setStartDate(dayjs(checkInDate));\n }\n\n if (checkOutDate) {\n selectedBasketRow.setEndDate(dayjs(checkOutDate));\n }\n\n if (adults) {\n selectedBasketRow.setAdults(adults);\n }\n\n if (children) {\n selectedBasketRow.setChildren(children);\n }\n\n if (promoCode) {\n selectedBasketRow.setPromoCode(promoCode);\n }\n\n updateBasketRow(selectedBasketRow);\n }\n };\n\n on(\n PromotionAddEvent,\n async (event: PromotionAddEvent) => {\n if (event?.promotion) {\n setAllPromotions((oldPromotions) => {\n const promoIndex = getPromoIndex(event.promotion.name, oldPromotions);\n\n if (promoIndex === -1) {\n return [...oldPromotions, event.promotion];\n } else {\n oldPromotions[promoIndex] = event.promotion;\n return oldPromotions;\n }\n });\n }\n },\n 'root'\n );\n\n on(\n PromotionRemoveEvent,\n async (event: PromotionRemoveEvent) => {\n if (event?.promotion) {\n setAllPromotions((oldPromotions) => {\n if (oldPromotions.length === 0) {\n return [];\n }\n\n return oldPromotions.filter((promo) => {\n if (promo.name !== event.promotion.name) {\n return promo;\n }\n return false;\n });\n });\n\n setBump((a) => a + 1);\n }\n },\n 'root'\n );\n\n on(\n PromotionClickedEvent,\n async (event: PromotionClickedEvent) => {\n const { promotion } = event;\n\n if (!promotion) {\n // We shouldn't be here, but just in case we are...\n return;\n }\n\n if (!ccx.signedInUser && promotion.requireMemberPromotion) {\n ccx.openMemberSignupModal(promotion);\n } else {\n updateBasketRowContext(promotion);\n }\n },\n 'root'\n );\n\n on(\n MemberOnlyFenceSignUp,\n async (event: MemberOnlyFenceSignUp) => {\n updateBasketRowContext(event.promotion);\n },\n 'root'\n );\n }, [ccx.signedInUser, selectedBasketRow, allPromotions, setAllPromotions, loadedPromotion, setLoadedPromotion]);\n\n useEffect(() => {\n if (selectedBasketRow) {\n const criteria = {\n checkInDate: selectedBasketRow.getStartDate(),\n checkOutDate: selectedBasketRow.getEndDate(),\n adults: selectedBasketRow.getAdults(),\n children: selectedBasketRow.getChildren(),\n promoCode: selectedBasketRow.getPromoCode(),\n };\n\n onPromotionCriteriaChanged(criteria);\n }\n }, [\n selectedBasketRow,\n selectedBasketRow?.getAdults(),\n selectedBasketRow?.getChildren(),\n selectedBasketRow?.getArrivalDate(),\n selectedBasketRow?.getEndDate(),\n selectedBasketRow?.getPromoCode(),\n allPromotions,\n bump,\n ]);\n\n useEffect(() => {\n if (!loadedPromotion) {\n return;\n }\n\n let loadedExists = false;\n for (const promotion of allPromotions) {\n if (promotion.name === loadedPromotion.name) {\n loadedExists = true;\n break;\n }\n }\n\n if (!loadedExists) {\n setLoadedPromotion(null);\n }\n }, [allPromotions, loadedPromotion]);\n\n /**\n * Checks all the registered promotions, and returns the first one that matches the criteria.\n *\n * @param criteria\n */\n const checkPromotions = async (criteria: IPromotionTestCriteria) => {\n for (const promotion of allPromotions) {\n if (await promotion.testCriteria(criteria)) {\n return promotion;\n }\n }\n\n return null;\n };\n\n const onPromotionCriteriaChanged = (criteria: IPromotionTestCriteria) => {\n checkPromotions(criteria)\n .then((promo) => {\n setLoadedPromotion(promo);\n })\n .catch(() => {\n setLoadedPromotion(null);\n });\n };\n\n return {\n loadedPromotion,\n };\n};\n"]}
|