@roomstay/frontend 2.0.0-1 → 2.0.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 (92) hide show
  1. package/dist/201.bundle.js +1 -1
  2. package/dist/218.bundle.js +1 -1
  3. package/dist/279.bundle.js +1 -1
  4. package/dist/370.bundle.js +1 -1
  5. package/dist/449.bundle.js +1 -1
  6. package/dist/873.bundle.js +1 -1
  7. package/dist/882.bundle.js +1 -1
  8. package/dist/972.bundle.js +1 -1
  9. package/dist/main.bundle.js +1 -1
  10. package/dist/src/components/steps/confirmation/PaymentDetails/StepConfirmationPaymentDetails.js +1 -11
  11. package/dist/src/components/steps/confirmation/PaymentDetails/StepConfirmationPaymentDetails.js.map +1 -1
  12. package/dist/src/components/steps/confirmation/RoomContactDetails.js +2 -1
  13. package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
  14. package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js +18 -12
  15. package/dist/src/components/steps/room/MemberSignInModal/MemberSignInModal.js.map +1 -1
  16. package/dist/src/components/steps/room/RoomList.js +1 -1
  17. package/dist/src/components/steps/room/RoomList.js.map +1 -1
  18. package/dist/src/components/steps/room/StepRoomErrorForm.js +2 -1
  19. package/dist/src/components/steps/room/StepRoomErrorForm.js.map +1 -1
  20. package/dist/src/components/steps/room/roomDetails/RoomDetails.js +8 -8
  21. package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
  22. package/dist/src/components/steps/room/roomDetails/roomRates/MembersOnlyRow.js.map +1 -1
  23. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.d.ts +7 -0
  24. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.js +31 -0
  25. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateListPromotion/RoomRateListPromotion.js.map +1 -0
  26. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js +14 -7
  27. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js.map +1 -1
  28. package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
  29. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +12 -8
  30. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  31. package/dist/src/contexts/CompanyContext/CompanyContextType.type.d.ts +3 -1
  32. package/dist/src/contexts/CompanyContext/CompanyContextType.type.js.map +1 -1
  33. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +9 -1
  34. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  35. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +3 -2
  36. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  37. package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js.map +1 -1
  38. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +71 -1
  39. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  40. package/dist/src/events/RoomstayEventManager.d.ts +1 -1
  41. package/dist/src/events/RoomstayEventManager.js +23 -4
  42. package/dist/src/events/RoomstayEventManager.js.map +1 -1
  43. package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.d.ts +7 -0
  44. package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.js +15 -0
  45. package/dist/src/events/actions/MemberOnlyFence/MemberOnlyFenceSignUp.js.map +1 -0
  46. package/dist/src/events/actions/Promotion/PromotionAddedEvent.d.ts +7 -0
  47. package/dist/src/events/actions/Promotion/PromotionAddedEvent.js +15 -0
  48. package/dist/src/events/actions/Promotion/PromotionAddedEvent.js.map +1 -0
  49. package/dist/src/events/actions/Promotion/PromotionClickedEvent.d.ts +7 -0
  50. package/dist/src/events/actions/Promotion/PromotionClickedEvent.js +15 -0
  51. package/dist/src/events/actions/Promotion/PromotionClickedEvent.js.map +1 -0
  52. package/dist/src/events/actions/Promotion/PromotionRemovedEvent.d.ts +7 -0
  53. package/dist/src/events/actions/Promotion/PromotionRemovedEvent.js +15 -0
  54. package/dist/src/events/actions/Promotion/PromotionRemovedEvent.js.map +1 -0
  55. package/dist/src/events/index.d.ts +1 -0
  56. package/dist/src/events/index.js +1 -0
  57. package/dist/src/events/index.js.map +1 -1
  58. package/dist/src/hooks/EventHook.d.ts +1 -1
  59. package/dist/src/hooks/EventHook.js +2 -2
  60. package/dist/src/hooks/EventHook.js.map +1 -1
  61. package/dist/src/index.d.ts +2 -1
  62. package/dist/src/index.js +1 -0
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/models/Promotion/IPromotion.type.d.ts +27 -0
  65. package/dist/src/models/Promotion/IPromotion.type.js +3 -0
  66. package/dist/src/models/Promotion/IPromotion.type.js.map +1 -0
  67. package/dist/src/pages/findReservation/FindReservation.js +2 -1
  68. package/dist/src/pages/findReservation/FindReservation.js.map +1 -1
  69. package/dist/src/providers/LanguageProvider.d.ts +14 -3
  70. package/dist/src/providers/LanguageProvider.js +3 -19
  71. package/dist/src/providers/LanguageProvider.js.map +1 -1
  72. package/dist/src/providers/PromotionProvider.d.ts +14 -0
  73. package/dist/src/providers/PromotionProvider.js +213 -0
  74. package/dist/src/providers/PromotionProvider.js.map +1 -0
  75. package/dist/src/util/ObjectHelper.d.ts +4 -0
  76. package/dist/src/util/ObjectHelper.js +25 -0
  77. package/dist/src/util/ObjectHelper.js.map +1 -0
  78. package/dist/src/util/Validation.d.ts +1 -0
  79. package/dist/src/util/Validation.js +2 -1
  80. package/dist/src/util/Validation.js.map +1 -1
  81. package/dist/test.bundle.js +1 -1
  82. package/dist/tests/jest/helpers/ObjectHelper.test.d.ts +1 -0
  83. package/dist/tests/jest/helpers/ObjectHelper.test.js +72 -0
  84. package/dist/tests/jest/helpers/ObjectHelper.test.js.map +1 -0
  85. package/dist/tests/offline/entry/RSCompany.js +42 -1
  86. package/dist/tests/offline/entry/RSCompany.js.map +1 -1
  87. package/dist/vendors.bundle.js +1 -1
  88. package/package.json +1 -1
  89. package/dist/src/components/steps/confirmation/StepConfirmationPaymentDetails.d.ts +0 -8
  90. package/dist/src/components/steps/confirmation/StepConfirmationPaymentDetails.js +0 -241
  91. package/dist/src/components/steps/confirmation/StepConfirmationPaymentDetails.js.map +0 -1
  92. package/dist/src/contexts/BasketContext/BasketContextType.d.ts +0 -41
@@ -0,0 +1,27 @@
1
+ import * as dayjs from 'dayjs';
2
+ export type IPromotionApplication = {
3
+ checkInDate?: string;
4
+ checkOutDate?: string;
5
+ adults?: number;
6
+ children?: number;
7
+ promoCode?: string;
8
+ };
9
+ export type IPromotionTestCriteria = {
10
+ checkInDate: dayjs.Dayjs;
11
+ checkOutDate: dayjs.Dayjs;
12
+ adults: number;
13
+ children: number;
14
+ promoCode: string;
15
+ };
16
+ export type IPromotion = {
17
+ name: string;
18
+ description: string;
19
+ requireMemberPromotion?: boolean;
20
+ memberOnlyModalTitle?: string;
21
+ memberOnlyModalSubtitle?: string;
22
+ memberOnlyModalButtonText?: string;
23
+ memberOnlyDisableDefaultPromo?: boolean;
24
+ memberOnlyModalImage?: string;
25
+ testCriteria: (criteria: IPromotionTestCriteria) => Promise<boolean>;
26
+ onApply: (criteria: IPromotionTestCriteria) => IPromotionApplication;
27
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IPromotion.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IPromotion.type.js","sourceRoot":"/","sources":["src/models/Promotion/IPromotion.type.ts"],"names":[],"mappings":"","sourcesContent":["import * as dayjs from 'dayjs';\n\nexport type IPromotionApplication = {\n checkInDate?: string;\n checkOutDate?: string;\n\n adults?: number;\n children?: number;\n\n promoCode?: string;\n};\n\nexport type IPromotionTestCriteria = {\n checkInDate: dayjs.Dayjs;\n checkOutDate: dayjs.Dayjs;\n\n adults: number;\n children: number;\n\n promoCode: string;\n};\n\nexport type IPromotion = {\n name: string;\n description: string;\n\n requireMemberPromotion?: boolean;\n\n memberOnlyModalTitle?: string;\n memberOnlyModalSubtitle?: string;\n memberOnlyModalButtonText?: string;\n memberOnlyDisableDefaultPromo?: boolean;\n memberOnlyModalImage?: string;\n\n testCriteria: (criteria: IPromotionTestCriteria) => Promise<boolean>;\n onApply: (criteria: IPromotionTestCriteria) => IPromotionApplication;\n};\n"]}
@@ -36,6 +36,7 @@ const ForgotPasswordForm_1 = require("components/User/Forms/ForgotPasswordForm")
36
36
  const events_1 = require("@frontend/events");
37
37
  const UnauthenticatedUserModal_1 = require("components/generic/modal/SigninModal/UnauthenticatedUserModal");
38
38
  const MemberPortalFeature_1 = require("providers/feature/MemberPortalFeature");
39
+ const Validation_1 = require("util/Validation");
39
40
  exports.QUERY_PARAM_NAME = 'path';
40
41
  var EFindReservationPath;
41
42
  (function (EFindReservationPath) {
@@ -166,7 +167,7 @@ function FindReservation() {
166
167
  React.createElement(TextBox_1.default, Object.assign({ placeholder: "example@mail.com", required: true, validationStatus: getValidationClass('Email'), name: 'Email' }, register('Email', {
167
168
  required: true,
168
169
  pattern: {
169
- value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
170
+ value: Validation_1.EMAIL_REGEX,
170
171
  message: t(Translation_1.Translation.FindReservation.InvalidEmailAddress),
171
172
  },
172
173
  })))),
@@ -1 +1 @@
1
- {"version":3,"file":"FindReservation.js","sourceRoot":"/","sources":["src/pages/findReservation/FindReservation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Headline from 'components/generic/Headline';\nimport TextBox from 'components/generic/TextBox';\nimport Text, { TextType } from 'components/generic/Text';\nimport { Color } from 'util/Color';\nimport BEButton from 'components/generic/BEButton';\nimport { useForm } from 'react-hook-form';\nimport { IconType } from 'components/generic/Icon/Icon';\nimport API from 'api/BookingAPI';\nimport AutoAutoHeight from 'animations/AutoAutoHeight';\nimport Alert, { AlertType } from 'components/generic/Alert';\nimport { useHistory, useParams } from 'react-router-dom';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport LineBreak from 'components/generic/LineBreak';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport { Translation } from 'translations/Translation';\nimport StepManager from 'util/StepManager';\nimport { SignInForm } from 'components/User/Forms/SignInForm';\nimport { SignUpForm } from 'components/User/Forms/SignUpForm';\nimport FadeAnimation from 'animations/Fade';\nimport { ForgotPasswordForm } from 'components/User/Forms/ForgotPasswordForm';\nimport { FindReservationViewEvent } from '@frontend/events';\nimport { EViewingScreen } from 'components/generic/modal/SigninModal/UnauthenticatedUserModal';\nimport MemberPortalFeature from 'providers/feature/MemberPortalFeature';\n\nexport const QUERY_PARAM_NAME = 'path';\n\nexport enum EFindReservationPath {\n FindReservation = 'find-reservation',\n Login = 'login',\n Register = 'register',\n Forgot = 'forgot',\n}\n\nconst pathToScreenMapping: { [path in EFindReservationPath]: EViewingScreen } = {\n [EFindReservationPath.FindReservation]: EViewingScreen.Default,\n [EFindReservationPath.Login]: EViewingScreen.SignIn,\n [EFindReservationPath.Register]: EViewingScreen.SignUp,\n [EFindReservationPath.Forgot]: EViewingScreen.ForgotPassword,\n};\n\ninterface IQueryParams {\n [QUERY_PARAM_NAME]: EFindReservationPath;\n}\n\nexport default function FindReservation() {\n const { hotel } = useCurrentHotel();\n\n const { t } = useTranslation();\n\n const { register, formState, handleSubmit, getValues } = useForm({\n mode: 'onChange',\n });\n\n const errors = formState.errors;\n\n const getValidationClass = (name: string) => {\n if (errors && formState.touchedFields[name]) {\n if (errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n } else {\n return null;\n }\n };\n\n const { path }: IQueryParams = useParams<IQueryParams>();\n const firstTime = useRef<boolean>(true);\n const nextViewingScreen = useRef<EViewingScreen>();\n\n const [isLoading, setIsLoading] = useState(false);\n const [apiErrorMessages, setApiErrorMessages] = useState('');\n const [viewingScreen, setViewingScreen] = useState<EViewingScreen>(pathToScreenMapping[path]);\n\n useEffect(() => {\n if (firstTime.current) {\n firstTime.current = false;\n setViewingScreen(pathToScreenMapping[path]);\n } else {\n setViewingScreen(null);\n nextViewingScreen.current = pathToScreenMapping[path];\n }\n }, [path]);\n\n const history = useHistory();\n\n const onSubmit = () => {\n setIsLoading(true);\n setApiErrorMessages('');\n\n API.Reservation.findReservation(getValues('Ref'), getValues('Email'), hotel.hotelID)\n .then((data) => {\n history.push(`/find-reservation/${getValues('Ref')}/${getValues('Email')}`);\n })\n .catch(({ Message }) => {\n console.log(Message);\n setApiErrorMessages(Message);\n setIsLoading(false);\n });\n };\n\n const { raise } = useEvent();\n\n useEffect(() => {\n const background = document.createElement('div');\n background.classList.add('dbe-background');\n background.style.backgroundImage = `url('${hotel?.heroImage}')`;\n\n RoomstayThemeEngine.EngineContainer.classList.add('--transparent-bg');\n RoomstayThemeEngine.EngineContainer.appendChild(background);\n\n const event = new FindReservationViewEvent();\n raise(event);\n\n return () => {\n try {\n RoomstayThemeEngine.EngineContainer.removeChild(background);\n RoomstayThemeEngine.EngineContainer.classList.remove('--transparent-bg');\n } catch (ex) {\n console.log('Unable to remove bg');\n }\n };\n }, []);\n\n useEffect(() => {\n if (hotel?.forwardFindReservationToSynxis) {\n window.open(`https://be.synxis.com/signin?hotel=` + hotel.hotelID);\n }\n }, [hotel]);\n\n const onBack = async () => {\n history.push(StepManager.getFirstStep().getStepUrl());\n };\n\n const handleSubmitOnClick = () => {\n handleSubmit(onSubmit)();\n };\n\n const onSignInClicked = () => {\n history.push(`/${EFindReservationPath.Login}`);\n };\n\n const onBackToItineraryClicked = () => {\n history.push(`/${EFindReservationPath.FindReservation}`);\n };\n\n const onSignUpClicked = () => {\n history.push(`/${EFindReservationPath.Register}`);\n };\n\n const onForgotPasswordClicked = () => {\n history.push(`/${EFindReservationPath.Forgot}`);\n };\n\n const onExit = () => {\n setViewingScreen(nextViewingScreen.current);\n };\n\n const defaultContents = (\n <form onSubmit={handleSubmit(onSubmit)}>\n <div className=\"u-marg-bottom--heavy\">\n <Headline size=\"extra-large\">{t(Translation.FindReservation.FindYourReservation)}</Headline>\n </div>\n <AutoAutoHeight open={!!apiErrorMessages}>\n <div className=\"u-flex\">\n <Alert type={AlertType.Danger} icon={IconType.Error}>\n <Text type={TextType.Small}>{apiErrorMessages}</Text>\n </Alert>\n </div>\n </AutoAutoHeight>\n <div className=\"u-marg-bottom\">\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Label} color={Color.Navy}>\n <strong>{t(Translation.FindReservation.Confirmation)}</strong>\n </Text>\n </div>\n <TextBox\n placeholder=\"51244AB23101\"\n required={true}\n validationStatus={getValidationClass('Ref')}\n {...register('Ref', {\n required: true,\n })}\n />\n </div>\n <div className=\"u-marg-bottom\">\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Label} color={Color.Navy}>\n <strong>{t(Translation.FindReservation.EmailAddress)}</strong>\n </Text>\n </div>\n <TextBox\n placeholder=\"example@mail.com\"\n required={true}\n validationStatus={getValidationClass('Email')}\n name={'Email'}\n {...register('Email', {\n required: true,\n pattern: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i,\n message: t(Translation.FindReservation.InvalidEmailAddress),\n },\n })}\n />\n </div>\n <div className=\"u-flex justify-content-end w-100\">\n <BEButton primary={true} filled={true} mobileWidth={true} isLoading={isLoading} icon={IconType.ArrowRight} iconPosition=\"right\" onClick={handleSubmitOnClick}>\n {t(Translation.FindReservation.FindReservation)}\n </BEButton>\n <button type=\"submit\" className=\"u-none\">\n {t(Translation.FindReservation.Submit)}\n </button>\n </div>\n <LineBreak />\n {MemberPortalFeature.isActive() && (\n <div className=\"u-marg-bottom--heavy\">\n <BEButton isText={true} primary={true} size={'small'} onClick={onSignInClicked}>\n Or sign in for more\n </BEButton>\n </div>\n )}\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Small}>\n <strong>{t(Translation.FindReservation.Question)}</strong>\n </Text>\n </div>\n <Text type={TextType.Small}>{t(Translation.FindReservation.Answer1)}</Text>\n <Text type={TextType.Small}>{t(Translation.FindReservation.Answer2)}</Text>\n <LineBreak />\n <BEButton\n textColor={Color.Accent}\n primary={false}\n filled={false}\n mobileWidth={true}\n size=\"small\"\n icon={IconType.ArrowLeft2}\n iconPosition=\"left\"\n onClick={onBack}\n isText={true}\n >\n {t(Translation.FindReservation.Back)}\n </BEButton>\n </form>\n );\n\n const signInForm = (\n <>\n <SignInForm onForgotPassword={onForgotPasswordClicked} />\n <LineBreak />\n <div className=\"u-marg-bottom--heavy\">\n <BEButton isText={true} primary={true} size={'small'} onClick={onBackToItineraryClicked}>\n Or use Confirmation/Itinerary Number\n </BEButton>\n </div>\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n No online account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignUpClicked}>\n Sign up\n </BEButton>{' '}\n to save time on your next booking.\n </Text>\n </>\n );\n\n const signUpForm = (\n <>\n <SignUpForm />\n <LineBreak />\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n Already have an account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignInClicked}>\n Sign in\n </BEButton>{' '}\n to login with your account.\n </Text>\n </>\n );\n\n const forgotPasswordForm = (\n <>\n <ForgotPasswordForm onCancelled={onSignInClicked} />\n <LineBreak />\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n No online account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignUpClicked}>\n Sign up\n </BEButton>{' '}\n to save time on your next booking.\n </Text>\n </>\n );\n\n return (\n <div className=\"u-pad-left u-pad-right\">\n <div className=\"container u-marg-top--heavy u-pad-bottom--massive\">\n <div className=\"row u-pad-bottom--massive\">\n <div className=\"col-md-6 col-xl-4 u-fill-white u-pad--heavy u-shadow-accent-large u-border-rounded\">\n <AutoAutoHeight open={true} startOpen={true}>\n <FadeAnimation open={viewingScreen === 'Default'} onExitCompletely={onExit}>\n {defaultContents}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'SignIn'} onExitCompletely={onExit}>\n {signInForm}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'SignUp'} onExitCompletely={onExit}>\n {signUpForm}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'ForgotPassword'} onExitCompletely={onExit}>\n {forgotPasswordForm}\n </FadeAnimation>\n </AutoAutoHeight>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"FindReservation.js","sourceRoot":"/","sources":["src/pages/findReservation/FindReservation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Headline from 'components/generic/Headline';\nimport TextBox from 'components/generic/TextBox';\nimport Text, { TextType } from 'components/generic/Text';\nimport { Color } from 'util/Color';\nimport BEButton from 'components/generic/BEButton';\nimport { useForm } from 'react-hook-form';\nimport { IconType } from 'components/generic/Icon/Icon';\nimport API from 'api/BookingAPI';\nimport AutoAutoHeight from 'animations/AutoAutoHeight';\nimport Alert, { AlertType } from 'components/generic/Alert';\nimport { useHistory, useParams } from 'react-router-dom';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport LineBreak from 'components/generic/LineBreak';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport { Translation } from 'translations/Translation';\nimport StepManager from 'util/StepManager';\nimport { SignInForm } from 'components/User/Forms/SignInForm';\nimport { SignUpForm } from 'components/User/Forms/SignUpForm';\nimport FadeAnimation from 'animations/Fade';\nimport { ForgotPasswordForm } from 'components/User/Forms/ForgotPasswordForm';\nimport { FindReservationViewEvent } from '@frontend/events';\nimport { EViewingScreen } from 'components/generic/modal/SigninModal/UnauthenticatedUserModal';\nimport MemberPortalFeature from 'providers/feature/MemberPortalFeature';\nimport { EMAIL_REGEX } from 'util/Validation';\n\nexport const QUERY_PARAM_NAME = 'path';\n\nexport enum EFindReservationPath {\n FindReservation = 'find-reservation',\n Login = 'login',\n Register = 'register',\n Forgot = 'forgot',\n}\n\nconst pathToScreenMapping: { [path in EFindReservationPath]: EViewingScreen } = {\n [EFindReservationPath.FindReservation]: EViewingScreen.Default,\n [EFindReservationPath.Login]: EViewingScreen.SignIn,\n [EFindReservationPath.Register]: EViewingScreen.SignUp,\n [EFindReservationPath.Forgot]: EViewingScreen.ForgotPassword,\n};\n\ninterface IQueryParams {\n [QUERY_PARAM_NAME]: EFindReservationPath;\n}\n\nexport default function FindReservation() {\n const { hotel } = useCurrentHotel();\n\n const { t } = useTranslation();\n\n const { register, formState, handleSubmit, getValues } = useForm({\n mode: 'onChange',\n });\n\n const errors = formState.errors;\n\n const getValidationClass = (name: string) => {\n if (errors && formState.touchedFields[name]) {\n if (errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n } else {\n return null;\n }\n };\n\n const { path }: IQueryParams = useParams<IQueryParams>();\n const firstTime = useRef<boolean>(true);\n const nextViewingScreen = useRef<EViewingScreen>();\n\n const [isLoading, setIsLoading] = useState(false);\n const [apiErrorMessages, setApiErrorMessages] = useState('');\n const [viewingScreen, setViewingScreen] = useState<EViewingScreen>(pathToScreenMapping[path]);\n\n useEffect(() => {\n if (firstTime.current) {\n firstTime.current = false;\n setViewingScreen(pathToScreenMapping[path]);\n } else {\n setViewingScreen(null);\n nextViewingScreen.current = pathToScreenMapping[path];\n }\n }, [path]);\n\n const history = useHistory();\n\n const onSubmit = () => {\n setIsLoading(true);\n setApiErrorMessages('');\n\n API.Reservation.findReservation(getValues('Ref'), getValues('Email'), hotel.hotelID)\n .then((data) => {\n history.push(`/find-reservation/${getValues('Ref')}/${getValues('Email')}`);\n })\n .catch(({ Message }) => {\n console.log(Message);\n setApiErrorMessages(Message);\n setIsLoading(false);\n });\n };\n\n const { raise } = useEvent();\n\n useEffect(() => {\n const background = document.createElement('div');\n background.classList.add('dbe-background');\n background.style.backgroundImage = `url('${hotel?.heroImage}')`;\n\n RoomstayThemeEngine.EngineContainer.classList.add('--transparent-bg');\n RoomstayThemeEngine.EngineContainer.appendChild(background);\n\n const event = new FindReservationViewEvent();\n raise(event);\n\n return () => {\n try {\n RoomstayThemeEngine.EngineContainer.removeChild(background);\n RoomstayThemeEngine.EngineContainer.classList.remove('--transparent-bg');\n } catch (ex) {\n console.log('Unable to remove bg');\n }\n };\n }, []);\n\n useEffect(() => {\n if (hotel?.forwardFindReservationToSynxis) {\n window.open(`https://be.synxis.com/signin?hotel=` + hotel.hotelID);\n }\n }, [hotel]);\n\n const onBack = async () => {\n history.push(StepManager.getFirstStep().getStepUrl());\n };\n\n const handleSubmitOnClick = () => {\n handleSubmit(onSubmit)();\n };\n\n const onSignInClicked = () => {\n history.push(`/${EFindReservationPath.Login}`);\n };\n\n const onBackToItineraryClicked = () => {\n history.push(`/${EFindReservationPath.FindReservation}`);\n };\n\n const onSignUpClicked = () => {\n history.push(`/${EFindReservationPath.Register}`);\n };\n\n const onForgotPasswordClicked = () => {\n history.push(`/${EFindReservationPath.Forgot}`);\n };\n\n const onExit = () => {\n setViewingScreen(nextViewingScreen.current);\n };\n\n const defaultContents = (\n <form onSubmit={handleSubmit(onSubmit)}>\n <div className=\"u-marg-bottom--heavy\">\n <Headline size=\"extra-large\">{t(Translation.FindReservation.FindYourReservation)}</Headline>\n </div>\n <AutoAutoHeight open={!!apiErrorMessages}>\n <div className=\"u-flex\">\n <Alert type={AlertType.Danger} icon={IconType.Error}>\n <Text type={TextType.Small}>{apiErrorMessages}</Text>\n </Alert>\n </div>\n </AutoAutoHeight>\n <div className=\"u-marg-bottom\">\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Label} color={Color.Navy}>\n <strong>{t(Translation.FindReservation.Confirmation)}</strong>\n </Text>\n </div>\n <TextBox\n placeholder=\"51244AB23101\"\n required={true}\n validationStatus={getValidationClass('Ref')}\n {...register('Ref', {\n required: true,\n })}\n />\n </div>\n <div className=\"u-marg-bottom\">\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Label} color={Color.Navy}>\n <strong>{t(Translation.FindReservation.EmailAddress)}</strong>\n </Text>\n </div>\n <TextBox\n placeholder=\"example@mail.com\"\n required={true}\n validationStatus={getValidationClass('Email')}\n name={'Email'}\n {...register('Email', {\n required: true,\n pattern: {\n value: EMAIL_REGEX,\n message: t(Translation.FindReservation.InvalidEmailAddress),\n },\n })}\n />\n </div>\n <div className=\"u-flex justify-content-end w-100\">\n <BEButton primary={true} filled={true} mobileWidth={true} isLoading={isLoading} icon={IconType.ArrowRight} iconPosition=\"right\" onClick={handleSubmitOnClick}>\n {t(Translation.FindReservation.FindReservation)}\n </BEButton>\n <button type=\"submit\" className=\"u-none\">\n {t(Translation.FindReservation.Submit)}\n </button>\n </div>\n <LineBreak />\n {MemberPortalFeature.isActive() && (\n <div className=\"u-marg-bottom--heavy\">\n <BEButton isText={true} primary={true} size={'small'} onClick={onSignInClicked}>\n Or sign in for more\n </BEButton>\n </div>\n )}\n <div className=\"u-marg-bottom--light\">\n <Text type={TextType.Small}>\n <strong>{t(Translation.FindReservation.Question)}</strong>\n </Text>\n </div>\n <Text type={TextType.Small}>{t(Translation.FindReservation.Answer1)}</Text>\n <Text type={TextType.Small}>{t(Translation.FindReservation.Answer2)}</Text>\n <LineBreak />\n <BEButton\n textColor={Color.Accent}\n primary={false}\n filled={false}\n mobileWidth={true}\n size=\"small\"\n icon={IconType.ArrowLeft2}\n iconPosition=\"left\"\n onClick={onBack}\n isText={true}\n >\n {t(Translation.FindReservation.Back)}\n </BEButton>\n </form>\n );\n\n const signInForm = (\n <>\n <SignInForm onForgotPassword={onForgotPasswordClicked} />\n <LineBreak />\n <div className=\"u-marg-bottom--heavy\">\n <BEButton isText={true} primary={true} size={'small'} onClick={onBackToItineraryClicked}>\n Or use Confirmation/Itinerary Number\n </BEButton>\n </div>\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n No online account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignUpClicked}>\n Sign up\n </BEButton>{' '}\n to save time on your next booking.\n </Text>\n </>\n );\n\n const signUpForm = (\n <>\n <SignUpForm />\n <LineBreak />\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n Already have an account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignInClicked}>\n Sign in\n </BEButton>{' '}\n to login with your account.\n </Text>\n </>\n );\n\n const forgotPasswordForm = (\n <>\n <ForgotPasswordForm onCancelled={onSignInClicked} />\n <LineBreak />\n <Text type={TextType.Small} bold={true} className=\"u-marg-bottom--light\">\n No online account?\n </Text>\n <Text type={TextType.Small}>\n <BEButton isText={true} size={'small'} primary={true} onClick={onSignUpClicked}>\n Sign up\n </BEButton>{' '}\n to save time on your next booking.\n </Text>\n </>\n );\n\n return (\n <div className=\"u-pad-left u-pad-right\">\n <div className=\"container u-marg-top--heavy u-pad-bottom--massive\">\n <div className=\"row u-pad-bottom--massive\">\n <div className=\"col-md-6 col-xl-4 u-fill-white u-pad--heavy u-shadow-accent-large u-border-rounded\">\n <AutoAutoHeight open={true} startOpen={true}>\n <FadeAnimation open={viewingScreen === 'Default'} onExitCompletely={onExit}>\n {defaultContents}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'SignIn'} onExitCompletely={onExit}>\n {signInForm}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'SignUp'} onExitCompletely={onExit}>\n {signUpForm}\n </FadeAnimation>\n <FadeAnimation open={viewingScreen === 'ForgotPassword'} onExitCompletely={onExit}>\n {forgotPasswordForm}\n </FadeAnimation>\n </AutoAutoHeight>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,15 @@
1
1
  import { Translation } from 'translations/Translation';
2
2
  import { DeepPartial } from 'react-hook-form';
3
+ type TTranslation = typeof Translation;
4
+ type TI18nMappedLanguage = {
5
+ translation: TTranslation;
6
+ };
7
+ type TI18nMappedLanguages = {
8
+ [key in Language]?: TI18nMappedLanguage;
9
+ };
10
+ type TLanguageTranslations = {
11
+ [key in Language]?: TTranslation;
12
+ };
3
13
  export declare enum Language {
4
14
  en_us = "en-US",
5
15
  zh_cn = "zh-CN",
@@ -14,13 +24,14 @@ export declare class LanguageProvider {
14
24
  static filterLanguages: Language[];
15
25
  static changeLanguage(lang: Language): void;
16
26
  static getPrettyLanguageName(lang: Language): "" | "English" | "简体中文" | "繁體中文" | "Español" | "Français";
17
- static getI18nMappedLanguages(): any;
27
+ static getI18nMappedLanguages(): TI18nMappedLanguages;
18
28
  private static getOverridesForLanguage;
19
29
  /**
20
30
  * Create a way to override translations for specific languages, and hotels.
21
31
  * @param lang
22
32
  * @param overrideTree
23
33
  */
24
- static registerOverride(lang: Language, overrideTree: DeepPartial<typeof Translation>): void;
25
- static getLanguages(): any;
34
+ static registerOverride(lang: Language, overrideTree: DeepPartial<TTranslation>): void;
35
+ static getLanguages(): TLanguageTranslations;
26
36
  }
37
+ export {};
@@ -4,6 +4,7 @@ exports.LanguageProvider = exports.Language = void 0;
4
4
  const en_gb_1 = require("translations/languages/en-gb");
5
5
  const i18next_1 = require("i18next");
6
6
  const RoomstayThemeEngine_1 = require("providers/RoomstayThemeEngine");
7
+ const ObjectHelper_1 = require("../util/ObjectHelper");
7
8
  var Language;
8
9
  (function (Language) {
9
10
  Language["en_us"] = "en-US";
@@ -48,24 +49,7 @@ class LanguageProvider {
48
49
  static getOverridesForLanguage(lang) {
49
50
  const languages = this.getLanguages();
50
51
  const translation = languages[lang];
51
- if (LanguageProvider.overrides[lang]) {
52
- const goDeeperAndCheckIsObject = (currentDepth, history) => {
53
- Object.keys(currentDepth).forEach((currentDepthKey) => {
54
- if (typeof currentDepth[currentDepthKey] === 'object') {
55
- goDeeperAndCheckIsObject(currentDepth[currentDepthKey], [...history, currentDepthKey]);
56
- }
57
- else {
58
- let mutable;
59
- history.forEach((depth) => {
60
- mutable = (mutable !== null && mutable !== void 0 ? mutable : translation)[depth];
61
- });
62
- mutable[currentDepthKey] = currentDepth[currentDepthKey];
63
- }
64
- });
65
- };
66
- goDeeperAndCheckIsObject(LanguageProvider.overrides[lang], []);
67
- }
68
- return translation;
52
+ return (0, ObjectHelper_1.mergeDeep)(translation, LanguageProvider.overrides[lang]);
69
53
  }
70
54
  /**
71
55
  * Create a way to override translations for specific languages, and hotels.
@@ -73,7 +57,7 @@ class LanguageProvider {
73
57
  * @param overrideTree
74
58
  */
75
59
  static registerOverride(lang, overrideTree) {
76
- LanguageProvider.overrides[lang] = overrideTree;
60
+ LanguageProvider.overrides[lang] = (0, ObjectHelper_1.mergeDeep)(LanguageProvider.overrides[lang], overrideTree);
77
61
  // Check required for making sure Lang is loaded first.
78
62
  if (i18next_1.default && i18next_1.default.addResourceBundle) {
79
63
  i18next_1.default.addResourceBundle(lang, 'translation', this.getOverridesForLanguage(lang));
@@ -1 +1 @@
1
- {"version":3,"file":"LanguageProvider.js","sourceRoot":"/","sources":["src/providers/LanguageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import common_en from 'translations/languages/en-gb';\n\nimport i18n from 'i18next';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport { Translation } from 'translations/Translation';\nimport { DeepPartial } from 'react-hook-form';\n\nexport enum Language {\n en_us = 'en-US',\n zh_cn = 'zh-CN',\n zh_tw = 'zh-TW',\n es = 'es',\n fr = 'fr',\n clear = 'testing_only', // TODO remove before live\n}\n\nexport class LanguageProvider {\n private static overrides: { [name: string]: any } = {};\n\n private static languages: { [langType in Language]?: any } = {\n [Language.en_us]: common_en,\n [Language.es]: common_en,\n [Language.fr]: common_en,\n [Language.zh_cn]: common_en,\n [Language.zh_tw]: common_en,\n };\n\n public static filterLanguages: Language[] = [];\n\n public static changeLanguage(lang: Language) {\n RoomstayThemeEngine.selectedLang = lang;\n i18n.changeLanguage(lang);\n }\n\n public static getPrettyLanguageName(lang: Language) {\n switch (lang) {\n case Language.en_us:\n return 'English';\n case Language.zh_cn:\n return '简体中文';\n case Language.zh_tw:\n return '繁體中文';\n case Language.es:\n return 'Español';\n case Language.fr:\n return 'Français';\n default:\n return '';\n }\n }\n\n public static getI18nMappedLanguages(): any {\n const workingMappings: any = {};\n\n const languages = this.getLanguages();\n\n Object.keys(languages).forEach((key: Language) => {\n const translation = this.getOverridesForLanguage(key);\n\n workingMappings[key] = {\n translation,\n };\n });\n\n return workingMappings;\n }\n\n private static getOverridesForLanguage(lang: Language) {\n const languages = this.getLanguages();\n const translation = languages[lang];\n\n if (LanguageProvider.overrides[lang]) {\n const goDeeperAndCheckIsObject = (currentDepth: any, history: string[]) => {\n Object.keys(currentDepth).forEach((currentDepthKey) => {\n if (typeof currentDepth[currentDepthKey] === 'object') {\n goDeeperAndCheckIsObject(currentDepth[currentDepthKey], [...history, currentDepthKey]);\n } else {\n let mutable: any;\n history.forEach((depth) => {\n mutable = (mutable ?? translation)[depth];\n });\n\n mutable[currentDepthKey] = currentDepth[currentDepthKey];\n }\n });\n };\n\n goDeeperAndCheckIsObject(LanguageProvider.overrides[lang], []);\n }\n\n return translation;\n }\n\n /**\n * Create a way to override translations for specific languages, and hotels.\n * @param lang\n * @param overrideTree\n */\n public static registerOverride(lang: Language, overrideTree: DeepPartial<typeof Translation>) {\n LanguageProvider.overrides[lang] = overrideTree;\n\n // Check required for making sure Lang is loaded first.\n if (i18n && i18n.addResourceBundle) {\n i18n.addResourceBundle(lang, 'translation', this.getOverridesForLanguage(lang));\n }\n }\n\n public static getLanguages(): any {\n if (this.filterLanguages.length >= 1) {\n const filteredLanguages: any = {};\n\n this.filterLanguages.map((lang) => {\n filteredLanguages[lang] = this.languages[lang];\n });\n\n return filteredLanguages;\n } else {\n return this.languages;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"LanguageProvider.js","sourceRoot":"/","sources":["src/providers/LanguageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import common_en from 'translations/languages/en-gb';\n\nimport i18n from 'i18next';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport { Translation } from 'translations/Translation';\nimport { DeepPartial } from 'react-hook-form';\nimport { mergeDeep } from '../util/ObjectHelper';\n\ntype TTranslation = typeof Translation;\ntype TI18nMappedLanguage = {\n translation: TTranslation;\n};\ntype TI18nMappedLanguages = {\n [key in Language]?: TI18nMappedLanguage;\n};\n\ntype TLanguageTranslations = {\n [key in Language]?: TTranslation;\n};\n\nexport enum Language {\n en_us = 'en-US',\n zh_cn = 'zh-CN',\n zh_tw = 'zh-TW',\n es = 'es',\n fr = 'fr',\n clear = 'testing_only', // TODO remove before live\n}\n\nexport class LanguageProvider {\n private static overrides: { [name: string]: TTranslation } = {};\n\n private static languages: { [langType in Language]?: TTranslation } = {\n [Language.en_us]: common_en,\n [Language.es]: common_en,\n [Language.fr]: common_en,\n [Language.zh_cn]: common_en,\n [Language.zh_tw]: common_en,\n };\n\n public static filterLanguages: Language[] = [];\n\n public static changeLanguage(lang: Language) {\n RoomstayThemeEngine.selectedLang = lang;\n i18n.changeLanguage(lang);\n }\n\n public static getPrettyLanguageName(lang: Language) {\n switch (lang) {\n case Language.en_us:\n return 'English';\n case Language.zh_cn:\n return '简体中文';\n case Language.zh_tw:\n return '繁體中文';\n case Language.es:\n return 'Español';\n case Language.fr:\n return 'Français';\n default:\n return '';\n }\n }\n\n public static getI18nMappedLanguages(): TI18nMappedLanguages {\n const workingMappings: TI18nMappedLanguages = {};\n\n const languages = this.getLanguages();\n\n Object.keys(languages).forEach((key: Language) => {\n const translation = this.getOverridesForLanguage(key);\n\n workingMappings[key] = {\n translation,\n };\n });\n\n return workingMappings;\n }\n\n private static getOverridesForLanguage(lang: Language) {\n const languages = this.getLanguages();\n const translation = languages[lang];\n return mergeDeep<TTranslation>(translation, LanguageProvider.overrides[lang]);\n }\n\n /**\n * Create a way to override translations for specific languages, and hotels.\n * @param lang\n * @param overrideTree\n */\n public static registerOverride(lang: Language, overrideTree: DeepPartial<TTranslation>) {\n LanguageProvider.overrides[lang] = mergeDeep<TTranslation>(LanguageProvider.overrides[lang], overrideTree);\n\n // Check required for making sure Lang is loaded first.\n if (i18n && i18n.addResourceBundle) {\n i18n.addResourceBundle(lang, 'translation', this.getOverridesForLanguage(lang));\n }\n }\n\n public static getLanguages(): TLanguageTranslations {\n if (this.filterLanguages.length >= 1) {\n const filteredLanguages: TLanguageTranslations = {};\n\n this.filterLanguages.map((lang) => {\n filteredLanguages[lang] = this.languages[lang];\n });\n\n return filteredLanguages;\n } else {\n return this.languages;\n }\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { BasketContextType } from '@frontend/contexts';
2
+ import BasketRow from 'models/BasketRow';
3
+ import { IPromotion } from 'models/Promotion/IPromotion.type';
4
+ export declare const registerPromotion: (promotion: IPromotion) => void;
5
+ export declare const removePromotion: (promotion: IPromotion) => void;
6
+ /**
7
+ * Used by the Basket context to bind to state.
8
+ */
9
+ export declare const usePromotionContainer: ({ selectedBasketRow, updateBasketRow }: {
10
+ selectedBasketRow: BasketRow;
11
+ updateBasketRow: BasketContextType['updateBasketRow'];
12
+ }) => {
13
+ loadedPromotion: IPromotion;
14
+ };
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.usePromotionContainer = exports.removePromotion = exports.registerPromotion = void 0;
13
+ const contexts_1 = require("@frontend/contexts");
14
+ const dayjs = require("dayjs");
15
+ const MemberOnlyFenceSignUp_1 = require("events/actions/MemberOnlyFence/MemberOnlyFenceSignUp");
16
+ const PromotionAddedEvent_1 = require("events/actions/Promotion/PromotionAddedEvent");
17
+ const PromotionClickedEvent_1 = require("events/actions/Promotion/PromotionClickedEvent");
18
+ const PromotionRemovedEvent_1 = require("events/actions/Promotion/PromotionRemovedEvent");
19
+ const RoomstayEventManager_1 = require("events/RoomstayEventManager");
20
+ const EventHook_1 = require("hooks/EventHook");
21
+ const react_1 = require("react");
22
+ let _loadedPromotions = [];
23
+ let basketContextLoaded = false;
24
+ const registerPromotion = (promotion) => {
25
+ if (basketContextLoaded) {
26
+ RoomstayEventManager_1.default.raise(new PromotionAddedEvent_1.PromotionAddEvent(promotion));
27
+ }
28
+ else {
29
+ const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);
30
+ if (promoIndex === -1) {
31
+ _loadedPromotions.push(promotion);
32
+ }
33
+ else {
34
+ _loadedPromotions[promoIndex] = promotion;
35
+ }
36
+ }
37
+ };
38
+ exports.registerPromotion = registerPromotion;
39
+ const removePromotion = (promotion) => {
40
+ if (basketContextLoaded) {
41
+ RoomstayEventManager_1.default.raise(new PromotionRemovedEvent_1.PromotionRemoveEvent(promotion));
42
+ }
43
+ else {
44
+ const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);
45
+ if (promoIndex !== -1) {
46
+ _loadedPromotions.splice(promoIndex, 1);
47
+ }
48
+ }
49
+ };
50
+ exports.removePromotion = removePromotion;
51
+ const getPromoIndex = (name, promoList) => {
52
+ for (let i = 0; i < promoList.length; i++) {
53
+ if (promoList[i].name === name) {
54
+ return i;
55
+ }
56
+ }
57
+ return -1;
58
+ };
59
+ /**
60
+ * Used by the Basket context to bind to state.
61
+ */
62
+ const usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
63
+ const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
64
+ const [bump, setBump] = (0, react_1.useState)(0);
65
+ const [allPromotions, setAllPromotions] = (0, react_1.useState)(_loadedPromotions !== null && _loadedPromotions !== void 0 ? _loadedPromotions : []);
66
+ // TODO: Current implementation only supports a single promotion. In the future there will be multiple promotion locations
67
+ const [loadedPromotion, setLoadedPromotion] = (0, react_1.useState)(null);
68
+ const { on } = (0, EventHook_1.useEvent)();
69
+ (0, react_1.useEffect)(() => {
70
+ basketContextLoaded = true;
71
+ const updateBasketRowContext = (promotion) => {
72
+ if (!promotion) {
73
+ // We don't care about non promo sign ups;
74
+ return;
75
+ }
76
+ if (selectedBasketRow) {
77
+ const criteria = {
78
+ checkInDate: selectedBasketRow.getStartDate(),
79
+ checkOutDate: selectedBasketRow.getEndDate(),
80
+ adults: selectedBasketRow.getAdults(),
81
+ children: selectedBasketRow.getChildren(),
82
+ promoCode: selectedBasketRow.getPromoCode(),
83
+ };
84
+ const { checkInDate, checkOutDate, adults, children, promoCode } = promotion.onApply(criteria);
85
+ if (checkInDate) {
86
+ selectedBasketRow.setStartDate(dayjs(checkInDate));
87
+ }
88
+ if (checkOutDate) {
89
+ selectedBasketRow.setEndDate(dayjs(checkOutDate));
90
+ }
91
+ if (adults) {
92
+ selectedBasketRow.setAdults(adults);
93
+ }
94
+ if (children) {
95
+ selectedBasketRow.setChildren(children);
96
+ }
97
+ if (promoCode) {
98
+ selectedBasketRow.setPromoCode(promoCode);
99
+ }
100
+ updateBasketRow(selectedBasketRow);
101
+ }
102
+ };
103
+ on(PromotionAddedEvent_1.PromotionAddEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
104
+ if (event === null || event === void 0 ? void 0 : event.promotion) {
105
+ setAllPromotions((oldPromotions) => {
106
+ const promoIndex = getPromoIndex(event.promotion.name, oldPromotions);
107
+ if (promoIndex === -1) {
108
+ return [...oldPromotions, event.promotion];
109
+ }
110
+ else {
111
+ oldPromotions[promoIndex] = event.promotion;
112
+ return oldPromotions;
113
+ }
114
+ });
115
+ }
116
+ }), 'root');
117
+ on(PromotionRemovedEvent_1.PromotionRemoveEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
118
+ if (event === null || event === void 0 ? void 0 : event.promotion) {
119
+ setAllPromotions((oldPromotions) => {
120
+ if (oldPromotions.length === 0) {
121
+ return [];
122
+ }
123
+ return oldPromotions.filter((promo) => {
124
+ if (promo.name !== event.promotion.name) {
125
+ return promo;
126
+ }
127
+ return false;
128
+ });
129
+ });
130
+ setBump((a) => a + 1);
131
+ }
132
+ }), 'root');
133
+ on(PromotionClickedEvent_1.PromotionClickedEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
134
+ const { promotion } = event;
135
+ if (!promotion) {
136
+ // We shouldn't be here, but just in case we are...
137
+ return;
138
+ }
139
+ if (!ccx.signedInUser && promotion.requireMemberPromotion) {
140
+ ccx.openMemberSignupModal(promotion);
141
+ }
142
+ else {
143
+ updateBasketRowContext(promotion);
144
+ }
145
+ }), 'root');
146
+ on(MemberOnlyFenceSignUp_1.MemberOnlyFenceSignUp, (event) => __awaiter(void 0, void 0, void 0, function* () {
147
+ updateBasketRowContext(event.promotion);
148
+ }), 'root');
149
+ }, [ccx.signedInUser, selectedBasketRow, allPromotions, setAllPromotions, loadedPromotion, setLoadedPromotion]);
150
+ (0, react_1.useEffect)(() => {
151
+ if (selectedBasketRow) {
152
+ const criteria = {
153
+ checkInDate: selectedBasketRow.getStartDate(),
154
+ checkOutDate: selectedBasketRow.getEndDate(),
155
+ adults: selectedBasketRow.getAdults(),
156
+ children: selectedBasketRow.getChildren(),
157
+ promoCode: selectedBasketRow.getPromoCode(),
158
+ };
159
+ onPromotionCriteriaChanged(criteria);
160
+ }
161
+ }, [
162
+ selectedBasketRow,
163
+ selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getAdults(),
164
+ selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getChildren(),
165
+ selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getArrivalDate(),
166
+ selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getEndDate(),
167
+ selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getPromoCode(),
168
+ allPromotions,
169
+ bump,
170
+ ]);
171
+ (0, react_1.useEffect)(() => {
172
+ if (!loadedPromotion) {
173
+ return;
174
+ }
175
+ let loadedExists = false;
176
+ for (const promotion of allPromotions) {
177
+ if (promotion.name === loadedPromotion.name) {
178
+ loadedExists = true;
179
+ break;
180
+ }
181
+ }
182
+ if (!loadedExists) {
183
+ setLoadedPromotion(null);
184
+ }
185
+ }, [allPromotions, loadedPromotion]);
186
+ /**
187
+ * Checks all the registered promotions, and returns the first one that matches the criteria.
188
+ *
189
+ * @param criteria
190
+ */
191
+ const checkPromotions = (criteria) => __awaiter(void 0, void 0, void 0, function* () {
192
+ for (const promotion of allPromotions) {
193
+ if (yield promotion.testCriteria(criteria)) {
194
+ return promotion;
195
+ }
196
+ }
197
+ return null;
198
+ });
199
+ const onPromotionCriteriaChanged = (criteria) => {
200
+ checkPromotions(criteria)
201
+ .then((promo) => {
202
+ setLoadedPromotion(promo);
203
+ })
204
+ .catch(() => {
205
+ setLoadedPromotion(null);
206
+ });
207
+ };
208
+ return {
209
+ loadedPromotion,
210
+ };
211
+ };
212
+ exports.usePromotionContainer = usePromotionContainer;
213
+ //# sourceMappingURL=PromotionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromotionProvider.js","sourceRoot":"/","sources":["src/providers/PromotionProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BasketContextType, CompanyContext } from '@frontend/contexts';\nimport * as dayjs from 'dayjs';\nimport { MemberOnlyFenceSignUp } from 'events/actions/MemberOnlyFence/MemberOnlyFenceSignUp';\nimport { PromotionAddEvent } from 'events/actions/Promotion/PromotionAddedEvent';\nimport { PromotionClickedEvent } from 'events/actions/Promotion/PromotionClickedEvent';\nimport { PromotionRemoveEvent } from 'events/actions/Promotion/PromotionRemovedEvent';\nimport RoomstayEventManager from 'events/RoomstayEventManager';\nimport { useEvent } from 'hooks/EventHook';\nimport BasketRow from 'models/BasketRow';\nimport { IPromotion, IPromotionTestCriteria } from 'models/Promotion/IPromotion.type';\nimport { useContext, useEffect, useState } from 'react';\n\nlet _loadedPromotions: IPromotion[] = [];\nlet basketContextLoaded = false;\n\nexport const registerPromotion = (promotion: IPromotion) => {\n if (basketContextLoaded) {\n RoomstayEventManager.raise(new PromotionAddEvent(promotion));\n } else {\n const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);\n\n if (promoIndex === -1) {\n _loadedPromotions.push(promotion);\n } else {\n _loadedPromotions[promoIndex] = promotion;\n }\n }\n};\n\nexport const removePromotion = (promotion: IPromotion) => {\n if (basketContextLoaded) {\n RoomstayEventManager.raise(new PromotionRemoveEvent(promotion));\n } else {\n const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);\n\n if (promoIndex !== -1) {\n _loadedPromotions.splice(promoIndex, 1);\n }\n }\n};\n\nconst getPromoIndex = (name: string, promoList: IPromotion[]) => {\n for (let i = 0; i < promoList.length; i++) {\n if (promoList[i].name === name) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Used by the Basket context to bind to state.\n */\nexport const usePromotionContainer = ({ selectedBasketRow, updateBasketRow }: { selectedBasketRow: BasketRow; updateBasketRow: BasketContextType['updateBasketRow'] }) => {\n const ccx = useContext(CompanyContext);\n\n const [bump, setBump] = useState(0);\n const [allPromotions, setAllPromotions] = useState<IPromotion[]>(_loadedPromotions ?? []);\n\n // TODO: Current implementation only supports a single promotion. In the future there will be multiple promotion locations\n const [loadedPromotion, setLoadedPromotion] = useState<IPromotion>(null);\n\n const { on } = useEvent();\n\n useEffect(() => {\n basketContextLoaded = true;\n\n const updateBasketRowContext = (promotion: IPromotion) => {\n if (!promotion) {\n // We don't care about non promo sign ups;\n return;\n }\n\n if (selectedBasketRow) {\n const criteria = {\n checkInDate: selectedBasketRow.getStartDate(),\n checkOutDate: selectedBasketRow.getEndDate(),\n adults: selectedBasketRow.getAdults(),\n children: selectedBasketRow.getChildren(),\n promoCode: selectedBasketRow.getPromoCode(),\n };\n\n const { checkInDate, checkOutDate, adults, children, promoCode } = promotion.onApply(criteria);\n\n if (checkInDate) {\n selectedBasketRow.setStartDate(dayjs(checkInDate));\n }\n\n if (checkOutDate) {\n selectedBasketRow.setEndDate(dayjs(checkOutDate));\n }\n\n if (adults) {\n selectedBasketRow.setAdults(adults);\n }\n\n if (children) {\n selectedBasketRow.setChildren(children);\n }\n\n if (promoCode) {\n selectedBasketRow.setPromoCode(promoCode);\n }\n\n updateBasketRow(selectedBasketRow);\n }\n };\n\n on(\n PromotionAddEvent,\n async (event: PromotionAddEvent) => {\n if (event?.promotion) {\n setAllPromotions((oldPromotions) => {\n const promoIndex = getPromoIndex(event.promotion.name, oldPromotions);\n\n if (promoIndex === -1) {\n return [...oldPromotions, event.promotion];\n } else {\n oldPromotions[promoIndex] = event.promotion;\n return oldPromotions;\n }\n });\n }\n },\n 'root'\n );\n\n on(\n PromotionRemoveEvent,\n async (event: PromotionRemoveEvent) => {\n if (event?.promotion) {\n setAllPromotions((oldPromotions) => {\n if (oldPromotions.length === 0) {\n return [];\n }\n\n return oldPromotions.filter((promo) => {\n if (promo.name !== event.promotion.name) {\n return promo;\n }\n return false;\n });\n });\n\n setBump((a) => a + 1);\n }\n },\n 'root'\n );\n\n on(\n PromotionClickedEvent,\n async (event: PromotionClickedEvent) => {\n const { promotion } = event;\n\n if (!promotion) {\n // We shouldn't be here, but just in case we are...\n return;\n }\n\n if (!ccx.signedInUser && promotion.requireMemberPromotion) {\n ccx.openMemberSignupModal(promotion);\n } else {\n updateBasketRowContext(promotion);\n }\n },\n 'root'\n );\n\n on(\n MemberOnlyFenceSignUp,\n async (event: MemberOnlyFenceSignUp) => {\n updateBasketRowContext(event.promotion);\n },\n 'root'\n );\n }, [ccx.signedInUser, selectedBasketRow, allPromotions, setAllPromotions, loadedPromotion, setLoadedPromotion]);\n\n useEffect(() => {\n if (selectedBasketRow) {\n const criteria = {\n checkInDate: selectedBasketRow.getStartDate(),\n checkOutDate: selectedBasketRow.getEndDate(),\n adults: selectedBasketRow.getAdults(),\n children: selectedBasketRow.getChildren(),\n promoCode: selectedBasketRow.getPromoCode(),\n };\n\n onPromotionCriteriaChanged(criteria);\n }\n }, [\n selectedBasketRow,\n selectedBasketRow?.getAdults(),\n selectedBasketRow?.getChildren(),\n selectedBasketRow?.getArrivalDate(),\n selectedBasketRow?.getEndDate(),\n selectedBasketRow?.getPromoCode(),\n allPromotions,\n bump,\n ]);\n\n useEffect(() => {\n if (!loadedPromotion) {\n return;\n }\n\n let loadedExists = false;\n for (const promotion of allPromotions) {\n if (promotion.name === loadedPromotion.name) {\n loadedExists = true;\n break;\n }\n }\n\n if (!loadedExists) {\n setLoadedPromotion(null);\n }\n }, [allPromotions, loadedPromotion]);\n\n /**\n * Checks all the registered promotions, and returns the first one that matches the criteria.\n *\n * @param criteria\n */\n const checkPromotions = async (criteria: IPromotionTestCriteria) => {\n for (const promotion of allPromotions) {\n if (await promotion.testCriteria(criteria)) {\n return promotion;\n }\n }\n\n return null;\n };\n\n const onPromotionCriteriaChanged = (criteria: IPromotionTestCriteria) => {\n checkPromotions(criteria)\n .then((promo) => {\n setLoadedPromotion(promo);\n })\n .catch(() => {\n setLoadedPromotion(null);\n });\n };\n\n return {\n loadedPromotion,\n };\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { DeepPartial } from 'react-hook-form';
2
+ export declare const isObject: (item?: any) => boolean;
3
+ export declare const getKeys: (item?: any) => string[];
4
+ export declare const mergeDeep: <TObject extends Record<any, any>>(target?: TObject, source?: DeepPartial<TObject>) => TObject;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeDeep = exports.getKeys = exports.isObject = void 0;
4
+ const isObject = (item) => item && typeof item === 'object' && !Array.isArray(item);
5
+ exports.isObject = isObject;
6
+ const getKeys = (item) => ((0, exports.isObject)(item) ? Object.keys(item) : []);
7
+ exports.getKeys = getKeys;
8
+ const mergeDeep = (target, source) => {
9
+ if ((0, exports.isObject)(target) || (0, exports.isObject)(source)) {
10
+ const newObject = {};
11
+ const allKeys = (0, exports.getKeys)(target).concat((0, exports.getKeys)(source));
12
+ for (const key of allKeys) {
13
+ if ((0, exports.isObject)(source === null || source === void 0 ? void 0 : source[key]) || (0, exports.isObject)(target === null || target === void 0 ? void 0 : target[key])) {
14
+ newObject[key] = (0, exports.mergeDeep)(target === null || target === void 0 ? void 0 : target[key], source === null || source === void 0 ? void 0 : source[key]);
15
+ }
16
+ else
17
+ Object.assign(newObject, { [key]: (source === null || source === void 0 ? void 0 : source[key]) || (target === null || target === void 0 ? void 0 : target[key]) });
18
+ }
19
+ return newObject;
20
+ }
21
+ else
22
+ return target;
23
+ };
24
+ exports.mergeDeep = mergeDeep;
25
+ //# sourceMappingURL=ObjectHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectHelper.js","sourceRoot":"/","sources":["src/util/ObjectHelper.ts"],"names":[],"mappings":";;;AAEO,MAAM,QAAQ,GAAG,CAAC,IAAU,EAAW,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAA7F,QAAA,QAAQ,YAAqF;AACnG,MAAM,OAAO,GAAG,CAAC,IAAU,EAAY,EAAE,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAA9E,QAAA,OAAO,WAAuE;AACpF,MAAM,SAAS,GAAG,CAAmC,MAAuB,EAAE,MAAoC,EAA8B,EAAE;IACrJ,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,IAAI,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE;QACtC,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAA,eAAO,EAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACvB,IAAI,IAAA,gBAAQ,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,CAAC,IAAI,IAAA,gBAAQ,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,CAAC,EAAE;gBACpD,SAAS,CAAC,GAAG,CAAC,GAAG,IAAA,iBAAS,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,CAAC,CAAC;aAC5D;;gBAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,MAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,CAAA,EAAE,CAAC,CAAC;SAC9E;QACD,OAAO,SAAS,CAAC;KACpB;;QAAM,OAAO,MAAM,CAAC;AACzB,CAAC,CAAC;AAXW,QAAA,SAAS,aAWpB","sourcesContent":["import { DeepPartial } from 'react-hook-form';\n\nexport const isObject = (item?: any): boolean => item && typeof item === 'object' && !Array.isArray(item);\nexport const getKeys = (item?: any): string[] => (isObject(item) ? Object.keys(item) : []);\nexport const mergeDeep = <TObject extends Record<any, any>>(target?: TObject | null, source?: DeepPartial<TObject> | null): TObject | null | undefined => {\n if (isObject(target) || isObject(source)) {\n const newObject: Record<any, any> = {};\n const allKeys = getKeys(target).concat(getKeys(source));\n for (const key of allKeys) {\n if (isObject(source?.[key]) || isObject(target?.[key])) {\n newObject[key] = mergeDeep(target?.[key], source?.[key]);\n } else Object.assign(newObject, { [key]: source?.[key] || target?.[key] });\n }\n return newObject;\n } else return target;\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import { ValidationValueMessage } from 'react-hook-form';
2
+ export declare const EMAIL_REGEX: RegExp;
2
3
  export declare const passwordRegex: RegExp;
3
4
  export declare const passwordPatternValidationMessage = "Password must have at least 8 characters long, case sensitive, can contain !$#%, no spaces.";
4
5
  export declare const passwordMatchValidationMessage = "Password and Repeat Password have to match";
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeRequiredRule = exports.makeRequiredValidationMessage = exports.emailPatternRule = exports.emailPatternValidationMessage = exports.emailRegex = exports.isPassWordMatch = exports.passwordPatternRule = exports.passwordMatchValidationMessage = exports.passwordPatternValidationMessage = exports.passwordRegex = void 0;
3
+ exports.makeRequiredRule = exports.makeRequiredValidationMessage = exports.emailPatternRule = exports.emailPatternValidationMessage = exports.emailRegex = exports.isPassWordMatch = exports.passwordPatternRule = exports.passwordMatchValidationMessage = exports.passwordPatternValidationMessage = exports.passwordRegex = exports.EMAIL_REGEX = void 0;
4
+ exports.EMAIL_REGEX = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
4
5
  exports.passwordRegex = /^[A-Za-z\d!$#%]{8,}$/;
5
6
  exports.passwordPatternValidationMessage = 'Password must have at least 8 characters long, case sensitive, can contain !$#%, no spaces.';
6
7
  exports.passwordMatchValidationMessage = 'Password and Repeat Password have to match';
@@ -1 +1 @@
1
- {"version":3,"file":"Validation.js","sourceRoot":"/","sources":["src/util/Validation.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAG,sBAAsB,CAAC;AACvC,QAAA,gCAAgC,GAAG,6FAA6F,CAAC;AACjI,QAAA,8BAA8B,GAAG,4CAA4C,CAAC;AAC9E,QAAA,mBAAmB,GAAG;IAC/B,KAAK,EAAE,qBAAa;IACpB,OAAO,EAAE,wCAAgC;CAC5C,CAAC;AACK,MAAM,eAAe,GAAG,CAAC,aAAqB,EAAE,EAAE,CAAC,CAAC,cAAsB,EAAE,EAAE;IACjF,OAAO,CAAC,cAAc,IAAI,cAAc,KAAK,aAAa,IAAI,sCAA8B,CAAC;AACjG,CAAC,CAAC;AAFW,QAAA,eAAe,mBAE1B;AAEW,QAAA,UAAU,GAAG,wJAAwJ,CAAC;AACtK,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,gBAAgB,GAAG;IAC5B,KAAK,EAAE,kBAAU;IACjB,OAAO,EAAE,qCAA6B;CACzC,CAAC;AAEK,MAAM,6BAA6B,GAAG,CAAC,UAAmB,EAAU,EAAE,CAAC,GAAG,UAAU,IAAI,YAAY,cAAc,CAAC;AAA7G,QAAA,6BAA6B,iCAAgF;AACnH,MAAM,gBAAgB,GAAG,CAAC,UAAmB,EAAE,UAAmB,EAAmC,EAAE,CAAC,CAAC;IAC5G,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,IAAA,qCAA6B,EAAC,UAAU,CAAC;CACrD,CAAC,CAAC;AAHU,QAAA,gBAAgB,oBAG1B","sourcesContent":["import { ValidationValueMessage } from 'react-hook-form';\n\nexport const passwordRegex = /^[A-Za-z\\d!$#%]{8,}$/;\nexport const passwordPatternValidationMessage = 'Password must have at least 8 characters long, case sensitive, can contain !$#%, no spaces.';\nexport const passwordMatchValidationMessage = 'Password and Repeat Password have to match';\nexport const passwordPatternRule = {\n value: passwordRegex,\n message: passwordPatternValidationMessage,\n};\nexport const isPassWordMatch = (passwordValue: string) => (repeatPassword: string) => {\n return !repeatPassword || repeatPassword === passwordValue || passwordMatchValidationMessage;\n};\n\nexport const emailRegex = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\nexport const emailPatternValidationMessage = 'Email is invalid';\nexport const emailPatternRule = {\n value: emailRegex,\n message: emailPatternValidationMessage,\n};\n\nexport const makeRequiredValidationMessage = (fieldLabel?: string): string => `${fieldLabel || 'This field'} is required`;\nexport const makeRequiredRule = (isRequired: boolean, fieldLabel?: string): ValidationValueMessage<boolean> => ({\n value: isRequired,\n message: makeRequiredValidationMessage(fieldLabel),\n});\n"]}
1
+ {"version":3,"file":"Validation.js","sourceRoot":"/","sources":["src/util/Validation.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,wJAAwJ,CAAC;AACvK,QAAA,aAAa,GAAG,sBAAsB,CAAC;AACvC,QAAA,gCAAgC,GAAG,6FAA6F,CAAC;AACjI,QAAA,8BAA8B,GAAG,4CAA4C,CAAC;AAC9E,QAAA,mBAAmB,GAAG;IAC/B,KAAK,EAAE,qBAAa;IACpB,OAAO,EAAE,wCAAgC;CAC5C,CAAC;AACK,MAAM,eAAe,GAAG,CAAC,aAAqB,EAAE,EAAE,CAAC,CAAC,cAAsB,EAAE,EAAE;IACjF,OAAO,CAAC,cAAc,IAAI,cAAc,KAAK,aAAa,IAAI,sCAA8B,CAAC;AACjG,CAAC,CAAC;AAFW,QAAA,eAAe,mBAE1B;AAEW,QAAA,UAAU,GAAG,wJAAwJ,CAAC;AACtK,QAAA,6BAA6B,GAAG,kBAAkB,CAAC;AACnD,QAAA,gBAAgB,GAAG;IAC5B,KAAK,EAAE,kBAAU;IACjB,OAAO,EAAE,qCAA6B;CACzC,CAAC;AAEK,MAAM,6BAA6B,GAAG,CAAC,UAAmB,EAAU,EAAE,CAAC,GAAG,UAAU,IAAI,YAAY,cAAc,CAAC;AAA7G,QAAA,6BAA6B,iCAAgF;AACnH,MAAM,gBAAgB,GAAG,CAAC,UAAmB,EAAE,UAAmB,EAAmC,EAAE,CAAC,CAAC;IAC5G,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,IAAA,qCAA6B,EAAC,UAAU,CAAC;CACrD,CAAC,CAAC;AAHU,QAAA,gBAAgB,oBAG1B","sourcesContent":["import { ValidationValueMessage } from 'react-hook-form';\n\nexport const EMAIL_REGEX = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\nexport const passwordRegex = /^[A-Za-z\\d!$#%]{8,}$/;\nexport const passwordPatternValidationMessage = 'Password must have at least 8 characters long, case sensitive, can contain !$#%, no spaces.';\nexport const passwordMatchValidationMessage = 'Password and Repeat Password have to match';\nexport const passwordPatternRule = {\n value: passwordRegex,\n message: passwordPatternValidationMessage,\n};\nexport const isPassWordMatch = (passwordValue: string) => (repeatPassword: string) => {\n return !repeatPassword || repeatPassword === passwordValue || passwordMatchValidationMessage;\n};\n\nexport const emailRegex = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\nexport const emailPatternValidationMessage = 'Email is invalid';\nexport const emailPatternRule = {\n value: emailRegex,\n message: emailPatternValidationMessage,\n};\n\nexport const makeRequiredValidationMessage = (fieldLabel?: string): string => `${fieldLabel || 'This field'} is required`;\nexport const makeRequiredRule = (isRequired: boolean, fieldLabel?: string): ValidationValueMessage<boolean> => ({\n value: isRequired,\n message: makeRequiredValidationMessage(fieldLabel),\n});\n"]}