{"version":3,"file":"static/js/edf2a48c520461694e57.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/product-page-summary/product-page-summary.action.ts?e077","webpack://Msdyn365.Commerce.Online/./src/modules/product-page-summary/product-page-summary.tsx?f297","webpack://Msdyn365.Commerce.Online/./lib/product-page-summary/module-registration.js?deb5","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\nimport { getAttributeValuesAsync, getByIdsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\nimport {\n ArrayExtensions,\n generateCacheKey,\n generateImageUrl,\n getProductUrlSync,\n getSelectedProductIdFromActionInput,\n QueryResultSettingsProxy,\n removeDomainQspFromUrl\n} from '@msdyn365-commerce-modules/retail-actions';\n\nimport { IPageSummaryData } from '@msdyn365-commerce-modules/page-summary';\nimport { IProductPageSummaryConfig } from './product-page-summary.props.autogenerated';\n\n/**\n * Product Page Summary Input.\n */\nexport class ProductPageSummaryInput implements IActionInput {\n public apiSettings: ICommerceApiSettings;\n\n public config: IProductPageSummaryConfig;\n\n public productId: number;\n\n public catalogId?: number;\n\n public constructor(\n config: IProductPageSummaryConfig,\n apiSettings: ICommerceApiSettings,\n productId: number,\n requestContext?: IRequestContext\n ) {\n this.config = config || {};\n this.apiSettings = apiSettings;\n this.productId = productId;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheObjectType = (): string => 'ProductPageSummary';\n\n public getCacheKey = (): string =>\n generateCacheKey(\n this.apiSettings,\n { key: 'Key', value: 'ProductPageSummary' },\n { key: 'Title', value: this.config.title },\n { key: 'ProductId', value: this.productId },\n { key: 'CatalogId', value: this.catalogId }\n );\n\n public dataCacheType = (): CacheType => 'application';\n}\n\nexport interface IProductPageSummary extends IPageSummaryData {\n price?: number;\n productId?: number;\n productBrand?: string;\n}\n\nconst createInput = (args: ICreateActionContext) => {\n const productId = getSelectedProductIdFromActionInput(args);\n\n if (productId) {\n return new ProductPageSummaryInput(\n args.config,\n args.requestContext.apiSettings,\n +productId,\n args.requestContext\n );\n }\n throw new Error('Unable to create ProductPageSummaryAction input, no productId found on module config or query');\n};\n\n// Checks product attributes for the presence of brand attribute to extract the brand name for product metadata\nconst getProductBrand = async (\n context: IActionContext,\n recordId: number,\n channelId: number,\n catalogId: number\n): Promise => {\n const productAttributes = await getAttributeValuesAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n recordId,\n channelId,\n catalogId\n );\n for (const productAttribute of productAttributes) {\n if (productAttribute.Name === 'Brand') {\n return productAttribute.TextValue;\n }\n }\n return;\n};\n\nconst action = async (input: ProductPageSummaryInput, context: IActionContext): Promise => {\n const { config, productId, apiSettings } = input;\n let simpleProductsData: SimpleProduct[] | undefined;\n try {\n simpleProductsData = ArrayExtensions.validValues(\n await getByIdsAsync(\n {\n callerContext: context,\n queryResultSettings: QueryResultSettingsProxy.getPagingFromInputDataOrDefaultValue(context)\n },\n apiSettings.channelId,\n [productId],\n null,\n input.catalogId ?? 0\n )\n );\n } catch {\n // Do nothing, if there's an error we fall back to values defined from config\n }\n if (ArrayExtensions.hasElements(simpleProductsData)) {\n const simpleProductData = simpleProductsData[0];\n let productUrl: string | undefined;\n try {\n productUrl = getProductUrlSync(simpleProductData, context);\n const canonicalDomain = context.requestContext.canonicalDomain;\n if (productUrl && canonicalDomain) {\n productUrl = `https://${canonicalDomain}${productUrl}`.toLocaleLowerCase();\n productUrl = removeDomainQspFromUrl(productUrl, context.requestContext);\n } else {\n productUrl = undefined;\n }\n } catch {\n productUrl = undefined;\n }\n let productBrand: string | undefined;\n try {\n productBrand = await getProductBrand(context, productId, apiSettings.channelId, input.catalogId ?? 0);\n } catch {\n productBrand = undefined;\n }\n return {\n title: simpleProductData.Name,\n description: simpleProductData.Description,\n sharingImageUrl: generateImageUrl(simpleProductData.PrimaryImageUrl, apiSettings),\n canonicalUrl: productUrl,\n faviconUrl: config && config.faviconUrl,\n productId: simpleProductData.RecordId,\n price: simpleProductData.AdjustedPrice,\n productBrand\n };\n\n // If the action fails fallback to values defined from config\n } else if (config) {\n return {\n title: config.title,\n description: config.description,\n sharingImageUrl: config.sharingImage && config.sharingImage.src,\n faviconUrl: config && config.faviconUrl\n };\n }\n return {};\n};\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce-modules/page-summary/product-page-summary',\n action: >action,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\n/* eslint-disable no-duplicate-imports */\nimport { HtmlHeadInclude, IAny, IGeneric } from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nimport { IProductPageSummaryData } from './product-page-summary.data';\nimport { IProductPageSummaryProps } from './product-page-summary.props.autogenerated';\n\n/**\n *\n * ProductPageSummary component.\n * @extends {React.PureComponent}\n */\nclass ProductPageSummary extends React.PureComponent> {\n public render(): JSX.Element {\n if (this.props.data.productPageSummary.result === undefined) {\n throw new Error('PageSummaryData input to page-summary is undefined. Unable to generate page-summary');\n }\n let {\n data: {\n productPageSummary: {\n result: { title, description, keywords, sharingImageUrl, faviconUrl }\n }\n }\n } = this.props;\n\n const {\n config,\n context,\n data: {\n productPageSummary: {\n result: { canonicalUrl, productId, productBrand, price }\n }\n }\n } = this.props;\n\n // Product SEO metadata specific information - non-overridable\n const productName = title;\n const productDescription = description;\n const productImageUrl = sharingImageUrl;\n\n // Override values coming from data action if config values are provided\n title = config.title || title;\n description = config.description || description;\n keywords = config.keywords || keywords;\n sharingImageUrl = (config.sharingImage && config.sharingImage.src) || sharingImageUrl;\n faviconUrl = config.faviconUrl || faviconUrl;\n\n // Construct page title with suffix and prefix if provided from app settings\n const pageTitle = this._constructPageTitle(title, context && context.request && context.request.app);\n return (\n <>\n \n {pageTitle && {pageTitle}}\n {description && }\n {keywords && }\n {canonicalUrl && }\n {faviconUrl && }\n \n {this._renderProductMetadata(\n productName,\n productDescription,\n productImageUrl,\n canonicalUrl,\n productId,\n price,\n context.request.channel?.Currency,\n productBrand\n )}\n {!config.disableOgTags && this._renderOgTags(pageTitle, description, sharingImageUrl)}\n {!config.disableTwitterTags && this._renderTwitterTags(pageTitle, description, sharingImageUrl)}\n \n );\n }\n\n /**\n * Renders the facebook and other social media specific metadata tags.\n *\n * @param title Page title.\n * @param description Product description.\n * @param sharingImageUrl Primary product image url.\n */\n private _renderOgTags(title: string | undefined, description: string | undefined, sharingImageUrl: string | undefined): JSX.Element {\n return (\n \n {title && }\n {description && }\n {sharingImageUrl && }\n \n \n );\n }\n\n /**\n * Constructs and renders the JSON-LD tag used to output product specific metadata used by search engine crawlers.\n *\n * @param productName Product name.\n * @param description Product description.\n * @param sharingImageUrl Primary product image url.\n * @param canonicalUrl Product canonical url.\n * @param productId Master product id.\n * @param price Proudct price.\n * @param currencyCode Current channel currency code.\n * @param productBrand Product brand.\n */\n private _renderProductMetadata(\n productName: string | undefined,\n description: string | undefined,\n sharingImageUrl: string | undefined,\n canonicalUrl: string | undefined,\n productId: number | undefined,\n price: number | undefined,\n currencyCode: string | undefined,\n productBrand: string | undefined\n ): JSX.Element {\n // Construct the JSON-LD data that contains the product metadata information used by search enginge crawlers\n const productMetaData = JSON.stringify({\n '@context': 'http://schema.org',\n '@type': 'Product',\n name: productName,\n description,\n image: sharingImageUrl,\n sku: productId,\n brand: {\n '@type': 'Brand',\n name: productBrand\n },\n offers: {\n '@type': 'Offer',\n url: canonicalUrl,\n priceCurrency: currencyCode,\n price\n }\n });\n return (\n \n {/* eslint-disable-next-line react/no-danger -- Implementation is a copy.*/}\n