@roomstay/frontend 2.9.0 → 2.9.1-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/177.bundle.js +1 -1
- package/dist/219.bundle.js +2 -0
- package/dist/288.bundle.js +1 -1
- package/dist/291.bundle.js +1 -0
- package/dist/446.bundle.js +1 -1
- package/dist/537.bundle.js +1 -1
- package/dist/596.bundle.js +1 -1
- package/dist/625.bundle.js +1 -1
- package/dist/836.bundle.js +1 -1
- package/dist/main.bundle.js +1 -1
- package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js +6 -0
- package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js.map +1 -1
- package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.d.ts +22 -0
- package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js +131 -0
- package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js.map +1 -0
- package/dist/src/components/generic/Portal/Portal.js +5 -1
- package/dist/src/components/generic/Portal/Portal.js.map +1 -1
- package/dist/src/components/generic/Select/InputSelect.js +3 -2
- package/dist/src/components/generic/Select/InputSelect.js.map +1 -1
- package/dist/src/components/generic/Select/Select.js +5 -5
- package/dist/src/components/generic/Select/Select.js.map +1 -1
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.d.ts +2 -2
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
- package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.d.ts +4 -0
- package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js +105 -30
- package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js.map +1 -1
- package/dist/src/components/members/SignInModal/ExternalMemberModal.d.ts +9 -3
- package/dist/src/components/members/SignInModal/ExternalMemberModal.js +45 -6
- package/dist/src/components/members/SignInModal/ExternalMemberModal.js.map +1 -1
- package/dist/src/components/steps/confirmation/RoomContactDetails.js +2 -3
- package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
- package/dist/src/components/steps/date/BEPeoplePickerBlock.js +3 -1
- package/dist/src/components/steps/date/BEPeoplePickerBlock.js.map +1 -1
- package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js +2 -0
- package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js.map +1 -1
- package/dist/src/components/summary/BESummaryRoomRow.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js +1 -1
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +1 -0
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
- package/dist/src/contexts/ShadowDomContext/ShadowDomContext.d.ts +10 -0
- package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js +12 -0
- package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js.map +1 -0
- package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.d.ts +8 -0
- package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js +13 -0
- package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js.map +1 -0
- package/dist/src/contexts/index.d.ts +2 -0
- package/dist/src/contexts/index.js +2 -0
- package/dist/src/contexts/index.js.map +1 -1
- package/dist/src/engines/BaseEngine.d.ts +13 -0
- package/dist/src/engines/BaseEngine.js +32 -0
- package/dist/src/engines/BaseEngine.js.map +1 -1
- package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js +1 -0
- package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js.map +1 -1
- package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js +3 -1
- package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js.map +1 -1
- package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js +1 -0
- package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js.map +1 -1
- package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +12 -10
- package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
- package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js +1 -0
- package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js.map +1 -1
- package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js +11 -9
- package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js.map +1 -1
- package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js +1 -0
- package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js.map +1 -1
- package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +4 -2
- package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
- package/dist/src/handlers/membership/SalesforceMemberHandler.js +1 -1
- package/dist/src/handlers/membership/SalesforceMemberHandler.js.map +1 -1
- package/dist/src/hooks/BodyClickHook.d.ts +2 -2
- package/dist/src/hooks/BodyClickHook.js +7 -3
- package/dist/src/hooks/BodyClickHook.js.map +1 -1
- package/dist/src/pages/findReservation/FindReservationResults.js +1 -1
- package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
- package/dist/src/pages/findReservation/ReservationRow.js +10 -9
- package/dist/src/pages/findReservation/ReservationRow.js.map +1 -1
- package/dist/src/pages/hotel/HotelInfo.js +7 -6
- package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
- package/dist/src/providers/RoomstayThemeEngine.js +7 -2
- package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
- package/dist/src/providers/ShadowDomManager.d.ts +21 -0
- package/dist/src/providers/ShadowDomManager.js +55 -0
- package/dist/src/providers/ShadowDomManager.js.map +1 -0
- package/dist/src/providers/StyleInjector.d.ts +42 -0
- package/dist/src/providers/StyleInjector.js +118 -0
- package/dist/src/providers/StyleInjector.js.map +1 -0
- package/dist/src/providers/storage/SessionProvider.js.map +1 -1
- package/dist/src/stories/EnhancedPhoneNumberField.stories.d.ts +1 -1
- package/dist/src/translations/Translation.d.ts +3 -0
- package/dist/src/translations/Translation.js +3 -0
- package/dist/src/translations/Translation.js.map +1 -1
- package/dist/src/translations/languages/en-gb.js +3 -0
- package/dist/src/translations/languages/en-gb.js.map +1 -1
- package/dist/src/util/Analytics/Analytics.js +1 -0
- package/dist/src/util/Analytics/Analytics.js.map +1 -1
- package/dist/src/util/ObjectHelper.d.ts +1 -0
- package/dist/src/util/ObjectHelper.js +5 -1
- package/dist/src/util/ObjectHelper.js.map +1 -1
- package/dist/test.bundle.js +1 -1
- package/dist/vendors.bundle.js +1 -1
- package/package.json +1 -1
- package/dist/326.bundle.js +0 -2
- package/dist/686.bundle.js +0 -1
- /package/dist/{326.bundle.js.LICENSE.txt → 219.bundle.js.LICENSE.txt} +0 -0
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
36
|
var t = {};
|
|
4
37
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -15,41 +48,83 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
48
|
};
|
|
16
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
50
|
const react_1 = __importDefault(require("react"));
|
|
51
|
+
const react_hook_form_1 = require("react-hook-form");
|
|
18
52
|
const react_i18next_1 = require("react-i18next");
|
|
19
53
|
const Icon_1 = require("../../generic/Icon/Icon");
|
|
20
54
|
const Translation_1 = require("../../../translations/Translation");
|
|
21
|
-
const ExternalMemberModal_1 =
|
|
55
|
+
const ExternalMemberModal_1 = __importStar(require("./ExternalMemberModal"));
|
|
22
56
|
const EmailAndFullnameMemberModal = (_a) => {
|
|
23
|
-
var { isMemberNumberRequired = true } = _a, props = __rest(_a, ["isMemberNumberRequired"]);
|
|
57
|
+
var { isMemberNumberRequired = true, enableMemberNumber = true, enablePostcode = false, enableMobilePhone = false, enableMarketingOptIn = false } = _a, props = __rest(_a, ["isMemberNumberRequired", "enableMemberNumber", "enablePostcode", "enableMobilePhone", "enableMarketingOptIn"]);
|
|
58
|
+
const methods = (0, react_hook_form_1.useForm)({
|
|
59
|
+
mode: 'onSubmit',
|
|
60
|
+
});
|
|
24
61
|
const { t } = (0, react_i18next_1.useTranslation)();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
const fields = buildFields(t, {
|
|
63
|
+
enableMemberNumber,
|
|
64
|
+
isMemberNumberRequired,
|
|
65
|
+
enablePostcode,
|
|
66
|
+
enableMobilePhone,
|
|
67
|
+
enableMarketingOptIn,
|
|
68
|
+
});
|
|
69
|
+
return (react_1.default.createElement(react_hook_form_1.FormProvider, Object.assign({}, methods),
|
|
70
|
+
react_1.default.createElement(ExternalMemberModal_1.default, Object.assign({}, props, { fields: fields }))));
|
|
71
|
+
};
|
|
72
|
+
const buildFields = (t, { enableMemberNumber, isMemberNumberRequired, enablePostcode, enableMobilePhone, enableMarketingOptIn, }) => {
|
|
73
|
+
const fields = [];
|
|
74
|
+
if (enableMemberNumber) {
|
|
75
|
+
fields.push({
|
|
76
|
+
name: 'memberNumber',
|
|
77
|
+
icon: Icon_1.IconType.Star,
|
|
78
|
+
label: t(Translation_1.Translation.ExternalMemberPopup.Fields.MemberNumber),
|
|
79
|
+
isMasked: false,
|
|
80
|
+
required: isMemberNumberRequired,
|
|
81
|
+
helperText: !isMemberNumberRequired ? t(Translation_1.Translation.ExternalMemberPopup.Fields.MemberNumberOptionalBenefits) : undefined,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
fields.push({
|
|
85
|
+
name: 'firstName',
|
|
86
|
+
icon: Icon_1.IconType.Person,
|
|
87
|
+
label: t(Translation_1.Translation.Navigation.SignUp.Inputs.FirstName),
|
|
88
|
+
isMasked: false,
|
|
89
|
+
}, {
|
|
90
|
+
name: 'lastName',
|
|
91
|
+
icon: Icon_1.IconType.Person,
|
|
92
|
+
label: t(Translation_1.Translation.Navigation.SignUp.Inputs.LastName),
|
|
93
|
+
isMasked: false,
|
|
94
|
+
}, {
|
|
95
|
+
name: 'email',
|
|
96
|
+
icon: Icon_1.IconType.Email,
|
|
97
|
+
label: t(Translation_1.Translation.Navigation.SignIn.EmailAddress),
|
|
98
|
+
isMasked: false,
|
|
99
|
+
});
|
|
100
|
+
if (enablePostcode) {
|
|
101
|
+
fields.push({
|
|
102
|
+
name: 'postalCode',
|
|
103
|
+
icon: Icon_1.IconType.Map,
|
|
104
|
+
label: t(Translation_1.Translation.ExternalMemberPopup.Fields.PostalCode),
|
|
105
|
+
isMasked: false,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (enableMobilePhone) {
|
|
109
|
+
fields.push({
|
|
110
|
+
name: 'mobilePhone',
|
|
111
|
+
icon: Icon_1.IconType.Phone,
|
|
112
|
+
label: t(Translation_1.Translation.ExternalMemberPopup.Fields.MobilePhone),
|
|
113
|
+
isMasked: false,
|
|
114
|
+
type: ExternalMemberModal_1.ExternalMemberModelFieldType.Phone,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (enableMarketingOptIn) {
|
|
118
|
+
fields.push({
|
|
119
|
+
name: 'marketingOptIn',
|
|
120
|
+
icon: Icon_1.IconType.Info,
|
|
121
|
+
label: t(Translation_1.Translation.ExternalMemberPopup.Fields.MarketingOptIn),
|
|
122
|
+
isMasked: false,
|
|
123
|
+
type: ExternalMemberModal_1.ExternalMemberModelFieldType.CheckBox,
|
|
124
|
+
required: false,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return fields;
|
|
53
128
|
};
|
|
54
129
|
exports.default = EmailAndFullnameMemberModal;
|
|
55
130
|
//# sourceMappingURL=EmailAndFullnameMemberModal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailAndFullnameMemberModal.js","sourceRoot":"/","sources":["src/components/members/SignInModal/EmailAndFullnameMemberModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EmailAndFullnameMemberModal.js","sourceRoot":"/","sources":["src/components/members/SignInModal/EmailAndFullnameMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IMemberVerification } from '@roomstay/core';\nimport React, { FC } from 'react';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport { TFunction, useTranslation } from 'react-i18next';\n\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport { Translation } from '@/translations/Translation';\n\nimport ExternalMemberModal, { CommonMemberModalProps, ExternalMemberModelField, ExternalMemberModelFieldType } from './ExternalMemberModal';\n\ntype EmailAndFullnameFields = IMemberVerification & {\n postalCode?: string;\n mobilePhone?: string;\n marketingOptIn?: string;\n};\n\ntype EmailAndFullnameMemberModalProps = CommonMemberModalProps & {\n isMemberNumberRequired?: boolean;\n enableMemberNumber?: boolean;\n enablePostcode?: boolean;\n enableMobilePhone?: boolean;\n enableMarketingOptIn?: boolean;\n};\n\nconst EmailAndFullnameMemberModal: FC<EmailAndFullnameMemberModalProps> = ({\n isMemberNumberRequired = true,\n enableMemberNumber = true,\n enablePostcode = false,\n enableMobilePhone = false,\n enableMarketingOptIn = false,\n ...props\n}) => {\n const methods = useForm<Record<string, string>>({\n mode: 'onSubmit',\n });\n const { t } = useTranslation();\n const fields = buildFields(t, {\n enableMemberNumber,\n isMemberNumberRequired,\n enablePostcode,\n enableMobilePhone,\n enableMarketingOptIn,\n });\n return (\n <FormProvider {...methods}>\n <ExternalMemberModal<EmailAndFullnameFields> {...props} fields={fields} />\n </FormProvider>\n );\n};\n\nconst buildFields = (\n t: TFunction<'translation', undefined>,\n {\n enableMemberNumber,\n isMemberNumberRequired,\n enablePostcode,\n enableMobilePhone,\n enableMarketingOptIn,\n }: {\n enableMemberNumber: boolean;\n isMemberNumberRequired: boolean;\n enablePostcode: boolean;\n enableMobilePhone: boolean;\n enableMarketingOptIn: boolean;\n }\n): ExternalMemberModelField<EmailAndFullnameFields>[] => {\n const fields: ExternalMemberModelField<EmailAndFullnameFields>[] = [];\n\n if (enableMemberNumber) {\n fields.push({\n name: 'memberNumber',\n icon: IconType.Star,\n label: t(Translation.ExternalMemberPopup.Fields.MemberNumber),\n isMasked: false,\n required: isMemberNumberRequired,\n helperText: !isMemberNumberRequired ? t(Translation.ExternalMemberPopup.Fields.MemberNumberOptionalBenefits) : undefined,\n });\n }\n\n fields.push(\n {\n name: 'firstName',\n icon: IconType.Person,\n label: t(Translation.Navigation.SignUp.Inputs.FirstName),\n isMasked: false,\n },\n {\n name: 'lastName',\n icon: IconType.Person,\n label: t(Translation.Navigation.SignUp.Inputs.LastName),\n isMasked: false,\n },\n {\n name: 'email',\n icon: IconType.Email,\n label: t(Translation.Navigation.SignIn.EmailAddress),\n isMasked: false,\n }\n );\n\n if (enablePostcode) {\n fields.push({\n name: 'postalCode',\n icon: IconType.Map,\n label: t(Translation.ExternalMemberPopup.Fields.PostalCode),\n isMasked: false,\n });\n }\n\n if (enableMobilePhone) {\n fields.push({\n name: 'mobilePhone',\n icon: IconType.Phone,\n label: t(Translation.ExternalMemberPopup.Fields.MobilePhone),\n isMasked: false,\n type: ExternalMemberModelFieldType.Phone,\n });\n }\n\n if (enableMarketingOptIn) {\n fields.push({\n name: 'marketingOptIn',\n icon: IconType.Info,\n label: t(Translation.ExternalMemberPopup.Fields.MarketingOptIn),\n isMasked: false,\n type: ExternalMemberModelFieldType.CheckBox,\n required: false,\n });\n }\n\n return fields;\n};\n\nexport default EmailAndFullnameMemberModal;\n"]}
|
|
@@ -12,17 +12,23 @@ export type CommonMemberModalProps = {
|
|
|
12
12
|
imageSize: Property.ObjectFit;
|
|
13
13
|
provider: EMembershipProvider;
|
|
14
14
|
};
|
|
15
|
-
type ExternalMemberModalProps<T extends FieldValues> = CommonMemberModalProps & {
|
|
15
|
+
export type ExternalMemberModalProps<T extends FieldValues> = CommonMemberModalProps & {
|
|
16
16
|
fields: ExternalMemberModelField<T>[];
|
|
17
17
|
};
|
|
18
|
-
|
|
18
|
+
export declare enum ExternalMemberModelFieldType {
|
|
19
|
+
TextBox = "TextBox",
|
|
20
|
+
CheckBox = "CheckBox",
|
|
21
|
+
Phone = "Phone"
|
|
22
|
+
}
|
|
23
|
+
export type ExternalMemberModelField<T extends FieldValues> = {
|
|
19
24
|
name: keyof T & string;
|
|
20
25
|
icon: IconType;
|
|
21
26
|
label: string;
|
|
22
27
|
profileMapping?: keyof UserProfile;
|
|
23
|
-
isMasked
|
|
28
|
+
isMasked?: boolean;
|
|
24
29
|
required?: boolean;
|
|
25
30
|
helperText?: string;
|
|
31
|
+
type?: ExternalMemberModelFieldType;
|
|
26
32
|
};
|
|
27
33
|
declare const ExternalMemberModal: <T extends FieldValues & IMemberVerification>(props: ExternalMemberModalProps<T>) => React.JSX.Element;
|
|
28
34
|
export default ExternalMemberModal;
|
|
@@ -45,6 +45,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
45
45
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
46
|
};
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.ExternalMemberModelFieldType = void 0;
|
|
48
49
|
const core_1 = require("@roomstay/core");
|
|
49
50
|
const classnames_1 = __importDefault(require("classnames"));
|
|
50
51
|
const react_1 = __importStar(require("react"));
|
|
@@ -52,6 +53,8 @@ const react_hook_form_1 = require("react-hook-form");
|
|
|
52
53
|
const react_i18next_1 = require("react-i18next");
|
|
53
54
|
const BookingAPI_1 = __importDefault(require("../../../api/BookingAPI"));
|
|
54
55
|
const BEButton_1 = __importDefault(require("../../generic/BEButton"));
|
|
56
|
+
const Checkbox_1 = __importDefault(require("../../generic/Checkbox/Checkbox"));
|
|
57
|
+
const EnhancedPhoneNumberField_1 = __importDefault(require("../../generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField"));
|
|
55
58
|
const Headline_1 = __importDefault(require("../../generic/Headline"));
|
|
56
59
|
const Icon_1 = require("../../generic/Icon/Icon");
|
|
57
60
|
const InputGroup_1 = __importDefault(require("../../generic/InputGroup/InputGroup"));
|
|
@@ -61,22 +64,30 @@ const Text_1 = __importStar(require("../../generic/Text"));
|
|
|
61
64
|
const TextBox_1 = __importDefault(require("../../generic/TextBox"));
|
|
62
65
|
const contexts_1 = require("../../../contexts");
|
|
63
66
|
const hooks_1 = require("../../../hooks");
|
|
67
|
+
const E164PhoneNumberFieldFeature_1 = __importDefault(require("../../../providers/feature/E164PhoneNumberFieldFeature"));
|
|
64
68
|
const ImageProvider_1 = __importStar(require("../../../providers/ImageProvider"));
|
|
65
69
|
const Translation_1 = require("../../../translations/Translation");
|
|
66
70
|
const Color_1 = require("../../../util/Color");
|
|
67
71
|
const ExternalMemberModal_module_scss_1 = __importDefault(require("./ExternalMemberModal.module.scss"));
|
|
72
|
+
var ExternalMemberModelFieldType;
|
|
73
|
+
(function (ExternalMemberModelFieldType) {
|
|
74
|
+
ExternalMemberModelFieldType["TextBox"] = "TextBox";
|
|
75
|
+
ExternalMemberModelFieldType["CheckBox"] = "CheckBox";
|
|
76
|
+
ExternalMemberModelFieldType["Phone"] = "Phone";
|
|
77
|
+
})(ExternalMemberModelFieldType || (exports.ExternalMemberModelFieldType = ExternalMemberModelFieldType = {}));
|
|
68
78
|
const ExternalMemberModal = (props) => {
|
|
69
79
|
var _a;
|
|
70
80
|
const { hotel } = (0, hooks_1.useCurrentHotel)();
|
|
71
81
|
const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
|
|
72
82
|
const { signUserIn, closeMemberSignupModal } = (0, react_1.useContext)(contexts_1.CompanyContext);
|
|
73
83
|
const { t } = (0, react_i18next_1.useTranslation)();
|
|
84
|
+
const formMethods = (0, react_hook_form_1.useFormContext)();
|
|
74
85
|
const [isLoading, setIsLoading] = (0, react_1.useState)(false);
|
|
75
86
|
const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
|
|
76
|
-
const formMethods = (0, react_hook_form_1.useForm)();
|
|
77
87
|
const modalPrimaryColor = (hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor) ? Color_1.Color.Accent : Color_1.Color.Success;
|
|
78
88
|
const memberOnlySignupLink = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlySignupLinks) === null || _a === void 0 ? void 0 : _a[props.provider];
|
|
79
89
|
const getValidationClass = (name) => {
|
|
90
|
+
console.log(formMethods.formState, formMethods.getValues());
|
|
80
91
|
if (formMethods.formState.errors) {
|
|
81
92
|
if (formMethods.formState.errors[name]) {
|
|
82
93
|
return 'error';
|
|
@@ -135,11 +146,39 @@ const ExternalMemberModal = (props) => {
|
|
|
135
146
|
props.subTitle && react_1.default.createElement(Text_1.default, { className: "u-marg-top external-member-modal-sub-title" }, props.subTitle),
|
|
136
147
|
react_1.default.createElement("form", { onSubmit: formMethods.handleSubmit(onSubmit) },
|
|
137
148
|
props.fields.map((field) => {
|
|
138
|
-
const isRequired = field.required !== false;
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
149
|
+
const isRequired = field.required !== false;
|
|
150
|
+
const validationStatus = getValidationClass(field.name);
|
|
151
|
+
const register = formMethods.register(field.name, { required: isRequired });
|
|
152
|
+
const inputProps = Object.assign({ iconProps: { color: Color_1.Color.DarkGrey }, icon: field.icon, inputProps: { disabled: isLoading }, placeholder: field.label, wide: true, required: isRequired, validationStatus }, register);
|
|
153
|
+
const renderCheckbox = () => (react_1.default.createElement("div", { className: "u-marg-top", key: field.name },
|
|
154
|
+
react_1.default.createElement(InputGroup_1.default, { dimensions: "1" },
|
|
155
|
+
react_1.default.createElement(Checkbox_1.default, Object.assign({ label: field.label }, register)))));
|
|
156
|
+
const renderPhone = () => (react_1.default.createElement(InputGroup_1.default, { dimensions: "1", key: field.name }, E164PhoneNumberFieldFeature_1.default.isActive() ? (react_1.default.createElement(react_hook_form_1.Controller, { control: formMethods.control, name: field.name, rules: {
|
|
157
|
+
required: {
|
|
158
|
+
value: isRequired,
|
|
159
|
+
message: t(Translation_1.Translation.Step.Confirmation.Inputs.Required, {
|
|
160
|
+
field: t(Translation_1.Translation.Step.Confirmation.Inputs.Phone),
|
|
161
|
+
}),
|
|
162
|
+
},
|
|
163
|
+
minLength: { value: 5, message: 'Phone number is required' },
|
|
164
|
+
maxLength: { value: 17, message: 'Phone number is too long' },
|
|
165
|
+
pattern: {
|
|
166
|
+
value: /^[1-9]( |\d){1,15}$/g,
|
|
167
|
+
message: 'Incorrect phone number entered',
|
|
168
|
+
},
|
|
169
|
+
}, render: ({ field: controllerField }) => (react_1.default.createElement(EnhancedPhoneNumberField_1.default, Object.assign({}, controllerField, register, { validationStatus: validationStatus }))) })) : (react_1.default.createElement(TextBox_1.default, Object.assign({}, inputProps)))));
|
|
170
|
+
const renderTextInput = () => {
|
|
171
|
+
return (react_1.default.createElement("div", { className: "u-marg-top u-marg-bottom", key: field.name },
|
|
172
|
+
react_1.default.createElement(InputGroup_1.default, { dimensions: "1" }, field.isMasked ? react_1.default.createElement(PasswordBox_1.PasswordBox, Object.assign({}, inputProps)) : react_1.default.createElement(TextBox_1.default, Object.assign({}, inputProps))),
|
|
173
|
+
field.helperText && (react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey }, field.helperText))));
|
|
174
|
+
};
|
|
175
|
+
if (field.type === ExternalMemberModelFieldType.CheckBox) {
|
|
176
|
+
return renderCheckbox();
|
|
177
|
+
}
|
|
178
|
+
if (field.type === ExternalMemberModelFieldType.Phone) {
|
|
179
|
+
return renderPhone();
|
|
180
|
+
}
|
|
181
|
+
return renderTextInput();
|
|
143
182
|
}),
|
|
144
183
|
react_1.default.createElement(BEButton_1.default, { isLoading: isLoading, htmlType: "submit", className: "u-marg-top external-member-modal-submit-btn", size: "normal", filled: true, primary: hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor, success: !(hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor), stopIconAnimation: true, icon: Icon_1.IconType.ArrowRight, iconPosition: "right", wide: true }, t(Translation_1.Translation.ExternalMemberPopup.Submit)),
|
|
145
184
|
react_1.default.createElement("div", { className: "u-marg-top" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalMemberModal.js","sourceRoot":"/","sources":["src/components/members/SignInModal/ExternalMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EMembershipProvider, IMemberVerification, IMessage, nameof } from '@roomstay/core';\nimport classNames from 'classnames';\nimport { Property } from 'csstype';\nimport React, { useContext, useState } from 'react';\nimport { FieldValues, Path, SubmitHandler, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport InputGroup from '@/components/generic/InputGroup/InputGroup';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport { PasswordBox } from '@/components/generic/PasswordBox/PasswordBox';\nimport Text, { TextType } from '@/components/generic/Text';\nimport TextBox, { TextBoxProps } from '@/components/generic/TextBox';\nimport { BasketContext, CompanyContext } from '@/contexts';\nimport { useCurrentHotel } from '@/hooks';\nimport UserProfile from '@/models/UserProfile';\nimport ImageProvider, { ImageSize } from '@/providers/ImageProvider';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nimport styles from './ExternalMemberModal.module.scss';\n\nexport type CommonMemberModalProps = {\n title: string;\n subTitle?: string;\n image: string;\n isOpen: boolean;\n imageSize: Property.ObjectFit;\n provider: EMembershipProvider;\n};\n\ntype ExternalMemberModalProps<T extends FieldValues> = CommonMemberModalProps & {\n fields: ExternalMemberModelField<T>[];\n};\n\ntype ExternalMemberModelField<T extends FieldValues> = {\n name: keyof T & string;\n icon: IconType;\n label: string;\n profileMapping?: keyof UserProfile;\n isMasked: boolean;\n required?: boolean;\n helperText?: string;\n};\n\nconst ExternalMemberModal = <T extends FieldValues & IMemberVerification>(props: ExternalMemberModalProps<T>) => {\n const { hotel } = useCurrentHotel();\n const basketContext = useContext(BasketContext);\n const { signUserIn, closeMemberSignupModal } = useContext(CompanyContext);\n const { t } = useTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n const formMethods = useForm<T>();\n const modalPrimaryColor = hotel?.memberOnlyModalUsePrimaryColor ? Color.Accent : Color.Success;\n const memberOnlySignupLink = hotel?.memberOnlySignupLinks?.[props.provider];\n\n const getValidationClass = (name: keyof T) => {\n if (formMethods.formState.errors) {\n if (formMethods.formState.errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n }\n };\n\n const onSubmit: SubmitHandler<T> = async (fields) => {\n setIsLoading(true);\n setErrorMessage('');\n\n try {\n const hotelId = hotel?.hotelID as string;\n const member = await API.Member.verifyMember(hotelId, props.provider, fields);\n\n if (member && member.memberId) {\n await signUserIn({\n saveState: true, //TODO: why was this false???\n memberNumber: member.memberId,\n memberProvider: props.provider,\n firstName: fields.firstName,\n lastName: fields.lastName,\n email: fields.email,\n });\n\n // Preset checkout defaults\n basketContext.currentBasketRows?.forEach(\n (row) =>\n (row.checkoutDefaults = {\n firstName: fields.firstName,\n lastName: fields.lastName,\n email: fields.email,\n })\n );\n } else {\n setErrorMessage(t(Translation.ExternalMemberPopup.InvalidMember));\n }\n } catch (e: any) {\n if (e[nameof<IMessage>('Message')]) {\n setErrorMessage(e.Message);\n } else {\n throw e;\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <SimpleModal open={props.isOpen} onClose={closeMemberSignupModal} size={SimpleModalSize.Normal} alignCenter>\n <div className={classNames(styles['external-member-modal'], 'row', `external-member-modal-${props.provider}`)}>\n <div className=\"col-md-6 external-member-modal-image\">\n <img\n src={ImageProvider.resizeImage(props.image, ImageSize.Original)}\n alt={props.title}\n className={styles['external-member-image']}\n style={{ objectFit: props.imageSize }}\n />\n </div>\n\n <div className=\"col-md-6 u-pad--heavy external-member-modal-content\">\n <div className=\"u-pad\">\n <Headline className=\"external-member-modal-title\" bold color={modalPrimaryColor}>\n {props.title}\n </Headline>\n {props.subTitle && <Text className=\"u-marg-top external-member-modal-sub-title\">{props.subTitle}</Text>}\n\n <form onSubmit={formMethods.handleSubmit(onSubmit)}>\n {props.fields.map((field) => {\n const isRequired = field.required !== false; // Default to true if not specified\n const inputProps: TextBoxProps = {\n iconProps: { color: Color.DarkGrey },\n icon: field.icon,\n inputProps: { disabled: isLoading },\n placeholder: field.label,\n wide: true,\n required: isRequired,\n validationStatus: getValidationClass(field.name),\n ...formMethods.register(field.name as Path<T>, { required: isRequired }),\n };\n\n return (\n <div className=\"u-marg-top u-marg-bottom\" key={field.name}>\n <InputGroup dimensions=\"1\">{field.isMasked ? <PasswordBox {...inputProps} /> : <TextBox {...inputProps} />}</InputGroup>\n {field.helperText && (\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {field.helperText}\n </Text>\n )}\n </div>\n );\n })}\n\n <BEButton\n isLoading={isLoading}\n htmlType=\"submit\"\n className=\"u-marg-top external-member-modal-submit-btn\"\n size=\"normal\"\n filled\n primary={hotel?.memberOnlyModalUsePrimaryColor}\n success={!hotel?.memberOnlyModalUsePrimaryColor}\n stopIconAnimation\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n wide\n >\n {t(Translation.ExternalMemberPopup.Submit)}\n </BEButton>\n <div className=\"u-marg-top\">\n <Text bold color={Color.Danger}>\n {errorMessage}\n </Text>\n </div>\n </form>\n\n {memberOnlySignupLink && (\n <div className=\"external-member-modal-signup\">\n <div className=\"line-break\"></div>\n <div className=\"u-marg-top u-flex align-items-center u-justify-between\">\n <Text type={TextType.Small} className=\"u-flex align-items-center\" color={Color.DarkGrey}>\n {t(Translation.ExternalMemberPopup.DontHaveAccount)}\n </Text>\n <BEButton\n className=\"external-member-modal-signup-btn\"\n htmlType=\"button\"\n size=\"normal\"\n filled\n primary\n onClick={() => window.open(memberOnlySignupLink, '_blank')}\n >\n {t(Translation.ExternalMemberPopup.SignUp)}\n </BEButton>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </SimpleModal>\n );\n};\n\nexport default ExternalMemberModal;\n"]}
|
|
1
|
+
{"version":3,"file":"ExternalMemberModal.js","sourceRoot":"/","sources":["src/components/members/SignInModal/ExternalMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EMembershipProvider, IMemberVerification, IMessage, nameof } from '@roomstay/core';\nimport classNames from 'classnames';\nimport { Property } from 'csstype';\nimport React, { useContext, useState } from 'react';\nimport { Controller, FieldValues, Path, SubmitHandler, useFormContext } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Checkbox from '@/components/generic/Checkbox/Checkbox';\nimport EnhancedPhoneNumberField from '@/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport InputGroup from '@/components/generic/InputGroup/InputGroup';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport { PasswordBox } from '@/components/generic/PasswordBox/PasswordBox';\nimport Text, { TextType } from '@/components/generic/Text';\nimport TextBox, { TextBoxProps } from '@/components/generic/TextBox';\nimport { BasketContext, CompanyContext } from '@/contexts';\nimport { useCurrentHotel } from '@/hooks';\nimport UserProfile from '@/models/UserProfile';\nimport E164PhoneNumberFieldFeature from '@/providers/feature/E164PhoneNumberFieldFeature';\nimport ImageProvider, { ImageSize } from '@/providers/ImageProvider';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nimport styles from './ExternalMemberModal.module.scss';\n\nexport type CommonMemberModalProps = {\n title: string;\n subTitle?: string;\n image: string;\n isOpen: boolean;\n imageSize: Property.ObjectFit;\n provider: EMembershipProvider;\n};\n\nexport type ExternalMemberModalProps<T extends FieldValues> = CommonMemberModalProps & {\n fields: ExternalMemberModelField<T>[];\n};\n\nexport enum ExternalMemberModelFieldType {\n TextBox = 'TextBox',\n CheckBox = 'CheckBox',\n Phone = 'Phone',\n}\nexport type ExternalMemberModelField<T extends FieldValues> = {\n name: keyof T & string;\n icon: IconType;\n label: string;\n profileMapping?: keyof UserProfile;\n isMasked?: boolean;\n required?: boolean;\n helperText?: string;\n type?: ExternalMemberModelFieldType;\n};\n\nconst ExternalMemberModal = <T extends FieldValues & IMemberVerification>(props: ExternalMemberModalProps<T>) => {\n const { hotel } = useCurrentHotel();\n const basketContext = useContext(BasketContext);\n const { signUserIn, closeMemberSignupModal } = useContext(CompanyContext);\n const { t } = useTranslation();\n const formMethods: any = useFormContext<Record<string, string>>();\n\n const [isLoading, setIsLoading] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const modalPrimaryColor = hotel?.memberOnlyModalUsePrimaryColor ? Color.Accent : Color.Success;\n const memberOnlySignupLink = hotel?.memberOnlySignupLinks?.[props.provider];\n\n const getValidationClass = (name: keyof T) => {\n console.log(formMethods.formState, formMethods.getValues());\n if (formMethods.formState.errors) {\n if (formMethods.formState.errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n }\n };\n\n const onSubmit: SubmitHandler<T> = async (fields) => {\n setIsLoading(true);\n setErrorMessage('');\n\n try {\n const hotelId = hotel?.hotelID as string;\n const member = await API.Member.verifyMember(hotelId, props.provider, fields);\n\n if (member && member.memberId) {\n await signUserIn({\n saveState: true, //TODO: why was this false???\n memberNumber: member.memberId,\n memberProvider: props.provider,\n firstName: fields.firstName,\n lastName: fields.lastName,\n email: fields.email,\n });\n\n // Preset checkout defaults\n basketContext.currentBasketRows?.forEach(\n (row) =>\n (row.checkoutDefaults = {\n firstName: fields.firstName,\n lastName: fields.lastName,\n email: fields.email,\n })\n );\n } else {\n setErrorMessage(t(Translation.ExternalMemberPopup.InvalidMember));\n }\n } catch (e: any) {\n if (e[nameof<IMessage>('Message')]) {\n setErrorMessage(e.Message);\n } else {\n throw e;\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <SimpleModal open={props.isOpen} onClose={closeMemberSignupModal} size={SimpleModalSize.Normal} alignCenter>\n <div className={classNames(styles['external-member-modal'], 'row', `external-member-modal-${props.provider}`)}>\n <div className=\"col-md-6 external-member-modal-image\">\n <img\n src={ImageProvider.resizeImage(props.image, ImageSize.Original)}\n alt={props.title}\n className={styles['external-member-image']}\n style={{ objectFit: props.imageSize }}\n />\n </div>\n\n <div className=\"col-md-6 u-pad--heavy external-member-modal-content\">\n <div className=\"u-pad\">\n <Headline className=\"external-member-modal-title\" bold color={modalPrimaryColor}>\n {props.title}\n </Headline>\n {props.subTitle && <Text className=\"u-marg-top external-member-modal-sub-title\">{props.subTitle}</Text>}\n\n <form onSubmit={formMethods.handleSubmit(onSubmit)}>\n {props.fields.map((field) => {\n const isRequired = field.required !== false;\n const validationStatus = getValidationClass(field.name);\n const register = formMethods.register(field.name as Path<T>, { required: isRequired });\n const inputProps: TextBoxProps = {\n iconProps: { color: Color.DarkGrey },\n icon: field.icon,\n inputProps: { disabled: isLoading },\n placeholder: field.label,\n wide: true,\n required: isRequired,\n validationStatus,\n ...register,\n };\n const renderCheckbox = () => (\n <div className=\"u-marg-top\" key={field.name}>\n <InputGroup dimensions=\"1\">\n <Checkbox label={field.label} {...register} />\n </InputGroup>\n </div>\n );\n\n const renderPhone = () => (\n <InputGroup dimensions=\"1\" key={field.name}>\n {E164PhoneNumberFieldFeature.isActive() ? (\n <Controller\n control={formMethods.control}\n name={field.name}\n rules={{\n required: {\n value: isRequired,\n message: t(Translation.Step.Confirmation.Inputs.Required, {\n field: t(Translation.Step.Confirmation.Inputs.Phone),\n }),\n },\n minLength: { value: 5, message: 'Phone number is required' },\n maxLength: { value: 17, message: 'Phone number is too long' },\n pattern: {\n value: /^[1-9]( |\\d){1,15}$/g,\n message: 'Incorrect phone number entered',\n },\n }}\n render={({ field: controllerField }) => (\n <EnhancedPhoneNumberField {...controllerField} {...register} validationStatus={validationStatus} />\n )}\n />\n ) : (\n <TextBox {...inputProps} />\n )}\n </InputGroup>\n );\n\n const renderTextInput = () => {\n return (\n <div className=\"u-marg-top u-marg-bottom\" key={field.name}>\n <InputGroup dimensions=\"1\">{field.isMasked ? <PasswordBox {...inputProps} /> : <TextBox {...inputProps} />}</InputGroup>\n\n {field.helperText && (\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {field.helperText}\n </Text>\n )}\n </div>\n );\n };\n\n if (field.type === ExternalMemberModelFieldType.CheckBox) {\n return renderCheckbox();\n }\n\n if (field.type === ExternalMemberModelFieldType.Phone) {\n return renderPhone();\n }\n\n return renderTextInput();\n })}\n\n <BEButton\n isLoading={isLoading}\n htmlType=\"submit\"\n className=\"u-marg-top external-member-modal-submit-btn\"\n size=\"normal\"\n filled\n primary={hotel?.memberOnlyModalUsePrimaryColor}\n success={!hotel?.memberOnlyModalUsePrimaryColor}\n stopIconAnimation\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n wide\n >\n {t(Translation.ExternalMemberPopup.Submit)}\n </BEButton>\n <div className=\"u-marg-top\">\n <Text bold color={Color.Danger}>\n {errorMessage}\n </Text>\n </div>\n </form>\n\n {memberOnlySignupLink && (\n <div className=\"external-member-modal-signup\">\n <div className=\"line-break\"></div>\n <div className=\"u-marg-top u-flex align-items-center u-justify-between\">\n <Text type={TextType.Small} className=\"u-flex align-items-center\" color={Color.DarkGrey}>\n {t(Translation.ExternalMemberPopup.DontHaveAccount)}\n </Text>\n <BEButton\n className=\"external-member-modal-signup-btn\"\n htmlType=\"button\"\n size=\"normal\"\n filled\n primary\n onClick={() => window.open(memberOnlySignupLink, '_blank')}\n >\n {t(Translation.ExternalMemberPopup.SignUp)}\n </BEButton>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </SimpleModal>\n );\n};\n\nexport default ExternalMemberModal;\n"]}
|
|
@@ -222,7 +222,7 @@ const RoomContactDetails = () => {
|
|
|
222
222
|
const requiredAuxiliaryInputs = [];
|
|
223
223
|
for (const [inputKey, input] of Object.entries((_b = roomGroup === null || roomGroup === void 0 ? void 0 : roomGroup.filters) !== null && _b !== void 0 ? _b : {})) {
|
|
224
224
|
const values = (_d = (_c = currentRoom === null || currentRoom === void 0 ? void 0 : currentRoom.auxiliaryValues) === null || _c === void 0 ? void 0 : _c[inputKey]) === null || _d === void 0 ? void 0 : _d.map((value) => value.toString());
|
|
225
|
-
let defaultAuxiliaryFilterSelect = filterValue === null || filterValue === void 0 ? void 0 : filterValue[inputKey];
|
|
225
|
+
let defaultAuxiliaryFilterSelect = (filterValue === null || filterValue === void 0 ? void 0 : filterValue[inputKey]) != null ? String(filterValue === null || filterValue === void 0 ? void 0 : filterValue[inputKey]) : undefined;
|
|
226
226
|
if ((input === null || input === void 0 ? void 0 : input.requireInput) && values) {
|
|
227
227
|
// Reduce available options to those assigned to the room
|
|
228
228
|
const options = input.options.filter((option) => {
|
|
@@ -232,7 +232,7 @@ const RoomContactDetails = () => {
|
|
|
232
232
|
});
|
|
233
233
|
const requiredInputId = `${(0, core_1.nameof)('AuxInputs')}.${inputKey}`;
|
|
234
234
|
if (options.length === 1) {
|
|
235
|
-
defaultAuxiliaryFilterSelect = options[0].value;
|
|
235
|
+
defaultAuxiliaryFilterSelect = String(options[0].value);
|
|
236
236
|
}
|
|
237
237
|
// Convert options to format acceptable by the input
|
|
238
238
|
const auxiliaryFilterOption = options
|
|
@@ -420,7 +420,6 @@ const RoomContactDetails = () => {
|
|
|
420
420
|
requiredAuxiliaryInputs.length > 0 && (react_1.default.createElement("div", { className: "rs-checkout-required-inputs u-marg-top" },
|
|
421
421
|
react_1.default.createElement("div", { className: "u-marg-top" },
|
|
422
422
|
react_1.default.createElement(InputGroup_1.default, { dimensions: "2/2" }, requiredAuxiliaryInputs.map((input) => {
|
|
423
|
-
const options = input.options;
|
|
424
423
|
return (react_1.default.createElement(react_hook_form_1.Controller, { key: input.id, control: control, name: padInputName(input.id), rules: { required: true }, defaultValue: input === null || input === void 0 ? void 0 : input.defaultValue, render: ({ field }) => {
|
|
425
424
|
const { ref } = field, rest = __rest(field, ["ref"]);
|
|
426
425
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|