{"version":3,"file":"static/js/services-group1.46874087.chunk.js","mappings":"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","sources":["app-react/services/cms/cms-api/cms-api.service.ts","app-react/components/cms-banner/banner-content/banner-content.component.tsx","app-react/services/cms/cms-banners/banner-definition/banner-definition.tsx","app-react/services/cms/cms-banners/cms-banners.service.ts","app-react/services/cms/cms-pages/cms-pages.service.ts","app-react/services/cms/cms-segmentation/cms-segmentation.service.ts"],"sourcesContent":["import {ServiceBase} from '../../ServiceBase';\r\nimport {CmsBannerId} from '../cms-banners/cm-banner-id/cms-banner-id';\r\nimport {BannerData, CmsPageData, CmsSegmentsData, ICmsApiService} from './cms-api.service.interface';\r\nimport {LanguageSwitcherConfiguration} from '../../../app-bootstrap/config-interfaces/b2c-startup.configurations';\r\nimport {Check} from '@sparkware/app-utils';\r\nimport {UriParams} from \"../../location/uri-params/uri-params\";\r\n\r\n\r\nexport class CmsApiService extends ServiceBase implements ICmsApiService {\r\n\r\n private get _publicationID(): number {\r\n return this.services.configuration.cmsPublicationId;\r\n }\r\n\r\n public get apiOrigin(): string {\r\n return this.services.launcher.getCMSOrigin() || this.services.location.currentUri.origin\r\n }\r\n\r\n\r\n async getBanners(bannersIds: CmsBannerId[]): Promise {\r\n try {\r\n if(!bannersIds?.length){\r\n return [];\r\n }\r\n\r\n if(!this.services.user.isAuthorized) {\r\n await this.services.sdk.waitForAnonymousAbTestingData();\r\n }\r\n\r\n let data;\r\n const options = {\r\n headers: this._getBannersRequestOptions()\r\n };\r\n\r\n if(this.services.configuration.servicesConfigs.Skin.isSiteInfraAWS) {\r\n data = await this.services.http.get(this._getBannersRequestUrl + this._getBannersRequestParamsGET(bannersIds), options);\r\n } else {\r\n options['body'] = this._getBannersRequestParamsPOST(bannersIds);\r\n data = await this.services.http.post(this._getBannersRequestUrl, options);\r\n }\r\n\r\n\r\n return data || [];\r\n } catch (err) {\r\n let bannersDescriptions = bannersIds.reduce((acc, curr) => acc + '\\n' + curr.toString(), '');\r\n this.services.logger.error('Failed read the following banners from CMS API: ' + bannersDescriptions + 'error message: ' ,err);\r\n return [];\r\n }\r\n }\r\n\r\n async getFallbackBanners(fileNames: string[]): Promise<{[key: string]: string}> {\r\n try {\r\n return await this._readFallbackBanners(fileNames);\r\n } catch (err) {\r\n let files = fileNames.reduce((acc, curr) => acc + '\\n' + curr, '');\r\n this.services.logger.error('Failed to read fallback banners for ' + files);\r\n return {};\r\n }\r\n }\r\n\r\n private _readFallbackBanners(fileNames: string[]): Promise<{[key: string]: string}> {\r\n\r\n\r\n let result = {};\r\n\r\n fileNames = fileNames || [];\r\n if(fileNames.length === 0) {\r\n return Promise.resolve(result);\r\n }\r\n\r\n\r\n let configuredFallbackUrl: string = this._getFallbackUrlFromConfig();\r\n if (!configuredFallbackUrl) {\r\n return Promise.resolve(result);\r\n }\r\n\r\n let promises: Promise[] = [];\r\n for (let i = 0; i < fileNames.length; i++ ) {\r\n let fileName = fileNames[i];\r\n let computedFallbackUrl = configuredFallbackUrl.replace('{fileName}', fileName);\r\n let promise = this.services.http.get(computedFallbackUrl).then(content => {\r\n result[fileName] = content;\r\n\r\n }).catch(err => {\r\n this.services.logger.error(`Failed to load fallback CMS banner! fallbackUrl: ${computedFallbackUrl}`, err);\r\n });\r\n\r\n promises.push(promise);\r\n }\r\n\r\n return Promise.all(promises).then(() => result);\r\n }\r\n\r\n\r\n getPageContent(url: string, customQueryParams?: UriParams): Promise {\r\n let options = {\r\n headers: this._getPagesRequestOptions()\r\n };\r\n\r\n if(this.services.miniOrbit.isEnabled) {\r\n url = url.replace(this.services.miniOrbit.currentMiniOrbitConfig.basePath, '/').replace('//', '/');\r\n }\r\n\r\n let uriParams = new UriParams('');\r\n\r\n uriParams.addParam('publicationid', this._publicationID.toString());\r\n uriParams.addParam('url', this._addSlashesInTheSides(url));\r\n\r\n if(customQueryParams) {\r\n customQueryParams.getAllParams().forEach(p => {\r\n if(!uriParams.hasParam(p.originalName)) {\r\n uriParams.addParam(p.originalName, p.value)\r\n }\r\n });\r\n }\r\n\r\n let cmsPageContentApiUrl = this.apiOrigin + '/api/pagecontent' + uriParams.toString();\r\n\r\n return this.services.http.get(cmsPageContentApiUrl, options);\r\n }\r\n\r\n private _404PageContent: CmsPageData | null = null;\r\n async get404PageContent() {\r\n if(this._404PageContent) {\r\n return this._404PageContent;\r\n }\r\n\r\n try {\r\n let data = await this.services.http.get(this.apiOrigin + '/api/pagecontent?publicationid=' + this._publicationID + '&url=error404.aspx');\r\n this._404PageContent = {\r\n title: null,\r\n location: null,\r\n content: data && data.content\r\n };\r\n\r\n return this._404PageContent;\r\n } catch (err) {\r\n this.services.logger.error(`Failed to get 404 page content!`, err);\r\n return {\r\n title: null,\r\n location: null,\r\n content: '
Something went wrong. Please try again.
'\r\n };\r\n }\r\n }\r\n\r\n private _getFallbackUrlFromConfig(): string {\r\n let configData = this.services.configuration.data;\r\n return configData && configData.generalSettings && configData.generalSettings.fallbackCMSComponentsPath;\r\n\r\n }\r\n\r\n\r\n private get _getBannersRequestUrl() {\r\n return this.apiOrigin + '/api/content/';\r\n }\r\n\r\n private _getBannersRequestParamsPOST(bannersIds: CmsBannerId[]): BodyInit {\r\n\r\n let params = this.services.http.createUrlSearchParams();\r\n params.append('publicationid', this._publicationID.toString());\r\n params.append('PagePlaceHoldersXML', 'PagePlaceholders_ValidKeyPagePlaceholders_ValidValue');\r\n\r\n for(let i = 0; i < bannersIds.length; i++) {\r\n let bannerId = bannersIds[i];\r\n\r\n params.append(`components[${i}][templateId]`, bannerId.templateID);\r\n params.append(`components[${i}][componentId]`, bannerId.componentID);\r\n\r\n\r\n }\r\n\r\n return params;\r\n }\r\n\r\n private _getBannersRequestParamsGET(bannersIds: CmsBannerId[]): string {\r\n\r\n const publicationid = this._publicationID.toString();\r\n const PagePlaceHoldersXML = encodeURIComponent('PagePlaceholders_ValidKeyPagePlaceholders_ValidValue');\r\n\r\n let queryParams = `?publicationId=${publicationid}&PagePlaceHoldersXML=${PagePlaceHoldersXML}&`;\r\n\r\n let componentsParams = [];\r\n for(let i = 0; i < bannersIds.length; i++) {\r\n let bannerId = bannersIds[i];\r\n\r\n componentsParams.push(`templateId=${bannerId.templateID}`);\r\n componentsParams.push(`componentId=${bannerId.componentID}`);\r\n }\r\n\r\n return queryParams + componentsParams.join('&');\r\n }\r\n\r\n private _getBannersRequestOptions(): HeadersInit {\r\n\r\n let headers = this.services.http.createHeaders();\r\n headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\r\n return this.addXXContext(headers);\r\n }\r\n\r\n private _getPagesRequestOptions(): HeadersInit {\r\n\r\n let headers = this.services.http.createHeaders();\r\n return this.addXXContext(headers);\r\n }\r\n\r\n private _getSegmentesRequestOptions(): HeadersInit {\r\n let headers = this.services.http.createHeaders();\r\n return this.addXXContext(headers);\r\n }\r\n\r\n private addXXContext(headers: Headers): HeadersInit {\r\n\r\n let userSignature = this.services.sdk.getCmsUserSignature();\r\n if(!Check.isEmpty(userSignature)) {\r\n if(this.services.configuration.servicesConfigs.Skin.isSiteInfraAWS){\r\n headers.append('XX-Context', userSignature && userSignature.message);\r\n }else{\r\n headers.append('XX.Context', userSignature && userSignature.message);\r\n }\r\n }\r\n\r\n\r\n return headers;\r\n }\r\n\r\n async getSegments(): Promise {\r\n try {\r\n let options = {\r\n headers: this._getSegmentesRequestOptions()\r\n };\r\n return await this.services.http.get(`${this.apiOrigin}/api/segments`, options);\r\n }catch (err) {\r\n this.services.logger.error(`Failed to read segments from CMS API!`, err);\r\n return {};\r\n }\r\n }\r\n\r\n async getLanguageSwitcherConfiguration(url: string): Promise {\r\n try {\r\n return await this.services.http.get(`${this.apiOrigin}/api/languageswitcher?publicationid=${this._publicationID}&url=${this._addSlashesInTheSides(url)}`);\r\n } catch (err) {\r\n this.services.logger.error(`Failed to get language switcher configuration for page ${url}`, err);\r\n return null;\r\n }\r\n }\r\n\r\n private _isRouteToHtmlFile(pathName: string): boolean {\r\n return pathName.endsWith('.htm')\r\n || pathName.endsWith('.html');\r\n }\r\n\r\n\r\n private _addSlashesInTheSides(pathName) {\r\n if(pathName && pathName[0] !== '/') {\r\n pathName = '/' + pathName;\r\n }\r\n\r\n //we append the trailing slash if the path doesn't ends with slash and also the path doesn't ends with .html or .htm\r\n //we don't append the trailing slash for paths like /path/file.htm or /path/file.html\r\n if(pathName && !this._isRouteToHtmlFile(pathName) && pathName[pathName.length - 1] !== '/') {\r\n pathName = pathName + '/';\r\n }\r\n\r\n if(pathName) {\r\n return pathName;\r\n }\r\n\r\n return '/';\r\n }\r\n\r\n}\r\n","import React from 'react';\r\nimport {OrbitComponent} from '../../base-components/orbit-component/orbit-component';\r\nimport {CmsContentDecorator} from '../../../services/cms/cms-content-decorator/cms-content-decorator';\r\nimport {observer} from 'mobx-react';\r\nimport {CmsBannerId} from '../../../services/cms/cms-banners/cm-banner-id/cms-banner-id';\r\n\r\nexport interface BannerContentComponentProps {\r\n html: string;\r\n bannerId: CmsBannerId;\r\n}\r\n\r\nexport const BannerContentComponent = observer(\r\n class BannerContentComponent extends OrbitComponent {\r\n\r\n componentWillUnmount() {\r\n super.componentWillUnmount();\r\n this._disposeBannerContentDecorator();\r\n }\r\n\r\n componentDidUpdate() {\r\n this._redecorateBannerContent();\r\n }\r\n\r\n private _disposeBannerContentDecorator() {\r\n if(this._bannerContentDecorator) {\r\n this._bannerContentDecorator.dispose();\r\n this._bannerContentDecorator = null;\r\n }\r\n }\r\n\r\n private _redecorateBannerContent() {\r\n this._disposeBannerContentDecorator();\r\n if(this._bannerContentElementRef) {\r\n this._bannerContentElementRef.innerHTML = this.props.html;\r\n this._bannerContentDecorator = new CmsContentDecorator(this._bannerContentElementRef, this.services);\r\n }\r\n }\r\n\r\n private _bannerContentDecorator: CmsContentDecorator | null = null;\r\n\r\n private _bannerContentElementRef: HTMLSpanElement | null = null;\r\n\r\n private _captureBannerContentElementRef = (element: HTMLSpanElement | null) => {\r\n this._bannerContentElementRef = element;\r\n this._redecorateBannerContent();\r\n };\r\n\r\n render() {\r\n return ();\r\n }\r\n }\r\n);\r\n","import React from 'react';\r\nimport {BannerRenderProps, IBannerDefinition} from './banner-definition.interface';\r\nimport {BannerContentComponent} from '../../../../components/cms-banner/banner-content/banner-content.component';\r\nimport {CmsBannerId} from '../cm-banner-id/cms-banner-id';\r\n\r\n\r\nexport class BannerDefinition implements IBannerDefinition {\r\n constructor(public _html: string, private _bannerId: CmsBannerId) {\r\n }\r\n\r\n render(props: BannerRenderProps): React.ReactNode {\r\n return ();\r\n }\r\n}\r\n","import {ServiceBase} from '../../ServiceBase';\r\nimport {ICmsBannersService} from './cms-banners.service.interface';\r\nimport { action, observable, makeObservable } from 'mobx';\r\nimport {IBannerDefinition} from './banner-definition/banner-definition.interface';\r\nimport {IServiceFactoryExtended} from '../../service-factory-extended.interface';\r\nimport {CmsBannerId} from './cm-banner-id/cms-banner-id';\r\nimport {Check} from '@sparkware/app-utils';\r\nimport {BannerDefinition} from './banner-definition/banner-definition';\r\n\r\nimport {EmptyBannerDefinition} from './banner-definition/empty-banner-definition';\r\nimport {BannerData} from '../cms-api/cms-api.service.interface';\r\n\r\ntype ReadBannersResponse = Array<{id: CmsBannerId, definition: IBannerDefinition}>;\r\n\r\nexport class CmsBannersService extends ServiceBase implements ICmsBannersService {\r\n\r\n constructor(services: IServiceFactoryExtended) {\r\n super(services);\r\n\r\n makeObservable(this);\r\n\r\n this.reaction(\r\n () => this.services.user.isAuthorized,\r\n (isAuthorized) => {\r\n this._reloadBannersContent();\r\n }\r\n );\r\n }\r\n\r\n\r\n private _currentUsedBannersIds: {[key: string]: CmsBannerId} = {};\r\n\r\n @observable\r\n bannersMap: {[key: string]: IBannerDefinition} = {};\r\n\r\n async loadBanner(bannerId: CmsBannerId): Promise {\r\n if(!this.bannersMap[bannerId.key]) {\r\n let banners = await this._readBanners([bannerId]);\r\n this._setBanners(banners);\r\n }\r\n const hasBannerContent = Check.isObject(this.bannersMap[bannerId.key]);\r\n return hasBannerContent;\r\n }\r\n\r\n private _reloadBannersContent() {\r\n this._readBanners(Object.values(this._currentUsedBannersIds))\r\n .then(banners => {\r\n this._setBanners(banners);\r\n });\r\n }\r\n\r\n @action.bound\r\n private _setBanners(banners: ReadBannersResponse) {\r\n banners.forEach(newBanner => {\r\n this.bannersMap[newBanner.id.key] = newBanner.definition;\r\n this._currentUsedBannersIds[newBanner.id.key] = newBanner.id;\r\n });\r\n }\r\n\r\n private async _readBanners(bannersIds: CmsBannerId[]): Promise {\r\n let separatedBannersIds: {\r\n emptyBanners: CmsBannerId[];\r\n validBanners: CmsBannerId[];\r\n } = {\r\n emptyBanners: [],\r\n validBanners: []\r\n };\r\n\r\n bannersIds.reduce((acc, bId) => {\r\n if (bId.isValidCmsId()) {\r\n acc.validBanners.push(bId);\r\n } else {\r\n acc.emptyBanners.push(bId);\r\n }\r\n return acc;\r\n }, separatedBannersIds);\r\n\r\n let bannersIdsCollection = new BannersIdCollection(separatedBannersIds.validBanners);\r\n\r\n let bannersWithContent: ReadBannersResponse = [];\r\n if (separatedBannersIds.validBanners.length) {\r\n let cmsResponseData = await (await this.services.cmsApi).getBanners(separatedBannersIds.validBanners);\r\n //create definitions for bannersMap that we received some content\r\n bannersWithContent = this._extractBannersWithContent(bannersIdsCollection, cmsResponseData);\r\n }\r\n //for banners that we didn't receive any content try to load a default content and then merge the results\r\n let bannersIdsWithoutContent = bannersIdsCollection.exclude(bannersWithContent.map(bannerInfo => bannerInfo.id));\r\n\r\n let fallbackBanners = await this._readFallbackBanners([...separatedBannersIds.emptyBanners, ...bannersIdsWithoutContent]);\r\n\r\n return [...bannersWithContent, ...fallbackBanners];\r\n\r\n /*.catch((err) => {\r\n let msg = bannersIds.reduce((acc, curr) => acc + '\\n' + curr.toString(), '');\r\n this.services.logger.error(`Failed to load CMS banners for ${msg}`, err);\r\n return this._readFallbackBanners(bannersIds);\r\n });\r\n */\r\n }\r\n\r\n private _extractBannersWithContent(requestedBannersIdsCollection: BannersIdCollection, cmsResponseData: BannerData[]): ReadBannersResponse {\r\n if(!Check.isArray(cmsResponseData)) {\r\n return [];\r\n }\r\n\r\n return cmsResponseData\r\n .filter(bannerData => !Check.isEmpty(bannerData.Content))\r\n .map(bannerData => {\r\n let bannerId = requestedBannersIdsCollection.getOriginalBannerId(bannerData.ComponentId, bannerData.TemplateId);\r\n return {\r\n id: bannerId,\r\n definition: new BannerDefinition(bannerData.Content, bannerId)\r\n };\r\n });\r\n }\r\n\r\n private async _readFallbackBanners(bannersIds: CmsBannerId[]): Promise {\r\n if(bannersIds.length === 0) {\r\n return Promise.resolve([]);\r\n }\r\n // for bannersMap that have fallback file we try to read the default banner content and then merge with those without fallback file\r\n let bannersIdsWithFallbackFile = bannersIds.filter(id => !Check.isEmpty(id.fallbackFileName));\r\n let bannersIdsGroupedByFallbackFile = this._groupBannersIdsByFallbackFile(bannersIdsWithFallbackFile);\r\n let fileNames = Object.keys(bannersIdsGroupedByFallbackFile);\r\n\r\n\r\n let fallbackData = await (await this.services.cmsApi).getFallbackBanners(fileNames);\r\n\r\n let result: ReadBannersResponse = [];\r\n fileNames.forEach(file => {\r\n let bannerContent = fallbackData[file];\r\n if(bannerContent) {\r\n result = result.concat(this._createBannersDefinitionsWithContent(bannersIdsGroupedByFallbackFile[file], bannerContent));\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n\r\n private _groupBannersIdsByFallbackFile(bannersIds: CmsBannerId[]): {[key: string]: CmsBannerId[]} {\r\n let result = {};\r\n bannersIds.forEach(bannerId => {\r\n if(!result[bannerId.fallbackFileName]) {\r\n result[bannerId.fallbackFileName] = [];\r\n }\r\n\r\n result[bannerId.fallbackFileName].push(bannerId);\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private _createBannersDefinitionsWithContent(bannersIds: CmsBannerId[], bannerContent: string): ReadBannersResponse {\r\n return bannersIds.map(id => {\r\n let definition: IBannerDefinition;\r\n if(Check.isEmpty(bannerContent)) {\r\n definition = new EmptyBannerDefinition();\r\n } else {\r\n definition = new BannerDefinition(bannerContent, id);\r\n }\r\n\r\n return {id: id, definition: definition};\r\n });\r\n }\r\n}\r\n\r\n\r\nclass BannersIdCollection {\r\n\r\n private _originalBannersMap = {};\r\n\r\n constructor(private _originalBannersIds: CmsBannerId[]) {\r\n this._originalBannersIds.forEach(bannerId => {\r\n this._originalBannersMap[bannerId.key] = bannerId;\r\n });\r\n }\r\n\r\n getOriginalBannerId(componentId: number, templateId: number): CmsBannerId {\r\n for(let i = 0; i < this._originalBannersIds.length; i++) {\r\n let bannerId = this._originalBannersIds[i];\r\n if(bannerId.isMatch(componentId, templateId)) {\r\n return bannerId;\r\n }\r\n }\r\n \r\n throw new Error(`Cant't find original banner id for componentId=${componentId} and templateId=${templateId}`);\r\n }\r\n\r\n exclude(bannersIdsToExclude: CmsBannerId[]): CmsBannerId[] {\r\n let bannersIdsToExcludeMap = {};\r\n bannersIdsToExclude.forEach(bannerId => bannersIdsToExcludeMap[bannerId.key] = bannerId);\r\n\r\n return this._originalBannersIds.filter(bannerId => !bannersIdsToExcludeMap[bannerId.key]);\r\n }\r\n}\r\n","import {ServiceBase} from '../../ServiceBase';\r\nimport {ICmsPagesService} from './cms-pages.service.interface';\r\nimport {\r\n ICmsPageDefinition,\r\n ICmsPageDefinitionHeadTags,\r\n IInjectedHeadTag\r\n} from './page-definition/cms-page-definition.interface';\r\nimport { action, observable, makeObservable } from 'mobx';\r\nimport {IServiceFactoryExtended} from '../../service-factory-extended.interface';\r\nimport {CmsPageData} from '../cms-api/cms-api.service.interface';\r\nimport {Uri} from '../../location/uri/uri';\r\nimport {Check} from \"@sparkware/app-utils\";\r\nimport {UriPath} from \"../../location/uri-path/uri-path\";\r\nimport {UriParams} from \"../../location/uri-params/uri-params\";\r\n\r\nexport const LOAD_CONTENT_FROM_DIV_PAGE_DELAY = 250;\r\n\r\nexport class CmsPagesService extends ServiceBase implements ICmsPagesService {\r\n\r\n constructor(services: IServiceFactoryExtended) {\r\n super(services);\r\n\r\n makeObservable(this);\r\n\r\n this.reaction(\r\n () => this.services.location.currentUri,\r\n (uri) => this._loadCmsPage(uri),\r\n { fireImmediately: true }\r\n );\r\n\r\n this.reaction(\r\n () => this.services.user.isAuthorized,\r\n () => this._reloadCurrentPageContent(),\r\n { fireImmediately: true }\r\n );\r\n }\r\n\r\n private _currentUri: Uri | null = null;\r\n private _isFirstLoad = true;\r\n\r\n @observable.ref\r\n currentPage: ICmsPageDefinition | null = null;\r\n injectedPageMetaTags: IInjectedHeadTag[] = [];\r\n\r\n @action.bound\r\n private _setCurrentPage(pageDefinition: ICmsPageDefinition | null) {\r\n this.currentPage = pageDefinition;\r\n }\r\n\r\n private setCurrentPageMetaTags(headerTags: ICmsPageDefinitionHeadTags[]){\r\n\r\n const prepareElementSelector = (elementType:string, attributes = {}) => {\r\n const attributesQuery = Object.keys(attributes).reduce((query, attributeName) => {\r\n if(!Check.isString(attributes[attributeName]) || attributeName === 'tag')\r\n return query;\r\n\r\n return query + `[${attributeName}=\"${attributes[attributeName]}\"]`;\r\n }, '');\r\n\r\n return elementType + attributesQuery;\r\n }\r\n\r\n const setElementAttributes = (element, attributes = {}) => {\r\n Object.keys(attributes).forEach(attributeName => {\r\n if(attributeName !== 'tag')\r\n element.setAttribute(attributeName, attributes[attributeName]);\r\n });\r\n }\r\n\r\n const addMetaTags = (headerTags: ICmsPageDefinitionHeadTags[]) => {\r\n headerTags.forEach(headerTag => {\r\n const {tag, content, href, ...rest} = headerTag;\r\n try {\r\n if(tag){\r\n let metaTag = this.services.dom.querySelector(prepareElementSelector(tag, rest)) as HTMLElement;\r\n const injectedPageMetaTagPreviousElement = metaTag;\r\n\r\n if(!metaTag){\r\n metaTag = this.services.dom.createElement(tag);\r\n this.services.dom.head.appendChild(metaTag);\r\n }\r\n\r\n this.injectedPageMetaTags.push({element: metaTag, previous: injectedPageMetaTagPreviousElement ? (injectedPageMetaTagPreviousElement.cloneNode() as HTMLElement) : undefined});\r\n setElementAttributes(metaTag, headerTag);\r\n }\r\n }catch (err){\r\n this.services.logger.error(`Failed to add metaTag: ${tag}`, err);\r\n }\r\n\r\n })\r\n }\r\n\r\n const removeMetaTags = (injectedMetaTags: IInjectedHeadTag[]) => {\r\n (injectedMetaTags || []).forEach(({element, previous}) => {\r\n if(previous){\r\n element.parentNode?.replaceChild(previous, element);\r\n }else{\r\n element.remove();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * To have more meta tags allowed to be injected from pageContent, add an other Regex here\r\n */\r\n const allowedTags = '(link.*(?:\\\\[rel=\"canonical\"]))|' +\r\n '(meta.*(?:\\\\[property=\"og:updated_time\"]))|' +\r\n '(meta.*(?:\\\\[property=\"og:description\"]))|' +\r\n '(meta.*(?:\\\\[property=\"og:url\"]))|' +\r\n '(meta.*(?:\\\\[name=\"og:title\"]))|' +\r\n '(meta.*(?:\\\\[name=\"description\"]))'\r\n ;\r\n\r\n const metaTags = (headerTags || []).filter(({tag,content, ...rest}) => {\r\n const testIfTagAllowedRegex = new RegExp(allowedTags, 'i');\r\n return testIfTagAllowedRegex.test(prepareElementSelector(tag, rest));\r\n });\r\n\r\n if(this.injectedPageMetaTags.length > 0){\r\n removeMetaTags(this.injectedPageMetaTags);\r\n this.injectedPageMetaTags = [];\r\n }\r\n\r\n addMetaTags(metaTags);\r\n }\r\n\r\n\r\n private async _reloadCurrentPageContent(): Promise {\r\n if(this.currentPage) {\r\n this._currentUri = null;\r\n try {\r\n await this._loadCmsPage(this.services.location.currentUri);\r\n } catch (err) {\r\n this.services.logger.error(`Failed to reload CMS page ${this.currentPage.url}`, err);\r\n }\r\n }\r\n }\r\n\r\n\r\n private async _loadCmsPage(uri: Uri): Promise {\r\n\r\n if(this._currentUri && this._currentUri.pathName && uri.pathName.equals(this._currentUri.pathName)) {\r\n return;\r\n }\r\n\r\n this._currentUri = uri;\r\n\r\n let pageElement = this.services.dom.getElementById('page');\r\n if(this._isFirstLoad && pageElement && !this.services.routing.isOrbitRoute(uri.pathName)) {\r\n this._isFirstLoad = false;\r\n if(this.services.user.isAuthorized){\r\n //In case the user is login we must call the API and not use the DOM page since b2c need to get the XX.context to return the right segments,\r\n //But we must clean the #page div content to avoid duplicate b2c content on the page\r\n pageElement.remove();\r\n await this._loadPageContentWithSpinner(uri);\r\n } else{\r\n this._loadPageContentFromDOM(pageElement, uri);\r\n }\r\n\r\n } else {\r\n this._isFirstLoad = false;\r\n await this._loadPageContentWithSpinner(uri);\r\n }\r\n }\r\n\r\n\r\n private async _loadPageContentWithSpinner(uri: Uri): Promise {\r\n const isB2CRoute = !this.services.routing.isOrbitRoute(uri.pathName);\r\n if(isB2CRoute) {\r\n this.services.spinner.startSpinner();\r\n }\r\n\r\n try {\r\n await this._loadCmsPageFromApi(uri)\r\n } finally {\r\n if(isB2CRoute) {\r\n this.services.spinner.stopSpinner();\r\n }\r\n }\r\n\r\n }\r\n\r\n private _loadPageContentFromDOM(pageElement: HTMLElement, uri: Uri): void {\r\n // we introduced this delay because if some of the scripts in the innerHTML contains a