@roomstay/frontend 1.6.0-0 → 1.6.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.
@@ -236,7 +236,8 @@ function MemberSignInModal(props) {
236
236
  __html: modalTitle,
237
237
  } }))),
238
238
  React.createElement("div", { className: "u-marg-bottom" },
239
- React.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey }, t(Translation_1.Translation.MemberOnlyPopup.Subtitle))),
239
+ React.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey },
240
+ React.createElement("span", { dangerouslySetInnerHTML: { __html: t(Translation_1.Translation.MemberOnlyPopup.Subtitle) } }))),
240
241
  React.createElement(react_hook_form_1.FormProvider, Object.assign({}, methods),
241
242
  React.createElement("div", null, modalInputs.Lines.map((inputLine, lineIndex) => {
242
243
  return (React.createElement(InputGroup_1.default, { dimensions: inputLine.Dimension, key: lineIndex }, inputLine.Inputs.map((input, inputIndex) => {
@@ -1 +1 @@
1
- {"version":3,"file":"MemberSignInModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/MemberSignInModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import SimpleModal, { SimpleModalSize } from '../../../generic/modal/SimpleModal';\nimport Icon, { IconType } from '../../../generic/Icon';\nimport { Color } from '../../../../util/Color';\nimport Headline from '../../../generic/Headline';\nimport Text, { TextType } from '../../../generic/Text';\nimport BEButton from '../../../generic/BEButton';\nimport * as React from 'react';\nimport { useContext, useState, useEffect, useRef } from 'react';\nimport TextBox from '../../../generic/TextBox';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport API from '../../../../api/BookingAPI';\nimport { ErrorHandler } from '../../../../contexts/ErrorContext';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport ScreenSize from '../../../../util/ScreenSize';\nimport * as Sentry from '@sentry/browser';\nimport { Translation } from '../../../../translations/Translation';\nimport { useTranslation } from 'react-i18next';\n\nimport { useCurrentHotel } from '@frontend/hooks';\n\nimport { CompanyContext } from '@frontend/contexts';\nimport InputGroup from '../../../generic/InputGroup/InputGroup';\nimport { MemberOnlyModalInputs } from './MemberSignInModal.types';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport { EMAIL_REGEX } from 'util/Validation';\n\ninterface MemberSignInModalProps {\n onClose?: () => void;\n isOpen?: boolean;\n}\n\nconst MemberOnlyModalDefaultInputs: MemberOnlyModalInputs = {\n Lines: [\n {\n Dimension: '2/2',\n Inputs: [\n {\n name: 'FirstName',\n type: 'TextBox',\n placeholder: 'First Name',\n isRequired: true,\n },\n {\n name: 'LastName',\n type: 'TextBox',\n placeholder: 'Last Name',\n isRequired: true,\n },\n ],\n },\n {\n Dimension: '1',\n Inputs: [\n {\n name: 'Email',\n type: 'TextBox',\n placeholder: 'Email Address',\n isRequired: true,\n validate: (input: string) => {\n if (!input.match(EMAIL_REGEX)) {\n return 'Invalid Email Address';\n }\n return true;\n },\n },\n ],\n },\n ],\n};\n\nexport default function MemberSignInModal(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 [reCaptchaSecret, setReCaptchaSecret] = useState<string>();\n const [captchaError, setCaptchaError] = useState<string>();\n\n const captchaRef = useRef(null);\n\n const shouldLoadCaptcha = !!hotel?.googleReCaptcha?.loadForMembers && !!hotel?.googleReCaptcha?.siteKey;\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 /** @ts-ignore */\n window.grecaptcha.ready(() => {\n if (!cancelled) {\n setCaptchaScriptLoaded(true);\n }\n });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [hotel]);\n\n useEffect(() => {\n if (shouldLoadCaptcha && captchaScriptLoaded && !captchaRef?.current && props.isOpen) {\n try {\n setTimeout(() => {\n const captchaCallback = (secret: string) => {\n setReCaptchaSecret(secret);\n setCaptchaError(undefined);\n };\n\n /** @ts-ignore */\n window.grecaptcha.render(captchaRef.current, {\n sitekey: hotel.googleReCaptcha.siteKey,\n callback: captchaCallback,\n });\n }, 5);\n } catch (ex) {\n Sentry.captureException(ex);\n }\n }\n }, [props.isOpen, captchaScriptLoaded, captchaRef, captchaRef?.current]);\n\n useEffect(() => {\n if (!props.isOpen) {\n setReCaptchaSecret(null);\n setCaptchaError(null);\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 } else {\n return null;\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: 'Required fields in the Member Signup are missing.',\n message: 'First Name, Last Name, and Email Mandatory Fields, make sure that these fields are present to avoid loss of data.',\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, reCaptchaSecret);\n\n if (response.error) {\n setCaptchaError(t(Translation.MemberOnlyPopup.Errors.ReCaptcha.ValidationError));\n } else {\n ccx.signUserIn(Email);\n\n if (hotel?.memberOnlyPromoCode && !ccx.memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo) {\n basketContext.currentBasketRows?.forEach((row) => {\n row.setPromoCode(hotel?.memberOnlyPromoCode);\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: MemberOnlyModalInputs = 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 modalButtonText = ccx?.memberOnlyModalPromotion?.memberOnlyModalButtonText ?? t(Translation.MemberOnlyPopup.SubmitButtonText);\n\n const modalLeadImage = ccx?.memberOnlyModalPromotion?.memberOnlyModalImage ?? hotel?.heroImage;\n\n return (\n <SimpleModal open={props.isOpen} onClose={loadingOnClose} size={SimpleModalSize.Normal} alignCenter={true}>\n <div className=\"row\">\n <div\n className=\"col-md-6 u-mh-none\"\n style={{\n background: 'url(\"' + modalLeadImage + '\")',\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@m-\">\n <div className=\"u-marg-bottom-half\">\n <Icon icon={IconType.Money} size=\"24px\" color={Color.Success} backgroundColor={Color.SuccessTint} />\n </div>\n <div className=\"u-marg-bottom-half\">\n <Headline bold={true} color={Color.Success}>\n <div\n style={{ color: Color.Success }}\n dangerouslySetInnerHTML={{\n __html: modalTitle,\n }}\n ></div>\n </Headline>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {t(Translation.MemberOnlyPopup.Subtitle)}\n </Text>\n </div>\n <FormProvider {...methods}>\n <div>\n {modalInputs.Lines.map((inputLine, lineIndex) => {\n return (\n <InputGroup dimensions={inputLine.Dimension} key={lineIndex}>\n {inputLine.Inputs.map((input, inputIndex) => {\n switch (input.type) {\n case 'TextBox':\n return (\n <TextBox\n key={inputIndex}\n wide={true}\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 );\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={true}\n success={true}\n isLoading={isLoading}\n stopIconAnimation={true}\n icon={context.screenSize > ScreenSize.Mobile ? IconType.ArrowRight : null}\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
+ {"version":3,"file":"MemberSignInModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/MemberSignInModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import SimpleModal, { SimpleModalSize } from '../../../generic/modal/SimpleModal';\nimport Icon, { IconType } from '../../../generic/Icon';\nimport { Color } from '../../../../util/Color';\nimport Headline from '../../../generic/Headline';\nimport Text, { TextType } from '../../../generic/Text';\nimport BEButton from '../../../generic/BEButton';\nimport * as React from 'react';\nimport { useContext, useState, useEffect, useRef } from 'react';\nimport TextBox from '../../../generic/TextBox';\nimport { FormProvider, useForm } from 'react-hook-form';\nimport API from '../../../../api/BookingAPI';\nimport { ErrorHandler } from '../../../../contexts/ErrorContext';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport ScreenSize from '../../../../util/ScreenSize';\nimport * as Sentry from '@sentry/browser';\nimport { Translation } from '../../../../translations/Translation';\nimport { useTranslation } from 'react-i18next';\n\nimport { useCurrentHotel } from '@frontend/hooks';\n\nimport { CompanyContext } from '@frontend/contexts';\nimport InputGroup from '../../../generic/InputGroup/InputGroup';\nimport { MemberOnlyModalInputs } from './MemberSignInModal.types';\nimport RoomstayThemeEngine from 'providers/RoomstayThemeEngine';\nimport { EMAIL_REGEX } from 'util/Validation';\n\ninterface MemberSignInModalProps {\n onClose?: () => void;\n isOpen?: boolean;\n}\n\nconst MemberOnlyModalDefaultInputs: MemberOnlyModalInputs = {\n Lines: [\n {\n Dimension: '2/2',\n Inputs: [\n {\n name: 'FirstName',\n type: 'TextBox',\n placeholder: 'First Name',\n isRequired: true,\n },\n {\n name: 'LastName',\n type: 'TextBox',\n placeholder: 'Last Name',\n isRequired: true,\n },\n ],\n },\n {\n Dimension: '1',\n Inputs: [\n {\n name: 'Email',\n type: 'TextBox',\n placeholder: 'Email Address',\n isRequired: true,\n validate: (input: string) => {\n if (!input.match(EMAIL_REGEX)) {\n return 'Invalid Email Address';\n }\n return true;\n },\n },\n ],\n },\n ],\n};\n\nexport default function MemberSignInModal(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 [reCaptchaSecret, setReCaptchaSecret] = useState<string>();\n const [captchaError, setCaptchaError] = useState<string>();\n\n const captchaRef = useRef(null);\n\n const shouldLoadCaptcha = !!hotel?.googleReCaptcha?.loadForMembers && !!hotel?.googleReCaptcha?.siteKey;\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 /** @ts-ignore */\n window.grecaptcha.ready(() => {\n if (!cancelled) {\n setCaptchaScriptLoaded(true);\n }\n });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [hotel]);\n\n useEffect(() => {\n if (shouldLoadCaptcha && captchaScriptLoaded && !captchaRef?.current && props.isOpen) {\n try {\n setTimeout(() => {\n const captchaCallback = (secret: string) => {\n setReCaptchaSecret(secret);\n setCaptchaError(undefined);\n };\n\n /** @ts-ignore */\n window.grecaptcha.render(captchaRef.current, {\n sitekey: hotel.googleReCaptcha.siteKey,\n callback: captchaCallback,\n });\n }, 5);\n } catch (ex) {\n Sentry.captureException(ex);\n }\n }\n }, [props.isOpen, captchaScriptLoaded, captchaRef, captchaRef?.current]);\n\n useEffect(() => {\n if (!props.isOpen) {\n setReCaptchaSecret(null);\n setCaptchaError(null);\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 } else {\n return null;\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: 'Required fields in the Member Signup are missing.',\n message: 'First Name, Last Name, and Email Mandatory Fields, make sure that these fields are present to avoid loss of data.',\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, reCaptchaSecret);\n\n if (response.error) {\n setCaptchaError(t(Translation.MemberOnlyPopup.Errors.ReCaptcha.ValidationError));\n } else {\n ccx.signUserIn(Email);\n\n if (hotel?.memberOnlyPromoCode && !ccx.memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo) {\n basketContext.currentBasketRows?.forEach((row) => {\n row.setPromoCode(hotel?.memberOnlyPromoCode);\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: MemberOnlyModalInputs = 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 modalButtonText = ccx?.memberOnlyModalPromotion?.memberOnlyModalButtonText ?? t(Translation.MemberOnlyPopup.SubmitButtonText);\n const modalLeadImage = ccx?.memberOnlyModalPromotion?.memberOnlyModalImage ?? hotel?.heroImage;\n\n return (\n <SimpleModal open={props.isOpen} onClose={loadingOnClose} size={SimpleModalSize.Normal} alignCenter={true}>\n <div className=\"row\">\n <div\n className=\"col-md-6 u-mh-none\"\n style={{\n background: 'url(\"' + modalLeadImage + '\")',\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@m-\">\n <div className=\"u-marg-bottom-half\">\n <Icon icon={IconType.Money} size=\"24px\" color={Color.Success} backgroundColor={Color.SuccessTint} />\n </div>\n <div className=\"u-marg-bottom-half\">\n <Headline bold={true} color={Color.Success}>\n <div\n style={{ color: Color.Success }}\n dangerouslySetInnerHTML={{\n __html: modalTitle,\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: t(Translation.MemberOnlyPopup.Subtitle) }}></span>\n </Text>\n </div>\n <FormProvider {...methods}>\n <div>\n {modalInputs.Lines.map((inputLine, lineIndex) => {\n return (\n <InputGroup dimensions={inputLine.Dimension} key={lineIndex}>\n {inputLine.Inputs.map((input, inputIndex) => {\n switch (input.type) {\n case 'TextBox':\n return (\n <TextBox\n key={inputIndex}\n wide={true}\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 );\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={true}\n success={true}\n isLoading={isLoading}\n stopIconAnimation={true}\n icon={context.screenSize > ScreenSize.Mobile ? IconType.ArrowRight : null}\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"]}
@@ -134,7 +134,7 @@ function RoomList() {
134
134
  _a.map((hotelId) => (React.createElement(RoomListCrossSellBlock_1.default, { key: hotelId, hotelId: hotelId })))))));
135
135
  DataLayer_1.default.instance.sendRoomImpressions();
136
136
  return elements;
137
- }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters]);
137
+ }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters, basketContext.loadedPromotion]);
138
138
  }
139
139
  exports.default = RoomList;
140
140
  //# sourceMappingURL=RoomList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoomList.js","sourceRoot":"/","sources":["src/components/steps/room/RoomList.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useState, useMemo, useRef, useEffect } from 'react';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport * as React from 'react';\nimport RoomDetails from './roomDetails/RoomDetails';\nimport NoRoomsFoundBlock from './NoRoomsFoundBlock';\nimport { Room } from '../../../models/Room/Room';\nimport LargeLoader from '../../generic/loader/LargeLoader';\nimport RoomSortProvider from '../../../providers/RoomSortProvider';\nimport Filter from '../../../models/Room/Filters/Filter';\nimport FilterProvider from '../../../providers/FilterProvider';\nimport RoomListCrossSellBlock from './RoomListCrossSellBlock';\nimport DataLayer from '../../../util/DataLayer';\nimport ScreenSize from '../../../util/ScreenSize';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport { CompanyContext } from '@frontend/contexts';\nimport { StepRoomErrorForm } from './StepRoomErrorForm';\nimport { SearchParameters } from 'models/SearchParameters';\nimport { GuestSearchEvent } from 'events/actions/GuestSearchEvent';\nimport { RoomListSearch } from 'models/RoomListSearch';\nimport { RoomListSearchEvent } from 'events/actions/RoomListSearchEvent';\n\nexport default function RoomList() {\n const basketContext = useContext(BasketContext);\n const beContext = useContext(BookingEngineContext);\n const ccx = useContext(CompanyContext);\n\n const { hotel } = useCurrentHotel();\n\n const [rooms, setRooms] = React.useState<Room[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n\n const [openRoom, setOpenRoom] = useState(null);\n const [apiHasError, setApiHasError] = useState(null);\n\n const roomListRef = useRef(null);\n\n const selectedRow = basketContext.selectedBasketRow;\n\n const startDate = selectedRow?.getStartDate();\n const endDate = selectedRow?.getEndDate();\n const promoCode = selectedRow?.getPromoCode();\n\n const adults = selectedRow?.getAdults();\n const children = selectedRow?.getChildren();\n const sortBy = beContext.currentRoomSort;\n\n let listWhenLastScrolled: Room[] = null;\n\n const { raise } = useEvent();\n\n const scrollIntoView = () => {\n if (roomListRef.current && listWhenLastScrolled !== rooms) {\n listWhenLastScrolled = rooms;\n const offset = beContext.screenSize <= ScreenSize.Medium ? 185 : 350;\n\n window.scrollTo({ top: window.scrollY + (roomListRef.current.getBoundingClientRect().top - offset), behavior: 'smooth' });\n }\n };\n\n useEffect(() => {\n let isCancelled = false;\n\n try {\n const search: SearchParameters = {\n checkInTime: startDate?.format('YYYY-M-D'),\n checkOutTime: endDate?.format('YYYY-M-D'),\n numAdults: adults,\n numChildren: children,\n numRooms: 1,\n promoCode: promoCode,\n };\n\n const event = new GuestSearchEvent(search);\n raise(event);\n\n const filters: Filter[] = Object.values(beContext.currentFilters).filter((filter) => !!filter) as Filter[];\n\n let row = basketContext.selectedBasketRow;\n\n if (!row && !rooms.length) {\n row = basketContext.attemptSelectUnfilledRow();\n }\n\n if (!row) {\n const validRows = basketContext.getAllValidRows();\n row = validRows[validRows.length - 1];\n }\n\n if (row) {\n setIsLoading(true);\n FilterProvider.getRoomList(row, filters, hotel.hotelID)\n .then((availableRooms) => {\n if (!isCancelled) {\n setRooms(availableRooms);\n setOpenRoom(basketContext.selectedBasketRow);\n setApiHasError(false);\n\n const foundRooms: RoomListSearch[] =\n availableRooms?.map((room) => {\n const { name, code } = room;\n\n const foundRoom: RoomListSearch = {\n name,\n code,\n lowestPrice: room.getLowestPrice(),\n highestPrice: room.getHighestPrice(),\n currency: ccx.currentCurrency,\n\n rates:\n room.getRates()?.map((rate) => {\n const { name, code } = rate;\n return {\n name,\n code,\n\n price: {\n averagePrice: rate.getAveragePrice(),\n totalPrice: rate.getTotalPrice(),\n currency: ccx.currentCurrency,\n },\n };\n }) ?? [],\n };\n\n return foundRoom;\n }) ?? [];\n\n const event = new RoomListSearchEvent(search, foundRooms);\n raise(event);\n }\n })\n .catch(() => {\n if (!isCancelled) {\n setRooms([]);\n setOpenRoom(null);\n setApiHasError(true);\n }\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n } catch (ex) {}\n\n return () => {\n setIsLoading(false);\n isCancelled = true;\n };\n }, [adults, children, startDate, endDate, promoCode, ccx.currentLanguage, beContext.currentFilters, basketContext.selectedBasketRow?.getStale()]);\n\n return useMemo(() => {\n const sortedRooms = [...rooms];\n if (sortedRooms.length !== 0) {\n sortedRooms.sort(RoomSortProvider.getSortByFunction(sortBy));\n }\n\n setTimeout(() => {\n scrollIntoView();\n }, 100);\n\n const elements = (\n <div ref={roomListRef}>\n {isLoading ? (\n <LargeLoader />\n ) : sortedRooms.length ? (\n sortedRooms.map((room, index) => <RoomDetails key={room.code} room={room} disableMarginBottom={index === sortedRooms.length - 1} />)\n ) : (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n )}\n </div>\n );\n\n DataLayer.instance.sendRoomImpressions();\n\n return elements;\n }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters]);\n}\n"]}
1
+ {"version":3,"file":"RoomList.js","sourceRoot":"/","sources":["src/components/steps/room/RoomList.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useState, useMemo, useRef, useEffect } from 'react';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport * as React from 'react';\nimport RoomDetails from './roomDetails/RoomDetails';\nimport NoRoomsFoundBlock from './NoRoomsFoundBlock';\nimport { Room } from '../../../models/Room/Room';\nimport LargeLoader from '../../generic/loader/LargeLoader';\nimport RoomSortProvider from '../../../providers/RoomSortProvider';\nimport Filter from '../../../models/Room/Filters/Filter';\nimport FilterProvider from '../../../providers/FilterProvider';\nimport RoomListCrossSellBlock from './RoomListCrossSellBlock';\nimport DataLayer from '../../../util/DataLayer';\nimport ScreenSize from '../../../util/ScreenSize';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport { CompanyContext } from '@frontend/contexts';\nimport { StepRoomErrorForm } from './StepRoomErrorForm';\nimport { SearchParameters } from 'models/SearchParameters';\nimport { GuestSearchEvent } from 'events/actions/GuestSearchEvent';\nimport { RoomListSearch } from 'models/RoomListSearch';\nimport { RoomListSearchEvent } from 'events/actions/RoomListSearchEvent';\n\nexport default function RoomList() {\n const basketContext = useContext(BasketContext);\n const beContext = useContext(BookingEngineContext);\n const ccx = useContext(CompanyContext);\n\n const { hotel } = useCurrentHotel();\n\n const [rooms, setRooms] = React.useState<Room[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n\n const [openRoom, setOpenRoom] = useState(null);\n const [apiHasError, setApiHasError] = useState(null);\n\n const roomListRef = useRef(null);\n\n const selectedRow = basketContext.selectedBasketRow;\n\n const startDate = selectedRow?.getStartDate();\n const endDate = selectedRow?.getEndDate();\n const promoCode = selectedRow?.getPromoCode();\n\n const adults = selectedRow?.getAdults();\n const children = selectedRow?.getChildren();\n const sortBy = beContext.currentRoomSort;\n\n let listWhenLastScrolled: Room[] = null;\n\n const { raise } = useEvent();\n\n const scrollIntoView = () => {\n if (roomListRef.current && listWhenLastScrolled !== rooms) {\n listWhenLastScrolled = rooms;\n const offset = beContext.screenSize <= ScreenSize.Medium ? 185 : 350;\n\n window.scrollTo({ top: window.scrollY + (roomListRef.current.getBoundingClientRect().top - offset), behavior: 'smooth' });\n }\n };\n\n useEffect(() => {\n let isCancelled = false;\n\n try {\n const search: SearchParameters = {\n checkInTime: startDate?.format('YYYY-M-D'),\n checkOutTime: endDate?.format('YYYY-M-D'),\n numAdults: adults,\n numChildren: children,\n numRooms: 1,\n promoCode: promoCode,\n };\n\n const event = new GuestSearchEvent(search);\n raise(event);\n\n const filters: Filter[] = Object.values(beContext.currentFilters).filter((filter) => !!filter) as Filter[];\n\n let row = basketContext.selectedBasketRow;\n\n if (!row && !rooms.length) {\n row = basketContext.attemptSelectUnfilledRow();\n }\n\n if (!row) {\n const validRows = basketContext.getAllValidRows();\n row = validRows[validRows.length - 1];\n }\n\n if (row) {\n setIsLoading(true);\n FilterProvider.getRoomList(row, filters, hotel.hotelID)\n .then((availableRooms) => {\n if (!isCancelled) {\n setRooms(availableRooms);\n setOpenRoom(basketContext.selectedBasketRow);\n setApiHasError(false);\n\n const foundRooms: RoomListSearch[] =\n availableRooms?.map((room) => {\n const { name, code } = room;\n\n const foundRoom: RoomListSearch = {\n name,\n code,\n lowestPrice: room.getLowestPrice(),\n highestPrice: room.getHighestPrice(),\n currency: ccx.currentCurrency,\n\n rates:\n room.getRates()?.map((rate) => {\n const { name, code } = rate;\n return {\n name,\n code,\n\n price: {\n averagePrice: rate.getAveragePrice(),\n totalPrice: rate.getTotalPrice(),\n currency: ccx.currentCurrency,\n },\n };\n }) ?? [],\n };\n\n return foundRoom;\n }) ?? [];\n\n const event = new RoomListSearchEvent(search, foundRooms);\n raise(event);\n }\n })\n .catch(() => {\n if (!isCancelled) {\n setRooms([]);\n setOpenRoom(null);\n setApiHasError(true);\n }\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n } catch (ex) {}\n\n return () => {\n setIsLoading(false);\n isCancelled = true;\n };\n }, [adults, children, startDate, endDate, promoCode, ccx.currentLanguage, beContext.currentFilters, basketContext.selectedBasketRow?.getStale()]);\n\n return useMemo(() => {\n const sortedRooms = [...rooms];\n if (sortedRooms.length !== 0) {\n sortedRooms.sort(RoomSortProvider.getSortByFunction(sortBy));\n }\n\n setTimeout(() => {\n scrollIntoView();\n }, 100);\n\n const elements = (\n <div ref={roomListRef}>\n {isLoading ? (\n <LargeLoader />\n ) : sortedRooms.length ? (\n sortedRooms.map((room, index) => <RoomDetails key={room.code} room={room} disableMarginBottom={index === sortedRooms.length - 1} />)\n ) : (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n )}\n </div>\n );\n\n DataLayer.instance.sendRoomImpressions();\n\n return elements;\n }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters, basketContext.loadedPromotion]);\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { IPromotion } from 'models/Promotion/IPromotion.type';
2
+ import { RoomstayEvent } from '../../RoomstayEvent';
3
+ export declare class PromotionRemoveEvent extends RoomstayEvent {
4
+ promotion: IPromotion;
5
+ constructor(promotion: IPromotion);
6
+ static getLabel(): string;
7
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromotionRemoveEvent = void 0;
4
+ const RoomstayEvent_1 = require("../../RoomstayEvent");
5
+ class PromotionRemoveEvent extends RoomstayEvent_1.RoomstayEvent {
6
+ constructor(promotion) {
7
+ super();
8
+ this.promotion = promotion;
9
+ }
10
+ static getLabel() {
11
+ return 'Promotion/Remove';
12
+ }
13
+ }
14
+ exports.PromotionRemoveEvent = PromotionRemoveEvent;
15
+ //# sourceMappingURL=PromotionRemovedEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromotionRemovedEvent.js","sourceRoot":"/","sources":["src/events/actions/Promotion/PromotionRemovedEvent.ts"],"names":[],"mappings":";;;AACA,uDAAoD;AAEpD,MAAa,oBAAqB,SAAQ,6BAAa;IAEnD,YAAmB,SAAqB;QACpC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,OAAO,kBAAkB,CAAC;IAC9B,CAAC;CACJ;AAXD,oDAWC","sourcesContent":["import { IPromotion } from 'models/Promotion/IPromotion.type';\nimport { RoomstayEvent } from '../../RoomstayEvent';\n\nexport class PromotionRemoveEvent extends RoomstayEvent {\n public promotion: IPromotion;\n public constructor(promotion: IPromotion) {\n super();\n\n this.promotion = promotion;\n }\n\n static getLabel(): string {\n return 'Promotion/Remove';\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { BasketContextType } from '@frontend/contexts';
2
2
  import BasketRow from 'models/BasketRow';
3
3
  import { IPromotion } from 'models/Promotion/IPromotion.type';
4
4
  export declare const registerPromotion: (promotion: IPromotion) => void;
5
+ export declare const removePromotion: (promotion: IPromotion) => void;
5
6
  /**
6
7
  * Used by the Basket context to bind to state.
7
8
  */
@@ -9,12 +9,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.usePromotionContainer = exports.registerPromotion = void 0;
12
+ exports.usePromotionContainer = exports.removePromotion = exports.registerPromotion = void 0;
13
13
  const contexts_1 = require("@frontend/contexts");
14
14
  const dayjs = require("dayjs");
15
15
  const MemberOnlyFenceSignUp_1 = require("events/actions/MemberOnlyFence/MemberOnlyFenceSignUp");
16
16
  const PromotionAddedEvent_1 = require("events/actions/Promotion/PromotionAddedEvent");
17
17
  const PromotionClickedEvent_1 = require("events/actions/Promotion/PromotionClickedEvent");
18
+ const PromotionRemovedEvent_1 = require("events/actions/Promotion/PromotionRemovedEvent");
18
19
  const RoomstayEventManager_1 = require("events/RoomstayEventManager");
19
20
  const EventHook_1 = require("hooks/EventHook");
20
21
  const react_1 = require("react");
@@ -34,6 +35,17 @@ exports.registerPromotion = (promotion) => {
34
35
  }
35
36
  }
36
37
  };
38
+ exports.removePromotion = (promotion) => {
39
+ if (basketContextLoaded) {
40
+ RoomstayEventManager_1.default.raise(new PromotionRemovedEvent_1.PromotionRemoveEvent(promotion));
41
+ }
42
+ else {
43
+ const promoIndex = getPromoIndex(promotion.name, _loadedPromotions);
44
+ if (promoIndex !== -1) {
45
+ _loadedPromotions.splice(promoIndex, 1);
46
+ }
47
+ }
48
+ };
37
49
  const getPromoIndex = (name, promoList) => {
38
50
  for (let i = 0; i < promoList.length; i++) {
39
51
  if (promoList[i].name === name) {
@@ -47,7 +59,8 @@ const getPromoIndex = (name, promoList) => {
47
59
  */
48
60
  exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
49
61
  const ccx = react_1.useContext(contexts_1.CompanyContext);
50
- const [allPromotions, setAllPromotions] = react_1.useState(_loadedPromotions);
62
+ const [bump, setBump] = react_1.useState(0);
63
+ const [allPromotions, setAllPromotions] = react_1.useState(_loadedPromotions !== null && _loadedPromotions !== void 0 ? _loadedPromotions : []);
51
64
  // TODO: Current implementation only supports a single promotion. In the future there will be multiple promotion locations
52
65
  const [loadedPromotion, setLoadedPromotion] = react_1.useState(null);
53
66
  const { on } = EventHook_1.useEvent();
@@ -99,6 +112,22 @@ exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
99
112
  });
100
113
  }
101
114
  }), 'root');
115
+ on(PromotionRemovedEvent_1.PromotionRemoveEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
116
+ if (event === null || event === void 0 ? void 0 : event.promotion) {
117
+ setAllPromotions((oldPromotions) => {
118
+ if (oldPromotions.length === 0) {
119
+ return [];
120
+ }
121
+ return oldPromotions.filter((promo) => {
122
+ if (promo.name !== event.promotion.name) {
123
+ return promo;
124
+ }
125
+ return false;
126
+ });
127
+ });
128
+ setBump((a) => a + 1);
129
+ }
130
+ }), 'root');
102
131
  on(PromotionClickedEvent_1.PromotionClickedEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
103
132
  const { promotion } = event;
104
133
  if (!promotion) {
@@ -115,7 +144,7 @@ exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
115
144
  on(MemberOnlyFenceSignUp_1.MemberOnlyFenceSignUp, (event) => __awaiter(void 0, void 0, void 0, function* () {
116
145
  updateBasketRowContext(event.promotion);
117
146
  }), 'root');
118
- }, [ccx.signedInUser, selectedBasketRow]);
147
+ }, [ccx.signedInUser, selectedBasketRow, allPromotions, setAllPromotions, loadedPromotion, setLoadedPromotion]);
119
148
  react_1.useEffect(() => {
120
149
  if (selectedBasketRow) {
121
150
  const criteria = {
@@ -135,7 +164,23 @@ exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
135
164
  selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getEndDate(),
136
165
  selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getPromoCode(),
137
166
  allPromotions,
167
+ bump,
138
168
  ]);
169
+ react_1.useEffect(() => {
170
+ if (!loadedPromotion) {
171
+ return;
172
+ }
173
+ let loadedExists = false;
174
+ for (const promotion of allPromotions) {
175
+ if (promotion.name === loadedPromotion.name) {
176
+ loadedExists = true;
177
+ break;
178
+ }
179
+ }
180
+ if (!loadedExists) {
181
+ setLoadedPromotion(null);
182
+ }
183
+ }, [allPromotions, loadedPromotion]);
139
184
  /**
140
185
  * Checks all the registered promotions, and returns the first one that matches the criteria.
141
186
  *
@@ -150,8 +195,12 @@ exports.usePromotionContainer = ({ selectedBasketRow, updateBasketRow }) => {
150
195
  return null;
151
196
  });
152
197
  const onPromotionCriteriaChanged = (criteria) => {
153
- checkPromotions(criteria).then((promo) => {
198
+ checkPromotions(criteria)
199
+ .then((promo) => {
154
200
  setLoadedPromotion(promo);
201
+ })
202
+ .catch(() => {
203
+ setLoadedPromotion(null);
155
204
  });
156
205
  };
157
206
  return {
@@ -1 +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 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\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 [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 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]);\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 ]);\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).then((promo) => {\n setLoadedPromotion(promo);\n });\n };\n\n return {\n loadedPromotion,\n };\n};\n"]}
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"]}