@roomstay/frontend 2.5.23 → 2.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.
Files changed (84) hide show
  1. package/dist/201.bundle.js +1 -1
  2. package/dist/279.bundle.js +1 -1
  3. package/dist/370.bundle.js +1 -1
  4. package/dist/449.bundle.js +1 -1
  5. package/dist/468.bundle.js +1 -1
  6. package/dist/537.bundle.js +1 -1
  7. package/dist/572.bundle.js +1 -1
  8. package/dist/736.bundle.js +1 -1
  9. package/dist/855.bundle.js +1 -1
  10. package/dist/873.bundle.js +1 -1
  11. package/dist/903.bundle.js +1 -1
  12. package/dist/972.bundle.js +1 -1
  13. package/dist/main.bundle.js +1 -1
  14. package/dist/src/api/AvailabilityAPI.d.ts +20 -2
  15. package/dist/src/api/AvailabilityAPI.js +35 -16
  16. package/dist/src/api/AvailabilityAPI.js.map +1 -1
  17. package/dist/src/api/BaseAPI.js +2 -1
  18. package/dist/src/api/BaseAPI.js.map +1 -1
  19. package/dist/src/components/generic/Tooltip/Tooltip.d.ts +3 -0
  20. package/dist/src/components/generic/Tooltip/Tooltip.js +20 -4
  21. package/dist/src/components/generic/Tooltip/Tooltip.js.map +1 -1
  22. package/dist/src/components/generic/date/DatePicker.d.ts +4 -1
  23. package/dist/src/components/generic/date/DatePicker.js +80 -34
  24. package/dist/src/components/generic/date/DatePicker.js.map +1 -1
  25. package/dist/src/components/generic/date/DatePickerDay.js +127 -9
  26. package/dist/src/components/generic/date/DatePickerDay.js.map +1 -1
  27. package/dist/src/components/generic/date/FloatingDatePicker.js +5 -3
  28. package/dist/src/components/generic/date/FloatingDatePicker.js.map +1 -1
  29. package/dist/src/components/steps/DaysSelectedInformer.js +3 -1
  30. package/dist/src/components/steps/DaysSelectedInformer.js.map +1 -1
  31. package/dist/src/components/steps/MinimumNightStayPill.js +10 -3
  32. package/dist/src/components/steps/MinimumNightStayPill.js.map +1 -1
  33. package/dist/src/components/steps/date/StepDatePricePerRoom.js +2 -2
  34. package/dist/src/components/steps/date/StepDatePricePerRoom.js.map +1 -1
  35. package/dist/src/components/steps/date/StepOneNextStepButton.js +15 -1
  36. package/dist/src/components/steps/date/StepOneNextStepButton.js.map +1 -1
  37. package/dist/src/components/steps/room/AvailableUpgradesModal.js +2 -2
  38. package/dist/src/components/steps/room/AvailableUpgradesModal.js.map +1 -1
  39. package/dist/src/components/steps/room/MemberSignInModal/{Big4MemberModal.d.ts → ExternalMemberModal.d.ts} +2 -2
  40. package/dist/src/components/steps/room/MemberSignInModal/{Big4MemberModal.js → ExternalMemberModal.js} +20 -8
  41. package/dist/src/components/steps/room/MemberSignInModal/ExternalMemberModal.js.map +1 -0
  42. package/dist/src/components/steps/room/NoRoomsFoundBlock.js +2 -2
  43. package/dist/src/components/steps/room/NoRoomsFoundBlock.js.map +1 -1
  44. package/dist/src/components/steps/room/RoomListCrossSellBlock.js +2 -2
  45. package/dist/src/components/steps/room/RoomListCrossSellBlock.js.map +1 -1
  46. package/dist/src/config.d.ts +4 -0
  47. package/dist/src/config.js +7 -0
  48. package/dist/src/config.js.map +1 -0
  49. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +5 -5
  50. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  51. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +1 -1
  52. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  53. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +5 -5
  54. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  55. package/dist/src/contexts/DatePickerContext.d.ts +4 -0
  56. package/dist/src/contexts/DatePickerContext.js.map +1 -1
  57. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +2 -2
  58. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  59. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js +2 -2
  60. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js.map +1 -1
  61. package/dist/src/hooks/index.d.ts +1 -0
  62. package/dist/src/hooks/index.js +1 -0
  63. package/dist/src/hooks/index.js.map +1 -1
  64. package/dist/src/hooks/useCalendarNightStay.d.ts +39 -0
  65. package/dist/src/hooks/useCalendarNightStay.js +133 -0
  66. package/dist/src/hooks/useCalendarNightStay.js.map +1 -0
  67. package/dist/src/hooks/useExternalMember.d.ts +6 -0
  68. package/dist/src/hooks/useExternalMember.js +33 -0
  69. package/dist/src/hooks/useExternalMember.js.map +1 -0
  70. package/dist/src/models/Api/HotelDTO.d.ts +2 -1
  71. package/dist/src/models/Api/HotelDTO.js +1 -0
  72. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  73. package/dist/src/translations/Translation.d.ts +15 -2
  74. package/dist/src/translations/Translation.js +18 -5
  75. package/dist/src/translations/Translation.js.map +1 -1
  76. package/dist/src/translations/languages/en-gb.js +15 -2
  77. package/dist/src/translations/languages/en-gb.js.map +1 -1
  78. package/dist/test.bundle.js +1 -1
  79. package/dist/vendors.bundle.js +1 -1
  80. package/package.json +1 -1
  81. package/dist/src/components/steps/room/MemberSignInModal/Big4MemberModal.js.map +0 -1
  82. package/dist/src/hooks/Big4.d.ts +0 -4
  83. package/dist/src/hooks/Big4.js +0 -22
  84. package/dist/src/hooks/Big4.js.map +0 -1
@@ -35,12 +35,14 @@ function FloatingDatePicker(props) {
35
35
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
36
36
  const [startDate, setStartDate] = (0, react_1.useState)(null);
37
37
  const thisElement = (0, react_1.useRef)(null);
38
- const selectedDateChanged = (endDate) => {
38
+ const selectedDateChanged = (endDate, selectionState) => {
39
39
  DataLayer_1.default.instance.sendInteraction('Check Out Date', DataLayer_1.InteractionType.CALENDAR, DataLayer_1.InteractionStep.ROOMS);
40
40
  if (props.selectedDateChanged && startDate) {
41
41
  props.selectedDateChanged(startDate, endDate);
42
42
  }
43
- setIsOpen(false);
43
+ if (endDate) {
44
+ setIsOpen(!!(selectionState === null || selectionState === void 0 ? void 0 : selectionState.validationMinNightStay) || !!(selectionState === null || selectionState === void 0 ? void 0 : selectionState.validationMaxNightStay)); //Close popup after selecting end date
45
+ }
44
46
  };
45
47
  const onStartDateChangedHandler = (date) => {
46
48
  DataLayer_1.default.instance.sendInteraction('Check In Date', DataLayer_1.InteractionType.CALENDAR, DataLayer_1.InteractionStep.ROOMS);
@@ -53,7 +55,7 @@ function FloatingDatePicker(props) {
53
55
  setIsOpen(true);
54
56
  };
55
57
  const inner = (react_1.default.createElement("div", { className: "d-flex align-items-center flex-column" },
56
- react_1.default.createElement(DatePicker_1.default, { showMonthOnLoad: props.startDate, showMultipleMonths: false, supportsMultiSelecting: true, onStartDateChanged: onStartDateChangedHandler, onEndDateChanged: selectedDateChanged, showMinNightStay: true, supportsWeek: false })));
58
+ react_1.default.createElement(DatePicker_1.default, { showMonthOnLoad: props.startDate, showMultipleMonths: false, supportsMultiSelecting: true, onStartDateChanged: onStartDateChangedHandler, onEndDateChanged: selectedDateChanged, showMinNightStay: true, supportsWeek: false, selectedStartDate: props.startDate, selectedEndDate: props.endDate })));
57
59
  return (react_1.default.createElement(react_1.default.Fragment, null,
58
60
  react_1.default.createElement("div", { ref: thisElement, className: props.className, onClick: onOverlayOpen }, props.children),
59
61
  react_1.default.createElement(Overlay_1.Overlay, { open: isOpen, onClose: onOverlayClose, container: (_b = (_a = thisElement.current) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.parentElement, followElement: thisElement.current, className: "floating-roomstay-calendar", isAboveNav: props.isAboveNav }, inner)));
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingDatePicker.js","sourceRoot":"/","sources":["src/components/generic/date/FloatingDatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,+CAAgD;AAEhD,sFAA8D;AAC9D,kEAA+D;AAC/D,8DAA+E;AAa/E,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,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,EACtC,UAAU,EAAE,KAAK,CAAC,UAAU,IAE3B,KAAK,CACA,CACX,CACN,CAAC;AACN,CAAC;AA7DD,qCA6DC","sourcesContent":["import dayjs from 'dayjs';\nimport React, { useRef, useState } from 'react';\n\nimport DatePicker from '@/components/generic/date/DatePicker';\nimport { Overlay } from '@/components/generic/Overlay/Overlay';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\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 isAboveNav?: boolean;\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 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 isAboveNav={props.isAboveNav}\n >\n {inner}\n </Overlay>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"FloatingDatePicker.js","sourceRoot":"/","sources":["src/components/generic/date/FloatingDatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,+CAAgD;AAEhD,sFAA8D;AAC9D,kEAA+D;AAC/D,8DAA+E;AAa/E,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,cAAiG,EAAE,EAAE;QACpJ,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,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;SACjD;QAED,IAAI,OAAO,EAAE;YACT,SAAS,CAAC,CAAC,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,sBAAsB,CAAA,IAAI,CAAC,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,sBAAsB,CAAA,CAAC,CAAC,CAAC,sCAAsC;SAC1I;IACL,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,EACnB,iBAAiB,EAAE,KAAK,CAAC,SAAS,EAClC,eAAe,EAAE,KAAK,CAAC,OAAO,GAChC,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,EACtC,UAAU,EAAE,KAAK,CAAC,UAAU,IAE3B,KAAK,CACA,CACX,CACN,CAAC;AACN,CAAC;AAjED,qCAiEC","sourcesContent":["import dayjs from 'dayjs';\nimport React, { useRef, useState } from 'react';\n\nimport DatePicker from '@/components/generic/date/DatePicker';\nimport { Overlay } from '@/components/generic/Overlay/Overlay';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\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 isAboveNav?: boolean;\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, selectionState?: { validationMinNightStay: number | null; validationMaxNightStay: number | null }) => {\n DataLayer.instance.sendInteraction('Check Out Date', InteractionType.CALENDAR, InteractionStep.ROOMS);\n\n if (props.selectedDateChanged && startDate) {\n props.selectedDateChanged(startDate, endDate);\n }\n\n if (endDate) {\n setIsOpen(!!selectionState?.validationMinNightStay || !!selectionState?.validationMaxNightStay); //Close popup after selecting end date\n }\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 selectedStartDate={props.startDate}\n selectedEndDate={props.endDate}\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 isAboveNav={props.isAboveNav}\n >\n {inner}\n </Overlay>\n </>\n );\n}\n"]}
@@ -32,12 +32,14 @@ const Color_1 = require("../../util/Color");
32
32
  function DaysSelectedInformer() {
33
33
  const dpContext = (0, react_1.useContext)(contexts_1.DatePickerContext);
34
34
  const { t } = (0, react_i18next_1.useTranslation)();
35
- const { startDate, endDate, hoveredMonth: hoveredDate } = dpContext;
35
+ const { startDate, endDate, hoveredMonth: hoveredDate, nightStayRequirements } = dpContext;
36
36
  let daysPicked = 0;
37
37
  const correctEndDate = hoveredDate !== null && hoveredDate !== void 0 ? hoveredDate : endDate;
38
38
  if (startDate && correctEndDate) {
39
39
  daysPicked = correctEndDate.diff(dpContext.startDate, 'day');
40
40
  }
41
+ if (nightStayRequirements.length)
42
+ return react_1.default.createElement(react_1.default.Fragment, null);
41
43
  return (react_1.default.createElement(Text_1.default, { bold: true, color: Color_1.Color.Success, type: Text_1.TextType.Small }, daysPicked > 0 ? (react_1.default.createElement(react_1.default.Fragment, null,
42
44
  t(Translation_1.Translation.Step.Room.RoomInfo.Selected),
43
45
  " ",
@@ -1 +1 @@
1
- {"version":3,"file":"DaysSelectedInformer.js","sourceRoot":"/","sources":["src/components/steps/DaysSelectedInformer.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAuD;AACvD,+CAA0C;AAC1C,iDAA+C;AAE/C,kEAA2D;AAC3D,4DAAyD;AACzD,wCAAqC;AAErC,SAAwB,oBAAoB;IACxC,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,4BAAiB,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IAEpE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,cAAc,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO,CAAC;IAE9C,IAAI,SAAS,IAAI,cAAc,EAAE;QAC7B,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAChE;IAED,OAAO,CACH,8BAAC,cAAI,IAAC,IAAI,QAAC,KAAK,EAAE,aAAK,CAAC,OAAO,EAAE,IAAI,EAAE,eAAQ,CAAC,KAAK,IAChD,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CACd;QACK,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;;QAAG,UAAU;;QAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;cAAI,SAAS,aAAT,SAAS;QAAT,SAAS,CAAE,MAAM,CAAC,OAAO,CAAC;;QAAG,GAAG;QAC5I,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;aAAG,cAAc,aAAd,cAAc;QAAd,cAAc,CAAE,MAAM,CAAC,OAAO,CAAC,CACxE,CACN,CAAC,CAAC,CAAC,CACA,8DAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAI,CACxD,CACE,CACV,CAAC;AACN,CAAC;AAzBD,uCAyBC","sourcesContent":["import { DatePickerContext } from '@frontend/contexts';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport Text, { TextType } from '@/components/generic/Text';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nexport default function DaysSelectedInformer() {\n const dpContext = useContext(DatePickerContext);\n const { t } = useTranslation();\n\n const { startDate, endDate, hoveredMonth: hoveredDate } = dpContext;\n\n let daysPicked = 0;\n const correctEndDate = hoveredDate ?? endDate;\n\n if (startDate && correctEndDate) {\n daysPicked = correctEndDate.diff(dpContext.startDate, 'day');\n }\n\n return (\n <Text bold color={Color.Success} type={TextType.Small}>\n {daysPicked > 0 ? (\n <>\n {t(Translation.Step.Room.RoomInfo.Selected)} {daysPicked} {t(Translation.Misc.Night_plural).toLowerCase()}, {startDate?.format('D MMM')},{' '}\n {t(Translation.Misc.To).toLowerCase()} {correctEndDate?.format('D MMM')}\n </>\n ) : (\n <>{t(Translation.Step.Date.PleaseSelectYourDates)}</>\n )}\n </Text>\n );\n}\n"]}
1
+ {"version":3,"file":"DaysSelectedInformer.js","sourceRoot":"/","sources":["src/components/steps/DaysSelectedInformer.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAuD;AACvD,+CAA0C;AAC1C,iDAA+C;AAE/C,kEAA2D;AAC3D,4DAAyD;AACzD,wCAAqC;AAErC,SAAwB,oBAAoB;IACxC,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,4BAAiB,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAE3F,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,cAAc,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO,CAAC;IAE9C,IAAI,SAAS,IAAI,cAAc,EAAE;QAC7B,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAChE;IAED,IAAI,qBAAqB,CAAC,MAAM;QAAE,OAAO,6DAAK,CAAC;IAE/C,OAAO,CACH,8BAAC,cAAI,IAAC,IAAI,QAAC,KAAK,EAAE,aAAK,CAAC,OAAO,EAAE,IAAI,EAAE,eAAQ,CAAC,KAAK,IAChD,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CACd;QACK,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;;QAAG,UAAU;;QAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;cAAI,SAAS,aAAT,SAAS;QAAT,SAAS,CAAE,MAAM,CAAC,OAAO,CAAC;;QAAG,GAAG;QAC5I,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;aAAG,cAAc,aAAd,cAAc;QAAd,cAAc,CAAE,MAAM,CAAC,OAAO,CAAC,CACxE,CACN,CAAC,CAAC,CAAC,CACA,8DAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAI,CACxD,CACE,CACV,CAAC;AACN,CAAC;AA3BD,uCA2BC","sourcesContent":["import { DatePickerContext } from '@frontend/contexts';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport Text, { TextType } from '@/components/generic/Text';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nexport default function DaysSelectedInformer() {\n const dpContext = useContext(DatePickerContext);\n const { t } = useTranslation();\n\n const { startDate, endDate, hoveredMonth: hoveredDate, nightStayRequirements } = dpContext;\n\n let daysPicked = 0;\n const correctEndDate = hoveredDate ?? endDate;\n\n if (startDate && correctEndDate) {\n daysPicked = correctEndDate.diff(dpContext.startDate, 'day');\n }\n\n if (nightStayRequirements.length) return <></>;\n\n return (\n <Text bold color={Color.Success} type={TextType.Small}>\n {daysPicked > 0 ? (\n <>\n {t(Translation.Step.Room.RoomInfo.Selected)} {daysPicked} {t(Translation.Misc.Night_plural).toLowerCase()}, {startDate?.format('D MMM')},{' '}\n {t(Translation.Misc.To).toLowerCase()} {correctEndDate?.format('D MMM')}\n </>\n ) : (\n <>{t(Translation.Step.Date.PleaseSelectYourDates)}</>\n )}\n </Text>\n );\n}\n"]}
@@ -37,13 +37,17 @@ const BookingAPI_1 = __importDefault(require("../../api/BookingAPI"));
37
37
  const Icon_1 = require("../generic/Icon/Icon");
38
38
  const SmallSpinner_1 = __importDefault(require("../generic/loader/SmallSpinner"));
39
39
  const Pill_1 = __importStar(require("../generic/Pill"));
40
- const Big4_1 = require("../../hooks/Big4");
40
+ const Text_1 = __importStar(require("../generic/Text"));
41
+ const useExternalMember_1 = require("../../hooks/useExternalMember");
42
+ const Color_1 = require("../../util/Color");
41
43
  function MinimumNightStayPill() {
42
44
  var _a;
43
45
  const { hotel } = (0, hooks_1.useCurrentHotel)();
44
46
  const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
47
+ const dpContext = (0, react_1.useContext)(contexts_1.DatePickerContext);
48
+ const { nightStayRequirements } = dpContext;
45
49
  const { t } = (0, react_i18next_1.useTranslation)();
46
- const { memberNumber } = (0, Big4_1.useBig4)();
50
+ const { memberNumber } = (0, useExternalMember_1.useExternalMember)();
47
51
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
48
52
  const [minNights, setMinNights] = (0, react_1.useState)(-1);
49
53
  const [loadIndex, setLoadIndex] = (0, react_1.useState)(0);
@@ -83,7 +87,10 @@ function MinimumNightStayPill() {
83
87
  if (!hotel) {
84
88
  return null;
85
89
  }
86
- return (react_1.default.createElement("div", { className: "u-mh-30" }, isLoading ? (react_1.default.createElement(SmallSpinner_1.default, null)) : minNights !== -1 ? (react_1.default.createElement(Pill_1.default, { type: Pill_1.PillType.Primary, icon: Icon_1.IconType.Info }, t(Translation_1.Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay: minNights }))) : (react_1.default.createElement(react_1.default.Fragment, null))));
90
+ if (nightStayRequirements.length) {
91
+ return (react_1.default.createElement(Text_1.default, { bold: true, color: Color_1.Color.Alert, type: Text_1.TextType.Small }, nightStayRequirements.join(' ')));
92
+ }
93
+ return (react_1.default.createElement("div", null, isLoading ? (react_1.default.createElement(SmallSpinner_1.default, null)) : minNights !== -1 ? (react_1.default.createElement(Pill_1.default, { type: Pill_1.PillType.Primary, icon: Icon_1.IconType.Info }, t(Translation_1.Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay: minNights }))) : (react_1.default.createElement(react_1.default.Fragment, null))));
87
94
  }
88
95
  exports.default = MinimumNightStayPill;
89
96
  //# sourceMappingURL=MinimumNightStayPill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MinimumNightStayPill.js","sourceRoot":"/","sources":["src/components/steps/MinimumNightStayPill.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport { captureException } from '@sentry/browser';\nimport { NoHotelSelectedError } from 'errors/NoHotelSelectedError';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Pill, { PillType } from '@/components/generic/Pill';\nimport { useBig4 } from '@/hooks/Big4';\n\nexport default function MinimumNightStayPill() {\n const { hotel } = useCurrentHotel();\n const basketContext = useContext(BasketContext);\n const { t } = useTranslation();\n const { memberNumber } = useBig4();\n\n const [isLoading, setIsLoading] = useState(false);\n const [minNights, setMinNights] = useState(-1);\n\n const [loadIndex, setLoadIndex] = useState(0);\n\n const selectedBasketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[0];\n\n const startDate = selectedBasketRow?.getStartDate();\n const endDate = selectedBasketRow?.getEndDate();\n\n useEffect(() => {\n if (!hotel) {\n return;\n }\n\n let cancelled = false;\n setLoadIndex((oldLoadIndex) => oldLoadIndex + 1);\n\n if (endDate?.isValid()) {\n setIsLoading(true);\n\n API.Availability.fetchMinNightStayData(selectedBasketRow, hotel.hotelID, memberNumber)\n .then((response) => {\n if (!cancelled) {\n setIsLoading(false);\n if (response.Status === 'MinStay' && endDate?.diff(startDate, 'day') < response.Quantity) {\n setMinNights(response.Quantity);\n } else {\n setMinNights(-1);\n }\n }\n })\n .catch((ex) => {\n if (!(ex instanceof NoHotelSelectedError)) {\n captureException(ex);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [selectedBasketRow, startDate, endDate, memberNumber]);\n\n if (!hotel) {\n return null;\n }\n\n return (\n <div className=\"u-mh-30\">\n {isLoading ? (\n <SmallSpinner />\n ) : minNights !== -1 ? (\n <Pill type={PillType.Primary} icon={IconType.Info}>\n {t(Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay: minNights })}\n </Pill>\n ) : (\n <></>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"MinimumNightStayPill.js","sourceRoot":"/","sources":["src/components/steps/MinimumNightStayPill.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, DatePickerContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport { captureException } from '@sentry/browser';\nimport { NoHotelSelectedError } from 'errors/NoHotelSelectedError';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Pill, { PillType } from '@/components/generic/Pill';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport { Color } from '@/util/Color';\n\nexport default function MinimumNightStayPill() {\n const { hotel } = useCurrentHotel();\n const basketContext = useContext(BasketContext);\n const dpContext = useContext(DatePickerContext);\n const { nightStayRequirements } = dpContext;\n const { t } = useTranslation();\n const { memberNumber } = useExternalMember();\n\n const [isLoading, setIsLoading] = useState(false);\n const [minNights, setMinNights] = useState(-1);\n\n const [loadIndex, setLoadIndex] = useState(0);\n\n const selectedBasketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[0];\n\n const startDate = selectedBasketRow?.getStartDate();\n const endDate = selectedBasketRow?.getEndDate();\n\n useEffect(() => {\n if (!hotel) {\n return;\n }\n\n let cancelled = false;\n setLoadIndex((oldLoadIndex) => oldLoadIndex + 1);\n\n if (endDate?.isValid()) {\n setIsLoading(true);\n\n API.Availability.fetchMinNightStayData(selectedBasketRow, hotel.hotelID, memberNumber)\n .then((response) => {\n if (!cancelled) {\n setIsLoading(false);\n if (response.Status === 'MinStay' && endDate?.diff(startDate, 'day') < response.Quantity) {\n setMinNights(response.Quantity);\n } else {\n setMinNights(-1);\n }\n }\n })\n .catch((ex) => {\n if (!(ex instanceof NoHotelSelectedError)) {\n captureException(ex);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [selectedBasketRow, startDate, endDate, memberNumber]);\n\n if (!hotel) {\n return null;\n }\n\n if (nightStayRequirements.length) {\n return (\n <Text bold color={Color.Alert} type={TextType.Small}>\n {nightStayRequirements.join(' ')}\n </Text>\n );\n }\n\n return (\n <div>\n {isLoading ? (\n <SmallSpinner />\n ) : minNights !== -1 ? (\n <Pill type={PillType.Primary} icon={IconType.Info}>\n {t(Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay: minNights })}\n </Pill>\n ) : (\n <></>\n )}\n </div>\n );\n}\n"]}
@@ -36,7 +36,7 @@ const Currency_1 = __importDefault(require("../../generic/Currency"));
36
36
  const Headline_1 = __importDefault(require("../../generic/Headline"));
37
37
  const Icon_1 = __importStar(require("../../generic/Icon/Icon"));
38
38
  const Text_1 = __importStar(require("../../generic/Text"));
39
- const Big4_1 = require("../../../hooks/Big4");
39
+ const useExternalMember_1 = require("../../../hooks/useExternalMember");
40
40
  const Color_1 = require("../../../util/Color");
41
41
  const TextAlignment_1 = require("../../../util/TextAlignment");
42
42
  function StepDatePricePerRoom(props) {
@@ -45,7 +45,7 @@ function StepDatePricePerRoom(props) {
45
45
  const { hotel } = (0, hooks_1.useCurrentHotel)();
46
46
  const [pricePerRoom, setPricePerRoom] = (0, react_1.useState)(0);
47
47
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
48
- const { memberNumber } = (0, Big4_1.useBig4)();
48
+ const { memberNumber } = (0, useExternalMember_1.useExternalMember)();
49
49
  (0, react_1.useEffect)(() => {
50
50
  var _a;
51
51
  let cancelled = false;
@@ -1 +1 @@
1
- {"version":3,"file":"StepDatePricePerRoom.js","sourceRoot":"/","sources":["src/components/steps/date/StepDatePricePerRoom.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmD;AACnD,2CAAkD;AAClD,+CAAwE;AACxE,iDAA+C;AAC/C,0DAAuD;AAEvD,kEAAmC;AACnC,6EAAqD;AACrD,6EAAqD;AACrD,uEAAgE;AAChE,kEAA2D;AAC3D,uCAAuC;AACvC,wCAAqC;AACrC,wDAAiD;AAMjD,SAAwB,oBAAoB,CAAC,KAAgC;IACzE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAC,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAClD,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,cAAO,GAAE,CAAC;IAEnC,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACX,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,iBAAiB,GAAG,MAAA,aAAa,CAAC,iBAAiB,mCAAI,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzI,IAAI,aAAa,CAAC,OAAO,EAAE;YACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAE5E,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,UAAU,CAAC,GAAG,EAAE;gBACZ,oBAAG,CAAC,YAAY,CAAC,sBAAsB,CACnC,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EACxC,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAiB,EACxB,YAAY,CACf,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;oBACjB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAExC,IAAI,CAAC,SAAS,EAAE;wBACZ,IAAI,eAAe,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAEnH,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE;4BACxB,eAAe,GAAG,CAAC,CAAC;yBACvB;wBAED,eAAe,CAAC,eAAe,CAAC,CAAC;wBACjC,YAAY,CAAC,KAAK,CAAC,CAAC;qBACvB;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,EAAE,GAAG,CAAC,CAAC;SACX;QAED,OAAO,GAAG,EAAE;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;YAEpB,SAAS,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAEhC,OAAO,IAAA,eAAO,EAAC,GAAG,EAAE;QAChB,OAAO,CACH,uCAAK,SAAS,EAAC,8DAA8D;YACzE,8BAAC,cAAI,IAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,yBAAS,CAAC,KAAK,EAAE,SAAS,EAAC,UAAU;gBAChG,wCAAM,KAAK,EAAE,EAAE,KAAK,EAAE,aAAK,CAAC,QAAQ,EAAE;oBACjC,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC;;oBAAE,wCAAM,KAAK,EAAE,EAAE,KAAK,EAAE,aAAK,CAAC,IAAI,EAAE;;wBAAI,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,OAAO,CAAC;4BAAS,CAClG,CACJ;YACN,QAAQ,CAAC,CAAC,CAAC,CACR,wCAAM,SAAS,EAAC,oBAAoB;gBAChC,8BAAC,cAAI,IAAC,IAAI,UACL,SAAS,CAAC,CAAC,CAAC,CACT,uCAAK,SAAS,EAAC,sBAAsB;oBACjC,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,OAAO,GAAI,CAC9B,CACT,CAAC,CAAC,CAAC,CACA,8BAAC,kBAAQ,IAAC,uBAAuB,EAAE,CAAC,IAAG,YAAY,CAAY,CAClE,CACE,CACJ,CACV,CAAC,CAAC,CAAC,CACA,8BAAC,kBAAQ,IAAC,IAAI,QAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,yBAAS,CAAC,KAAK,IAC7C,SAAS,CAAC,CAAC,CAAC,CACT,uCAAK,SAAS,EAAC,sBAAsB;gBACjC,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,OAAO,GAAI,CAC9B,CACT,CAAC,CAAC,CAAC,CACA,8BAAC,kBAAQ,QAAE,YAAY,CAAY,CACtC,CACM,CACd,CACC,CACT,CAAC;IACN,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAClC,CAAC;AA3FD,uCA2FC","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { useBig4 } from '@/hooks/Big4';\nimport { Color } from '@/util/Color';\nimport { TextAlign } from '@/util/TextAlignment';\n\ninterface StepDatePricePerRoomProps {\n isMobile: boolean;\n}\n\nexport default function StepDatePricePerRoom(props: StepDatePricePerRoomProps) {\n const { t } = useTranslation();\n const basketContext = useContext(BasketContext);\n const { hotel } = useCurrentHotel();\n\n const [pricePerRoom, setPricePerRoom] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const { memberNumber } = useBig4();\n\n useEffect(() => {\n let cancelled = false;\n\n const selectedBasketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[basketContext.currentBasketRows.length - 1];\n\n if (basketContext.endDate) {\n const adults = selectedBasketRow ? selectedBasketRow.getAdults() : 0;\n const children = selectedBasketRow ? selectedBasketRow.getChildren() : 0;\n const infants = selectedBasketRow ? selectedBasketRow.getInfants() : 0;\n const promoCode = selectedBasketRow ? selectedBasketRow.getPromoCode() : '';\n\n setIsLoading(true);\n setTimeout(() => {\n API.Availability.getCheapestPricePerDay(\n basketContext.startDate,\n basketContext.endDate.subtract(1, 'day'),\n adults,\n children,\n infants,\n promoCode,\n hotel?.hotelID as string,\n memberNumber\n ).then((dayPrices) => {\n const prices = Object.values(dayPrices);\n\n if (!cancelled) {\n let cheapestFromAPI = prices.length > 0 ? prices.reduce((prev, curr) => (!curr ? prev : Math.min(prev, curr))) : 0;\n\n if (isNaN(cheapestFromAPI)) {\n cheapestFromAPI = 0;\n }\n\n setPricePerRoom(cheapestFromAPI);\n setIsLoading(false);\n }\n });\n }, 250);\n }\n\n return () => {\n setIsLoading(false);\n\n cancelled = true;\n };\n }, [basketContext.endDate, basketContext.selectedBasketRow]);\n\n const isMobile = props.isMobile;\n\n return useMemo(() => {\n return (\n <div className=\"u-flex flex-column justify-content-end align-items-end h-100\">\n <Text type={isMobile ? TextType.Label : TextType.Small} align={TextAlign.Right} className=\"u-nowrap\">\n <span style={{ color: Color.DarkGrey }}>\n {t(Translation.Misc.From)} <span style={{ color: Color.Grey }}>({t(Translation.Misc.PerRoom)})</span>\n </span>\n </Text>\n {isMobile ? (\n <span className=\"u-ellip-w-100-deep\">\n <Text bold>\n {isLoading ? (\n <div className=\"u-inline-flex a-spin\">\n <Icon icon={IconType.Spinner} />\n </div>\n ) : (\n <Currency removeCurrencyAfterChar={6}>{pricePerRoom}</Currency>\n )}\n </Text>\n </span>\n ) : (\n <Headline bold size=\"large\" align={TextAlign.Right}>\n {isLoading ? (\n <div className=\"u-inline-flex a-spin\">\n <Icon icon={IconType.Spinner} />\n </div>\n ) : (\n <Currency>{pricePerRoom}</Currency>\n )}\n </Headline>\n )}\n </div>\n );\n }, [isLoading, pricePerRoom]);\n}\n"]}
1
+ {"version":3,"file":"StepDatePricePerRoom.js","sourceRoot":"/","sources":["src/components/steps/date/StepDatePricePerRoom.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport { Color } from '@/util/Color';\nimport { TextAlign } from '@/util/TextAlignment';\n\ninterface StepDatePricePerRoomProps {\n isMobile: boolean;\n}\n\nexport default function StepDatePricePerRoom(props: StepDatePricePerRoomProps) {\n const { t } = useTranslation();\n const basketContext = useContext(BasketContext);\n const { hotel } = useCurrentHotel();\n\n const [pricePerRoom, setPricePerRoom] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const { memberNumber } = useExternalMember();\n\n useEffect(() => {\n let cancelled = false;\n\n const selectedBasketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[basketContext.currentBasketRows.length - 1];\n\n if (basketContext.endDate) {\n const adults = selectedBasketRow ? selectedBasketRow.getAdults() : 0;\n const children = selectedBasketRow ? selectedBasketRow.getChildren() : 0;\n const infants = selectedBasketRow ? selectedBasketRow.getInfants() : 0;\n const promoCode = selectedBasketRow ? selectedBasketRow.getPromoCode() : '';\n\n setIsLoading(true);\n setTimeout(() => {\n API.Availability.getCheapestPricePerDay(\n basketContext.startDate,\n basketContext.endDate.subtract(1, 'day'),\n adults,\n children,\n infants,\n promoCode,\n hotel?.hotelID as string,\n memberNumber\n ).then((dayPrices) => {\n const prices = Object.values(dayPrices);\n\n if (!cancelled) {\n let cheapestFromAPI = prices.length > 0 ? prices.reduce((prev, curr) => (!curr ? prev : Math.min(prev, curr))) : 0;\n\n if (isNaN(cheapestFromAPI)) {\n cheapestFromAPI = 0;\n }\n\n setPricePerRoom(cheapestFromAPI);\n setIsLoading(false);\n }\n });\n }, 250);\n }\n\n return () => {\n setIsLoading(false);\n\n cancelled = true;\n };\n }, [basketContext.endDate, basketContext.selectedBasketRow]);\n\n const isMobile = props.isMobile;\n\n return useMemo(() => {\n return (\n <div className=\"u-flex flex-column justify-content-end align-items-end h-100\">\n <Text type={isMobile ? TextType.Label : TextType.Small} align={TextAlign.Right} className=\"u-nowrap\">\n <span style={{ color: Color.DarkGrey }}>\n {t(Translation.Misc.From)} <span style={{ color: Color.Grey }}>({t(Translation.Misc.PerRoom)})</span>\n </span>\n </Text>\n {isMobile ? (\n <span className=\"u-ellip-w-100-deep\">\n <Text bold>\n {isLoading ? (\n <div className=\"u-inline-flex a-spin\">\n <Icon icon={IconType.Spinner} />\n </div>\n ) : (\n <Currency removeCurrencyAfterChar={6}>{pricePerRoom}</Currency>\n )}\n </Text>\n </span>\n ) : (\n <Headline bold size=\"large\" align={TextAlign.Right}>\n {isLoading ? (\n <div className=\"u-inline-flex a-spin\">\n <Icon icon={IconType.Spinner} />\n </div>\n ) : (\n <Currency>{pricePerRoom}</Currency>\n )}\n </Headline>\n )}\n </div>\n );\n }, [isLoading, pricePerRoom]);\n}\n"]}
@@ -36,6 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  const contexts_1 = require("../../../contexts/index.js");
39
+ const hooks_1 = require("../../../hooks/index.js");
39
40
  const react_1 = __importStar(require("react"));
40
41
  const react_i18next_1 = require("react-i18next");
41
42
  const Translation_1 = require("translations/Translation");
@@ -44,6 +45,14 @@ const DataLayer_1 = __importStar(require("../../../util/DataLayer"));
44
45
  function StepOneNextStepButton() {
45
46
  const { t } = (0, react_i18next_1.useTranslation)();
46
47
  const context = (0, react_1.useContext)(contexts_1.BasketContext);
48
+ const { getLastValidDay } = (0, hooks_1.useCalendarNightStay)({ basketContext: context });
49
+ const [nightStayValidation, setNightStayValidation] = (0, react_1.useState)({
50
+ init: false,
51
+ arrivalMinNightStay: null,
52
+ arrivalMaxNightStay: null,
53
+ validationMinNightStay: null,
54
+ validationMaxNightStay: null,
55
+ });
47
56
  let label = '';
48
57
  if (!context.startDate) {
49
58
  label = Translation_1.Translation.Step.Date.SelectStartDate;
@@ -68,7 +77,12 @@ function StepOneNextStepButton() {
68
77
  }
69
78
  return true;
70
79
  });
71
- return react_1.default.createElement(NextStepButton_1.default, { text: t(label), disabled: !context.endDate, hideIcon: !context.endDate, onClick: buttonOnClickHandler });
80
+ (0, react_1.useEffect)(() => {
81
+ getLastValidDay(context.startDate, context.endDate).then((result) => {
82
+ setNightStayValidation(result === null || result === void 0 ? void 0 : result.nightStayValidation);
83
+ });
84
+ }, [context.startDate, context.endDate]);
85
+ return (react_1.default.createElement(NextStepButton_1.default, { text: t(label), disabled: !context.endDate || !!nightStayValidation.validationMinNightStay || !!nightStayValidation.validationMaxNightStay, hideIcon: !context.endDate, onClick: buttonOnClickHandler }));
72
86
  }
73
87
  exports.default = StepOneNextStepButton;
74
88
  //# sourceMappingURL=StepOneNextStepButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepOneNextStepButton.js","sourceRoot":"/","sources":["src/components/steps/date/StepOneNextStepButton.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmD;AACnD,+CAA0C;AAC1C,iDAA+C;AAC/C,0DAAuD;AAEvD,iGAAyE;AACzE,8DAA+E;AAE/E,SAAwB,qBAAqB;IACzC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAE1C,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QACpB,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;KACjD;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACzB,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;KACpD;SAAM;QACH,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;KACnD;IAED,MAAM,oBAAoB,GAAG,GAAS,EAAE;;QACpC,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,2BAAe,CAAC,MAAM,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAExG,IAAI,MAAA,OAAO,CAAC,iBAAiB,0CAAE,YAAY,EAAE,EAAE;YAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YAExF,IAAI,gBAAgB,CAAC,MAAM,EAAE;gBACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC7B,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC3D,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;aACN;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAA,CAAC;IAEF,OAAO,8BAAC,wBAAc,IAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,oBAAoB,GAAI,CAAC;AACrI,CAAC;AAjCD,wCAiCC","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport NextStepButton from '@/components/generic/buttons/NextStepButton';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\n\nexport default function StepOneNextStepButton() {\n const { t } = useTranslation();\n\n const context = useContext(BasketContext);\n\n let label = '';\n\n if (!context.startDate) {\n label = Translation.Step.Date.SelectStartDate;\n } else if (!context.endDate) {\n label = Translation.Step.Date.SelectCheckoutDate;\n } else {\n label = Translation.Step.Date.CheckAvailability;\n }\n\n const buttonOnClickHandler = async () => {\n DataLayer.instance.sendInteraction('Check Availability', InteractionType.BUTTON, InteractionStep.DATES);\n\n if (context.selectedBasketRow?.getPromoCode()) {\n const rowsWithoutPromo = context.currentBasketRows.filter((row) => !row.getPromoCode());\n\n if (rowsWithoutPromo.length) {\n rowsWithoutPromo.forEach((row) => {\n row.setPromoCode(context.selectedBasketRow.getPromoCode());\n context.updateBasketRow(row);\n });\n }\n }\n\n return true;\n };\n\n return <NextStepButton text={t(label)} disabled={!context.endDate} hideIcon={!context.endDate} onClick={buttonOnClickHandler} />;\n}\n"]}
1
+ {"version":3,"file":"StepOneNextStepButton.js","sourceRoot":"/","sources":["src/components/steps/date/StepOneNextStepButton.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmD;AACnD,2CAA6E;AAC7E,+CAA+D;AAC/D,iDAA+C;AAC/C,0DAAuD;AAEvD,iGAAyE;AACzE,8DAA+E;AAE/E,SAAwB,qBAAqB;IACzC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAC1C,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,4BAAoB,EAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,IAAA,gBAAQ,EAAuB;QACjF,IAAI,EAAE,KAAK;QACX,mBAAmB,EAAE,IAAI;QACzB,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,IAAI;QAC5B,sBAAsB,EAAE,IAAI;KAC/B,CAAC,CAAC;IACH,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QACpB,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;KACjD;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACzB,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;KACpD;SAAM;QACH,KAAK,GAAG,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;KACnD;IAED,MAAM,oBAAoB,GAAG,GAAS,EAAE;;QACpC,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,2BAAe,CAAC,MAAM,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAExG,IAAI,MAAA,OAAO,CAAC,iBAAiB,0CAAE,YAAY,EAAE,EAAE;YAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YAExF,IAAI,gBAAgB,CAAC,MAAM,EAAE;gBACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC7B,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC3D,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;aACN;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAA,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAChE,sBAAsB,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzC,OAAO,CACH,8BAAC,wBAAc,IACX,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EACd,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,IAAI,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,EAC1H,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAC1B,OAAO,EAAE,oBAAoB,GAC/B,CACL,CAAC;AACN,CAAC;AArDD,wCAqDC","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { INightStayValidation, useCalendarNightStay } from '@frontend/hooks';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport NextStepButton from '@/components/generic/buttons/NextStepButton';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\n\nexport default function StepOneNextStepButton() {\n const { t } = useTranslation();\n\n const context = useContext(BasketContext);\n const { getLastValidDay } = useCalendarNightStay({ basketContext: context });\n const [nightStayValidation, setNightStayValidation] = useState<INightStayValidation>({\n init: false,\n arrivalMinNightStay: null,\n arrivalMaxNightStay: null,\n validationMinNightStay: null,\n validationMaxNightStay: null,\n });\n let label = '';\n\n if (!context.startDate) {\n label = Translation.Step.Date.SelectStartDate;\n } else if (!context.endDate) {\n label = Translation.Step.Date.SelectCheckoutDate;\n } else {\n label = Translation.Step.Date.CheckAvailability;\n }\n\n const buttonOnClickHandler = async () => {\n DataLayer.instance.sendInteraction('Check Availability', InteractionType.BUTTON, InteractionStep.DATES);\n\n if (context.selectedBasketRow?.getPromoCode()) {\n const rowsWithoutPromo = context.currentBasketRows.filter((row) => !row.getPromoCode());\n\n if (rowsWithoutPromo.length) {\n rowsWithoutPromo.forEach((row) => {\n row.setPromoCode(context.selectedBasketRow.getPromoCode());\n context.updateBasketRow(row);\n });\n }\n }\n\n return true;\n };\n\n useEffect(() => {\n getLastValidDay(context.startDate, context.endDate).then((result) => {\n setNightStayValidation(result?.nightStayValidation);\n });\n }, [context.startDate, context.endDate]);\n\n return (\n <NextStepButton\n text={t(label)}\n disabled={!context.endDate || !!nightStayValidation.validationMinNightStay || !!nightStayValidation.validationMaxNightStay}\n hideIcon={!context.endDate}\n onClick={buttonOnClickHandler}\n />\n );\n}\n"]}
@@ -49,14 +49,14 @@ const SimpleModal_1 = __importDefault(require("../../generic/modal/SimpleModal")
49
49
  const Text_1 = __importStar(require("../../generic/Text"));
50
50
  const ImageGallerySlider_1 = __importDefault(require("./ImageGallerySlider"));
51
51
  const LargeRoomCard_1 = __importDefault(require("./LargeRoomCard"));
52
- const Big4_1 = require("../../../hooks/Big4");
52
+ const useExternalMember_1 = require("../../../hooks/useExternalMember");
53
53
  const RoomUpsellFeature_1 = __importDefault(require("../../../providers/feature/RoomUpsellFeature"));
54
54
  const Color_1 = require("../../../util/Color");
55
55
  const DataLayer_1 = __importDefault(require("../../../util/DataLayer"));
56
56
  const AvailableUpgradesModal = () => {
57
57
  const { t } = (0, react_i18next_1.useTranslation)();
58
58
  const { hotel } = (0, hooks_1.useCurrentHotel)();
59
- const { memberNumber } = (0, Big4_1.useBig4)();
59
+ const { memberNumber } = (0, useExternalMember_1.useExternalMember)();
60
60
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
61
61
  const [row, setRow] = (0, react_1.useState)(null);
62
62
  const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
@@ -1 +1 @@
1
- {"version":3,"file":"AvailableUpgradesModal.js","sourceRoot":"/","sources":["src/components/steps/room/AvailableUpgradesModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { AddToCartEvent } from '@frontend/events';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport React, { FC, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport SimpleModal from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport LargeRoomCard from '@/components/steps/room/LargeRoomCard';\nimport { useBig4 } from '@/hooks/Big4';\nimport BasketRow from '@/models/BasketRow';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomUpsellFeature from '@/providers/feature/RoomUpsellFeature';\nimport { Color } from '@/util/Color';\nimport DataLayer from '@/util/DataLayer';\n\nconst AvailableUpgradesModal: FC = () => {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useBig4();\n const [isOpen, setIsOpen] = useState(false);\n const [row, setRow] = useState<BasketRow | null>(null);\n\n const basketContext = useContext(BasketContext);\n\n const { on } = useEvent();\n\n const room = row?.getRoom();\n const selectedRate = row?.getRate();\n\n const [rates, setRates] = useState<RoomRate[]>();\n\n useEffect(() => {\n let cancelled = false;\n\n on(AddToCartEvent, async (event: AddToCartEvent): Promise<void | boolean> => {\n if (cancelled) return;\n\n setRow(event.basketRow);\n return true;\n });\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n\n if (row) {\n API.Availability.fetchAvailabilityData(row, hotel?.hotelID as string, memberNumber).then((availableRooms) => {\n if (cancelled) return;\n\n const unfilteredRates: RoomRate[] = [];\n availableRooms\n ?.map((availableRoom) => {\n return availableRoom.getRates();\n })\n .forEach((fewRates) => {\n fewRates.forEach((oneRate) => {\n unfilteredRates.push(oneRate);\n });\n });\n const filteredRates = unfilteredRates\n .filter((rate) => {\n return rate.getAveragePrice() > (selectedRate?.getAveragePrice() as number) && rate.name === selectedRate?.name;\n })\n .sort((a: RoomRate, b: RoomRate) => {\n if (a.getAveragePrice() === selectedRate?.getAveragePrice()) return 1;\n if (b.getAveragePrice() === selectedRate?.getAveragePrice()) return -1;\n return a.getAveragePrice() - b.getAveragePrice();\n })\n .slice(0, 3);\n\n setRates(filteredRates);\n if (filteredRates.length === 0 && selectedRate) {\n // Proceed as if user clicked the nav.\n confirmRateOnClick();\n } else {\n setIsOpen(true);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [row, memberNumber]);\n\n const closeModal = () => {\n setIsOpen(false);\n setRow(null);\n };\n\n const confirmRateOnClick = (rate?: RoomRate) => {\n if (row) {\n if (rate) {\n DataLayer.instance.sendUpsellConfirmed(row.getRate() as RoomRate, rate);\n\n row.setRate(rate);\n basketContext.updateBasketRow(row);\n closeModal();\n } else {\n DataLayer.instance.sendUpsellCancelled(row.getRate() as RoomRate);\n closeModal();\n }\n }\n };\n\n return RoomUpsellFeature.isActive() ? (\n <SimpleModal open={isOpen} onClose={closeModal} title={t(Translation.Step.Room.AvailableUpgrades)}>\n <div className=\"upgrades-room-modal\">\n <div className=\"current-room-block container\">\n <div className=\"u-flex u-flex-flex-start row\">\n <div className=\"image-wrapper col-md-3 col-12\">\n <ImageGallerySlider images={room?.getImages() || []} />\n </div>\n <div className=\"u-flex info-block col-md-7 col-sm-9\">\n <div>\n <Text color={Color.DarkGrey} bold>\n {t(Translation.Step.Room.CurrentSelectedRoom)}\n </Text>\n <Headline bold>{room?.name}</Headline>\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {selectedRate?.name}\n </Text>\n </div>\n <div>\n <div className=\"room-details--content-price flex-row\">\n <Headline bold>\n <Currency hideDecimals>{selectedRate?.getAveragePrice()}</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 {t(Translation.Step.Room.RoomInfo.IncludesTaxes)}\n </Text>\n </div>\n </div>\n </div>\n <div className=\"u-flex u-flex-align-center col-md-2 col-sm-3\">\n <BEButton wide filled primary onClick={() => confirmRateOnClick()}>\n {t(Translation.Step.Room.Confirm)}\n </BEButton>\n </div>\n </div>\n </div>\n <div className=\"container\" style={{ backgroundColor: Color.Snow }}>\n <div className=\"u-pad-top u-marg-bottom\">\n <div className=\"u-marg-bottom--heavy\">\n <Headline bold>{t(Translation.Step.Room.CheckOutOtherOptions)}</Headline>\n </div>\n <div className=\"row no-gutters\">\n {rates?.map((rate) => {\n const onSelectRate = () => {\n confirmRateOnClick(rate);\n };\n\n return (\n <div className=\"col-md-6 col-xl-4 u-marg-bottom u-pad-left--light u-pad-right--light\" key={rate.getRoom().name}>\n <LargeRoomCard selectedRate={selectedRate as RoomRate} rate={rate} onSelectRate={onSelectRate} />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </SimpleModal>\n ) : null;\n};\n\nexport default AvailableUpgradesModal;\n"]}
1
+ {"version":3,"file":"AvailableUpgradesModal.js","sourceRoot":"/","sources":["src/components/steps/room/AvailableUpgradesModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { AddToCartEvent } from '@frontend/events';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport React, { FC, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport SimpleModal from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport LargeRoomCard from '@/components/steps/room/LargeRoomCard';\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport BasketRow from '@/models/BasketRow';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomUpsellFeature from '@/providers/feature/RoomUpsellFeature';\nimport { Color } from '@/util/Color';\nimport DataLayer from '@/util/DataLayer';\n\nconst AvailableUpgradesModal: FC = () => {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useExternalMember();\n const [isOpen, setIsOpen] = useState(false);\n const [row, setRow] = useState<BasketRow | null>(null);\n\n const basketContext = useContext(BasketContext);\n\n const { on } = useEvent();\n\n const room = row?.getRoom();\n const selectedRate = row?.getRate();\n\n const [rates, setRates] = useState<RoomRate[]>();\n\n useEffect(() => {\n let cancelled = false;\n\n on(AddToCartEvent, async (event: AddToCartEvent): Promise<void | boolean> => {\n if (cancelled) return;\n\n setRow(event.basketRow);\n return true;\n });\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n\n if (row) {\n API.Availability.fetchAvailabilityData(row, hotel?.hotelID as string, memberNumber).then((availableRooms) => {\n if (cancelled) return;\n\n const unfilteredRates: RoomRate[] = [];\n availableRooms\n ?.map((availableRoom) => {\n return availableRoom.getRates();\n })\n .forEach((fewRates) => {\n fewRates.forEach((oneRate) => {\n unfilteredRates.push(oneRate);\n });\n });\n const filteredRates = unfilteredRates\n .filter((rate) => {\n return rate.getAveragePrice() > (selectedRate?.getAveragePrice() as number) && rate.name === selectedRate?.name;\n })\n .sort((a: RoomRate, b: RoomRate) => {\n if (a.getAveragePrice() === selectedRate?.getAveragePrice()) return 1;\n if (b.getAveragePrice() === selectedRate?.getAveragePrice()) return -1;\n return a.getAveragePrice() - b.getAveragePrice();\n })\n .slice(0, 3);\n\n setRates(filteredRates);\n if (filteredRates.length === 0 && selectedRate) {\n // Proceed as if user clicked the nav.\n confirmRateOnClick();\n } else {\n setIsOpen(true);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [row, memberNumber]);\n\n const closeModal = () => {\n setIsOpen(false);\n setRow(null);\n };\n\n const confirmRateOnClick = (rate?: RoomRate) => {\n if (row) {\n if (rate) {\n DataLayer.instance.sendUpsellConfirmed(row.getRate() as RoomRate, rate);\n\n row.setRate(rate);\n basketContext.updateBasketRow(row);\n closeModal();\n } else {\n DataLayer.instance.sendUpsellCancelled(row.getRate() as RoomRate);\n closeModal();\n }\n }\n };\n\n return RoomUpsellFeature.isActive() ? (\n <SimpleModal open={isOpen} onClose={closeModal} title={t(Translation.Step.Room.AvailableUpgrades)}>\n <div className=\"upgrades-room-modal\">\n <div className=\"current-room-block container\">\n <div className=\"u-flex u-flex-flex-start row\">\n <div className=\"image-wrapper col-md-3 col-12\">\n <ImageGallerySlider images={room?.getImages() || []} />\n </div>\n <div className=\"u-flex info-block col-md-7 col-sm-9\">\n <div>\n <Text color={Color.DarkGrey} bold>\n {t(Translation.Step.Room.CurrentSelectedRoom)}\n </Text>\n <Headline bold>{room?.name}</Headline>\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {selectedRate?.name}\n </Text>\n </div>\n <div>\n <div className=\"room-details--content-price flex-row\">\n <Headline bold>\n <Currency hideDecimals>{selectedRate?.getAveragePrice()}</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 {t(Translation.Step.Room.RoomInfo.IncludesTaxes)}\n </Text>\n </div>\n </div>\n </div>\n <div className=\"u-flex u-flex-align-center col-md-2 col-sm-3\">\n <BEButton wide filled primary onClick={() => confirmRateOnClick()}>\n {t(Translation.Step.Room.Confirm)}\n </BEButton>\n </div>\n </div>\n </div>\n <div className=\"container\" style={{ backgroundColor: Color.Snow }}>\n <div className=\"u-pad-top u-marg-bottom\">\n <div className=\"u-marg-bottom--heavy\">\n <Headline bold>{t(Translation.Step.Room.CheckOutOtherOptions)}</Headline>\n </div>\n <div className=\"row no-gutters\">\n {rates?.map((rate) => {\n const onSelectRate = () => {\n confirmRateOnClick(rate);\n };\n\n return (\n <div className=\"col-md-6 col-xl-4 u-marg-bottom u-pad-left--light u-pad-right--light\" key={rate.getRoom().name}>\n <LargeRoomCard selectedRate={selectedRate as RoomRate} rate={rate} onSelectRate={onSelectRate} />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </SimpleModal>\n ) : null;\n};\n\nexport default AvailableUpgradesModal;\n"]}
@@ -3,5 +3,5 @@ interface Big4MemberModalProps {
3
3
  isOpen: boolean;
4
4
  onClose: () => void;
5
5
  }
6
- declare const Big4MemberModal: FC<Big4MemberModalProps>;
7
- export default Big4MemberModal;
6
+ declare const ExternalMemberModal: FC<Big4MemberModalProps>;
7
+ export default ExternalMemberModal;
@@ -48,15 +48,18 @@ const Text_1 = __importDefault(require("../../../generic/Text"));
48
48
  const TextBox_1 = __importDefault(require("../../../generic/TextBox"));
49
49
  const contexts_1 = require("../../../../contexts");
50
50
  const hooks_1 = require("../../../../hooks");
51
+ const useExternalMember_1 = require("../../../../hooks/useExternalMember");
52
+ const HotelDTO_1 = require("../../../../models/Api/HotelDTO");
51
53
  const RoomstayThemeEngine_1 = __importDefault(require("../../../../providers/RoomstayThemeEngine"));
52
54
  const Translation_1 = require("../../../../translations/Translation");
53
55
  const Color_1 = require("../../../../util/Color");
54
56
  const Big4MemberModal_module_scss_1 = __importDefault(require("./Big4MemberModal.module.scss"));
55
- const Big4MemberModal = ({ isOpen, onClose }) => {
57
+ const ExternalMemberModal = ({ isOpen, onClose }) => {
56
58
  const { hotel } = (0, hooks_1.useCurrentHotel)();
57
59
  const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
58
60
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
59
61
  const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
62
+ const { externalMemberType } = (0, useExternalMember_1.useExternalMember)();
60
63
  const { register, formState: { errors }, handleSubmit, } = (0, react_hook_form_1.useForm)({
61
64
  mode: 'onChange',
62
65
  });
@@ -89,20 +92,29 @@ const Big4MemberModal = ({ isOpen, onClose }) => {
89
92
  }
90
93
  });
91
94
  const { t } = (0, react_i18next_1.useTranslation)();
95
+ const { title, image } = (() => {
96
+ switch (externalMemberType) {
97
+ default:
98
+ case HotelDTO_1.EIntegration.Big4:
99
+ return { title: t(Translation_1.Translation.ExternalMemberPopup.Big4Title), image: 'big4-login.svg' };
100
+ case HotelDTO_1.EIntegration.Top10:
101
+ return { title: t(Translation_1.Translation.ExternalMemberPopup.Top10Title), image: 'top10-login.jpeg' };
102
+ }
103
+ })();
92
104
  return (react_1.default.createElement(SimpleModal_1.default, { open: isOpen, onClose: onClose, size: SimpleModal_1.SimpleModalSize.Normal, alignCenter: true, bodyClassName: Big4MemberModal_module_scss_1.default.root },
93
105
  react_1.default.createElement("div", { className: Big4MemberModal_module_scss_1.default.container },
94
106
  react_1.default.createElement("div", { className: Big4MemberModal_module_scss_1.default.logoSection },
95
- react_1.default.createElement("img", { className: Big4MemberModal_module_scss_1.default.img, src: RoomstayThemeEngine_1.default.getImageAssetUrl('big4-login.svg'), alt: "Big4 Logo" })),
107
+ react_1.default.createElement("img", { className: Big4MemberModal_module_scss_1.default.img, src: RoomstayThemeEngine_1.default.getImageAssetUrl(image), alt: `${externalMemberType} Logo` })),
96
108
  react_1.default.createElement("div", null,
97
109
  react_1.default.createElement("form", { onSubmit: handleSubmit(onSubmit) },
98
- react_1.default.createElement(Headline_1.default, { bold: true, color: modalPrimaryColor }, t(Translation_1.Translation.Big4Popup.Title)),
110
+ react_1.default.createElement(Headline_1.default, { bold: true, color: modalPrimaryColor }, title),
99
111
  react_1.default.createElement("div", { className: "u-marg-top" },
100
112
  react_1.default.createElement(InputGroup_1.default, { dimensions: "1" },
101
113
  react_1.default.createElement(TextBox_1.default, Object.assign({ iconProps: {
102
114
  color: Color_1.Color.DarkGrey,
103
115
  }, icon: Icon_1.IconType.Star, inputProps: {
104
116
  disabled: isLoading,
105
- }, wide: true, placeholder: t(Translation_1.Translation.Big4Popup.Fields.MemberNumber), required: true, validationStatus: getValidationClass('memberNumber') }, register('memberNumber', {
117
+ }, wide: true, placeholder: t(Translation_1.Translation.ExternalMemberPopup.Fields.MemberNumber), required: true, validationStatus: getValidationClass('memberNumber') }, register('memberNumber', {
106
118
  required: true,
107
119
  pattern: {
108
120
  value: /^[0-9]*$/,
@@ -115,12 +127,12 @@ const Big4MemberModal = ({ isOpen, onClose }) => {
115
127
  color: Color_1.Color.DarkGrey,
116
128
  }, icon: Icon_1.IconType.Person, inputProps: {
117
129
  disabled: isLoading,
118
- }, wide: true, placeholder: t(Translation_1.Translation.Big4Popup.Fields.FamilyName), required: true, validationStatus: getValidationClass('familyName') }, register('familyName', {
130
+ }, wide: true, placeholder: t(Translation_1.Translation.ExternalMemberPopup.Fields.FamilyName), required: true, validationStatus: getValidationClass('familyName') }, register('familyName', {
119
131
  required: true,
120
132
  })))))),
121
- react_1.default.createElement(BEButton_1.default, { isLoading: isLoading, htmlType: "submit", className: "u-marg-top", size: "normal", filled: true, primary: hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor, success: !(hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor), stopIconAnimation: true, icon: Icon_1.IconType.ArrowRight, iconPosition: "right" }, t(Translation_1.Translation.Big4Popup.Submit)),
133
+ react_1.default.createElement(BEButton_1.default, { isLoading: isLoading, htmlType: "submit", className: "u-marg-top", size: "normal", filled: true, primary: hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor, success: !(hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyModalUsePrimaryColor), stopIconAnimation: true, icon: Icon_1.IconType.ArrowRight, iconPosition: "right" }, t(Translation_1.Translation.ExternalMemberPopup.Submit)),
122
134
  react_1.default.createElement("div", { className: "u-marg-top" },
123
135
  react_1.default.createElement(Text_1.default, { bold: true, color: Color_1.Color.Danger }, errorMessage)))))));
124
136
  };
125
- exports.default = Big4MemberModal;
126
- //# sourceMappingURL=Big4MemberModal.js.map
137
+ exports.default = ExternalMemberModal;
138
+ //# sourceMappingURL=ExternalMemberModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExternalMemberModal.js","sourceRoot":"/","sources":["src/components/steps/room/MemberSignInModal/ExternalMemberModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { FC, useContext, useState } from 'react';\nimport { SubmitHandler, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport InputGroup from '@/components/generic/InputGroup/InputGroup';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text from '@/components/generic/Text';\nimport TextBox from '@/components/generic/TextBox';\nimport { CompanyContext } from '@/contexts';\nimport { useCurrentHotel } from '@/hooks';\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport { EIntegration } from '@/models/Api/HotelDTO';\nimport RoomstayThemeEngine from '@/providers/RoomstayThemeEngine';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nimport styles from './Big4MemberModal.module.scss';\n\ninterface Big4MemberModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface Big4MemberFormValues {\n memberNumber: string;\n familyName: string;\n}\n\nconst ExternalMemberModal: FC<Big4MemberModalProps> = ({ isOpen, onClose }) => {\n const { hotel } = useCurrentHotel();\n const ccx = useContext(CompanyContext);\n const [isLoading, setIsLoading] = useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n const { externalMemberType } = useExternalMember();\n\n const {\n register,\n formState: { errors },\n handleSubmit,\n } = useForm<Big4MemberFormValues>({\n mode: 'onChange',\n });\n\n const modalPrimaryColor = hotel?.memberOnlyModalUsePrimaryColor ? Color.Accent : Color.Success;\n const getValidationClass = (name: keyof Big4MemberFormValues) => {\n if (errors) {\n if (errors[name]) {\n return 'error';\n } else {\n return 'success';\n }\n }\n };\n const onSubmit: SubmitHandler<Big4MemberFormValues> = async ({ familyName, memberNumber }) => {\n setIsLoading(true);\n setErrorMessage('');\n try {\n const number = await API.Member.signInBig4Member(memberNumber, familyName, hotel?.hotelID as string);\n localStorage.setItem('hotel' + hotel?.hotelID + 'isFromBig4', number.memberId);\n ccx.signUserIn(number.memberId.toString(), true);\n } catch (e: any) {\n if (e.Message) {\n setErrorMessage(e.Message);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const { t } = useTranslation();\n\n const { title, image } = (() => {\n switch (externalMemberType) {\n default:\n case EIntegration.Big4:\n return { title: t(Translation.ExternalMemberPopup.Big4Title), image: 'big4-login.svg' };\n case EIntegration.Top10:\n return { title: t(Translation.ExternalMemberPopup.Top10Title), image: 'top10-login.jpeg' };\n }\n })();\n\n return (\n <SimpleModal open={isOpen} onClose={onClose} size={SimpleModalSize.Normal} alignCenter bodyClassName={styles.root}>\n <div className={styles.container}>\n <div className={styles.logoSection}>\n <img className={styles.img} src={RoomstayThemeEngine.getImageAssetUrl(image)} alt={`${externalMemberType} Logo`} />\n </div>\n <div>\n <form onSubmit={handleSubmit(onSubmit)}>\n <Headline bold color={modalPrimaryColor}>\n {title}\n </Headline>\n <div className=\"u-marg-top\">\n <InputGroup dimensions=\"1\">\n <TextBox\n iconProps={{\n color: Color.DarkGrey,\n }}\n icon={IconType.Star}\n inputProps={{\n disabled: isLoading,\n }}\n wide\n placeholder={t(Translation.ExternalMemberPopup.Fields.MemberNumber)}\n required\n validationStatus={getValidationClass('memberNumber')}\n {...register('memberNumber', {\n required: true,\n pattern: {\n value: /^[0-9]*$/,\n message: 'Please enter a valid member number',\n },\n })}\n />\n </InputGroup>\n <div className=\"u-marg-top--light\">\n <InputGroup dimensions=\"1\">\n <TextBox\n iconProps={{\n color: Color.DarkGrey,\n }}\n icon={IconType.Person}\n inputProps={{\n disabled: isLoading,\n }}\n wide\n placeholder={t(Translation.ExternalMemberPopup.Fields.FamilyName)}\n required\n validationStatus={getValidationClass('familyName')}\n {...register('familyName', {\n required: true,\n })}\n />\n </InputGroup>\n </div>\n </div>\n <BEButton\n isLoading={isLoading}\n htmlType=\"submit\"\n className=\"u-marg-top\"\n size=\"normal\"\n filled\n primary={hotel?.memberOnlyModalUsePrimaryColor}\n success={!hotel?.memberOnlyModalUsePrimaryColor}\n stopIconAnimation\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n >\n {t(Translation.ExternalMemberPopup.Submit)}\n </BEButton>\n <div className=\"u-marg-top\">\n <Text bold color={Color.Danger}>\n {errorMessage}\n </Text>\n </div>\n </form>\n </div>\n </div>\n </SimpleModal>\n );\n};\n\nexport default ExternalMemberModal;\n"]}
@@ -40,7 +40,7 @@ const Headline_1 = __importDefault(require("../../generic/Headline"));
40
40
  const Icon_1 = require("../../generic/Icon/Icon");
41
41
  const SmallSpinner_1 = __importDefault(require("../../generic/loader/SmallSpinner"));
42
42
  const Text_1 = __importStar(require("../../generic/Text"));
43
- const Big4_1 = require("../../../hooks/Big4");
43
+ const useExternalMember_1 = require("../../../hooks/useExternalMember");
44
44
  const CurrentHotelHook_1 = require("../../../hooks/CurrentHotelHook");
45
45
  const DIProvider_1 = require("../../../providers/DIProvider");
46
46
  const Color_1 = require("../../../util/Color");
@@ -48,7 +48,7 @@ const StepManager_1 = __importDefault(require("../../../util/StepManager"));
48
48
  const TravelerNotfound_1 = __importDefault(require("../../generic/TravelerNotfound"));
49
49
  function OriginalNoRoomsFoundBlock() {
50
50
  const { hotel } = (0, CurrentHotelHook_1.useCurrentHotel)();
51
- const { memberNumber } = (0, Big4_1.useBig4)();
51
+ const { memberNumber } = (0, useExternalMember_1.useExternalMember)();
52
52
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
53
53
  const [minNightStay, setMinNightStay] = (0, react_1.useState)(-1);
54
54
  const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
@@ -1 +1 @@
1
- {"version":3,"file":"NoRoomsFoundBlock.js","sourceRoot":"/","sources":["src/components/steps/room/NoRoomsFoundBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom';\nimport { Translation } from 'translations/Translation';\n\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\nimport API from '@/api/BookingAPI';\nimport Alert, { AlertType } from '@/components/generic/Alert';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { useBig4 } from '@/hooks/Big4';\nimport { useCurrentHotel } from '@/hooks/CurrentHotelHook';\nimport { withDI } from '@/providers/DIProvider';\nimport { Color } from '@/util/Color';\nimport StepManager from '@/util/StepManager';\n\nimport TravelerNotfound from '../../generic/TravelerNotfound';\n\nfunction OriginalNoRoomsFoundBlock() {\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useBig4();\n\n const [isLoading, setIsLoading] = useState(false);\n const [minNightStay, setMinNightStay] = useState(-1);\n\n const basketContext = useContext(BasketContext);\n const { t } = useTranslation();\n\n useEffect(() => {\n let cancelled = false;\n\n const basketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[0];\n if (!basketRow || !hotel) {\n return;\n }\n\n setIsLoading(true);\n\n API.Availability.fetchMinNightStayData(basketRow, hotel?.hotelID, memberNumber).then((response) => {\n if (!cancelled) {\n setIsLoading(false);\n\n if (response.Status === 'MinStay') {\n if (basketRow.getNumberOfDays() < response.Quantity) setMinNightStay(response.Quantity);\n } else {\n setMinNightStay(-1);\n }\n }\n });\n\n return () => {\n cancelled = true;\n\n setIsLoading(false);\n };\n }, []);\n\n return (\n <div className=\"u-align-center\">\n {isLoading && <SmallSpinner />}\n <AutoAutoHeight open={minNightStay !== -1}>\n <Alert type={AlertType.Accent1} icon={IconType.Error}>\n <Text type={TextType.Small}>\n {t(Translation.Step.Room.MinimumStay, {\n minNightStay,\n })}\n </Text>\n </Alert>\n </AutoAutoHeight>\n <div className=\"u-marg-bottom--heavy\">\n {/*BLANK SLATE IMAGE*/}\n <TravelerNotfound />\n </div>\n <div className=\"u-marg-bottom\">\n <Headline size=\"large\" bold>\n {t(Translation.Step.Room.NoRoomsFound.NoRoomsFound)}\n </Headline>\n </div>\n <div>\n {isLoading ? <SmallSpinner /> : minNightStay !== -1 && <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay })}</Text>}\n </div>\n {minNightStay === -1 && <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.WeApologise)}</Text>}\n <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.PleaseCheckYourDates)}</Text>\n <div className=\"u-marg-top\">\n <Link to={StepManager.getFirstStep().getStepUrl()}>\n <BEButton filled>{t(Translation.Step.Room.NoRoomsFound.NewSearch)}</BEButton>\n </Link>\n </div>\n </div>\n );\n}\n\nexport const BE_NO_ROOMS_FOUND_BLOCK = 'BENoRoomsFoundBlock';\n\nexport default function NoRoomsFoundBlock() {\n return withDI(BE_NO_ROOMS_FOUND_BLOCK, OriginalNoRoomsFoundBlock, null);\n}\n"]}
1
+ {"version":3,"file":"NoRoomsFoundBlock.js","sourceRoot":"/","sources":["src/components/steps/room/NoRoomsFoundBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom';\nimport { Translation } from 'translations/Translation';\n\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\nimport API from '@/api/BookingAPI';\nimport Alert, { AlertType } from '@/components/generic/Alert';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { useExternalMember } from '@/hooks/useExternalMember';\nimport { useCurrentHotel } from '@/hooks/CurrentHotelHook';\nimport { withDI } from '@/providers/DIProvider';\nimport { Color } from '@/util/Color';\nimport StepManager from '@/util/StepManager';\n\nimport TravelerNotfound from '../../generic/TravelerNotfound';\n\nfunction OriginalNoRoomsFoundBlock() {\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useExternalMember();\n\n const [isLoading, setIsLoading] = useState(false);\n const [minNightStay, setMinNightStay] = useState(-1);\n\n const basketContext = useContext(BasketContext);\n const { t } = useTranslation();\n\n useEffect(() => {\n let cancelled = false;\n\n const basketRow = basketContext.selectedBasketRow ?? basketContext.currentBasketRows[0];\n if (!basketRow || !hotel) {\n return;\n }\n\n setIsLoading(true);\n\n API.Availability.fetchMinNightStayData(basketRow, hotel?.hotelID, memberNumber).then((response) => {\n if (!cancelled) {\n setIsLoading(false);\n\n if (response.Status === 'MinStay') {\n if (basketRow.getNumberOfDays() < response.Quantity) setMinNightStay(response.Quantity);\n } else {\n setMinNightStay(-1);\n }\n }\n });\n\n return () => {\n cancelled = true;\n\n setIsLoading(false);\n };\n }, []);\n\n return (\n <div className=\"u-align-center\">\n {isLoading && <SmallSpinner />}\n <AutoAutoHeight open={minNightStay !== -1}>\n <Alert type={AlertType.Accent1} icon={IconType.Error}>\n <Text type={TextType.Small}>\n {t(Translation.Step.Room.MinimumStay, {\n minNightStay,\n })}\n </Text>\n </Alert>\n </AutoAutoHeight>\n <div className=\"u-marg-bottom--heavy\">\n {/*BLANK SLATE IMAGE*/}\n <TravelerNotfound />\n </div>\n <div className=\"u-marg-bottom\">\n <Headline size=\"large\" bold>\n {t(Translation.Step.Room.NoRoomsFound.NoRoomsFound)}\n </Headline>\n </div>\n <div>\n {isLoading ? <SmallSpinner /> : minNightStay !== -1 && <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.MinNightStay, { minNightStay })}</Text>}\n </div>\n {minNightStay === -1 && <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.WeApologise)}</Text>}\n <Text color={Color.DarkGrey}>{t(Translation.Step.Room.NoRoomsFound.PleaseCheckYourDates)}</Text>\n <div className=\"u-marg-top\">\n <Link to={StepManager.getFirstStep().getStepUrl()}>\n <BEButton filled>{t(Translation.Step.Room.NoRoomsFound.NewSearch)}</BEButton>\n </Link>\n </div>\n </div>\n );\n}\n\nexport const BE_NO_ROOMS_FOUND_BLOCK = 'BENoRoomsFoundBlock';\n\nexport default function NoRoomsFoundBlock() {\n return withDI(BE_NO_ROOMS_FOUND_BLOCK, OriginalNoRoomsFoundBlock, null);\n}\n"]}
@@ -37,7 +37,7 @@ const Headline_1 = __importDefault(require("../../generic/Headline"));
37
37
  const Icon_1 = __importStar(require("../../generic/Icon/Icon"));
38
38
  const SmallSpinner_1 = __importDefault(require("../../generic/loader/SmallSpinner"));
39
39
  const Text_1 = __importStar(require("../../generic/Text"));
40
- const Big4_1 = require("../../../hooks/Big4");
40
+ const useExternalMember_1 = require("../../../hooks/useExternalMember");
41
41
  const ImageProvider_1 = __importStar(require("../../../providers/ImageProvider"));
42
42
  const Color_1 = require("../../../util/Color");
43
43
  const ScreenSize_1 = __importDefault(require("../../../util/ScreenSize"));
@@ -53,7 +53,7 @@ function RoomListCrossSellBlock(props) {
53
53
  const [description, setDescription] = (0, react_1.useState)('');
54
54
  const [link, setLink] = (0, react_1.useState)('');
55
55
  const [rooms, setRooms] = (0, react_1.useState)([]);
56
- const { memberNumber } = (0, Big4_1.useBig4)();
56
+ const { memberNumber } = (0, useExternalMember_1.useExternalMember)();
57
57
  (0, react_1.useEffect)(() => {
58
58
  const row = basketContext.selectedBasketRow;
59
59
  if (!row) {