{"version":3,"file":"static/js/08ec8236e003b8200320.bundle.js","mappings":"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","sources":["webpack://mattressfirm/./src/themes/mattressfirm/views/promo-banner.view.tsx?dbcd","webpack://mattressfirm/./lib/promo-banner/module-registration.js?d732","webpack://mattressfirm/./src/modules/promo-banner/components/close-button.tsx?063b","webpack://mattressfirm/./src/modules/promo-banner/components/links.tsx?2587","webpack://mattressfirm/./src/modules/promo-banner/components/text.tsx?782b","webpack://mattressfirm/./src/modules/promo-banner/promo-banner.tsx?9ee9","webpack://mattressfirm/./src/modules/promo-banner/promo-banner.view.tsx?7f77","webpack://mattressfirm/external var \"React\"?0d3b","webpack://mattressfirm/external var \"ReactDOM\"?853b"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\nimport ReactHtmlParser from 'react-html-parser';\r\nimport {\r\n IBannerScheduleData,\r\n ICountdownScheduleData,\r\n IPromoBannerProps\r\n} from '../definition-extensions/promo-banner.ext.props.autogenerated';\r\n\r\n// countdown component\r\nimport Countdown, { CountdownRenderProps } from 'react-countdown';\r\n\r\n// used for date/time functionailty\r\nimport MsDyn365, { Link, ILinksData } from '@msdyn365-commerce/core';\r\nimport dayjs from 'dayjs';\r\nimport tz from 'dayjs/plugin/timezone';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport isBetween from 'dayjs/plugin/isBetween';\r\ndayjs.extend(tz);\r\ndayjs.extend(utc);\r\ndayjs.extend(isBetween);\r\nconst format = 'M/D/YYYY H:m:s';\r\n\r\nimport { IPromoBannerViewProps } from '@msdyn365-commerce-modules/promo-banner';\r\n\r\n// tslint:disable-next-line: max-func-body-length\r\nconst PromoBannerView: React.FC & IPromoBannerViewProps> = props => {\r\n const {\r\n promoBannerProps,\r\n promoBannerLinksProps,\r\n closeButton,\r\n carouselProps,\r\n config: { mfrmBannerMessages, bannerLimit }\r\n } = props;\r\n\r\n // VSI Customization - START\r\n\r\n const scheduledSlides: JSX.Element[] = [];\r\n // counter for the banner limit\r\n const adjustedBannerLimit = bannerLimit !== undefined ? bannerLimit : (mfrmBannerMessages && mfrmBannerMessages.length) || 0;\r\n let bannerCount = 0;\r\n\r\n mfrmBannerMessages &&\r\n mfrmBannerMessages.forEach((message, index) => {\r\n const bannersUnderLimit = adjustedBannerLimit - bannerCount;\r\n const bannerSchedule = message.bannerSchedule;\r\n\r\n // banner only follows schedule if enableBannerSchedule config is set to true\r\n const bannerShouldShow = bannerSchedule && bannerSchedule.enableBannerSchedule ? isScheduled(bannerSchedule) : true;\r\n\r\n // checks if banner is set to be enabled, is currently scheduled, and the banner limit hasn't been surpassed\r\n if (message.enableBanner && bannersUnderLimit && bannerShouldShow) {\r\n const countdownSchedule = message.countdownSchedule;\r\n bannerCount++;\r\n\r\n // add countdown to richText if required\r\n const parsedRichText = message.richText && ReactHtmlParser(message.richText.toString());\r\n\r\n // add countdown component into richText\r\n countdownSchedule && parsedRichText && countdownSchedule.enableCountdown && setCountDown(countdownSchedule, parsedRichText);\r\n\r\n const editableLink: ILinksData = {\r\n ariaLabel: message.links![0].ariaLabel,\r\n className: 'ms-promo-banner__link',\r\n linkText: message.links![0].linkText,\r\n openInNewTab: message.links![0].openInNewTab,\r\n role: 'link',\r\n linkUrl: message.links![0].linkUrl.destinationUrl\r\n };\r\n\r\n const promoBannerParentDivRef = React.useRef();\r\n React.useEffect(() => {\r\n promoBannerParentDivRef.current &&\r\n promoBannerParentDivRef.current.addEventListener('click', function(event: React.MouseEvent) {\r\n event.preventDefault();\r\n if ('utag' in window) {\r\n const eventLabel = `${htmltoText(message.richText?.toString()!).trim()}`;\r\n // @ts-ignore\r\n utag.link({\r\n event: 'pencil banner tracking',\r\n event_category: 'pencil banner tracking',\r\n event_action: 'pencil banner click',\r\n event_label: eventLabel,\r\n event_noninteraction: 'false'\r\n });\r\n }\r\n if (MsDyn365.isBrowser) {\r\n window.location.href = message.links![0].linkUrl.destinationUrl;\r\n }\r\n });\r\n }, []);\r\n\r\n scheduledSlides.push(\r\n \r\n \r\n {message.richText &&
{parsedRichText}
}\r\n {message.links && message.links.length > 0 && }\r\n
\r\n
\r\n );\r\n }\r\n });\r\n\r\n // override the _next() and _prev() functions from promo-banner.tsx to only count scheduled slides instead of all slides when determining first and last slides\r\n carouselProps.next = (): void => {\r\n const isLastItem = props.activeIndex === scheduledSlides.length - 1;\r\n const nextIndex = isLastItem ? 0 : props.activeIndex + 1;\r\n // sets the index for the next button. equivalent to _goToIndex() from promo-banner.tsx\r\n carouselProps.onIndicatorsClickHandler(nextIndex);\r\n };\r\n\r\n carouselProps.previous = (): void => {\r\n const isFirstItem = props.activeIndex === 0;\r\n const nextIndex = isFirstItem ? (mfrmBannerMessages ? scheduledSlides.length - 1 : 0) : props.activeIndex - 1;\r\n carouselProps.onIndicatorsClickHandler(nextIndex);\r\n };\r\n\r\n return (\r\n \r\n } />\r\n {closeButton}\r\n \r\n );\r\n};\r\n\r\n// strips content inside given element\r\nconst clearContent = (parsedRichText: React.ReactElement[]): void => {\r\n // find countdown element and clear its content\r\n for (let i = 0; i < parsedRichText.length; i++) {\r\n const element = parsedRichText[i];\r\n const classNames = element.props.className && element.props.className.split(' ');\r\n if (classNames && classNames.includes('countdown')) {\r\n element.props.children.length = 0;\r\n return;\r\n }\r\n }\r\n};\r\n\r\n// adds Countdown component as a child of the element with the id 'countdown' is countdown should show\r\nconst setCountDown = (countdownSchedule: ICountdownScheduleData, parsedRichText: React.ReactElement[]): void => {\r\n // check if countdown is scheduled to show\r\n if (!isScheduled(countdownSchedule)) {\r\n return;\r\n }\r\n\r\n // clear content inside 'countdown' element\r\n clearContent(parsedRichText);\r\n\r\n const endDate = countdownSchedule.endDate;\r\n const endTime = countdownSchedule.endTime;\r\n const scheduleEnd = dayjs(`${endDate} ${endTime}`, format);\r\n const scheduleEndLocal = scheduleEnd && convertToLocal(scheduleEnd, countdownSchedule);\r\n\r\n const renderer = ({ formatted }: CountdownRenderProps) => {\r\n return (\r\n \r\n {formatted.hours}:{formatted.minutes}:\r\n {formatted.seconds}\r\n \r\n );\r\n };\r\n\r\n const countdown = scheduleEndLocal && ;\r\n\r\n // find target and put countdown inside of it\r\n parsedRichText.forEach(element => {\r\n const classNames = element.props.className && element.props.className.split(' ');\r\n if (classNames && classNames.includes('countdown')) {\r\n element.props.children.push(countdown);\r\n return;\r\n }\r\n });\r\n};\r\n\r\n// checks if countdown/banner is currently scheduled\r\nconst isScheduled = (schedule: ICountdownScheduleData | IBannerScheduleData): Boolean => {\r\n let start = schedule.startDate && schedule.startTime && dayjs(`${schedule.startDate} ${schedule.startTime}`, format);\r\n let end = schedule.endDate && schedule.endTime && dayjs(`${schedule.endDate} ${schedule.endTime}`, format);\r\n\r\n // check if schedule is valid\r\n const validStart = start && start.isValid();\r\n const validEnd = end && end.isValid();\r\n\r\n if (!validStart || !validEnd) {\r\n return false;\r\n }\r\n\r\n const now = dayjs();\r\n\r\n // convert to local time\r\n start = start && convertToLocal(start, schedule);\r\n end = end && convertToLocal(end, schedule);\r\n\r\n return now.isBetween(start, end);\r\n};\r\n\r\n// convert time to local time\r\nconst convertToLocal = (time: dayjs.Dayjs, schedule: ICountdownScheduleData | IBannerScheduleData): dayjs.Dayjs | undefined => {\r\n const timeZone = schedule.timeZone && getTimeZone(schedule.timeZone);\r\n\r\n return !timeZone\r\n ? time\r\n : dayjs(time.format(format), format)\r\n .tz(timeZone)\r\n .local();\r\n};\r\n\r\n// convert timezone choice to matching timezone in moment-timezone\r\nconst getTimeZone = (timeZone: string): string | undefined => {\r\n switch (timeZone) {\r\n case 'hawaii':\r\n return 'America/Adak';\r\n case 'alaska':\r\n return 'America/Anchorage';\r\n case 'pacific':\r\n return 'America/Los_Angeles';\r\n case 'mountain':\r\n return 'America/Denver';\r\n case 'central':\r\n return 'America/Chicago';\r\n case 'eastern':\r\n return 'America/New_York';\r\n default:\r\n return undefined;\r\n }\r\n};\r\n\r\nconst htmltoText = (html: string) => {\r\n if (MsDyn365.isBrowser) {\r\n // Create a new div element\r\n const tempDivElement = document.createElement('div');\r\n\r\n // Set the HTML content with the given value\r\n // tslint:disable-next-line: no-inner-html\r\n tempDivElement.innerHTML = html;\r\n\r\n // Retrieve the text property of the element\r\n return tempDivElement.textContent || tempDivElement.innerText || '';\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\n// VSI Customization - END\r\n\r\nexport default PromoBannerView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n (binding.modules['promo-banner'] = {\n c: () => require('@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner/promo-banner'),\n $type: 'contentModule',\n da: [],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'promo-banner',\n p: 'promo-banner',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner'\n });\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|mattressfirm|views|promo-banner'] = {\n c: () => require('partner/themes/mattressfirm/views/promo-banner.view.tsx'),\n cn: '__local__-__local__-promo-banner'\n };\nviewDictionary['@msdyn365-commerce-modules|promo-banner|modules|promo-banner|promo-banner'] = {\n c: () => require('@msdyn365-commerce-modules/promo-banner/dist/lib/modules/promo-banner/promo-banner.view.js'),\n cn: '@msdyn365-commerce-modules-promo-banner-promo-banner'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, TelemetryConstant } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nexport interface IPromoBannerCloseButton {\n closeButtonAriaLabel?: string;\n label?: string;\n telemetryContent?: ITelemetryContent;\n onClose(): void;\n\n}\n\nexport const PromoBannerCloseButton: React.FC = ({ closeButtonAriaLabel, label, telemetryContent, onClose }) => {\n const payLoad = getPayloadObject('click', telemetryContent!, TelemetryConstant.PromoBannerClose);\n const attributes = getTelemetryAttributes(telemetryContent!, payLoad);\n return (\n \n \n {label}\n \n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { ILinksData } from '../promo-banner.props.autogenerated';\n\nexport interface IPromoBannerLinks {\n links: ILinksData[];\n requestContext: Msdyn365.IRequestContext;\n telemetryContent: ITelemetryContent;\n onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\n}\n\nexport const PromoBannerLinks: React.FC = ({ links, requestContext, onTextChange, telemetryContent }) => {\n const editableLinks = _mapEditableLinks(links, telemetryContent);\n return (\n \n {editableLinks && editableLinks.length > 0 ? : null}\n \n );\n};\n\nconst _mapEditableLinks = (linkdata: ILinksData[], telemetryContent: ITelemetryContent): Msdyn365.ILinksData[] | null => {\n if (!linkdata || linkdata.length === 0) {\n return null;\n }\n const editableLinks: Msdyn365.ILinksData[] = [];\n linkdata.forEach((link, index) => {\n // Construct telemetry attribute to render\n const payLoad = getPayloadObject('click', telemetryContent, '', '');\n const linkText = link.linkText ? link.linkText : '';\n payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(telemetryContent, payLoad);\n const editableLink: Msdyn365.ILinksData = {\n ariaLabel: link.ariaLabel,\n className: 'ms-promo-banner__link',\n linkText: link.linkText,\n linkUrl: link.linkUrl.destinationUrl,\n openInNewTab: link.openInNewTab,\n role: 'link',\n additionalProperties: attributes,\n onClick: onTelemetryClick(telemetryContent, payLoad, linkText)\n };\n editableLinks.push(editableLink);\n });\n\n return editableLinks;\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport * as React from 'react';\n\nexport interface IPromoBannerText {\n text: string;\n requestContext: Msdyn365.IRequestContext;\n onTextChange(event: Msdyn365.ContentEditableEvent): void;\n}\n\nexport const PromoBannerText: React.FC = ({ text, onTextChange, requestContext }) => {\n return (\n \n );\n};\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Carousel } from '@msdyn365-commerce/components';\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { getTelemetryObject, IModuleProps, INodeProps, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { PromoBannerCloseButton, PromoBannerLinks, PromoBannerText } from './components';\nimport { IBannerMessagesData, IPromoBannerProps, IPromoBannerResources } from './promo-banner.props.autogenerated';\n\nexport interface IPromoBannerState {\n animating: boolean;\n isVisible: boolean;\n activeIndex: number;\n}\n\nexport interface IPromoBannerViewProps extends IPromoBannerProps<{}>, IPromoBannerState {\n promoBannerProps: IModuleProps;\n contentProps: INodeProps ;\n bannerMessages: IBannerMessagesData[];\n promoBannerTextProps: INodeProps;\n promoBannerLinksProps: INodeProps;\n carouselProps: INodeProps;\n closeButton?: React.ReactNode;\n className: string;\n promoBannerText: string;\n resources: IPromoBannerResources;\n onDismiss(): void;\n handleText(): void;\n handleLinks(): void;\n}\n\n/**\n *\n * PromoBannerModule component.\n * @extends {React.PureComponent>}\n */\nclass PromoBanner extends React.PureComponent, IPromoBannerState> {\n public state: IPromoBannerState = {\n animating: false,\n isVisible: true,\n activeIndex: 0\n };\n\n private readonly telemetryContent: ITelemetryContent = getTelemetryObject(this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry);\n\n public render(): JSX.Element | null {\n const { bannerMessages, dismissEnabled, interval, hideFlipper, autoplay, className = '' } = this.props.config;\n const { closeButtonAriaLabel, closeButtonLabel, bannerText } = this.props.resources;\n const { isVisible, activeIndex } = this.state;\n\n if (!isVisible) {\n this.props.context.telemetry.error('Promo banner content is empty, module wont render.');\n return null;\n }\n\n const viewProps = {\n // Context for telemetry and raw data for C1 to do customization\n // Including computed data, state data and methods\n ...this.props,\n className: classnames('ms-promo-banner', className),\n isVisible, // State data\n onDismiss: this._onDismiss, // Methods\n handleLinks: this.handleLinkTextChange,\n handleText: this.handleTextChange,\n\n promoBannerProps: { className: classnames('ms-promo-banner', className), moduleProps: this.props, role: 'banner' },\n promoBannerTextProps: {\n tag: PromoBannerText\n },\n promoBannerLinksProps: {\n tag: PromoBannerLinks,\n telemetryContent: this.telemetryContent\n },\n contentProps: { className: 'ms-promo-banner__content' },\n promoBannerText: bannerText,\n bannerMessages,\n activeIndex,\n carouselProps: {\n tag: Carousel,\n className: 'ms-promo-banner__carousel',\n activeIndex,\n next: this._next,\n previous: this._previous,\n onIndicatorsClickHandler: this._goToIndex,\n hideIndicator: hideFlipper,\n interval,\n hideFlipper,\n autoplay\n },\n closeButton: dismissEnabled && \n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n public handleTextChange = (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[0]) {\n this.props.config.bannerMessages[0].text = event.target.value;\n }\n };\n\n public handleLinkTextChange = (linkIndex: number) => (event: Msdyn365.ContentEditableEvent) => {\n if (this.props.config.bannerMessages && this.props.config.bannerMessages[1]) {\n const links = this.props.config.bannerMessages[1].links;\n if (links) {\n links[linkIndex].linkText = event.target.value;\n }\n }\n };\n\n private readonly _next = (): void => {\n const nextIndex = this._isLastItem() ? 0 : this.state.activeIndex + 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _previous = (): void => {\n const nextIndex = this._isFirstItem() ? (this.props.config.bannerMessages ? this.props.config.bannerMessages.length - 1 : 0) : this.state.activeIndex - 1;\n this._goToIndex(nextIndex);\n };\n\n private readonly _goToIndex = (index: number): void => {\n if (this.state.animating) {\n return;\n }\n this.setState({ activeIndex: index });\n };\n\n private readonly _isFirstItem = () => this.state.activeIndex === 0;\n\n private readonly _isLastItem = () => this.props.config.bannerMessages && this.state.activeIndex === this.props.config.bannerMessages.length - 1;\n\n private readonly _onDismiss = (): void => {\n this.setState({ isVisible: false });\n };\n}\n\nexport default PromoBanner;\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\nimport * as React from 'react';\n\nimport { IPromoBannerViewProps } from './promo-banner';\n\nconst PromoBannerView: React.FC = props => {\n const {\n promoBannerProps,\n contentProps,\n closeButton,\n bannerMessages,\n promoBannerTextProps,\n promoBannerLinksProps,\n carouselProps,\n promoBannerText,\n handleLinks,\n handleText\n } = props;\n\n const slides = bannerMessages && bannerMessages.map((message, index) => {\n return (\n \n \n {promoBannerText}\n \n {message.text && }\n {message.links && message.links.length > 0 && }\n \n );\n });\n\n return (\n \n \n {closeButton}\n \n );\n};\nexport default PromoBannerView;\n","module.exports = React;","module.exports = ReactDOM;"],"names":["dayjs","tz","utc","isBetween","format","setCountDown","countdownSchedule","parsedRichText","isScheduled","i","length","element","classNames","props","className","split","includes","children","clearContent","endDate","endTime","scheduleEnd","scheduleEndLocal","convertToLocal","countdown","React","Countdown","date","toDate","daysInHours","renderer","formatted","hours","minutes","seconds","forEach","push","schedule","start","startDate","startTime","end","validStart","isValid","validEnd","now","time","timeZone","getTimeZone","local","htmltoText","html","MsDyn365","tempDivElement","document","createElement","innerHTML","textContent","innerText","promoBannerProps","promoBannerLinksProps","closeButton","carouselProps","config","mfrmBannerMessages","bannerLimit","scheduledSlides","adjustedBannerLimit","undefined","bannerCount","message","index","bannersUnderLimit","bannerSchedule","bannerShouldShow","enableBannerSchedule","enableBanner","richText","ReactHtmlParser","toString","enableCountdown","editableLink","ariaLabel","links","linkText","openInNewTab","role","linkUrl","destinationUrl","promoBannerParentDivRef","current","addEventListener","event","preventDefault","window","eventLabel","trim","utag","link","event_category","event_action","event_label","event_noninteraction","location","href","Node","ref","key","Link","Object","next","nextIndex","activeIndex","onIndicatorsClickHandler","previous","Module","items","binding","modules","dataActions","c","require","$type","da","iNM","ns","n","p","pdp","md","__bindings__","viewDictionary","cn","PromoBannerCloseButton","closeButtonAriaLabel","label","telemetryContent","onClose","payLoad","getPayloadObject","TelemetryConstant","attributes","getTelemetryAttributes","onClick","PromoBannerLinks","requestContext","onTextChange","editableLinks","_mapEditableLinks","Msdyn365","editProps","linkdata","contentAction","etext","additionalProperties","onTelemetryClick","PromoBannerText","text","tag","onEdit","PromoBanner","constructor","state","animating","isVisible","getTelemetryObject","this","context","request","telemetryPageName","friendlyName","telemetry","handleTextChange","bannerMessages","target","value","handleLinkTextChange","linkIndex","_next","_isLastItem","_goToIndex","_previous","_isFirstItem","setState","_onDismiss","render","dismissEnabled","interval","hideFlipper","autoplay","closeButtonLabel","bannerText","resources","error","viewProps","classnames","onDismiss","handleLinks","handleText","moduleProps","promoBannerTextProps","contentProps","promoBannerText","Carousel","hideIndicator","renderView","slides","map","module","exports","ReactDOM"],"sourceRoot":""}