@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.
Files changed (122) hide show
  1. package/dist/177.bundle.js +1 -1
  2. package/dist/219.bundle.js +2 -0
  3. package/dist/288.bundle.js +1 -1
  4. package/dist/291.bundle.js +1 -0
  5. package/dist/446.bundle.js +1 -1
  6. package/dist/449.bundle.js +1 -1
  7. package/dist/537.bundle.js +1 -1
  8. package/dist/596.bundle.js +1 -1
  9. package/dist/625.bundle.js +1 -1
  10. package/dist/836.bundle.js +1 -1
  11. package/dist/main.bundle.js +1 -1
  12. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js +6 -0
  13. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js.map +1 -1
  14. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.d.ts +22 -0
  15. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js +131 -0
  16. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js.map +1 -0
  17. package/dist/src/components/generic/HotelPerkVisual.d.ts +7 -0
  18. package/dist/src/components/generic/HotelPerkVisual.js +29 -0
  19. package/dist/src/components/generic/HotelPerkVisual.js.map +1 -0
  20. package/dist/src/components/generic/Portal/Portal.js +5 -1
  21. package/dist/src/components/generic/Portal/Portal.js.map +1 -1
  22. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.d.ts +2 -2
  23. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
  24. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.d.ts +4 -0
  25. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js +105 -30
  26. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js.map +1 -1
  27. package/dist/src/components/members/SignInModal/ExternalMemberModal.d.ts +9 -3
  28. package/dist/src/components/members/SignInModal/ExternalMemberModal.js +45 -6
  29. package/dist/src/components/members/SignInModal/ExternalMemberModal.js.map +1 -1
  30. package/dist/src/components/steps/date/BEPeoplePickerBlock.js +3 -1
  31. package/dist/src/components/steps/date/BEPeoplePickerBlock.js.map +1 -1
  32. package/dist/src/components/steps/hotel/HotelCard.js +3 -3
  33. package/dist/src/components/steps/hotel/HotelCard.js.map +1 -1
  34. package/dist/src/components/steps/hotel/HotelCardModal.js +3 -3
  35. package/dist/src/components/steps/hotel/HotelCardModal.js.map +1 -1
  36. package/dist/src/components/steps/hotel/HotelInfoPerksRow.js +3 -3
  37. package/dist/src/components/steps/hotel/HotelInfoPerksRow.js.map +1 -1
  38. package/dist/src/components/steps/room/LargeRoomCard.js +3 -3
  39. package/dist/src/components/steps/room/LargeRoomCard.js.map +1 -1
  40. package/dist/src/components/steps/room/RoomModalPerkRow.js +3 -3
  41. package/dist/src/components/steps/room/RoomModalPerkRow.js.map +1 -1
  42. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js +2 -0
  43. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js.map +1 -1
  44. package/dist/src/components/steps/room/roomDetails/RoomDetailsPerkBlock.js +3 -3
  45. package/dist/src/components/steps/room/roomDetails/RoomDetailsPerkBlock.js.map +1 -1
  46. package/dist/src/components/summary/BESummaryPerkBlock.js +3 -3
  47. package/dist/src/components/summary/BESummaryPerkBlock.js.map +1 -1
  48. package/dist/src/components/summary/BESummaryRoomRow.js.map +1 -1
  49. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +1 -1
  50. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  51. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +1 -0
  52. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  53. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.d.ts +10 -0
  54. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js +12 -0
  55. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js.map +1 -0
  56. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.d.ts +8 -0
  57. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js +13 -0
  58. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js.map +1 -0
  59. package/dist/src/contexts/index.d.ts +2 -0
  60. package/dist/src/contexts/index.js +2 -0
  61. package/dist/src/contexts/index.js.map +1 -1
  62. package/dist/src/engines/BaseEngine.d.ts +13 -0
  63. package/dist/src/engines/BaseEngine.js +32 -0
  64. package/dist/src/engines/BaseEngine.js.map +1 -1
  65. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js +1 -0
  66. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js.map +1 -1
  67. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js +3 -1
  68. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js.map +1 -1
  69. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js +1 -0
  70. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js.map +1 -1
  71. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +12 -10
  72. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  73. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js +1 -0
  74. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js.map +1 -1
  75. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js +11 -9
  76. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js.map +1 -1
  77. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js +1 -0
  78. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js.map +1 -1
  79. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +4 -2
  80. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
  81. package/dist/src/handlers/membership/SalesforceMemberHandler.js +1 -1
  82. package/dist/src/handlers/membership/SalesforceMemberHandler.js.map +1 -1
  83. package/dist/src/hooks/BodyClickHook.d.ts +2 -2
  84. package/dist/src/hooks/BodyClickHook.js +7 -3
  85. package/dist/src/hooks/BodyClickHook.js.map +1 -1
  86. package/dist/src/index.d.ts +1 -0
  87. package/dist/src/index.js +4 -2
  88. package/dist/src/index.js.map +1 -1
  89. package/dist/src/pages/findReservation/FindReservationResults.js +1 -1
  90. package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
  91. package/dist/src/pages/findReservation/ReservationRow.js +10 -9
  92. package/dist/src/pages/findReservation/ReservationRow.js.map +1 -1
  93. package/dist/src/pages/hotel/HotelInfo.js +7 -6
  94. package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
  95. package/dist/src/providers/RoomstayThemeEngine.js +7 -2
  96. package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
  97. package/dist/src/providers/ShadowDomManager.d.ts +21 -0
  98. package/dist/src/providers/ShadowDomManager.js +55 -0
  99. package/dist/src/providers/ShadowDomManager.js.map +1 -0
  100. package/dist/src/providers/StyleInjector.d.ts +42 -0
  101. package/dist/src/providers/StyleInjector.js +118 -0
  102. package/dist/src/providers/StyleInjector.js.map +1 -0
  103. package/dist/src/providers/storage/SessionProvider.js.map +1 -1
  104. package/dist/src/stories/EnhancedPhoneNumberField.stories.d.ts +1 -1
  105. package/dist/src/translations/Translation.d.ts +3 -0
  106. package/dist/src/translations/Translation.js +3 -0
  107. package/dist/src/translations/Translation.js.map +1 -1
  108. package/dist/src/translations/languages/en-gb.js +3 -0
  109. package/dist/src/translations/languages/en-gb.js.map +1 -1
  110. package/dist/src/util/Analytics/Analytics.js +1 -0
  111. package/dist/src/util/Analytics/Analytics.js.map +1 -1
  112. package/dist/test.bundle.js +1 -1
  113. package/dist/tests/offline/entry/config/hotelSpecDefault.js +13 -43
  114. package/dist/tests/offline/entry/config/hotelSpecDefault.js.map +1 -1
  115. package/dist/vendors.bundle.js +1 -1
  116. package/package.json +1 -1
  117. package/dist/326.bundle.js +0 -2
  118. package/dist/686.bundle.js +0 -1
  119. package/dist/src/util/HotelPerkHelper.d.ts +0 -3
  120. package/dist/src/util/HotelPerkHelper.js +0 -56
  121. package/dist/src/util/HotelPerkHelper.js.map +0 -1
  122. /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;IAEjF,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,4BAA4B,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEjF,OAAO,CACH,8BAAC,uCAAW,kBAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAM,gBAAgB,GAC9D,QAAQ,CACC,CACjB,CAAC;AACN,CAAC,CAAC;AAWK,MAAM,mBAAmB,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,GAAG,KAAK,EAA4B,EAAE,EAAE;IAC7I,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uCAAgB,GAAE,CAAC;IACrC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,IAAI,KAAK,KAAK,mCAAmB,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,CACH,uCAAK,SAAS,EAAE,mCAAM,CAAC,MAAM;QACxB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACT,8BAAC,kBAAQ,IAAC,OAAO,QAAC,MAAM,QAAC,OAAO,QAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,mCAAM,CAAC,GAAG,EAAE,mCAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,IACjH,QAAQ,IAAI,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CACpC,CACd,CAAC,CAAC,CAAC,CACA,0CAAW,CACd;QAED,8BAAC,kBAAQ,IAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,QAAC,OAAO,QAAC,MAAM,QAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,mCAAM,CAAC,GAAG,EAAE,mCAAM,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,IACvI,SAAS,IAAI,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CACrC,CACT,CACT,CAAC;AACN,CAAC,CAAC;AApBW,QAAA,mBAAmB,uBAoB9B;AAEK,MAAM,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAA6C,EAAE,EAAE;IACjG,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,uCAAgB,GAAE,CAAC;IAC7C,OAAO,CACH,uCAAK,SAAS,EAAE,mCAAM,CAAC,MAAM;QACzB,uCACI,SAAS,EAAE,IAAA,oBAAU,EAAC;gBAClB,CAAC,mCAAM,CAAC,KAAK,CAAC,EAAE,aAAa;aAChC,CAAC,IAED,KAAK,CACJ;QACN,8BAAC,SAAI,IAAC,IAAI,EAAE,aAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAC9C,CACT,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B;AAEF,kBAAe,wBAAwB,CAAC","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 { Translation } from '@/translations/Translation';\n\nimport BEButton from '../../BEButton';\nimport { EBookingWizardTheme } from '../BookingWizard';\nimport styles from '../BookingWizard.module.scss';\nimport { BookingWizardContext, useBookingWizard } from '../BookingWizardContext';\nconst BookingWizardBottomSheet: React.FC<BottomSheetProps> = (props) => {\n const { children, className, ...bottomSheetProps } = props;\n\n const { style, className: bwClassname } = React.useContext(BookingWizardContext);\n\n const classes = classNames('roomstay-booking-container', bwClassname, className);\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"]}
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,mFAA4E;AAC5E,4DAAyD;AAEzD,8DAAsC;AACtC,oDAAuD;AACvD,6FAAkD;AAClD,kEAAiF;AACjF,kFAAyF;AAEzF,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;IACjF,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,+BAAY,GAAE,CAAC;IAEvC,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,4BAA4B,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEjF,IAAI,WAAW,EAAE,CAAC;QACd,OAAO,CACH,8BAAC,8BAAoB,IACjB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAC3B,SAAS,EAAE,gBAAgB,CAAC,SAAS,EACrC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAC/B,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAC/B,UAAU,EAAE,gBAAgB,CAAC,UAAqD,EAClF,WAAW,EAAE,gBAAgB,CAAC,WAAuD,EACrF,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,IAElC,QAAQ,CACU,CAC1B,CAAC;IACN,CAAC;IAED,OAAO,CACH,8BAAC,uCAAW,kBAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAM,gBAAgB,GAC9D,QAAQ,CACC,CACjB,CAAC;AACN,CAAC,CAAC;AAWK,MAAM,mBAAmB,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,GAAG,KAAK,EAA4B,EAAE,EAAE;IAC7I,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uCAAgB,GAAE,CAAC;IACrC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,IAAI,KAAK,KAAK,mCAAmB,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,CACH,uCAAK,SAAS,EAAE,mCAAM,CAAC,MAAM;QACxB,CAAC,QAAQ,CAAC,CAAC,CAAC,CACT,8BAAC,kBAAQ,IAAC,OAAO,QAAC,MAAM,QAAC,OAAO,QAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,mCAAM,CAAC,GAAG,EAAE,mCAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,IACjH,QAAQ,IAAI,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CACpC,CACd,CAAC,CAAC,CAAC,CACA,0CAAW,CACd;QAED,8BAAC,kBAAQ,IAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,QAAC,OAAO,QAAC,MAAM,QAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAE,IAAA,oBAAU,EAAC,mCAAM,CAAC,GAAG,EAAE,mCAAM,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,IACvI,SAAS,IAAI,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CACrC,CACT,CACT,CAAC;AACN,CAAC,CAAC;AApBW,QAAA,mBAAmB,uBAoB9B;AAEK,MAAM,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAA6C,EAAE,EAAE;IACjG,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,uCAAgB,GAAE,CAAC;IAC7C,OAAO,CACH,uCAAK,SAAS,EAAE,mCAAM,CAAC,MAAM;QACzB,uCACI,SAAS,EAAE,IAAA,oBAAU,EAAC;gBAClB,CAAC,mCAAM,CAAC,KAAK,CAAC,EAAE,aAAa;aAChC,CAAC,IAED,KAAK,CACJ;QACN,8BAAC,SAAI,IAAC,IAAI,EAAE,aAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAI,CAC9C,CACT,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B;AAEF,kBAAe,wBAAwB,CAAC","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"]}
@@ -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;
@@ -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
- return (0, react_dom_1.createPortal)(react_1.default.createElement("div", { className: 'roomstay-booking-container' + (props.preventZIndex ? ' --no-z' : '') }, props.children), props.target);
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;AASlC,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAE,EAAE;IACzD,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,KAAK,CAAC,MAAM,CAAC,CAAC;AACrJ,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB","sourcesContent":["import React, { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ntype RoomstayPortalProps = {\n target: HTMLElement;\n children: ReactNode | ReactNode[];\n\n preventZIndex?: boolean;\n};\n\nexport const RoomstayPortal = (props: RoomstayPortalProps) => {\n return createPortal(<div className={'roomstay-booking-container' + (props.preventZIndex ? ' --no-z' : '')}>{props.children}</div>, props.target);\n};\n"]}
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"]}
@@ -1,11 +1,11 @@
1
1
  import './EnhancedPhoneNumberField.global.scss';
2
2
  import React, { ChangeEvent, PropsWithChildren } from 'react';
3
- export interface EnhancedPhoneNumberField extends PropsWithChildren<any> {
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<EnhancedPhoneNumberField>, keyof EnhancedPhoneNumberField> & React.RefAttributes<HTMLInputElement>>;
10
+ declare const _default: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<EnhancedPhoneNumberFieldProps>, keyof EnhancedPhoneNumberFieldProps> & React.RefAttributes<HTMLInputElement>>;
11
11
  export default _default;
@@ -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 = __importDefault(require("./ExternalMemberModal"));
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
- return (react_1.default.createElement(ExternalMemberModal_1.default, Object.assign({}, props, { fields: [
26
- {
27
- name: 'memberNumber',
28
- icon: Icon_1.IconType.Star,
29
- label: t(Translation_1.Translation.ExternalMemberPopup.Fields.MemberNumber),
30
- isMasked: false,
31
- required: isMemberNumberRequired,
32
- helperText: !isMemberNumberRequired ? t(Translation_1.Translation.ExternalMemberPopup.Fields.MemberNumberOptionalBenefits) : undefined,
33
- },
34
- {
35
- name: 'firstName',
36
- icon: Icon_1.IconType.Person,
37
- label: t(Translation_1.Translation.Navigation.SignUp.Inputs.FirstName),
38
- isMasked: false,
39
- },
40
- {
41
- name: 'lastName',
42
- icon: Icon_1.IconType.Person,
43
- label: t(Translation_1.Translation.Navigation.SignUp.Inputs.LastName),
44
- isMasked: false,
45
- },
46
- {
47
- name: 'email',
48
- icon: Icon_1.IconType.Email,
49
- label: t(Translation_1.Translation.Navigation.SignIn.EmailAddress),
50
- isMasked: false,
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":";;;;;;;;;;;;;;;;AACA,kDAAkC;AAClC,iDAA+C;AAE/C,yDAA0D;AAC1D,4DAAyD;AAEzD,gFAAoF;AAMpF,MAAM,2BAA2B,GAAyC,CAAC,EAA2C,EAAE,EAAE;QAA/C,EAAE,sBAAsB,GAAG,IAAI,OAAY,EAAP,KAAK,cAAzC,0BAA2C,CAAF;IAChH,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,OAAO,CACH,8BAAC,6BAAmB,oBACZ,KAAK,IACT,MAAM,EAAE;YACJ;gBACI,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,eAAQ,CAAC,IAAI;gBACnB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7D,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,sBAAsB;gBAChC,UAAU,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,SAAS;aAC3H;YACD;gBACI,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,eAAQ,CAAC,MAAM;gBACrB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;gBACxD,QAAQ,EAAE,KAAK;aAClB;YACD;gBACI,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,eAAQ,CAAC,MAAM;gBACrB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACvD,QAAQ,EAAE,KAAK;aAClB;YACD;gBACI,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,eAAQ,CAAC,KAAK;gBACpB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;gBACpD,QAAQ,EAAE,KAAK;aAClB;SACJ,IACH,CACL,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,2BAA2B,CAAC","sourcesContent":["import { IMemberVerification } from '@roomstay/core';\nimport React, { FC } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport { Translation } from '@/translations/Translation';\n\nimport ExternalMemberModal, { CommonMemberModalProps } from './ExternalMemberModal';\n\ntype EmailAndFullnameMemberModalProps = CommonMemberModalProps & {\n isMemberNumberRequired?: boolean;\n};\n\nconst EmailAndFullnameMemberModal: FC<EmailAndFullnameMemberModalProps> = ({ isMemberNumberRequired = true, ...props }) => {\n const { t } = useTranslation();\n\n return (\n <ExternalMemberModal<IMemberVerification>\n {...props}\n fields={[\n {\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 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 );\n};\n\nexport default EmailAndFullnameMemberModal;\n"]}
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
- type ExternalMemberModelField<T extends FieldValues> = {
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: boolean;
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;