@roomstay/frontend 2.10.0 → 2.10.1-0
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/449.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/HotelPerkVisual.d.ts +7 -0
- package/dist/src/components/generic/HotelPerkVisual.js +29 -0
- package/dist/src/components/generic/HotelPerkVisual.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/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/date/BEPeoplePickerBlock.js +3 -1
- package/dist/src/components/steps/date/BEPeoplePickerBlock.js.map +1 -1
- package/dist/src/components/steps/hotel/HotelCard.js +3 -3
- package/dist/src/components/steps/hotel/HotelCard.js.map +1 -1
- package/dist/src/components/steps/hotel/HotelCardModal.js +3 -3
- package/dist/src/components/steps/hotel/HotelCardModal.js.map +1 -1
- package/dist/src/components/steps/hotel/HotelInfoPerksRow.js +3 -3
- package/dist/src/components/steps/hotel/HotelInfoPerksRow.js.map +1 -1
- package/dist/src/components/steps/room/LargeRoomCard.js +3 -3
- package/dist/src/components/steps/room/LargeRoomCard.js.map +1 -1
- package/dist/src/components/steps/room/RoomModalPerkRow.js +3 -3
- package/dist/src/components/steps/room/RoomModalPerkRow.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/steps/room/roomDetails/RoomDetailsPerkBlock.js +3 -3
- package/dist/src/components/steps/room/roomDetails/RoomDetailsPerkBlock.js.map +1 -1
- package/dist/src/components/summary/BESummaryPerkBlock.js +3 -3
- package/dist/src/components/summary/BESummaryPerkBlock.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/index.d.ts +1 -0
- package/dist/src/index.js +4 -2
- package/dist/src/index.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/test.bundle.js +1 -1
- package/dist/tests/offline/entry/config/hotelSpecDefault.js +13 -43
- package/dist/tests/offline/entry/config/hotelSpecDefault.js.map +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/src/util/HotelPerkHelper.d.ts +0 -3
- package/dist/src/util/HotelPerkHelper.js +0 -56
- package/dist/src/util/HotelPerkHelper.js.map +0 -1
- /package/dist/{326.bundle.js.LICENSE.txt → 219.bundle.js.LICENSE.txt} +0 -0
|
@@ -20,15 +20,21 @@ const classnames_1 = __importDefault(require("classnames"));
|
|
|
20
20
|
const react_1 = __importDefault(require("react"));
|
|
21
21
|
const react_i18next_1 = require("react-i18next");
|
|
22
22
|
const react_spring_bottom_sheet_1 = require("react-spring-bottom-sheet");
|
|
23
|
+
const ShadowDomContext_1 = require("../../../../contexts/ShadowDomContext/ShadowDomContext");
|
|
23
24
|
const Translation_1 = require("../../../../translations/Translation");
|
|
24
25
|
const BEButton_1 = __importDefault(require("../../BEButton"));
|
|
25
26
|
const BookingWizard_1 = require("../BookingWizard");
|
|
26
27
|
const BookingWizard_module_scss_1 = __importDefault(require("../BookingWizard.module.scss"));
|
|
27
28
|
const BookingWizardContext_1 = require("../BookingWizardContext");
|
|
29
|
+
const ShadowDomBottomSheet_1 = __importDefault(require("./ShadowDomBottomSheet"));
|
|
28
30
|
const BookingWizardBottomSheet = (props) => {
|
|
29
31
|
const { children, className } = props, bottomSheetProps = __rest(props, ["children", "className"]);
|
|
30
32
|
const { style, className: bwClassname } = react_1.default.useContext(BookingWizardContext_1.BookingWizardContext);
|
|
33
|
+
const { isShadowDom } = (0, ShadowDomContext_1.useShadowDom)();
|
|
31
34
|
const classes = (0, classnames_1.default)('roomstay-booking-container', bwClassname, className);
|
|
35
|
+
if (isShadowDom) {
|
|
36
|
+
return (react_1.default.createElement(ShadowDomBottomSheet_1.default, { className: classes, style: style, open: bottomSheetProps.open, onDismiss: bottomSheetProps.onDismiss, header: bottomSheetProps.header, footer: bottomSheetProps.footer, snapPoints: bottomSheetProps.snapPoints, defaultSnap: bottomSheetProps.defaultSnap, blocking: bottomSheetProps.blocking }, children));
|
|
37
|
+
}
|
|
32
38
|
return (react_1.default.createElement(react_spring_bottom_sheet_1.BottomSheet, Object.assign({ className: classes, style: style }, bottomSheetProps), children));
|
|
33
39
|
};
|
|
34
40
|
const BWBottomSheetFooter = ({ onPrev, onNext, hidePrev = false, preLabel, nextLabel, disabledNext = false }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookingWizardBottomSheet.js","sourceRoot":"/","sources":["src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAA8C;AAC9C,4DAAoC;AACpC,kDAAyC;AACzC,iDAA+C;AAC/C,yEAA0E;AAE1E,4DAAyD;AAEzD,8DAAsC;AACtC,oDAAuD;AACvD,6FAAkD;AAClD,kEAAiF;AACjF,MAAM,wBAAwB,GAA+B,CAAC,KAAK,EAAE,EAAE;IACnE,MAAM,EAAE,QAAQ,EAAE,SAAS,KAA0B,KAAK,EAA1B,gBAAgB,UAAK,KAAK,EAApD,yBAA4C,CAAQ,CAAC;IAE3D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,eAAK,CAAC,UAAU,CAAC,2CAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"BookingWizardBottomSheet.js","sourceRoot":"/","sources":["src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Icon, IconType } from '@roomstay/ui';\nimport classNames from 'classnames';\nimport React, { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { BottomSheet, BottomSheetProps } from 'react-spring-bottom-sheet';\n\nimport { useShadowDom } from '@/contexts/ShadowDomContext/ShadowDomContext';\nimport { Translation } from '@/translations/Translation';\n\nimport BEButton from '../../BEButton';\nimport { EBookingWizardTheme } from '../BookingWizard';\nimport styles from '../BookingWizard.module.scss';\nimport { BookingWizardContext, useBookingWizard } from '../BookingWizardContext';\nimport ShadowDomBottomSheet, { ShadowDomBottomSheetProps } from './ShadowDomBottomSheet';\n\nconst BookingWizardBottomSheet: React.FC<BottomSheetProps> = (props) => {\n const { children, className, ...bottomSheetProps } = props;\n\n const { style, className: bwClassname } = React.useContext(BookingWizardContext);\n const { isShadowDom } = useShadowDom();\n\n const classes = classNames('roomstay-booking-container', bwClassname, className);\n\n if (isShadowDom) {\n return (\n <ShadowDomBottomSheet\n className={classes}\n style={style}\n open={bottomSheetProps.open}\n onDismiss={bottomSheetProps.onDismiss}\n header={bottomSheetProps.header}\n footer={bottomSheetProps.footer}\n snapPoints={bottomSheetProps.snapPoints as ShadowDomBottomSheetProps['snapPoints']}\n defaultSnap={bottomSheetProps.defaultSnap as ShadowDomBottomSheetProps['defaultSnap']}\n blocking={bottomSheetProps.blocking}\n >\n {children}\n </ShadowDomBottomSheet>\n );\n }\n\n return (\n <BottomSheet className={classes} style={style} {...bottomSheetProps}>\n {children}\n </BottomSheet>\n );\n};\n\ninterface BWBottomSheetFooterProps {\n onPrev?: () => void;\n onNext?: () => void;\n hidePrev?: boolean;\n preLabel?: string; // defaults to \"Back\"\n nextLabel?: string; // defaults to \"Next\"\n disabledNext?: boolean;\n}\n\nexport const BWBottomSheetFooter = ({ onPrev, onNext, hidePrev = false, preLabel, nextLabel, disabledNext = false }: BWBottomSheetFooterProps) => {\n const { theme } = useBookingWizard();\n const { t } = useTranslation();\n if (theme !== EBookingWizardTheme.Images) return null;\n\n return (\n <div className={styles.footer}>\n {!hidePrev ? (\n <BEButton rounded isText primary size=\"small\" className={classNames(styles.btn, styles['btn-cancel'])} onClick={onPrev}>\n {preLabel || t(Translation.Navigation.Back)}\n </BEButton>\n ) : (\n <div></div>\n )}\n\n <BEButton disabled={disabledNext} rounded primary filled size=\"small\" className={classNames(styles.btn, styles['btn-next'])} onClick={onNext}>\n {nextLabel || t(Translation.Navigation.Next)}\n </BEButton>\n </div>\n );\n};\n\nexport const BWBottomSheetHeader = ({ title, onClose }: { title: ReactNode; onClose: () => void }) => {\n const { isImagesTheme } = useBookingWizard();\n return (\n <div className={styles.header}>\n <div\n className={classNames({\n [styles.title]: isImagesTheme,\n })}\n >\n {title}\n </div>\n <Icon icon={IconType.Close} onClick={onClose} />\n </div>\n );\n};\n\nexport default BookingWizardBottomSheet;\n"]}
|
package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
export interface ShadowDomBottomSheetProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
onDismiss?: () => void;
|
|
6
|
+
header?: ReactNode | false;
|
|
7
|
+
footer?: ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
snapPoints?: (props: any) => number[] | number;
|
|
11
|
+
defaultSnap?: number | ((props: any) => number);
|
|
12
|
+
blocking?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal
|
|
16
|
+
* instead of portaling to document.body (which react-spring-bottom-sheet does).
|
|
17
|
+
*
|
|
18
|
+
* Provides slide-up animation, backdrop, dismiss on outside click,
|
|
19
|
+
* and basic snap point support (min-height vs full-height).
|
|
20
|
+
*/
|
|
21
|
+
declare const ShadowDomBottomSheet: React.FC<ShadowDomBottomSheetProps>;
|
|
22
|
+
export default ShadowDomBottomSheet;
|
package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
40
|
+
const react_1 = __importStar(require("react"));
|
|
41
|
+
const Portal_1 = require("../../Portal/Portal");
|
|
42
|
+
/**
|
|
43
|
+
* A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal
|
|
44
|
+
* instead of portaling to document.body (which react-spring-bottom-sheet does).
|
|
45
|
+
*
|
|
46
|
+
* Provides slide-up animation, backdrop, dismiss on outside click,
|
|
47
|
+
* and basic snap point support (min-height vs full-height).
|
|
48
|
+
*/
|
|
49
|
+
const ShadowDomBottomSheet = ({ open, children, onDismiss, header, footer, className, style, snapPoints, blocking = true }) => {
|
|
50
|
+
const [visible, setVisible] = (0, react_1.useState)(false);
|
|
51
|
+
const [animating, setAnimating] = (0, react_1.useState)(false);
|
|
52
|
+
const sheetRef = (0, react_1.useRef)(null);
|
|
53
|
+
const contentRef = (0, react_1.useRef)(null);
|
|
54
|
+
// Determine target height from snapPoints
|
|
55
|
+
const getTargetHeight = (0, react_1.useCallback)(() => {
|
|
56
|
+
if (!snapPoints)
|
|
57
|
+
return 'auto';
|
|
58
|
+
const maxHeight = window.innerHeight;
|
|
59
|
+
const result = snapPoints({ maxHeight, minHeight: 0 });
|
|
60
|
+
const points = Array.isArray(result) ? result : [result];
|
|
61
|
+
const maxSnap = Math.max(...points);
|
|
62
|
+
if (maxSnap >= maxHeight * 0.9)
|
|
63
|
+
return '100vh';
|
|
64
|
+
return 'auto';
|
|
65
|
+
}, [snapPoints]);
|
|
66
|
+
(0, react_1.useEffect)(() => {
|
|
67
|
+
if (open) {
|
|
68
|
+
setVisible(true);
|
|
69
|
+
// Trigger animation on next frame
|
|
70
|
+
requestAnimationFrame(() => {
|
|
71
|
+
requestAnimationFrame(() => setAnimating(true));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
setAnimating(false);
|
|
76
|
+
const timer = setTimeout(() => setVisible(false), 300);
|
|
77
|
+
return () => clearTimeout(timer);
|
|
78
|
+
}
|
|
79
|
+
}, [open]);
|
|
80
|
+
// Close on Escape
|
|
81
|
+
(0, react_1.useEffect)(() => {
|
|
82
|
+
if (!open)
|
|
83
|
+
return;
|
|
84
|
+
const handleKeyDown = (e) => {
|
|
85
|
+
if (e.key === 'Escape')
|
|
86
|
+
onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
|
|
87
|
+
};
|
|
88
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
89
|
+
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
90
|
+
}, [open, onDismiss]);
|
|
91
|
+
const handleBackdropClick = (0, react_1.useCallback)(() => {
|
|
92
|
+
if (blocking)
|
|
93
|
+
onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
|
|
94
|
+
}, [blocking, onDismiss]);
|
|
95
|
+
if (!visible)
|
|
96
|
+
return null;
|
|
97
|
+
const targetHeight = getTargetHeight();
|
|
98
|
+
const isFullHeight = targetHeight === '100vh';
|
|
99
|
+
return (react_1.default.createElement(Portal_1.RoomstayPortal, { target: document.body },
|
|
100
|
+
react_1.default.createElement("div", { style: {
|
|
101
|
+
position: 'fixed',
|
|
102
|
+
inset: 0,
|
|
103
|
+
zIndex: 999,
|
|
104
|
+
backgroundColor: 'rgba(0, 0, 0, 0.5)',
|
|
105
|
+
opacity: animating ? 1 : 0,
|
|
106
|
+
transition: 'opacity 300ms ease',
|
|
107
|
+
pointerEvents: blocking ? 'auto' : 'none',
|
|
108
|
+
}, onClick: handleBackdropClick }),
|
|
109
|
+
react_1.default.createElement("div", { ref: sheetRef, className: (0, classnames_1.default)(className), style: Object.assign({ position: 'fixed', bottom: 0, left: 0, right: 0, zIndex: 1000, backgroundColor: 'white', borderRadius: isFullHeight ? '0' : '16px 16px 0 0', boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.15)', transform: animating ? 'translateY(0)' : 'translateY(100%)', transition: 'transform 300ms cubic-bezier(0.32, 0.72, 0, 1)', maxHeight: isFullHeight ? '100vh' : '85vh', display: 'flex', flexDirection: 'column' }, style) },
|
|
110
|
+
header !== false && (react_1.default.createElement("div", { style: {
|
|
111
|
+
display: 'flex',
|
|
112
|
+
justifyContent: 'center',
|
|
113
|
+
padding: '8px 0 0',
|
|
114
|
+
flexShrink: 0,
|
|
115
|
+
} },
|
|
116
|
+
react_1.default.createElement("div", { style: {
|
|
117
|
+
width: 36,
|
|
118
|
+
height: 4,
|
|
119
|
+
borderRadius: 2,
|
|
120
|
+
backgroundColor: '#dfe1e5',
|
|
121
|
+
} }))),
|
|
122
|
+
header && header !== false && react_1.default.createElement("div", { style: { flexShrink: 0 } }, header),
|
|
123
|
+
react_1.default.createElement("div", { ref: contentRef, style: {
|
|
124
|
+
flex: 1,
|
|
125
|
+
overflowY: 'auto',
|
|
126
|
+
WebkitOverflowScrolling: 'touch',
|
|
127
|
+
} }, children),
|
|
128
|
+
footer && react_1.default.createElement("div", { style: { flexShrink: 0 } }, footer))));
|
|
129
|
+
};
|
|
130
|
+
exports.default = ShadowDomBottomSheet;
|
|
131
|
+
//# sourceMappingURL=ShadowDomBottomSheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShadowDomBottomSheet.js","sourceRoot":"/","sources":["src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.tsx"],"names":[],"mappings":"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","sourcesContent":["import classNames from 'classnames';\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { RoomstayPortal } from '../../Portal/Portal';\n\nexport interface ShadowDomBottomSheetProps {\n open: boolean;\n children: ReactNode;\n onDismiss?: () => void;\n header?: ReactNode | false;\n footer?: ReactNode;\n className?: string;\n style?: React.CSSProperties;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n snapPoints?: (props: any) => number[] | number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultSnap?: number | ((props: any) => number);\n blocking?: boolean;\n}\n\n/**\n * A Shadow DOM-compatible bottom sheet that renders via RoomstayPortal\n * instead of portaling to document.body (which react-spring-bottom-sheet does).\n *\n * Provides slide-up animation, backdrop, dismiss on outside click,\n * and basic snap point support (min-height vs full-height).\n */\nconst ShadowDomBottomSheet: React.FC<ShadowDomBottomSheetProps> = ({ open, children, onDismiss, header, footer, className, style, snapPoints, blocking = true }) => {\n const [visible, setVisible] = useState(false);\n const [animating, setAnimating] = useState(false);\n const sheetRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Determine target height from snapPoints\n const getTargetHeight = useCallback((): string => {\n if (!snapPoints) return 'auto';\n\n const maxHeight = window.innerHeight;\n const result = snapPoints({ maxHeight, minHeight: 0 });\n const points = Array.isArray(result) ? result : [result];\n const maxSnap = Math.max(...points);\n\n if (maxSnap >= maxHeight * 0.9) return '100vh';\n return 'auto';\n }, [snapPoints]);\n\n useEffect(() => {\n if (open) {\n setVisible(true);\n // Trigger animation on next frame\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setAnimating(true));\n });\n } else {\n setAnimating(false);\n const timer = setTimeout(() => setVisible(false), 300);\n return () => clearTimeout(timer);\n }\n }, [open]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onDismiss?.();\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [open, onDismiss]);\n\n const handleBackdropClick = useCallback(() => {\n if (blocking) onDismiss?.();\n }, [blocking, onDismiss]);\n\n if (!visible) return null;\n\n const targetHeight = getTargetHeight();\n const isFullHeight = targetHeight === '100vh';\n\n return (\n <RoomstayPortal target={document.body}>\n {/* Backdrop */}\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 999,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n opacity: animating ? 1 : 0,\n transition: 'opacity 300ms ease',\n pointerEvents: blocking ? 'auto' : 'none',\n }}\n onClick={handleBackdropClick}\n />\n\n {/* Sheet */}\n <div\n ref={sheetRef}\n className={classNames(className)}\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 1000,\n backgroundColor: 'white',\n borderRadius: isFullHeight ? '0' : '16px 16px 0 0',\n boxShadow: '0 -4px 20px rgba(0, 0, 0, 0.15)',\n transform: animating ? 'translateY(0)' : 'translateY(100%)',\n transition: 'transform 300ms cubic-bezier(0.32, 0.72, 0, 1)',\n maxHeight: isFullHeight ? '100vh' : '85vh',\n display: 'flex',\n flexDirection: 'column',\n ...style,\n }}\n >\n {/* Drag handle */}\n {header !== false && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n padding: '8px 0 0',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n width: 36,\n height: 4,\n borderRadius: 2,\n backgroundColor: '#dfe1e5',\n }}\n />\n </div>\n )}\n\n {/* Header */}\n {header && header !== false && <div style={{ flexShrink: 0 }}>{header}</div>}\n\n {/* Scrollable content */}\n <div\n ref={contentRef}\n style={{\n flex: 1,\n overflowY: 'auto',\n WebkitOverflowScrolling: 'touch',\n }}\n >\n {children}\n </div>\n\n {/* Footer */}\n {footer && <div style={{ flexShrink: 0 }}>{footer}</div>}\n </div>\n </RoomstayPortal>\n );\n};\n\nexport default ShadowDomBottomSheet;\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { HotelPerk } from '../../models/Client/Hotel/HotelPerk';
|
|
3
|
+
import { Color } from '../../util/Color';
|
|
4
|
+
export declare const HotelPerkVisual: ({ perk, iconBackgroundColor }: {
|
|
5
|
+
perk: HotelPerk;
|
|
6
|
+
iconBackgroundColor?: Color;
|
|
7
|
+
}) => ReactElement | null;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HotelPerkVisual = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const Icon_1 = __importDefault(require("./Icon/Icon"));
|
|
9
|
+
const HotelPerkVisual = ({ perk, iconBackgroundColor }) => {
|
|
10
|
+
if (perk.iconElement) {
|
|
11
|
+
return perk.iconElement;
|
|
12
|
+
}
|
|
13
|
+
if (perk.icon) {
|
|
14
|
+
return react_1.default.createElement(Icon_1.default, { icon: perk.icon, backgroundColor: iconBackgroundColor });
|
|
15
|
+
}
|
|
16
|
+
if (perk.image) {
|
|
17
|
+
// The image is a hosted, cross-origin SVG asset (content-type: image/svg+xml), e.g.
|
|
18
|
+
// https://scdn.app.roomstay.io/05385c74-f380-4b33-a677-8f7f417ee267
|
|
19
|
+
// The asset hardcodes its own fill, and <img>/<object> render it in an isolated
|
|
20
|
+
// cross-origin document that this page's CSS/JS can't touch (and fetch-to-inline is
|
|
21
|
+
// CORS-blocked). Using it as a CSS mask is the only way to recolour it: the asset
|
|
22
|
+
// supplies the shape and `background-color` paints it. Masks need no CORS.
|
|
23
|
+
const maskUrl = `url("${perk.image}")`;
|
|
24
|
+
return react_1.default.createElement("span", { className: "perk-icon-mask", role: "img", "aria-label": perk.name, style: { maskImage: maskUrl, WebkitMaskImage: maskUrl } });
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
};
|
|
28
|
+
exports.HotelPerkVisual = HotelPerkVisual;
|
|
29
|
+
//# sourceMappingURL=HotelPerkVisual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HotelPerkVisual.js","sourceRoot":"/","sources":["src/components/generic/HotelPerkVisual.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA4C;AAE5C,0EAAgE;AAIzD,MAAM,eAAe,GAAG,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAoD,EAAuB,EAAE;IACpI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,8BAAC,cAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAgB,EAAE,eAAe,EAAE,mBAAmB,GAAI,CAAC;IACvF,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,oFAAoF;QACpF,uEAAuE;QACvE,gFAAgF;QAChF,oFAAoF;QACpF,kFAAkF;QAClF,2EAA2E;QAC3E,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;QACvC,OAAO,wCAAM,SAAS,EAAC,gBAAgB,EAAC,IAAI,EAAC,KAAK,gBAAa,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,GAAI,CAAC;IAC1I,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AArBW,QAAA,eAAe,mBAqB1B","sourcesContent":["import React, { ReactElement } from 'react';\n\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport { Color } from '@/util/Color';\n\nexport const HotelPerkVisual = ({ perk, iconBackgroundColor }: { perk: HotelPerk; iconBackgroundColor?: Color }): ReactElement | null => {\n if (perk.iconElement) {\n return perk.iconElement;\n }\n\n if (perk.icon) {\n return <Icon icon={perk.icon as IconType} backgroundColor={iconBackgroundColor} />;\n }\n\n if (perk.image) {\n // The image is a hosted, cross-origin SVG asset (content-type: image/svg+xml), e.g.\n // https://scdn.app.roomstay.io/05385c74-f380-4b33-a677-8f7f417ee267\n // The asset hardcodes its own fill, and <img>/<object> render it in an isolated\n // cross-origin document that this page's CSS/JS can't touch (and fetch-to-inline is\n // CORS-blocked). Using it as a CSS mask is the only way to recolour it: the asset\n // supplies the shape and `background-color` paints it. Masks need no CORS.\n const maskUrl = `url(\"${perk.image}\")`;\n return <span className=\"perk-icon-mask\" role=\"img\" aria-label={perk.name} style={{ maskImage: maskUrl, WebkitMaskImage: maskUrl }} />;\n }\n\n return null;\n};\n"]}
|
|
@@ -6,8 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.RoomstayPortal = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const react_dom_1 = require("react-dom");
|
|
9
|
+
const ShadowDomContext_1 = require("../../../contexts/ShadowDomContext/ShadowDomContext");
|
|
9
10
|
const RoomstayPortal = (props) => {
|
|
10
|
-
|
|
11
|
+
const { isShadowDom, portalTarget } = (0, ShadowDomContext_1.useShadowDom)();
|
|
12
|
+
// If target is document.body and we're in Shadow DOM, redirect to shadow root container
|
|
13
|
+
const effectiveTarget = props.target === document.body && isShadowDom ? portalTarget : props.target;
|
|
14
|
+
return (0, react_dom_1.createPortal)(react_1.default.createElement("div", { className: 'roomstay-booking-container' + (props.preventZIndex ? ' --no-z' : '') }, props.children), effectiveTarget);
|
|
11
15
|
};
|
|
12
16
|
exports.RoomstayPortal = RoomstayPortal;
|
|
13
17
|
//# sourceMappingURL=Portal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Portal.js","sourceRoot":"/","sources":["src/components/generic/Portal/Portal.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyC;AACzC,yCAAyC;
|
|
1
|
+
{"version":3,"file":"Portal.js","sourceRoot":"/","sources":["src/components/generic/Portal/Portal.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyC;AACzC,yCAAyC;AAEzC,mFAA4E;AASrE,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAE,EAAE;IACzD,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAA,+BAAY,GAAE,CAAC;IAErD,wFAAwF;IACxF,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAEpG,OAAO,IAAA,wBAAY,EAAC,uCAAK,SAAS,EAAE,4BAA4B,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAG,KAAK,CAAC,QAAQ,CAAO,EAAE,eAAe,CAAC,CAAC;AACxJ,CAAC,CAAC;AAPW,QAAA,cAAc,kBAOzB","sourcesContent":["import React, { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useShadowDom } from '@/contexts/ShadowDomContext/ShadowDomContext';\n\ntype RoomstayPortalProps = {\n target: HTMLElement;\n children: ReactNode | ReactNode[];\n\n preventZIndex?: boolean;\n};\n\nexport const RoomstayPortal = (props: RoomstayPortalProps) => {\n const { isShadowDom, portalTarget } = useShadowDom();\n\n // If target is document.body and we're in Shadow DOM, redirect to shadow root container\n const effectiveTarget = props.target === document.body && isShadowDom ? portalTarget : props.target;\n\n return createPortal(<div className={'roomstay-booking-container' + (props.preventZIndex ? ' --no-z' : '')}>{props.children}</div>, effectiveTarget);\n};\n"]}
|
package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import './EnhancedPhoneNumberField.global.scss';
|
|
2
2
|
import React, { ChangeEvent, PropsWithChildren } from 'react';
|
|
3
|
-
export interface
|
|
3
|
+
export interface EnhancedPhoneNumberFieldProps extends PropsWithChildren<any> {
|
|
4
4
|
validationStatus?: 'success' | 'error';
|
|
5
5
|
name?: string;
|
|
6
6
|
value?: string;
|
|
7
7
|
onChange?: (e: ChangeEvent<HTMLInputElement>) => void;
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
}
|
|
10
|
-
declare const _default: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<
|
|
10
|
+
declare const _default: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<EnhancedPhoneNumberFieldProps>, keyof EnhancedPhoneNumberFieldProps> & React.RefAttributes<HTMLInputElement>>;
|
|
11
11
|
export default _default;
|
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 { useCurrentHotel } from '@frontend/hooks';\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 { hotel } = useCurrentHotel();\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 defaultCountryCode = hotel?.countryCode || organizedCountries[0].phone;\n const [prefix, number] = value?.split(PHONE_AND_PREFIX_SPLIT) ?? [];\n const codeToFind = prefix || defaultCountryCode;\n\n const selectedCountry = organizedCountries.find(({ phone }) => phone === codeToFind) ?? organizedCountries[0];\n\n return [selectedCountry, number ?? ''];\n }, [value, organizedCountries, hotel?.countryCode]);\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 { useCurrentHotel } from '@frontend/hooks';\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 EnhancedPhoneNumberFieldProps 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, EnhancedPhoneNumberFieldProps> = (props, ref) => {\n const { hotel } = useCurrentHotel();\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 defaultCountryCode = hotel?.countryCode || organizedCountries[0].phone;\n const [prefix, number] = value?.split(PHONE_AND_PREFIX_SPLIT) ?? [];\n const codeToFind = prefix || defaultCountryCode;\n\n const selectedCountry = organizedCountries.find(({ phone }) => phone === codeToFind) ?? organizedCountries[0];\n\n return [selectedCountry, number ?? ''];\n }, [value, organizedCountries, hotel?.countryCode]);\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<EnhancedPhoneNumberFieldProps>>(EnhancedPhoneNumberField);\n"]}
|
|
@@ -2,6 +2,10 @@ import { FC } from 'react';
|
|
|
2
2
|
import { CommonMemberModalProps } from './ExternalMemberModal';
|
|
3
3
|
type EmailAndFullnameMemberModalProps = CommonMemberModalProps & {
|
|
4
4
|
isMemberNumberRequired?: boolean;
|
|
5
|
+
enableMemberNumber?: boolean;
|
|
6
|
+
enablePostcode?: boolean;
|
|
7
|
+
enableMobilePhone?: boolean;
|
|
8
|
+
enableMarketingOptIn?: boolean;
|
|
5
9
|
};
|
|
6
10
|
declare const EmailAndFullnameMemberModal: FC<EmailAndFullnameMemberModalProps>;
|
|
7
11
|
export default EmailAndFullnameMemberModal;
|
|
@@ -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;
|