@roomstay/frontend 2.1.12 → 2.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/882.bundle.js +1 -1
- package/dist/main.bundle.js +1 -1
- package/dist/src/components/generic/BEButton.d.ts +2 -3
- package/dist/src/components/generic/BEButton.js.map +1 -1
- package/dist/src/components/generic/date/FloatingDatePicker.js +2 -1
- package/dist/src/components/generic/date/FloatingDatePicker.js.map +1 -1
- package/dist/src/components/generic/map/HotelLocationMap.js +1 -1
- package/dist/src/components/generic/map/HotelLocationMap.js.map +1 -1
- package/dist/src/components/steps/date/StepOneDateRangePicker.js +2 -1
- package/dist/src/components/steps/date/StepOneDateRangePicker.js.map +1 -1
- package/dist/src/components/steps/room/roomDetails/RoomDetails.js +38 -40
- package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
- package/dist/src/util/Color.d.ts +1 -0
- package/dist/src/util/Color.js +7 -1
- package/dist/src/util/Color.js.map +1 -1
- package/dist/src/util/DataLayer.js +3 -0
- package/dist/src/util/DataLayer.js.map +1 -1
- package/dist/test.bundle.js +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { IconType } from './Icon/Icon';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { PropsWithChildren } from 'react';
|
|
2
|
+
import React, { PropsWithChildren } from 'react';
|
|
4
3
|
import { Color } from '../../util/Color';
|
|
5
4
|
export interface BEButtonProps extends PropsWithChildren<any> {
|
|
6
|
-
[x: string]: React.ReactNode;
|
|
7
5
|
icon?: IconType;
|
|
8
6
|
iconPosition?: 'left' | 'right';
|
|
9
7
|
rounded?: boolean;
|
|
@@ -25,5 +23,6 @@ export interface BEButtonProps extends PropsWithChildren<any> {
|
|
|
25
23
|
stopIconAnimation?: boolean;
|
|
26
24
|
htmlType?: React.ButtonHTMLAttributes<HTMLButtonElement>['type'];
|
|
27
25
|
onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
26
|
+
[x: string]: React.ReactNode;
|
|
28
27
|
}
|
|
29
28
|
export default function BEButton(props: BEButtonProps): JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BEButton.js","sourceRoot":"/","sources":["src/components/generic/BEButton.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uEAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"BEButton.js","sourceRoot":"/","sources":["src/components/generic/BEButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport React, { CSSProperties, PropsWithChildren, ReactNode } from 'react';\n\nimport classNames from 'classnames';\n\nimport { Color } from '@/util/Color';\n\nexport interface BEButtonProps extends PropsWithChildren<any> {\n icon?: IconType;\n iconPosition?: 'left' | 'right';\n rounded?: boolean;\n size?: 'large' | 'normal' | 'small' | 'tiny';\n outline?: boolean;\n className?: string;\n name?: string;\n wide?: boolean;\n filled?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n textColor?: Color;\n disabled?: boolean;\n primary?: boolean;\n primaryActive?: boolean;\n success?: boolean;\n danger?: boolean;\n mobileWidth?: boolean;\n stopIconAnimation?: boolean; // Rename this it's bad\n htmlType?: React.ButtonHTMLAttributes<HTMLButtonElement>['type'];\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n\n [x: string]: React.ReactNode;\n}\n\nexport default function BEButton(props: BEButtonProps) {\n const defaultProps: BEButtonProps = {\n size: 'normal',\n disabled: false,\n iconPosition: 'left',\n htmlType: 'button',\n ...props,\n };\n\n const classes = classNames(\n {\n '--wide': defaultProps.wide,\n '--primary': defaultProps.primary,\n '--primary-active': defaultProps.primaryActive,\n '--rounded': defaultProps.rounded,\n '--filled': defaultProps.filled && !defaultProps.backgroundColor,\n '--success': defaultProps.filled,\n '--danger': defaultProps.danger,\n '--loading': defaultProps.isLoading,\n '--fill@m-': defaultProps.mobileWidth,\n '--no-icon-animate': defaultProps.stopIconAnimation,\n '--icon-right': defaultProps.iconPosition === 'right',\n [`--${defaultProps.size}`]: defaultProps.size,\n '--text': defaultProps.isText,\n '--outline': defaultProps.outline,\n },\n props.className\n );\n\n let icon: ReactNode = '';\n if (defaultProps.icon) {\n icon = <Icon icon={defaultProps.icon} size=\"1em\" />;\n }\n\n const extraProperties: JSX.IntrinsicElements['button'] = {};\n const styles: CSSProperties = {};\n\n if (props.disabled || props.isLoading) {\n extraProperties.disabled = true;\n }\n\n if (props.textColor) {\n styles.color = props.textColor;\n }\n\n if (props.onClick) {\n extraProperties.onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (!props.isLoading) {\n props.onClick?.(e);\n }\n };\n }\n\n if (props.name) {\n extraProperties.name = props.name;\n }\n let bgColor = {};\n if (defaultProps.backgroundColor) {\n bgColor = { backgroundColor: defaultProps.backgroundColor, borderColor: defaultProps.backgroundColor };\n }\n return (\n <button className={classes} {...extraProperties} style={{ ...styles, ...bgColor }} type={defaultProps.htmlType}>\n {defaultProps.isLoading && (\n <span className=\"c-spin\">\n <Icon icon={IconType.Spinner} color={props.primary ? Color.White : Color.Accent} />\n </span>\n )}\n <span>\n {defaultProps.iconPosition === 'left' && icon}\n {props.children}\n {defaultProps.iconPosition === 'right' && icon}\n </span>\n </button>\n );\n}\n"]}
|
|
@@ -39,7 +39,8 @@ function FloatingDatePicker(props) {
|
|
|
39
39
|
const selectedDateChanged = (endDate) => {
|
|
40
40
|
DataLayer_1.default.instance.sendInteraction('Check Out Date', DataLayer_1.InteractionType.CALENDAR, DataLayer_1.InteractionStep.ROOMS);
|
|
41
41
|
if (props.selectedDateChanged && startDate) {
|
|
42
|
-
|
|
42
|
+
if (endDate)
|
|
43
|
+
DataLayer_1.default.instance.sendDateSelection(startDate, endDate);
|
|
43
44
|
props.selectedDateChanged(startDate, endDate);
|
|
44
45
|
}
|
|
45
46
|
setIsOpen(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingDatePicker.js","sourceRoot":"/","sources":["src/components/generic/date/FloatingDatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iCAAyC;AAEzC,sFAA8D;AAI9D,8DAA+E;AAC/E,kEAA+D;AAY/D,SAAwB,kBAAkB,CAAC,KAA8B;;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAqB,IAAI,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAEjD,MAAM,mBAAmB,GAAG,CAAC,OAAoB,EAAE,EAAE;QACjD,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAEtG,IAAI,KAAK,CAAC,mBAAmB,IAAI,SAAS,EAAE;YACxC,mBAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"FloatingDatePicker.js","sourceRoot":"/","sources":["src/components/generic/date/FloatingDatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iCAAyC;AAEzC,sFAA8D;AAI9D,8DAA+E;AAC/E,kEAA+D;AAY/D,SAAwB,kBAAkB,CAAC,KAA8B;;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAqB,IAAI,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAEjD,MAAM,mBAAmB,GAAG,CAAC,OAAoB,EAAE,EAAE;QACjD,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAEtG,IAAI,KAAK,CAAC,mBAAmB,IAAI,SAAS,EAAE;YACxC,IAAI,OAAO;gBAAE,mBAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtE,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;SACjD;QAED,SAAS,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,yBAAyB,GAAG,CAAC,IAAS,EAAE,EAAE;QAC5C,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QACrG,YAAY,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QACxB,SAAS,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CACV,uCAAK,SAAS,EAAC,uCAAuC;QAClD,8BAAC,oBAAU,IACP,eAAe,EAAE,KAAK,CAAC,SAAS,EAChC,kBAAkB,EAAE,KAAK,EACzB,sBAAsB,QACtB,kBAAkB,EAAE,yBAAyB,EAC7C,gBAAgB,EAAE,mBAAmB,EACrC,gBAAgB,QAChB,YAAY,EAAE,KAAK,GACrB,CACA,CACT,CAAC;IAEF,OAAO,CACH;QACI,uCAAK,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,IACpE,KAAK,CAAC,QAAQ,CACb;QACN,8BAAC,iBAAO,IACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAA,MAAA,WAAW,CAAC,OAAO,0CAAE,aAAa,0CAAE,aAAa,EAC5D,aAAa,EAAE,WAAW,CAAC,OAAO,EAClC,SAAS,EAAC,4BAA4B,IAErC,KAAK,CACA,CACX,CACN,CAAC;AACN,CAAC;AA7DD,qCA6DC","sourcesContent":["import React from 'react';\nimport { useRef, useState } from 'react';\n\nimport DatePicker from '@/components/generic/date/DatePicker';\n\nimport dayjs from 'dayjs';\n\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { Overlay } from '@/components/generic/Overlay/Overlay';\n\nexport interface FloatingDatePickerProps {\n children?: React.ReactNode;\n startDate?: dayjs.Dayjs;\n endDate?: dayjs.Dayjs;\n\n selectedDateChanged?: (startDate: dayjs.Dayjs, endDate: dayjs.Dayjs) => void;\n\n className?: string;\n}\n\nexport default function FloatingDatePicker(props: FloatingDatePickerProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n const [startDate, setStartDate] = useState<dayjs.Dayjs | null>(null);\n\n const thisElement = useRef<HTMLDivElement>(null);\n\n const selectedDateChanged = (endDate: dayjs.Dayjs) => {\n DataLayer.instance.sendInteraction('Check Out Date', InteractionType.CALENDAR, InteractionStep.ROOMS);\n\n if (props.selectedDateChanged && startDate) {\n if (endDate) DataLayer.instance.sendDateSelection(startDate, endDate);\n props.selectedDateChanged(startDate, endDate);\n }\n\n setIsOpen(false);\n };\n\n const onStartDateChangedHandler = (date: any) => {\n DataLayer.instance.sendInteraction('Check In Date', InteractionType.CALENDAR, InteractionStep.ROOMS);\n setStartDate(date);\n };\n\n const onOverlayClose = () => {\n setIsOpen(false);\n };\n\n const onOverlayOpen = () => {\n setIsOpen(true);\n };\n\n const inner = (\n <div className=\"d-flex align-items-center flex-column\">\n <DatePicker\n showMonthOnLoad={props.startDate}\n showMultipleMonths={false}\n supportsMultiSelecting\n onStartDateChanged={onStartDateChangedHandler}\n onEndDateChanged={selectedDateChanged}\n showMinNightStay\n supportsWeek={false}\n />\n </div>\n );\n\n return (\n <>\n <div ref={thisElement} className={props.className} onClick={onOverlayOpen}>\n {props.children}\n </div>\n <Overlay\n open={isOpen}\n onClose={onOverlayClose}\n container={thisElement.current?.parentElement?.parentElement}\n followElement={thisElement.current}\n className=\"floating-roomstay-calendar\"\n >\n {inner}\n </Overlay>\n </>\n );\n}\n"]}
|
|
@@ -10,7 +10,7 @@ function HotelLocationMap() {
|
|
|
10
10
|
const { hotel } = (0, hooks_1.useCurrentHotel)();
|
|
11
11
|
if (!hotel)
|
|
12
12
|
return react_1.default.createElement(react_1.default.Fragment, null);
|
|
13
|
-
return react_1.default.createElement(react_1.default.Fragment, null, hotel.latitude && hotel.longitude
|
|
13
|
+
return react_1.default.createElement(react_1.default.Fragment, null, hotel.latitude && hotel.longitude ? react_1.default.createElement(BEMapWidget_1.default, { mapLatLng: { lat: hotel.latitude, lng: hotel.longitude } }) : null);
|
|
14
14
|
}
|
|
15
15
|
exports.default = HotelLocationMap;
|
|
16
16
|
//# sourceMappingURL=HotelLocationMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HotelLocationMap.js","sourceRoot":"/","sources":["src/components/generic/map/HotelLocationMap.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,mFAA2D;AAC3D,2CAAkD;AAElD,SAAwB,gBAAgB;IACpC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,IAAI,CAAC,KAAK;QAAE,OAAO,6DAAK,CAAC;IAEzB,OAAO,8DAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"HotelLocationMap.js","sourceRoot":"/","sources":["src/components/generic/map/HotelLocationMap.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,mFAA2D;AAC3D,2CAAkD;AAElD,SAAwB,gBAAgB;IACpC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,IAAI,CAAC,KAAK;QAAE,OAAO,6DAAK,CAAC;IAEzB,OAAO,8DAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,8BAAC,qBAAW,IAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,CAAI,CAAC;AACvI,CAAC;AAND,mCAMC","sourcesContent":["import React from 'react';\nimport BEMapWidget from '@/components/summary/BEMapWidget';\nimport { useCurrentHotel } from '@frontend/hooks';\n\nexport default function HotelLocationMap() {\n const { hotel } = useCurrentHotel();\n\n if (!hotel) return <></>;\n\n return <>{hotel.latitude && hotel.longitude ? <BEMapWidget mapLatLng={{ lat: hotel.latitude, lng: hotel.longitude }} /> : null}</>;\n}\n"]}
|
|
@@ -42,7 +42,8 @@ function StepOneDateRangePicker() {
|
|
|
42
42
|
};
|
|
43
43
|
const onEndDateChangedHandler = (newDate) => {
|
|
44
44
|
DataLayer_1.default.instance.sendInteraction('Check Out Date', DataLayer_1.InteractionType.CALENDAR, DataLayer_1.InteractionStep.DATES);
|
|
45
|
-
|
|
45
|
+
if (context.startDate && newDate)
|
|
46
|
+
DataLayer_1.default.instance.sendDateSelection(context.startDate, newDate);
|
|
46
47
|
context.setEndDate(newDate);
|
|
47
48
|
};
|
|
48
49
|
return (react_1.default.createElement(DatePicker_1.default, { supportsMultiSelecting: true, showMultipleMonths: appContext.screenSize > ScreenSize_1.default.ExtraLarge, selectedStartDate: context.startDate, selectedEndDate: context.endDate, supportsWeek: true, showMinNightStay: true, onStartDateChanged: onStartDateChangedHandler, onEndDateChanged: onEndDateChangedHandler }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StepOneDateRangePicker.js","sourceRoot":"/","sources":["src/components/steps/date/StepOneDateRangePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sFAA8D;AAC9D,kDAA0B;AAC1B,iCAA4C;AAC5C,mEAA2C;AAC3C,iDAAyE;AACzE,8DAA+E;AAE/E,SAAwB,sBAAsB;IAC1C,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,+BAAoB,CAAC,CAAC;IAEpD,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE;QAChB,MAAM,yBAAyB,GAAG,CAAC,OAAY,EAAE,EAAE;YAC/C,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;YACrG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,CAAC,OAAY,EAAE,EAAE;YAC7C,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;YACtG,mBAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"StepOneDateRangePicker.js","sourceRoot":"/","sources":["src/components/steps/date/StepOneDateRangePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sFAA8D;AAC9D,kDAA0B;AAC1B,iCAA4C;AAC5C,mEAA2C;AAC3C,iDAAyE;AACzE,8DAA+E;AAE/E,SAAwB,sBAAsB;IAC1C,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,+BAAoB,CAAC,CAAC;IAEpD,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE;QAChB,MAAM,yBAAyB,GAAG,CAAC,OAAY,EAAE,EAAE;YAC/C,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;YACrG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,CAAC,OAAY,EAAE,EAAE;YAC7C,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,2BAAe,CAAC,QAAQ,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;YACtG,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO;gBAAE,mBAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC;QACF,OAAO,CACH,8BAAC,oBAAU,IACP,sBAAsB,QACtB,kBAAkB,EAAE,UAAU,CAAC,UAAU,GAAG,oBAAU,CAAC,UAAU,EACjE,iBAAiB,EAAE,OAAO,CAAC,SAAS,EACpC,eAAe,EAAE,OAAO,CAAC,OAAO,EAChC,YAAY,QACZ,gBAAgB,QAChB,kBAAkB,EAAE,yBAAyB,EAC7C,gBAAgB,EAAE,uBAAuB,GAC3C,CACL,CAAC;IACN,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE,CAAC;AA3BD,yCA2BC","sourcesContent":["import DatePicker from '@/components/generic/date/DatePicker';\nimport React from 'react';\nimport { useContext, useMemo } from 'react';\nimport ScreenSize from '@/util/ScreenSize';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\n\nexport default function StepOneDateRangePicker() {\n const context = useContext(BasketContext);\n const appContext = useContext(BookingEngineContext);\n\n return useMemo(() => {\n const onStartDateChangedHandler = (newDate: any) => {\n DataLayer.instance.sendInteraction('Check In Date', InteractionType.CALENDAR, InteractionStep.DATES);\n context.setStartDate(newDate);\n };\n const onEndDateChangedHandler = (newDate: any) => {\n DataLayer.instance.sendInteraction('Check Out Date', InteractionType.CALENDAR, InteractionStep.DATES);\n if (context.startDate && newDate) DataLayer.instance.sendDateSelection(context.startDate, newDate);\n context.setEndDate(newDate);\n };\n return (\n <DatePicker\n supportsMultiSelecting\n showMultipleMonths={appContext.screenSize > ScreenSize.ExtraLarge}\n selectedStartDate={context.startDate}\n selectedEndDate={context.endDate}\n supportsWeek\n showMinNightStay\n onStartDateChanged={onStartDateChangedHandler}\n onEndDateChanged={onEndDateChangedHandler}\n />\n );\n }, [context.startDate, context.endDate, appContext.screenSize]);\n}\n"]}
|
|
@@ -31,9 +31,8 @@ const Text_1 = __importStar(require("../../../generic/Text"));
|
|
|
31
31
|
const Color_1 = require("../../../../util/Color");
|
|
32
32
|
const BEButton_1 = __importDefault(require("../../../generic/BEButton"));
|
|
33
33
|
const Icon_1 = require("../../../generic/Icon/Icon");
|
|
34
|
-
const react_1 = require("react");
|
|
34
|
+
const react_1 = __importStar(require("react"));
|
|
35
35
|
const classnames_1 = __importDefault(require("classnames"));
|
|
36
|
-
const react_2 = __importDefault(require("react"));
|
|
37
36
|
const RoomRates_1 = __importDefault(require("./roomRates/RoomRates"));
|
|
38
37
|
const RoomModal_1 = __importDefault(require("../RoomModal"));
|
|
39
38
|
const Currency_1 = __importDefault(require("../../../generic/Currency"));
|
|
@@ -49,7 +48,6 @@ const RoomDetailsBedsBlock_1 = require("./RoomDetailsBedsBlock");
|
|
|
49
48
|
const RoomRate_1 = require("../../../../models/Room/RoomRate");
|
|
50
49
|
const FeaturedPromoFeature_1 = __importDefault(require("../../../../providers/feature/FeaturedPromoFeature"));
|
|
51
50
|
const hooks_1 = require("../../../../hooks/index.js");
|
|
52
|
-
const contexts_2 = require("../../../../contexts/index.js");
|
|
53
51
|
const RoomRatePills_1 = __importDefault(require("./roomRates/RoomRatePills"));
|
|
54
52
|
const ImageProvider_1 = require("../../../../providers/ImageProvider");
|
|
55
53
|
const CurrencyProvider_1 = __importDefault(require("../../../../providers/CurrencyProvider"));
|
|
@@ -62,7 +60,7 @@ function RoomDetails(props) {
|
|
|
62
60
|
const { t } = (0, react_i18next_1.useTranslation)();
|
|
63
61
|
const context = (0, react_1.useContext)(contexts_1.BookingEngineContext);
|
|
64
62
|
const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
|
|
65
|
-
const ccx = (0, react_1.useContext)(
|
|
63
|
+
const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
|
|
66
64
|
const { hotel } = (0, hooks_1.useCurrentHotel)();
|
|
67
65
|
const { room } = props;
|
|
68
66
|
const classes = (0, classnames_1.default)('room-details', {
|
|
@@ -118,47 +116,47 @@ function RoomDetails(props) {
|
|
|
118
116
|
const lowestPrice = Math.round(room.getLowestPrice(false, true));
|
|
119
117
|
const currencySize = context.screenSize > ScreenSize_1.default.Medium && lowestPrice.toLocaleString().length < 7 ? 'large' : 'normal';
|
|
120
118
|
const convertCurrencyPrice = (value) => Math.round(CurrencyProvider_1.default.convertPrice(value, true, ccx.currentCurrency, hotel === null || hotel === void 0 ? void 0 : hotel.defaultCurrency));
|
|
121
|
-
return (
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
context.screenSize > ScreenSize_1.default.Large && (
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
isMobile && (
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
119
|
+
return (react_1.default.createElement("div", { className: `room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}` },
|
|
120
|
+
react_1.default.createElement("div", { className: classes },
|
|
121
|
+
react_1.default.createElement("div", { className: "room-details--image" },
|
|
122
|
+
react_1.default.createElement(ImageGallerySlider_1.default, { images: props.room.getImages(), imageSize: ImageProvider_1.ImageSize.Medium })),
|
|
123
|
+
react_1.default.createElement("div", { className: "room-details--content u-pad--heavy u-pad@l-" },
|
|
124
|
+
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
125
|
+
context.screenSize > ScreenSize_1.default.Large && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
126
|
+
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
127
|
+
react_1.default.createElement(RoomRatePills_1.default, { room: room, limit: 2 })))),
|
|
128
|
+
react_1.default.createElement("div", { className: "room-details--content-title u-marg-bottom--light" },
|
|
129
|
+
react_1.default.createElement(Headline_1.default, { bold: true }, room.name)),
|
|
130
|
+
react_1.default.createElement(RoomDetailsBedsBlock_1.RoomDetailsBedsBlock, { room: room }),
|
|
131
|
+
react_1.default.createElement("div", { className: "room-details--content-description u-marg-bottom--light" },
|
|
132
|
+
react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, type: Text_1.TextType.Small },
|
|
133
|
+
react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: (trimmedDescription === null || trimmedDescription === void 0 ? void 0 : trimmedDescription.replace(/<br(\/|)>/g, '')) || '' } })))),
|
|
134
|
+
react_1.default.createElement("div", { className: "row" },
|
|
135
|
+
react_1.default.createElement("div", { className: "col-md-6 u-flex u-marg-bottom@m- flex-column align-items-start" },
|
|
136
|
+
react_1.default.createElement("div", { className: "room-details--content-perks u-marg-bottom@m-" },
|
|
137
|
+
isMobile && (react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
138
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, bold: true, color: Color_1.Color.Accent }, t(Translation_1.Translation.Misc.Perks.AndYouGetAll)))),
|
|
139
|
+
react_1.default.createElement(RoomDetailsPerkBlock_1.RoomDetailsPerkBlock, { perks: perks })),
|
|
140
|
+
react_1.default.createElement(BEButton_1.default, { icon: Icon_1.IconType.ArrowRight2, isText: true, primary: true, size: "tiny", iconPosition: "right", onClick: moreDetailsOnClick }, t(Translation_1.Translation.Step.Room.RoomInfo.MoreDetails))),
|
|
141
|
+
react_1.default.createElement("div", { className: "col-md-6 u-flex justify-content-end flex-column align-items-start align-items-md-end" },
|
|
142
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Navy, inline: true }, t(Translation_1.Translation.Misc.From)),
|
|
143
|
+
react_1.default.createElement("div", { className: "room-details--content-price flex-row align-items-end" },
|
|
144
|
+
react_1.default.createElement(Headline_1.default, { size: currencySize, bold: true },
|
|
145
|
+
react_1.default.createElement(Currency_1.default, { hideDecimals: true }, lowestPrice)),
|
|
146
|
+
react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, inline: true },
|
|
149
147
|
"/",
|
|
150
148
|
t(Translation_1.Translation.Misc.Night))),
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
150
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Grey, inline: true, className: "u-nowrap" }, room.getLowestPriceType() === RoomRate_1.RoomRatePriceInclusion.IncludingFeesAndTaxes
|
|
153
151
|
? t(Translation_1.Translation.Step.Room.RoomInfo.IncludesTaxes)
|
|
154
152
|
: t(Translation_1.Translation.Step.Room.ExcludingTaxes))),
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
153
|
+
react_1.default.createElement("div", { className: "u-marg-top--light u-flex justify-content-end u-w-100@m-" },
|
|
154
|
+
react_1.default.createElement(BEButton_1.default, { name: "ViewRatesNowButton", primary: true, primaryActive: !!ratesOpen, filled: true, stopIconAnimation: true, icon: ratesOpen ? Icon_1.IconType.ArrowUp2 : Icon_1.IconType.ArrowDown2, iconPosition: "right", onClick: sendRoomClickOnClick, wide: context.screenSize <= ScreenSize_1.default.Large, textColor: ratesOpen ? ((0, Color_1.lightOrDark)(hotel === null || hotel === void 0 ? void 0 : hotel.colors.accent3.slice(1)) === 'light' ? Color_1.Color.Navy : Color_1.Color.White) : undefined }, ratesOpen ? t(Translation_1.Translation.Step.Room.RoomInfo.CloseRates) : t(Translation_1.Translation.Step.Room.RoomInfo.ViewRates))))))),
|
|
155
|
+
react_1.default.createElement(AutoAutoHeight_1.default, { open: !!ratesOpen },
|
|
156
|
+
react_1.default.createElement(RoomRates_1.default, { roomCode: room.code, rates: standardRates, featuredRates: featuredRates })),
|
|
157
|
+
react_1.default.createElement(RoomModal_1.default, { open: viewingDescription, room: props.room, rates: standardRates, featuredRates: featuredRates, onClose: closeDescriptionOnClose }),
|
|
160
158
|
room.getRates().map((rate) => {
|
|
161
|
-
return (
|
|
159
|
+
return (react_1.default.createElement("script", { key: room.code + '-' + rate.code, type: "application/ld+json" }, JSON.stringify({
|
|
162
160
|
'@context': 'http://schema.org/',
|
|
163
161
|
'@type': 'Offer',
|
|
164
162
|
itemOffered: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomDetails.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/RoomDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["import Headline from '@/components/generic/Headline';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { Color } from '@/util/Color';\nimport BEButton from '@/components/generic/BEButton';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport { useState, useContext, useEffect } from 'react';\nimport classNames from 'classnames';\nimport React from 'react';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport Currency from '@/components/generic/Currency';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\nimport ScreenSize from '@/util/ScreenSize';\nimport { Room } from '@/models/Room/Room';\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { RoomDetailsPerkBlock } from '@/components/steps/room/roomDetails/RoomDetailsPerkBlock';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport { CompanyContext } from '@frontend/contexts';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport { ImageSize } from '@/providers/ImageProvider';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport CurrencyProvider from '@/providers/CurrencyProvider';\n\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(null);\n const [viewingDescription, setViewingDescription] = useState(false);\n\n const { t } = useTranslation();\n\n const context = useContext(BookingEngineContext);\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const { hotel } = useCurrentHotel();\n\n const { room } = props;\n\n const classes = classNames('room-details', {\n ['+is-open']: viewingRates,\n });\n\n useEffect(() => {\n if (basketContext.selectedBasketRow?.getRoom() && basketContext.selectedBasketRow.getRoom().code === props.room.code) {\n setViewingRates(true);\n }\n\n DataLayer.instance.addRoomImpression(room);\n }, [basketContext.selectedBasketRow]);\n\n useEffect(() => {\n let nonPromoRates: RoomRate[] = [];\n const toSetFeaturedRate: RoomRate[] = [];\n\n if (FeaturedPromoFeature.isActive()) {\n for (const currentRate of room.getRates()) {\n if (currentRate.promoCode?.toLowerCase() === basketContext.selectedBasketRow?.getPromoCode()?.toLowerCase()) {\n toSetFeaturedRate.unshift(currentRate);\n } else {\n nonPromoRates.push(currentRate);\n }\n }\n\n if (toSetFeaturedRate.length > 0) {\n setViewingRates(true);\n setFeaturedRates(toSetFeaturedRate);\n }\n } else {\n nonPromoRates = room.getRates();\n }\n\n setStandardRates(nonPromoRates);\n }, [room.getRates()]);\n\n const perks = hotel?.perks?.slice(0, 5);\n\n const trimmedDescription = room.getShortDescription();\n\n const isMobile = context.screenSize <= ScreenSize.Large;\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null);\n const moreDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Room Details', InteractionType.LINK, InteractionStep.ROOMS);\n setViewingDescription(true);\n };\n const sendRoomClickOnClick = () => {\n if (!ratesOpen) {\n DataLayer.instance.sendRoomClick(room, basketContext.startDate, basketContext.endDate);\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestPrice = Math.round(room.getLowestPrice(false, true));\n const currencySize = context.screenSize > ScreenSize.Medium && lowestPrice.toLocaleString().length < 7 ? 'large' : 'normal';\n\n const convertCurrencyPrice = (value: number) => Math.round(CurrencyProvider.convertPrice(value, true, ccx.currentCurrency, hotel?.defaultCurrency as string));\n\n return (\n <div className={`room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}`}>\n <div className={classes}>\n <div className=\"room-details--image\">\n <ImageGallerySlider images={props.room.getImages()} imageSize={ImageSize.Medium} />\n </div>\n <div className=\"room-details--content u-pad--heavy u-pad@l-\">\n <div className=\"u-marg-bottom\">\n {context.screenSize > ScreenSize.Large && (\n <>\n <div className=\"u-marg-bottom\">\n <RoomRatePills room={room} limit={2} />\n </div>\n </>\n )}\n <div className=\"room-details--content-title u-marg-bottom--light\">\n <Headline bold>{room.name}</Headline>\n </div>\n <RoomDetailsBedsBlock room={room} />\n <div className=\"room-details--content-description u-marg-bottom--light\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n </div>\n\n <div className=\"row\">\n <div className=\"col-md-6 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <div className=\"room-details--content-perks u-marg-bottom@m-\">\n {isMobile && (\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} bold color={Color.Accent}>\n {t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={perks as HotelPerk[]} />\n </div>\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={moreDetailsOnClick}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n <div className=\"col-md-6 u-flex justify-content-end flex-column align-items-start align-items-md-end\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"room-details--content-price flex-row align-items-end\">\n <Headline size={currencySize} bold>\n <Currency hideDecimals>{lowestPrice}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n {room.getLowestPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes)}\n </Text>\n </div>\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton\n name=\"ViewRatesNowButton\"\n primary\n primaryActive={!!ratesOpen}\n filled\n stopIconAnimation\n icon={ratesOpen ? IconType.ArrowUp2 : IconType.ArrowDown2}\n iconPosition=\"right\"\n onClick={sendRoomClickOnClick}\n wide={context.screenSize <= ScreenSize.Large}\n >\n {ratesOpen ? t(Translation.Step.Room.RoomInfo.CloseRates) : t(Translation.Step.Room.RoomInfo.ViewRates)}\n </BEButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n <AutoAutoHeight open={!!ratesOpen}>\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} />\n </AutoAutoHeight>\n <RoomModal open={viewingDescription} room={props.room} rates={standardRates} featuredRates={featuredRates} onClose={closeDescriptionOnClose} />\n {room.getRates().map((rate) => {\n return (\n <script key={room.code + '-' + rate.code} type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'http://schema.org/',\n '@type': 'Offer',\n itemOffered: {\n '@type': 'HotelRoom',\n name: room.name,\n },\n name: rate.name,\n identifier: rate.code,\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: convertCurrencyPrice(rate.getAveragePrice()),\n priceCurrency: ccx.currentCurrency,\n unitText: 'Nightly',\n },\n })}\n </script>\n );\n })}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RoomDetails.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/RoomDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["import Headline from '@/components/generic/Headline';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { Color, lightOrDark } from '@/util/Color';\nimport BEButton from '@/components/generic/BEButton';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport React, { useContext, useEffect, useState } from 'react';\nimport classNames from 'classnames';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport Currency from '@/components/generic/Currency';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\nimport ScreenSize from '@/util/ScreenSize';\nimport { Room } from '@/models/Room/Room';\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\nimport { BasketContext, BookingEngineContext, CompanyContext } from '@frontend/contexts';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { RoomDetailsPerkBlock } from '@/components/steps/room/roomDetails/RoomDetailsPerkBlock';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport { ImageSize } from '@/providers/ImageProvider';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport CurrencyProvider from '@/providers/CurrencyProvider';\n\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(null);\n const [viewingDescription, setViewingDescription] = useState(false);\n\n const { t } = useTranslation();\n\n const context = useContext(BookingEngineContext);\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const { hotel } = useCurrentHotel();\n\n const { room } = props;\n\n const classes = classNames('room-details', {\n ['+is-open']: viewingRates,\n });\n\n useEffect(() => {\n if (basketContext.selectedBasketRow?.getRoom() && basketContext.selectedBasketRow.getRoom().code === props.room.code) {\n setViewingRates(true);\n }\n\n DataLayer.instance.addRoomImpression(room);\n }, [basketContext.selectedBasketRow]);\n\n useEffect(() => {\n let nonPromoRates: RoomRate[] = [];\n const toSetFeaturedRate: RoomRate[] = [];\n\n if (FeaturedPromoFeature.isActive()) {\n for (const currentRate of room.getRates()) {\n if (currentRate.promoCode?.toLowerCase() === basketContext.selectedBasketRow?.getPromoCode()?.toLowerCase()) {\n toSetFeaturedRate.unshift(currentRate);\n } else {\n nonPromoRates.push(currentRate);\n }\n }\n\n if (toSetFeaturedRate.length > 0) {\n setViewingRates(true);\n setFeaturedRates(toSetFeaturedRate);\n }\n } else {\n nonPromoRates = room.getRates();\n }\n\n setStandardRates(nonPromoRates);\n }, [room.getRates()]);\n\n const perks = hotel?.perks?.slice(0, 5);\n\n const trimmedDescription = room.getShortDescription();\n\n const isMobile = context.screenSize <= ScreenSize.Large;\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null);\n const moreDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Room Details', InteractionType.LINK, InteractionStep.ROOMS);\n setViewingDescription(true);\n };\n const sendRoomClickOnClick = () => {\n if (!ratesOpen) {\n DataLayer.instance.sendRoomClick(room, basketContext.startDate, basketContext.endDate);\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestPrice = Math.round(room.getLowestPrice(false, true));\n const currencySize = context.screenSize > ScreenSize.Medium && lowestPrice.toLocaleString().length < 7 ? 'large' : 'normal';\n\n const convertCurrencyPrice = (value: number) => Math.round(CurrencyProvider.convertPrice(value, true, ccx.currentCurrency, hotel?.defaultCurrency as string));\n\n return (\n <div className={`room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}`}>\n <div className={classes}>\n <div className=\"room-details--image\">\n <ImageGallerySlider images={props.room.getImages()} imageSize={ImageSize.Medium} />\n </div>\n <div className=\"room-details--content u-pad--heavy u-pad@l-\">\n <div className=\"u-marg-bottom\">\n {context.screenSize > ScreenSize.Large && (\n <>\n <div className=\"u-marg-bottom\">\n <RoomRatePills room={room} limit={2} />\n </div>\n </>\n )}\n <div className=\"room-details--content-title u-marg-bottom--light\">\n <Headline bold>{room.name}</Headline>\n </div>\n <RoomDetailsBedsBlock room={room} />\n <div className=\"room-details--content-description u-marg-bottom--light\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n </div>\n\n <div className=\"row\">\n <div className=\"col-md-6 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <div className=\"room-details--content-perks u-marg-bottom@m-\">\n {isMobile && (\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} bold color={Color.Accent}>\n {t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={perks as HotelPerk[]} />\n </div>\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={moreDetailsOnClick}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n <div className=\"col-md-6 u-flex justify-content-end flex-column align-items-start align-items-md-end\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"room-details--content-price flex-row align-items-end\">\n <Headline size={currencySize} bold>\n <Currency hideDecimals>{lowestPrice}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n {room.getLowestPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes)}\n </Text>\n </div>\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton\n name=\"ViewRatesNowButton\"\n primary\n primaryActive={!!ratesOpen}\n filled\n stopIconAnimation\n icon={ratesOpen ? IconType.ArrowUp2 : IconType.ArrowDown2}\n iconPosition=\"right\"\n onClick={sendRoomClickOnClick}\n wide={context.screenSize <= ScreenSize.Large}\n textColor={ratesOpen ? (lightOrDark(hotel?.colors.accent3.slice(1) as string) === 'light' ? Color.Navy : Color.White) : undefined}\n >\n {ratesOpen ? t(Translation.Step.Room.RoomInfo.CloseRates) : t(Translation.Step.Room.RoomInfo.ViewRates)}\n </BEButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n <AutoAutoHeight open={!!ratesOpen}>\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} />\n </AutoAutoHeight>\n <RoomModal open={viewingDescription} room={props.room} rates={standardRates} featuredRates={featuredRates} onClose={closeDescriptionOnClose} />\n {room.getRates().map((rate) => {\n return (\n <script key={room.code + '-' + rate.code} type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'http://schema.org/',\n '@type': 'Offer',\n itemOffered: {\n '@type': 'HotelRoom',\n name: room.name,\n },\n name: rate.name,\n identifier: rate.code,\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: convertCurrencyPrice(rate.getAveragePrice()),\n priceCurrency: ccx.currentCurrency,\n unitText: 'Nightly',\n },\n })}\n </script>\n );\n })}\n </div>\n );\n}\n"]}
|
package/dist/src/util/Color.d.ts
CHANGED
package/dist/src/util/Color.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Color = void 0;
|
|
3
|
+
exports.lightOrDark = exports.Color = void 0;
|
|
4
4
|
var Color;
|
|
5
5
|
(function (Color) {
|
|
6
6
|
Color["Accent"] = "var(--rs-color-accent-1)";
|
|
@@ -19,4 +19,10 @@ var Color;
|
|
|
19
19
|
Color["Navy"] = "var(--rs-color-navy)";
|
|
20
20
|
Color["White"] = "var(--rs-color-white)";
|
|
21
21
|
})(Color = exports.Color || (exports.Color = {}));
|
|
22
|
+
const lightOrDark = (hc) => {
|
|
23
|
+
const [r, g, b] = [1, 3, 5].map((p) => parseInt(hc.substring(p, 2), 16));
|
|
24
|
+
const yiq = (r * 299 + g * 587 + b * 114) / 1000;
|
|
25
|
+
return yiq >= 128 ? 'light' : 'dark';
|
|
26
|
+
};
|
|
27
|
+
exports.lightOrDark = lightOrDark;
|
|
22
28
|
//# sourceMappingURL=Color.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Color.js","sourceRoot":"/","sources":["src/util/Color.ts"],"names":[],"mappings":";;;AAAA,IAAY,KAkBX;AAlBD,WAAY,KAAK;IACb,4CAAmC,CAAA;IACnC,6CAAoC,CAAA;IACpC,6CAAoC,CAAA;IAEpC,4CAAmC,CAAA;IACnC,qDAA4C,CAAA;IAC5C,0CAAiC,CAAA;IACjC,4CAAmC,CAAA;IACnC,wCAA+B,CAAA;IAE/B,8CAAqC,CAAA;IACrC,+CAAsC,CAAA;IACtC,sCAA6B,CAAA;IAC7B,iDAAwC,CAAA;IACxC,sCAA6B,CAAA;IAC7B,sCAA6B,CAAA;IAC7B,wCAA+B,CAAA;AACnC,CAAC,EAlBW,KAAK,GAAL,aAAK,KAAL,aAAK,QAkBhB","sourcesContent":["export enum Color {\n Accent = 'var(--rs-color-accent-1)',\n Accent2 = 'var(--rs-color-accent-2)',\n Accent3 = 'var(--rs-color-accent-3)',\n\n Success = 'var(--rs-color-success)',\n SuccessTint = 'var(--rs-color-success-tint)',\n Danger = 'var(--rs-color-danger)',\n Warning = 'var(--rs-color-warning)',\n Alert = 'var(--rs-color-alert)',\n\n Graphite = 'var(--rs-color-graphite)',\n DarkGrey = 'var(--rs-color-dark-grey)',\n Grey = 'var(--rs-color-grey)',\n LightGrey = 'var(--rs-color-light-grey)',\n Snow = 'var(--rs-color-snow)',\n Navy = 'var(--rs-color-navy)',\n White = 'var(--rs-color-white)',\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Color.js","sourceRoot":"/","sources":["src/util/Color.ts"],"names":[],"mappings":";;;AAAA,IAAY,KAkBX;AAlBD,WAAY,KAAK;IACb,4CAAmC,CAAA;IACnC,6CAAoC,CAAA;IACpC,6CAAoC,CAAA;IAEpC,4CAAmC,CAAA;IACnC,qDAA4C,CAAA;IAC5C,0CAAiC,CAAA;IACjC,4CAAmC,CAAA;IACnC,wCAA+B,CAAA;IAE/B,8CAAqC,CAAA;IACrC,+CAAsC,CAAA;IACtC,sCAA6B,CAAA;IAC7B,iDAAwC,CAAA;IACxC,sCAA6B,CAAA;IAC7B,sCAA6B,CAAA;IAC7B,wCAA+B,CAAA;AACnC,CAAC,EAlBW,KAAK,GAAL,aAAK,KAAL,aAAK,QAkBhB;AAEM,MAAM,WAAW,GAAG,CAAC,EAAU,EAAoB,EAAE;IACxD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IAEjD,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC,CAAC;AALW,QAAA,WAAW,eAKtB","sourcesContent":["export enum Color {\n Accent = 'var(--rs-color-accent-1)',\n Accent2 = 'var(--rs-color-accent-2)',\n Accent3 = 'var(--rs-color-accent-3)',\n\n Success = 'var(--rs-color-success)',\n SuccessTint = 'var(--rs-color-success-tint)',\n Danger = 'var(--rs-color-danger)',\n Warning = 'var(--rs-color-warning)',\n Alert = 'var(--rs-color-alert)',\n\n Graphite = 'var(--rs-color-graphite)',\n DarkGrey = 'var(--rs-color-dark-grey)',\n Grey = 'var(--rs-color-grey)',\n LightGrey = 'var(--rs-color-light-grey)',\n Snow = 'var(--rs-color-snow)',\n Navy = 'var(--rs-color-navy)',\n White = 'var(--rs-color-white)',\n}\n\nexport const lightOrDark = (hc: string): 'light' | 'dark' => {\n const [r, g, b] = [1, 3, 5].map((p) => parseInt(hc.substring(p, 2), 16));\n const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n\n return yiq >= 128 ? 'light' : 'dark';\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataLayer.js","sourceRoot":"/","sources":["src/util/DataLayer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wEAA0C;AAG1C,kDAA0B;AAK1B,wDAA0C;AAC1C,yCAAyC;AAGzC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AACzC,MAAqB,SAAS;IAA9B;QAGY,kBAAa,GAAG,IAAI,CAAC;QAOrB,gBAAW,GAAc,EAAE,CAAC;IA+VxC,CAAC;IA3VG,uFAAuF;IACvF,MAAM,CAAC,aAAa,CAAC,WAA8B;;QAC/C,MAAM,MAAM,GAAG,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,SAAS,0CAAE,MAAM,CAAC;QAC9C,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACtB,0BAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,kBAAkB,CAAC,EAAU;QAChC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEM,YAAY,CAAC,SAAiB;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAEM,gBAAgB,CAAC,mBAA2B,EAAE,oBAA6B;QAC9E,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;SACpD;IACL,CAAC;IAEM,cAAc,CAAC,WAA0C;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,mBAAmB,CAAC,IAAU,EAAE,IAAe,EAAE,YAAqB,EAAE,QAAiB;QACrF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3B;QAED,MAAM,OAAO,GAAY;YACrB,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACvB,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3F,QAAQ,EAAE,IAAI,CAAC,IAAc;SAChC,CAAC;QAEF,IAAI,IAAI,EAAE;YACN,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;SAC/B;QAED,IAAI,YAAY,KAAK,SAAS,EAAE;YAC5B,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;YACzB,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC;SACnC;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE;YACxB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC/B;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,wBAAwB,CAAC,QAAwB;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,EAAE,EAAE,KAAK,CAAC,IAAI;YACd,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE;YAC/B,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3F,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE;SACxC,CAAC;IACN,CAAC;IAED,iBAAiB,CAAC,IAAU;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,qBAAqB,CAAC,IAAU,EAAE,IAAc;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,mBAAmB;QACf,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,0BAAU,CAAC,SAAS,CAAC;gBACjB,SAAS,EAAE;oBACP,KAAK,EAAE,qBAAqB;oBAC5B,SAAS,EAAE;wBACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;wBACvC,WAAW,EAAE,IAAI,CAAC,WAAW;qBAChC;iBACJ;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACzB;IACL,CAAC;IAED,aAAa,CAAC,IAAU,EAAE,SAAgB,EAAE,OAAc;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAC7C,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;oBACvC,KAAK,EAAE;wBACH,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACtB;oBACD,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBAClD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;iBACjD;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAClC,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,YAAY;aACtB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,qBAAqB,CAAC,IAAc,EAAE,QAAgB,EAAE,SAAgB,EAAE,OAAc;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC;QACnD,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,WAAW;gBAClB,SAAS,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;oBACvC,GAAG,EAAE;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACtB;oBACD,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBAClD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;iBACjD;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,mBAAmB,CAAC,IAAc;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAErF,IAAI,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAEpD,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,CAAC,OAAO,CAAC;aAClB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,mBAAmB,CAAC,OAAiB,EAAE,OAAiB;QACpD,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAE9F,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,iBAAiB;gBACxB,eAAe,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE;gBAClE,GAAG,EAAE;oBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;iBACzB;gBACD,GAAG,EAAE;oBACD,QAAQ,EAAE,CAAC,UAAU,CAAC;iBACzB;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,YAAY,CAAC,SAAgB,EAAE,OAAc;QACzC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAE9B,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,MAAM;gBACb,SAAS,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;oBACvC,SAAS,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAC,qBAAqB,CAAC;oBACnD,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,qBAAqB,CAAC;oBAC/C,QAAQ,EAAE,aAAa;iBAC1B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB,CAAC,UAAuB,EAAE,SAA2B;QACjE,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,IAAI,SAAS,GAAsB,SAAS,CAAC;QAC7C,IAAI,OAAO,GAAsB,SAAS,CAAC;QAE3C,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAC/B,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,EAAc,EAAE,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QACxH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAE5C,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;oBACvC,QAAQ,EAAE;wBACN,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;wBACxB,QAAQ;qBACX;oBACD,SAAS,EAAG,SAA+B,aAA/B,SAAS,uBAAT,SAAS,CAAwB,MAAM,CAAC,qBAAqB,CAAC;oBAC1E,OAAO,EAAG,OAA6B,aAA7B,OAAO,uBAAP,OAAO,CAAwB,MAAM,CAAC,qBAAqB,CAAC;oBACtE,QAAQ,EAAE,kBAAkB;iBAC/B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,wBAAwB,CAAC,UAAuB,EAAE,SAA2B,EAAE,YAA6B;QACxG,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,EAAc,EAAE,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAExH,IAAI,CAAC,KAAK,CAAC,EAAE;gBACT,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;aACN;YAED,IAAI,CAAC,GAAG,CAAC,kCAAkC,EAAE,QAAQ,CAAC,CAAC;YAEvD,IAAI;gBACA,0BAAU,CAAC,SAAS,CAAC;oBACjB,SAAS,EAAE;wBACP,KAAK,EAAE,cAAc;wBACrB,SAAS,EAAE;4BACP,YAAY,EAAE,IAAI,CAAC,oBAAoB;4BACvC,QAAQ,EAAE;gCACN,WAAW,EAAE;oCACT,EAAE,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,iBAAiB;oCAClD,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;oCACpD,GAAG,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS;oCAC/F,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE;iCAC7B;gCACD,QAAQ;6BACX;4BACD,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;4BAC3D,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;4BACvD,WAAW,EAAE,IAAA,eAAK,GAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;4BAClD,QAAQ,EAAE,YAAY;4BACtB,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa;yBAC1D;qBACJ;iBACJ,CAAC,CAAC;aACN;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,aAAa,CAAC;oBACjB,KAAK,EAAE,gBAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE,yCAAyC;oBAClD,IAAI,kCAAO,YAAY,KAAE,KAAK,EAAE,CAAC,GAAE;iBACtC,CAAC,CAAC;gBACH,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;aAC9B;YAED,CAAC,EAAE,CAAC;QACR,CAAC,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB;QACZ,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,eAAe;aACzB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,IAAqB,EAAE,IAAqB;QACtE,MAAM,WAAW,GAAG;YAChB,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;SAC3B,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAE7C,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE,WAAW;SACzB,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB,CAAC,iBAAyB;QACtC,IAAI,CAAC,GAAG,CAAC,uCAAuC,GAAG,iBAAiB,CAAC,CAAC;QAEtE,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE;oBACP,MAAM,EAAE;wBACJ,WAAW,EAAE;4BACT,EAAE,EAAE,iBAAiB;yBACxB;qBACJ;iBACJ;aACJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,iBAAiB,CAAC,SAAgB,EAAE,OAAc;QAC9C,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAExD,0BAAU,CAAC,SAAS,CAAC;YACjB,SAAS,EAAE;gBACP,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC3C,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;aAC9C;SACJ,CAAC,CAAC;IACP,CAAC;IAES,GAAG,CAAC,GAAG,MAAW;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,OAAO;SACV;QAED,OAAO,CAAC,GAAG,CACP,eAAe;YACX,MAAM;iBACD,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE;gBACb,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;oBACxB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;iBAC7B;gBACD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CACtB,CAAC;IACN,CAAC;;AAxWL,4BAyWC;AAxWU,kBAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;AAsXtC,IAAY,eASX;AATD,WAAY,eAAe;IACvB,4CAAyB,CAAA;IACzB,wCAAqB,CAAA;IACrB,oCAAiB,CAAA;IACjB,wCAAqB,CAAA;IACrB,kDAA+B,CAAA;IAC/B,gCAAa,CAAA;IACb,4CAAyB,CAAA;IACzB,wCAAqB,CAAA;AACzB,CAAC,EATW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAS1B;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACvB,kCAAe,CAAA;IACf,kCAAe,CAAA;IACf,kDAA+B,CAAA;AACnC,CAAC,EAJW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAI1B","sourcesContent":["import TagManager from 'react-gtm-module';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { Room } from '@/models/Room/Room';\nimport dayjs from 'dayjs';\nimport { Dayjs } from 'dayjs';\nimport BasketRow from '@/models/BasketRow';\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport ReservationsDTO from '@/models/Api/ReservationsDTO';\nimport * as Sentry from '@sentry/browser';\nimport { Severity } from '@sentry/types';\nimport { ConfigCompany, HasDatalayerTags } from '@/models/Client/Hotel/Company';\n\nconst DATALAYER_DATE_FORMAT = 'YYYY-M-D';\nexport default class DataLayer {\n static instance = new DataLayer();\n\n private enableLogging = true;\n\n private hotelName!: string;\n private providerHotelID!: string;\n\n private originalCurrencyCode?: string;\n\n private impressions: Product[] = [];\n\n private brandSuffix?: ConfigCompany['brandSuffix'];\n\n // TODO: Move this GTM initialize call to config, so gtm IDs are always in Client world\n static initialiseGTM(hotelConfig?: HasDatalayerTags) {\n const gtmIds = hotelConfig?.datalayer?.gtmIds;\n gtmIds?.forEach((gtmId) => {\n TagManager.initialize({ gtmId });\n });\n }\n\n public setProviderHotelID(id: string) {\n this.providerHotelID = id;\n }\n\n public setHotelName(hotelName: string) {\n this.hotelName = hotelName;\n }\n\n public setCurrencyCodes(currentCurrencyCode: string, originalCurrencyCode?: string) {\n if (originalCurrencyCode) {\n this.originalCurrencyCode = originalCurrencyCode;\n }\n }\n\n public setBrandSuffix(brandSuffix?: ConfigCompany['brandSuffix']) {\n this.brandSuffix = brandSuffix;\n }\n\n generateProductInfo(room: Room, rate?: RoomRate, listPosition?: number, quantity?: number): Product {\n const price = rate ? rate.getAveragePrice() : room.getLowestPrice();\n const nameParts = [room.name];\n const idParts = [this.providerHotelID, room.code];\n if (rate) {\n nameParts.push(rate.name);\n idParts.push(rate.code);\n }\n\n const product: Product = {\n name: nameParts.join(' - '),\n id: idParts.join(' - '),\n price: price,\n brand: [this.hotelName, this.providerHotelID, this.brandSuffix].filter(Boolean).join(' - '),\n category: room.name as string,\n };\n\n if (rate) {\n product.variant = rate.name;\n }\n\n if (listPosition !== undefined) {\n product.list = 'BE List';\n product.position = listPosition;\n }\n\n if (quantity !== undefined) {\n product.quantity = quantity;\n }\n\n return product;\n }\n\n generateAddonProductInfo(addonRow: BasketAddonRow): Product {\n const addon = addonRow.getAddon();\n return {\n name: addon.name,\n id: addon.code,\n price: addonRow.getTotalPrice(),\n brand: [this.hotelName, this.providerHotelID, this.brandSuffix].filter(Boolean).join(' - '),\n category: addon.category,\n quantity: addonRow.getTotalQuantity(),\n };\n }\n\n addRoomImpression(room: Room) {\n const product = this.generateProductInfo(room, undefined, this.impressions.length + 1);\n this.log('room impression', product);\n this.impressions.push(product);\n }\n\n addRoomRateImpression(room: Room, rate: RoomRate) {\n const product = this.generateProductInfo(room, rate, this.impressions.length + 1);\n this.log('rate impression', product);\n this.impressions.push(product);\n }\n\n sendRoomImpressions() {\n this.log('sending ' + this.impressions.length + ' impressions');\n\n if (this.impressions.length > 0) {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Product impressions',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n impressions: this.impressions,\n },\n },\n });\n\n this.impressions = [];\n }\n }\n\n sendRoomClick(room: Room, startDate: Dayjs, endDate: Dayjs) {\n const product = this.generateProductInfo(room);\n this.log('sending room rate click', product);\n TagManager.dataLayer({\n dataLayer: {\n event: 'productClick',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n click: {\n products: [product],\n },\n StartDate: startDate.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate.format(DATALAYER_DATE_FORMAT),\n },\n },\n });\n }\n\n sendAwayWindowOpen() {\n this.log('away window triggered');\n TagManager.dataLayer({\n dataLayer: {\n event: 'awayWindow',\n },\n });\n }\n\n sendRoomRateAddToCart(rate: RoomRate, quantity: number, startDate: Dayjs, endDate: Dayjs) {\n const product = this.generateProductInfo(rate.getRoom(), rate, undefined, quantity);\n this.log('sending room rate add to cart', product);\n TagManager.dataLayer({\n dataLayer: {\n event: 'addToCart',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n add: {\n products: [product],\n },\n StartDate: startDate.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate.format(DATALAYER_DATE_FORMAT),\n },\n },\n });\n }\n\n sendUpsellCancelled(rate: RoomRate) {\n const product = this.generateProductInfo(rate.getRoom(), rate, undefined, undefined);\n\n this.log('sending room upgrade cancellation event');\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'upsellCancelled',\n item: [product],\n },\n });\n }\n\n sendUpsellConfirmed(oldRate: RoomRate, newRate: RoomRate) {\n this.log('sending room upgrade notification');\n\n const oldProduct = this.generateProductInfo(oldRate.getRoom(), oldRate, undefined, undefined);\n const newProduct = this.generateProductInfo(newRate.getRoom(), newRate, undefined, undefined);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'upsellConfirmed',\n priceDifference: newRate.getTotalPrice() - oldRate.getTotalPrice(),\n old: {\n products: [oldProduct],\n },\n new: {\n products: [newProduct],\n },\n },\n });\n }\n\n sendRoomView(startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room view');\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'room',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n StartDate: startDate?.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate?.format(DATALAYER_DATE_FORMAT),\n PageType: 'offerdetail',\n },\n },\n });\n }\n\n sendCheckoutView(basketRows: BasketRow[], addonRows: BasketAddonRow[]) {\n const products: Product[] = [];\n\n let startDate: Dayjs | undefined = undefined;\n let endDate: Dayjs | undefined = undefined;\n\n basketRows.forEach((row) => {\n startDate = row.getStartDate();\n endDate = row.getEndDate();\n products.push(this.generateProductInfo(row.getRoom(), row.getRate() as RoomRate, undefined, row.getNumberOfDays()));\n });\n\n addonRows.forEach((row) => {\n products.push(this.generateAddonProductInfo(row));\n });\n\n this.log('sending checkout view', products);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'checkout',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n checkout: {\n actionField: { step: 1 },\n products,\n },\n StartDate: (startDate as Dayjs | undefined)?.format(DATALAYER_DATE_FORMAT),\n EndDate: (endDate as Dayjs | undefined)?.format(DATALAYER_DATE_FORMAT),\n PageType: 'conversionintent',\n },\n },\n });\n }\n\n sendReservationConfirmed(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO) {\n let i = 0;\n basketRows.forEach((row) => {\n const products = [this.generateProductInfo(row.getRoom(), row.getRate() as RoomRate, undefined, row.getNumberOfDays())];\n\n if (i === 0) {\n addonRows.forEach((addonRow) => {\n products.push(this.generateAddonProductInfo(addonRow));\n });\n }\n\n this.log('sending reservation confirmation', products);\n\n try {\n TagManager.dataLayer({\n dataLayer: {\n event: 'roomPurchase',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n purchase: {\n actionField: {\n id: reservations.reservations[i].reservationNumber,\n revenue: reservations.reservations[i].total.afterTax,\n tax: reservations.reservations[i].total.afterTax - reservations.reservations[i].total.beforeTax,\n coupon: row.getPromoCode(),\n },\n products,\n },\n StartDate: row.getStartDate().format(DATALAYER_DATE_FORMAT),\n EndDate: row.getEndDate().format(DATALAYER_DATE_FORMAT),\n BookingDate: dayjs().format(DATALAYER_DATE_FORMAT),\n PageType: 'conversion',\n paymentType: reservations.reservations[i].paymentMethod,\n },\n },\n });\n } catch (e) {\n Sentry.addBreadcrumb({\n level: Severity.Error,\n message: 'sending reservation confirmation failed',\n data: { ...reservations, index: i },\n });\n Sentry.captureException(e);\n }\n\n i++;\n });\n }\n\n sendMemberSignUp() {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Email Sign up',\n },\n });\n }\n\n sendInteraction(name: string, type: InteractionType, step: InteractionStep) {\n const interaction = {\n 'Interaction Name': name,\n 'Interaction Type': type,\n 'Interaction Step': step,\n };\n\n this.log('sending interaction', interaction);\n\n TagManager.dataLayer({\n dataLayer: interaction,\n });\n }\n\n sendCancellation(reservationNumber: string) {\n this.log('sending cancellation for reservation ' + reservationNumber);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'refund',\n ecommerce: {\n refund: {\n actionField: {\n id: reservationNumber,\n },\n },\n },\n },\n });\n }\n\n sendDateSelection(startDate: Dayjs, endDate: Dayjs) {\n this.log('sending date selection ', startDate, endDate);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'dateSelection',\n arrivalDate: startDate.format('YYYY-MM-DD'),\n departureDate: endDate.format('YYYY-MM-DD'),\n },\n });\n }\n\n protected log(...output: any) {\n if (!this.enableLogging) {\n return;\n }\n\n console.log(\n '[DATALAYER]: ' +\n output\n .map((it: any) => {\n if (typeof it === 'object') {\n return JSON.stringify(it);\n }\n return it;\n })\n .join('; ')\n );\n }\n}\n\ntype Product = {\n name: string; // <Put the Room Variant here example - ‘BAE - Best Available Everyday - Superoo’>\n id: string; // <Put the SKU for Room variant here example - ‘62991 - VEK - 04BAE’>\n price: number; // <Put the PER DAY price of room>\n brand: string; // <Put the hotel brand here example - ‘Australia - Ovolo Woolloomooloo - 62991’>\n category: string; // <Put the Category of room here example - ‘Superoo’>\n variant?: string; // <Put the Variant of room here example - ‘BAE - Best Available Everyday - Prepaid Rate’>\n list?: string; // <Put ‘BE List’ if shown in Booking Engine else put ‘Hotel List’>\n position?: number; // <Put the position of hotel in the list here example 1’>\n quantity?: number; // <Put the rooms X nights>\n};\n\nexport enum InteractionType {\n NUMBER_INPUT = '+-widget',\n CALENDAR = 'Calendar',\n BUTTON = 'Button',\n DROPDOWN = 'Dropdown',\n LINK_DROPDOWN = 'Link dropdown',\n LINK = 'Link',\n FORM_FIELD = 'Form field',\n CHECKBOX = 'Checkbox',\n}\n\nexport enum InteractionStep {\n DATES = 'Dates',\n ROOMS = 'Rooms',\n GUEST_DETAILS = 'Guest Details',\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DataLayer.js","sourceRoot":"/","sources":["src/util/DataLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import TagManager from 'react-gtm-module';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { Room } from '@/models/Room/Room';\nimport dayjs from 'dayjs';\nimport { Dayjs } from 'dayjs';\nimport BasketRow from '@/models/BasketRow';\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport ReservationsDTO from '@/models/Api/ReservationsDTO';\nimport * as Sentry from '@sentry/browser';\nimport { Severity } from '@sentry/types';\nimport { ConfigCompany, HasDatalayerTags } from '@/models/Client/Hotel/Company';\n\nconst DATALAYER_DATE_FORMAT = 'YYYY-M-D';\nexport default class DataLayer {\n static instance = new DataLayer();\n\n private enableLogging = true;\n\n private hotelName!: string;\n private providerHotelID!: string;\n\n private originalCurrencyCode?: string;\n\n private impressions: Product[] = [];\n\n private brandSuffix?: ConfigCompany['brandSuffix'];\n\n // TODO: Move this GTM initialize call to config, so gtm IDs are always in Client world\n static initialiseGTM(hotelConfig?: HasDatalayerTags) {\n const gtmIds = hotelConfig?.datalayer?.gtmIds;\n gtmIds?.forEach((gtmId) => {\n TagManager.initialize({ gtmId });\n });\n }\n\n public setProviderHotelID(id: string) {\n this.providerHotelID = id;\n }\n\n public setHotelName(hotelName: string) {\n this.hotelName = hotelName;\n }\n\n public setCurrencyCodes(currentCurrencyCode: string, originalCurrencyCode?: string) {\n if (originalCurrencyCode) {\n this.originalCurrencyCode = originalCurrencyCode;\n }\n }\n\n public setBrandSuffix(brandSuffix?: ConfigCompany['brandSuffix']) {\n this.brandSuffix = brandSuffix;\n }\n\n generateProductInfo(room: Room, rate?: RoomRate, listPosition?: number, quantity?: number): Product {\n const price = rate ? rate.getAveragePrice() : room.getLowestPrice();\n const nameParts = [room.name];\n const idParts = [this.providerHotelID, room.code];\n if (rate) {\n nameParts.push(rate.name);\n idParts.push(rate.code);\n }\n\n const product: Product = {\n name: nameParts.join(' - '),\n id: idParts.join(' - '),\n price: price,\n brand: [this.hotelName, this.providerHotelID, this.brandSuffix].filter(Boolean).join(' - '),\n category: room.name as string,\n };\n\n if (rate) {\n product.variant = rate.name;\n }\n\n if (listPosition !== undefined) {\n product.list = 'BE List';\n product.position = listPosition;\n }\n\n if (quantity !== undefined) {\n product.quantity = quantity;\n }\n\n return product;\n }\n\n generateAddonProductInfo(addonRow: BasketAddonRow): Product {\n const addon = addonRow.getAddon();\n return {\n name: addon.name,\n id: addon.code,\n price: addonRow.getTotalPrice(),\n brand: [this.hotelName, this.providerHotelID, this.brandSuffix].filter(Boolean).join(' - '),\n category: addon.category,\n quantity: addonRow.getTotalQuantity(),\n };\n }\n\n addRoomImpression(room: Room) {\n const product = this.generateProductInfo(room, undefined, this.impressions.length + 1);\n this.log('room impression', product);\n this.impressions.push(product);\n }\n\n addRoomRateImpression(room: Room, rate: RoomRate) {\n const product = this.generateProductInfo(room, rate, this.impressions.length + 1);\n this.log('rate impression', product);\n this.impressions.push(product);\n }\n\n sendRoomImpressions() {\n this.log('sending ' + this.impressions.length + ' impressions');\n\n if (this.impressions.length > 0) {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Product impressions',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n impressions: this.impressions,\n },\n },\n });\n\n this.impressions = [];\n }\n }\n\n sendRoomClick(room: Room, startDate: Dayjs, endDate: Dayjs) {\n const product = this.generateProductInfo(room);\n this.log('sending room rate click', product);\n TagManager.dataLayer({\n dataLayer: {\n event: 'productClick',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n click: {\n products: [product],\n },\n StartDate: startDate.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate.format(DATALAYER_DATE_FORMAT),\n },\n },\n });\n }\n\n sendAwayWindowOpen() {\n this.log('away window triggered');\n TagManager.dataLayer({\n dataLayer: {\n event: 'awayWindow',\n },\n });\n }\n\n sendRoomRateAddToCart(rate: RoomRate, quantity: number, startDate: Dayjs, endDate: Dayjs) {\n const product = this.generateProductInfo(rate.getRoom(), rate, undefined, quantity);\n this.log('sending room rate add to cart', product);\n TagManager.dataLayer({\n dataLayer: {\n event: 'addToCart',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n add: {\n products: [product],\n },\n StartDate: startDate.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate.format(DATALAYER_DATE_FORMAT),\n },\n },\n });\n }\n\n sendUpsellCancelled(rate: RoomRate) {\n const product = this.generateProductInfo(rate.getRoom(), rate, undefined, undefined);\n\n this.log('sending room upgrade cancellation event');\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'upsellCancelled',\n item: [product],\n },\n });\n }\n\n sendUpsellConfirmed(oldRate: RoomRate, newRate: RoomRate) {\n this.log('sending room upgrade notification');\n\n const oldProduct = this.generateProductInfo(oldRate.getRoom(), oldRate, undefined, undefined);\n const newProduct = this.generateProductInfo(newRate.getRoom(), newRate, undefined, undefined);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'upsellConfirmed',\n priceDifference: newRate.getTotalPrice() - oldRate.getTotalPrice(),\n old: {\n products: [oldProduct],\n },\n new: {\n products: [newProduct],\n },\n },\n });\n }\n\n sendRoomView(startDate: Dayjs, endDate: Dayjs) {\n this.log('sending room view');\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'room',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n StartDate: startDate?.format(DATALAYER_DATE_FORMAT),\n EndDate: endDate?.format(DATALAYER_DATE_FORMAT),\n PageType: 'offerdetail',\n },\n },\n });\n }\n\n sendCheckoutView(basketRows: BasketRow[], addonRows: BasketAddonRow[]) {\n const products: Product[] = [];\n\n let startDate: Dayjs | undefined = undefined;\n let endDate: Dayjs | undefined = undefined;\n\n basketRows.forEach((row) => {\n startDate = row.getStartDate();\n endDate = row.getEndDate();\n products.push(this.generateProductInfo(row.getRoom(), row.getRate() as RoomRate, undefined, row.getNumberOfDays()));\n });\n\n addonRows.forEach((row) => {\n products.push(this.generateAddonProductInfo(row));\n });\n\n this.log('sending checkout view', products);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'checkout',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n checkout: {\n actionField: { step: 1 },\n products,\n },\n StartDate: (startDate as Dayjs | undefined)?.format(DATALAYER_DATE_FORMAT),\n EndDate: (endDate as Dayjs | undefined)?.format(DATALAYER_DATE_FORMAT),\n PageType: 'conversionintent',\n },\n },\n });\n }\n\n sendReservationConfirmed(basketRows: BasketRow[], addonRows: BasketAddonRow[], reservations: ReservationsDTO) {\n let i = 0;\n basketRows.forEach((row) => {\n const products = [this.generateProductInfo(row.getRoom(), row.getRate() as RoomRate, undefined, row.getNumberOfDays())];\n\n if (i === 0) {\n addonRows.forEach((addonRow) => {\n products.push(this.generateAddonProductInfo(addonRow));\n });\n }\n\n this.log('sending reservation confirmation', products);\n\n try {\n TagManager.dataLayer({\n dataLayer: {\n event: 'roomPurchase',\n ecommerce: {\n currencyCode: this.originalCurrencyCode,\n purchase: {\n actionField: {\n id: reservations.reservations[i].reservationNumber,\n revenue: reservations.reservations[i].total.afterTax,\n tax: reservations.reservations[i].total.afterTax - reservations.reservations[i].total.beforeTax,\n coupon: row.getPromoCode(),\n },\n products,\n },\n StartDate: row.getStartDate().format(DATALAYER_DATE_FORMAT),\n EndDate: row.getEndDate().format(DATALAYER_DATE_FORMAT),\n BookingDate: dayjs().format(DATALAYER_DATE_FORMAT),\n PageType: 'conversion',\n paymentType: reservations.reservations[i].paymentMethod,\n },\n },\n });\n } catch (e) {\n Sentry.addBreadcrumb({\n level: Severity.Error,\n message: 'sending reservation confirmation failed',\n data: { ...reservations, index: i },\n });\n Sentry.captureException(e);\n }\n\n i++;\n });\n }\n\n sendMemberSignUp() {\n TagManager.dataLayer({\n dataLayer: {\n event: 'Email Sign up',\n },\n });\n }\n\n sendInteraction(name: string, type: InteractionType, step: InteractionStep) {\n const interaction = {\n 'Interaction Name': name,\n 'Interaction Type': type,\n 'Interaction Step': step,\n };\n\n this.log('sending interaction', interaction);\n\n TagManager.dataLayer({\n dataLayer: interaction,\n });\n }\n\n sendCancellation(reservationNumber: string) {\n this.log('sending cancellation for reservation ' + reservationNumber);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'refund',\n ecommerce: {\n refund: {\n actionField: {\n id: reservationNumber,\n },\n },\n },\n },\n });\n }\n\n sendDateSelection(startDate: Dayjs, endDate: Dayjs) {\n if (!startDate || !endDate) {\n return;\n }\n\n this.log('sending date selection ', startDate, endDate);\n\n TagManager.dataLayer({\n dataLayer: {\n event: 'dateSelection',\n arrivalDate: startDate.format('YYYY-MM-DD'),\n departureDate: endDate.format('YYYY-MM-DD'),\n },\n });\n }\n\n protected log(...output: any) {\n if (!this.enableLogging) {\n return;\n }\n\n console.log(\n '[DATALAYER]: ' +\n output\n .map((it: any) => {\n if (typeof it === 'object') {\n return JSON.stringify(it);\n }\n return it;\n })\n .join('; ')\n );\n }\n}\n\ntype Product = {\n name: string; // <Put the Room Variant here example - ‘BAE - Best Available Everyday - Superoo’>\n id: string; // <Put the SKU for Room variant here example - ‘62991 - VEK - 04BAE’>\n price: number; // <Put the PER DAY price of room>\n brand: string; // <Put the hotel brand here example - ‘Australia - Ovolo Woolloomooloo - 62991’>\n category: string; // <Put the Category of room here example - ‘Superoo’>\n variant?: string; // <Put the Variant of room here example - ‘BAE - Best Available Everyday - Prepaid Rate’>\n list?: string; // <Put ‘BE List’ if shown in Booking Engine else put ‘Hotel List’>\n position?: number; // <Put the position of hotel in the list here example 1’>\n quantity?: number; // <Put the rooms X nights>\n};\n\nexport enum InteractionType {\n NUMBER_INPUT = '+-widget',\n CALENDAR = 'Calendar',\n BUTTON = 'Button',\n DROPDOWN = 'Dropdown',\n LINK_DROPDOWN = 'Link dropdown',\n LINK = 'Link',\n FORM_FIELD = 'Form field',\n CHECKBOX = 'Checkbox',\n}\n\nexport enum InteractionStep {\n DATES = 'Dates',\n ROOMS = 'Rooms',\n GUEST_DETAILS = 'Guest Details',\n}\n"]}
|