@roomstay/frontend 2.9.0 → 2.9.1-1

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 (105) hide show
  1. package/dist/177.bundle.js +1 -1
  2. package/dist/219.bundle.js +2 -0
  3. package/dist/288.bundle.js +1 -1
  4. package/dist/291.bundle.js +1 -0
  5. package/dist/446.bundle.js +1 -1
  6. package/dist/537.bundle.js +1 -1
  7. package/dist/596.bundle.js +1 -1
  8. package/dist/625.bundle.js +1 -1
  9. package/dist/836.bundle.js +1 -1
  10. package/dist/main.bundle.js +1 -1
  11. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js +6 -0
  12. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/BookingWizardBottomSheet.js.map +1 -1
  13. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.d.ts +22 -0
  14. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js +131 -0
  15. package/dist/src/components/generic/BookingWizard/BookingWizardBottomSheet/ShadowDomBottomSheet.js.map +1 -0
  16. package/dist/src/components/generic/Portal/Portal.js +5 -1
  17. package/dist/src/components/generic/Portal/Portal.js.map +1 -1
  18. package/dist/src/components/generic/Select/InputSelect.js +3 -2
  19. package/dist/src/components/generic/Select/InputSelect.js.map +1 -1
  20. package/dist/src/components/generic/Select/Select.js +5 -5
  21. package/dist/src/components/generic/Select/Select.js.map +1 -1
  22. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.d.ts +2 -2
  23. package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
  24. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.d.ts +4 -0
  25. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js +105 -30
  26. package/dist/src/components/members/SignInModal/EmailAndFullnameMemberModal.js.map +1 -1
  27. package/dist/src/components/members/SignInModal/ExternalMemberModal.d.ts +9 -3
  28. package/dist/src/components/members/SignInModal/ExternalMemberModal.js +45 -6
  29. package/dist/src/components/members/SignInModal/ExternalMemberModal.js.map +1 -1
  30. package/dist/src/components/steps/confirmation/RoomContactDetails.js +2 -3
  31. package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
  32. package/dist/src/components/steps/date/BEPeoplePickerBlock.js +3 -1
  33. package/dist/src/components/steps/date/BEPeoplePickerBlock.js.map +1 -1
  34. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js +2 -0
  35. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js.map +1 -1
  36. package/dist/src/components/summary/BESummaryRoomRow.js.map +1 -1
  37. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +1 -1
  38. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  39. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +1 -0
  40. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  41. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.d.ts +10 -0
  42. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js +12 -0
  43. package/dist/src/contexts/ShadowDomContext/ShadowDomContext.js.map +1 -0
  44. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.d.ts +8 -0
  45. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js +13 -0
  46. package/dist/src/contexts/ShadowDomContext/ShadowDomContextProvider.js.map +1 -0
  47. package/dist/src/contexts/index.d.ts +2 -0
  48. package/dist/src/contexts/index.js +2 -0
  49. package/dist/src/contexts/index.js.map +1 -1
  50. package/dist/src/engines/BaseEngine.d.ts +13 -0
  51. package/dist/src/engines/BaseEngine.js +32 -0
  52. package/dist/src/engines/BaseEngine.js.map +1 -1
  53. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js +1 -0
  54. package/dist/src/engines/BookingWizardEngine/BookingWizardEngine.js.map +1 -1
  55. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js +3 -1
  56. package/dist/src/engines/BookingWizardEngine/BookingWizardEngineElement.js.map +1 -1
  57. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js +1 -0
  58. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js.map +1 -1
  59. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +12 -10
  60. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  61. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js +1 -0
  62. package/dist/src/engines/MemberPortalWidget/MemberPortalWidget.js.map +1 -1
  63. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js +11 -9
  64. package/dist/src/engines/MemberPortalWidget/MemberPortalWidgetElement.js.map +1 -1
  65. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js +1 -0
  66. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngine.js.map +1 -1
  67. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js +4 -2
  68. package/dist/src/engines/RecentSearchesEngine/RecentSearchesEngineElement.js.map +1 -1
  69. package/dist/src/handlers/membership/SalesforceMemberHandler.js +1 -1
  70. package/dist/src/handlers/membership/SalesforceMemberHandler.js.map +1 -1
  71. package/dist/src/hooks/BodyClickHook.d.ts +2 -2
  72. package/dist/src/hooks/BodyClickHook.js +7 -3
  73. package/dist/src/hooks/BodyClickHook.js.map +1 -1
  74. package/dist/src/pages/findReservation/FindReservationResults.js +1 -1
  75. package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
  76. package/dist/src/pages/findReservation/ReservationRow.js +10 -9
  77. package/dist/src/pages/findReservation/ReservationRow.js.map +1 -1
  78. package/dist/src/pages/hotel/HotelInfo.js +7 -6
  79. package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
  80. package/dist/src/providers/RoomstayThemeEngine.js +7 -2
  81. package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
  82. package/dist/src/providers/ShadowDomManager.d.ts +21 -0
  83. package/dist/src/providers/ShadowDomManager.js +55 -0
  84. package/dist/src/providers/ShadowDomManager.js.map +1 -0
  85. package/dist/src/providers/StyleInjector.d.ts +42 -0
  86. package/dist/src/providers/StyleInjector.js +118 -0
  87. package/dist/src/providers/StyleInjector.js.map +1 -0
  88. package/dist/src/providers/storage/SessionProvider.js.map +1 -1
  89. package/dist/src/stories/EnhancedPhoneNumberField.stories.d.ts +1 -1
  90. package/dist/src/translations/Translation.d.ts +3 -0
  91. package/dist/src/translations/Translation.js +3 -0
  92. package/dist/src/translations/Translation.js.map +1 -1
  93. package/dist/src/translations/languages/en-gb.js +3 -0
  94. package/dist/src/translations/languages/en-gb.js.map +1 -1
  95. package/dist/src/util/Analytics/Analytics.js +1 -0
  96. package/dist/src/util/Analytics/Analytics.js.map +1 -1
  97. package/dist/src/util/ObjectHelper.d.ts +1 -0
  98. package/dist/src/util/ObjectHelper.js +5 -1
  99. package/dist/src/util/ObjectHelper.js.map +1 -1
  100. package/dist/test.bundle.js +1 -1
  101. package/dist/vendors.bundle.js +1 -1
  102. package/package.json +1 -1
  103. package/dist/326.bundle.js +0 -2
  104. package/dist/686.bundle.js +0 -1
  105. /package/dist/{326.bundle.js.LICENSE.txt → 219.bundle.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"RoomstayThemeEngine.js","sourceRoot":"/","sources":["src/providers/RoomstayThemeEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ROP from '@juggle/resize-observer';\nimport { IHotelColorScheme } from '@roomstay/core';\nimport * as Sentry from '@sentry/browser';\nimport dayjs from 'dayjs';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport i18n, { TFunction } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nimport type { Company } from '@/models/Client/Hotel/Company';\nimport { Language, LanguageProvider } from '@/providers/LanguageProvider';\nimport { getAccentOverrideStyleContent } from '@/util/Color';\n\ndeclare global {\n interface Window {\n ResizeObserver: any;\n }\n}\n\ndeclare const ASSET_URL: string;\n\nexport declare const RS_VERSION: string;\n\nif (typeof ResizeObserver === 'undefined') {\n window.ResizeObserver = ROP.ResizeObserver;\n}\n\nexport enum RoomstayTheme {\n Medium = 'medium',\n Light = 'light',\n}\n\nclass RoomstayThemeEngine {\n public currentCompany: Company | null = null;\n\n public EngineContainer!: HTMLElement;\n\n public ScriptContainer: Element | null = null;\n public StyleContainer: Element | null = null;\n\n public selectedLang: Language = Language.en_us;\n\n // TODO This needs to be changed, not ideal to just check for localhost\n public isLocalhost: boolean = location.hostname === 'localhost';\n\n // TODO: This needs to be refactored to not be a fixed string.\n public ThemeType = RoomstayTheme.Light;\n\n public ExternalStyles: string[] = [];\n public ExternalScripts: string[] = ['https://js.verygoodvault.com/vgs-collect/1/AC7dReJwJ6EWF1L9FHdcCw7n.js'];\n\n public translation: TFunction | null = null;\n\n public constructor() {\n console.log(`Initializing Roomstay Booking Engine v${RS_VERSION}`);\n }\n\n public changeCompany = (newCompany: Company) => {\n this.currentCompany = newCompany;\n this.registerStyles(newCompany.colors);\n };\n\n public changeTheme = async (profile: IHotelColorScheme) => {\n const styleOverrides = this.createElementOrReuseExisting('style', 'engine-styles');\n\n styleOverrides.setAttribute('rel', 'preload');\n\n styleOverrides.innerHTML = `\n :root {\n ${getAccentOverrideStyleContent(profile)}\n }`;\n };\n\n public registerStyles = async (profile?: IHotelColorScheme) => {\n console.log('Loading custom Theme Styles');\n if (profile) {\n this.changeTheme(profile);\n }\n\n this.ExternalStyles.forEach((url, index) => {\n const style = this.createElementOrReuseExisting('link', `engine-external-style-${index}`);\n style.setAttribute('rel', 'stylesheet');\n style.setAttribute('href', this.getAssetUrl() + url);\n });\n };\n\n public getAssetUrl = () => {\n return ASSET_URL;\n };\n\n public getImageAssetUrl = (url = '') => {\n return this.getAssetUrl() + 'assets/img/' + url;\n };\n\n /**\n * Detects if URL is absolute, and needs to be\n * @param url string\n */\n public wrapAssetUrl = (url: string) => {\n if (url.match(/^(?:[a-z]+:)?\\/\\//)) {\n return url;\n }\n\n return this.getAssetUrl() + url;\n };\n\n public registerScripts = async () => {\n this.ExternalScripts.forEach((url: string, index) => {\n this.loadScript(url, `legacy-${index}`);\n });\n };\n\n public loadScript = (src: string, name: string, alwaysExecute = false, timeout = 5_000): Promise<void> =>\n new Promise((resolve, reject) => {\n const container = this.EngineContainer;\n const existingScript = container.querySelector(`script[name=\"roomstay-script-${name}\"]`);\n\n if (existingScript) {\n if (alwaysExecute) {\n existingScript.remove();\n } else {\n resolve();\n return;\n }\n }\n\n const cleanup = () => {\n clearTimeout(timer);\n script.removeEventListener('load', onLoad);\n script.removeEventListener('error', onError);\n };\n\n const onLoad = () => {\n cleanup();\n resolve();\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(`Failed to load script \"${src}\"`));\n };\n\n const script = document.createElement('script');\n script.setAttribute('name', `roomstay-script-${name}`);\n script.setAttribute('src', src);\n\n script.addEventListener('load', onLoad);\n script.addEventListener('error', onError);\n\n // Guarantee that we won't get stuck here forever\n const timer = setTimeout(onError, timeout);\n\n // Append the script twice for some reason\n container.appendChild(script);\n this.ScriptContainer?.appendChild(script);\n });\n\n public createElementOrReuseExisting = <K extends keyof HTMLElementTagNameMap>(type: K, name: string) => {\n const container = this.EngineContainer;\n const findingElement = container.querySelector(`${type}[name=\"roomstay-${name}\"]`);\n\n if (findingElement) {\n return findingElement;\n } else {\n const target = document.createElement(type);\n target.setAttribute('name', `roomstay-${name}`);\n container.appendChild(target);\n return target;\n }\n };\n\n public init = async () => {\n dayjs.extend(isSameOrBefore);\n dayjs.extend(isSameOrAfter);\n dayjs.extend(advancedFormat);\n\n if (i18n) {\n this.translation = await i18n.use(initReactI18next).init({\n interpolation: { escapeValue: false },\n lng: Language.en_us,\n resources: LanguageProvider.getI18nMappedLanguages(),\n });\n }\n\n if (!this.isLocalhost) {\n Sentry.init({\n dsn: 'https://3bfba949561e48f1862c843ce8254a2d@o398412.ingest.sentry.io/5254086',\n beforeSend: (event, hint) => {\n event.tags = event.tags ?? { logger: '_default_' };\n\n try {\n if (hint?.originalException instanceof Error) {\n if ((hint.originalException.stack?.indexOf('www.googletagmanager.com/gtm.js?id=') as number) > -1) {\n event.tags.logger = 'gtm';\n event.level = Sentry.Severity.Warning;\n }\n }\n } catch (ex) {\n console.log(ex);\n }\n\n return event;\n },\n });\n }\n\n this.reloadScriptAndStyleContainers();\n };\n\n private reloadScriptAndStyleContainers = () => {\n this.StyleContainer = this.createElementOrReuseExisting('div', 'style-container');\n this.ScriptContainer = this.createElementOrReuseExisting('div', 'script-container');\n\n this.ScriptContainer.innerHTML = '';\n this.StyleContainer.innerHTML = '';\n\n this.registerStyles();\n };\n}\n\nexport default new RoomstayThemeEngine();\n"]}
1
+ {"version":3,"file":"RoomstayThemeEngine.js","sourceRoot":"/","sources":["src/providers/RoomstayThemeEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ROP from '@juggle/resize-observer';\nimport { IHotelColorScheme } from '@roomstay/core';\nimport * as Sentry from '@sentry/browser';\nimport dayjs from 'dayjs';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport i18n, { TFunction } from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nimport type { Company } from '@/models/Client/Hotel/Company';\nimport { Language, LanguageProvider } from '@/providers/LanguageProvider';\nimport { getAccentOverrideStyleContent } from '@/util/Color';\n\ndeclare global {\n interface Window {\n ResizeObserver: any;\n }\n}\n\ndeclare const ASSET_URL: string;\n\nexport declare const RS_VERSION: string;\n\nif (typeof ResizeObserver === 'undefined') {\n window.ResizeObserver = ROP.ResizeObserver;\n}\n\nexport enum RoomstayTheme {\n Medium = 'medium',\n Light = 'light',\n}\n\nclass RoomstayThemeEngine {\n public currentCompany: Company | null = null;\n\n public EngineContainer!: HTMLElement;\n\n public ScriptContainer: Element | null = null;\n public StyleContainer: Element | null = null;\n\n public selectedLang: Language = Language.en_us;\n\n // TODO This needs to be changed, not ideal to just check for localhost\n public isLocalhost: boolean = location.hostname === 'localhost';\n\n // TODO: This needs to be refactored to not be a fixed string.\n public ThemeType = RoomstayTheme.Light;\n\n public ExternalStyles: string[] = [];\n public ExternalScripts: string[] = ['https://js.verygoodvault.com/vgs-collect/1/AC7dReJwJ6EWF1L9FHdcCw7n.js'];\n\n public translation: TFunction | null = null;\n\n public constructor() {\n console.log(`Initializing Roomstay Booking Engine v${RS_VERSION}`);\n }\n\n public changeCompany = (newCompany: Company) => {\n this.currentCompany = newCompany;\n this.registerStyles(newCompany.colors);\n };\n\n public changeTheme = async (profile: IHotelColorScheme) => {\n const styleOverrides = this.createElementOrReuseExisting('style', 'engine-styles');\n\n styleOverrides.setAttribute('rel', 'preload');\n\n // Use :host when inside Shadow DOM, :root for light DOM\n const isInShadowDom = this.EngineContainer?.getRootNode() instanceof ShadowRoot;\n const selector = isInShadowDom ? ':host' : ':root';\n\n styleOverrides.innerHTML = `\n ${selector} {\n ${getAccentOverrideStyleContent(profile)}\n }`;\n };\n\n public registerStyles = async (profile?: IHotelColorScheme) => {\n console.log('Loading custom Theme Styles');\n if (profile) {\n this.changeTheme(profile);\n }\n\n this.ExternalStyles.forEach((url, index) => {\n const style = this.createElementOrReuseExisting('link', `engine-external-style-${index}`);\n style.setAttribute('rel', 'stylesheet');\n style.setAttribute('href', this.getAssetUrl() + url);\n });\n };\n\n public getAssetUrl = () => {\n return ASSET_URL;\n };\n\n public getImageAssetUrl = (url = '') => {\n return this.getAssetUrl() + 'assets/img/' + url;\n };\n\n /**\n * Detects if URL is absolute, and needs to be\n * @param url string\n */\n public wrapAssetUrl = (url: string) => {\n if (url.match(/^(?:[a-z]+:)?\\/\\//)) {\n return url;\n }\n\n return this.getAssetUrl() + url;\n };\n\n public registerScripts = async () => {\n this.ExternalScripts.forEach((url: string, index) => {\n this.loadScript(url, `legacy-${index}`);\n });\n };\n\n public loadScript = (src: string, name: string, alwaysExecute = false, timeout = 5_000): Promise<void> =>\n new Promise((resolve, reject) => {\n // Always use document.head for scripts — they need document scope (especially in Shadow DOM)\n const container = document.head;\n const existingScript = container.querySelector(`script[name=\"roomstay-script-${name}\"]`);\n\n if (existingScript) {\n if (alwaysExecute) {\n existingScript.remove();\n } else {\n resolve();\n return;\n }\n }\n\n const cleanup = () => {\n clearTimeout(timer);\n script.removeEventListener('load', onLoad);\n script.removeEventListener('error', onError);\n };\n\n const onLoad = () => {\n cleanup();\n resolve();\n };\n\n const onError = () => {\n cleanup();\n reject(new Error(`Failed to load script \"${src}\"`));\n };\n\n const script = document.createElement('script');\n script.setAttribute('name', `roomstay-script-${name}`);\n script.setAttribute('src', src);\n\n script.addEventListener('load', onLoad);\n script.addEventListener('error', onError);\n\n // Guarantee that we won't get stuck here forever\n const timer = setTimeout(onError, timeout);\n\n // Append the script twice for some reason\n container.appendChild(script);\n this.ScriptContainer?.appendChild(script);\n });\n\n public createElementOrReuseExisting = <K extends keyof HTMLElementTagNameMap>(type: K, name: string) => {\n const container = this.EngineContainer;\n const findingElement = container.querySelector(`${type}[name=\"roomstay-${name}\"]`);\n\n if (findingElement) {\n return findingElement;\n } else {\n const target = document.createElement(type);\n target.setAttribute('name', `roomstay-${name}`);\n container.appendChild(target);\n return target;\n }\n };\n\n public init = async () => {\n dayjs.extend(isSameOrBefore);\n dayjs.extend(isSameOrAfter);\n dayjs.extend(advancedFormat);\n\n if (i18n) {\n this.translation = await i18n.use(initReactI18next).init({\n interpolation: { escapeValue: false },\n lng: Language.en_us,\n resources: LanguageProvider.getI18nMappedLanguages(),\n });\n }\n\n if (!this.isLocalhost) {\n Sentry.init({\n dsn: 'https://3bfba949561e48f1862c843ce8254a2d@o398412.ingest.sentry.io/5254086',\n beforeSend: (event, hint) => {\n event.tags = event.tags ?? { logger: '_default_' };\n\n try {\n if (hint?.originalException instanceof Error) {\n if ((hint.originalException.stack?.indexOf('www.googletagmanager.com/gtm.js?id=') as number) > -1) {\n event.tags.logger = 'gtm';\n event.level = Sentry.Severity.Warning;\n }\n }\n } catch (ex) {\n console.log(ex);\n }\n\n return event;\n },\n });\n }\n\n this.reloadScriptAndStyleContainers();\n };\n\n private reloadScriptAndStyleContainers = () => {\n this.StyleContainer = this.createElementOrReuseExisting('div', 'style-container');\n this.ScriptContainer = this.createElementOrReuseExisting('div', 'script-container');\n\n this.ScriptContainer.innerHTML = '';\n this.StyleContainer.innerHTML = '';\n\n this.registerStyles();\n };\n}\n\nexport default new RoomstayThemeEngine();\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Manages Shadow DOM setup for a booking engine instance.
3
+ *
4
+ * Creates a shadow root on the host element with:
5
+ * - An inner container div (.roomstay-booking-container) for React rendering
6
+ * - Style injection via StyleInjector (all cached + future styles are duplicated here)
7
+ */
8
+ export declare class ShadowDomManager {
9
+ private shadowRoot;
10
+ private innerContainer;
11
+ private unregisterStyles;
12
+ constructor(hostElement: HTMLElement);
13
+ /** The shadow root */
14
+ get root(): ShadowRoot;
15
+ /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */
16
+ get container(): HTMLDivElement;
17
+ /** Inject a one-off style into the shadow root */
18
+ injectStyle(cssText: string, id?: string): HTMLStyleElement;
19
+ /** Clean up — unregister from StyleInjector */
20
+ destroy(): void;
21
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShadowDomManager = void 0;
4
+ const StyleInjector_1 = require("./StyleInjector");
5
+ /**
6
+ * Manages Shadow DOM setup for a booking engine instance.
7
+ *
8
+ * Creates a shadow root on the host element with:
9
+ * - An inner container div (.roomstay-booking-container) for React rendering
10
+ * - Style injection via StyleInjector (all cached + future styles are duplicated here)
11
+ */
12
+ class ShadowDomManager {
13
+ constructor(hostElement) {
14
+ this.unregisterStyles = null;
15
+ this.shadowRoot = hostElement.attachShadow({ mode: 'open' });
16
+ // Create the inner container for React rendering
17
+ this.innerContainer = document.createElement('div');
18
+ this.innerContainer.classList.add('roomstay-booking-container');
19
+ this.shadowRoot.appendChild(this.innerContainer);
20
+ // Register this shadow root to receive all style injections
21
+ this.unregisterStyles = StyleInjector_1.StyleInjector.registerShadowRoot(this.shadowRoot);
22
+ }
23
+ /** The shadow root */
24
+ get root() {
25
+ return this.shadowRoot;
26
+ }
27
+ /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */
28
+ get container() {
29
+ return this.innerContainer;
30
+ }
31
+ /** Inject a one-off style into the shadow root */
32
+ injectStyle(cssText, id) {
33
+ if (id) {
34
+ const existing = this.shadowRoot.querySelector(`style[data-rs-id="${id}"]`);
35
+ if (existing) {
36
+ existing.textContent = cssText;
37
+ return existing;
38
+ }
39
+ }
40
+ const style = document.createElement('style');
41
+ if (id)
42
+ style.setAttribute('data-rs-id', id);
43
+ style.textContent = cssText;
44
+ this.shadowRoot.appendChild(style);
45
+ return style;
46
+ }
47
+ /** Clean up — unregister from StyleInjector */
48
+ destroy() {
49
+ var _a;
50
+ (_a = this.unregisterStyles) === null || _a === void 0 ? void 0 : _a.call(this);
51
+ this.unregisterStyles = null;
52
+ }
53
+ }
54
+ exports.ShadowDomManager = ShadowDomManager;
55
+ //# sourceMappingURL=ShadowDomManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShadowDomManager.js","sourceRoot":"/","sources":["src/providers/ShadowDomManager.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAEhD;;;;;;GAMG;AACH,MAAa,gBAAgB;IAKzB,YAAY,WAAwB;QAF5B,qBAAgB,GAAwB,IAAI,CAAC;QAGjD,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7D,iDAAiD;QACjD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjD,4DAA4D;QAC5D,IAAI,CAAC,gBAAgB,GAAG,6BAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,mGAAmG;IACnG,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,kDAAkD;IAClD,WAAW,CAAC,OAAe,EAAE,EAAW;QACpC,IAAI,EAAE,EAAE,CAAC;YACL,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,IAAI,CAAqB,CAAC;YAChG,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC/B,OAAO,QAAQ,CAAC;YACpB,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,EAAE;YAAE,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,+CAA+C;IAC/C,OAAO;;QACH,MAAA,IAAI,CAAC,gBAAgB,oDAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ;AAhDD,4CAgDC","sourcesContent":["import { StyleInjector } from './StyleInjector';\n\n/**\n * Manages Shadow DOM setup for a booking engine instance.\n *\n * Creates a shadow root on the host element with:\n * - An inner container div (.roomstay-booking-container) for React rendering\n * - Style injection via StyleInjector (all cached + future styles are duplicated here)\n */\nexport class ShadowDomManager {\n private shadowRoot: ShadowRoot;\n private innerContainer: HTMLDivElement;\n private unregisterStyles: (() => void) | null = null;\n\n constructor(hostElement: HTMLElement) {\n this.shadowRoot = hostElement.attachShadow({ mode: 'open' });\n\n // Create the inner container for React rendering\n this.innerContainer = document.createElement('div');\n this.innerContainer.classList.add('roomstay-booking-container');\n this.shadowRoot.appendChild(this.innerContainer);\n\n // Register this shadow root to receive all style injections\n this.unregisterStyles = StyleInjector.registerShadowRoot(this.shadowRoot);\n }\n\n /** The shadow root */\n get root(): ShadowRoot {\n return this.shadowRoot;\n }\n\n /** The inner container div — use as React render target and RoomstayThemeEngine.EngineContainer */\n get container(): HTMLDivElement {\n return this.innerContainer;\n }\n\n /** Inject a one-off style into the shadow root */\n injectStyle(cssText: string, id?: string): HTMLStyleElement {\n if (id) {\n const existing = this.shadowRoot.querySelector(`style[data-rs-id=\"${id}\"]`) as HTMLStyleElement;\n if (existing) {\n existing.textContent = cssText;\n return existing;\n }\n }\n const style = document.createElement('style');\n if (id) style.setAttribute('data-rs-id', id);\n style.textContent = cssText;\n this.shadowRoot.appendChild(style);\n return style;\n }\n\n /** Clean up — unregister from StyleInjector */\n destroy(): void {\n this.unregisterStyles?.();\n this.unregisterStyles = null;\n }\n}\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Global registry for Shadow DOM style injection.
3
+ *
4
+ * When style-loader injects a <style> tag, it calls `insertStyle()` which:
5
+ * 1. Appends the style to document.head (for light DOM engines)
6
+ * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)
7
+ * 3. Clones it into every registered shadow root once content is available
8
+ *
9
+ * When a shadow root registers, all existing <style> tags in document.head
10
+ * (that have our data attribute) are cloned into it — by that time, all styles
11
+ * already have their content set by style-loader.
12
+ *
13
+ * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.
14
+ */
15
+ declare class StyleInjectorClass {
16
+ private shadowRoots;
17
+ private managedStyleIds;
18
+ private styleIdCounter;
19
+ /**
20
+ * Register a shadow root to receive style injections.
21
+ * All existing managed styles in document.head are cloned into the shadow root.
22
+ * Returns an unregister function.
23
+ */
24
+ registerShadowRoot(shadowRoot: ShadowRoot): () => void;
25
+ /**
26
+ * Called by style-loader's custom insert function.
27
+ * Appends the style element to document.head, then observes it for content
28
+ * changes so we can clone into shadow roots once style-loader sets the CSS.
29
+ */
30
+ insertStyle(styleElement: HTMLStyleElement): void;
31
+ /**
32
+ * Watch a style element for content changes. Once content is set,
33
+ * clone it into all registered shadow roots.
34
+ */
35
+ private observeAndClone;
36
+ /**
37
+ * Clone CSS text into all registered shadow roots.
38
+ */
39
+ private cloneToShadowRoots;
40
+ }
41
+ export declare const StyleInjector: StyleInjectorClass;
42
+ export {};
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StyleInjector = void 0;
4
+ /**
5
+ * Global registry for Shadow DOM style injection.
6
+ *
7
+ * When style-loader injects a <style> tag, it calls `insertStyle()` which:
8
+ * 1. Appends the style to document.head (for light DOM engines)
9
+ * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)
10
+ * 3. Clones it into every registered shadow root once content is available
11
+ *
12
+ * When a shadow root registers, all existing <style> tags in document.head
13
+ * (that have our data attribute) are cloned into it — by that time, all styles
14
+ * already have their content set by style-loader.
15
+ *
16
+ * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.
17
+ */
18
+ class StyleInjectorClass {
19
+ constructor() {
20
+ this.shadowRoots = new Set();
21
+ this.managedStyleIds = new Set();
22
+ this.styleIdCounter = 0;
23
+ }
24
+ /**
25
+ * Register a shadow root to receive style injections.
26
+ * All existing managed styles in document.head are cloned into the shadow root.
27
+ * Returns an unregister function.
28
+ */
29
+ registerShadowRoot(shadowRoot) {
30
+ this.shadowRoots.add(shadowRoot);
31
+ // Copy all existing managed styles from document.head.
32
+ // By registration time, style-loader has already set their content.
33
+ const existingStyles = document.head.querySelectorAll('style[data-rs-style]');
34
+ existingStyles.forEach((styleEl) => {
35
+ const cssText = styleEl.textContent || '';
36
+ if (cssText) {
37
+ const clone = document.createElement('style');
38
+ clone.setAttribute('data-rs-style', styleEl.getAttribute('data-rs-style') || '');
39
+ clone.textContent = cssText;
40
+ shadowRoot.appendChild(clone);
41
+ }
42
+ });
43
+ return () => {
44
+ this.shadowRoots.delete(shadowRoot);
45
+ };
46
+ }
47
+ /**
48
+ * Called by style-loader's custom insert function.
49
+ * Appends the style element to document.head, then observes it for content
50
+ * changes so we can clone into shadow roots once style-loader sets the CSS.
51
+ */
52
+ insertStyle(styleElement) {
53
+ const id = `rs-style-${this.styleIdCounter++}`;
54
+ styleElement.setAttribute('data-rs-style', id);
55
+ this.managedStyleIds.add(id);
56
+ // Always inject into document.head for light DOM engines
57
+ document.head.appendChild(styleElement);
58
+ // style-loader sets content AFTER insert() returns.
59
+ // Use MutationObserver to detect when content is set, then clone to shadow roots.
60
+ if (this.shadowRoots.size > 0) {
61
+ this.observeAndClone(styleElement, id);
62
+ }
63
+ else {
64
+ // No shadow roots yet — still observe in case one registers before
65
+ // style-loader sets the content (unlikely but safe)
66
+ this.observeAndClone(styleElement, id);
67
+ }
68
+ }
69
+ /**
70
+ * Watch a style element for content changes. Once content is set,
71
+ * clone it into all registered shadow roots.
72
+ */
73
+ observeAndClone(styleElement, id) {
74
+ // Check if content is already available (e.g. manually created styles)
75
+ const immediateContent = styleElement.textContent || '';
76
+ if (immediateContent) {
77
+ this.cloneToShadowRoots(immediateContent, id);
78
+ return;
79
+ }
80
+ // Observe for childList changes (style-loader adds a text node)
81
+ const observer = new MutationObserver(() => {
82
+ const cssText = styleElement.textContent || '';
83
+ if (cssText) {
84
+ observer.disconnect();
85
+ this.cloneToShadowRoots(cssText, id);
86
+ }
87
+ });
88
+ observer.observe(styleElement, { childList: true, characterData: true, subtree: true });
89
+ // Safety fallback: if MutationObserver doesn't fire (e.g. style-loader uses
90
+ // element.textContent = ... which may not trigger characterData), use a microtask
91
+ Promise.resolve().then(() => {
92
+ const cssText = styleElement.textContent || '';
93
+ if (cssText) {
94
+ observer.disconnect();
95
+ this.cloneToShadowRoots(cssText, id);
96
+ }
97
+ });
98
+ }
99
+ /**
100
+ * Clone CSS text into all registered shadow roots.
101
+ */
102
+ cloneToShadowRoots(cssText, id) {
103
+ this.shadowRoots.forEach((shadowRoot) => {
104
+ // Avoid duplicates — check if this ID already exists in the shadow root
105
+ if (shadowRoot.querySelector(`style[data-rs-style="${id}"]`)) {
106
+ return;
107
+ }
108
+ const clone = document.createElement('style');
109
+ clone.setAttribute('data-rs-style', id);
110
+ clone.textContent = cssText;
111
+ shadowRoot.appendChild(clone);
112
+ });
113
+ }
114
+ }
115
+ // Singleton on window so style-loader's insert function can access it
116
+ window.__roomstayStyleInjector = window.__roomstayStyleInjector || new StyleInjectorClass();
117
+ exports.StyleInjector = window.__roomstayStyleInjector;
118
+ //# sourceMappingURL=StyleInjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleInjector.js","sourceRoot":"/","sources":["src/providers/StyleInjector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global registry for Shadow DOM style injection.\n *\n * When style-loader injects a <style> tag, it calls `insertStyle()` which:\n * 1. Appends the style to document.head (for light DOM engines)\n * 2. Observes the element for content changes (style-loader sets content AFTER insert() returns)\n * 3. Clones it into every registered shadow root once content is available\n *\n * When a shadow root registers, all existing <style> tags in document.head\n * (that have our data attribute) are cloned into it — by that time, all styles\n * already have their content set by style-loader.\n *\n * Must be on `window.__roomstayStyleInjector` so style-loader's insert function can access it.\n */\nclass StyleInjectorClass {\n private shadowRoots: Set<ShadowRoot> = new Set();\n private managedStyleIds: Set<string> = new Set();\n private styleIdCounter = 0;\n\n /**\n * Register a shadow root to receive style injections.\n * All existing managed styles in document.head are cloned into the shadow root.\n * Returns an unregister function.\n */\n registerShadowRoot(shadowRoot: ShadowRoot): () => void {\n this.shadowRoots.add(shadowRoot);\n\n // Copy all existing managed styles from document.head.\n // By registration time, style-loader has already set their content.\n const existingStyles = document.head.querySelectorAll('style[data-rs-style]');\n existingStyles.forEach((styleEl) => {\n const cssText = styleEl.textContent || '';\n if (cssText) {\n const clone = document.createElement('style');\n clone.setAttribute('data-rs-style', styleEl.getAttribute('data-rs-style') || '');\n clone.textContent = cssText;\n shadowRoot.appendChild(clone);\n }\n });\n\n return () => {\n this.shadowRoots.delete(shadowRoot);\n };\n }\n\n /**\n * Called by style-loader's custom insert function.\n * Appends the style element to document.head, then observes it for content\n * changes so we can clone into shadow roots once style-loader sets the CSS.\n */\n insertStyle(styleElement: HTMLStyleElement): void {\n const id = `rs-style-${this.styleIdCounter++}`;\n styleElement.setAttribute('data-rs-style', id);\n this.managedStyleIds.add(id);\n\n // Always inject into document.head for light DOM engines\n document.head.appendChild(styleElement);\n\n // style-loader sets content AFTER insert() returns.\n // Use MutationObserver to detect when content is set, then clone to shadow roots.\n if (this.shadowRoots.size > 0) {\n this.observeAndClone(styleElement, id);\n } else {\n // No shadow roots yet — still observe in case one registers before\n // style-loader sets the content (unlikely but safe)\n this.observeAndClone(styleElement, id);\n }\n }\n\n /**\n * Watch a style element for content changes. Once content is set,\n * clone it into all registered shadow roots.\n */\n private observeAndClone(styleElement: HTMLStyleElement, id: string): void {\n // Check if content is already available (e.g. manually created styles)\n const immediateContent = styleElement.textContent || '';\n if (immediateContent) {\n this.cloneToShadowRoots(immediateContent, id);\n return;\n }\n\n // Observe for childList changes (style-loader adds a text node)\n const observer = new MutationObserver(() => {\n const cssText = styleElement.textContent || '';\n if (cssText) {\n observer.disconnect();\n this.cloneToShadowRoots(cssText, id);\n }\n });\n\n observer.observe(styleElement, { childList: true, characterData: true, subtree: true });\n\n // Safety fallback: if MutationObserver doesn't fire (e.g. style-loader uses\n // element.textContent = ... which may not trigger characterData), use a microtask\n Promise.resolve().then(() => {\n const cssText = styleElement.textContent || '';\n if (cssText) {\n observer.disconnect();\n this.cloneToShadowRoots(cssText, id);\n }\n });\n }\n\n /**\n * Clone CSS text into all registered shadow roots.\n */\n private cloneToShadowRoots(cssText: string, id: string): void {\n this.shadowRoots.forEach((shadowRoot) => {\n // Avoid duplicates — check if this ID already exists in the shadow root\n if (shadowRoot.querySelector(`style[data-rs-style=\"${id}\"]`)) {\n return;\n }\n const clone = document.createElement('style');\n clone.setAttribute('data-rs-style', id);\n clone.textContent = cssText;\n shadowRoot.appendChild(clone);\n });\n }\n}\n\n// Singleton on window so style-loader's insert function can access it\n(window as any).__roomstayStyleInjector = (window as any).__roomstayStyleInjector || new StyleInjectorClass();\nexport const StyleInjector: StyleInjectorClass = (window as any).__roomstayStyleInjector;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SessionProvider.js","sourceRoot":"/","sources":["src/providers/storage/SessionProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignInUser } from '@frontend/contexts';\nimport dayjs from 'dayjs';\n\nimport { Addon } from '@/models/Addon/Addon';\nimport BasketAddonRow, { IBasketAddonRow } from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\nimport { IRoom, Room } from '@/models/Room/Room';\nimport { IRoomRate, RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession, SERIALIZED_DATE_FORMAT, SerializedRoomstaySession, SerializedRoomstaySessionBasketRow } from '@/models/RoomstaySession';\nimport { StorageProvider } from '@/providers/storage/StorageProvider';\nimport { debounce, delay } from '@/util/Debounce';\n\n/**\n * Session provider is in charge of handling the loading, saving and passing of the current Engine Session.\n *\n * Desired flow:\n * * App Opened\n * * Session Provider loaded\n * * New User Session Created\n * * User moves through the app, updating the session with vital details (current step, basket context )\n * * User refreshes browser - session is re-loaded and user resumes where they left off\n * * User proceeds to checkout.\n * * Session is saved.\n *\n * Mini Booking Widget:\n * * User loads mini booking widget, selects dates, people\n * * Rates are loaded, and user selects a rate, redirecting to Full Booking Engine\n * * Session Provider creates a SessionID to pass to redirected path\n * * Session Provider loads the passed SessionID and loads the correct session\n * * Resume to Desired Flow\n *\n * Re-targeting:\n * ---Since re-targeting will happen on client site, under client domain, localStorage will be preserved, ergo we can load the previous incomplete sessions back to the user\n * * User lands on client Homepage\n * * Session Provider loads previous incomplete sessions\n * * A slider with details of previous baskets is shown back to the user\n * * User clicks on a previous session and is brought to the Booking Engine\n * * Resume to Desired Flow\n */\n\nexport default class SessionProvider {\n private currentSessionID!: number;\n private hotelID!: string;\n private cachedSession: Partial<RoomstaySession> = {};\n\n private syncSession = async () => {\n try {\n const currentSession = await this.getSession();\n const cachedSession = this.cachedSession;\n this.cachedSession = {};\n await this.saveSession({\n ...currentSession,\n ...cachedSession,\n });\n } catch (error) {\n console.error('Failed to sync session:', error);\n }\n };\n\n private debouncedUpdateSession = debounce(async () => {\n await this.syncSession();\n }, 300);\n\n private async updateSessionWithAsync() {\n await delay(300); // 300 milliseconds delay -- Why is a delay necessary?\n await this.syncSession();\n }\n\n public async setHotelID(hotelID: string) {\n this.hotelID = hotelID;\n this.updateSession({ hotelID });\n }\n\n public async initialize(sessionID?: number, source?: string) {\n await this.setSessionID(sessionID, source);\n }\n\n public async setSessionID(sessionID?: number, source?: string) {\n const foundSession = await this.findOrCreateSessionID(sessionID as number, source as string);\n\n if (foundSession) {\n this.currentSessionID = foundSession;\n\n // Never read?\n const storage = new StorageProvider(sessionStorage);\n await storage.write('currentSession', this.currentSessionID);\n }\n }\n\n /**\n * @returns the current session ID\n */\n public getCurrentSessionID(): number {\n return this.currentSessionID;\n }\n\n public getSession(): RoomstaySession {\n const storage = new StorageProvider();\n\n const sessionFromStorage = storage.read<SerializedRoomstaySession>(this.getSessionKey());\n\n if (sessionFromStorage) {\n return this.unSerializeSession(sessionFromStorage);\n } else {\n return this.generateNewSession('');\n }\n }\n\n public async saveSession(changedSession: RoomstaySession) {\n if (!changedSession) {\n return console.log('Attempted to save empty session');\n }\n\n const storage = new StorageProvider();\n\n const serializedSession = this.serializeSession(changedSession);\n\n await storage.write(this.getSessionKey(serializedSession.id), serializedSession);\n }\n\n public async updateSession(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n this.debouncedUpdateSession();\n }\n\n public async updateSessionAsync(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n await this.updateSessionWithAsync();\n }\n\n public async deleteSession() {\n const storage = new StorageProvider();\n storage.delete(this.getSessionKey());\n }\n\n public async getAllSessions() {\n const storage = new StorageProvider();\n const sessionKeys = storage.getAllKeys((name) => name.startsWith('roomstay-session'));\n\n return (await storage.readAll<SerializedRoomstaySession>(sessionKeys)).map((session) => this.unSerializeSession(session));\n }\n\n /**\n * Function to find the right session from session storage, or local storage\n *\n * If one isn't found it is then created.\n */\n private async findOrCreateSessionID(sessionID: number, source: string) {\n let session: RoomstaySession;\n\n if (sessionID) {\n session = (await this.findSession(sessionID)) as RoomstaySession;\n\n if (session) {\n return session.id;\n }\n }\n\n session = await this.generateNewSession(source);\n\n return session.id;\n }\n\n private async findSession(sessionID: number): Promise<RoomstaySession | undefined> {\n const storage = new StorageProvider();\n const session = await storage.read<SerializedRoomstaySession>(this.getSessionKey(sessionID));\n\n if (session) {\n return this.unSerializeSession(session);\n }\n }\n\n private generateNewSession(source: string): RoomstaySession {\n const sessionId = new Date().getTime();\n\n const session: RoomstaySession = {\n id: sessionId,\n startDate: null,\n endDate: null,\n step: '',\n hotelID: this.hotelID ?? null,\n basketRows: [],\n source,\n };\n\n this.saveSession(session);\n\n return session;\n }\n\n private serializeSession(session: RoomstaySession): SerializedRoomstaySession {\n const basketRows: SerializedRoomstaySessionBasketRow[] = [];\n\n // TODO possibly refactor BasketRow to serialize itself, or instead make a serializer that can do all this.\n session.basketRows.forEach((unSerializeBasketRow: BasketRow) => {\n const rate = unSerializeBasketRow.getRate();\n const room = unSerializeBasketRow.getRoom();\n\n let serializedRate = null;\n let serializedRoom = null;\n\n if (rate) {\n serializedRate = rate.serialize();\n }\n\n if (room) {\n serializedRoom = room.serialize();\n }\n\n basketRows.push({\n uniqId: unSerializeBasketRow.getID(),\n startDate: unSerializeBasketRow.getStartDate()?.format(SERIALIZED_DATE_FORMAT),\n endDate: unSerializeBasketRow.getEndDate()?.format(SERIALIZED_DATE_FORMAT),\n adults: unSerializeBasketRow.getAdults(),\n children: unSerializeBasketRow.getChildren(),\n infants: unSerializeBasketRow.getInfants(),\n promoCode: unSerializeBasketRow.getPromoCode(),\n promoCodeStatus: unSerializeBasketRow.getPromoCodeStatus(),\n rate: serializedRate as IRoomRate,\n room: serializedRoom as IRoom,\n });\n });\n\n return {\n id: session.id,\n startDate: session.startDate?.format(SERIALIZED_DATE_FORMAT) as string,\n endDate: session.endDate?.format(SERIALIZED_DATE_FORMAT) as string,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: JSON.stringify(session.user),\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: session.reservationRequest,\n };\n }\n\n private unSerializeSession(session: SerializedRoomstaySession): RoomstaySession {\n const basketRows: BasketRow[] = [];\n let startDate: dayjs.Dayjs | null = null;\n let endDate: dayjs.Dayjs | null = null;\n\n if (session.startDate) {\n startDate = dayjs(session.startDate, SERIALIZED_DATE_FORMAT);\n }\n\n if (session.endDate) {\n endDate = dayjs(session.endDate, SERIALIZED_DATE_FORMAT);\n }\n\n session.basketRows?.forEach((serializedBasketRow) => {\n let rate;\n let room;\n\n if (serializedBasketRow.room) {\n room = new Room();\n room.unSerialize(serializedBasketRow.room);\n }\n\n if (serializedBasketRow.rate && room) {\n rate = new RoomRate();\n rate.unSerialize(serializedBasketRow.rate);\n rate.setRoom(room);\n }\n\n const basketRow = new BasketRow(rate, serializedBasketRow.uniqId);\n\n if (serializedBasketRow.startDate) {\n basketRow.setStartDate(dayjs(serializedBasketRow.startDate, SERIALIZED_DATE_FORMAT));\n }\n if (serializedBasketRow.endDate) {\n basketRow.setEndDate(dayjs(serializedBasketRow.endDate, SERIALIZED_DATE_FORMAT));\n }\n\n basketRow.setAdults(serializedBasketRow.adults);\n basketRow.setChildren(serializedBasketRow.children);\n basketRow.setInfants(serializedBasketRow.infants);\n\n basketRows.push(basketRow);\n });\n\n const reservationRequest = session?.reservationRequest;\n let basketAddonRows = reservationRequest?.basketAddonRows || [];\n if (reservationRequest && basketAddonRows.length > 0) {\n basketAddonRows = basketAddonRows.map((row) => {\n const addonRowRaw = row as unknown as IBasketAddonRow;\n const addon = new Addon({ ...addonRowRaw.addon, checkInDate: dayjs(addonRowRaw.addon.checkInDate), checkOutDate: dayjs(addonRowRaw.addon.checkOutDate) });\n const addonRow = new BasketAddonRow(addon, addonRowRaw.uniqId);\n addonRow.setAdultQuantity(addonRowRaw.adultQuantity);\n addonRow.setChildQuantity(addonRowRaw.childQuantity);\n addonRow.setQuantity(addonRowRaw.quantity);\n addonRow.setSelectedDate(addonRowRaw.selectedDate);\n addonRow.setSelectedTime(addonRowRaw.selectedTime);\n return addonRow;\n });\n reservationRequest.basketAddonRows = basketAddonRows;\n }\n\n return {\n id: session.id,\n startDate,\n endDate,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: session.user ? (JSON.parse(session.user) as SignInUser) : undefined,\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: reservationRequest,\n };\n }\n\n private getSessionKey(sessionId?: number): string {\n return `session-${sessionId ?? this.currentSessionID}`;\n }\n}\n"]}
1
+ {"version":3,"file":"SessionProvider.js","sourceRoot":"/","sources":["src/providers/storage/SessionProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignInUser } from '@frontend/contexts';\nimport dayjs from 'dayjs';\n\nimport { Addon } from '@/models/Addon/Addon';\nimport BasketAddonRow, { IBasketAddonRow } from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\nimport { IRoom, Room } from '@/models/Room/Room';\nimport { IRoomRate, RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession, SERIALIZED_DATE_FORMAT, SerializedRoomstaySession, SerializedRoomstaySessionBasketRow } from '@/models/RoomstaySession';\nimport { StorageProvider } from '@/providers/storage/StorageProvider';\nimport { debounce, delay } from '@/util/Debounce';\n\n/**\n * Session provider is in charge of handling the loading, saving and passing of the current Engine Session.\n *\n * Desired flow:\n * * App Opened\n * * Session Provider loaded\n * * New User Session Created\n * * User moves through the app, updating the session with vital details (current step, basket context )\n * * User refreshes browser - session is re-loaded and user resumes where they left off\n * * User proceeds to checkout.\n * * Session is saved.\n *\n * Mini Booking Widget:\n * * User loads mini booking widget, selects dates, people\n * * Rates are loaded, and user selects a rate, redirecting to Full Booking Engine\n * * Session Provider creates a SessionID to pass to redirected path\n * * Session Provider loads the passed SessionID and loads the correct session\n * * Resume to Desired Flow\n *\n * Re-targeting:\n * ---Since re-targeting will happen on client site, under client domain, localStorage will be preserved, ergo we can load the previous incomplete sessions back to the user\n * * User lands on client Homepage\n * * Session Provider loads previous incomplete sessions\n * * A slider with details of previous baskets is shown back to the user\n * * User clicks on a previous session and is brought to the Booking Engine\n * * Resume to Desired Flow\n */\n\nexport default class SessionProvider {\n private currentSessionID!: number;\n private hotelID!: string;\n private cachedSession: Partial<RoomstaySession> = {};\n\n private syncSession = async () => {\n try {\n const currentSession = await this.getSession();\n const cachedSession = this.cachedSession;\n this.cachedSession = {};\n await this.saveSession({\n ...currentSession,\n ...cachedSession,\n });\n } catch (error) {\n console.error('Failed to sync session:', error);\n }\n };\n\n private debouncedUpdateSession = debounce(async () => {\n await this.syncSession();\n }, 300);\n\n private async updateSessionWithAsync() {\n await delay(300); // 300 milliseconds delay -- Why is a delay necessary?\n await this.syncSession();\n }\n\n public async setHotelID(hotelID: string) {\n this.hotelID = hotelID;\n this.updateSession({ hotelID });\n }\n\n public async initialize(sessionID?: number, source?: string) {\n await this.setSessionID(sessionID, source);\n }\n\n public async setSessionID(sessionID?: number, source?: string) {\n const foundSession = await this.findOrCreateSessionID(sessionID as number, source as string);\n\n if (foundSession) {\n this.currentSessionID = foundSession;\n\n // Never read?\n const storage = new StorageProvider(sessionStorage);\n await storage.write('currentSession', this.currentSessionID);\n }\n }\n\n /**\n * @returns the current session ID\n */\n public getCurrentSessionID(): number {\n return this.currentSessionID;\n }\n\n public getSession(): RoomstaySession {\n const storage = new StorageProvider();\n\n const sessionFromStorage = storage.read<SerializedRoomstaySession>(this.getSessionKey());\n\n if (sessionFromStorage) {\n return this.unSerializeSession(sessionFromStorage);\n } else {\n return this.generateNewSession('');\n }\n }\n\n public async saveSession(changedSession: RoomstaySession) {\n if (!changedSession) {\n return console.log('Attempted to save empty session');\n }\n\n const storage = new StorageProvider();\n\n const serializedSession = this.serializeSession(changedSession);\n\n await storage.write(this.getSessionKey(serializedSession.id), serializedSession);\n }\n\n public async updateSession(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n this.debouncedUpdateSession();\n }\n\n public async updateSessionAsync(partialSession: Partial<RoomstaySession>) {\n Object.assign(this.cachedSession, partialSession);\n await this.updateSessionWithAsync();\n }\n\n public async deleteSession() {\n const storage = new StorageProvider();\n storage.delete(this.getSessionKey());\n }\n\n public async getAllSessions() {\n const storage = new StorageProvider();\n const sessionKeys = storage.getAllKeys((name) => name.startsWith('roomstay-session'));\n\n return (await storage.readAll<SerializedRoomstaySession>(sessionKeys)).map((session) => this.unSerializeSession(session));\n }\n\n /**\n * Function to find the right session from session storage, or local storage\n *\n * If one isn't found it is then created.\n */\n private async findOrCreateSessionID(sessionID: number, source: string) {\n let session: RoomstaySession;\n\n if (sessionID) {\n session = (await this.findSession(sessionID)) as RoomstaySession;\n\n if (session) {\n return session.id;\n }\n }\n\n session = await this.generateNewSession(source);\n\n return session.id;\n }\n\n private async findSession(sessionID: number): Promise<RoomstaySession | undefined> {\n const storage = new StorageProvider();\n const session = await storage.read<SerializedRoomstaySession>(this.getSessionKey(sessionID));\n\n if (session) {\n return this.unSerializeSession(session);\n }\n }\n\n private generateNewSession(source: string): RoomstaySession {\n const sessionId = new Date().getTime();\n\n const session: RoomstaySession = {\n id: sessionId,\n startDate: null,\n endDate: null,\n step: '',\n hotelID: this.hotelID ?? null,\n basketRows: [],\n source,\n };\n\n this.saveSession(session);\n\n return session;\n }\n\n private serializeSession(session: RoomstaySession): SerializedRoomstaySession {\n const basketRows: SerializedRoomstaySessionBasketRow[] = [];\n\n // TODO possibly refactor BasketRow to serialize itself, or instead make a serializer that can do all this.\n session.basketRows.forEach((unSerializeBasketRow: BasketRow) => {\n const rate = unSerializeBasketRow.getRate();\n const room = unSerializeBasketRow.getRoom();\n\n let serializedRate = null;\n let serializedRoom = null;\n\n if (rate) {\n serializedRate = rate.serialize();\n }\n\n if (room) {\n serializedRoom = room.serialize();\n }\n\n basketRows.push({\n uniqId: unSerializeBasketRow.getID(),\n startDate: unSerializeBasketRow.getStartDate()?.format(SERIALIZED_DATE_FORMAT),\n endDate: unSerializeBasketRow.getEndDate()?.format(SERIALIZED_DATE_FORMAT),\n adults: unSerializeBasketRow.getAdults(),\n children: unSerializeBasketRow.getChildren(),\n infants: unSerializeBasketRow.getInfants(),\n promoCode: unSerializeBasketRow.getPromoCode(),\n promoCodeStatus: unSerializeBasketRow.getPromoCodeStatus(),\n rate: serializedRate as IRoomRate,\n room: serializedRoom as IRoom,\n });\n });\n\n return {\n id: session.id,\n startDate: session.startDate?.format(SERIALIZED_DATE_FORMAT) as string,\n endDate: session.endDate?.format(SERIALIZED_DATE_FORMAT) as string,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: JSON.stringify(session.user),\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: session.reservationRequest,\n };\n }\n\n private unSerializeSession(session: SerializedRoomstaySession): RoomstaySession {\n const basketRows: BasketRow[] = [];\n let startDate: dayjs.Dayjs | null = null;\n let endDate: dayjs.Dayjs | null = null;\n\n if (session.startDate) {\n startDate = dayjs(session.startDate, SERIALIZED_DATE_FORMAT);\n }\n\n if (session.endDate) {\n endDate = dayjs(session.endDate, SERIALIZED_DATE_FORMAT);\n }\n\n session.basketRows?.forEach((serializedBasketRow) => {\n let rate;\n let room;\n\n if (serializedBasketRow.room) {\n room = new Room();\n room.unSerialize(serializedBasketRow.room);\n }\n\n if (serializedBasketRow.rate && room) {\n rate = new RoomRate();\n rate.unSerialize(serializedBasketRow.rate);\n rate.setRoom(room);\n }\n\n const basketRow = new BasketRow(rate, serializedBasketRow.uniqId);\n\n if (serializedBasketRow.startDate) {\n basketRow.setStartDate(dayjs(serializedBasketRow.startDate, SERIALIZED_DATE_FORMAT));\n }\n if (serializedBasketRow.endDate) {\n basketRow.setEndDate(dayjs(serializedBasketRow.endDate, SERIALIZED_DATE_FORMAT));\n }\n\n basketRow.setAdults(serializedBasketRow.adults);\n basketRow.setChildren(serializedBasketRow.children);\n basketRow.setInfants(serializedBasketRow.infants);\n\n basketRows.push(basketRow);\n });\n\n const reservationRequest = session?.reservationRequest;\n let basketAddonRows = reservationRequest?.basketAddonRows || [];\n if (reservationRequest && basketAddonRows.length > 0) {\n basketAddonRows = basketAddonRows.map((row) => {\n const addonRowRaw = row as unknown as IBasketAddonRow;\n\n const addon = new Addon({ ...addonRowRaw.addon, checkInDate: dayjs(addonRowRaw.addon.checkInDate), checkOutDate: dayjs(addonRowRaw.addon.checkOutDate) });\n const addonRow = new BasketAddonRow(addon, addonRowRaw.uniqId);\n addonRow.setAdultQuantity(addonRowRaw.adultQuantity);\n addonRow.setChildQuantity(addonRowRaw.childQuantity);\n addonRow.setQuantity(addonRowRaw.quantity);\n addonRow.setSelectedDate(addonRowRaw.selectedDate);\n addonRow.setSelectedTime(addonRowRaw.selectedTime);\n return addonRow;\n });\n reservationRequest.basketAddonRows = basketAddonRows;\n }\n\n return {\n id: session.id,\n startDate,\n endDate,\n step: session.step,\n hotelID: session.hotelID,\n basketRows,\n source: session.source,\n user: session.user ? (JSON.parse(session.user) as SignInUser) : undefined,\n memberId: session.memberId,\n reservation: session.reservation,\n reservationRequest: reservationRequest,\n };\n }\n\n private getSessionKey(sessionId?: number): string {\n return `session-${sessionId ?? this.currentSessionID}`;\n }\n}\n"]}
@@ -3,4 +3,4 @@ import React from 'react';
3
3
  import EnhancedPhoneNumberField from '../components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField';
4
4
  declare const _default: ComponentMeta<typeof EnhancedPhoneNumberField>;
5
5
  export default _default;
6
- export declare const Default: ComponentStory<React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<import("../components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField").EnhancedPhoneNumberField>, keyof import("../components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField").EnhancedPhoneNumberField> & React.RefAttributes<HTMLInputElement>>>;
6
+ export declare const Default: ComponentStory<React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<import("../components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField").EnhancedPhoneNumberFieldProps>, keyof import("../components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField").EnhancedPhoneNumberFieldProps> & React.RefAttributes<HTMLInputElement>>>;
@@ -791,6 +791,9 @@ export declare const Translation: {
791
791
  MemberNumber: string;
792
792
  MemberNumberOptionalBenefits: string;
793
793
  FamilyName: string;
794
+ PostalCode: string;
795
+ MobilePhone: string;
796
+ MarketingOptIn: string;
794
797
  };
795
798
  Submit: string;
796
799
  InvalidMember: string;
@@ -794,6 +794,9 @@ exports.Translation = {
794
794
  MemberNumber: 'ExternalMemberPopup.Fields.MemberNumber',
795
795
  MemberNumberOptionalBenefits: 'ExternalMemberPopup.Fields.MemberNumberOptionalBenefits',
796
796
  FamilyName: 'ExternalMemberPopup.Fields.FamilyName',
797
+ PostalCode: 'ExternalMemberPopup.Fields.PostalCode',
798
+ MobilePhone: 'ExternalMemberPopup.Fields.MobilePhone',
799
+ MarketingOptIn: 'ExternalMemberPopup.Fields.MarketingOptIn',
797
800
  },
798
801
  Submit: 'ExternalMemberPopup.Submit',
799
802
  InvalidMember: 'ExternalMemberPopup.InvalidMember',