{"version":3,"sources":["temp/config.js","lib/accessibilityStateManager.ts","lib/getPropertyByPath.ts","lib/routerUtils.ts","components/Layouts/Error.tsx","components/Layouts/NotFound.tsx","components/Layouts/MainContainer.tsx","components/Layouts/LayoutFactory.tsx","components/Header/NavBarContainer.tsx","Layout.tsx","componentFactory.tsx","lib/RouteDataManager.tsx","lib/ComponentFactoryProvider.tsx","ClientOnlyReCaptchaProvider.tsx","withClientOnly.tsx","AppRoot.tsx","index.tsx","lib/languageResolvers.ts","lib/dataFetcher.ts","lib/routeStateManager.ts","lib/AppStateProvider.tsx"],"names":["module","exports","reducer","state","action","type","_objectSpread","selectedFontSize","payload","selectedContrastValue","initializeAccessibilitySettings","_ref","contrast","fontSize","dispatch","setContrast","theme","value","title","setFontSize","fontSizeClasses","changeFontSize","_classList","window","document","querySelector","classList","remove","apply","add","storageManager","changeContrast","option","resolveAccessibilitySettings","config","getContrast","defaultContrast","getFontSize","defaultFontSize","getItem","setItem","key","localStorage","get","obj","propPath","defaultValue","split","reduce","o","p","getPropertyByPath","canUseDOM","createElement","routePatterns","matchRoute","route","result","some","pattern","match","matchPath","path","params","Error","_ref$error","error","_ref$errorMessage","errorMessage","React","concat","toString","NotFoundContent","en","fields","description","ctaLabel","ctaLink","href","anchor","linktype","class","querystring","id","colourTheme","url","backgroundColor","themeName","ar","NotFound","context","langauge","language","props","SystemMessageBanner","getOriginUrl","origin","endsWith","getAlternateUrl","alternateUrl","toLowerCase","startsWith","substring","length","renderProperties","prefix","queryString","properties","parts","i","pair","push","property","decodeURIComponent","content","withRouter","location","pageTitle","resolvePageTitle","pageDescription","pageUrl","pathname","resolveCanonicalUrl","ogTitle","ogDescription","ogImage","twitterTitle","twitterDescription","itemId","templateName","tealium","disablePageIndexing","browserLanguage","navigator","utag_data","page_id","page_name","page_language","template","pillar","content_type","persona","page_location","page_title","page_path","page_browser_language","console","warn","body","shouldRender","_React$useState","useState","_React$useState2","_slicedToArray","firstLoad","setFirstLoad","originUrl","environment","tealiumOrigin","slice","tealiumScriptBody","useEffect","script","innerHTML","appendChild","removeChild","wind","utag","data","utag_cfg_ovrd","noview","view","name","placeholder","placeholderName","moduels","scrolledto25","scrollTimer","scrollTimer2","timer","timerLogged","timerLogged2","scrolledto50","scrolledto75","scrolledto100","timer20Finsihed","timer50Finsihed","desktopHeights","ContactCard","desktop","mobile","Tags","MediaGrid","Footer","DetailsCardService","MediaVideo","MediaCarousel","SocialSharing","TestimonialMultipleMedia","TestimonialMedia","WizardTraining","DownloadSingle","AutoDownload","MediaAndCopy","BottomNavigation","UserGeneratedContent","GeneralCardIcon","GeneralCardIconMultiple","GeneralCardImage","GeneralCardImageMultiple","AccordionFAQ","BannerSmall","ServicesHeader","Tabs","EloquaForm","DynamicListingComponent","scrollEvent","undefined","deviceType","clientWidth","setTimeout","bodyHeightOnLoad","clientHeight","map","componentName","total_window_height","clearTimeout","scrollPercentRounded","scrollPercent","scrollY","innerHeight","Math","round","el","top","offsetTop","left","offsetLeft","width","offsetWidth","height","offsetHeight","offsetParent","pageYOffset","pageXOffset","innerWidth","isInViewport","addEventListener","removeEventListener","cssVars","shadowDOM","variables","getColorByTheme","Fragment","Helmet","rel","alternateUrls","lang","hrefLang","getAlternateUrls","getXDefault","JSON","stringify","Placeholder","rendering","LayoutFactory","appState","useAppStateContext","routeData","routeError","MainContainer","sitecoreContextData","NavBarContainer","_useAppStateContext","actions","navbar","dictionaryVenues","activeLanguage","languageCode","languageName","analytics","breadcrumbAnalytics","searchAnalytics","mainNav","removeVenueFromShortlistAnalytics","shareYourShortlistAnalytics","requestProposalAnalytics","yourShortlistedBottomAnalytics","yourShortlistedTopAnalytics","interactionWithVenueRPFormAnalytics","mainNavItems","primaryBrandLogo","logoWhiteImageLogo","primaryBrandLogoLink","secondaryBrandLogo","secondaryBrandLogoLink","menuLinks","isAnimate","venueShortlistVisible","setVenueShortlistVisible","Function","venueShortlists","activeLanguageName","dictionary","accessibilitySettings","targetItem","readSpeakerScriptPath","process","onContrastOptionSelected","onFontSizeSelected","languageSelector","currentPath","routePath","topNav","accessibilitySettingsTitle","globalLinks","breadcrumb","mobileLabel","search","login","CorpNavigationBar","CloseIcon","xmlns","fill","stroke","d","FooterContainer","loadable","Layout","sitecoreContext","alertBanner","showAlertBanner","setShowAlertBanner","isEmptyLayout","canonical","btnLabel","getGlobalDictionaryTerm","timing","eventAct","val","performance","navigationStart","domContentLoadedEventEnd","pageLoadTime","loadEventEnd","domLoadTime","performanceSpeedDetails","eventLab","URL","join","tealiumClickCustomFunc","event_name","event_cat","event_act","event_lab","page_load_time","dom_load_time","rtl","SkipContentButtons","className","text","dangerouslySetInnerHTML","__html","onClick","aria-label","Switch","routePattern","Route","component","ScrollToTop","offset","components","Map","componentFactory","has","set","AccordionCombo","AccordionGeneric","AccordionSteps","Articles","ArticlesFeatureCarousel","GeneralCardCompleteRound","GeneralCardIconCards","GeneralCardImageCards","RichText","OfferAndDeal","ListingOffersAndDeals","TabsHorizontal","StickyFooter","OfferAndDealDetails","OffersAndDealsTopPicks","HighlightBanner","Curators","SurpriseWizard","CategoryTiles","CTAVariation","InteractiveBanner","InteractiveMap","OverlayTiles","TabsCarouselComponentListing","StepCards","ComparisonTable","SectionDetail","WizardCategories","FeatureCardsList","Events","EventsFeatureCarousel","Itineraries","VideoTile","NewsCarousel","NewsPRs","POIs","CTAsList","SectionIntro","Statistics","CategoriesChildren","CategoriesSiblings","TabsWithAccordion","MultipleQuoteTestimonial","TestimonialCarousel","CuratorHeader","EventHeader","HeaderArticle1","HeaderCarousel","HeaderGenericPrimaryLeisure","HeaderGenericSecondary","HeaderGenericTertiary","HeaderListingPage","HeaderListingPagePersonalizable","HeaderMedia","WhatsonHeader","HeroPrimary","HeroSecondary","InsightsHeader","ItineraryCoverHeader","ItineraryDayViewHeader","PersonalizablePrimaryHeader","POIHeader","TimelineNavigationCompact","AnnouncementBanner","WidgetCurrencyConverter","AnchorItem","AnchorList","InteractiveGoogleMap","Loader","CardMultiple","CodeSnippet","CommonPageContainer","GenericPageContainer","DynamicPopup","EventsWidget","FlyDubaiWidget","HeaderForActivationPage","IdentifyTravelers","ListingServicesHeader","DeleteAccount","MainText","ManagedWidget","MultifunctionalCards","PopularCuisines","RecommendationListing","RedirectToReturnUrl","RestaurantsCarousel","RestaurantsHeadingAndContentBlock","RestaurantsListing","RestaurantsNavigation","RestaurantsSmallBanner","RichTextBubble","ScrollToBlock","SearchRestaurants","SurpriseMeForm","UnbelievableSummerDeals","WeatherWidget","RouteDataManager","resolvedRoute","resolvedLanguage","routerContext","resolveRouterRoute","useContext","__RouterContext","routeParams","sitecoreRoute","fromSSR","clearSSRFlag","fetchRoute","children","ComponentFactoryContextProvider","createContext","ComponentFactoryReactContext","Provider","withClientOnly","WrappedComponent","_useState","_useState2","isClient","setIsClient","log","siteKey","GoogleReCaptchaProvider","reCaptchaKey","container","parameters","badge","darkMode","useLocation","scrollTo","AppRoot","Router","pageEditing","Object","assign","captchaKey","DtcmUiComponentsSitecoreContext","ClientOnlyReCaptchaProvider","initialState","ssrRawJson","getElementById","ssrState","parse","matchedRoute","resolveRoutePath","resolveLanguageFromContextData","values","defaultLanguage","defaultLanguageName","resolveLanguageFromConfig","resolveLanguage","footer","downloadBox","newsletterForm","footerWeatherWidget","accessWidget","resolveInitialAppState","rootElement","ReactDOM","hydrate","render","AppStateProvider","routerProps","BrowserRouter","renderApp","dataFetcher","requestProps","method","fetch","then","response","status","statusText","json","routeDataLoading","formattedRoute","ensureLeadingSlash","fetchOptions","layoutServiceConfig","host","sitecoreApiHost","querystringParams","sc_lang","sc_apikey","sitecoreApiKey","sc_site","jssAppName","fetcher","dataApi","fetchRouteData","getRouteData","sitecoreData","sitecore","catch","currentState","AppStateContext","reducers","routeStateReducer","accessibilityStateReducer","_withDispatchLog","useReducerResult","getState","withDispatchLog","useReducer","initState","_withDispatchLog2","keys","forEach","actionResult","arguments","createAsyncCapableActions"],"mappings":"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","file":"static/js/main.141580e1.chunk.js","sourcesContent":["/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/bootstrap.js to modify the generation of this file.\nmodule.exports = {\n \"sitecoreApiKey\": \"{71FEFFB9-6CAA-4009-9F5C-EEAA63F3A94C}\",\n \"sitecoreApiHost\": \"\",\n \"jssAppName\": \"dotsite\",\n \"defaultLanguage\": \"en\",\n \"defaultLanguageName\": \"English\",\n \"defaultFontSize\": \"z100\",\n \"defaultContrast\": \"theme1\"\n};","import { ContrastSwitchOption } from '@dtcm/ui-components';\r\n\r\nexport interface State {\r\n selectedFontSize: string;\r\n selectedContrastValue: string;\r\n}\r\n\r\nexport interface Action {\r\n type: string;\r\n payload: any;\r\n error?: Error;\r\n}\r\n\r\nexport function reducer(state: State, action: Action) {\r\n switch (action.type) {\r\n case 'accessibility-settings-initialized': {\r\n return state;\r\n }\r\n case 'font-size-changed': {\r\n return { ...state, selectedFontSize: action.payload };\r\n }\r\n case 'contrast-value-changed': {\r\n return { ...state, selectedContrastValue: action.payload };\r\n }\r\n default: {\r\n return state;\r\n }\r\n }\r\n}\r\n\r\n// This function is a bit superfluous, but allows us to centralize the actions\r\n// associated with adjusting accessibility settings.\r\nexport const initializeAccessibilitySettings: InitializeAccessibilitySettingsFunction = ({\r\n contrast,\r\n fontSize,\r\n}) => {\r\n return (dispatch: any) => {\r\n setContrast({ theme: { value: contrast }, title: { value: '' } });\r\n setFontSize(fontSize);\r\n dispatch({\r\n type: 'accessibility-settings-initialized',\r\n });\r\n };\r\n};\r\n\r\nexport type InitializeAccessibilitySettingsFunction = ({\r\n contrast,\r\n fontSize,\r\n}: {\r\n contrast: string;\r\n fontSize: FontSize;\r\n}) => void;\r\n\r\nexport type FontSize = 'z100' | 'z150' | 'z200';\r\n\r\nexport const fontSizeClasses = ['z100', 'z150', 'z200'];\r\n\r\nexport type ChangeFontSizeFunction = (\r\n fontSize: FontSize\r\n) => (dispatch: any, getState?: any) => Promise | void;\r\n\r\nexport const changeFontSize: ChangeFontSizeFunction = (fontSize: FontSize) => {\r\n return (dispatch: any) => {\r\n setFontSize(fontSize);\r\n\r\n dispatch({\r\n type: 'font-size-changed',\r\n payload: fontSize,\r\n });\r\n };\r\n};\r\n\r\nconst setFontSize = (fontSize: FontSize) => {\r\n if (typeof window !== 'undefined') {\r\n document.querySelector('html')!.classList.remove(...fontSizeClasses);\r\n document.querySelector('html')!.classList.add(fontSize);\r\n\r\n storageManager.setFontSize(fontSize);\r\n }\r\n};\r\n\r\nexport type ChangeContrastFunction = (\r\n option: ContrastSwitchOption\r\n) => (dispatch: any, getState?: any) => Promise | void;\r\n\r\nexport const changeContrast: ChangeContrastFunction = (option: ContrastSwitchOption) => {\r\n return (dispatch: any) => {\r\n setContrast(option);\r\n dispatch({\r\n type: 'contrast-value-changed',\r\n payload: option.theme.value,\r\n });\r\n };\r\n};\r\n\r\nconst setContrast = (option: ContrastSwitchOption) => {\r\n if (typeof window !== 'undefined') {\r\n if (option.theme.value === 'theme1') {\r\n document.querySelector('body')!.classList.remove('contrast');\r\n } else if (option.theme.value === 'theme2') {\r\n document.querySelector('body')!.classList.add('contrast');\r\n }\r\n }\r\n\r\n storageManager.setContrast(option.theme.value);\r\n};\r\n\r\nexport function resolveAccessibilitySettings(config: any) {\r\n return {\r\n contrast: storageManager.getContrast() || config.defaultContrast,\r\n fontSize: storageManager.getFontSize() || config.defaultFontSize,\r\n };\r\n}\r\n\r\nexport const storageManager = {\r\n getFontSize: () => getItem('dtcm-font-size'),\r\n setFontSize: (value: string) => setItem('dtcm-font-size', value),\r\n getContrast: () => getItem('dtcm-contrast'),\r\n setContrast: (value: string) => setItem('dtcm-contrast', value),\r\n};\r\n\r\nfunction getItem(key: string) {\r\n if (typeof window !== 'undefined') {\r\n return window.localStorage.getItem(key);\r\n }\r\n return null;\r\n}\r\n\r\nfunction setItem(key: string, value: any) {\r\n if (typeof window !== 'undefined') {\r\n window.localStorage.setItem(key, value);\r\n }\r\n}\r\n","// Inspired by: https://stackoverflow.com/a/22129960/9324\r\n/**\r\n * Examples:\r\n * {\r\n * prop1: {\r\n * prop2: {\r\n * prop3: 'deep',\r\n * prop4: [\r\n * { prop5: 'deeper' }\r\n * ]\r\n * }\r\n * }\r\n * }\r\n * 'prop1.prop2.prop3' == 'deep'\r\n * 'prop1.prop2.prop4.0.prop5' == 'deeper'\r\n */\r\n\r\n// alias for lodash.get\r\nexport function get(obj: any, propPath: string, defaultValue?: any) {\r\n return getPropertyByPath(obj, propPath, defaultValue);\r\n}\r\n\r\nexport function getPropertyByPath(obj: any, propPath: string, defaultValue?: any) {\r\n return propPath.split('.').reduce((o, p) => (o && o[p]) || defaultValue, obj);\r\n}\r\nexport const canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);","import { matchPath, match } from 'react-router-dom';\r\n\r\n// support languages in the URL prefix\r\n// e.g. /fr-FR/path, or /en/path, or /path\r\nexport const routePatterns = [\r\n '/:lang([a-z]{2}-[A-Z]{2})/:sitecoreRoute*',\r\n '/:lang([a-z]{2})/:sitecoreRoute*',\r\n '/:sitecoreRoute*',\r\n];\r\n\r\nexport interface RouteParams {\r\n sitecoreRoute?: string;\r\n lang?: string;\r\n}\r\n\r\n// use react-router-dom to find the route matching the incoming URL\r\n// then return its match params\r\n// we are using .some() as a way to loop with a short circuit (so that we stop evaluating route patterns after the first match)\r\nexport const matchRoute = (route: string): match | null => {\r\n if (!route) {\r\n return null;\r\n }\r\n\r\n let result = null;\r\n\r\n routePatterns.some((pattern) => {\r\n const match = matchPath(route, { path: pattern });\r\n if (match && match.params) {\r\n result = match;\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n return result;\r\n};\r\n","import React from 'react';\r\n\r\nexport function Error({ error = {}, errorMessage = 'An error occurred: ' }) {\r\n return
{`${errorMessage}${error.toString()}`}
;\r\n}\r\n","import React from 'react';\r\nimport { SystemMessageBanner } from '@dtcm/ui-components';\r\n\r\nconst NotFoundContent: any = {\r\n en: {\r\n fields: {\r\n title: {\r\n value: 'Sorry, we couldn’t find that page',\r\n },\r\n description: {\r\n value: 'Please recheck the URL or return to the homepage.',\r\n },\r\n ctaLabel: {\r\n value: 'Return to home page',\r\n },\r\n ctaLink: {\r\n value: {\r\n href: '/',\r\n anchor: '',\r\n linktype: 'internal',\r\n class: '',\r\n title: '',\r\n querystring: '',\r\n id: '{A98A98BD-AF22-5239-A16E-DEEF268ED6A4}',\r\n },\r\n },\r\n colourTheme: {\r\n id: '3f7e5570-cd7e-46da-94e7-d9267e7791d1',\r\n url: '/SiteSettings/Theme/Colors/theme-1',\r\n fields: {\r\n backgroundColor: {\r\n value: '#0067b9',\r\n },\r\n themeName: {\r\n value: 'theme-1',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n ar: {\r\n fields: {\r\n title: {\r\n value: 'عذراً، الصفحة التي تُحاول الوصول إليها غير مُتاحة حاليّاً',\r\n },\r\n description: {\r\n value: 'الرجاء التحقّق من الرابط أو العودة إلى الصفحة الرئيسيّة',\r\n },\r\n ctaLabel: {\r\n value: 'العوده للصفحة الرئيسية',\r\n },\r\n ctaLink: {\r\n value: {\r\n href: '/',\r\n anchor: '',\r\n linktype: 'internal',\r\n class: '',\r\n title: '',\r\n querystring: '',\r\n id: '{A98A98BD-AF22-5239-A16E-DEEF268ED6A4}',\r\n },\r\n },\r\n colourTheme: {\r\n id: '3f7e5570-cd7e-46da-94e7-d9267e7791d1',\r\n url: '/SiteSettings/Theme/Colors/theme-1',\r\n fields: {\r\n backgroundColor: {\r\n value: '#0067b9',\r\n },\r\n themeName: {\r\n value: 'theme-1',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport interface NotFoundProps {\r\n context: {\r\n language: string;\r\n };\r\n}\r\n\r\nexport const NotFound: React.FunctionComponent = ({ context }) => {\r\n const langauge = context && context.language ? context.language : 'en';\r\n const props = NotFoundContent[langauge];\r\n return ;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\nimport Helmet from 'react-helmet';\r\nimport { Placeholder } from '@sitecore-jss/sitecore-jss-react';\r\nimport { get, canUseDOM } from '../../lib/getPropertyByPath';\r\nimport {getColorByTheme} from \"@dtcm/ui-components/dist/utils/index\";\r\nimport cssVars from 'css-vars-ponyfill';\r\n\r\nconst useScript = (body: string, shouldRender: boolean) => {\r\n React.useEffect(() => {\r\n let script: any;\r\n //let prefixScript: any;\r\n\r\n if (shouldRender) {\r\n script = document.createElement('script');\r\n script.innerHTML = body;\r\n\r\n document.body.appendChild(script);\r\n\r\n /* prefixScript = document.createElement('script');\r\n prefixScript.innerHTML = 'window.prefix = \"dotprod93\"';\r\n document.body.appendChild(prefixScript);*/\r\n }\r\n\r\n return () => {\r\n if (shouldRender) {\r\n document.body.removeChild(script);\r\n }\r\n };\r\n }, [body, shouldRender]);\r\n};\r\n\r\nexport interface MainContainerProps extends RouteComponentProps {\r\n context: {\r\n origin: string;\r\n language: string;\r\n tealium: {\r\n originUrl: string;\r\n environment: string;\r\n };\r\n disablePageIndexing: boolean;\r\n };\r\n route: {\r\n name: string;\r\n itemId: string;\r\n templateName: string;\r\n fields: {\r\n browserTitle: {\r\n value: string;\r\n };\r\n };\r\n };\r\n}\r\n\r\nconst resolvePageTitle = (route: any) => {\r\n let pageTitle = get(route, 'fields.browserTitle.value');\r\n if (!pageTitle || pageTitle === '$name') {\r\n pageTitle = get(route, 'fields.pageTitle.value');\r\n }\r\n return pageTitle;\r\n};\r\n\r\nconst getOriginUrl = (context: any) => {\r\n let origin = get(context, 'origin');\r\n if (origin.endsWith('/')) origin += '/';\r\n return origin;\r\n};\r\n\r\nconst resolveCanonicalUrl = (context: any, location: any) => {\r\n const path = location && location.pathname ? location.pathname : '/';\r\n return `${getOriginUrl(context)}${path}`;\r\n};\r\n\r\n// TODO: refactor this because this function is a quick fix for\r\n// \r\n// and where it is used the alternateUrl is \"any\"\r\nconst getAlternateUrl = (context: any, alternateUrl: { url: string }) => {\r\n const origin = getOriginUrl(context);\r\n const url = alternateUrl.url;\r\n\r\n if (url.toLowerCase().startsWith(origin.toLowerCase())) {\r\n return `${origin}${url.substring(origin.length)}`;\r\n }\r\n\r\n return `${origin}${url}`;\r\n};\r\n\r\nconst renderProperties = (prefix: string, queryString: string) => {\r\n if (!queryString) {\r\n return null;\r\n }\r\n if (!prefix) {\r\n return null;\r\n }\r\n const properties = [];\r\n const parts = queryString.split('&');\r\n for (let i = 0; i < parts.length; i++) {\r\n const pair = parts[i].split('=');\r\n properties.push(\r\n \r\n );\r\n }\r\n\r\n return properties;\r\n};\r\n\r\nconst getAlternateUrls = (context: any) => {\r\n const alternateUrls = get(context, 'alternateUrls');\r\n if (!alternateUrls) {\r\n return null;\r\n }\r\n const alternateUrlTags = alternateUrls.map((alternateUrl: any) => {\r\n return (\r\n \r\n );\r\n });\r\n // alternateUrlTags.push(\r\n // \r\n // );\r\n return alternateUrlTags;\r\n};\r\n\r\nconst getXDefault = (context: any) => {\r\n const alternateUrls = get(context, 'alternateUrls');\r\n if (!alternateUrls) {\r\n return null;\r\n }\r\n const alternateUrlTags = alternateUrls.map((alternateUrl: any) => {\r\n if (alternateUrl.lang === 'en') {\r\n return ;\r\n } else {\r\n return '';\r\n }\r\n });\r\n\r\n return alternateUrlTags;\r\n};\r\n\r\nconst isInViewport = (el: any) => {\r\n if (!el) {\r\n return false;\r\n }\r\n var top = el.offsetTop;\r\n var left = el.offsetLeft;\r\n var width = el.offsetWidth;\r\n var height = el.offsetHeight;\r\n\r\n while (el.offsetParent) {\r\n el = el.offsetParent;\r\n top += el.offsetTop;\r\n left += el.offsetLeft;\r\n }\r\n\r\n return (\r\n top < window.pageYOffset + window.innerHeight &&\r\n left < window.pageXOffset + window.innerWidth &&\r\n top + height > window.pageYOffset &&\r\n left + width > window.pageXOffset\r\n );\r\n};\r\n\r\nconst MainContainer: React.FunctionComponent = ({ route, location, context }) => {\r\n const pageTitle = resolvePageTitle(route);\r\n const pageDescription = get(route, 'fields.metaDescription.value');\r\n const pageUrl = resolveCanonicalUrl(context, location);\r\n const ogTitle = get(route, 'fields.og-title.value');\r\n const ogDescription = get(route, 'fields.og-description.value');\r\n const ogImage = get(route, 'fields.og-image.value.src');\r\n const twitterTitle = get(route, 'fields.twitter-title.value');\r\n const twitterDescription = get(route, 'fields.twitter-description.value');\r\n\r\n const { itemId, templateName } = route;\r\n const { language, tealium, disablePageIndexing } = context;\r\n\r\n const browserLanguage = typeof navigator !== 'undefined' ? navigator.language : '';\r\n\r\n const utag_data = {\r\n page_id: itemId,\r\n page_name: templateName,\r\n page_language: language,\r\n template: templateName,\r\n pillar: get(route, 'fields.pillar.value'),\r\n content_type: get(route, 'fields.contentType.value'),\r\n persona: get(route, 'fields.persona.value'),\r\n page_location: pageUrl,\r\n page_title: pageTitle,\r\n page_path: location.pathname,\r\n page_browser_language: browserLanguage,\r\n };\r\n\r\n if (!tealium) {\r\n console.warn('tealium settings are not provided');\r\n }\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n const originUrl = get(tealium, 'originUrl', '');\r\n const environment = get(tealium, 'environment', '');\r\n const tealiumOrigin = originUrl.endsWith('/') ? originUrl.slice(0, -1) : originUrl;\r\n const tealiumScriptBody = `(function(a,b,c,d){a=\"${tealiumOrigin}/dubaitourism.gov.ae/${environment}/utag.js\";b=document;c=\"script\";d=b.createElement(c);d.src=a;d.type=\"text/java\"+c;d.async=true;a=b.getElementsByTagName(c)[0];a.parentNode.insertBefore(d,a);})();`;\r\n // usejQuery(tealiumScriptBody, false);\r\n useScript(tealiumScriptBody, true);\r\n useEffect(() => {\r\n const wind = window as any;\r\n if (wind) {\r\n wind.utag_data = {\r\n ...wind.utag_data,\r\n ...utag_data,\r\n };\r\n }\r\n }, []);\r\n useEffect(() => {\r\n const wind = window as any;\r\n const utag = wind.utag;\r\n\r\n if (wind && utag) {\r\n utag.data = {\r\n ...utag.data,\r\n ...utag_data,\r\n };\r\n wind.utag_data = {\r\n ...wind.utag_data,\r\n ...utag_data,\r\n };\r\n\r\n wind.utag.utag_cfg_ovrd = wind.utag.utag_cfg_ovrd || {}; //Make sure we don't kill a previous decleration of the object\r\n wind.utag.utag_cfg_ovrd.noview = true;\r\n if(!firstLoad) {\r\n utag.view(wind.utag_data);\r\n\r\n } else {\r\n setFirstLoad(false)\r\n\r\n }\r\n }\r\n }, [route.name]);\r\n\r\n useEffect(() => {\r\n\r\n const placeholder = get(route, 'placeholders.dot-root', []);\r\n const placeholderName = get(placeholder[0], `params.bodyPlaceholderName`);\r\n\r\n const moduels = get(placeholder[0], `placeholders.${placeholderName}`)\r\n let scrolledto25 = false;\r\n let scrollTimer: any = 0;\r\n let scrollTimer2: any = 0;\r\n let timer: any = 0;\r\n\r\n let timerLogged = false;\r\n let timerLogged2 = false;\r\n let scrolledto50 = false;\r\n let scrolledto75 = false;\r\n let scrolledto100 = false;\r\n\r\n let timer20Finsihed = false;\r\n let timer50Finsihed = false;\r\n const desktopHeights: any = {\r\n ContactCard: {\r\n desktop: 740,\r\n mobile: 991,\r\n },\r\n\r\n Tags: {\r\n desktop: 140,\r\n mobile: 178,\r\n },\r\n\r\n MediaGrid: {\r\n desktop: 1000,\r\n mobile: 2040,\r\n },\r\n Footer: {\r\n desktop: 600,\r\n mobile: 1050,\r\n },\r\n\r\n DetailsCardService: {\r\n desktop: 369,\r\n mobile: 585,\r\n },\r\n MediaVideo: {\r\n desktop: 740,\r\n mobile: 350,\r\n },\r\n\r\n MediaCarousel: {\r\n desktop: 795,\r\n mobile: 380,\r\n },\r\n SocialSharing: {\r\n desktop: 126,\r\n mobile: 146,\r\n },\r\n TestimonialMultipleMedia: {\r\n desktop: 414,\r\n mobile: 663,\r\n },\r\n TestimonialMedia: {\r\n desktop: 414,\r\n mobile: 663,\r\n },\r\n WizardTraining: {\r\n desktop: 654,\r\n mobile: 562,\r\n },\r\n DownloadSingle: {\r\n desktop: 242,\r\n mobile: 231,\r\n },\r\n AutoDownload: {\r\n desktop: 104,\r\n mobile: 104,\r\n },\r\n\r\n MediaAndCopy: {\r\n desktop: 456,\r\n mobile: 677,\r\n },\r\n\r\n BottomNavigation: {\r\n desktop: 224,\r\n mobile: 288,\r\n },\r\n\r\n UserGeneratedContent: {\r\n desktop: 358,\r\n mobile: 358,\r\n },\r\n\r\n GeneralCardIcon: {\r\n desktop: 335,\r\n mobile: 315,\r\n },\r\n GeneralCardIconMultiple: {\r\n desktop: 494,\r\n mobile: 365,\r\n },\r\n GeneralCardImage: {\r\n desktop: 554,\r\n mobile: 571,\r\n },\r\n GeneralCardImageMultiple: {\r\n desktop: 738,\r\n mobile: 751,\r\n },\r\n\r\n AccordionFAQ: {\r\n desktop: 400,\r\n mobile: 358,\r\n },\r\n BannerSmall: {\r\n desktop: 456,\r\n mobile: 360,\r\n },\r\n ServicesHeader: {\r\n desktop: 655,\r\n mobile: 550,\r\n },\r\n Tabs: {\r\n desktop: 558,\r\n mobile: 550,\r\n },\r\n EloquaForm: {\r\n desktop: 770,\r\n mobile: 820,\r\n },\r\n DynamicListingComponent: {\r\n desktop: 1740,\r\n mobile: 3700,\r\n },\r\n };\r\n let scrollEvent: any = undefined;\r\n\r\n if (canUseDOM) {\r\n const deviceType = document.body.clientWidth <= 767 ? 'mobile' : 'desktop';\r\n timer = setTimeout(() => {\r\n let bodyHeightOnLoad = document.body.clientHeight + desktopHeights.Footer[deviceType];\r\n moduels && moduels.map((module: any) => {\r\n if (moduels.length === 1) {\r\n bodyHeightOnLoad = document.body.clientHeight;\r\n }\r\n\r\n if (desktopHeights[module.componentName]) {\r\n bodyHeightOnLoad += desktopHeights[module.componentName][deviceType];\r\n }\r\n });\r\n console.warn('final body height', bodyHeightOnLoad);\r\n const wind = window as any;\r\n if (wind) {\r\n wind.utag_data = {\r\n ...wind.utag_data,\r\n ...utag_data,\r\n total_window_height: `${bodyHeightOnLoad}`,\r\n };\r\n }\r\n clearTimeout(scrollTimer);\r\n clearTimeout(scrollTimer2);\r\n let scrollPercentRounded = 0;\r\n\r\n scrollEvent = () => {\r\n let scrollTop = window.scrollY;\r\n let docHeight = bodyHeightOnLoad;\r\n let winHeight = window.innerHeight;\r\n let scrollPercent = scrollTop / (docHeight - winHeight);\r\n scrollPercentRounded = Math.round(scrollPercent * 100);\r\n console.warn('scrollPercentRounded', scrollPercentRounded);\r\n if (scrollPercentRounded >= 25) {\r\n if (!scrolledto25) {\r\n scrolledto25 = true;\r\n\r\n if (get(window, 'SC_Scoll_Function')) {\r\n get(window, 'SC_Scoll_Function')('25');\r\n }\r\n if (timer20Finsihed) {\r\n if (get(window, 'SC_Scoll_Time_Function1')) {\r\n get(window, 'SC_Scoll_Time_Function1')(scrollPercentRounded, '20');\r\n }\r\n }\r\n }\r\n }\r\n if (scrollPercentRounded >= 50) {\r\n if (!scrolledto50) {\r\n scrolledto50 = true;\r\n\r\n if (get(window, 'SC_Scoll_Function')) {\r\n get(window, 'SC_Scoll_Function')('50');\r\n }\r\n\r\n if (timer50Finsihed) {\r\n if (get(window, 'SC_Scoll_Time_Function1')) {\r\n get(window, 'SC_Scoll_Time_Function1')(\r\n scrollPercentRounded > 100 ? 100 : scrollPercentRounded,\r\n '30'\r\n );\r\n }\r\n }\r\n\r\n // clearTimeout(scrollTimer);\r\n }\r\n }\r\n if (scrollPercentRounded >= 75) {\r\n if (!scrolledto75) {\r\n scrolledto75 = true;\r\n\r\n if (get(window, 'SC_Scoll_Function')) {\r\n get(window, 'SC_Scoll_Function')('75');\r\n }\r\n }\r\n }\r\n\r\n if (isInViewport(document.querySelector('.footer__bottom'))) {\r\n if (!scrolledto100) {\r\n scrolledto100 = true;\r\n\r\n if (get(window, 'SC_Scoll_Function')) {\r\n get(window, 'SC_Scoll_Function')('100');\r\n }\r\n }\r\n }\r\n };\r\n\r\n scrollTimer = setTimeout(() => {\r\n timer20Finsihed = true;\r\n if (!timerLogged) {\r\n if (scrolledto25) {\r\n timer20Finsihed = false;\r\n if (get(window, 'SC_Scoll_Time_Function1')) {\r\n get(window, 'SC_Scoll_Time_Function1')(scrollPercentRounded, '20');\r\n }\r\n\r\n timerLogged = true;\r\n clearTimeout(scrollTimer);\r\n }\r\n } else {\r\n clearTimeout(scrollTimer);\r\n }\r\n }, 20 * 1000);\r\n scrollTimer2 = setTimeout(() => {\r\n timer50Finsihed = true;\r\n if (!timerLogged2) {\r\n if (scrolledto50) {\r\n timer50Finsihed = false;\r\n if (get(window, 'SC_Scoll_Time_Function1')) {\r\n get(window, 'SC_Scoll_Time_Function1')(\r\n scrollPercentRounded > 100 ? 100 : scrollPercentRounded,\r\n '30'\r\n );\r\n }\r\n timerLogged2 = true;\r\n clearTimeout(scrollTimer2);\r\n }\r\n } else {\r\n clearTimeout(scrollTimer2);\r\n }\r\n }, 30 * 1000);\r\n window.addEventListener('scroll', scrollEvent);\r\n }, 3000);\r\n }\r\n return () => {\r\n window.removeEventListener('scroll', scrollEvent);\r\n clearTimeout(timer);\r\n\r\n clearTimeout(scrollTimer);\r\n clearTimeout(scrollTimer2);\r\n };\r\n }, [route.name]);\r\n cssVars({\r\n shadowDOM: true,\r\n variables: {\r\n '--site-color': '#005F66',\r\n '--site-color-2': '#005F66',\r\n '--main-color': '#005F66',\r\n '--main-color--active': '#115E67',\r\n '--main-color-text': `${getColorByTheme('#005F66')}`,\r\n '--main-color--active-2': '#115E67',\r\n '--site-active-color': '#115E67',\r\n '--greyscale': '#505050',\r\n '--site-font-family': `'Dubai', 'Arial', sans-serif`\r\n }\r\n });\r\n return (\r\n \r\n \r\n {pageTitle}\r\n \r\n \r\n \r\n {disablePageIndexing ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n {renderProperties('fb', get(route, 'fields.facebook-properties.value'))}\r\n {renderProperties('twitter', get(route, 'fields.twitter-properties.value'))}\r\n {getAlternateUrls(context)}\r\n {getXDefault(context)}\r\n\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default withRouter(MainContainer);\r\n","import React from 'react';\r\nimport { useAppStateContext } from '../../lib/AppStateProvider';\r\nimport { Error } from './Error';\r\nimport { NotFound } from './NotFound';\r\nimport MainContainer from './MainContainer';\r\n\r\nexport function LayoutFactory() {\r\n const { appState } = useAppStateContext();\r\n \r\n const { routeData, routeError } = appState;\r\n\r\n if (routeError) {\r\n return ;\r\n }\r\n if (routeData) {\r\n return ;\r\n }\r\n\r\n // no route data for the current route in Sitecore - show not found component.\r\n // Note: this is client-side only 404 handling. Server-side 404 handling is the responsibility\r\n // of the server being used (i.e. node-headless-ssr-proxy and Sitecore intergrated rendering know how to send 404 status codes).\r\n return ;\r\n}\r\n","import React from 'react';\r\nimport { CorpNavigationBar, CorpNavigationBarProps } from '@dtcm/ui-components';\r\nimport { useAppStateContext } from '../../lib/AppStateProvider';\r\nimport { get } from '../../lib/getPropertyByPath';\r\n\r\nexport const NavBarContainer = () => {\r\n const { appState, actions } = useAppStateContext();\r\n if (!appState.navbar || get(appState, 'dictionary.viewBag.isEmptyLayout', false)) {\r\n return null;\r\n }\r\n\r\n const dictionaryVenues = get(appState, 'dictionary.viewBag.navbar.venueFormsDictionary');\r\n\r\n const activeLanguage = {\r\n languageCode: get(appState, \"language.languageCode\"),\r\n languageName: get(appState, \"language.languageName\"),\r\n };\r\n // Also provide functions to handle actions triggered within the NavBar.\r\n const props: CorpNavigationBarProps = {\r\n activeLanguage,\r\n analytics: get(appState, 'analytics'),\r\n breadcrumbAnalytics: get(appState, 'sitecoreContextData.breadcrumbAnalytics'),\r\n searchAnalytics: get(appState, 'sitecoreContextData.searchAnalytics'),\r\n mainNav: {\r\n removeVenueFromShortlistAnalytics: get(appState, 'dictionary.viewBag.navbar.removeVenueFromShortlistAnalytics'),\r\n shareYourShortlistAnalytics: get(appState, 'dictionary.viewBag.navbar.shareYourShortlistAnalytics'),\r\n requestProposalAnalytics: get(appState, 'dictionary.viewBag.navbar.requestProposalAnalytics'),\r\n yourShortlistedBottomAnalytics: get(appState, 'dictionary.viewBag.navbar.yourShortlistedBottomAnalytics'),\r\n yourShortlistedTopAnalytics: get(appState, 'dictionary.viewBag.navbar.yourShortlistedTopAnalytics'),\r\n interactionWithVenueRPFormAnalytics: get(appState, 'dictionary.viewBag.navbar.interactionWithVenueRPFormAnalytics'),\r\n\r\n mainNavItems: get(appState, 'navbar.mainNavItems'),\r\n // primaryBrandLogo: get(appState, 'navbar.primaryBrandLogo'),\r\n primaryBrandLogo: get(appState, 'navbar.logoImage'), \r\n logoWhiteImageLogo: get(appState, 'navbar.logoWhiteImage'),\r\n primaryBrandLogoLink: get(appState, 'navbar.primaryBrandLogoLink'),\r\n // secondaryBrandLogo: get(appState, 'navbar.secondaryBrandLogo'),\r\n secondaryBrandLogo: get(appState, 'navbar.secondLogoImage'),\r\n secondaryBrandLogoLink: get(appState, 'navbar.secondaryBrandLogoLink'),\r\n menuLinks: get(appState, 'navbar.menuLinks'),\r\n isAnimate: false, \r\n venueShortlistVisible:false,\r\n setVenueShortlistVisible: Function,\r\n venueShortlists: [],\r\n activeLanguageName: activeLanguage.languageName,\r\n },\r\n dictionary: {\r\n dictionaryVenues,\r\n },\r\n accessibilitySettings: {\r\n targetItem: get(appState, 'navbar.accessibilitySettings.targetItem'),\r\n selectedContrastValue: appState.selectedContrastValue,\r\n selectedFontSize: appState.selectedFontSize,\r\n readSpeakerScriptPath: `${process.env.PUBLIC_URL}/assets/scripts`,\r\n onContrastOptionSelected: (option) => actions.changeContrast(option),\r\n onFontSizeSelected: (fontSize: any) => actions.changeFontSize(fontSize),\r\n },\r\n languageSelector: {\r\n targetItem: get(appState, 'navbar.languageSelector.targetItem'),\r\n activeLanguage,\r\n currentPath: appState.routePath,\r\n },\r\n topNav: {\r\n accessibilitySettingsTitle: get(appState, 'navbar.accessibilitySettings.targetItem.title.value', ''),\r\n globalLinks: get(appState, 'navbar.globalLinks'),\r\n activeLanguageName: activeLanguage.languageName,\r\n },\r\n breadcrumb: {\r\n mobileLabel: get(appState, 'navbar.mobileBreadcrumbLabel.value.value'),\r\n },\r\n search: {\r\n targetItem: get(appState, 'navbar.search.targetItem'),\r\n },\r\n login: {title: ''}\r\n };\r\n\r\n return ;\r\n};\r\n","import React from 'react';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport Helmet from 'react-helmet';\r\nimport loadable from 'react-loadable-visibility/loadable-components';\r\nimport { routePatterns } from './lib/routerUtils';\r\nimport { LayoutFactory } from './components/Layouts/LayoutFactory';\r\nimport { useAppStateContext } from './lib/AppStateProvider';\r\nimport { NavBarContainer } from './components/Header/NavBarContainer';\r\nimport { ScrollToTop, tealiumClickCustomFunc } from '@dtcm/ui-components';\r\nimport { get, canUseDOM } from './lib/getPropertyByPath';\r\nimport { getGlobalDictionaryTerm } from '@dtcm/ui-components/dist/utils';\r\nimport { SkipContentButtons } from '@dtcm/ui-components';\r\n\r\nconst CloseIcon = () => \r\n \r\n;\r\n\r\nconst FooterContainer: any = loadable(() =>\r\n import(/* webpackChunkName: \"FooterContainer\" */ './components/Footer/FooterContainer')\r\n);\r\n\r\n/*\r\n APP LAYOUT\r\n This is where the app's HTML \"shell\" should be defined.\r\n\r\n All routes share this root layout by default,\r\n but components added to inner placeholders are route-specific.\r\n*/\r\n\r\nfunction Layout() {\r\n const { appState } = useAppStateContext();\r\n const sitecoreContext = appState.sitecoreContextData;\r\n const alertBanner = get(sitecoreContext, 'configuration.alertBanner');\r\n const [showAlertBanner, setShowAlertBanner] = React.useState(true);\r\n const isEmptyLayout = get(appState, 'dictionary.viewBag.isEmptyLayout', false);\r\n const breadcrumb = get(appState, 'sitecoreContextData.breadcrumb', []);\r\n const canonical = get(appState, 'sitecoreContextData.canonical', '');\r\n const btnLabel: string = getGlobalDictionaryTerm(sitecoreContext, 'closeAnnouncementBannerLabel') || \"Close announcement banner\";\r\n const timing = canUseDOM ? get(window, 'performance.timing', {}) : {};\r\n const performanceSpeedDetails = () => {\r\n if (typeof performance !== 'undefined') {\r\n const { navigationStart, domContentLoadedEventEnd, loadEventEnd } = timing;\r\n const pageLoadTime = (loadEventEnd - navigationStart) / 1000;\r\n const domLoadTime = (domContentLoadedEventEnd - navigationStart) / 1000;\r\n\r\n if (pageLoadTime > 0) {\r\n return {pageLoadTime, domLoadTime};\r\n } else {\r\n return {};\r\n }\r\n } else {\r\n return {};\r\n }\r\n };\r\n\r\n React.useEffect(() => {\r\n let eventAct = '';\r\n\r\n if (breadcrumb.length > 1) {\r\n const [, val] = breadcrumb;\r\n eventAct = get(val, 'label', '');\r\n } else if (breadcrumb.length === 1) {\r\n const [val] = breadcrumb;\r\n eventAct = get(val, 'label', '');\r\n }\r\n setTimeout(() => {\r\n const {pageLoadTime, domLoadTime} = performanceSpeedDetails() || {};\r\n if (pageLoadTime && domLoadTime) {\r\n const { pathname } = new URL(canonical);\r\n const eventLab = pathname.split('/').slice(2).join('/');\r\n tealiumClickCustomFunc({\r\n event_name: 'eventTracker',\r\n event_cat: 'Modules',\r\n event_act: eventAct,\r\n event_lab: eventLab,\r\n page_load_time: pageLoadTime,\r\n dom_load_time: domLoadTime,\r\n }, {} as any);\r\n }\r\n }, 500);\r\n\r\n }, [\r\n timing!.domContentLoadedEventEnd,\r\n timing!.navigationStart,\r\n timing!.loadEventEnd,\r\n canUseDOM\r\n ]);\r\n\r\n return (\r\n \r\n {/* react-helmet enables setting contents, like title and OG meta tags */}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {alertBanner && alertBanner.text && showAlertBanner ? (\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n ) : null}\r\n \r\n
\r\n
\r\n \r\n {routePatterns.map((routePattern) => (\r\n \r\n ))}\r\n \r\n {!isEmptyLayout && }\r\n
\r\n
\r\n {/*\r\n We need to provide content for the loading placeholder used for the footer. This ensures\r\n that the dynamic loading script triggers for the Footer component. Without any content, it\r\n seems that the IntersectionObserver never intersects with the Footer component and therefore\r\n the dynamic loading script doesn't load the component.\r\n\r\n NOTE: most components will not need content in order for dynamic loading to work. The Footer\r\n seems to be more of an edge case.\r\n */}\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default Layout;\r\n","import loadable from 'react-loadable-visibility/loadable-components'; \r\n\r\n// Do not modify anything within the `` comments.\r\n// The content within those comments is automatically generated by\r\n// the `/scripts/generate-component-factory.js` script.\r\n\r\n// \n\n\nimport {\nAccordionCombo,\nAccordionFAQ,\nAccordionGeneric,\nAccordionSteps,\nArticles,\nArticlesFeatureCarousel,\nSystemMessageBanner,\nGeneralCardCompleteRound,\nGeneralCardIconCards,\nGeneralCardImageCards,\nRichText,\nOfferAndDeal,\nListingOffersAndDeals,\nTabsHorizontal,\nStickyFooter,\nOfferAndDealDetails,\nOffersAndDealsTopPicks,\nHighlightBanner,\nCurators,\nSurpriseWizard,\nCategoryTiles,\nCTAVariation,\nInteractiveBanner,\nInteractiveMap,\nOverlayTiles,\nTabsCarouselComponentListing,\nStepCards,\nComparisonTable,\nSectionDetail,\nWizardCategories,\nFeatureCardsList,\nEvents,\nEventsFeatureCarousel,\nItineraries,\nVideoTile,\nNewsCarousel,\nNewsPRs,\nPOIs,\nCTAsList,\nSectionIntro,\nStatistics,\nCategoriesChildren,\nCategoriesSiblings,\nTabs,\nTabsWithAccordion,\nMultipleQuoteTestimonial,\nTestimonialCarousel,\nCuratorHeader,\nEventHeader,\nHeaderArticle1,\nHeaderCarousel,\nHeaderGenericPrimaryLeisure,\nHeaderGenericSecondary,\nHeaderGenericTertiary,\nHeaderListingPage,\nHeaderListingPagePersonalizable,\nHeaderMedia,\nWhatsonHeader,\nHeroPrimary,\nHeroSecondary,\nInsightsHeader,\nItineraryCoverHeader,\nItineraryDayViewHeader,\nPersonalizablePrimaryHeader,\nPOIHeader,\nTimelineNavigationCompact,\nAnnouncementBanner,\nWidgetCurrencyConverter,\nAnchorItem,\nAnchorList,\nInteractiveGoogleMap,\nLoader,\nCardMultiple,\nCodeSnippet,\nCommonPageContainer,\nGenericPageContainer,\nDynamicPopup,\nEventsWidget,\nFlyDubaiWidget,\nHeaderForActivationPage,\nIdentifyTravelers,\nListingServicesHeader,\nDeleteAccount,\nMainText,\nManagedWidget,\nMultifunctionalCards,\nPopularCuisines,\nRecommendationListing,\nRedirectToReturnUrl,\nRestaurantsCarousel,\nRestaurantsHeadingAndContentBlock,\nRestaurantsListing,\nRestaurantsNavigation,\nRestaurantsSmallBanner,\nRichTextBubble,\nScrollToBlock,\nSearchRestaurants,\nSkipContentButtons,\nSurpriseMeForm,\nUnbelievableSummerDeals,\nWeatherWidget\n} from '@dtcm/ui-components';\nconst components = new Map();\ncomponents.set('AccordionCombo', AccordionCombo);\ncomponents.set('AccordionFAQ', AccordionFAQ);\ncomponents.set('AccordionGeneric', AccordionGeneric);\ncomponents.set('AccordionSteps', AccordionSteps);\ncomponents.set('Articles', Articles);\ncomponents.set('ArticlesFeatureCarousel', ArticlesFeatureCarousel);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorArticles', loadable(() => import(/* webpackChunkName: \"CuratorArticles\" */'@dtcm/ui-components/dist/components/02_CuratorArticles/CuratorArticles')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('AnchorNavigation', loadable(() => import(/* webpackChunkName: \"AnchorNavigation\" */'@dtcm/ui-components/dist/components/03_AnchorNavigation/AnchorNavigation')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('AudioPlayer', loadable(() => import(/* webpackChunkName: \"AudioPlayer\" */'@dtcm/ui-components/dist/components/04_Audio/AudioPlayer')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BannerLarge', loadable(() => import(/* webpackChunkName: \"BannerLarge\" */'@dtcm/ui-components/dist/components/05_BannerLarge/BannerLarge')))\ncomponents.set('SystemMessageBanner', SystemMessageBanner);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BannerSmall', loadable(() => import(/* webpackChunkName: \"BannerSmall\" */'@dtcm/ui-components/dist/components/05_BannerSmall/BannerSmall')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeatMap', loadable(() => import(/* webpackChunkName: \"HeatMap\" */'@dtcm/ui-components/dist/components/06_HeatMap/HeatMap')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Table', loadable(() => import(/* webpackChunkName: \"Table\" */'@dtcm/ui-components/dist/components/06_Table/Table')))\ncomponents.set('GeneralCardCompleteRound', GeneralCardCompleteRound);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('GeneralCardIcon', loadable(() => import(/* webpackChunkName: \"GeneralCardIcon\" */'@dtcm/ui-components/dist/components/07_GeneralCardIcon/GeneralCardIcon')))\ncomponents.set('GeneralCardIconCards', GeneralCardIconCards);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('GeneralCardIconMultiple', loadable(() => import(/* webpackChunkName: \"GeneralCardIconMultiple\" */'@dtcm/ui-components/dist/components/07_GeneralCardIconMultiple/GeneralCardIconMultiple')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('GeneralCardImage', loadable(() => import(/* webpackChunkName: \"GeneralCardImage\" */'@dtcm/ui-components/dist/components/07_GeneralCardImage/GeneralCardImage')))\ncomponents.set('GeneralCardImageCards', GeneralCardImageCards);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('GeneralCardImageMultiple', loadable(() => import(/* webpackChunkName: \"GeneralCardImageMultiple\" */'@dtcm/ui-components/dist/components/07_GeneralCardImageMultiple/GeneralCardImageMultiple')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('SubcategoriesCompleteMultiple', loadable(() => import(/* webpackChunkName: \"SubcategoriesCompleteMultiple\" */'@dtcm/ui-components/dist/components/07_SubcategoriesCompleteMultiple/SubcategoriesCompleteMultiple')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ContactCard', loadable(() => import(/* webpackChunkName: \"ContactCard\" */'@dtcm/ui-components/dist/components/08_ContactCard/ContactCard')))\ncomponents.set('RichText', RichText);\ncomponents.set('OfferAndDeal', OfferAndDeal);\ncomponents.set('ListingOffersAndDeals', ListingOffersAndDeals);\ncomponents.set('TabsHorizontal', TabsHorizontal);\ncomponents.set('StickyFooter', StickyFooter);\ncomponents.set('OfferAndDealDetails', OfferAndDealDetails);\ncomponents.set('OffersAndDealsTopPicks', OffersAndDealsTopPicks);\ncomponents.set('HighlightBanner', HighlightBanner);\ncomponents.set('Curators', Curators);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ProfileCards', loadable(() => import(/* webpackChunkName: \"ProfileCards\" */'@dtcm/ui-components/dist/components/10_ProfileCards/ProfileCards')))\ncomponents.set('SurpriseWizard', SurpriseWizard);\ncomponents.set('CategoryTiles', CategoryTiles);\ncomponents.set('CTAVariation', CTAVariation);\ncomponents.set('InteractiveBanner', InteractiveBanner);\ncomponents.set('InteractiveMap', InteractiveMap);\ncomponents.set('OverlayTiles', OverlayTiles);\ncomponents.set('TabsCarouselComponentListing', TabsCarouselComponentListing);\ncomponents.set('StepCards', StepCards);\ncomponents.set('ComparisonTable', ComparisonTable);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Download', loadable(() => import(/* webpackChunkName: \"Download\" */'@dtcm/ui-components/dist/components/12_Download/Download')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('DownloadSingle', loadable(() => import(/* webpackChunkName: \"DownloadSingle\" */'@dtcm/ui-components/dist/components/12_DownloadSingle/DownloadSingle')))\ncomponents.set('SectionDetail', SectionDetail);\ncomponents.set('WizardCategories', WizardCategories);\ncomponents.set('FeatureCardsList', FeatureCardsList);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorEvents', loadable(() => import(/* webpackChunkName: \"CuratorEvents\" */'@dtcm/ui-components/dist/components/15_CuratorEvents/CuratorEvents')))\ncomponents.set('Events', Events);\ncomponents.set('EventsFeatureCarousel', EventsFeatureCarousel);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('EloquaForm', loadable(() => import(/* webpackChunkName: \"EloquaForm\" */'@dtcm/ui-components/dist/components/19_EloquaForm/EloquaForm')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CTABlock', loadable(() => import(/* webpackChunkName: \"CTABlock\" */'@dtcm/ui-components/dist/components/20_CTABlock/CTABlock')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('FunFactsContainer', loadable(() => import(/* webpackChunkName: \"FunFactsContainer\" */'@dtcm/ui-components/dist/components/21_FunFactsContainer/FunFactsContainer')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('FunFactItem', loadable(() => import(/* webpackChunkName: \"FunFactItem\" */'@dtcm/ui-components/dist/components/21_FunFactsItem/FunFactItem')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorItineraries', loadable(() => import(/* webpackChunkName: \"CuratorItineraries\" */'@dtcm/ui-components/dist/components/26_CuratorItineraries/CuratorItineraries')))\ncomponents.set('Itineraries', Itineraries);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaCarousel', loadable(() => import(/* webpackChunkName: \"MediaCarousel\" */'@dtcm/ui-components/dist/components/28_MediaCarousel/MediaCarousel')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaGrid', loadable(() => import(/* webpackChunkName: \"MediaGrid\" */'@dtcm/ui-components/dist/components/28_MediaGrid/MediaGrid')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaImage', loadable(() => import(/* webpackChunkName: \"MediaImage\" */'@dtcm/ui-components/dist/components/28_MediaImage/MediaImage')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaImage360', loadable(() => import(/* webpackChunkName: \"MediaImage360\" */'@dtcm/ui-components/dist/components/28_MediaImage360/MediaImage360')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaVideo', loadable(() => import(/* webpackChunkName: \"MediaVideo\" */'@dtcm/ui-components/dist/components/28_MediaVideo/MediaVideo')))\ncomponents.set('VideoTile', VideoTile);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Login', loadable(() => import(/* webpackChunkName: \"Login\" */'@dtcm/ui-components/dist/components/30_NavigationBar/Login')))\ncomponents.set('NewsCarousel', NewsCarousel);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('NewsInsights', loadable(() => import(/* webpackChunkName: \"NewsInsights\" */'@dtcm/ui-components/dist/components/31_NewsInsights/NewsInsights')))\ncomponents.set('NewsPRs', NewsPRs);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('NewsletterFormSection', loadable(() => import(/* webpackChunkName: \"NewsletterFormSection\" */'@dtcm/ui-components/dist/components/32_NewsletterForm/NewsletterFormSection')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Partners', loadable(() => import(/* webpackChunkName: \"Partners\" */'@dtcm/ui-components/dist/components/33_Partners/Partners')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorPOIs', loadable(() => import(/* webpackChunkName: \"CuratorPOIs\" */'@dtcm/ui-components/dist/components/34_CuratorPOIs/CuratorPOIs')))\ncomponents.set('POIs', POIs);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('PracticalInformation', loadable(() => import(/* webpackChunkName: \"PracticalInformation\" */'@dtcm/ui-components/dist/components/35_PracticalInformation/PracticalInformation')))\ncomponents.set('CTAsList', CTAsList);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('QuickLinks', loadable(() => import(/* webpackChunkName: \"QuickLinks\" */'@dtcm/ui-components/dist/components/36_QuickLinks/QuickLinks')))\ncomponents.set('SectionIntro', SectionIntro);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('DetailsCardService', loadable(() => import(/* webpackChunkName: \"DetailsCardService\" */'@dtcm/ui-components/dist/components/44_DetailsCardService/DetailsCardService')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Deals', loadable(() => import(/* webpackChunkName: \"Deals\" */'@dtcm/ui-components/dist/components/44_TravelDeals/Deals')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListingTradeEvents', loadable(() => import(/* webpackChunkName: \"ListingTradeEvents\" */'@dtcm/ui-components/dist/components/44_TravelDeals/ListingTradeEvents')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListingVendors', loadable(() => import(/* webpackChunkName: \"ListingVendors\" */'@dtcm/ui-components/dist/components/44_TravelDeals/ListingVendors')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TravelDeals', loadable(() => import(/* webpackChunkName: \"TravelDeals\" */'@dtcm/ui-components/dist/components/44_TravelDeals/TravelDeals')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('SocialSharing', loadable(() => import(/* webpackChunkName: \"SocialSharing\" */'@dtcm/ui-components/dist/components/45_SocialSharing/SocialSharing')))\ncomponents.set('Statistics', Statistics);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('StatisticsBigNumbers', loadable(() => import(/* webpackChunkName: \"StatisticsBigNumbers\" */'@dtcm/ui-components/dist/components/46_StatisticsBigNumbers/StatisticsBigNumbers')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('StatisticsComparative', loadable(() => import(/* webpackChunkName: \"StatisticsComparative\" */'@dtcm/ui-components/dist/components/46_StatisticsComparative/StatisticsComparative')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('StatisticsContainer', loadable(() => import(/* webpackChunkName: \"StatisticsContainer\" */'@dtcm/ui-components/dist/components/46_StatisticsContainer/StatisticsContainer')))\ncomponents.set('CategoriesChildren', CategoriesChildren);\ncomponents.set('CategoriesSiblings', CategoriesSiblings);\ncomponents.set('Tabs', Tabs);\ncomponents.set('TabsWithAccordion', TabsWithAccordion);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Tags', loadable(() => import(/* webpackChunkName: \"Tags\" */'@dtcm/ui-components/dist/components/50_Tags/Tags')))\ncomponents.set('MultipleQuoteTestimonial', MultipleQuoteTestimonial);\ncomponents.set('TestimonialCarousel', TestimonialCarousel);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TestimonialMedia', loadable(() => import(/* webpackChunkName: \"TestimonialMedia\" */'@dtcm/ui-components/dist/components/51_TestimonialMedia/TestimonialMedia')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TestimonialMultipleMedia', loadable(() => import(/* webpackChunkName: \"TestimonialMultipleMedia\" */'@dtcm/ui-components/dist/components/51_TestimonialMultipleMedia/TestimonialMultipleMedia')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TestimonialQuote', loadable(() => import(/* webpackChunkName: \"TestimonialQuote\" */'@dtcm/ui-components/dist/components/51_TestimonialQuote/TestimonialQuote')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TestimonialStatement', loadable(() => import(/* webpackChunkName: \"TestimonialStatement\" */'@dtcm/ui-components/dist/components/51_TestimonialStatement/TestimonialStatement')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('UserGeneratedContent', loadable(() => import(/* webpackChunkName: \"UserGeneratedContent\" */'@dtcm/ui-components/dist/components/53_UserGeneratedContent/UserGeneratedContent')))\ncomponents.set('CuratorHeader', CuratorHeader);\ncomponents.set('EventHeader', EventHeader);\ncomponents.set('HeaderArticle1', HeaderArticle1);\ncomponents.set('HeaderCarousel', HeaderCarousel);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeaderContextImage', loadable(() => import(/* webpackChunkName: \"HeaderContextImage\" */'@dtcm/ui-components/dist/components/57_HeaderContextImage/HeaderContextImage')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeaderGenericLegislation', loadable(() => import(/* webpackChunkName: \"HeaderGenericLegislation\" */'@dtcm/ui-components/dist/components/57_HeaderGenericLegislation/HeaderGenericLegislation')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeaderGenericPrimary', loadable(() => import(/* webpackChunkName: \"HeaderGenericPrimary\" */'@dtcm/ui-components/dist/components/57_HeaderGenericPrimary/HeaderGenericPrimary')))\ncomponents.set('HeaderGenericPrimaryLeisure', HeaderGenericPrimaryLeisure);\ncomponents.set('HeaderGenericSecondary', HeaderGenericSecondary);\ncomponents.set('HeaderGenericTertiary', HeaderGenericTertiary);\ncomponents.set('HeaderListingPage', HeaderListingPage);\ncomponents.set('HeaderListingPagePersonalizable', HeaderListingPagePersonalizable);\ncomponents.set('HeaderMedia', HeaderMedia);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeaderMedia360', loadable(() => import(/* webpackChunkName: \"HeaderMedia360\" */'@dtcm/ui-components/dist/components/57_HeaderMedia360/HeaderMedia360')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('HeaderPressRelease', loadable(() => import(/* webpackChunkName: \"HeaderPressRelease\" */'@dtcm/ui-components/dist/components/57_HeaderPressRelease/HeaderPressRelease')))\ncomponents.set('WhatsonHeader', WhatsonHeader);\ncomponents.set('HeroPrimary', HeroPrimary);\ncomponents.set('HeroSecondary', HeroSecondary);\ncomponents.set('InsightsHeader', InsightsHeader);\ncomponents.set('ItineraryCoverHeader', ItineraryCoverHeader);\ncomponents.set('ItineraryDayViewHeader', ItineraryDayViewHeader);\ncomponents.set('PersonalizablePrimaryHeader', PersonalizablePrimaryHeader);\ncomponents.set('POIHeader', POIHeader);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ServicesHeader', loadable(() => import(/* webpackChunkName: \"ServicesHeader\" */'@dtcm/ui-components/dist/components/57_ServicesHeader/ServicesHeader')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('MediaAndCopy', loadable(() => import(/* webpackChunkName: \"MediaAndCopy\" */'@dtcm/ui-components/dist/components/58_MediaAndCopy/MediaAndCopy')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Map', loadable(() => import(/* webpackChunkName: \"Map\" */'@dtcm/ui-components/dist/components/60_Map/Map')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('NeighborhoodsMap', loadable(() => import(/* webpackChunkName: \"NeighborhoodsMap\" */'@dtcm/ui-components/dist/components/60_NeighborhoodsMap/NeighborhoodsMap')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BottomNavigation', loadable(() => import(/* webpackChunkName: \"BottomNavigation\" */'@dtcm/ui-components/dist/components/61_BottomNavigation/BottomNavigation')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ItineraryBottomNavigation', loadable(() => import(/* webpackChunkName: \"ItineraryBottomNavigation\" */'@dtcm/ui-components/dist/components/61_ItineraryBottomNavigation/ItineraryBottomNavigation')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Timeline', loadable(() => import(/* webpackChunkName: \"Timeline\" */'@dtcm/ui-components/dist/components/62_Timeline/Timeline')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorMatcher', loadable(() => import(/* webpackChunkName: \"CuratorMatcher\" */'@dtcm/ui-components/dist/components/65_CuratorMatcher/CuratorMatcher')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VisaRequirementsWizard', loadable(() => import(/* webpackChunkName: \"VisaRequirementsWizard\" */'@dtcm/ui-components/dist/components/65_VisaRequirementsWizard/VisaRequirementsWizard')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('WizardTraining', loadable(() => import(/* webpackChunkName: \"WizardTraining\" */'@dtcm/ui-components/dist/components/65_WizardTraining/WizardTraining')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ItineraryOverview', loadable(() => import(/* webpackChunkName: \"ItineraryOverview\" */'@dtcm/ui-components/dist/components/68_ItineraryOverview/ItineraryOverview')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ItineraryPOIsOverview', loadable(() => import(/* webpackChunkName: \"ItineraryPOIsOverview\" */'@dtcm/ui-components/dist/components/68_ItineraryPOIsOverview/ItineraryPOIsOverview')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TimelineNavigation', loadable(() => import(/* webpackChunkName: \"TimelineNavigation\" */'@dtcm/ui-components/dist/components/69_TimelineNavigation/TimelineNavigation')))\ncomponents.set('TimelineNavigationCompact', TimelineNavigationCompact);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ItineraryFoodBreak', loadable(() => import(/* webpackChunkName: \"ItineraryFoodBreak\" */'@dtcm/ui-components/dist/components/70_ItineraryFoods/ItineraryFoodBreak')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('AutoDownload', loadable(() => import(/* webpackChunkName: \"AutoDownload\" */'@dtcm/ui-components/dist/components/71_AutoDownload/AutoDownload')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('IndexList', loadable(() => import(/* webpackChunkName: \"IndexList\" */'@dtcm/ui-components/dist/components/75_IndexList/IndexList')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('EditableListicleEvents', loadable(() => import(/* webpackChunkName: \"EditableListicleEvents\" */'@dtcm/ui-components/dist/components/77_EditableListicleEvents/EditableListicleEvents')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('EditableListiclePOIs', loadable(() => import(/* webpackChunkName: \"EditableListiclePOIs\" */'@dtcm/ui-components/dist/components/77_EditableListiclePOIs/EditableListiclePOIs')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListicleEvents', loadable(() => import(/* webpackChunkName: \"ListicleEvents\" */'@dtcm/ui-components/dist/components/77_ListicleEvents/ListicleEvents')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListicleItem', loadable(() => import(/* webpackChunkName: \"ListicleItem\" */'@dtcm/ui-components/dist/components/77_ListicleItem/ListicleItem')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListicleMedia', loadable(() => import(/* webpackChunkName: \"ListicleMedia\" */'@dtcm/ui-components/dist/components/77_ListicleMedia/ListicleMedia')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ListiclePOIs', loadable(() => import(/* webpackChunkName: \"ListiclePOIs\" */'@dtcm/ui-components/dist/components/77_ListiclePOIs/ListiclePOIs')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CuratorSection', loadable(() => import(/* webpackChunkName: \"CuratorSection\" */'@dtcm/ui-components/dist/components/78_CuratorSection/CuratorSection')))\ncomponents.set('AnnouncementBanner', AnnouncementBanner);\ncomponents.set('WidgetCurrencyConverter', WidgetCurrencyConverter);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('AccountNavigation', loadable(() => import(/* webpackChunkName: \"AccountNavigation\" */'@dtcm/ui-components/dist/components/AccountNavigation/AccountNavigation')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('AccountOverview', loadable(() => import(/* webpackChunkName: \"AccountOverview\" */'@dtcm/ui-components/dist/components/AccountOverview/AccountOverview')))\ncomponents.set('AnchorItem', AnchorItem);\ncomponents.set('AnchorList', AnchorList);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Form', loadable(() => import(/* webpackChunkName: \"Form\" */'@dtcm/ui-components/dist/components/atoms/Forms/Form')))\ncomponents.set('InteractiveGoogleMap', InteractiveGoogleMap);\ncomponents.set('Loader', Loader);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Video', loadable(() => import(/* webpackChunkName: \"Video\" */'@dtcm/ui-components/dist/components/atoms/Video/Video')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BrightcoveVideoBanner', loadable(() => import(/* webpackChunkName: \"BrightcoveVideoBanner\" */'@dtcm/ui-components/dist/components/BrightcoveVideoBanner/index')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BrightcoveVideoDetails', loadable(() => import(/* webpackChunkName: \"BrightcoveVideoDetails\" */'@dtcm/ui-components/dist/components/BrightcoveVideoDetails/index')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BrightcoveVideoDetailsHeader', loadable(() => import(/* webpackChunkName: \"BrightcoveVideoDetailsHeader\" */'@dtcm/ui-components/dist/components/BrightcoveVideoDetailsHeader/index')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BrightcoveVideos', loadable(() => import(/* webpackChunkName: \"BrightcoveVideos\" */'@dtcm/ui-components/dist/components/BrightcoveVideos/index')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('BrightcoveVideosHeader', loadable(() => import(/* webpackChunkName: \"BrightcoveVideosHeader\" */'@dtcm/ui-components/dist/components/BrightcoveVideosHeader/index')))\ncomponents.set('CardMultiple', CardMultiple);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Chart', loadable(() => import(/* webpackChunkName: \"Chart\" */'@dtcm/ui-components/dist/components/Chart/Chart')))\ncomponents.set('CodeSnippet', CodeSnippet);\ncomponents.set('CommonPageContainer', CommonPageContainer);\ncomponents.set('GenericPageContainer', GenericPageContainer);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('CookiePolicy', loadable(() => import(/* webpackChunkName: \"CookiePolicy\" */'@dtcm/ui-components/dist/components/CookiePolicy/CookiePolicy')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('DashboardHeader', loadable(() => import(/* webpackChunkName: \"DashboardHeader\" */'@dtcm/ui-components/dist/components/DashboardHeader/DashboardHeader')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('DynamicListingComponent', loadable(() => import(/* webpackChunkName: \"DynamicListingComponent\" */'@dtcm/ui-components/dist/components/DynamicListingComponent/DynamicListingComponent')))\ncomponents.set('DynamicPopup', DynamicPopup);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('EmiratesFlightWidget', loadable(() => import(/* webpackChunkName: \"EmiratesFlightWidget\" */'@dtcm/ui-components/dist/components/EmiratesFlightWidget/index')))\ncomponents.set('EventsWidget', EventsWidget);\ncomponents.set('FlyDubaiWidget', FlyDubaiWidget);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('FrontendSystemRedirect', loadable(() => import(/* webpackChunkName: \"FrontendSystemRedirect\" */'@dtcm/ui-components/dist/components/FrontendSystemRedirect/FrontendSystemRedirect')))\ncomponents.set('HeaderForActivationPage', HeaderForActivationPage);\ncomponents.set('IdentifyTravelers', IdentifyTravelers);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Listing', loadable(() => import(/* webpackChunkName: \"Listing\" */'@dtcm/ui-components/dist/components/Listing/Listing')))\ncomponents.set('ListingServicesHeader', ListingServicesHeader);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ChangePassword', loadable(() => import(/* webpackChunkName: \"ChangePassword\" */'@dtcm/ui-components/dist/components/Login/ChangePassword')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TwitterRedirect', loadable(() => import(/* webpackChunkName: \"TwitterRedirect\" */'@dtcm/ui-components/dist/components/Login/components/TwitterRedirect')))\ncomponents.set('DeleteAccount', DeleteAccount);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('EditProfile', loadable(() => import(/* webpackChunkName: \"EditProfile\" */'@dtcm/ui-components/dist/components/Login/EditProfile')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Login', loadable(() => import(/* webpackChunkName: \"Login\" */'@dtcm/ui-components/dist/components/Login/Login')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('NewPassword', loadable(() => import(/* webpackChunkName: \"NewPassword\" */'@dtcm/ui-components/dist/components/Login/NewPassword')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Register', loadable(() => import(/* webpackChunkName: \"Register\" */'@dtcm/ui-components/dist/components/Login/Register')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('RegisterAuthentication', loadable(() => import(/* webpackChunkName: \"RegisterAuthentication\" */'@dtcm/ui-components/dist/components/Login/RegisterAuthentication')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('ResetPassword', loadable(() => import(/* webpackChunkName: \"ResetPassword\" */'@dtcm/ui-components/dist/components/Login/ResetPassword')))\ncomponents.set('MainText', MainText);\ncomponents.set('ManagedWidget', ManagedWidget);\ncomponents.set('MultifunctionalCards', MultifunctionalCards);\ncomponents.set('PopularCuisines', PopularCuisines);\ncomponents.set('RecommendationListing', RecommendationListing);\ncomponents.set('RedirectToReturnUrl', RedirectToReturnUrl);\ncomponents.set('RestaurantsCarousel', RestaurantsCarousel);\ncomponents.set('RestaurantsHeadingAndContentBlock', RestaurantsHeadingAndContentBlock);\ncomponents.set('RestaurantsListing', RestaurantsListing);\ncomponents.set('RestaurantsNavigation', RestaurantsNavigation);\ncomponents.set('RestaurantsSmallBanner', RestaurantsSmallBanner);\ncomponents.set('RichTextBubble', RichTextBubble);\ncomponents.set('ScrollToBlock', ScrollToBlock);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Search', loadable(() => import(/* webpackChunkName: \"Search\" */'@dtcm/ui-components/dist/components/Search/Search')))\ncomponents.set('SearchRestaurants', SearchRestaurants);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('Sitemap', loadable(() => import(/* webpackChunkName: \"Sitemap\" */'@dtcm/ui-components/dist/components/Sitemap/Sitemap')))\ncomponents.set('SkipContentButtons', SkipContentButtons);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('SoftixThankYou', loadable(() => import(/* webpackChunkName: \"SoftixThankYou\" */'@dtcm/ui-components/dist/components/SoftixThankYou/SoftixThankYou')))\ncomponents.set('SurpriseMeForm', SurpriseMeForm);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TicketPurchase', loadable(() => import(/* webpackChunkName: \"TicketPurchase\" */'@dtcm/ui-components/dist/components/TicketPurchase/TicketPurchase')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TicketsPurchases', loadable(() => import(/* webpackChunkName: \"TicketsPurchases\" */'@dtcm/ui-components/dist/components/TicketsPurchases/TicketsPurchases')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('TopPicks', loadable(() => import(/* webpackChunkName: \"TopPicks\" */'@dtcm/ui-components/dist/components/TopPicks/TopPicks')))\ncomponents.set('UnbelievableSummerDeals', UnbelievableSummerDeals);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VenueBlock', loadable(() => import(/* webpackChunkName: \"VenueBlock\" */'@dtcm/ui-components/dist/components/VenueBlock/VenueBlock')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VenueHeader', loadable(() => import(/* webpackChunkName: \"VenueHeader\" */'@dtcm/ui-components/dist/components/VenueHeader/VenueHeader')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VenueKeyStats', loadable(() => import(/* webpackChunkName: \"VenueKeyStats\" */'@dtcm/ui-components/dist/components/VenueKeyStats/VenueKeyStats')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VenueShortlist', loadable(() => import(/* webpackChunkName: \"VenueShortlist\" */'@dtcm/ui-components/dist/components/VenueShortlist/VenueShortlist')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('VenueTable', loadable(() => import(/* webpackChunkName: \"VenueTable\" */'@dtcm/ui-components/dist/components/VenueTable/VenueTable')))\ncomponents.set('WeatherWidget', WeatherWidget);\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('YourTicketsPurchases', loadable(() => import(/* webpackChunkName: \"YourTicketsPurchases\" */'@dtcm/ui-components/dist/components/YourTicketsPurchases/YourTicketsPurchases')))\n\n// NOTE: 'import' paths _must_ be static in order for webpack to be able to analyze them at build time.\ncomponents.set('YourTopPicks', loadable(() => import(/* webpackChunkName: \"YourTopPicks\" */'@dtcm/ui-components/dist/components/YourTopPicks/YourTopPicks')))\n\n// \r\n\r\ncomponents.set('GenericSecondaryHeader', HeaderGenericSecondary);\r\n\r\nexport default function componentFactory(componentName: string) {\r\n if (!components.has(componentName) && componentName.match(/Container$/)) {\r\n return components.get('CommonPageContainer');\r\n }\r\n\r\n return components.get(componentName);\r\n}\r\n","import React, { useContext, useEffect, ReactElement } from 'react';\r\nimport { useAppStateContext } from './AppStateProvider';\r\nimport { __RouterContext, RouteComponentProps, match } from 'react-router';\r\nimport { matchRoute } from './routerUtils';\r\n\r\n// Component responsible for fetching route data if needed.\r\n// This could probably be converted to a hook.\r\nexport const RouteDataManager: React.FC = (props) => {\r\n const { appState, actions } = useAppStateContext();\r\n\r\n // Always assume that appState contains the correctly resolved language.\r\n // This assumption can be made because we do not provide client-side language switching.\r\n // Language switching requires a full page reload.\r\n const resolvedLanguage = appState.language;\r\n\r\n const routerContext = useContext(__RouterContext);\r\n const route = resolveRouterRoute(routerContext);\r\n const routeParams: {\r\n sitecoreRoute?: string;\r\n lang?: string;\r\n } = (route && route.params) || {};\r\n\r\n // routeParams take precedence over state\r\n // sitecoreRoute will only be populated if there is a value after `/` in the requested URL\r\n // appState.routePath is populated by server.js and index.js before initial render\r\n // appState.routePath is updated during route fetching\r\n\r\n // `sitecoreRoute` may be undefined when the current URL is `/` or\r\n // when the current URL starts with a language parameter, `/en-CA/`\r\n // If so, we need to \"resolve\" to the `/` path to ensure that\r\n // the `useEffect` below is triggered and route data is fetched.\r\n let resolvedRoute: string;\r\n if (\r\n !routeParams.sitecoreRoute &&\r\n route &&\r\n (route.url === '/' || route.url === `/${resolvedLanguage.languageCode}` || route.url === `/${resolvedLanguage.languageCode}/`)\r\n ) {\r\n resolvedRoute = '/';\r\n } else {\r\n resolvedRoute = routeParams.sitecoreRoute || appState.routePath;\r\n }\r\n\r\n // remember that useEffect fires after initial render (no matter what)\r\n // and then fires on subsequent renders if either resolvedRoute or resolvedLanguage has changed\r\n useEffect(\r\n () => {\r\n // If we have route data from SSR, no need to fetch.\r\n // At this point, we also clear the SSR flag from state so that subsequent renders\r\n // will fetch routeData if needed.\r\n // This approach feels hacky... but it works.\r\n if (appState.routeData && appState.routeData.fromSSR) {\r\n actions.clearSSRFlag();\r\n return;\r\n }\r\n\r\n actions.fetchRoute(resolvedRoute, resolvedLanguage.languageCode);\r\n },\r\n //eslint-disable-next-line react-hooks/exhaustive-deps\r\n [resolvedRoute, resolvedLanguage.languageCode]\r\n );\r\n\r\n // need to cast as ReactElement to satisfy TypeScript\r\n return props.children as ReactElement;\r\n};\r\n\r\n// When accessing `__RouterContext` from react-router, the location and history\r\n// properties of the context are correct, but the route parameters are not\r\n// initialized. Therefore, we call the `matchRoute` function on the router context\r\n// path to get the matched route parameters (i.e. `:sitecoreRoute`, `:lang`).\r\n// This will likely change in a future version of React Router, but this works\r\n// with the current version.\r\nfunction resolveRouterRoute(routerContext: RouteComponentProps): match | null {\r\n const matchedRoute = matchRoute(routerContext.location.pathname);\r\n return matchedRoute;\r\n}\r\n","import React from 'react';\r\nimport { ComponentFactoryReactContext } from '@sitecore-jss/sitecore-jss-react/dist/components/SitecoreContext';\r\nimport { ComponentFactory } from '@sitecore-jss/sitecore-jss-react/types/components/sharedTypes';\r\n\r\nexport { ComponentFactoryReactContext };\r\n\r\nconst ComponentFactoryContext = React.createContext(undefined);\r\n\r\nexport interface ComponentFactoryContextProps {\r\n componentFactory: ComponentFactory;\r\n}\r\n\r\nexport const useComponentFactory = () => {\r\n const context = React.useContext(ComponentFactoryContext);\r\n if (context === undefined) {\r\n throw new Error('useComponentFactory must be used within a ComponentFactoryContextProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport const ComponentFactoryContextProvider: React.FC = ({\r\n componentFactory,\r\n children,\r\n}) => {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import React, { ReactNode } from 'react';\r\nimport { GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';\r\nimport withClientOnly from './withClientOnly';\r\n\r\ninterface ProviderProps {\r\n children: ReactNode;\r\n siteKey: string;\r\n languageCode: string;\r\n appState: any;\r\n}\r\n\r\nconst ClientOnlyReCaptchaProvider: React.FC = ({\r\n children,\r\n siteKey,\r\n languageCode,\r\n appState,\r\n}) => (\r\n \r\n {children}\r\n \r\n);\r\n\r\nexport default withClientOnly(ClientOnlyReCaptchaProvider);\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nconst withClientOnly = (WrappedComponent: any) => {\r\n return (props: any) => {\r\n const [isClient, setIsClient] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsClient(true);\r\n console.log('dotsite component mounted')\r\n }, []);\r\n\r\n return isClient ? : null;\r\n };\r\n};\r\n\r\nexport default withClientOnly;","import React, { useEffect } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport config from './temp/config';\r\nimport Layout from './Layout';\r\nimport componentFactory from './componentFactory';\r\nimport { RouteDataManager } from './lib/RouteDataManager';\r\nimport { useAppStateContext } from './lib/AppStateProvider';\r\nimport { ComponentFactoryContextProvider } from './lib/ComponentFactoryProvider';\r\n// This context is required for @dtcm components to fetch context properly.\r\nimport { SitecoreContextReactContext as DtcmUiComponentsSitecoreContext } from '@dtcm/ui-components';\r\nimport { canUseDOM, get } from './lib/getPropertyByPath';\r\nimport ClientOnlyReCaptchaProvider from './ClientOnlyReCaptchaProvider';\r\n\r\nconst ScrollToTop = () => {\r\n const { pathname } = useLocation();\r\n\r\n React.useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, [pathname]);\r\n\r\n return null;\r\n};\r\n\r\n// This is the main entry point of the app invoked by the renderer (server or client rendering).\r\nconst AppRoot = ({ Router }: { Router: any }) => {\r\n const { appState, actions } = useAppStateContext();\r\n\r\n const isEmptyLayout = get(appState, 'dictionary.viewBag.isEmptyLayout', false);\r\n // Accessibility settings require DOM manipulation, so initialize them after first mount/render.\r\n // `useEffect` will only fire once when providing an empty array as the second argument.\r\n useEffect(() => {\r\n actions.initializeAccessibilitySettings({\r\n contrast: appState.selectedContrastValue,\r\n fontSize: appState.selectedFontSize as any,\r\n });\r\n }, []);\r\n\r\n const sitecoreContextData: any = {\r\n route: null,\r\n rtl: false,\r\n config: config,\r\n pageEditing: false,\r\n origin: '',\r\n breadcrumb: [],\r\n };\r\n\r\n if (appState.routeData && appState.sitecoreContextData) {\r\n sitecoreContextData.route = appState.routeData;\r\n Object.assign(sitecoreContextData, appState.sitecoreContextData, {\r\n selectedFontSize: appState.selectedFontSize,\r\n });\r\n }\r\n\r\n const captchaKey = get(sitecoreContextData, 'configuration.globalApi.recaptchaKey');\r\n const languageCode: string = get(sitecoreContextData, 'language');\r\n\r\n return (\r\n \r\n {!isEmptyLayout && }\r\n \r\n \r\n \r\n {captchaKey && canUseDOM ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AppRoot;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport AppRoot from './AppRoot';\r\nimport config from './temp/config';\r\nimport { resolveLanguageFromContextData, resolveLanguageFromConfig } from './lib/languageResolvers';\r\nimport { matchRoute } from './lib/routerUtils';\r\nimport { AppStateProvider, AppState } from './lib/AppStateProvider';\r\nimport { resolveAccessibilitySettings } from './lib/accessibilityStateManager';\r\nimport { LanguageDefinition } from '@dtcm/ui-components';\r\n// import { loadableReady } from '@loadable/component';\r\n// import json from './tempSsrJson.json';\r\n\r\n/* eslint-disable no-underscore-dangle */\r\n\r\n/*\r\n App Rendering\r\n*/\r\n\r\nrenderApp();\r\n\r\nfunction renderApp() {\r\n const initialState = resolveInitialAppState();\r\n\r\n // HTML element to place the app into\r\n const rootElement = document.getElementById('root');\r\n\r\n // Create the Router component that will be used for client-side routing.\r\n const Router: React.FC = (routerProps) => {routerProps.children};\r\n\r\n // when React initializes from a SSR-based initial state, you need to render with `hydrate` instead of `render`\r\n const renderFunction = initialState.routeData ? ReactDOM.hydrate : ReactDOM.render;\r\n\r\n // loadableReady(() => {\r\n renderFunction(\r\n \r\n \r\n ,\r\n rootElement\r\n );\r\n // });\r\n}\r\n\r\n/*\r\n SSR Data\r\n If we're running in a server-side rendering scenario,\r\n the server will provide JSON in the #__JSS_STATE__ element\r\n for us to acquire the initial state to run with on the client.\r\n\r\n This enables us to skip a network request to load up the layout data.\r\n We are emitting a quiescent script with JSON so that we can take advantage\r\n of JSON.parse()'s speed advantage over parsing full JS, and enable\r\n working without needing `unsafe-inline` in Content Security Policies.\r\n\r\n SSR is initiated from /server/server.js.\r\n*/\r\n\r\nfunction resolveInitialAppState() {\r\n const ssrRawJson = document.getElementById('__JSS_STATE__');\r\n const ssrState = ssrRawJson ? JSON.parse(ssrRawJson.innerHTML) : null;\r\n // const ssrState = json; \r\n const routePath = resolveRoutePath();\r\n\r\n /*\r\n Language Resolving\r\n Attempt to resolve the app language prior to rendering the app.\r\n */\r\n const language = resolveLanguage(ssrState);\r\n\r\n const accessibilitySettings = resolveAccessibilitySettings(config);\r\n\r\n const appState: AppState = {\r\n routePath,\r\n language,\r\n routeData: null,\r\n sitecoreContextData: {},\r\n selectedContrastValue: accessibilitySettings.contrast,\r\n selectedFontSize: accessibilitySettings.fontSize,\r\n\r\n };\r\n\r\n if (ssrState) {\r\n const {\r\n dictionary,\r\n navbar,\r\n footer,\r\n downloadBox,\r\n newsletterForm,\r\n footerWeatherWidget,\r\n routeData,\r\n sitecoreContextData,\r\n analytics,\r\n accessWidget\r\n } = ssrState;\r\n\r\n return {\r\n ...appState,\r\n dictionary: dictionary || null,\r\n routeData: routeData || null,\r\n navbar,\r\n footer,\r\n downloadBox,\r\n newsletterForm,\r\n footerWeatherWidget,\r\n sitecoreContextData,\r\n analytics,\r\n accessWidget\r\n } as AppState;\r\n }\r\n\r\n return appState;\r\n}\r\n\r\n// Resolve the current matched router path\r\nfunction resolveRoutePath() {\r\n const matchedRoute = matchRoute(window.location.pathname);\r\n const routeParams: { sitecoreRoute?: string } = (matchedRoute && matchedRoute.params) || {};\r\n return (routeParams && routeParams.sitecoreRoute) || '/';\r\n}\r\n\r\nfunction resolveLanguage(ssrState: any): LanguageDefinition {\r\n // If SSR data exists, we try to extract the language from that data.\r\n let language: LanguageDefinition =\r\n ssrState && ssrState.sitecoreContextData && resolveLanguageFromContextData(ssrState.sitecoreContextData);\r\n\r\n // If a language parameter is found in the route URL and the parameter has a different value\r\n // than specified in SSR data, use the parameter value. This shouldn't ever happen, but\r\n // anything is possible.\r\n const matchedRoute = matchRoute(window.location.pathname);\r\n if (\r\n matchedRoute &&\r\n matchedRoute.params &&\r\n matchedRoute.params.lang &&\r\n language &&\r\n language.languageCode !== matchedRoute.params.lang\r\n ) {\r\n // note: this will leave us in an incomplete state, i.e. languageName cannot be resolved from URL\r\n // again, this scenario shouldn't ever happen.\r\n language.languageCode = matchedRoute.params.lang;\r\n }\r\n\r\n // If no language could be found in SSR data or route URL, then fallback to the value defined in config.\r\n if (!language) {\r\n language = resolveLanguageFromConfig(config);\r\n }\r\n\r\n return language;\r\n}\r\n","import { LanguageDefinition } from '@dtcm/ui-components';\r\n\r\n// If we have a state, and that state has language data, return the language\r\nexport const resolveLanguageFromContextData = (\r\n sitecoreContextData?: { language?: string; languageName?: string } | undefined\r\n): LanguageDefinition => {\r\n if (!sitecoreContextData || !sitecoreContextData.language || !sitecoreContextData.languageName) {\r\n console.warn('context data is undefined or language is not defined in context data', sitecoreContextData);\r\n return {\r\n languageCode: '',\r\n languageName: '',\r\n };\r\n }\r\n return {\r\n languageCode: sitecoreContextData.language,\r\n languageName: sitecoreContextData.languageName,\r\n };\r\n};\r\n\r\nexport const resolveLanguageFromConfig = (config: {\r\n defaultLanguage: string;\r\n defaultLanguageName: string;\r\n}): LanguageDefinition => {\r\n const values = {\r\n languageCode: '',\r\n languageName: '',\r\n };\r\n if (!config) {\r\n console.error('config is undefined');\r\n return values;\r\n }\r\n values.languageCode = config.defaultLanguage;\r\n values.languageName = config.defaultLanguageName;\r\n return values;\r\n};\r\n","/**\r\n * Implements a data fetcher using window.Fetch - replace with your favorite\r\n * library if you like. See HttpJsonFetcher type\r\n * in sitecore-jss library for implementation details/notes.\r\n * @param {string} url The URL to request; may include query string\r\n * @param {any} data Optional data to POST with the request.\r\n */\r\n\r\nexport function dataFetcher(url: string, data: any): Promise {\r\n const requestProps: Partial = {\r\n method: data ? 'POST' : 'GET',\r\n //Setting content-type produces CORS-error \"Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.\"\r\n // headers: {\r\n // 'Content-Type': 'application/json',\r\n //},\r\n // note: needs to use `withCredentials: true` in order for Sitecore cookies to be included in CORS requests\r\n // which is necessary for analytics and such\r\n //credentials: 'include',\r\n body: JSON.stringify(data),\r\n };\r\n\r\n // NOTE: if you plan to make layout service fetch calls during SSR, be sure\r\n // to polyfill fetch for Node.\r\n return fetch(url, requestProps).then((response) => {\r\n // JSS dataApi expects a response with the below signature.\r\n\r\n return {\r\n status: response.status,\r\n statusText: response.statusText,\r\n data: response.json(),\r\n };\r\n });\r\n}\r\n","import { dataApi } from '@sitecore-jss/sitecore-jss-react';\r\nimport { dataFetcher } from './dataFetcher';\r\nimport config from '../temp/config';\r\n\r\nexport interface State {\r\n routeData: any;\r\n routeDataLoading?: boolean;\r\n routePath: string;\r\n routeError?: Error;\r\n sitecoreContextData: any;\r\n}\r\n\r\nexport interface Action {\r\n type: string;\r\n payload: any;\r\n error?: Error;\r\n}\r\n\r\nexport function reducer(state: State, action: Action) {\r\n switch (action.type) {\r\n case 'clear-ssr-flag': {\r\n return { ...state, routeData: { ...state.routeData, fromSSR: false } };\r\n }\r\n case 'route-data-fetch-begin': {\r\n return { ...state, routeDataLoading: true, routePath: action.payload };\r\n }\r\n case 'route-data-fetch-success': {\r\n \r\n return {\r\n ...state,\r\n routeDataLoading: false,\r\n routeData: action.payload.routeData,\r\n sitecoreContextData: action.payload.sitecoreContextData,\r\n routeError: null,\r\n };\r\n }\r\n case 'route-data-fetch-404': {\r\n return {\r\n ...state,\r\n routeDataLoading: false,\r\n routeData: action.payload.routeData,\r\n sitecoreContextData: action.payload.sitecoreContextData,\r\n routeError: action.error,\r\n };\r\n }\r\n case 'route-data-fetch-error': {\r\n return {\r\n ...state,\r\n routeDataLoading: false,\r\n routeData: null,\r\n sitecoreContextData: null,\r\n routeError: action.error,\r\n };\r\n }\r\n default: {\r\n return state;\r\n }\r\n }\r\n}\r\n\r\nexport type FetchRouteFunction = (\r\n routePath: string,\r\n language: string\r\n) => (dispatch: any) => Promise | void;\r\n\r\nexport const fetchRoute: FetchRouteFunction = (routePath: string, language: string) => {\r\n return (dispatch: any) => {\r\n // Signal that we're about to start fetching data. Typically use this\r\n // to set loading state to `true`.\r\n dispatch({\r\n type: 'route-data-fetch-begin',\r\n payload: routePath,\r\n });\r\n\r\n getRouteData(routePath, language)\r\n .then((sitecoreData) => {\r\n \r\n dispatch({\r\n type: 'route-data-fetch-success',\r\n payload: {\r\n routeData: sitecoreData.sitecore.route,\r\n sitecoreContextData: sitecoreData.sitecore.context,\r\n },\r\n });\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n \r\n // 404 errors may contain context data to be used for rendering\r\n if (error.response && error.response.status === 404 && error.response.data) {\r\n dispatch({\r\n type: 'route-data-fetch-404',\r\n payload: {\r\n routeData: error.response.data.sitecore ? error.response.data.sitecore.route : null,\r\n sitecoreContextData: error.response.data.sitecore\r\n ? error.response.data.sitecore.context\r\n : { language },\r\n },\r\n error: null,\r\n });\r\n } else {\r\n dispatch({\r\n type: 'route-data-fetch-error',\r\n error,\r\n });\r\n }\r\n });\r\n };\r\n};\r\n\r\nexport type ClearSSRFlagFunction = () => (dispatch: any) => Promise | void;\r\n\r\nexport const clearSSRFlag: ClearSSRFlagFunction = () => {\r\n return (dispatch: any) => {\r\n dispatch({ type: 'clear-ssr-flag' });\r\n };\r\n};\r\n\r\n/**\r\n * Gets route data from Sitecore. This data is used to construct the component layout for a JSS route.\r\n * @param {string} route Route path to get data for (e.g. /about)\r\n * @param {string} language Language to get route data in (content language, e.g. 'en')\r\n */\r\nfunction getRouteData(route: string, language: string) {\r\n const formattedRoute = ensureLeadingSlash(route);\r\n\r\n const fetchOptions = {\r\n layoutServiceConfig: { host: config.sitecoreApiHost },\r\n querystringParams: { sc_lang: language, sc_apikey: config.sitecoreApiKey, sc_site: config.jssAppName },\r\n fetcher: dataFetcher,\r\n };\r\n\r\n return dataApi.fetchRouteData(formattedRoute, fetchOptions);\r\n}\r\n\r\nfunction ensureLeadingSlash(route: string) {\r\n const formattedRoute = !route.startsWith('/') ? `/${route}` : route;\r\n return formattedRoute;\r\n}\r\n","import React, { createContext, useReducer, PropsWithChildren } from 'react';\r\nimport {\r\n fetchRoute,\r\n clearSSRFlag,\r\n reducer as routeStateReducer,\r\n State as RouteState,\r\n FetchRouteFunction,\r\n ClearSSRFlagFunction,\r\n} from './routeStateManager';\r\nimport {\r\n State as AccessibilityState,\r\n changeContrast,\r\n changeFontSize,\r\n reducer as accessibilityStateReducer,\r\n ChangeContrastFunction,\r\n ChangeFontSizeFunction,\r\n initializeAccessibilitySettings,\r\n InitializeAccessibilitySettingsFunction,\r\n} from './accessibilityStateManager';\r\nimport { NavBarData } from './NavBarData';\r\nimport { LanguageDefinition } from '@dtcm/ui-components';\r\n\r\n// Create and export app state context for consumption in descendants.\r\nconst AppStateContext = createContext(undefined);\r\n\r\nexport const useAppStateContext = () => {\r\n const context = React.useContext(AppStateContext);\r\n if (context === undefined) {\r\n throw new Error('useAppStateContext must be used within a AppStateProvider');\r\n }\r\n return context;\r\n};\r\n\r\n// store the currentState outside of the current function closure so that we can provide\r\n// a `getState()` function to our actions that will actually return the current state\r\nlet currentState: AppState | undefined;\r\n\r\nexport function AppStateProvider({ initialState, children }: PropsWithChildren) {\r\n const reducer = mergeReducers([routeStateReducer, accessibilityStateReducer]);\r\n const [state, dispatch] = withDispatchLog(useReducer(reducer, initialState, initState), () => currentState);\r\n\r\n currentState = state;\r\n\r\n const actions: AppStateActions = createAsyncCapableActions(\r\n {\r\n fetchRoute,\r\n clearSSRFlag,\r\n changeContrast,\r\n changeFontSize,\r\n initializeAccessibilitySettings,\r\n },\r\n dispatch,\r\n () => currentState\r\n );\r\n\r\n return {children};\r\n}\r\n\r\nfunction initState(state: AppState) {\r\n // If we don't have SSR data, then set the loading flags to true so\r\n // that initial app rendering doesn't fail and will show loaders instead.\r\n if (!state.routeData || !state.routeData.fromSSR) {\r\n state.routeDataLoading = true;\r\n }\r\n return state;\r\n}\r\n\r\n// This function provides any actions that return a function with a `dispatch`\r\n// and `state` objects that those actions can then use. This allows for multiple\r\n// `dispatch` calls from an action or calling `dispatch` after async operations.\r\nfunction createAsyncCapableActions(actions: any, dispatch: any, getState: any) {\r\n Object.keys(actions).forEach((key) => {\r\n const action = actions[key];\r\n\r\n actions[key] = (...args: any[]) => {\r\n const actionResult = action(...args);\r\n if (typeof actionResult === 'function') {\r\n actionResult(dispatch, getState);\r\n } else {\r\n dispatch(actionResult);\r\n }\r\n };\r\n });\r\n\r\n return actions;\r\n}\r\n\r\n// Simple function that accepts an array of reducer functions and \"merges\" them\r\n// into a single function. The result from each reducer is passed to the next\r\n// reducer and the final output is the return value.\r\nfunction mergeReducers(reducers: any[]) {\r\n return (state: any, action: any) => {\r\n return reducers.reduce((result: any, reducer: any) => {\r\n result = reducer(result, action);\r\n return result;\r\n }, state);\r\n };\r\n}\r\n\r\n// This function basically wraps the `dispatch` function from a `useReducer`\r\n// call with a console logger to log all actions that are dispatched, along\r\n// with the updated state after the action is complete.\r\nfunction withDispatchLog(useReducerResult: any[], getState: any) {\r\n if (process.env.NODE_ENV === 'development') {\r\n return [\r\n useReducerResult[0],\r\n (...args: any[]) => {\r\n console.group('state action');\r\n console.log(`action '${args[0].type}'`, args[0]);\r\n\r\n useReducerResult[1](...args);\r\n\r\n console.log(`new state`, getState());\r\n console.groupEnd();\r\n },\r\n ];\r\n }\r\n return useReducerResult;\r\n}\r\n\r\nexport type AppState = RouteState &\r\n AccessibilityState & {\r\n isEmptyLayout?: boolean;\r\n navbar?: NavBarData | any;\r\n footer?: any;\r\n downloadBox?: any;\r\n newsletterForm?: any;\r\n footerWeatherWidget?: any;\r\n language: LanguageDefinition;\r\n // context may have other properties defined outside of what is specified in the UI components SitecoreContextProps\r\n sitecoreContextData: any;\r\n analytics?: any;\r\n accessWidget?: any;\r\n };\r\n\r\nexport interface AppStateContextProps {\r\n appState: AppState;\r\n actions: AppStateActions;\r\n}\r\n\r\nexport interface AppStateProviderProps {\r\n initialState: AppState | undefined;\r\n}\r\n\r\nexport type AppStateActions = {\r\n fetchRoute: FetchRouteFunction;\r\n clearSSRFlag: ClearSSRFlagFunction;\r\n changeFontSize: ChangeFontSizeFunction;\r\n changeContrast: ChangeContrastFunction;\r\n initializeAccessibilitySettings: InitializeAccessibilitySettingsFunction;\r\n};\r\n"],"sourceRoot":""}