@roomstay/frontend 2.6.30 → 2.6.32

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 (150) hide show
  1. package/dist/166.bundle.js +1 -1
  2. package/dist/279.bundle.js +1 -1
  3. package/dist/370.bundle.js +1 -1
  4. package/dist/449.bundle.js +1 -1
  5. package/dist/586.bundle.js +1 -1
  6. package/dist/736.bundle.js +1 -1
  7. package/dist/873.bundle.js +1 -1
  8. package/dist/903.bundle.js +1 -1
  9. package/dist/927.bundle.js +1 -1
  10. package/dist/972.bundle.js +1 -1
  11. package/dist/978.bundle.js +1 -1
  12. package/dist/main.bundle.js +1 -1
  13. package/dist/src/api/AvailabilityAPI.d.ts +5 -4
  14. package/dist/src/api/AvailabilityAPI.js +23 -29
  15. package/dist/src/api/AvailabilityAPI.js.map +1 -1
  16. package/dist/src/components/generic/InputGroup/InputGroup.js +1 -0
  17. package/dist/src/components/generic/InputGroup/InputGroup.js.map +1 -1
  18. package/dist/src/components/generic/InputGroup/InputGroup.types.d.ts +1 -1
  19. package/dist/src/components/generic/InputGroup/InputGroup.types.js.map +1 -1
  20. package/dist/src/components/generic/ScrollToTop.js +10 -1
  21. package/dist/src/components/generic/ScrollToTop.js.map +1 -1
  22. package/dist/src/components/generic/date/DatePicker.js +2 -1
  23. package/dist/src/components/generic/date/DatePicker.js.map +1 -1
  24. package/dist/src/components/generic/date/DatePickerDay.js +2 -1
  25. package/dist/src/components/generic/date/DatePickerDay.js.map +1 -1
  26. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.d.ts +4 -0
  27. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/EmailAndFullnameMemberModal.js +8 -4
  28. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js.map +1 -0
  29. package/dist/src/components/members/SignInModal/EmailPasswordMemberModal.d.ts +4 -0
  30. package/dist/src/components/members/SignInModal/EmailPasswordMemberModal.js +29 -0
  31. package/dist/src/components/members/SignInModal/EmailPasswordMemberModal.js.map +1 -0
  32. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/ExternalMemberModal.d.ts +8 -3
  33. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/ExternalMemberModal.js +24 -23
  34. package/dist/src/components/members/SignInModal/ExternalMemberModal.js.map +1 -0
  35. package/dist/src/components/members/SignInModal/FamilyNameMemberModal.d.ts +4 -0
  36. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/FamilyNameMemberModal.js +6 -4
  37. package/dist/src/components/members/SignInModal/FamilyNameMemberModal.js.map +1 -0
  38. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/InternalMemberSignInModal.d.ts +1 -0
  39. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/InternalMemberSignInModal.js +31 -35
  40. package/dist/src/components/members/SignInModal/InternalMemberSignInModal.js.map +1 -0
  41. package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/InternalMemberSignInModal.types.d.ts +1 -1
  42. package/dist/src/components/members/SignInModal/InternalMemberSignInModal.types.js.map +1 -0
  43. package/dist/src/components/members/SignInModal/MemberSignInModal.js +86 -0
  44. package/dist/src/components/members/SignInModal/MemberSignInModal.js.map +1 -0
  45. package/dist/src/components/steps/MinimumNightStayPill.js.map +1 -1
  46. package/dist/src/components/steps/confirmation/RoomContactDetails.js +72 -4
  47. package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
  48. package/dist/src/components/steps/date/PeoplePicker.js +1 -0
  49. package/dist/src/components/steps/date/PeoplePicker.js.map +1 -1
  50. package/dist/src/components/steps/date/PeoplePickerRow.d.ts +1 -0
  51. package/dist/src/components/steps/date/PeoplePickerRow.js +14 -4
  52. package/dist/src/components/steps/date/PeoplePickerRow.js.map +1 -1
  53. package/dist/src/components/steps/date/StepDatePricePerRoom.js +2 -1
  54. package/dist/src/components/steps/date/StepDatePricePerRoom.js.map +1 -1
  55. package/dist/src/components/steps/room/RoomListCrossSellBlock.js +1 -1
  56. package/dist/src/components/steps/room/RoomListCrossSellBlock.js.map +1 -1
  57. package/dist/src/components/steps/room/StepRoomBestRateAlert.js +13 -10
  58. package/dist/src/components/steps/room/StepRoomBestRateAlert.js.map +1 -1
  59. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js +5 -1
  60. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js.map +1 -1
  61. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRatePills.d.ts +1 -0
  62. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRatePills.js +15 -5
  63. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRatePills.js.map +1 -1
  64. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js +1 -1
  65. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js.map +1 -1
  66. package/dist/src/components/steps/room/roomFilter/RoomFilterRoomType.js.map +1 -1
  67. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +3 -1
  68. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  69. package/dist/src/contexts/BookingEngineContext/BookingEngineContextType.types.d.ts +8 -1
  70. package/dist/src/contexts/BookingEngineContext/BookingEngineContextType.types.js.map +1 -1
  71. package/dist/src/contexts/BookingEngineContext/BookingEngineContextWrapper.js +5 -0
  72. package/dist/src/contexts/BookingEngineContext/BookingEngineContextWrapper.js.map +1 -1
  73. package/dist/src/contexts/CompanyContext/CompanyContextType.type.d.ts +1 -0
  74. package/dist/src/contexts/CompanyContext/CompanyContextType.type.js.map +1 -1
  75. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +22 -19
  76. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  77. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +4 -2
  78. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  79. package/dist/src/contexts/HotelOverridesContext.js +12 -0
  80. package/dist/src/contexts/HotelOverridesContext.js.map +1 -1
  81. package/dist/src/engines/BaseEngine.d.ts +4 -1
  82. package/dist/src/engines/BaseEngine.js +6 -1
  83. package/dist/src/engines/BaseEngine.js.map +1 -1
  84. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +1 -1
  85. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
  86. package/dist/src/hooks/UpdateQueryParameters.js.map +1 -1
  87. package/dist/src/hooks/useCalendarNightStay.js +4 -2
  88. package/dist/src/hooks/useCalendarNightStay.js.map +1 -1
  89. package/dist/src/hooks/useExternalMember.d.ts +1 -1
  90. package/dist/src/index.d.ts +2 -1
  91. package/dist/src/index.js +6 -4
  92. package/dist/src/index.js.map +1 -1
  93. package/dist/src/models/Api/HotelDTO.d.ts +1 -1
  94. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  95. package/dist/src/models/Api/HotelOverrideDTO.d.ts +16 -7
  96. package/dist/src/models/Api/HotelOverrideDTO.js.map +1 -1
  97. package/dist/src/models/BasketRow.d.ts +12 -0
  98. package/dist/src/models/BasketRow.js +17 -0
  99. package/dist/src/models/BasketRow.js.map +1 -1
  100. package/dist/src/models/Client/Hotel/Hotel.d.ts +4 -1
  101. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  102. package/dist/src/models/Confirmation.d.ts +5 -0
  103. package/dist/src/models/Confirmation.js +5 -1
  104. package/dist/src/models/Confirmation.js.map +1 -1
  105. package/dist/src/models/LocalStorageModel.d.ts +7 -0
  106. package/dist/src/models/LocalStorageModel.js +3 -0
  107. package/dist/src/models/LocalStorageModel.js.map +1 -0
  108. package/dist/src/models/Promotion/IPromotion.type.d.ts +2 -0
  109. package/dist/src/models/Promotion/IPromotion.type.js.map +1 -1
  110. package/dist/src/models/Room/RoomRate.d.ts +2 -0
  111. package/dist/src/models/Room/RoomRate.js +3 -1
  112. package/dist/src/models/Room/RoomRate.js.map +1 -1
  113. package/dist/src/providers/RatePillProvider.d.ts +2 -0
  114. package/dist/src/providers/RatePillProvider.js +6 -1
  115. package/dist/src/providers/RatePillProvider.js.map +1 -1
  116. package/dist/src/providers/RoomstayThemeEngine.js +1 -1
  117. package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
  118. package/dist/src/providers/storage/LocalStorageProvider.d.ts +9 -14
  119. package/dist/src/providers/storage/LocalStorageProvider.js +19 -97
  120. package/dist/src/providers/storage/LocalStorageProvider.js.map +1 -1
  121. package/dist/src/providers/{SessionProvider.d.ts → storage/SessionProvider.d.ts} +1 -1
  122. package/dist/src/providers/{SessionProvider.js → storage/SessionProvider.js} +13 -12
  123. package/dist/src/providers/storage/SessionProvider.js.map +1 -0
  124. package/dist/src/providers/storage/StorageProvider.d.ts +14 -8
  125. package/dist/src/providers/storage/StorageProvider.js +94 -7
  126. package/dist/src/providers/storage/StorageProvider.js.map +1 -1
  127. package/dist/src/util/CalendarHelper.d.ts +1 -0
  128. package/dist/src/util/CalendarHelper.js +16 -1
  129. package/dist/src/util/CalendarHelper.js.map +1 -1
  130. package/dist/src/util/EventsHelper.js +2 -2
  131. package/dist/src/util/EventsHelper.js.map +1 -1
  132. package/dist/test.bundle.js +1 -1
  133. package/dist/tests/jest/providers/SessionProvider.test.js +7 -7
  134. package/dist/tests/jest/providers/SessionProvider.test.js.map +1 -1
  135. package/dist/tests/jest/providers/storage/LocalStorageProvider.test.js +17 -28
  136. package/dist/tests/jest/providers/storage/LocalStorageProvider.test.js.map +1 -1
  137. package/dist/vendors.bundle.js +1 -1
  138. package/package.json +5 -3
  139. package/dist/src/components/steps/room/MemberSignInModal/EmailAndFullnameMemberModal.d.ts +0 -4
  140. package/dist/src/components/steps/room/MemberSignInModal/EmailAndFullnameMemberModal.js.map +0 -1
  141. package/dist/src/components/steps/room/MemberSignInModal/ExternalMemberModal.js.map +0 -1
  142. package/dist/src/components/steps/room/MemberSignInModal/FamilyNameMemberModal.d.ts +0 -8
  143. package/dist/src/components/steps/room/MemberSignInModal/FamilyNameMemberModal.js.map +0 -1
  144. package/dist/src/components/steps/room/MemberSignInModal/InternalMemberSignInModal.js.map +0 -1
  145. package/dist/src/components/steps/room/MemberSignInModal/InternalMemberSignInModal.types.js.map +0 -1
  146. package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js +0 -62
  147. package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js.map +0 -1
  148. package/dist/src/providers/SessionProvider.js.map +0 -1
  149. /package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/InternalMemberSignInModal.types.js +0 -0
  150. /package/dist/src/components/{steps/room/MemberSignInModal → members/SignInModal}/MemberSignInModal.d.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roomstay/frontend",
3
- "version": "2.6.30",
3
+ "version": "2.6.32",
4
4
  "author": {
5
5
  "name": "Roomstay",
6
6
  "email": "rob@roomstay.io",
@@ -18,7 +18,7 @@
18
18
  "@planpay/web": "^0.1.4",
19
19
  "@popperjs/core": "^2.11.6",
20
20
  "@react-spring/web": "^9.4.4",
21
- "@roomstay/core": "^0.1.33-4",
21
+ "@roomstay/core": "^0.1.39",
22
22
  "@sentry/browser": "^5.21.0",
23
23
  "@sentry/types": "^5.26.0",
24
24
  "@types/base-64": "^1.0.0",
@@ -26,6 +26,7 @@
26
26
  "@vgs/collect-js": "^0.6.1",
27
27
  "base-64": "^1.0.0",
28
28
  "classnames": "^2.2.6",
29
+ "csstype": "^3.1.3",
29
30
  "dayjs": "^1.11.7",
30
31
  "fslightbox-react": "^1.4.9",
31
32
  "husky": "^8.0.3",
@@ -48,6 +49,7 @@
48
49
  },
49
50
  "scripts": {
50
51
  "dev": "env-cmd -f .env.local webpack-dev-server --open --mode development --hot --config 'webpack-local.config.js'",
52
+ "clients": "env-cmd -f .env.local webpack-dev-server --open --mode development --hot --config 'webpack-clients.config.js'",
51
53
  "start": "npm run dev",
52
54
  "test": "npm run test:prettier",
53
55
  "test:lint": "eslint 'src/**/*.{ts,tsx}' --quiet",
@@ -63,7 +65,7 @@
63
65
  "prepublishOnly": "./rsbundler pack-for-release; echo 0;",
64
66
  "storybook": "env-cmd -f .env.local start-storybook -p 6006",
65
67
  "build-storybook": "build-storybook",
66
- "prepare": "husky install",
68
+ "prepare": "husky install > /dev/null",
67
69
  "test:wdio": "docker-compose -f docker-compose.test.yml up --build",
68
70
  "test:playwright": "yarn playwright test",
69
71
  "test:playwright:report": "yarn playwright show-report",
@@ -1,4 +0,0 @@
1
- import { FC } from 'react';
2
- import { FamilyNameMemberModalProps } from './FamilyNameMemberModal';
3
- declare const EmailAndFullnameMemberModal: FC<FamilyNameMemberModalProps>;
4
- export default EmailAndFullnameMemberModal;
@@ -1 +0,0 @@
1
- {"version":3,"file":"EmailAndFullnameMemberModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/EmailAndFullnameMemberModal.tsx"],"names":[],"mappings":";;;;;AACA,kDAAkC;AAClC,iDAA+C;AAE/C,yDAA0D;AAC1D,4DAAyD;AAEzD,gFAAwD;AAGxD,MAAM,2BAA2B,GAAmC,CAAC,KAAK,EAAE,EAAE;IAC1E,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,OAAO,CACH,8BAAC,6BAAmB,IAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,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;aAChE;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;aAC3D;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;aAC1D;YACD;gBACI,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,eAAQ,CAAC,KAAK;gBACpB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;aACvD;SACJ,GACH,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 from './ExternalMemberModal';\nimport { FamilyNameMemberModalProps } from './FamilyNameMemberModal';\n\nconst EmailAndFullnameMemberModal: FC<FamilyNameMemberModalProps> = (props) => {\n const { t } = useTranslation();\n\n return (\n <ExternalMemberModal<IMemberVerification>\n title={props.title}\n image={props.image}\n isOpen={props.isOpen}\n fields={[\n {\n name: 'memberNumber',\n icon: IconType.Star,\n label: t(Translation.ExternalMemberPopup.Fields.MemberNumber),\n },\n {\n name: 'firstName',\n icon: IconType.Person,\n label: t(Translation.Navigation.SignUp.Inputs.FirstName),\n },\n {\n name: 'lastName',\n icon: IconType.Person,\n label: t(Translation.Navigation.SignUp.Inputs.LastName),\n },\n {\n name: 'email',\n icon: IconType.Email,\n label: t(Translation.Navigation.SignIn.EmailAddress),\n },\n ]}\n />\n );\n};\n\nexport default EmailAndFullnameMemberModal;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExternalMemberModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/ExternalMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IMemberVerification, IMessage, nameof } from '@roomstay/core';\nimport classNames from 'classnames';\nimport React, { useContext, useState } from 'react';\nimport { FieldValues, Path, SubmitHandler, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport InputGroup from '@/components/generic/InputGroup/InputGroup';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text from '@/components/generic/Text';\nimport TextBox from '@/components/generic/TextBox';\nimport { BasketContext, CompanyContext } from '@/contexts';\nimport { useCurrentHotel } from '@/hooks';\nimport { useWindowSize } from '@/hooks/WindowSize';\nimport UserProfile from '@/models/UserProfile';\nimport RoomstayThemeEngine from '@/providers/RoomstayThemeEngine';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\ntype ExternalMemberModalProps<T extends FieldValues> = {\n title: string;\n image: string;\n isOpen: boolean;\n fields: ExternalMemberModelField<T>[];\n};\n\ntype ExternalMemberModelField<T extends FieldValues> = {\n name: keyof T & string;\n icon: IconType;\n label: string;\n profileMapping?: keyof UserProfile;\n};\n\nconst ExternalMemberModal = <T extends FieldValues & IMemberVerification>(props: ExternalMemberModalProps<T>) => {\n const { hotel } = useCurrentHotel();\n const basketContext = useContext(BasketContext);\n const { signUserIn, closeMemberSignupModal, memberOnlyModalPromotion } = useContext(CompanyContext);\n const { t } = useTranslation();\n const [isLoading, setIsLoading] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n const formMethods = useForm<T>();\n const modalPrimaryColor = hotel?.memberOnlyModalUsePrimaryColor ? Color.Accent : Color.Success;\n\n const getValidationClass = (name: keyof T) => {\n if (formMethods.formState.errors) {\n if (formMethods.formState.errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n }\n };\n\n const onSubmit: SubmitHandler<T> = async (fields) => {\n setIsLoading(true);\n setErrorMessage('');\n\n try {\n const hotelId = hotel?.hotelID as string;\n const member = await API.Member.verifyMember(hotelId, fields);\n\n if (member && member.memberId) {\n signUserIn(\n {\n memberNumber: member.memberId,\n firstName: fields.firstName,\n lastName: fields.lastName,\n email: fields.email,\n },\n true\n );\n\n const promoCode = member.promoCode || (hotel?.memberOnlyPromoCode as string);\n\n // Apply promo code\n if (promoCode && !memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo) {\n basketContext.currentBasketRows?.forEach((row) => {\n row.setPromoCode(promoCode);\n basketContext.updateBasketRow(row);\n });\n }\n\n // Preset checkout defaults\n basketContext.currentBasketRows?.forEach(\n (row) =>\n (row.checkoutDefaults = {\n FirstName: fields.firstName,\n LastName: fields.lastName,\n Email: fields.email,\n })\n );\n } else {\n setErrorMessage(t(Translation.ExternalMemberPopup.InvalidMember));\n }\n } catch (e: any) {\n if (e[nameof<IMessage>('Message')]) {\n setErrorMessage(e.Message);\n } else {\n throw e;\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const { isMobile } = useWindowSize();\n\n return (\n <SimpleModal open={props.isOpen} onClose={closeMemberSignupModal} size={SimpleModalSize.Normal} alignCenter>\n <div className=\"row\" style={{ minHeight: '500px' }}>\n <div\n className={classNames('col-md-6 u-mh-none')}\n style={{\n background: 'url(\"' + RoomstayThemeEngine.getImageAssetUrl(props.image) + '\")',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n ...(isMobile && {\n height: '500px',\n }),\n }}\n />\n\n <div className=\"col-md-6 u-pad--heavy\">\n <div className=\"u-pad\">\n <Headline bold color={modalPrimaryColor}>\n {props.title}\n </Headline>\n\n <form onSubmit={formMethods.handleSubmit(onSubmit)}>\n {props.fields.map((field) => (\n <div className=\"u-marg-top u-marg-bottom\" key={field.name}>\n <InputGroup dimensions=\"1\">\n <TextBox\n iconProps={{ color: Color.DarkGrey }}\n icon={field.icon}\n inputProps={{ disabled: isLoading }}\n wide\n placeholder={field.label}\n required\n validationStatus={getValidationClass(field.name)}\n {...formMethods.register(field.name as Path<T>, { required: true })}\n />\n </InputGroup>\n </div>\n ))}\n\n <BEButton\n isLoading={isLoading}\n htmlType=\"submit\"\n className=\"u-marg-top\"\n size=\"normal\"\n filled\n primary={hotel?.memberOnlyModalUsePrimaryColor}\n success={!hotel?.memberOnlyModalUsePrimaryColor}\n stopIconAnimation\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n >\n {t(Translation.ExternalMemberPopup.Submit)}\n </BEButton>\n <div className=\"u-marg-top\">\n <Text bold color={Color.Danger}>\n {errorMessage}\n </Text>\n </div>\n </form>\n </div>\n </div>\n </div>\n </SimpleModal>\n );\n};\n\nexport default ExternalMemberModal;\n"]}
@@ -1,8 +0,0 @@
1
- import { FC } from 'react';
2
- export type FamilyNameMemberModalProps = {
3
- title: string;
4
- image: string;
5
- isOpen: boolean;
6
- };
7
- declare const FamilyNameMemberModal: FC<FamilyNameMemberModalProps>;
8
- export default FamilyNameMemberModal;
@@ -1 +0,0 @@
1
- {"version":3,"file":"FamilyNameMemberModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/FamilyNameMemberModal.tsx"],"names":[],"mappings":";;;;;AACA,kDAAkC;AAClC,iDAA+C;AAE/C,yDAA0D;AAC1D,4DAAyD;AAEzD,gFAAwD;AAQxD,MAAM,qBAAqB,GAAmC,CAAC,KAAK,EAAE,EAAE;IACpE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,OAAO,CACH,8BAAC,6BAAmB,IAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,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;aAChE;YACD;gBACI,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,eAAQ,CAAC,MAAM;gBACrB,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC;aAC9D;SACJ,GACH,CACL,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,qBAAqB,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 from './ExternalMemberModal';\n\nexport type FamilyNameMemberModalProps = {\n title: string;\n image: string;\n isOpen: boolean;\n};\n\nconst FamilyNameMemberModal: FC<FamilyNameMemberModalProps> = (props) => {\n const { t } = useTranslation();\n\n return (\n <ExternalMemberModal<IMemberVerification>\n title={props.title}\n image={props.image}\n isOpen={props.isOpen}\n fields={[\n {\n name: 'memberNumber',\n icon: IconType.Star,\n label: t(Translation.ExternalMemberPopup.Fields.MemberNumber),\n },\n {\n name: 'lastName',\n icon: IconType.Person,\n label: t(Translation.ExternalMemberPopup.Fields.FamilyName),\n },\n ]}\n />\n );\n};\n\nexport default FamilyNameMemberModal;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"InternalMemberSignInModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/InternalMemberSignInModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, BookingEngineContext, CompanyContext } from '@frontend/contexts';\nimport { MemberOnlyModalViewEvent } from '@frontend/events';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport * as Sentry from '@sentry/browser';\nimport { ErrorHandler } from 'contexts/ErrorContext';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport InputGroup from '@/components/generic/InputGroup/InputGroup';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport TextBox from '@/components/generic/TextBox';\nimport { InternalMemberSignInInputs } from '@/components/steps/room/MemberSignInModal/InternalMemberSignInModal.types';\nimport ImageProvider, { ImageSize } from '@/providers/ImageProvider';\nimport RoomstayThemeEngine from '@/providers/RoomstayThemeEngine';\nimport { Color } from '@/util/Color';\nimport ScreenSize from '@/util/ScreenSize';\nimport { EMAIL_REGEX } from '@/util/Validation';\n\ninterface MemberSignInModalProps {\n onClose?: () => void;\n isOpen?: boolean;\n}\n\nexport default function InternalMemberSignInModal(props: MemberSignInModalProps) {\n const { t } = useTranslation();\n\n const context = useContext(BookingEngineContext);\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n\n const { hotel } = useCurrentHotel();\n\n const [isLoading, setIsLoading] = useState(false);\n const [showErrors, setShowErrors] = useState(false);\n\n const [captchaScriptLoaded, setCaptchaScriptLoaded] = useState(false);\n const [captchaRendered, setCaptchaRendered] = useState(false);\n const [reCaptchaSecret, setReCaptchaSecret] = useState<string | null>(null);\n const [captchaError, setCaptchaError] = useState<string | null | undefined>(null);\n\n const captchaRef = useRef(null);\n\n const shouldLoadCaptcha = !!hotel?.googleReCaptcha?.loadForMembers && !!hotel?.googleReCaptcha?.siteKey;\n\n const MemberOnlyModalDefaultInputs: InternalMemberSignInInputs = useMemo(() => {\n return {\n Lines: [\n {\n Dimension: '2/2',\n Inputs: [\n {\n name: 'FirstName',\n type: 'TextBox',\n placeholder: t(Translation.MemberOnlyPopup.Fields.FirstName),\n isRequired: true,\n },\n {\n name: 'LastName',\n type: 'TextBox',\n placeholder: t(Translation.MemberOnlyPopup.Fields.LastName),\n isRequired: true,\n },\n ],\n },\n {\n Dimension: '1',\n Inputs: [\n {\n name: 'Email',\n type: 'TextBox',\n placeholder: t(Translation.MemberOnlyPopup.Fields.Email.Label),\n isRequired: true,\n validate: (input: string) => {\n if (!input.match(EMAIL_REGEX)) {\n return t(Translation.MemberOnlyPopup.Fields.Email.Validation.Invalid) as string;\n }\n return true;\n },\n },\n ],\n },\n ],\n };\n }, []);\n\n const { raise } = useEvent();\n\n useEffect(() => {\n if (props.isOpen) {\n const event = new MemberOnlyModalViewEvent();\n raise(event);\n }\n }, [props.isOpen]);\n\n useEffect(() => {\n let cancelled = false;\n\n if (shouldLoadCaptcha) {\n RoomstayThemeEngine.loadScript('https://www.google.com/recaptcha/api.js', 'Google ReCaptcha').then(() => {\n try {\n (window as any).grecaptcha.ready(() => {\n if (!cancelled) {\n setCaptchaScriptLoaded(true);\n }\n });\n } catch (ex) {\n console.log('Captcha loaded too quickly, will try again');\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [hotel]);\n\n useEffect(() => {\n if (shouldLoadCaptcha && captchaScriptLoaded && captchaRef?.current && !captchaRendered && props.isOpen) {\n try {\n setTimeout(() => {\n const captchaCallback = (secret: string) => {\n setReCaptchaSecret(secret);\n setCaptchaError(undefined);\n };\n\n (window as any).grecaptcha.render(captchaRef.current, {\n sitekey: hotel.googleReCaptcha?.siteKey,\n callback: captchaCallback,\n });\n\n setCaptchaRendered(true);\n }, 5);\n } catch (ex) {\n console.log(ex);\n\n Sentry.captureException(ex);\n }\n }\n }, [props.isOpen, captchaScriptLoaded, captchaRef, captchaRef?.current, captchaRendered]);\n\n useEffect(() => {\n if (!props.isOpen) {\n setReCaptchaSecret(null);\n setCaptchaError(null);\n setCaptchaRendered(false);\n }\n }, [props.isOpen]);\n\n const getValidationClass = (name: string) => {\n if (errors && (formState.touchedFields[name] || showErrors)) {\n if (errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n }\n };\n\n const methods = useForm({\n mode: 'onChange',\n });\n\n const { formState, register } = methods;\n const errors = methods.formState.errors;\n\n const onSubmit = async () => {\n if (shouldLoadCaptcha && (!reCaptchaSecret || reCaptchaSecret === '')) {\n setCaptchaError(t(Translation.MemberOnlyPopup.Errors.ReCaptcha.PleaseTick));\n return;\n }\n\n await signUpMember();\n };\n\n const signUpMember = async () => {\n setIsLoading(true);\n const { FirstName, LastName, Email, ...extra } = methods.getValues();\n\n if (!FirstName || !LastName || !Email) {\n setIsLoading(false);\n ErrorHandler.add({\n title: t(Translation.MemberOnlyPopup.Errors.RequiredFields.Title),\n message: t(Translation.MemberOnlyPopup.Errors.RequiredFields.Message),\n });\n\n return;\n }\n\n try {\n const extraFields = Object.keys(extra).map((extraFieldKey: string) => {\n return { name: extraFieldKey, value: extra[extraFieldKey] };\n });\n\n const response = await API.Member.addMember(FirstName, LastName, Email, extraFields, hotel?.hotelID as string, reCaptchaSecret as string);\n\n if (response.error) {\n setCaptchaError(t(Translation.MemberOnlyPopup.Errors.ReCaptcha.ValidationError));\n } else {\n ccx.signUserIn({ memberNumber: Email, firstName: FirstName, lastName: LastName, email: Email });\n\n if (hotel?.memberOnlyPromoCode && !ccx.memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo) {\n basketContext.currentBasketRows?.forEach((row) => {\n row.setPromoCode(hotel?.memberOnlyPromoCode as string);\n basketContext.updateBasketRow(row);\n });\n }\n }\n } catch (e) {\n ErrorHandler.add({\n title: t(Translation.MemberOnlyPopup.Errors.SignupFailed.Title),\n message: t(Translation.MemberOnlyPopup.Errors.SignupFailed.Message),\n });\n } finally {\n setIsLoading(false);\n }\n };\n\n const modalInputs: InternalMemberSignInInputs = hotel?.memberOnlySignupInputs ?? MemberOnlyModalDefaultInputs;\n\n const loadingOnClose = () => {\n setIsLoading(false);\n if (props.onClose) {\n props.onClose();\n }\n };\n const buttonOnClickHandler = async () => {\n await methods.handleSubmit(onSubmit)();\n setShowErrors(true);\n\n return false;\n };\n\n const modalTitle =\n ccx?.memberOnlyModalPromotion?.memberOnlyModalTitle ??\n t(Translation.MemberOnlyPopup.Headline, {\n companyShort: ccx?.companyShort,\n });\n\n const modalSubtitle = ccx?.memberOnlyModalPromotion?.memberOnlyModalSubtitle ?? t(Translation.MemberOnlyPopup.Subtitle);\n\n const modalButtonText = ccx?.memberOnlyModalPromotion?.memberOnlyModalButtonText ?? t(Translation.MemberOnlyPopup.SubmitButtonText);\n const modalLeadImage = useMemo(() => {\n if (ccx.memberOnlyModalPromotion?.memberOnlyModalImage) {\n return ccx.memberOnlyModalPromotion?.memberOnlyModalImage;\n }\n\n if (hotel?.memberOnlyModalImage) {\n return hotel?.memberOnlyModalImage;\n }\n\n if (hotel?.heroImage) {\n return hotel?.heroImage;\n }\n }, [hotel?.heroImage, hotel?.memberOnlyModalImage, ccx?.memberOnlyModalPromotion?.memberOnlyModalImage]);\n\n const modalPrimaryColor = hotel?.memberOnlyModalUsePrimaryColor ? Color.Accent : Color.Success;\n\n return (\n <SimpleModal open={props.isOpen} onClose={loadingOnClose} size={SimpleModalSize.Normal} alignCenter>\n <div className=\"row\">\n <div\n className=\"col-md-6 u-mh-none\"\n style={{\n background: 'url(\"' + (modalLeadImage && ImageProvider.resizeImage(modalLeadImage, ImageSize.Original)) + '\")',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center',\n backgroundSize: 'cover',\n }}\n />\n <div className=\"col-md-6\">\n <div className=\"u-pad u-pad-heavy\">\n <div className=\"u-marg-bottom-half\">\n <Icon\n icon={IconType.Money}\n size=\"24px\"\n color={modalPrimaryColor}\n useColorAsBackground={hotel?.memberOnlyModalUsePrimaryColor}\n backgroundColor={Color.SuccessTint}\n />\n </div>\n <div className=\"u-marg-bottom-half\">\n <Headline bold color={modalPrimaryColor}>\n <div\n style={{ color: modalPrimaryColor }}\n dangerouslySetInnerHTML={{\n __html: modalTitle as string,\n }}\n ></div>\n </Headline>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.DarkGrey}>\n <span dangerouslySetInnerHTML={{ __html: modalSubtitle as string }}></span>\n </Text>\n </div>\n <FormProvider {...methods}>\n <div>\n {modalInputs.Lines.map((inputLine, lineIndex) => {\n return (\n <div className=\"u-marg-bottom-xxx\" key={lineIndex}>\n <InputGroup dimensions={inputLine.Dimension}>\n {inputLine.Inputs.map((input, inputIndex) => {\n switch (input.type) {\n case 'TextBox':\n return (\n <TextBox\n key={inputIndex}\n wide\n placeholder={input.placeholder}\n required={input.isRequired}\n validationStatus={getValidationClass(input.name)}\n {...register(input.name, {\n required: input.isRequired,\n validate: input.validate,\n })}\n />\n );\n }\n })}\n </InputGroup>\n </div>\n );\n })}\n </div>\n <div className=\"u-marg-top--light\" style={{ marginBottom: '45px' }}>\n {captchaScriptLoaded && (\n <>\n {captchaError && (\n <Text type={TextType.Label} color={Color.Alert}>\n {captchaError}\n </Text>\n )}\n <div ref={captchaRef} className=\"u-marg-bottom\"></div>\n </>\n )}\n <BEButton\n size=\"normal\"\n filled\n primary={hotel?.memberOnlyModalUsePrimaryColor}\n success={!hotel?.memberOnlyModalUsePrimaryColor}\n isLoading={isLoading}\n stopIconAnimation\n icon={context.screenSize > ScreenSize.Mobile ? IconType.ArrowRight : undefined}\n onClick={buttonOnClickHandler}\n >\n {modalButtonText}\n </BEButton>\n </div>\n </FormProvider>\n <Text type={TextType.Label} color={Color.DarkGrey}>\n <span dangerouslySetInnerHTML={{ __html: t(Translation.MemberOnlyPopup.AgreeToReceiveDeals, { companyShort: ccx?.companyShort }) }}></span>\n </Text>{' '}\n <Text type={TextType.Label} color={Color.DarkGrey}>\n <span dangerouslySetInnerHTML={{ __html: t(Translation.MemberOnlyPopup.UnsubscribeAnytime) }}></span>\n </Text>\n </div>\n </div>\n </div>\n </SimpleModal>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"InternalMemberSignInModal.types.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/InternalMemberSignInModal.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InputGroupDimensions } from '@/components/generic/InputGroup/InputGroup.types';\n\nexport interface InternalMemberSignInInputs {\n Lines: {\n Dimension: InputGroupDimensions;\n Inputs: {\n name: string;\n type: 'TextBox';\n\n placeholder?: string;\n\n isRequired?: boolean;\n validate?: (value: string) => string | boolean;\n }[];\n }[];\n}\n"]}
@@ -1,62 +0,0 @@
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 (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.MemberSignInModal = void 0;
30
- const contexts_1 = require("../../../../contexts/index.js");
31
- const core_1 = require("@roomstay/core");
32
- const react_1 = __importStar(require("react"));
33
- const react_i18next_1 = require("react-i18next");
34
- const useExternalMember_1 = require("../../../../hooks/useExternalMember");
35
- const Translation_1 = require("../../../../translations/Translation");
36
- const EmailAndFullnameMemberModal_1 = __importDefault(require("./EmailAndFullnameMemberModal"));
37
- const FamilyNameMemberModal_1 = __importDefault(require("./FamilyNameMemberModal"));
38
- const InternalMemberSignInModal_1 = __importDefault(require("./InternalMemberSignInModal"));
39
- const MemberSignInModal = () => {
40
- const { externalMemberType, isExternalMemberHotel } = (0, useExternalMember_1.useExternalMember)();
41
- const { isSigningIn, closeMemberSignupModal } = (0, react_1.useContext)(contexts_1.CompanyContext);
42
- const { t } = (0, react_i18next_1.useTranslation)();
43
- if (isExternalMemberHotel) {
44
- switch (externalMemberType) {
45
- case core_1.EIntegration.Big4:
46
- return react_1.default.createElement(FamilyNameMemberModal_1.default, { title: t(Translation_1.Translation.ExternalMemberPopup.Big4Title), image: "big4-login.svg", isOpen: isSigningIn });
47
- case core_1.EIntegration.Top10:
48
- return react_1.default.createElement(FamilyNameMemberModal_1.default, { title: t(Translation_1.Translation.ExternalMemberPopup.Top10Title), image: "top10-login.svg", isOpen: isSigningIn });
49
- case core_1.EIntegration.Gday:
50
- return react_1.default.createElement(FamilyNameMemberModal_1.default, { title: t(Translation_1.Translation.ExternalMemberPopup.GDayTitle), image: "gday-login.svg", isOpen: isSigningIn });
51
- case core_1.EIntegration.Salesforce:
52
- return react_1.default.createElement(EmailAndFullnameMemberModal_1.default, { title: t(Translation_1.Translation.ExternalMemberPopup.SalesforceTitle), image: "salesforce-login.png", isOpen: isSigningIn });
53
- default:
54
- return null;
55
- }
56
- }
57
- else {
58
- return react_1.default.createElement(InternalMemberSignInModal_1.default, { isOpen: isSigningIn, onClose: closeMemberSignupModal });
59
- }
60
- };
61
- exports.MemberSignInModal = MemberSignInModal;
62
- //# sourceMappingURL=MemberSignInModal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MemberSignInModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/MemberSignInModal.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAoD;AACpD,yCAA8C;AAC9C,+CAA0C;AAC1C,iDAA+C;AAE/C,iEAA8D;AAC9D,4DAAyD;AAEzD,gGAAwE;AACxE,oFAA4D;AAC5D,4FAAoE;AAE7D,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,GAAG,IAAA,qCAAiB,GAAE,CAAC;IAC1E,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,GAAG,IAAA,kBAAU,EAAC,yBAAc,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,IAAI,qBAAqB,EAAE;QACvB,QAAQ,kBAAkB,EAAE;YACxB,KAAK,mBAAY,CAAC,IAAI;gBAClB,OAAO,8BAAC,+BAAqB,IAAC,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAC,gBAAgB,EAAC,MAAM,EAAE,WAAW,GAAI,CAAC;YACtI,KAAK,mBAAY,CAAC,KAAK;gBACnB,OAAO,8BAAC,+BAAqB,IAAC,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAC,iBAAiB,EAAC,MAAM,EAAE,WAAW,GAAI,CAAC;YACxI,KAAK,mBAAY,CAAC,IAAI;gBAClB,OAAO,8BAAC,+BAAqB,IAAC,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAC,gBAAgB,EAAC,MAAM,EAAE,WAAW,GAAI,CAAC;YACtI,KAAK,mBAAY,CAAC,UAAU;gBACxB,OAAO,8BAAC,qCAA2B,IAAC,KAAK,EAAE,CAAC,CAAC,yBAAW,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,KAAK,EAAC,sBAAsB,EAAC,MAAM,EAAE,WAAW,GAAI,CAAC;YACxJ;gBACI,OAAO,IAAI,CAAC;SACnB;KACJ;SAAM;QACH,OAAO,8BAAC,mCAAyB,IAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,GAAI,CAAC;KAC9F;AACL,CAAC,CAAC;AArBW,QAAA,iBAAiB,qBAqB5B","sourcesContent":["import { CompanyContext } from '@frontend/contexts';\nimport { EIntegration } from '@roomstay/core';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport { Translation } from '@/translations/Translation';\n\nimport EmailAndFullnameMemberModal from './EmailAndFullnameMemberModal';\nimport FamilyNameMemberModal from './FamilyNameMemberModal';\nimport InternalMemberSignInModal from './InternalMemberSignInModal';\n\nexport const MemberSignInModal = () => {\n const { externalMemberType, isExternalMemberHotel } = useExternalMember();\n const { isSigningIn, closeMemberSignupModal } = useContext(CompanyContext);\n const { t } = useTranslation();\n\n if (isExternalMemberHotel) {\n switch (externalMemberType) {\n case EIntegration.Big4:\n return <FamilyNameMemberModal title={t(Translation.ExternalMemberPopup.Big4Title)} image=\"big4-login.svg\" isOpen={isSigningIn} />;\n case EIntegration.Top10:\n return <FamilyNameMemberModal title={t(Translation.ExternalMemberPopup.Top10Title)} image=\"top10-login.svg\" isOpen={isSigningIn} />;\n case EIntegration.Gday:\n return <FamilyNameMemberModal title={t(Translation.ExternalMemberPopup.GDayTitle)} image=\"gday-login.svg\" isOpen={isSigningIn} />;\n case EIntegration.Salesforce:\n return <EmailAndFullnameMemberModal title={t(Translation.ExternalMemberPopup.SalesforceTitle)} image=\"salesforce-login.png\" isOpen={isSigningIn} />;\n default:\n return null;\n }\n } else {\n return <InternalMemberSignInModal isOpen={isSigningIn} onClose={closeMemberSignupModal} />;\n }\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionProvider.js","sourceRoot":"/","sources":["src/providers/SessionProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignInUser } from '@frontend/contexts';\nimport dayjs from 'dayjs';\n\nimport BasketRow from '@/models/BasketRow';\nimport { IRoom, Room } from '@/models/Room/Room';\nimport { IRoomRate, RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession, SERIALIZED_DATE_FORMAT, SerializedRoomstaySession, SerializedRoomstaySessionBasketRow } from '@/models/RoomstaySession';\nimport { LocalStorageProvider } from '@/providers/storage/LocalStorageProvider';\nimport { debounce, delay } from '@/util/Debounce';\n\n/**\n * Session provider is in charge of handling the loading, saving and passing of the current Engine Session.\n *\n * Desired flow:\n * * App Opened\n * * Session Provider loaded\n * * New User Session Created\n * * User moves through the app, updating the session with vital details (current step, basket context )\n * * User refreshes browser - session is re-loaded and user resumes where they left off\n * * User proceeds to checkout.\n * * Session is saved.\n *\n * Mini Booking Widget:\n * * User loads mini booking widget, selects dates, people\n * * Rates are loaded, and user selects a rate, redirecting to Full Booking Engine\n * * Session Provider creates a SessionID to pass to redirected path\n * * Session Provider loads the passed SessionID and loads the correct session\n * * Resume to Desired Flow\n *\n * Re-targeting:\n * ---Since re-targeting will happen on client site, under client domain, localStorage will be preserved, ergo we can load the previous incomplete sessions back to the user\n * * User lands on client Homepage\n * * Session Provider loads previous incomplete sessions\n * * A slider with details of previous baskets is shown back to the user\n * * User clicks on a previous session and is brought to the Booking Engine\n * * Resume to Desired Flow\n */\n\nexport default class SessionProvider {\n private currentSessionID!: number;\n private hotelID!: string;\n private cachedSession: Partial<RoomstaySession> = {};\n private syncSession = async () => {\n try {\n const currentSession = await this.getSession();\n const cachedSession = this.cachedSession;\n this.cachedSession = {};\n await this.saveSession({\n ...currentSession,\n ...cachedSession,\n });\n } catch (error) {\n console.error('Failed to sync session:', error);\n }\n };\n\n private debouncedUpdateSession = debounce(async () => {\n await this.syncSession();\n }, 300);\n\n private async updateSessionWithAsync() {\n await delay(300); // 300 milliseconds delay -- Why is a delay necessary?\n await this.syncSession();\n }\n\n public async setHotelID(hotelID: string) {\n this.hotelID = hotelID;\n this.updateSession({ hotelID });\n }\n\n public async initialize(sessionID?: number, source?: string) {\n await this.setSessionID(sessionID, source);\n }\n\n public async setSessionID(sessionID?: number, source?: string) {\n const foundSession = await this.findOrCreateSessionID(sessionID as number, source as string);\n\n if (foundSession) {\n this.currentSessionID = foundSession;\n\n const storage = new LocalStorageProvider(sessionStorage);\n await storage.write('currentSession', this.currentSessionID);\n }\n }\n\n /**\n * @returns the current session ID\n */\n public getCurrentSessionID(): number {\n return this.currentSessionID;\n }\n\n public async getSession(): Promise<RoomstaySession> {\n const storage = new LocalStorageProvider();\n\n const sessionFromStorage = await storage.read<SerializedRoomstaySession>(this.getSessionKey());\n\n if (sessionFromStorage) {\n return this.unSerializeSession(sessionFromStorage);\n } else {\n return this.generateNewSession('');\n }\n }\n\n public async saveSession(changedSession: RoomstaySession) {\n if (!changedSession) {\n return console.log('Attempted to save empty session');\n }\n\n const storage = new LocalStorageProvider();\n\n const serializedSession = this.serializeSession(changedSession);\n\n await storage.write(this.getSessionKey(serializedSession.id), serializedSession);\n }\n\n public async updateSession(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n this.debouncedUpdateSession();\n }\n\n public async updateSessionAsync(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n await this.updateSessionWithAsync();\n }\n\n public async deleteSession() {\n const storage = new LocalStorageProvider();\n storage.delete(this.getSessionKey());\n }\n\n public async getAllSessions() {\n const storage = new LocalStorageProvider();\n const sessionKeys = storage.getAllKeys((name) => name.startsWith('roomstay-session'));\n\n return (await storage.readAll<SerializedRoomstaySession>(sessionKeys)).map((session) => this.unSerializeSession(session));\n }\n\n /**\n * Function to find the right session from session storage, or local storage\n *\n * If one isn't found it is then created.\n */\n private async findOrCreateSessionID(sessionID: number, source: string) {\n let session: RoomstaySession;\n\n if (sessionID) {\n session = (await this.findSession(sessionID)) as RoomstaySession;\n\n if (session) {\n return session.id;\n }\n }\n\n session = await this.generateNewSession(source);\n\n return session.id;\n }\n\n private async findSession(sessionID: number): Promise<RoomstaySession | undefined> {\n const storage = new LocalStorageProvider();\n\n const session = await storage.read<SerializedRoomstaySession>(this.getSessionKey(sessionID));\n\n if (session) {\n return this.unSerializeSession(session);\n }\n }\n\n private async generateNewSession(source: string): Promise<RoomstaySession> {\n const sessionId = new Date().getTime();\n\n const session: RoomstaySession = {\n id: sessionId,\n startDate: null,\n endDate: null,\n step: '',\n hotelID: this.hotelID ?? null,\n basketRows: [],\n source,\n };\n\n this.saveSession(session);\n\n return session;\n }\n\n private serializeSession(session: RoomstaySession): SerializedRoomstaySession {\n const basketRows: SerializedRoomstaySessionBasketRow[] = [];\n\n // TODO possibly refactor BasketRow to serialize itself, or instead make a serializer that can do all this.\n session.basketRows.forEach((unSerializeBasketRow: BasketRow) => {\n const rate = unSerializeBasketRow.getRate();\n const room = unSerializeBasketRow.getRoom();\n\n let serializedRate = null;\n let serializedRoom = null;\n\n if (rate) {\n serializedRate = rate.serialize();\n }\n\n if (room) {\n serializedRoom = room.serialize();\n }\n\n basketRows.push({\n uniqId: unSerializeBasketRow.getID(),\n startDate: unSerializeBasketRow.getStartDate()?.format(SERIALIZED_DATE_FORMAT),\n endDate: unSerializeBasketRow.getEndDate()?.format(SERIALIZED_DATE_FORMAT),\n adults: unSerializeBasketRow.getAdults(),\n children: unSerializeBasketRow.getChildren(),\n infants: unSerializeBasketRow.getInfants(),\n promoCode: unSerializeBasketRow.getPromoCode(),\n promoCodeStatus: unSerializeBasketRow.getPromoCodeStatus(),\n rate: serializedRate as IRoomRate,\n room: serializedRoom as IRoom,\n });\n });\n\n return {\n id: session.id,\n startDate: session.startDate?.format(SERIALIZED_DATE_FORMAT) as string,\n endDate: session.endDate?.format(SERIALIZED_DATE_FORMAT) as string,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: JSON.stringify(session.user),\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: session.reservationRequest,\n };\n }\n\n private unSerializeSession(session: SerializedRoomstaySession): RoomstaySession {\n const basketRows: BasketRow[] = [];\n let startDate: dayjs.Dayjs | null = null;\n let endDate: dayjs.Dayjs | null = null;\n\n if (session.startDate) {\n startDate = dayjs(session.startDate, SERIALIZED_DATE_FORMAT);\n }\n\n if (session.endDate) {\n endDate = dayjs(session.endDate, SERIALIZED_DATE_FORMAT);\n }\n\n session.basketRows?.forEach((serializedBasketRow) => {\n let rate;\n let room;\n\n if (serializedBasketRow.room) {\n room = new Room();\n room.unSerialize(serializedBasketRow.room);\n }\n\n if (serializedBasketRow.rate && room) {\n rate = new RoomRate();\n rate.unSerialize(serializedBasketRow.rate);\n rate.setRoom(room);\n }\n\n const basketRow = new BasketRow(rate, serializedBasketRow.uniqId);\n\n if (serializedBasketRow.startDate) {\n basketRow.setStartDate(dayjs(serializedBasketRow.startDate, SERIALIZED_DATE_FORMAT));\n }\n if (serializedBasketRow.endDate) {\n basketRow.setEndDate(dayjs(serializedBasketRow.endDate, SERIALIZED_DATE_FORMAT));\n }\n\n basketRow.setAdults(serializedBasketRow.adults);\n basketRow.setChildren(serializedBasketRow.children);\n basketRow.setInfants(serializedBasketRow.infants);\n\n basketRows.push(basketRow);\n });\n\n return {\n id: session.id,\n startDate,\n endDate,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: session.user ? (JSON.parse(session.user) as SignInUser) : undefined,\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: session.reservationRequest,\n };\n }\n\n private getSessionKey(sessionId?: number): string {\n return `session-${sessionId ?? this.currentSessionID}`;\n }\n}\n"]}