{"version":3,"file":"static/js/f5792a7b1a268e73aa0c.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/modules/only-c-product-page-summary/only-c-product-page-summary.action.ts?0fb3","webpack://Msdyn365.Commerce.Online/./src/modules/only-c-product-page-summary/only-c-product-page-summary.tsx?5c5a","webpack://Msdyn365.Commerce.Online/./lib/only-c-product-page-summary/module-registration.js?a9e5","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICommerceApiSettings,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport { getAttributeValuesAsync, getByIdAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport {\r\n buildCacheKey,\r\n generateImageUrl,\r\n getProductUrlSync,\r\n getSelectedProductIdFromActionInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { IPageSummaryData } from '@msdyn365-commerce-modules/page-summary';\r\nimport { IOnlyCProductPageSummaryConfig } from './only-c-product-page-summary.props.autogenerated';\r\nimport { AttributeValue } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Product Page Summary Input\r\n */\r\nexport class ProductPageSummaryInput implements IActionInput {\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public config: IOnlyCProductPageSummaryConfig;\r\n\r\n public productId: number;\r\n\r\n constructor(config: IOnlyCProductPageSummaryConfig, apiSettings: ICommerceApiSettings, productId: number) {\r\n this.config = config || {};\r\n this.apiSettings = apiSettings;\r\n this.productId = productId;\r\n }\r\n\r\n public getCacheObjectType = (): string => 'ProductPageSummary';\r\n\r\n public getCacheKey = (): string => `${buildCacheKey('ProductPageSummary', this.apiSettings)}-${this.config.title}-${this.productId}`;\r\n\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\nexport interface IProductPageSummary extends IPageSummaryData {\r\n price?: number;\r\n productId?: number;\r\n productBrand?: string;\r\n}\r\n\r\nconst createInput = (args: ICreateActionContext) => {\r\n const productId = getSelectedProductIdFromActionInput(args);\r\n\r\n if (productId) {\r\n return new ProductPageSummaryInput(args.config, args.requestContext.apiSettings, +productId);\r\n }\r\n throw new Error('Unable to create ProductPageSummaryAction input, no productId found on module config or query');\r\n};\r\n\r\n// Checks product attributes for the presence of brand attribute to extract the brand name for product metadata\r\nconst getProductBrand = (productAttributes: AttributeValue[]): string => {\r\n return productAttributes?.find((item: AttributeValue) => item.Name === 'Brand')?.TextValue ?? '';\r\n};\r\n\r\n/**\r\n *\r\n * @param productAttributes Fetch description from one of two product attributes\r\n * @param config\r\n * @returns\r\n */\r\nconst getProductDescription = (productAttributes: AttributeValue[], config: IOnlyCProductPageSummaryConfig): string => {\r\n const { customDescriptionAttr, friendlyDescriptionAttr } = config;\r\n let pDescription = productAttributes?.find(\r\n (item: AttributeValue) => item.Name === (customDescriptionAttr ?? 'FriendlyDescriptionCustom')\r\n )?.TextValue;\r\n\r\n if (!pDescription || pDescription === '') {\r\n pDescription = productAttributes?.find((item: AttributeValue) => item.Name === (friendlyDescriptionAttr ?? 'FriendlyDescription'))\r\n ?.TextValue;\r\n }\r\n return pDescription?.replace('- ', '. ') ?? '';\r\n};\r\n\r\nconst getProductName = (productName: string): string => {\r\n return productName\r\n .split(' ')\r\n .map(word => {\r\n // product names often in all caps, whcih schema.org doesn't like\r\n if (word.length > 1 && word === word.toUpperCase()) {\r\n return word[0].toUpperCase() + word.substring(1).toLowerCase();\r\n }\r\n return word;\r\n })\r\n .join(' ');\r\n};\r\n\r\nconst action = async (input: ProductPageSummaryInput, context: IActionContext): Promise => {\r\n const { config, productId, apiSettings } = input;\r\n const simpleProductPromise = getByIdAsync({ callerContext: context }, productId, apiSettings.channelId);\r\n const productAttributesPromise = getAttributeValuesAsync(\r\n { callerContext: context, queryResultSettings: {} },\r\n productId,\r\n apiSettings.channelId,\r\n apiSettings.catalogId\r\n );\r\n return Promise.all([simpleProductPromise, productAttributesPromise])\r\n .then(results => {\r\n const simpleProductData = results[0];\r\n const productAttributes = results[1];\r\n let productUrl: string | undefined;\r\n try {\r\n productUrl = getProductUrlSync(simpleProductData, context);\r\n const canonicalDomain = context.requestContext.canonicalDomain;\r\n if (productUrl && canonicalDomain) {\r\n productUrl = `https://${canonicalDomain}${productUrl}`.toLocaleLowerCase();\r\n } else {\r\n productUrl = undefined;\r\n }\r\n } catch {\r\n productUrl = undefined;\r\n }\r\n return {\r\n title: getProductName(simpleProductData.Name ?? ''),\r\n description: getProductDescription(productAttributes, config),\r\n sharingImageUrl: generateImageUrl(simpleProductData.PrimaryImageUrl, apiSettings),\r\n canonicalUrl: productUrl,\r\n faviconUrl: config && config.faviconUrl,\r\n productId: simpleProductData.RecordId,\r\n price: simpleProductData.AdjustedPrice,\r\n productBrand: getProductBrand(productAttributes)\r\n };\r\n })\r\n .catch(e => {\r\n // If the action fails fallback to values defined from config\r\n if (config) {\r\n return {\r\n title: config.title,\r\n description: config.description,\r\n sharingImageUrl: config.sharingImage && config.sharingImage.src,\r\n faviconUrl: config && config.faviconUrl\r\n };\r\n }\r\n return {};\r\n });\r\n};\r\n\r\nexport default createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/page-summary/product-page-summary',\r\n action: >action,\r\n input: createInput\r\n});\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { HtmlHeadInclude, IAny, IGeneric } from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nimport { IOnlyCProductPageSummaryData } from './only-c-product-page-summary.data';\r\nimport { IOnlyCProductPageSummaryProps } from './only-c-product-page-summary.props.autogenerated';\r\nimport { ICategoryUrl } from '@msdyn365-commerce/core-internal/dist/types/interfaces/ICategoryPathInterfaces';\r\nimport { IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n/**\r\n *\r\n * ProductPageSummary component.\r\n * @extends {React.PureComponent}\r\n */\r\nclass ProductPageSummary extends React.PureComponent> {\r\n public render(): JSX.Element {\r\n if (this.props.data.productPageSummary.result === undefined) {\r\n throw new Error('PageSummaryData input to page-summary is undefined. Unable to generate page-summary');\r\n }\r\n let {\r\n data: {\r\n productPageSummary: {\r\n result: { title, description, keywords, sharingImageUrl, faviconUrl }\r\n }\r\n }\r\n } = this.props;\r\n\r\n const {\r\n config,\r\n context,\r\n data: {\r\n productPageSummary: {\r\n result: { canonicalUrl, productId, productBrand, price }\r\n },\r\n categoryPaths\r\n }\r\n } = this.props;\r\n\r\n // Product SEO metadata specific information - non-overridable\r\n const productName = title;\r\n const productDescription = description;\r\n const productImageUrl = sharingImageUrl;\r\n\r\n // Override values coming from data action if config values are provided\r\n title = config.title || title;\r\n description = config.description || description;\r\n keywords = config.keywords || keywords;\r\n sharingImageUrl = (config.sharingImage && config.sharingImage.src) || sharingImageUrl;\r\n faviconUrl = config.faviconUrl || faviconUrl;\r\n // VSI Customization to display stock status\r\n const enableStockCheck = this.props.context.app.config.enableStockCheck;\r\n const productAvailableQuantity: IProductInventoryInformation[] | undefined = this.props.data.productAvailableQuantity?.result;\r\n const productAvailability =\r\n productAvailableQuantity && productAvailableQuantity.length > 0\r\n ? productAvailableQuantity[0].ProductAvailableQuantity\r\n : undefined;\r\n const availableQuantity = productAvailability?.AvailableQuantity && productAvailability?.AvailableQuantity;\r\n const stockStatus: string =\r\n enableStockCheck && availableQuantity === 0 ? this.props.resources.emailOutOfStock : this.props.resources.emailInStock;\r\n\r\n // Construct page title with suffix and prefix if provided from app settings\r\n const pageTitle = this._constructPageTitle(title, context && context.request && context.request.app);\r\n return (\r\n <>\r\n \r\n {pageTitle && {pageTitle}}\r\n {description && }\r\n {keywords && }\r\n {canonicalUrl && }\r\n {faviconUrl && }\r\n \r\n {this._renderProductMetadata(\r\n productName,\r\n productDescription,\r\n productImageUrl,\r\n canonicalUrl,\r\n productId,\r\n price,\r\n context.request.channel?.Currency,\r\n productBrand,\r\n stockStatus,\r\n categoryPaths?.result\r\n )}\r\n {this._renderOrganizationMetadata()}\r\n {!config.disableOgTags && this._renderOgTags(pageTitle, description, sharingImageUrl)}\r\n {!config.disableTwitterTags && this._renderTwitterTags(pageTitle, description, sharingImageUrl)}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the facebook and other social media specific metadata tags.\r\n *\r\n * @param title Page title.\r\n * @param description Product description.\r\n * @param sharingImageUrl Primary product image url.\r\n */\r\n private _renderOgTags(title?: string, description?: string, sharingImageUrl?: string): JSX.Element {\r\n return (\r\n \r\n {title && }\r\n {description && }\r\n {sharingImageUrl && }\r\n \r\n \r\n );\r\n }\r\n\r\n /**\r\n * Constructs and renders the JSON-LD tag used to output product specific metadata used by search engine crawlers.\r\n *\r\n * @param productName Product name.\r\n * @param description Product description.\r\n * @param sharingImageUrl Primary product image url.\r\n * @param canonicalUrl Product canonical url.\r\n * @param productId Master product id.\r\n * @param price Proudct price.\r\n * @param currencyCode Current channel currency code.\r\n * @param productBrand Product brand.\r\n */\r\n private _renderProductMetadata(\r\n productName?: string,\r\n description?: string,\r\n sharingImageUrl?: string,\r\n canonicalUrl?: string,\r\n productId?: number,\r\n price?: number,\r\n currencyCode?: string,\r\n productBrand?: string,\r\n stockStatus?: string,\r\n categoryPaths?: ICategoryUrl[]\r\n ): JSX.Element {\r\n var productCategory: string = '';\r\n categoryPaths?.forEach((item: ICategoryUrl, index: number) => {\r\n if (index === categoryPaths.length - 1) {\r\n productCategory += item.Name?.toString();\r\n } else {\r\n productCategory += `${item.Name?.toString()} > `;\r\n }\r\n });\r\n // Construct the JSON-LD data that contains the product metadata information used by search enginge crawlers\r\n const productMetaData = JSON.stringify({\r\n '@context': 'http://schema.org',\r\n '@type': 'Product',\r\n name: productName,\r\n description,\r\n image: sharingImageUrl,\r\n sku: productId,\r\n category: productCategory,\r\n brand: {\r\n '@type': 'Brand',\r\n name: productBrand\r\n },\r\n offers: {\r\n '@type': 'Offer',\r\n availability: stockStatus ? stockStatus : this.props.resources.emailInStock,\r\n url: canonicalUrl,\r\n priceCurrency: currencyCode,\r\n price\r\n }\r\n });\r\n return (\r\n \r\n