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