{"version":3,"file":"static/js/application.async.landing~2b4e833a.dafdd226.chunk.js","mappings":"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","sources":["../../../../component-react/packages/language-select/src/language-select.js","../../../../component-react/packages/language-selector/src/language-selector.js","../../../../component-react/packages/legacy-bid-setting/src/style.js","../../../../component-react/packages/legacy-bid-setting/src/legacy-bid-setting.js","../../../../component-react/packages/legacy-call-to-action/src/call-to-action-aria-text/index.js","../../../../component-react/packages/legacy-call-to-action/src/call-to-action-text/index.tsx","../../../../component-react/packages/legacy-call-to-action/src/style.js","../../../../component-react/packages/legacy-call-to-action/src/locale-to-language.js","../../../../component-react/packages/legacy-call-to-action/src/legacy-call-to-action.js","../../../../component-react/packages/legacy-call-to-action/src/validated-legacy-call-to-action.js","../../../../component-react/packages/legacy-call-to-action/src/action-text-localization.js","../../../../component-react/packages/legacy-call-to-action/src/legacy-call-to-action-with-language.js","../../../../component-react/packages/legacy-call-to-action/src/validated-legacy-call-to-action-with-language.js","../../../../component-react/packages/legacy-call-to-action/src/validated-legacy-call-to-action-with-language-section.js","../../../../component-react/packages/legacy-deps-context/src/legacy-deps-context.js","../../../../component-react/packages/legacy-shared-budget/src/style.js","../../../../component-react/packages/legacy-shared-budget/src/legacy-shared-budget.js","../../../../component-react/packages/legacy-shopping-settings/src/style.js","../../../../component-react/packages/legacy-shopping-settings/src/legacy-shopping-settings.js","../../../../component-react/packages/location-targeting/src/utils/target-options.js","../../../../component-react/packages/location-targeting/src/styles/location-targeting-style.js","../../../../component-react/packages/location-targeting/src/utils/shimmer-element.js","../../../../component-react/packages/location-targeting/src/location-targeting-selection.js","../../../../component-react/packages/location-targeting/src/styles/intent-targeting-style.js","../../../../component-react/packages/location-targeting/src/location-targeting-intent.js","../../../../component-react/packages/location-targeting/src/location-targeting-error/location-targeting-error-type.js","../../../../component-react/packages/location-targeting/src/styles/location-targeting-error-style.js","../../../../component-react/packages/location-targeting/src/location-targeting-error/location-targeting-error-callout.js","../../../../component-react/packages/location-targeting/src/location-targeting-error/location-targeting-error-message.js","../../../../component-react/packages/location-targeting/src/location-targeting.js","../../../../component-react/packages/location-targeting/src/utils/location-target-types.js","../../../../component-react/packages/location-targeting/src/utils/location-target-converter.js","../../../../component-react/packages/location-targeting/src/utils/entity-action-types.js","../../../../component-react/packages/location-targeting/src/utils/data-transformer.js","../../../../component-react/packages/page-feed-selector/src/option-item.js","../../../../component-react/packages/page-feed-selector/src/alerts.js","../../../../component-react/packages/page-feed-selector/src/page-feed-selector-section-impl.js","../../../../component-react/packages/page-feed-selector/src/page-feed-selector-section.js","../../../../component-react/packages/page-feed-selector/src/data-source.js","../../../../component-react/packages/perf-max-recommendation/src/utils.js","../../../../component-react/packages/perf-max-recommendation/src/recommendation-context.js","../../../../component-react/packages/perf-max-recommendation/src/log-recommendations.js","../../../../component-react/packages/perf-max-recommendation/src/use-recommendations.js","../../../../component-react/packages/perf-max-recommendation/src/use-image-recommendations.js","../../../../component-react/packages/perf-max-recommendation/src/use-copilot-recommendations.js","../../../../component-react/packages/perf-max-recommendation/src/with-final-url-recommendation-update.js","../../../../component-react/packages/performance-marker-provider/src/perf-marker-context.js","../../../../component-react/packages/performance-marker-provider/src/hooks.js","../../../../component-react/packages/performance-marker-provider/src/provider.js","../../../../component-react/packages/play-pause-buttons/src/play-pause-buttons.js","../../../../component-react/packages/pmax-image-experience/src/style.js","../../../../component-react/packages/pmax-image-experience/src/shared.js","../../../../component-react/packages/pmax-image-experience/src/image-list-data.js","../../../../component-react/packages/pmax-image-experience/src/image-experience-wrapper.js","../../../../component-react/packages/pmax-image-experience/src/image-list-portal-beacon-adapter.js","../../../../component-react/packages/pmax-image-experience/src/image-list-portal-container.js","../../../../component-react/packages/pmax-image-experience/src/image-list-card-details.js","../../../../component-react/packages/pmax-image-experience/src/ad-preview-controls.js","../../../../component-react/packages/pmax-image-experience/src/perf-max-ad-preview.js","../../../../component-react/packages/pmax-image-experience/src/perf-max-ad-preview-uapl.js","../../../../component-react/packages/pmax-image-experience/src/ad-preview-responsive-styles.js","../../../../component-react/packages/pmax-image-experience/src/perf-max-responsive-ad-preview-uapl.js","../../../../component-react/packages/pmax-image-experience/src/carousel-pmax-style.js","../../../../component-react/packages/pmax-image-experience/src/image-recommendations-panel.js","../../../../component-react/packages/pmax-image-experience/src/perf-max-image-suggestion-carousel.js","../../../../component-react/packages/pmax-image-experience/src/image-list-portal-container-with-carousel-section.js","../../../../component-react/packages/pmax-image-experience/src/logo-list-portal-container-section.js","../../../../component-react/packages/pmax-image-experience/src/image-list-portal-container-section.js","../../../../component-react/packages/pmax-text-input/src/recommendations-constants.js","../../../../component-react/packages/pmax-text-input/src/styles.js","../../../../component-react/packages/pmax-text-input/src/text-asset-recommendations-panel.js","../../../../component-react/packages/pmax-text-input/src/text-asset-recommendations-with-themes-panel.js","../../../../component-react/packages/pmax-text-input/src/inline-recommendations.js","../../../../component-react/packages/pmax-text-input/src/use-circular-buffer-view.js","../../../../component-react/packages/pmax-text-input/src/text-asset-recommendations-dropdown.js","../../../../component-react/packages/pmax-text-input/src/pmax-text-asset-collection-config.js","../../../../component-react/packages/pmax-text-input/src/text-asset-collection-with-recommendations.js","../../../../component-react/packages/pmax-text-input/src/text-asset-collections.js","../../../../component-react/packages/pmax-text-input/src/store-backed-business-name.js","../../../../component-react/packages/pmax-text-input/src/business-name-with-recommendation.js","../../../../component-react/packages/pmax-text-input/src/business-name-with-recommendation-section.js","../../../../component-react/packages/pmax-text-input/src/validated-final-url-with-recommendations.js","../../../../component-react/packages/pmax-text-input/src/validated-final-url-with-recommendations-section.js","../../../../component-react/packages/pmax-text-input/src/utils.js","../../../../component-react/packages/pmax-text-input/src/description-asset-collection.js","../../../../component-react/packages/pmax-text-input/src/headline-asset-collection.js","../../../../component-react/packages/pmax-text-input/src/long-headline-asset-collection.js","../../../../component-react/packages/pmax-text-input/src/description-asset-collection-section.js","../../../../component-react/packages/pmax-text-input/src/headline-asset-collection-section.js","../../../../component-react/packages/pmax-text-input/src/long-headline-asset-collection-section.js","../../../../component-react/packages/remaining-chars-hint/src/string-util.js","../../../../component-react/packages/remaining-chars-hint/src/remaining-chars-hint.js","../../../../component-react/packages/remaining-chars-hint/src/shared.js","../../../../component-react/packages/remaining-chars-hint/src/style.js","../../../../component-react/packages/remaining-chars-hint/src/remaining-chars-validated-text-field.js","../../../../component-react/packages/remaining-chars-hint/src/with-remaining-chars.js","../../../../component-react/packages/remaining-chars-hint/src/remaining-chars-unvalidated-text-field.js","../../../../component-react/packages/remaining-chars-hint/src/with-remaining-chars-unvalidated.js","../../../../component-react/packages/remaining-chars-hint/src/controlled-remaining-chars-unvalidated-text-field.js","../../../../component-react/packages/remaining-chars-hint/src/with-controlled-remaining-chars-unvalidated.js","../../../../component-react/packages/responsive-ad-editor-components/src/hotspots/glyphList.ts","../../../../component-react/packages/responsive-ad-editor-components/src/hotspots/placementList.ts","../../../../component-react/packages/responsive-ad-editor-components/src/hotspots/hotspot.tsx","../../../../component-react/packages/responsive-ad-editor-components/src/hotspots/hotspot-panel.tsx","../../../../component-react/packages/responsive-ad-editor-components/src/boost-anchors/index.tsx","../../../../component-react/packages/responsive-ad-editor-utils/src/types.ts","../../../../component-react/packages/responsive-ad-editor-utils/src/image-metadata-util.js","../../../../component-react/packages/responsive-ad-editor-utils/src/data-process/mma-in-msan-dataprocessor.ts","../../../../component-react/packages/responsive-ad-editor-utils/src/image-repository-util.js","../../../../component-react/packages/responsive-ad-editor-utils/src/data-process/get-logo-experience.ts","../../../../component-react/packages/responsive-ad-editor-utils/src/data-process/get-portrait-experience.ts","../../../../component-react/packages/responsive-ad-editor-utils/src/config.js","../../../../component-react/packages/responsive-ad-editor-utils/src/constants.js","../../../../component-react/packages/responsive-ad-editor-utils/src/format-data-util.js","../../../../component-react/packages/responsive-ad-editor-utils/src/image-asset-model-util.js","../../../../component-react/packages/responsive-image-list-view/src/editable-image-button.js","../../../../component-react/packages/responsive-image-list-view/src/sparkle-menu-button.js","../../../../component-react/packages/responsive-image-list-view/src/index.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/strings.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/ad-strength-helper.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/new-ad-strength-score.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/styles.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/ad-strength.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/ad-strength-repository.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/ad-strength-suggestion-picker.js","../../../../component-react/packages/responsive-search-ad-suggestion/src/ad-strength-top-grid.js","../../../../component-react/packages/shared-image-experience-styles/src/palette.js","../../../../component-react/packages/shared-image-experience-styles/src/imageCommonStyle.js","../../../../component-react/packages/shared-image-preview-styles/src/common-preview-container-styles.js","../../../../component-react/packages/shared-tile/src/shared-props.js","../../../../component-react/packages/shared-tile/src/get-styles.js","../../../../component-react/packages/shared-tile/src/tile-header.js","../../../../component-react/packages/shared-tile/src/tile-footer.js","../../../../component-react/packages/shared-tile/src/tile.js","../../../../component-react/packages/shared-tile/src/components/page-navigation-footer.js","../../../../component-react/packages/shared-tile/src/components/page-navigation-footer-styles.js"],"sourcesContent":["import _ from 'underscore';\r\nimport React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Select } from '@bingads-webui-react/primitive';\r\n\r\nconst GA_LANGUAGES = ['English', 'German', 'French', 'Spanish', 'Italian', 'Portuguese', 'Dutch', 'Swedish', 'TraditionalChinese', 'Danish', 'Finnish', 'Norwegian'];\r\n\r\nexport const LANGUAGE_STRINGS = {\r\n English: _TL_('English'),\r\n German: _TL_('German'),\r\n French: _TL_('French'),\r\n Spanish: _TL_('Spanish'),\r\n Italian: _TL_('Italian'),\r\n Portuguese: _TL_('Portuguese'),\r\n Dutch: _TL_('Dutch'),\r\n Swedish: _TL_('Swedish'),\r\n TraditionalChinese: _TL_('Traditional Chinese'),\r\n Danish: _TL_('Danish'),\r\n Finnish: _TL_('Finnish'),\r\n Norwegian: _TL_('Norwegian'),\r\n\r\n Bulgarian: _TL_('Bulgarian'),\r\n Croatian: _TL_('Croatian'),\r\n Czech: _TL_('Czech'),\r\n Estonian: _TL_('Estonian'),\r\n Greek: _TL_('Greek'),\r\n Hungarian: _TL_('Hungarian'),\r\n Latvian: _TL_('Latvian'),\r\n Lithuanian: _TL_('Lithuanian'),\r\n Maltese: _TL_('Maltese'),\r\n Polish: _TL_('Polish'),\r\n Romanian: _TL_('Romanian'),\r\n Slovak: _TL_('Slovak'),\r\n Slovenian: _TL_('Slovenian'),\r\n\r\n Albanian: _TL_('Albanian'),\r\n Bosnian: _TL_('Bosnian'),\r\n Icelandic: _TL_('Icelandic'),\r\n Macedonian: _TL_('Macedonian'),\r\n Serbian: _TL_('Serbian'),\r\n Turkish: _TL_('Turkish'),\r\n\r\n Japanese: _TL_('Japanese'),\r\n Russian: _TL_('Russian'),\r\n Hebrew: _TL_('Hebrew'),\r\n Arabic: _TL_('Arabic'),\r\n\r\n SimplifiedChinese: _TL_('Simplified Chinese'),\r\n\r\n Hindi: _TL_('Hindi'),\r\n Malay: _TL_('Malay'),\r\n Thai: _TL_('Thai'),\r\n Indonesian: _TL_('Indonesian'),\r\n Tagalog: _TL_('Tagalog'),\r\n Vietnamese: _TL_('Vietnamese'),\r\n};\r\n\r\nconst pickLanguages = languages =>\r\n _.chain(languages)\r\n .reduce((memo, language) => {\r\n const outMemo = memo;\r\n outMemo[language] = LANGUAGE_STRINGS[language];\r\n return outMemo;\r\n }, {})\r\n .pairs()\r\n .value(); // [ [language, languageString], ... ]\r\n\r\nexport function LanguageSelect({\r\n className, id, ariaLabel, onChange, value: selected, i18n, enabledLanguageList,\r\n}) {\r\n const languages = pickLanguages(enabledLanguageList);\r\n const [selectedLanguage, setSelectedLanguage] = useState(selected);\r\n\r\n return (\r\n <Select\r\n id={id}\r\n className={className}\r\n aria-label={ariaLabel}\r\n value={selectedLanguage}\r\n onChange={(event) => {\r\n const language = event.target.value;\r\n setSelectedLanguage(language);\r\n onChange(language);\r\n }}\r\n >\r\n {languages.map(([key, value]) =>\r\n (\r\n <option key={key} value={key}>\r\n {i18n.getString(value)}\r\n </option>\r\n ))}\r\n </Select>\r\n );\r\n}\r\n\r\nLanguageSelect.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string.isRequired,\r\n ariaLabel: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n value: PropTypes.string,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n enabledLanguageList: PropTypes.arrayOf(PropTypes.string),\r\n};\r\n\r\nLanguageSelect.defaultProps = {\r\n id: undefined,\r\n value: 'English',\r\n ariaLabel: undefined,\r\n enabledLanguageList: GA_LANGUAGES,\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { Dropdown, Option } from '@fluentui/react-components';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nconst languageAll = 'All';\r\n\r\nexport function LanguageSelector(props) {\r\n const {\r\n languages,\r\n selectedLanguages,\r\n onSelectedLanguagesChanged,\r\n ariaLabel,\r\n multiSelect,\r\n } = props;\r\n\r\n const isSelectAll = useMemo(() => selectedLanguages.length === 1\r\n && selectedLanguages[0] === languageAll, [selectedLanguages]);\r\n\r\n const i18n = useContext(I18nContext);\r\n\r\n const options = _.map(languages, language => (\r\n {\r\n key: language.key,\r\n text: language.text,\r\n disabled: isSelectAll && language.key !== languageAll,\r\n }\r\n ));\r\n\r\n const value = useMemo(() => selectedLanguages.map(language => languages.find(option => option.key === language).text), [selectedLanguages, languages]);\r\n\r\n const dropdownStyles = { dropdown: { width: 320 } };\r\n\r\n return (\r\n <div className={classNames('language-selector-container')}>\r\n <Dropdown\r\n className=\"language-selector-dropdown\"\r\n ariaLabel={ariaLabel}\r\n multiselect={multiSelect}\r\n placeholder={i18n.getString(_TL_('Choose a language'))}\r\n selectedOptions={selectedLanguages}\r\n onOptionSelect={onSelectedLanguagesChanged}\r\n styles={dropdownStyles}\r\n value={value}\r\n >\r\n {options.map(option => (\r\n <Option value={option.key} disabled={option.disabled} text={option.text}>\r\n {option.text}\r\n </Option>\r\n ))}\r\n </Dropdown>\r\n </div>\r\n );\r\n}\r\n\r\nLanguageSelector.propTypes = {\r\n languages: PropTypes.arrayOf(PropTypes.string),\r\n selectedLanguages: PropTypes.arrayOf(PropTypes.string),\r\n onSelectedLanguagesChanged: PropTypes.func.isRequired,\r\n ariaLabel: PropTypes.string,\r\n multiSelect: PropTypes.bool,\r\n};\r\n\r\nLanguageSelector.defaultProps = {\r\n languages: [],\r\n selectedLanguages: [],\r\n ariaLabel: undefined,\r\n multiSelect: true,\r\n};\r\n","export const getStyles = () => ({\r\n bidSetting: {\r\n '& .bid-setting__container': {\r\n '& .control-label': {\r\n marginTop: 12,\r\n paddingLeft: 0,\r\n },\r\n\r\n '& .col-sm-4': {\r\n paddingLeft: 0,\r\n\r\n '& .input-group': {\r\n maxWidth: 140,\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BidSetting from '@bingads-webui-campaign-legacy/shopping-campaign/view/campaign-creation/bid-setting';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\n\r\nimport { getStyles } from './style';\r\n\r\n// For sponsored campaigns for the moment\r\nexport const LegacyBidSetting = React.memo(({\r\n id,\r\n className,\r\n onChange,\r\n activity,\r\n budgetAmount,\r\n validateWithBudget,\r\n defaultBidValue,\r\n}) => {\r\n const view = useRef();\r\n let container;\r\n\r\n useEffect(() => {\r\n view.current = new BidSetting({\r\n activityLogger: activity,\r\n isAudienceCampaign: false,\r\n isMSStoreCampaign: false,\r\n withRealTimeValidation: true,\r\n onChange,\r\n budgetAmount,\r\n defaultBidValue,\r\n validateWithBudget,\r\n });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => view.current.remove();\r\n }, [budgetAmount]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n <div\r\n id={id}\r\n className={classnames(className, classes.bidSetting)}\r\n >\r\n <div ref={(ref) => { container = ref; }} />\r\n </div>\r\n );\r\n});\r\n\r\nLegacyBidSetting.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n activity: PropTypes.shape({}),\r\n budgetAmount: PropTypes.number,\r\n defaultBidValue: PropTypes.number,\r\n validateWithBudget: PropTypes.bool,\r\n};\r\n\r\nLegacyBidSetting.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n activity: undefined,\r\n budgetAmount: null,\r\n defaultBidValue: null,\r\n validateWithBudget: false,\r\n};\r\n","import React, { forwardRef, useImperativeHandle, useMemo } from 'react';\r\nimport { isString } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { RemainingCharsValidatedTextField } from '@bingads-webui-campaign-react/remaining-chars-hint';\r\nimport { ResponsiveAd } from '@bingads-webui/campaign-odata-schemas';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\nimport { ValidationStringMap } from '@bingads-webui/validation-string-map';\r\n\r\nexport const CallToActionAriaText = forwardRef(({ i18n, value }, ref) => {\r\n const textFieldRef = React.useRef(null); // Create a ref for the TextField\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n const { maxLength } = ResponsiveAd.properties.CallToActionAriaText;\r\n\r\n const legacyI18n = useMemo(() => buildLegacyI18n(i18n, [ValidationStringMap]), [i18n]);\r\n\r\n const getErrorMessage = (newValue) => {\r\n if (isString(newValue)) {\r\n if (newValue.length > maxLength) {\r\n return i18n.getString(_TL_('Value cannot be longer than 30 characters'));\r\n }\r\n return '';\r\n }\r\n return '';\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: () => textFieldRef.current.value.trim(),\r\n isValid: () => {\r\n const newValue = textFieldRef.current.value.trim();\r\n const message = getErrorMessage(newValue);\r\n setErrorMessage(message);\r\n return message === '';\r\n },\r\n }));\r\n\r\n const handleChange = (event, [newValue]) => {\r\n setErrorMessage(getErrorMessage(newValue));\r\n };\r\n\r\n return (\r\n <RemainingCharsValidatedTextField\r\n value={value}\r\n i18n={i18n}\r\n label={i18n.getString(_TL_('Aria text'))}\r\n placeholder={i18n.getString(_TL_('Enter aria text'))}\r\n componentRef={textFieldRef}\r\n errorMessage={errorMessage}\r\n onChange={handleChange}\r\n validationProps={{\r\n schema: ResponsiveAd,\r\n field: 'CallToActionAriaText',\r\n alwaysShowError: true,\r\n i18n: legacyI18n,\r\n convertor: {\r\n fromModel: field => (field === 'delete_value' ? '' : field),\r\n },\r\n }}\r\n />\r\n );\r\n});\r\n\r\nCallToActionAriaText.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n value: PropTypes.string,\r\n};\r\n\r\nCallToActionAriaText.defaultProps = {\r\n value: '',\r\n};\r\n","import React, { forwardRef, useMemo, useImperativeHandle } from 'react';\r\nimport { isString } from 'underscore';\r\nimport { RemainingCharsValidatedTextField } from '@bingads-webui-campaign-react/remaining-chars-hint';\r\nimport { ResponsiveAd } from '@bingads-webui/campaign-odata-schemas';\r\nimport { buildLegacyI18n } from '@bingads-webui/build-legacy-i18n';\r\nimport { ValidationStringMap } from '@bingads-webui/validation-string-map';\r\n\r\n\r\n// eslint-disable-next-line no-underscore-dangle\r\ndeclare let _TL_: any;\r\n\r\ninterface CallToActionTextProps {\r\n i18n: any;\r\n defaultValue: string;\r\n}\r\n\r\nexport const CallToActionText: React.FC<CallToActionTextProps> = forwardRef(({ i18n, defaultValue = '' }: CallToActionTextProps, ref) => {\r\n const legacyI18n = useMemo(() => buildLegacyI18n(i18n, [ValidationStringMap]), [i18n]);\r\n const textFieldRef = React.useRef<any>(null); // Create a ref for the TextField\r\n const [errorMessage, setErrorMessage] = React.useState('');\r\n const { maxLength }= ResponsiveAd.properties.CallToActionText;\r\n\r\n const getErrorMessage = (newValue) => {\r\n if (isString(newValue)) {\r\n if (newValue.trim() === '') {\r\n return i18n.getString(_TL_('Required field'));\r\n } else if (newValue.length > maxLength) {\r\n return i18n.getString(_TL_('Value cannot be longer than 15 characters'));\r\n }\r\n return '';\r\n }\r\n return '';\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: (): string => textFieldRef.current.value.trim(),\r\n isValid: () => {\r\n const value = textFieldRef.current.value.trim();\r\n const message = getErrorMessage(value);\r\n setErrorMessage(message);\r\n return message === '';\r\n },\r\n }));\r\n\r\n const handleChange = (event, [newValue]) => {\r\n setErrorMessage(getErrorMessage(newValue));\r\n };\r\n\r\n const validationSchema = useMemo(() => ({\r\n type: 'object',\r\n properties: {\r\n CallToActionText: {\r\n ...ResponsiveAd.properties.CallToActionText,\r\n required: true,\r\n },\r\n },\r\n }), []);\r\n\r\n return (\r\n <RemainingCharsValidatedTextField\r\n required\r\n value={defaultValue}\r\n i18n={i18n}\r\n label={i18n.getString(_TL_('Custom action text'))}\r\n placeholder={i18n.getString(_TL_('Enter custom text'))}\r\n componentRef={textFieldRef}\r\n errorMessage={errorMessage}\r\n onChange={handleChange}\r\n validationProps={{\r\n schema: validationSchema,\r\n field: 'CallToActionText',\r\n alwaysShowError: true,\r\n i18n: legacyI18n,\r\n }}\r\n />\r\n );\r\n});\r\n\r\n","import { mergeStyles, convertToLocalStyle, actionDropdownStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nexport const getStyles = (components, theme) => ({\r\n callToActionContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n convertToLocalStyle(actionDropdownStyles(theme, { dropdownMinWidthPx: 281, noLeftMargin: true })),\r\n components.searchboxStyle\r\n ),\r\n },\r\n languageContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n convertToLocalStyle(actionDropdownStyles(theme, { dropdownMinWidthPx: 281, noLeftMargin: true }))\r\n ),\r\n\r\n '& .actionextension-search-dropdown-container .dropdown-menu': {\r\n top: 'unset',\r\n },\r\n\r\n marginBottom: '15px',\r\n },\r\n});\r\n","import { contains, has } from 'underscore';\r\nimport { globalizationModelSetup } from '@bingads-webui-campaign/ads-globalization';\r\n\r\nconst langCodeMapper = {\r\n 'zh-cn': 'SimplifiedChinese',\r\n 'zh-hans': 'SimplifiedChinese',\r\n ar: 'Arabic',\r\n bg: 'Bulgarian',\r\n bs: 'Bosnian',\r\n cs: 'Czech',\r\n da: 'Danish',\r\n de: 'German',\r\n el: 'Greek',\r\n en: 'English',\r\n es: 'Spanish',\r\n et: 'Estonian',\r\n fi: 'Finnish',\r\n fr: 'French',\r\n hr: 'Croatian',\r\n hu: 'Hungarian',\r\n is: 'Icelandic',\r\n it: 'Italian',\r\n iw: 'Hebrew',\r\n ja: 'Japanese',\r\n lt: 'Lithuanian',\r\n lv: 'Latvian',\r\n mk: 'Macedonian',\r\n mt: 'Maltese',\r\n nl: 'Dutch',\r\n no: 'Norwegian',\r\n pl: 'Polish',\r\n pt: 'Portuguese',\r\n ro: 'Romanian',\r\n ru: 'Russian',\r\n sk: 'Slovak',\r\n sl: 'Slovenian',\r\n sq: 'Albanian',\r\n sr: 'Serbian',\r\n sv: 'Swedish',\r\n tr: 'Turkish',\r\n zh: 'TraditionalChinese',\r\n};\r\n\r\nconst getLocalLanguage = locale => locale.split('-')[0];\r\n\r\nconst FALLBACK_LANGUAGE_CODE = 'en';\r\nconst DEFAULT_LANGUAGE = 'English';\r\nconst localeToLanguage = (locale = '') => {\r\n const lcLocale = locale.toLocaleLowerCase();\r\n const localesToTry = [lcLocale, getLocalLanguage(lcLocale), FALLBACK_LANGUAGE_CODE];\r\n for (let i = 0; i < localesToTry.length; i += 1) {\r\n const localeToTry = localesToTry[i];\r\n if (has(langCodeMapper, localeToTry)) {\r\n return langCodeMapper[localeToTry];\r\n }\r\n }\r\n return DEFAULT_LANGUAGE;\r\n};\r\n\r\nexport const getLanguage = (permissions, locale) => {\r\n const { LANGUAGES: supportedLanguages } = globalizationModelSetup({ permissions, culture: locale });\r\n const language = localeToLanguage(locale);\r\n if (contains(supportedLanguages, language)) {\r\n return language;\r\n } else if (permissions && permissions.IsDomesticSimplifiedChineseEnabled && contains(supportedLanguages, 'SimplifiedChinese')) {\r\n return 'SimplifiedChinese';\r\n }\r\n return DEFAULT_LANGUAGE;\r\n};\r\n","import { isEmpty, noop, isFunction } from 'underscore';\r\nimport ko from 'knockout';\r\nimport React, { useCallback, useEffect, useState, useRef, useContext, useMemo } from 'react';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BackboneCallToActionAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/action-type-adapter';\r\nimport BackboneCallToActionLanguageAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/language-adapter';\r\n\r\nimport { CallToActionAriaText } from './call-to-action-aria-text';\r\nimport { CallToActionText } from './call-to-action-text';\r\nimport { getStyles } from './style';\r\nimport { getLanguage } from './locale-to-language';\r\n\r\n// Wraps legacy @bingads-webui-component-legacy/adextension-actionlink/view/action-type-adapter component\r\nexport const LegacyCallToAction = React.memo(({\r\n id, className, value, setNewCTACallback, languageValue, ctaText, ctaAriaText, onChange, locale, permissions, isPmaxAd, isBoostScenario, isBoostCustomCTAEnabled, isCustomCTAEnabled, valueText,\r\n}) => {\r\n const view = useRef();\r\n\r\n const i18n = useContext(I18nContext);\r\n const languageView = useRef();\r\n const isBoostAccount = permissions && permissions.IsAmplifyEnabled;\r\n const isBoostCTAAriaTextEnabled = isBoostAccount && permissions && permissions.IsBoostCTAAriaTextEnabled;\r\n\r\n let container;\r\n\r\n let languageContainer;\r\n\r\n const [cta, setCta] = useState(null);\r\n const [ctaString, setCtaString] = useState(null);\r\n const [language, setLanguage] = useState(null);\r\n\r\n const viewModel = useMemo(() => ({\r\n ActionType: ko.observable(!isEmpty(value) ? value : null),\r\n Language: ko.observable(languageValue || getLanguage(permissions, locale)),\r\n }), [languageValue, locale, permissions, value]);\r\n\r\n const updateCTA = (selectedOption) => {\r\n setCta(selectedOption.id);\r\n setCtaString(selectedOption.value);\r\n };\r\n\r\n const updateLanguage = (selectedOption) => {\r\n setLanguage(selectedOption.id);\r\n };\r\n\r\n useEffect(() => {\r\n if (setNewCTACallback) {\r\n setNewCTACallback(() => ({ CallToAction, CallToActionLanguage }) => {\r\n if (CallToActionLanguage) {\r\n viewModel.Language = ko.observable(CallToActionLanguage);\r\n viewModel.ActionType(CallToAction);\r\n view.current.observable(CallToAction);\r\n view.current.render();\r\n\r\n if (languageView && languageView.current && isFunction(languageView.current.render)) {\r\n languageView.current.observable = viewModel.Language;\r\n languageView.current.render();\r\n }\r\n } else {\r\n view.current.observable(CallToAction);\r\n view.current.render();\r\n }\r\n });\r\n }\r\n }, [setNewCTACallback, viewModel]);\r\n\r\n useEffect(() => {\r\n const actionTypeAdapter = new BackboneCallToActionAdapter({\r\n observable: viewModel.ActionType,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n updateCTA(selectedOption);\r\n },\r\n isPmaxAd,\r\n isBoostScenario,\r\n isBoostCustomCTAEnabled,\r\n isCustomCTAEnabled,\r\n defaultActionText: valueText,\r\n });\r\n\r\n const languageAdapter = new BackboneCallToActionLanguageAdapter({\r\n observable: viewModel.Language,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n updateLanguage(selectedOption);\r\n },\r\n isBoostScenario,\r\n isBoostCustomCTAEnabled,\r\n });\r\n\r\n if (isBoostScenario) {\r\n languageView.current = languageAdapter;\r\n languageView.current.render();\r\n languageView.current.$el.appendTo(languageContainer);\r\n }\r\n\r\n view.current = actionTypeAdapter;\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n // We want the view to be created only once,\r\n // hence ignoring all dependencies of this \"effect\".\r\n // This means that the view will ignore changes to all props.\r\n // If need be to make view pick props updates, the view\r\n // need to provide a way to communicate such updates to it.\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(\r\n () => {\r\n // for pmax ad, maintain same logic\r\n if (!isBoostScenario && cta !== null) {\r\n onChange(cta, ctaString);\r\n }\r\n\r\n // for display plus boost campaigns add language and cta text\r\n if (isBoostScenario) {\r\n if (cta !== null && language !== null) {\r\n onChange({ cta, language });\r\n }\r\n }\r\n }\r\n , [cta, ctaString, isBoostScenario, language, onChange]\r\n );\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n const onGlobalShortcut = useCallback((e) => {\r\n if (e.key === 'Escape' && document.getElementsByClassName('dropdown-search-selector__dropdown open').length > 0) {\r\n e.preventDefault();\r\n document.getElementsByClassName('row btn btn-default dropdown-toggle')[0].click();\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.addEventListener('keyup', onGlobalShortcut);\r\n return () => {\r\n document.removeEventListener('keyup', onGlobalShortcut);\r\n };\r\n }, [i18n, onGlobalShortcut]);\r\n return (\r\n <>\r\n <div\r\n id={`language-${id}`}\r\n className={classnames(className, classes.callToActionContainer)}\r\n >\r\n <div ref={(ref) => { languageContainer = ref; }} />\r\n </div>\r\n <div\r\n id={id}\r\n className={classnames(className, classes.callToActionContainer)}\r\n >\r\n <div ref={(ref) => { container = ref; }} />\r\n </div>\r\n <div\r\n id={`custom-test-${id}`}\r\n className={classnames(className, classes.callToActionContainer)}\r\n >\r\n { /* this is a validated contrl so it directly reports to parent validation group */}\r\n {cta === 'CustomText' && <CallToActionText i18n={i18n} defaultValue={ctaText} />}\r\n </div>\r\n\r\n {\r\n isBoostCTAAriaTextEnabled && (\r\n <div id=\"call-to-action-aria-text\" className={classnames(className, classes.callToActionContainer)}>\r\n <CallToActionAriaText i18n={i18n} value={ctaAriaText} />\r\n </div>\r\n )\r\n }\r\n </>\r\n );\r\n});\r\n\r\nLegacyCallToAction.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n\r\n locale: PropTypes.string.isRequired,\r\n permissions: PropTypes.shape({}).isRequired,\r\n value: PropTypes.string,\r\n onChange: PropTypes.func,\r\n isPmaxAd: PropTypes.bool,\r\n isBoostScenario: PropTypes.bool,\r\n isBoostCustomCTAEnabled: PropTypes.bool,\r\n ctaText: PropTypes.string,\r\n ctaAriaText: PropTypes.string,\r\n languageValue: PropTypes.string,\r\n isCustomCTAEnabled: PropTypes.bool,\r\n valueText: PropTypes.string,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToAction.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n value: undefined,\r\n onChange: noop,\r\n isPmaxAd: false,\r\n isBoostScenario: false,\r\n isBoostCustomCTAEnabled: false,\r\n ctaText: null,\r\n ctaAriaText: null,\r\n languageValue: null,\r\n isCustomCTAEnabled: false,\r\n valueText: '',\r\n setNewCTACallback: null,\r\n};\r\n","import React, { useCallback, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { LegacyCallToAction } from './legacy-call-to-action';\r\n\r\nconst LegacyCallToActionWithCustomValidation = ({\r\n validationProps, updateValidation, setNewCTACallback, ...restProps\r\n}) => {\r\n const { data } = validationProps;\r\n\r\n const activity = useContext(ActivityContext);\r\n const onChange = useCallback((CallToAction, CallToActionValue) => {\r\n updateValidation([], { CallToAction, CallToActionValue });\r\n\r\n if (activity) {\r\n activity.signal(`onLegacyCallToActionChange - ${JSON.stringify(CallToAction)}`);\r\n }\r\n }, [updateValidation, activity]);\r\n\r\n return (\r\n <LegacyCallToAction value={data.CallToAction} setNewCTACallback={setNewCTACallback} valueText={data.CallToActionValue || ''} onChange={onChange} {...restProps} />\r\n );\r\n};\r\n\r\nLegacyCallToActionWithCustomValidation.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n CallToAction: PropTypes.string,\r\n CallToActionValue: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToActionWithCustomValidation.defaultProps = {\r\n setNewCTACallback: null,\r\n};\r\n\r\nexport const ValidatedLegacyCallToAction = withCustomValidation(LegacyCallToActionWithCustomValidation);\r\n","import { getActionText } from '@bingads-webui-campaign-legacy/adextension-actionlink/model/language-type-text-mapper';\r\n\r\n\r\nexport const actionTextLocalization = (language, actionType) => {\r\n const ctaInfo = {\r\n Language: language,\r\n ActionType: actionType,\r\n };\r\n\r\n return getActionText(ctaInfo);\r\n};\r\n","import { noop } from 'underscore';\r\nimport ko from 'knockout';\r\nimport React, { useEffect, useRef, useState, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { Label } from '@fluentui/react';\r\nimport { HelpPopup } from '@bingads-webui-react/help-popup';\r\nimport { HelpLink } from '@bingads-webui-react/help-link';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BackboneCallToActionAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/action-type-adapter';\r\nimport BackboneLanguageAdapter from '@bingads-webui-campaign-legacy/adextension-actionlink/view/language-adapter';\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\n\r\nimport { getStyles } from './style';\r\n\r\nexport const CallToActionDescription = ({\r\n isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, i18n, isDisplayPlusMMA, isBulk,\r\n}) => {\r\n if (!isMMAAutomatedCTAOptInEnabled) {\r\n if (isDisplayPlusMMA) {\r\n return (\r\n <ReactTemplate\r\n model={{\r\n b: text => (<b>{text}</b>),\r\n }}\r\n template={i18n.getString(_TL_('\"Automated\" is the default option for your call to action’s {{b}}Language{{/b}} and {{b}}Action text{{/b}}. This means that we’ll automatically choose your call to action and the language it serves in during ad delivery.'))}\r\n />\r\n );\r\n }\r\n return (\r\n <span>\r\n {i18n.getString(_TL_('We\\'ve updated call to action options fields to default to Language \"Automated\" and Action text \"Automated\"'))}\r\n </span>\r\n );\r\n }\r\n\r\n const helpLinkElement = <HelpLink query=\"help:app54810\">{i18n.getString(_TL_('Learn more'))}</HelpLink>;\r\n const boldFinalUrlElement = <b>{i18n.getString(_TL_('Final URL'))}</b>;\r\n const boldEnableMMAAutoElement = <b>{i18n.getString(_TL_('Enable autogenerated calls to action for Multimedia ads'))}</b>;\r\n\r\n if (!isBulk && automatedCTAEnable) {\r\n return (\r\n <>\r\n <span>\r\n {i18n.getString(_TL_('You’ve enabled auto-generated assets for multimedia ads. This setting automatically generates assets to enhance ad relevance and performance. Please note that automated call to actions are the only auto-generated assets currently supported for multimedia ads. We use information pulled from your '))}\r\n </span>\r\n {boldFinalUrlElement}\r\n <span>{i18n.getString(_TL_(' as well as any assets you provide to automatically generate additional assets for your ads when available. '))}</span>\r\n {helpLinkElement}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <span>\r\n {\r\n isBulk ?\r\n i18n.getString(_TL_('Enable this option in your campaign settings to allow Microsoft Advertising to automatically generate assets for your multimedia ads. We pull information and content from ')) :\r\n i18n.getString(_TL_('You’ve opted out of auto-generated assets for multimedia ads. This means that we won’t automatically generate assets from your '))\r\n }\r\n </span>\r\n {boldFinalUrlElement}\r\n <span>{i18n.getString(_TL_(' to enhance ad relevance and performance. To enable this setting, select the checkbox next to '))}</span>\r\n {boldEnableMMAAutoElement}\r\n <span>{i18n.getString(_TL_(' in your campaign settings. '))}</span>\r\n {helpLinkElement}\r\n </>\r\n );\r\n};\r\n\r\nCallToActionDescription.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n isBulk: PropTypes.bool,\r\n};\r\n\r\nCallToActionDescription.defaultProps = {\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n automatedCTAEnable: false,\r\n isDisplayPlusMMA: false,\r\n isBulk: false,\r\n};\r\n\r\nexport const LegacyCallToActionWithLanguage = React.memo(({\r\n id, className, value, onChange, isDisplayPlusMMA, i18n, setNewCTACallback, isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, isBulk, isMultimediaAd,\r\n}) => {\r\n const ctaView = useRef();\r\n const langView = useRef();\r\n\r\n const { cta, language, ctaText } = value || {};\r\n const [selectedCta, setSelectedCta] = useState(cta);\r\n const [selectedLanguage, setSelectedLanguage] = useState(language);\r\n const [selectedCtaText, setSelectedCtaText] = useState(ctaText || cta);\r\n\r\n let ctaContainer;\r\n let langContainer;\r\n\r\n const viewModel = useMemo(() => ({\r\n ActionType: ko.observable(cta),\r\n Language: ko.observable(language),\r\n }), [cta, language]);\r\n\r\n useEffect(() => {\r\n if (setNewCTACallback) {\r\n setNewCTACallback(() => ({ CallToAction, CallToActionLanguage }) => {\r\n if (CallToActionLanguage) {\r\n viewModel.Language = ko.observable(CallToActionLanguage);\r\n viewModel.ActionType(CallToAction);\r\n ctaView.current.observable(CallToAction);\r\n ctaView.current.render();\r\n\r\n langView.current.observable = viewModel.Language;\r\n langView.current.render();\r\n } else {\r\n ctaView.current.observable(CallToAction);\r\n ctaView.current.render();\r\n }\r\n });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [setNewCTACallback]);\r\n\r\n useEffect(() => {\r\n const languageAdapter = new BackboneLanguageAdapter({\r\n observable: viewModel.Language,\r\n isDisplayPlusMMA,\r\n isMultimediaAd,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n setSelectedLanguage(selectedOption.id);\r\n },\r\n noEntiyCheck: true,\r\n isMMAAutomatedCTAOptInEnabled,\r\n });\r\n\r\n const actionTypeAdapter = new BackboneCallToActionAdapter({\r\n observable: viewModel.ActionType,\r\n isDisplayPlusMMA,\r\n isMultimediaAd,\r\n viewModel,\r\n callback: (selectedOption) => {\r\n setSelectedCta(selectedOption.id);\r\n setSelectedCtaText(selectedOption.value);\r\n },\r\n noEntiyCheck: true,\r\n isMMAAutomatedCTAOptInEnabled,\r\n });\r\n\r\n ctaView.current = actionTypeAdapter;\r\n ctaView.current.render();\r\n ctaView.current.$el.appendTo(ctaContainer);\r\n\r\n langView.current = languageAdapter;\r\n langView.current.render();\r\n langView.current.$el.appendTo(langContainer);\r\n\r\n return () => {\r\n langView.current.remove();\r\n ctaView.current.remove();\r\n };\r\n // Only init once\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n onChange({ cta: selectedCta, language: selectedLanguage }, { ctaText: selectedCtaText });\r\n }, [onChange, selectedCta, selectedCtaText, selectedLanguage]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n const tooltipId = isDisplayPlusMMA ? 'pop_BA_AudAds_CTA_Text' : 'pop_BA_AdExtensions_ActionText';\r\n return (\r\n <div className=\"legacy-call-to-action-with-language-wrapper\">\r\n <CallToActionDescription i18n={i18n} isMMAAutomatedCTAOptInEnabled={isMMAAutomatedCTAOptInEnabled} automatedCTAEnable={automatedCTAEnable} isDisplayPlusMMA={isDisplayPlusMMA} isBulk={isBulk} />\r\n <div\r\n id={id}\r\n className={classnames(className, classes.languageContainer)}\r\n >\r\n <Label>\r\n {i18n.getString(_TL_('Language'))}\r\n <HelpPopup aria-label={i18n.getString(_TL_('Language'))} topic=\"pop_BA_MMA_ActionLanguage\" />\r\n </Label>\r\n <div ref={(ref) => { langContainer = ref; }} />\r\n </div>\r\n\r\n <div\r\n id={id}\r\n className={classnames(className, classes.callToActionContainer)}\r\n >\r\n <Label>\r\n {i18n.getString(_TL_('Action text'))}\r\n <HelpPopup aria-label={i18n.getString(_TL_('Action text'))} topic={tooltipId} />\r\n </Label>\r\n <div ref={(ref) => { ctaContainer = ref; }} />\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nLegacyCallToActionWithLanguage.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n value: PropTypes.shape({\r\n cta: PropTypes.string,\r\n language: PropTypes.string,\r\n }).isRequired,\r\n onChange: PropTypes.func,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setNewCTACallback: PropTypes.func,\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n isMultimediaAd: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n isBulk: PropTypes.bool,\r\n};\r\n\r\nLegacyCallToActionWithLanguage.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n onChange: noop,\r\n isDisplayPlusMMA: false,\r\n setNewCTACallback: null,\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n isMultimediaAd: false,\r\n automatedCTAEnable: false,\r\n isBulk: false,\r\n};\r\n","import React, { useCallback, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\n\r\nimport { LegacyCallToActionWithLanguage } from './legacy-call-to-action-with-language';\r\n\r\nconst LegacyCallToActionWithLanguageWithCustomValidation = ({\r\n validationProps, updateValidation, setNewCTACallback, onChange: onChangeFromProps, ...restProps\r\n}) => {\r\n const { data } = validationProps;\r\n\r\n const activity = useContext(ActivityContext);\r\n const onChange = useCallback((updates, extraParameters) => {\r\n updateValidation([], { CallToAction: updates });\r\n onChangeFromProps(extraParameters);\r\n\r\n if (activity) {\r\n activity.signal(`onLegacyCallToActionWithLanguageChange - ${JSON.stringify(updates)}`);\r\n }\r\n }, [updateValidation, onChangeFromProps, activity]);\r\n\r\n return (\r\n <LegacyCallToActionWithLanguage value={data} setNewCTACallback={setNewCTACallback} onChange={onChange} {...restProps} />\r\n );\r\n};\r\n\r\nLegacyCallToActionWithLanguageWithCustomValidation.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n CallToAction: PropTypes.string,\r\n CallToActionLanguage: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n onChange: PropTypes.func,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nLegacyCallToActionWithLanguageWithCustomValidation.defaultProps = {\r\n onChange: () => {},\r\n setNewCTACallback: null,\r\n};\r\n\r\nexport const ValidatedLegacyCallToActionWithLanguage = withCustomValidation(LegacyCallToActionWithLanguageWithCustomValidation);\r\n","import React, { useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n TextTitle,\r\n ValidatedFixedPanel,\r\n getPanelErrorProps,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nimport { ValidatedLegacyCallToActionWithLanguage } from './validated-legacy-call-to-action-with-language';\r\nimport CallToActionImg from '../media/call-to-action.svg';\r\n\r\nexport const ValidatedLegacyCallToActionWithLanguageSection = ({\r\n callToAction, isDisplayPlusMMA, setNewCTACallback, isMultimediaAd, isMMAAutomatedCTAOptInEnabled, automatedCTAEnable, isBulk, onChange, ...rest\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n const ctaValidationProps = useMemo(() => ({\r\n data: callToAction,\r\n }), [callToAction]);\r\n\r\n return (\r\n <ValidatedFixedPanel\r\n key=\"call-to-action\"\r\n title={\r\n <TextTitle\r\n titleKey={_TL_('Call-to-action')}\r\n topicKey=\"pop_BA_PMAX_CallToAction\"\r\n icon={CallToActionImg}\r\n iconAltText={i18n.getString(_TL_('\"Call to action\" panel\\'s image'))}\r\n />\r\n }\r\n noOverflowHidden\r\n relativePosition\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n {...rest}\r\n >\r\n <ValidatedLegacyCallToActionWithLanguage\r\n validationProps={ctaValidationProps}\r\n isDisplayPlusMMA={isDisplayPlusMMA}\r\n isMultimediaAd={isMultimediaAd}\r\n isMMAAutomatedCTAOptInEnabled={isMMAAutomatedCTAOptInEnabled}\r\n automatedCTAEnable={automatedCTAEnable}\r\n i18n={i18n}\r\n onChange={onChange}\r\n isBulk={isBulk}\r\n setNewCTACallback={setNewCTACallback}\r\n />\r\n </ValidatedFixedPanel>\r\n );\r\n};\r\n\r\nValidatedLegacyCallToActionWithLanguageSection.propTypes = {\r\n isMMAAutomatedCTAOptInEnabled: PropTypes.bool,\r\n isDisplayPlusMMA: PropTypes.bool,\r\n isMultimediaAd: PropTypes.bool,\r\n automatedCTAEnable: PropTypes.bool,\r\n callToAction: PropTypes.shape({\r\n cta: PropTypes.string,\r\n language: PropTypes.string,\r\n }).isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n isBulk: PropTypes.bool,\r\n setNewCTACallback: PropTypes.func,\r\n};\r\n\r\nValidatedLegacyCallToActionWithLanguageSection.defaultProps = {\r\n isDisplayPlusMMA: false,\r\n isMMAAutomatedCTAOptInEnabled: false,\r\n isMultimediaAd: false,\r\n automatedCTAEnable: false,\r\n isBulk: false,\r\n setNewCTACallback: null,\r\n};\r\n","\r\nimport React from 'react';\r\n\r\nexport const LegacyDepsContext = React.createContext('');\r\n\r\n\r\nexport const withLegacyDeps = AReactComponent => (props => (\r\n <LegacyDepsContext.Consumer>\r\n {\r\n context => <AReactComponent legacyDeps={context} {...props} />\r\n }\r\n </LegacyDepsContext.Consumer>));\r\n","import { mergeStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nexport const getStyles = (theme, palette = {}) => ({\r\n budgetContainer: {\r\n ...mergeStyles(\r\n { theme },\r\n {\r\n '& .container-budget': {\r\n '& span': {\r\n color: palette.neutralPrimary,\r\n },\r\n '& .form-control-static': {\r\n padding: '9px 0px',\r\n lineHeight: '14px',\r\n minHeight: 'auto',\r\n },\r\n '& .input-group': {\r\n marginLeft: 15,\r\n '& .input-group-addon': {\r\n color: '#323130',\r\n border: 0,\r\n padding: '6px',\r\n background: '#ffffff',\r\n },\r\n },\r\n '& .col-sm-3': {\r\n display: 'table',\r\n paddingRight: 0,\r\n paddingLeft: 0,\r\n },\r\n '& .margin-rt-five': {\r\n paddingLeft: 28,\r\n },\r\n\r\n },\r\n '& span.bold': {\r\n fontWeight: 1000,\r\n },\r\n '& .alert-budget-button': {\r\n marginLeft: '10px',\r\n paddingTop: '5px',\r\n '& button': {\r\n color: 'black',\r\n fontSize: '13px',\r\n fontWeight: 500,\r\n borderColor: '#edebe9',\r\n },\r\n },\r\n }\r\n ),\r\n },\r\n});\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { clone } from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Backbone from 'backbone';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport BudgetView from '@bingads-webui-campaign-legacy/budget/view/budget';\r\nimport SharedBudgetView from '@bingads-webui-campaign-legacy/shared-budget/view/shared-budget-switch-editor';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\nimport PageContext from '@bingads-webui-static-legacy/page-context';\r\nimport { getStyles } from './style';\r\n\r\nexport const LegacySharedBudget = React.memo(({\r\n id,\r\n className,\r\n campaignId,\r\n budget,\r\n onChange,\r\n i18n,\r\n validationDailyMinBudget,\r\n hideBudgetMinRecommendation,\r\n noApplyBudgetFromSharedLibrary,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => clone(Backbone.Events), []);\r\n let container;\r\n\r\n useEffect(() => {\r\n const budgetFactory = SharedBudgetView.newFactory(BudgetView);\r\n const showBudgetMinRecommend = campaignId !== undefined && !hideBudgetMinRecommendation;\r\n const minimumBudget = budget ? budget.Amount * 0.5 : undefined;\r\n\r\n view.current = budgetFactory({\r\n withRealTimeUpdates: true,\r\n model: budget,\r\n campaignId,\r\n isForVNext: true,\r\n hideDailyBudgetOptions: false,\r\n showBudgetMinRecommend,\r\n currencySymbol: i18n.getCurrencySymbol(PageContext.AccountCurrencyCode),\r\n minimumBudget,\r\n validationDailyMinBudget,\r\n showInitialUiBlocker: false,\r\n noApplyBudgetFromSharedLibrary,\r\n showNoSharedBudgetLink: true,\r\n });\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n view.current.remove();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n return () => viewListener.stopListening(view.current);\r\n }, [onChange, viewListener]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n <div\r\n id={id}\r\n className={classnames(className, classes.budgetContainer)}\r\n >\r\n <div ref={(ref) => { container = ref; }} />\r\n </div>\r\n );\r\n});\r\n\r\nLegacySharedBudget.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n campaignId: PropTypes.string,\r\n budget: PropTypes.shape({\r\n Amount: PropTypes.number,\r\n }),\r\n onChange: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({ getCurrencySymbol: PropTypes.func.isRequired }).isRequired,\r\n validationDailyMinBudget: PropTypes.number,\r\n hideBudgetMinRecommendation: PropTypes.bool,\r\n noApplyBudgetFromSharedLibrary: PropTypes.bool,\r\n};\r\n\r\nLegacySharedBudget.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n budget: undefined,\r\n campaignId: undefined,\r\n validationDailyMinBudget: undefined,\r\n hideBudgetMinRecommendation: false,\r\n noApplyBudgetFromSharedLibrary: false,\r\n};\r\n","export const getStyles = () => ({\r\n shoppingSettings: {\r\n '& .control-label': {\r\n marginTop: 12,\r\n },\r\n\r\n '& .filteredProducts .helpbutton': {\r\n marginLeft: '6px !important',\r\n },\r\n\r\n '& .col-sm-offset-2': {\r\n marginLeft: 0,\r\n },\r\n\r\n '& .col-sm-6': {\r\n minWidth: 650,\r\n },\r\n },\r\n});\r\n","/* eslint-disable no-param-reassign */\r\n/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport Backbone from 'backbone';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport ShoppingSettings from '@bingads-webui-campaign-legacy/shopping-campaign/view/campaign-creation/shopping-settings';\r\nimport '@bingads-webui-campaign/ko-stop-binding';\r\n\r\nimport { getStyles } from './style';\r\n\r\n// Only for sponsored campaigns\r\nexport const LegacyShoppingSettings = React.memo(({\r\n id,\r\n className,\r\n onChange,\r\n shoppingSettingsRef,\r\n shoppingSettingOptions,\r\n}) => {\r\n const view = useRef();\r\n const viewListener = useMemo(() => _.clone(Backbone.Events), []);\r\n const { data } = shoppingSettingOptions;\r\n\r\n let container;\r\n\r\n useEffect(() => {\r\n if (_.isEmpty(data)) {\r\n return _.noop;\r\n }\r\n\r\n view.current = new ShoppingSettings(shoppingSettingOptions);\r\n\r\n shoppingSettingsRef.current = view.current;\r\n\r\n viewListener.listenTo(view.current, 'change', onChange);\r\n\r\n view.current.render();\r\n view.current.$el.appendTo(container);\r\n\r\n return () => {\r\n viewListener.stopListening(view.current);\r\n view.current.remove();\r\n };\r\n }, [data, shoppingSettingOptions.isCPSSelected]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n return (\r\n <div\r\n id={id}\r\n className={classnames(className, classes.shoppingSettings)}\r\n >\r\n <div ref={(ref) => { container = ref; }} />\r\n </div>\r\n );\r\n});\r\n\r\nLegacyShoppingSettings.propTypes = {\r\n id: PropTypes.string,\r\n className: PropTypes.string,\r\n onChange: PropTypes.func.isRequired,\r\n shoppingSettingsRef: PropTypes.shape({}).isRequired,\r\n shoppingSettingOptions: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n isCPSSelected: PropTypes.bool,\r\n }).isRequired,\r\n};\r\n\r\nLegacyShoppingSettings.defaultProps = {\r\n id: undefined,\r\n className: undefined,\r\n};\r\n","export const targetOptions = {\r\n everywhere: 'everywhere',\r\n specific: 'specific',\r\n quick: 'quick',\r\n};\r\n\r\nexport const getLocationOptionsMap = i18n => ({\r\n [targetOptions.quick]: {\r\n key: targetOptions.quick,\r\n text: i18n.getString(_TL_('United States')),\r\n },\r\n [targetOptions.everywhere]: {\r\n key: targetOptions.everywhere,\r\n text: i18n.getString(_TL_('All available countries/regions')),\r\n },\r\n [targetOptions.specific]: {\r\n key: targetOptions.specific,\r\n text: i18n.getString(_TL_('Let me choose specific locations')),\r\n },\r\n});\r\n","import { getTheme } from '@fluentui/react';\r\n\r\nconst { palette } = getTheme();\r\n\r\nexport const getLocationTargetingStyles = () => ({\r\n LocationTargeting: {\r\n '& .bing-maps-location-targets-editor': {\r\n marginLeft: 25,\r\n },\r\n // '& .bing-maps-location-targets-search-grid-and-map': {\r\n // width: 950,\r\n // },\r\n '& .edit-action': {\r\n marginTop: 20,\r\n },\r\n '& .dropdown-menu > div > li > a:focus:after': {\r\n display: 'none',\r\n },\r\n '& .dropdown-menu > div > li > a:focus': {\r\n outline: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n '& .bing-maps-search-box-dropdown': {\r\n maxWidth: 400,\r\n },\r\n\r\n '& .bing-maps-location-targets-search-box-with-search-options': {\r\n marginBottom: 0,\r\n },\r\n\r\n '& .bing-maps-location-targets-search-grid-and-map': {\r\n minWidth: 200,\r\n width: '100%',\r\n border: 'none',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: -25,\r\n\r\n '& .bing-maps-location-targets-search-grid': {\r\n width: '100%',\r\n maxHeight: 'none',\r\n },\r\n\r\n '& .bing-maps-location-targets-editor-map': {\r\n width: '100%',\r\n height: 420,\r\n marginLeft: 0,\r\n '& .MicrosoftMap .bm_bottomRightOverlay .ScaleBar > div': {\r\n '& > div:nth-child(2) > div': {\r\n border: '10px solid #0056b3 !important',\r\n },\r\n },\r\n },\r\n\r\n '& .bing-maps-location-targets-grid': {\r\n minHeight: 0,\r\n },\r\n '& .bing-maps-negative-location-targets-grid': {\r\n minHeight: 0,\r\n },\r\n },\r\n\r\n '& .bing-maps-location-targets-empty': {\r\n color: '#a80000',\r\n },\r\n },\r\n locationTargetOptions: {\r\n marginBottom: 20,\r\n\r\n '& label': {\r\n fontWeight: 400,\r\n padding: 0,\r\n },\r\n\r\n '& div[role=\"radiogroup\"] > label': {\r\n fontWeight: 600,\r\n },\r\n },\r\n intentTarget: {\r\n marginTop: 20,\r\n },\r\n intentTargetOptions: {\r\n marginTop: 6,\r\n },\r\n title: {\r\n '& span': {\r\n fontWeight: 600,\r\n },\r\n },\r\n});\r\n","import React from 'react';\r\nimport { Shimmer, ShimmerElementType } from '@fluentui/react';\r\n\r\n\r\nexport const radiusShimmerElement = [\r\n { type: ShimmerElementType.line, width: 20, height: 20 },\r\n { type: ShimmerElementType.gap, width: 5 },\r\n { type: ShimmerElementType.line, height: 16, width: 300 },\r\n { type: ShimmerElementType.gap, height: 20, width: '100%' },\r\n];\r\n\r\nexport const SectionShimmer = () => (\r\n <div>\r\n <Shimmer shimmerElements={radiusShimmerElement} />\r\n <Shimmer shimmerElements={[{ type: ShimmerElementType.gap, width: '100%', height: 12 }]} />\r\n <Shimmer shimmerElements={radiusShimmerElement} />\r\n </div>\r\n);\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { ChoiceGroup } from '@fluentui/react';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { LocationTargetsEditor } from '@bingads-webui-react/bing-maps';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n\r\nimport { getLocationTargetingStyles } from './styles/location-targeting-style';\r\nimport { targetOptions, getLocationOptionsMap } from './utils/target-options';\r\nimport { SectionShimmer } from './utils/shimmer-element';\r\n\r\nexport function LocationTargetingSelection(props) {\r\n const {\r\n selectedLocationOption,\r\n onChangeLocationOption,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n updateErrorMessage,\r\n optionsConfig,\r\n isLoading,\r\n ...targetEditorProps\r\n } = props;\r\n\r\n const { strings } = props;\r\n\r\n const i18n = useContext(I18nContext);\r\n const classes = useDefaultStyles(getLocationTargetingStyles);\r\n\r\n const locationTargetingTitle = useMemo(() => (\r\n strings.locationTargetingTitle\r\n ? strings.locationTargetingTitle\r\n : i18n.getString(_TL_('Where do you want your ads to appear?'))\r\n ), [i18n, strings]);\r\n\r\n const choiceGroupOptions = useMemo(() => {\r\n const locationOptionsMap = getLocationOptionsMap(i18n);\r\n\r\n return optionsConfig.map((option) => {\r\n if (typeof option === 'object') {\r\n return {\r\n ...locationOptionsMap[option.key],\r\n ...option,\r\n };\r\n }\r\n\r\n return locationOptionsMap[option];\r\n });\r\n }, [i18n, optionsConfig]);\r\n\r\n return (\r\n <div className=\"location-target\">\r\n <div className={classNames('location-target-options', classes.locationTargetOptions)}>\r\n {\r\n isLoading\r\n ? <SectionShimmer />\r\n : (\r\n <ChoiceGroup\r\n label={locationTargetingTitle}\r\n options={choiceGroupOptions}\r\n selectedKey={selectedLocationOption}\r\n onChange={(e, option) => onChangeLocationOption(option.key)}\r\n />\r\n )\r\n }\r\n </div>\r\n {\r\n !isLoading && selectedLocationOption === targetOptions.specific\r\n && <LocationTargetsEditor {...targetEditorProps} />\r\n }\r\n </div>\r\n );\r\n}\r\n\r\nLocationTargetingSelection.propTypes = {\r\n selectedLocationOption: PropTypes.string.isRequired,\r\n onChangeLocationOption: PropTypes.func.isRequired,\r\n strings: PropTypes.shape({\r\n locationTargetingTitle: PropTypes.string,\r\n }),\r\n updateErrorMessage: PropTypes.func.isRequired,\r\n /**\r\n * Pass in the needed options. The element in array can be either a string or an object.\r\n */\r\n optionsConfig: PropTypes.arrayOf(PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n text: PropTypes.string.isRequired,\r\n }),\r\n ])).isRequired,\r\n isLoading: PropTypes.bool,\r\n};\r\n\r\nLocationTargetingSelection.defaultProps = {\r\n strings: {},\r\n isLoading: false,\r\n};\r\n","export const getIntentTargetingStyles = () => ({\r\n intentTarget: {\r\n marginTop: 20,\r\n },\r\n intentTargetOptions: {\r\n marginTop: 6,\r\n },\r\n title: {\r\n '& span': {\r\n fontWeight: 600,\r\n },\r\n },\r\n errormessage: {\r\n color: '#a80000',\r\n },\r\n});\r\n","import React, { useContext, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { Text, Stack, Checkbox } from '@fluentui/react';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { ErrorMessages } from '@bingads-webui-react/validation';\r\n\r\nimport { getIntentTargetingStyles } from './styles/intent-targeting-style';\r\nimport { SectionShimmer } from './utils/shimmer-element';\r\n\r\nconst stackTokens = { childrenGap: 5 };\r\n\r\nexport function LocationTargetingIntent({\r\n isPeopleInLocationChecked,\r\n isPeopleSearchingForLocationChecked,\r\n onPeopleInLocationChange,\r\n onPeopleSearchingForLocationChange,\r\n updateErrorMessage,\r\n strings,\r\n isLoading,\r\n}) {\r\n const i18n = useContext(I18nContext);\r\n const classes = useDefaultStyles(getIntentTargetingStyles);\r\n\r\n const errorMessage = (isPeopleInLocationChecked || isPeopleSearchingForLocationChecked)\r\n ? undefined\r\n : i18n.getString(_TL_('At least one intent option must be selected'));\r\n\r\n const titleLabel = strings.intentTitle ? strings.intentTitle : i18n.getString(_TL_('Who should see your ads?'));\r\n const checkboxLabel1 = strings.intentText1 ? strings.intentText1 : i18n.getString(_TL_('People in your targeted locations'));\r\n const checkboxLabel2 = strings.intentText2 ? strings.intentText2 : i18n.getString(_TL_('People searching for or viewing pages about your targeted locations'));\r\n\r\n useEffect(() => {\r\n updateErrorMessage(prev => ({ ...prev, intent: errorMessage }));\r\n }, [errorMessage, updateErrorMessage]);\r\n\r\n return (\r\n <div className={classNames('intent-target', classes.intentTarget)}>\r\n <div className={classes.title}>\r\n <Text>{titleLabel}</Text>\r\n </div>\r\n <div className={classNames('intent-target-options', classes.intentTargetOptions)}>\r\n {\r\n isLoading ?\r\n (<SectionShimmer />)\r\n : (\r\n <Stack tokens={stackTokens}>\r\n <Checkbox\r\n label={checkboxLabel1}\r\n checked={isPeopleInLocationChecked}\r\n onChange={(ev, isChecked) => {\r\n onPeopleInLocationChange(isChecked);\r\n }}\r\n />\r\n <Checkbox\r\n label={checkboxLabel2}\r\n checked={isPeopleSearchingForLocationChecked}\r\n onChange={(ev, isChecked) => {\r\n onPeopleSearchingForLocationChange(isChecked);\r\n }}\r\n />\r\n {\r\n errorMessage && (\r\n <ErrorMessages\r\n className={classes.errormessage}\r\n messages={[errorMessage]}\r\n />\r\n )\r\n }\r\n </Stack>\r\n )\r\n }\r\n\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nLocationTargetingIntent.propTypes = {\r\n isPeopleInLocationChecked: PropTypes.bool.isRequired,\r\n isPeopleSearchingForLocationChecked: PropTypes.bool.isRequired,\r\n onPeopleInLocationChange: PropTypes.func.isRequired,\r\n onPeopleSearchingForLocationChange: PropTypes.func.isRequired,\r\n updateErrorMessage: PropTypes.func.isRequired,\r\n strings: PropTypes.shape({\r\n intentTitle: PropTypes.string,\r\n intentText1: PropTypes.string,\r\n intentText2: PropTypes.string,\r\n }),\r\n isLoading: PropTypes.bool,\r\n};\r\n\r\nLocationTargetingIntent.defaultProps = {\r\n strings: {},\r\n isLoading: false,\r\n};\r\n","// value is used to determine sort order of errors in location targets list\r\nexport const LocationTargetErrorType = {\r\n UNSUPPORTED_LOCATION: 1,\r\n REDUNDANT_LOCATION: 2,\r\n FACEBOOK_AND_GOOGLE_NOT_SUPPORTED: 3,\r\n GOOGLE_NOT_SUPPORTED: 4,\r\n FACEBOOK_NOT_SUPPORTED: 5,\r\n THIRD_PARTY_NOT_SUPPORTED: 6,\r\n AUDIENCE_REQUIRED_MIN_RADIUS: 7,\r\n AUDIENCE_REQUIRED_POSTAL_CODE_NOT_SUPPORTED: 8,\r\n FACEBOOK_CALL_EXTENSION_COUNTRY_LIMITED_TARGET: 9,\r\n};\r\n","export const mobileMaxWidth = 600;\r\nexport const mobileDeviceQuery = `(max-width:${mobileMaxWidth}px)`;\r\nexport const mobileDevice = `@media ${mobileDeviceQuery}`;\r\n\r\nexport const getStyles = () => ({\r\n locationTargetErrorCallout: {\r\n width: '460px',\r\n paddingLeft: '30px',\r\n paddingRight: '20px',\r\n fontSize: '12px',\r\n\r\n '& .location-target-error-callout-details-list': {\r\n minWidth: '390px',\r\n\r\n '& .ms-DetailsRow': { background: '#fff' },\r\n\r\n '& .column-label': {\r\n color: '#323130',\r\n paddingLeft: 0,\r\n },\r\n\r\n '& .column-name-and-radius': {\r\n color: '#797775',\r\n },\r\n\r\n '& .column-remove': {\r\n paddingTop: '2px',\r\n },\r\n },\r\n [mobileDevice]: {\r\n width: 'auto',\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport {\r\n Callout,\r\n DetailsList,\r\n DetailsListLayoutMode,\r\n DirectionalHint,\r\n IconButton,\r\n SelectionMode,\r\n} from '@fluentui/react';\r\n\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n// import { useOnActivity } from '@bingads-webui-campaign-react/mca-core';\r\n\r\nimport { LocationTargetErrorType } from './location-targeting-error-type';\r\nimport { getStyles } from '../styles/location-targeting-error-style';\r\n\r\nconst errorStringsMap = {\r\n [LocationTargetErrorType.REDUNDANT_LOCATION]: {\r\n title: _TL_('This location is a duplicate target'),\r\n description: _TL_('This location is either part of another targeted location or contains a smaller targeted location.'),\r\n fixDescription: _TL_('You can remove the duplicate locations or adjust them to avoid duplicate targets.'),\r\n },\r\n [LocationTargetErrorType.FACEBOOK_AND_GOOGLE_NOT_SUPPORTED]: {\r\n title: _TL_('Facebook and Google don\\'t support this location'),\r\n description: _TL_('Note: Your ads will be eligible to run on Bing, even if you make no changes to this location.'),\r\n fixDescription: _TL_('To show your ads on Facebook and Google, try increasing the size of your target area.'),\r\n },\r\n [LocationTargetErrorType.FACEBOOK_NOT_SUPPORTED]: {\r\n title: _TL_('Facebook doesn\\'t support targeting this location'),\r\n description: _TL_('Note: Your ads will be eligible to run on Bing and Google, even if you make no changes to this location.'),\r\n fixDescription: _TL_('To show your ads on Facebook, try increasing the size of your target area.'),\r\n },\r\n [LocationTargetErrorType.GOOGLE_NOT_SUPPORTED]: {\r\n title: _TL_('Google doesn\\'t support targeting this location'),\r\n description: _TL_('Note: Your ads will be eligible to run on Bing and Facebook, even if you make no changes to this location.'),\r\n fixDescription: _TL_('To show your ads on Google, try increasing the size of your target area.'),\r\n },\r\n};\r\n\r\n/**\r\n * Callout that is displayed when viewing more detailed information on an erroneous location target.\r\n * @param {Object} props - React props\r\n * @returns {ReactNode} - React component.\r\n */\r\nfunction LocationTargetErrorCalloutUnstyled(props) {\r\n const {\r\n classes,\r\n error,\r\n locationTargets,\r\n onDismiss,\r\n onLocationTargetRemove,\r\n target,\r\n } = props;\r\n\r\n const i18n = useContext(I18nContext);\r\n // const onSignalActivity = useOnActivity();\r\n const errorStrings = useMemo(() => errorStringsMap[error], [error]);\r\n\r\n const isSingleLocationTarget = useMemo(() => _.size(locationTargets) === 1, [locationTargets]);\r\n\r\n const handleLocationTargetRemove = useCallback((item) => {\r\n // onSignalActivity(`remove location target: ${JSON.stringify(item)}`);\r\n onLocationTargetRemove(item);\r\n onDismiss();\r\n }, [onDismiss, onLocationTargetRemove]);\r\n\r\n const columns = useMemo(() => [\r\n {\r\n key: 'label',\r\n name: i18n.getString(_TL_('Label')),\r\n className: 'column-label',\r\n onRender: (_item, index) => {\r\n if (isSingleLocationTarget) {\r\n return i18n.getString(_TL_('Location'));\r\n }\r\n return i18n.getString(_TL_('Location {{number}}'), { number: index + 1 });\r\n },\r\n isCollapsible: true,\r\n isResizable: false,\r\n minWidth: 80,\r\n maxWidth: 80,\r\n },\r\n {\r\n key: 'nameAndRadius',\r\n name: i18n.getString(_TL_('Location')),\r\n className: 'column-name-and-radius',\r\n fieldName: 'ExpandedName',\r\n isResizable: false,\r\n onRender: item => <span title={item.ExpandedName}>{item.ExpandedName}</span>,\r\n minWidth: 240,\r\n maxWidth: 240,\r\n },\r\n {\r\n key: 'removeButton',\r\n name: i18n.getString(_TL_('Remove')),\r\n className: 'column-remove',\r\n minWidth: 30,\r\n maxWidth: 30,\r\n isResizable: false,\r\n onRender: item => (\r\n <IconButton\r\n ariaLabel={i18n.getString(_TL_('Remove'))}\r\n className=\"remove-button\"\r\n iconProps={{ iconName: 'Delete' }}\r\n onClick={() => handleLocationTargetRemove(item)}\r\n title={i18n.getString(_TL_('Remove'))}\r\n />\r\n ),\r\n },\r\n ], [i18n, isSingleLocationTarget, handleLocationTargetRemove]);\r\n\r\n if (_.isEmpty(errorStrings)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Callout\r\n className={classNames('location-target-error-callout', classes.locationTargetErrorCallout)}\r\n directionalHint={DirectionalHint.rightCenter}\r\n hidden={!target}\r\n onDismiss={onDismiss}\r\n target={target}\r\n >\r\n <h3>{i18n.getString(errorStrings.title)}</h3>\r\n <p>{i18n.getString(errorStrings.description)}</p>\r\n <p><strong>{i18n.getString(_TL_('How you can fix this:'))}</strong></p>\r\n <p>{i18n.getString(errorStrings.fixDescription)}</p>\r\n\r\n {locationTargets &&\r\n <DetailsList\r\n className=\"location-target-error-callout-details-list\"\r\n columns={columns}\r\n isHeaderVisible={false}\r\n items={locationTargets}\r\n layoutMode={DetailsListLayoutMode.justified}\r\n selectionMode={SelectionMode.none}\r\n />\r\n }\r\n </Callout>\r\n );\r\n}\r\n\r\nLocationTargetErrorCalloutUnstyled.propTypes = {\r\n classes: PropTypes.shape({ locationTargetErrorCallout: PropTypes.string }).isRequired,\r\n error: PropTypes.oneOf(_.values(LocationTargetErrorType)),\r\n locationTargets: PropTypes.arrayOf(PropTypes.shape({})),\r\n onDismiss: PropTypes.func.isRequired,\r\n onLocationTargetRemove: PropTypes.func.isRequired,\r\n target: PropTypes.shape({}),\r\n};\r\n\r\nLocationTargetErrorCalloutUnstyled.defaultProps = {\r\n error: undefined,\r\n locationTargets: undefined,\r\n target: undefined,\r\n};\r\n\r\nexport const LocationTargetErrorCallout =\r\n withDefaultStyles(LocationTargetErrorCalloutUnstyled, getStyles);\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport _ from 'underscore';\r\nimport React, { useCallback, useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from '@fluentui/react';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nimport { LocationTargetErrorType } from './location-targeting-error-type';\r\n\r\nconst errorMessageMap = {\r\n [LocationTargetErrorType.UNSUPPORTED_LOCATION]: {\r\n text: _TL_('Only {{supportedCountries}} locations are supported.'),\r\n shouldDisplayLink: false,\r\n },\r\n [LocationTargetErrorType.REDUNDANT_LOCATION]: {\r\n text: _TL_('This location is a duplicate target.'),\r\n shouldDisplayLink: true,\r\n },\r\n [LocationTargetErrorType.FACEBOOK_AND_GOOGLE_NOT_SUPPORTED]: {\r\n text: _TL_('Facebook and Google don\\'t support this location.'),\r\n shouldDisplayLink: true,\r\n },\r\n [LocationTargetErrorType.FACEBOOK_NOT_SUPPORTED]: {\r\n text: _TL_('Facebook doesn\\'t support this location.'),\r\n shouldDisplayLink: true,\r\n },\r\n [LocationTargetErrorType.GOOGLE_NOT_SUPPORTED]: {\r\n text: _TL_('Google doesn\\'t support this location.'),\r\n shouldDisplayLink: true,\r\n },\r\n [LocationTargetErrorType.AUDIENCE_REQUIRED_MIN_RADIUS]: {\r\n text: _TL_('The minimum radius requirement for special ad category is 15 miles or 25km.'),\r\n shouldDisplayLink: false,\r\n },\r\n [LocationTargetErrorType.AUDIENCE_REQUIRED_POSTAL_CODE_NOT_SUPPORTED]: {\r\n text: _TL_('ZIP/postal code locations are not supported.'),\r\n shouldDisplayLink: false,\r\n },\r\n [LocationTargetErrorType.FACEBOOK_CALL_EXTENSION_COUNTRY_LIMITED_TARGET]: {\r\n text: _TL_('Due to a Meta Ads requirement, you\\'re only allowed to target countries that match the phone number of your selected business location.'),\r\n shouldDisplayLink: false,\r\n },\r\n};\r\n\r\n/**\r\n * Shows the error message underneath each location target in the grid.\r\n * @param {Object} props - React props.\r\n * @returns {ReactNode} - React component.\r\n */\r\nexport function LocationTargetErrorMessage(props) {\r\n const {\r\n error,\r\n locationTarget,\r\n onErrorCalloutShow,\r\n supportedCountries,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n\r\n const errorMessage = useMemo(() => errorMessageMap[error], [error]);\r\n\r\n const handleLinkClick = useCallback((event) => {\r\n onErrorCalloutShow(event, locationTarget, error);\r\n }, [error, locationTarget, onErrorCalloutShow]);\r\n\r\n if (!errorMessage) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"location-target-error-message\">\r\n {i18n.getString(errorMessage.text, { supportedCountries })}\r\n {' '}\r\n {errorMessage.shouldDisplayLink && (\r\n <Link\r\n as=\"a\"\r\n className=\"callout-link\"\r\n onClick={handleLinkClick}\r\n >\r\n {i18n.getString(_TL_('How can I fix this?'))}\r\n </Link>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nLocationTargetErrorMessage.propTypes = {\r\n error: PropTypes.oneOf(_.values(LocationTargetErrorType)).isRequired,\r\n locationTarget: PropTypes.shape({}).isRequired,\r\n onErrorCalloutShow: PropTypes.func.isRequired,\r\n supportedCountries: PropTypes.string,\r\n};\r\n\r\nLocationTargetErrorMessage.defaultProps = {\r\n supportedCountries: 'United States',\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useState, useCallback, useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport {\r\n LocationTarget as LocationTargetType,\r\n getIsRadiusTarget as defaultGetIsRadiusTarget,\r\n getIsBoundaryTarget as defaultGetIsBoundaryTarget,\r\n} from '@bingads-webui-react/bing-maps';\r\n\r\nimport { targetOptions } from './utils/target-options';\r\nimport { getLocationTargetingStyles } from './styles/location-targeting-style';\r\nimport { LocationTargetingSelection } from './location-targeting-selection';\r\nimport { LocationTargetingIntent } from './location-targeting-intent';\r\nimport { LocationTargetErrorCallout, LocationTargetErrorMessage } from './location-targeting-error';\r\n\r\nexport function LocationTargeting(props) {\r\n const {\r\n // common props\r\n strings,\r\n onNotifyValidationResult,\r\n isLoading,\r\n // Location choiceGroups props\r\n optionsConfig,\r\n selectedLocationOption,\r\n onChangeLocationOption,\r\n // LocationTargetsEditor props, complete props refers to \"@bingads-webui-react/bing-maps\"\r\n allowNegativeLocationTargeting,\r\n locationTargets,\r\n negativeLocationTargets,\r\n onLocationTargetsChange,\r\n onNegativeLocationTargetsChange,\r\n defaultRadiusSize,\r\n defaultRadiusUnit,\r\n mapRef,\r\n maxLocationTargets,\r\n maxRadiusInMiles,\r\n maxRadiusInKilometers,\r\n onLocationTargetsGetErrorMessage,\r\n onNegativeLocationTargetsGetErrorMessage,\r\n onSingleLocationTargetGetErrorMessage,\r\n isReadonly,\r\n getIsRadiusTarget,\r\n getIsBoundaryTarget,\r\n searchResultsFooter,\r\n searchResultsFooterOnClick,\r\n defaultSelectedSearchType,\r\n isMixedLocationSearch,\r\n showSearchTypeOptions,\r\n useInternalValidation,\r\n validationProps: {\r\n supportedCountries,\r\n errorsMap,\r\n getErrorMessages,\r\n getLocationTargetsForCallout,\r\n },\r\n // Targeting Intent\r\n shouldShowTargetingIntent,\r\n isPeopleInLocationChecked,\r\n isPeopleSearchingForLocationChecked,\r\n onPeopleInLocationChange,\r\n onPeopleSearchingForLocationChange,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getLocationTargetingStyles);\r\n const [errorCalloutProps, setErrorCalloutProps] = useState({});\r\n\r\n const handleErrorCalloutHide = useCallback(() => { setErrorCalloutProps({}); }, []);\r\n const handleErrorCalloutShow = useCallback((event, locationTarget, error) => {\r\n setErrorCalloutProps({\r\n target: event.target,\r\n error,\r\n locationTargets: getLocationTargetsForCallout(locationTarget, error),\r\n });\r\n }, [getLocationTargetsForCallout]);\r\n\r\n // Validate whole location targets\r\n const handleLocationTargetsValidate = useCallback(() => {\r\n const [validationResultMessage, editorMessage] = getErrorMessages({\r\n errorsMap,\r\n supportedCountries,\r\n });\r\n\r\n onNotifyValidationResult(validationResultMessage);\r\n\r\n return editorMessage;\r\n }, [errorsMap, getErrorMessages, onNotifyValidationResult, supportedCountries]);\r\n\r\n // Error messages to display next to a specific location target\r\n const handleSingleLocationGetTargetErrorMessage = useCallback(locationTarget => (\r\n errorsMap && errorsMap.has(locationTarget) && (\r\n <LocationTargetErrorMessage\r\n error={errorsMap.get(locationTarget)}\r\n locationTarget={locationTarget}\r\n onErrorCalloutShow={handleErrorCalloutShow}\r\n supportedCountries={supportedCountries}\r\n />\r\n )\r\n ), [errorsMap, handleErrorCalloutShow, supportedCountries]);\r\n\r\n // validate negative location targets\r\n const handleNegativeLocationTargetsValidate = useCallback(() => {\r\n const [validationResultMessage, editorMessage] = getErrorMessages({\r\n errorsMap,\r\n supportedCountries,\r\n isNegativeLocationTarget: true,\r\n });\r\n\r\n onNotifyValidationResult(validationResultMessage);\r\n\r\n return editorMessage;\r\n }, [errorsMap, getErrorMessages, onNotifyValidationResult, supportedCountries]);\r\n\r\n const handleLocationTargetRemove = useCallback((toRemove) => {\r\n onLocationTargetsChange(_.without(locationTargets, toRemove));\r\n }, [onLocationTargetsChange, locationTargets]);\r\n\r\n const validationProps = useMemo(() => {\r\n if (!useInternalValidation) {\r\n return {\r\n onLocationTargetsGetErrorMessage,\r\n onSingleLocationTargetGetErrorMessage,\r\n onNegativeLocationTargetsGetErrorMessage,\r\n };\r\n }\r\n\r\n return {\r\n onLocationTargetsGetErrorMessage: handleLocationTargetsValidate,\r\n onSingleLocationTargetGetErrorMessage: handleSingleLocationGetTargetErrorMessage,\r\n onNegativeLocationTargetsGetErrorMessage: handleNegativeLocationTargetsValidate,\r\n };\r\n }, [\r\n handleLocationTargetsValidate, handleSingleLocationGetTargetErrorMessage, onLocationTargetsGetErrorMessage,\r\n onNegativeLocationTargetsGetErrorMessage, onSingleLocationTargetGetErrorMessage, useInternalValidation, handleNegativeLocationTargetsValidate,\r\n ]);\r\n\r\n return (\r\n <div className={classNames('location-targeting', classes.LocationTargeting)}>\r\n <div className=\"location-targeting-body\">\r\n <LocationTargetingSelection\r\n isLoading={isLoading}\r\n updateErrorMessage={onNotifyValidationResult}\r\n allowNegativeLocationTargeting={allowNegativeLocationTargeting}\r\n locationTargets={locationTargets}\r\n negativeLocationTargets={negativeLocationTargets}\r\n onLocationTargetsChange={onLocationTargetsChange}\r\n onNegativeLocationTargetsChange={onNegativeLocationTargetsChange}\r\n defaultRadiusSize={defaultRadiusSize}\r\n defaultRadiusUnit={defaultRadiusUnit}\r\n mapRef={mapRef}\r\n maxLocationTargets={maxLocationTargets}\r\n maxRadiusInMiles={maxRadiusInMiles}\r\n maxRadiusInKilometers={maxRadiusInKilometers}\r\n isReadonly={isReadonly}\r\n getIsRadiusTarget={getIsRadiusTarget}\r\n getIsBoundaryTarget={getIsBoundaryTarget}\r\n searchResultsFooter={searchResultsFooter}\r\n searchResultsFooterOnClick={searchResultsFooterOnClick}\r\n defaultSelectedSearchType={defaultSelectedSearchType}\r\n isMixedLocationSearch={isMixedLocationSearch}\r\n strings={strings}\r\n showSearchTypeOptions={showSearchTypeOptions}\r\n // choicegroup\r\n optionsConfig={optionsConfig}\r\n selectedLocationOption={selectedLocationOption}\r\n onChangeLocationOption={onChangeLocationOption}\r\n {...validationProps}\r\n />\r\n {\r\n (shouldShowTargetingIntent && selectedLocationOption !== targetOptions.everywhere) && (\r\n <LocationTargetingIntent\r\n isLoading={isLoading}\r\n updateErrorMessage={onNotifyValidationResult}\r\n isPeopleInLocationChecked={isPeopleInLocationChecked}\r\n isPeopleSearchingForLocationChecked={isPeopleSearchingForLocationChecked}\r\n onPeopleInLocationChange={onPeopleInLocationChange}\r\n onPeopleSearchingForLocationChange={onPeopleSearchingForLocationChange}\r\n />\r\n )\r\n }\r\n <LocationTargetErrorCallout\r\n {...errorCalloutProps}\r\n onDismiss={handleErrorCalloutHide}\r\n onLocationTargetRemove={handleLocationTargetRemove}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nLocationTargeting.propTypes = {\r\n strings: PropTypes.shape({}),\r\n isLoading: PropTypes.bool,\r\n onNotifyValidationResult: PropTypes.func,\r\n optionsConfig: PropTypes.arrayOf(PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n text: PropTypes.string.isRequired,\r\n }),\r\n ])).isRequired,\r\n selectedLocationOption: PropTypes.string.isRequired,\r\n onChangeLocationOption: PropTypes.func.isRequired,\r\n\r\n allowNegativeLocationTargeting: PropTypes.bool,\r\n locationTargets: PropTypes.arrayOf(PropTypes.instanceOf(LocationTargetType)).isRequired,\r\n negativeLocationTargets: PropTypes.arrayOf(PropTypes.instanceOf(LocationTargetType)),\r\n onLocationTargetsChange: PropTypes.func.isRequired,\r\n onNegativeLocationTargetsChange: PropTypes.func,\r\n defaultRadiusSize: PropTypes.number,\r\n defaultRadiusUnit: PropTypes.oneOf(['mi', 'km']),\r\n /**\r\n * Ref that can be used to trigger actions in the map web control like zooming.\r\n */\r\n mapRef: PropTypes.shape({\r\n current: PropTypes.shape({\r\n hideTooltip: PropTypes.func,\r\n showTooltip: PropTypes.func,\r\n }),\r\n }),\r\n maxLocationTargets: PropTypes.number,\r\n maxRadiusInMiles: PropTypes.number,\r\n maxRadiusInKilometers: PropTypes.number,\r\n onLocationTargetsGetErrorMessage: PropTypes.func,\r\n onNegativeLocationTargetsGetErrorMessage: PropTypes.func,\r\n onSingleLocationTargetGetErrorMessage: PropTypes.func,\r\n isReadonly: PropTypes.bool,\r\n /**\r\n * Function that receives a location and determines if it is or isn't available for radius\r\n * targeting.\r\n */\r\n getIsRadiusTarget: PropTypes.func,\r\n /**\r\n * Function that receives a location and determines if it is or isn't available for boundary\r\n * targeting.\r\n */\r\n getIsBoundaryTarget: PropTypes.func,\r\n searchResultsFooter: PropTypes.func,\r\n searchResultsFooterOnClick: PropTypes.func,\r\n defaultSelectedSearchType: PropTypes.string,\r\n isMixedLocationSearch: PropTypes.bool,\r\n showSearchTypeOptions: PropTypes.bool,\r\n /**\r\n * Whether to use internal validation or not. If true, validationProps is required.\r\n */\r\n useInternalValidation: PropTypes.bool,\r\n /**\r\n * Validation config for selected locations.\r\n */\r\n validationProps: PropTypes.shape({\r\n supportedCountries: PropTypes.string,\r\n errorsMap: PropTypes.instanceOf(Map),\r\n getErrorMessages: PropTypes.func.isRequired,\r\n getLocationTargetsForCallout: PropTypes.func.isRequired,\r\n }),\r\n\r\n shouldShowTargetingIntent: PropTypes.bool,\r\n isPeopleInLocationChecked: PropTypes.bool,\r\n isPeopleSearchingForLocationChecked: PropTypes.bool,\r\n onPeopleInLocationChange: PropTypes.func.isRequired,\r\n onPeopleSearchingForLocationChange: PropTypes.func.isRequired,\r\n};\r\n\r\nLocationTargeting.defaultProps = {\r\n strings: {},\r\n isLoading: false,\r\n onNotifyValidationResult: _.noop,\r\n\r\n allowNegativeLocationTargeting: true,\r\n negativeLocationTargets: [],\r\n onNegativeLocationTargetsChange: _.noop,\r\n defaultRadiusSize: 25,\r\n defaultRadiusUnit: 'mi',\r\n mapRef: null,\r\n maxLocationTargets: 25,\r\n maxRadiusInMiles: 500,\r\n maxRadiusInKilometers: 800,\r\n onLocationTargetsGetErrorMessage: _.noop,\r\n onNegativeLocationTargetsGetErrorMessage: _.noop,\r\n onSingleLocationTargetGetErrorMessage: _.noop,\r\n isReadonly: false,\r\n getIsRadiusTarget: defaultGetIsRadiusTarget,\r\n getIsBoundaryTarget: defaultGetIsBoundaryTarget,\r\n searchResultsFooter: null,\r\n searchResultsFooterOnClick: null,\r\n defaultSelectedSearchType: undefined,\r\n isMixedLocationSearch: false,\r\n showSearchTypeOptions: true,\r\n useInternalValidation: true,\r\n validationProps: {\r\n supportedCountries: 'United States',\r\n errorsMap: new Map(),\r\n getErrorMessages: _.noop,\r\n getLocationTargetsForCallout: _.noop,\r\n },\r\n\r\n shouldShowTargetingIntent: false,\r\n isPeopleInLocationChecked: true,\r\n isPeopleSearchingForLocationChecked: true,\r\n};\r\n","export const LocationTargetTypes = {\r\n New: 'New',\r\n Included: 'Included',\r\n Excluded: 'Excluded',\r\n Recommended: 'Recommended',\r\n};\r\n","/* eslint-disable import/no-unresolved */\r\n/* eslint-disable import/extensions */\r\n/**\r\n * @file This file demostrate the \"odata.batch way\" to get bundle country and locations.\r\n * It is not recommended to use this way only if it's necessary.\r\n *\r\n */\r\nimport _ from 'underscore';\r\nimport * as languageBundle from '@bingads-webui-campaign-legacy/location-targets/util/languageBundle';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\nimport pageContext from '@bingads-webui-static-legacy/page-context';\r\nimport odata from '@bingads-webui-component-legacy/http/channel/odata';\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\n\r\nimport { LocationTargetTypes } from './location-target-types';\r\n\r\nfunction getLocalizedTargetType(i18n, { targetType, countryCode }) {\r\n const isMicrosoftBingDMAEnabled = _.result(pageContext.Permissions.dynamic, 'UpdateNielsenToMicrosoftBingDMA', false);\r\n const locationDMAString = isMicrosoftBingDMAEnabled ? i18n.getString(_TL_('LocationTargeting_TargetTypeMicrosoftBingDMA')) : i18n.getString(_TL_('LocationTargeting_TargetTypeDMA'));\r\n\r\n switch (targetType) {\r\n case 'Country':\r\n return i18n.getString(_TL_('LocationTargeting_TargetTypeCountry'));\r\n case 'City':\r\n return i18n.getString(_TL_('LocationTargeting_TargetTypeCity'));\r\n case 'MetroArea':\r\n return countryCode === 'US' ? locationDMAString : i18n.getString(_TL_('LocationTargeting_TargetTypeMetroArea'));\r\n case 'SubGeography':\r\n return i18n.getString(_TL_('LocationTargeting_TargetTypeSubGeography'));\r\n case 'PostalCode':\r\n return i18n.getString(_TL_('LocationTargeting_TargetTypePostalCode'));\r\n case 'County':\r\n return countryCode === 'US' ? i18n.getString(_TL_('LocationTargeting_TargetTypeCounty')) : 'N/A';\r\n case 'Neighborhood':\r\n return i18n.getString(_TL_('LocationTargeting_TargetTypeNeighborhood'));\r\n default:\r\n return 'N/A';\r\n }\r\n}\r\n\r\nexport const distanceUnitMap = {\r\n km: 1,\r\n kilometers: 'km',\r\n Kilometers: 'km',\r\n mi: 0,\r\n miles: 'mi',\r\n Miles: 'mi',\r\n 1: 'km',\r\n 0: 'mi',\r\n};\r\n\r\nexport const getI18nUnitMap = i18n => ({\r\n km: i18n.getString(_TL_('Location_Target_RadiusUnit_Km')),\r\n mi: i18n.getString(_TL_('Location_Target_RadiusUnit_Mi')),\r\n});\r\n\r\nexport function radiusTargetNameTypeComboGenerator(i18n, { distance, unit, name }) {\r\n const i18nUnitMap = getI18nUnitMap(i18n);\r\n\r\n return i18n.getString(\r\n _TL_('New_LocationTargeting_RadiusTargetTitleTemplate'),\r\n { distance, unit: i18nUnitMap[unit] || i18nUnitMap[distanceUnitMap[unit]], name }\r\n );\r\n}\r\n\r\nexport function areaTargetNameTypeComboGenerator(i18n, { name, type, countryCode }) {\r\n return `${name} (${getLocalizedTargetType(i18n, { targetType: type, countryCode })})`;\r\n}\r\n\r\nexport function buildLocationCriterionFromSearchResult(i18n, { targetItem, targetType }) {\r\n if (targetType.mode === 'radius') {\r\n return {\r\n Status: 'Active',\r\n SelectionStatus: LocationTargetTypes.New,\r\n LesLocationType: targetItem.LesLocationType,\r\n Campaign: null,\r\n CriterionType: 'Radius',\r\n Criterion: {\r\n Type: 'Radius',\r\n BidAdjustment: 0,\r\n OriginalBidAdjustment: 0,\r\n OriginalCashbackPercent: undefined,\r\n RadiusCriterion: {\r\n LocationId: targetItem.Id,\r\n Radius: targetType.radius,\r\n RadiusUnit: targetType.unit,\r\n Name: targetItem.ExpandedName,\r\n NameTypeCombo: radiusTargetNameTypeComboGenerator(i18n, {\r\n distance: targetType.radius,\r\n unit: targetType.unit,\r\n name: targetItem.ExpandedName,\r\n }),\r\n Latitude: targetItem.GeoPoint.Latitude,\r\n Longitude: targetItem.GeoPoint.Longitude,\r\n CountryCode: targetItem.CountryCode,\r\n LocationTargetEnclosingLocationIds: _.pluck(targetItem.ParentLocations, 'Id'),\r\n Type: 'Radius',\r\n LocationTargetType: targetItem.Type,\r\n },\r\n },\r\n };\r\n }\r\n\r\n return {\r\n Status: 'Active',\r\n SelectionStatus: targetType.status ? targetType.status : LocationTargetTypes.New,\r\n Campaign: null,\r\n CriterionType: 'Location',\r\n Criterion: {\r\n Type: 'Location',\r\n BidAdjustment: 0,\r\n OriginalBidAdjustment: 0,\r\n OriginalCashbackPercent: undefined,\r\n LocationCriterion: {\r\n LocationId: targetItem.Id,\r\n Name: targetItem.ExpandedName,\r\n NameTypeCombo: areaTargetNameTypeComboGenerator(i18n, {\r\n name: targetItem.ExpandedName,\r\n type: targetItem.Type,\r\n countryCode: targetItem.CountryCode,\r\n }),\r\n Latitude: targetItem.GeoPoint.Latitude,\r\n Longitude: targetItem.GeoPoint.Longitude,\r\n CountryCode: targetItem.CountryCode,\r\n LocationType: targetItem.Type,\r\n EnclosingLocationIds: _.pluck(targetItem.ParentLocations, 'Id'),\r\n Type: 'Location',\r\n LesLocationType: targetItem.LesLocationType,\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function getBundleCountries(language, market) {\r\n let bundleCountries = languageBundle.getBundle(language, market);\r\n\r\n if (!bundleCountries) {\r\n bundleCountries = [];\r\n let publisherCountry = languageBundle.getPublisherCountryByCode(market);\r\n\r\n if (_.isUndefined(publisherCountry)) {\r\n publisherCountry = {\r\n Country: 'US',\r\n LocationId: 190,\r\n };\r\n }\r\n\r\n bundleCountries.push(publisherCountry);\r\n }\r\n return bundleCountries;\r\n}\r\n\r\nexport function getBundleCountriesLocations(bundleCountries, lcid, cid, aid) {\r\n const locationIds = _.pluck(bundleCountries, 'LocationId');\r\n if (_.size(locationIds) === 0) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n const reqs = _.map(locationIds, id => ({\r\n type: 'GET',\r\n url: `${edmCampaign.Customers.$withKey(cid).Accounts.$withKey(aid).Locations.$withKey(id).path}?%24expand=ParentLocations`,\r\n headers: lcid ? {\r\n lcid,\r\n } : undefined,\r\n }));\r\n\r\n return odata.batch({ reqs, needContentType: true });\r\n}\r\n\r\nexport function getBundleCountriesAndBundleLocationCriterions(cid, aid, lcid, language, market, i18n) {\r\n const bundleCountries = getBundleCountries(language, market);\r\n\r\n return getBundleCountriesLocations(bundleCountries, lcid, cid, aid).then((response) => {\r\n const bundleLocationCriterions = [];\r\n if (response.message) {\r\n throw new Error(response.message);\r\n }\r\n _.each(response, (location) => {\r\n bundleLocationCriterions.push(buildLocationCriterionFromSearchResult(i18n, {\r\n targetItem: location.data,\r\n targetType: { mode: 'location', status: 'Included' },\r\n }));\r\n });\r\n return ({ bundleCountries, bundleLocationCriterions });\r\n }).catch(() => ({ bundleCountries: [], bundleLocationCriterions: [] }));\r\n}\r\n\r\nexport function loadBundleCountries(serverContext, cid, aid, i18n) {\r\n const isLocal = () => {\r\n const hostname = document.location.hostname.toLowerCase();\r\n return hostname.indexOf('ads.microsoft.com') === -1 &&\r\n hostname.indexOf('ads-int.microsoft.com') === -1;\r\n };\r\n\r\n const odataPath = isLocal() ? 'Advertiser/V2' : 'Campaign/V2';\r\n\r\n // multiPart path is inside the request POST body so can't be proxied by UI server like path\r\n const batchPath = 'Advertiser/V2';\r\n\r\n const {\r\n ServicesEndpoints: { CampaignAPI, AdInsightAPI },\r\n CurrentUser = {},\r\n } = serverContext;\r\n const lcid = CurrentUser.LocaleID || '1033';\r\n const market = CurrentUser.Market || 'US';\r\n const language = 'All';\r\n\r\n config.set({\r\n 'odata.path': odataPath,\r\n 'odata.multipart_path': batchPath,\r\n 'odata.batch_url': `${CampaignAPI}${odataPath}/$batch`,\r\n 'odata.url': CampaignAPI,\r\n 'adinsight.odata.url': AdInsightAPI,\r\n 'adinsight.odata.batch_url': `${AdInsightAPI}AdInsight/V2/$batch`,\r\n Token: serverContext.Token,\r\n 'odata.token': serverContext.Token,\r\n });\r\n\r\n return getBundleCountriesAndBundleLocationCriterions(cid, aid, lcid, language, market, i18n);\r\n}\r\n","export const ENTITY_ACTION_TYPES = {\r\n Delete: 'Delete',\r\n Add: 'Add',\r\n Update: 'Update',\r\n};\r\n","import _ from 'underscore';\r\nimport { LocationTarget, compareLocationTargetArrays } from '@bingads-webui-react/bing-maps';\r\n\r\nimport { LocationTargetTypes as LOCATION_TARGET_TYPES } from './location-target-types';\r\nimport { ENTITY_ACTION_TYPES } from './entity-action-types';\r\n\r\nconst RADIUS_UNIT_MAP = {\r\n mi: 'mi',\r\n km: 'km',\r\n Miles: 'mi',\r\n Kilometers: 'km',\r\n};\r\n\r\nexport const INTENT_TARGET_VALUE = {\r\n PeopleIn: 'PeopleIn',\r\n PeopleSearchingForOrViewingPages: 'PeopleSearchingForOrViewingPages',\r\n PeopleInOrSearchingForOrViewingPages: 'PeopleInOrSearchingForOrViewingPages',\r\n};\r\n\r\nexport const fromLocationCriterionToBingMapTarget = data => (\r\n _.chain(data)\r\n .filter(criterion => criterion.Criterion.Type !== 'LocationIntentOption')\r\n .map((criterion) => {\r\n const locationTarget =\r\n criterion['@odata.type'] === '#Model.NegativeCampaignCriterion' ?\r\n LocationTarget.CreateExcludedLocationTarget({\r\n CountryCode: criterion.Criterion.CountryCode,\r\n ExpandedName: criterion.Criterion.Name,\r\n GeoPoint: criterion.Criterion.GeoPoint ? criterion.Criterion.GeoPoint : {\r\n Latitude: criterion.Criterion.Latitude,\r\n Longitude: criterion.Criterion.Longitude,\r\n },\r\n Id: criterion.Criterion.LocationId,\r\n Type: criterion.Criterion.LocationType || criterion.Criterion.Type,\r\n }, criterion.Criterion.Radius, RADIUS_UNIT_MAP[criterion.Criterion.RadiusUnit])\r\n : LocationTarget.CreateIncludedLocationTarget({\r\n CountryCode: criterion.Criterion.CountryCode,\r\n ExpandedName: criterion.Criterion.Name,\r\n GeoPoint: criterion.Criterion.GeoPoint ? criterion.Criterion.GeoPoint : {\r\n Latitude: criterion.Criterion.Latitude,\r\n Longitude: criterion.Criterion.Longitude,\r\n },\r\n Id: criterion.Criterion.LocationId,\r\n Type: criterion.Criterion.LocationType || criterion.Criterion.Type,\r\n }, criterion.Criterion.Radius, RADIUS_UNIT_MAP[criterion.Criterion.RadiusUnit]);\r\n locationTarget.Id = criterion.Id;\r\n return locationTarget;\r\n })\r\n .value()\r\n);\r\n\r\nexport const getIntentCriterion = criterions => _.filter(criterions, criterion => criterion.Criterion.Type === 'LocationIntentOption')[0];\r\n\r\nexport const getIntentCriterionValues = (intentCriterion) => {\r\n let peopleInLocation = null;\r\n let peopleSearchingForLocation = null;\r\n\r\n switch (intentCriterion && intentCriterion.Criterion\r\n && intentCriterion.Criterion.IntentOption) {\r\n case INTENT_TARGET_VALUE.PeopleIn:\r\n peopleInLocation = true;\r\n peopleSearchingForLocation = false;\r\n break;\r\n case INTENT_TARGET_VALUE.PeopleSearchingForOrViewingPages:\r\n peopleSearchingForLocation = true;\r\n peopleInLocation = false;\r\n break;\r\n case INTENT_TARGET_VALUE.PeopleInOrSearchingForOrViewingPages:\r\n default:\r\n peopleInLocation = true;\r\n peopleSearchingForLocation = true;\r\n break;\r\n }\r\n\r\n return { peopleInLocation, peopleSearchingForLocation };\r\n};\r\n\r\nexport const getIntentValue = ({\r\n peopleInLocation,\r\n peopleSearchingForLocation,\r\n peopleInOrSearchingForLocation,\r\n}) => {\r\n let intent = '';\r\n\r\n if (peopleInOrSearchingForLocation) {\r\n intent = INTENT_TARGET_VALUE.PeopleInOrSearchingForOrViewingPages;\r\n } else if (peopleInLocation) {\r\n intent = INTENT_TARGET_VALUE.PeopleIn;\r\n } else if (peopleSearchingForLocation) {\r\n intent = INTENT_TARGET_VALUE.PeopleSearchingForOrViewingPages;\r\n }\r\n\r\n return intent;\r\n};\r\n\r\nexport const getLocationsToSave = (initialTargets, targets) => {\r\n const diff = compareLocationTargetArrays(initialTargets, targets);\r\n const locationsToAdd = [];\r\n const locationsToDelete = [];\r\n\r\n _.each(diff.Deleted, (deletedTarget) => {\r\n locationsToDelete.push(deletedTarget);\r\n });\r\n\r\n _.each(diff.Added, (addedTarget) => {\r\n locationsToAdd.push(addedTarget);\r\n });\r\n\r\n // NOTE: Backend does not support updating an existing location target's radius\r\n // Updates will be processed as a delete and then an add\r\n _.each(diff.Updated, (updatedTarget) => {\r\n locationsToAdd.push(updatedTarget);\r\n locationsToDelete.push(updatedTarget);\r\n });\r\n\r\n return {\r\n locationsToAdd,\r\n locationsToDelete,\r\n };\r\n};\r\n\r\nexport const generateIntentTargetValues = (intent, intentCriterion, campaignId) => {\r\n if (intent) {\r\n return [{\r\n Id: intentCriterion ? intentCriterion.Id : '',\r\n CriterionType: 'LocationIntentCriterion',\r\n Criterion: {\r\n Type: 'LocationIntentCriterion',\r\n LocationIntentCriterion: {\r\n IntentOption: intent,\r\n },\r\n },\r\n Campaign: {\r\n Id: campaignId,\r\n },\r\n }];\r\n }\r\n return [];\r\n};\r\n\r\nexport const fromBingMapTargetToLocationTargetEDM = (locations, campaignId, entityActionType) => (\r\n _.map(locations, (location) => {\r\n let criterionType = null;\r\n if (location.isRadiusLocationTarget) {\r\n criterionType = 'Radius';\r\n } else if (location.targetingType === LOCATION_TARGET_TYPES.Included) {\r\n criterionType = 'Location';\r\n } else {\r\n criterionType = 'NegativeLocation';\r\n }\r\n\r\n const locationToSend = {\r\n Campaign: {\r\n Id: campaignId,\r\n },\r\n CriterionType: criterionType,\r\n SelectionStatus: location.targetingType === LOCATION_TARGET_TYPES.Included ?\r\n LOCATION_TARGET_TYPES.Included : LOCATION_TARGET_TYPES.Excluded,\r\n Status: entityActionType === ENTITY_ACTION_TYPES.Delete ? 'Deleted' : 'Active',\r\n };\r\n\r\n if (entityActionType === ENTITY_ACTION_TYPES.Update ||\r\n entityActionType === ENTITY_ACTION_TYPES.Delete) {\r\n locationToSend.Id = location.Id;\r\n }\r\n\r\n if (location.isRadiusLocationTarget) {\r\n locationToSend.Criterion = {\r\n Type: 'Radius',\r\n RadiusCriterion: {\r\n CountryCode: location.location.CountryCode,\r\n Latitude: location.location.GeoPoint.Latitude,\r\n Longitude: location.location.GeoPoint.Longitude,\r\n Name: location.location.ExpandedName,\r\n Radius: location.radiusSize,\r\n RadiusUnit: location.radiusUnit,\r\n LocationId: location.LocationId,\r\n Type: 'Radius',\r\n },\r\n };\r\n } else {\r\n locationToSend.Criterion = {\r\n Type: 'Location',\r\n LocationCriterion: {\r\n CountryCode: location.location.CountryCode,\r\n EnclosingLocationIds: [190, 4126],\r\n Latitude: location.location.GeoPoint.Latitude,\r\n Longitude: location.location.GeoPoint.Longitude,\r\n LesLocationType: location.location.Type,\r\n LocationStatus: 'Active',\r\n LocationType: location.location.Type,\r\n Name: location.location.ExpandedName,\r\n LocationId: location.LocationId,\r\n Type: 'Location',\r\n },\r\n };\r\n }\r\n return locationToSend;\r\n })\r\n);\r\n","import { isNumber } from 'underscore';\r\nimport React, { useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n makeStyles,\r\n mergeClasses,\r\n shorthands,\r\n tokens,\r\n} from '@fluentui/react-components';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nconst useOptionStyles = makeStyles({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n ...shorthands.gap('10px'),\r\n },\r\n optionText: {\r\n flexGrow: 1,\r\n },\r\n optionNumber: {\r\n flexShrink: 0,\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n});\r\n\r\nexport const OptionItem = ({ option: { text, number } }) => {\r\n const i18n = useContext(I18nContext);\r\n const classes = useOptionStyles();\r\n const optionNumber = useMemo(() => {\r\n if (!isNumber(number)) {\r\n return null;\r\n }\r\n if (number === 1) {\r\n return i18n.getString(_TL_('1 page URL'));\r\n }\r\n return i18n.getString(_TL_('{{number}} page URLs'), { number });\r\n }, [number, i18n]);\r\n\r\n return (\r\n <div className={mergeClasses('page-feed-selector-item', classes.root)}>\r\n <div className={mergeClasses('page-feed-selector-item-text', classes.optionText)}>{text}</div>\r\n {optionNumber && <div className={mergeClasses('page-feed-selector-item-number', classes.optionNumber)}>{optionNumber}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nOptionItem.propTypes = {\r\n option: PropTypes.shape({\r\n text: PropTypes.string.isRequired,\r\n number: PropTypes.number.isRequired,\r\n }).isRequired,\r\n};\r\n","import React, { useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { Alert } from '@bingads-webui-react/alert';\r\nimport { HelpLink } from '@bingads-webui-react/help-link';\r\n\r\nexport const NoInitialDataAlert = () => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <Alert\r\n message={\r\n <>\r\n {i18n.getString(_TL_('Before you can start personalizing your ads, you’ll need to add a page feed for your products or services.'))} <HelpLink query=\"help:app54621\">{i18n.getString(_TL_('Learn more'))}</HelpLink>\r\n </>\r\n }\r\n level=\"Warning\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n );\r\n};\r\n\r\nexport const SystemErrorAlert = () => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <Alert\r\n message={i18n.getString(_TL_('We cannot load your page feeds at this time. Please try again later.'))}\r\n level=\"Error\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n );\r\n};\r\n\r\nexport const MaxSelectionAlert = ({ selectedOptionsLimit }) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <Alert\r\n message={i18n.getString(_TL_('You can only add up to {{selectedOptionsLimit}} page feeds per campaign. Please review your selections and try again.'), { selectedOptionsLimit })}\r\n level=\"Warning\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n\r\n );\r\n};\r\n\r\nMaxSelectionAlert.propTypes = {\r\n selectedOptionsLimit: PropTypes.number.isRequired,\r\n};\r\n\r\nexport const MoreOptionsInlineAlert = ({ optionsLimit }) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <Alert\r\n message={i18n.getString(_TL_('We only display the first {{optionsLimit}} page feeds. Please refine your search to find the specific page feed.'), { optionsLimit })}\r\n level=\"Info\"\r\n icon={null}\r\n dismissible={false}\r\n />\r\n );\r\n};\r\n\r\nMoreOptionsInlineAlert.propTypes = {\r\n optionsLimit: PropTypes.number.isRequired,\r\n};\r\n\r\nexport const NoDataInlineAlert = ({ searchFilter }) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <div className=\"page-feed-selector-no-options\">\r\n {searchFilter &&\r\n <span>{i18n.getString(_TL_('No results found'))}</span>\r\n }\r\n {!searchFilter &&\r\n <span>{i18n.getString(_TL_('Once you add page feeds, they’ll appear in the dropdown.'))}</span>\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nNoDataInlineAlert.propTypes = {\r\n searchFilter: PropTypes.string,\r\n};\r\n\r\nNoDataInlineAlert.defaultProps = {\r\n searchFilter: undefined,\r\n};\r\n","import { clone, isEmpty, isFunction, pluck } from 'underscore';\r\nimport React, { useCallback, useEffect, useMemo, useContext, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n makeStyles,\r\n mergeClasses,\r\n shorthands,\r\n tokens,\r\n useId,\r\n Combobox,\r\n Option,\r\n} from '@fluentui/react-components';\r\nimport { useDebouncedState, usePrevProp } from '@bingads-webui-campaign-react/common-generic-hooks';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { InlineLoading, LoadingOverlay } from '@bingads-webui-campaign-react/loading';\r\nimport { SelectedItem } from '@bingads-webui-campaign-react/pill-item-components';\r\nimport {\r\n useMultiSelectContext,\r\n withMultiSelectCombobox,\r\n useFluentV1Styles,\r\n} from '@bingads-webui-campaign-react/multi-selector';\r\nimport { OptionItem } from './option-item';\r\nimport { MaxSelectionAlert, MoreOptionsInlineAlert, NoDataInlineAlert, NoInitialDataAlert, SystemErrorAlert } from './alerts';\r\n\r\nconst MultiSelectCombobox = withMultiSelectCombobox(Combobox);\r\n\r\nconst usePageFeedSelectorSectionStyles = makeStyles({\r\n root: {\r\n position: 'relative',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n ...shorthands.gap('10px'),\r\n },\r\n rootLoading: {\r\n minHeight: '64px',\r\n },\r\n description: {\r\n marginBottom: tokens.spacingVerticalS,\r\n },\r\n tagsList: {\r\n marginBottom: tokens.spacingVerticalXS,\r\n marginTop: 0,\r\n paddingLeft: 0,\r\n display: 'flex',\r\n gridGap: tokens.spacingHorizontalXS,\r\n flexWrap: 'wrap',\r\n },\r\n comboAndSpinner: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n columnGap: tokens.spacingHorizontalM,\r\n },\r\n combobox: {\r\n width: '560px',\r\n },\r\n listbox: {\r\n maxHeight: '245px',\r\n },\r\n checkIcon: {\r\n flexShrink: 0,\r\n },\r\n});\r\n\r\nexport const PageFeedSelectorSectionImpl = ({\r\n onChange: onChangeFromProp,\r\n searchStartDelayMs,\r\n customizedDescription,\r\n customizedSearchPlaceholder,\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n const comboboxId = useId('combobox');\r\n const styles = usePageFeedSelectorSectionStyles();\r\n const fluentV1ComboboxStyles = useFluentV1Styles();\r\n\r\n const {\r\n isLoadingOptions,\r\n isFirstOptionsLoad,\r\n isNoOptionsAfterFirstLoad,\r\n isMoreOptionsThanLimit,\r\n options,\r\n optionsLoadError,\r\n lastLoadedSearchFilter,\r\n optionsDisplayLimit,\r\n selectedOptionsLimit,\r\n\r\n isLoadingSelectedOptions,\r\n isSelectedOptionsLimitReached,\r\n selectedOptions,\r\n selectedOptionsLoadError,\r\n setSelectedOptions,\r\n\r\n setSearchFilter: setSearchFilterFromContext,\r\n } = useMultiSelectContext();\r\n\r\n const [debouncedSearchFilter, setSearchFilter, searchFilter] = useDebouncedState('', searchStartDelayMs);\r\n useEffect(() => {\r\n setSearchFilterFromContext(debouncedSearchFilter);\r\n }, [debouncedSearchFilter, setSearchFilterFromContext]);\r\n\r\n const onChange = useCallback((event) => {\r\n const { value: rawValue } = event.target;\r\n setSearchFilter(rawValue);\r\n }, [setSearchFilter]);\r\n\r\n const onOptionSelect = useCallback((event, data) => {\r\n setSelectedOptions(data.resolvedSelectedOptions);\r\n if (isFunction(onChangeFromProp)) {\r\n onChangeFromProp(data.resolvedSelectedOptions);\r\n }\r\n }, [setSelectedOptions, onChangeFromProp]);\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isDropdownOpenStateChangedByUser, setIsDropdownOpenStateChangedByUser] = useState(false);\r\n const onOpenChange = useCallback((event, data) => {\r\n setIsOpen(data.open);\r\n setIsDropdownOpenStateChangedByUser(true);\r\n }, []);\r\n\r\n const onDeleteItem = useCallback((index) => {\r\n const newSelectedOptions = clone(selectedOptions);\r\n newSelectedOptions.splice(index, 1);\r\n setSelectedOptions(newSelectedOptions);\r\n if (isFunction(onChangeFromProp)) {\r\n onChangeFromProp(newSelectedOptions);\r\n }\r\n }, [selectedOptions, setSelectedOptions, onChangeFromProp]);\r\n\r\n const selectedOptionKeys = useMemo(() => pluck(selectedOptions, 'key'), [selectedOptions]);\r\n const selectedOptionsSet = useMemo(() => new Set(selectedOptionKeys), [selectedOptionKeys]);\r\n const shouldDisableSelection = useCallback(option => isSelectedOptionsLimitReached && !selectedOptionsSet.has(option.key), [isSelectedOptionsLimitReached, selectedOptionsSet]);\r\n\r\n const isAnyLoading = isLoadingOptions || isLoadingSelectedOptions;\r\n const hasLoadErrors = optionsLoadError || selectedOptionsLoadError;\r\n const showInitialLoading = (isFirstOptionsLoad && !hasLoadErrors) || isLoadingSelectedOptions;\r\n const hasInitialLoadErrors = isFirstOptionsLoad && hasLoadErrors;\r\n const canUserStartOperating = !showInitialLoading && !isNoOptionsAfterFirstLoad && !(hasInitialLoadErrors || selectedOptionsLoadError);\r\n\r\n const [, hasIsLoadingOptionsChanged] = usePrevProp(isLoadingOptions);\r\n const [, hasIsLoadingSelectedOptionsChanged] = usePrevProp(isLoadingSelectedOptions);\r\n if ((hasIsLoadingOptionsChanged && isLoadingOptions) ||\r\n (hasIsLoadingSelectedOptionsChanged && isLoadingSelectedOptions)) {\r\n setIsDropdownOpenStateChangedByUser(false);\r\n }\r\n\r\n const [, hasOptionsLoadErrorChanged] = usePrevProp(optionsLoadError);\r\n const [, hasSelectedOptionsLoadErrorChanged] = usePrevProp(selectedOptionsLoadError);\r\n if (((hasOptionsLoadErrorChanged && optionsLoadError) ||\r\n (hasSelectedOptionsLoadErrorChanged && selectedOptionsLoadError)) && !isDropdownOpenStateChangedByUser) {\r\n // Close the dropdown if there is an error and the user didn't change the dropdown after the loading started\r\n setIsOpen(false);\r\n }\r\n\r\n // Rendering\r\n return (\r\n <div className={mergeClasses('page-feed-selector', styles.root, showInitialLoading && styles.rootLoading)}>\r\n <span className={mergeClasses('page-feed-selector-description', styles.description)}>{customizedDescription || i18n.getString(_TL_('Add your page feeds below.'))}</span>\r\n {!showInitialLoading && isNoOptionsAfterFirstLoad &&\r\n <NoInitialDataAlert />\r\n }\r\n {!isAnyLoading && hasLoadErrors &&\r\n <SystemErrorAlert />\r\n }\r\n {canUserStartOperating &&\r\n <div className={mergeClasses('page-feed-selector-selected-items', styles.tagsList)}>\r\n {selectedOptions.map((item, index) => (\r\n <SelectedItem\r\n key={item.key}\r\n itemText={item.text}\r\n itemIndex={index}\r\n onDelete={onDeleteItem}\r\n />\r\n ))}\r\n </div>\r\n }\r\n {!showInitialLoading && isSelectedOptionsLimitReached &&\r\n <MaxSelectionAlert selectedOptionsLimit={selectedOptionsLimit} />\r\n }\r\n\r\n <div className={styles.comboAndSpinner}>\r\n {canUserStartOperating &&\r\n <MultiSelectCombobox\r\n id={comboboxId}\r\n placeholder={customizedSearchPlaceholder || i18n.getString(_TL_('Choose page feeds'))}\r\n listbox={{ className: styles.listbox }}\r\n root={{ className: mergeClasses(styles.combobox, fluentV1ComboboxStyles.root) }}\r\n disabled={!canUserStartOperating}\r\n onOptionSelect={onOptionSelect}\r\n onChange={onChange}\r\n value={searchFilter}\r\n options={options}\r\n selectedOptions={selectedOptions}\r\n open={isOpen}\r\n onOpenChange={onOpenChange}\r\n >\r\n {!optionsLoadError &&\r\n <>\r\n {isEmpty(options) &&\r\n <LoadingOverlay className=\"loading-overlay-no-data-alert\" isVisible={isLoadingOptions} flexDirection=\"column\">\r\n <NoDataInlineAlert searchFilter={lastLoadedSearchFilter} />\r\n </LoadingOverlay>\r\n }\r\n {options.map(option => (\r\n <Option key={option.key} value={option.key} text={option.text} disabled={isLoadingOptions || shouldDisableSelection(option)} checkIcon={{ className: styles.checkIcon }} >\r\n <OptionItem option={option} />\r\n </Option>\r\n ))}\r\n {isMoreOptionsThanLimit &&\r\n <LoadingOverlay className=\"loading-overlay-more-options-alert\" isVisible={isLoadingOptions} flexDirection=\"column\">\r\n <MoreOptionsInlineAlert optionsLimit={optionsDisplayLimit} />\r\n </LoadingOverlay>\r\n }\r\n </>\r\n }\r\n {optionsLoadError && <span aria-errormessage={i18n.getString('No items to display due to a system error')}> </span>}\r\n </MultiSelectCombobox>\r\n }\r\n {isAnyLoading && <InlineLoading text={i18n.getString(_TL_('Loading...'))} />}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nPageFeedSelectorSectionImpl.propTypes = {\r\n onChange: PropTypes.func,\r\n searchStartDelayMs: PropTypes.number.isRequired,\r\n customizedDescription: PropTypes.string,\r\n customizedSearchPlaceholder: PropTypes.string,\r\n};\r\n\r\nPageFeedSelectorSectionImpl.defaultProps = {\r\n onChange: undefined,\r\n customizedDescription: undefined,\r\n customizedSearchPlaceholder: undefined,\r\n};\r\n","import Promise from 'bluebird';\r\nimport React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n MultiSelectorContextProvider,\r\n makeUseOptionsAsyncDataSource,\r\n makeUseSelectedOptionsAsyncDataSource,\r\n} from '@bingads-webui-campaign-react/multi-selector';\r\nimport { loadAssociatedPageFeedsFactory, loadPageFeedsFactory } from './data-source';\r\nimport { PageFeedSelectorSectionImpl } from './page-feed-selector-section-impl';\r\n\r\nconst searchStartDelayMs = 300;\r\nconst defaultOptionsDisplayLimit = 50;\r\nconst defaultSelectedOptionsLimit = 20;\r\n\r\nexport const PageFeedSelectorSection = ({\r\n cid, aid, campaignId, onChange, onSelectedOptionsUpdate,\r\n loadPageFeedsFactory: loadPageFeedsFactoryFromProp,\r\n loadAssociatedPageFeedsFactory: loadAssociatedPageFeedsFactoryFromProp,\r\n optionsDisplayLimit, selectedOptionsLimit,\r\n customizedDescription, customizedSearchPlaceholder,\r\n}) => {\r\n const loadPageFeeds = useMemo(() => loadPageFeedsFactoryFromProp(cid, aid), [loadPageFeedsFactoryFromProp, cid, aid]);\r\n const loadSelectedPageFeeds = useMemo(() => (campaignId ? loadAssociatedPageFeedsFactoryFromProp(cid, aid, campaignId) : () => Promise.delay(0, [])), [loadAssociatedPageFeedsFactoryFromProp, cid, aid, campaignId]);\r\n\r\n const useOptions = useMemo(() => makeUseOptionsAsyncDataSource(loadPageFeeds), [loadPageFeeds]);\r\n const useSelectedOptions = useMemo(() => makeUseSelectedOptionsAsyncDataSource(loadSelectedPageFeeds), [loadSelectedPageFeeds]);\r\n\r\n return (\r\n <MultiSelectorContextProvider\r\n useOptions={useOptions}\r\n useSelectedOptions={useSelectedOptions}\r\n selectedOptionsLimit={selectedOptionsLimit}\r\n optionsDisplayLimit={optionsDisplayLimit}\r\n onSelectedOptionsUpdate={onSelectedOptionsUpdate}\r\n >\r\n <PageFeedSelectorSectionImpl\r\n onChange={onChange}\r\n searchStartDelayMs={searchStartDelayMs}\r\n customizedDescription={customizedDescription}\r\n customizedSearchPlaceholder={customizedSearchPlaceholder}\r\n />\r\n </MultiSelectorContextProvider>\r\n );\r\n};\r\n\r\nPageFeedSelectorSection.propTypes = {\r\n loadPageFeedsFactory: PropTypes.func,\r\n loadAssociatedPageFeedsFactory: PropTypes.func,\r\n cid: PropTypes.number.isRequired,\r\n aid: PropTypes.number.isRequired,\r\n campaignId: PropTypes.number,\r\n onChange: PropTypes.func,\r\n onSelectedOptionsUpdate: PropTypes.func,\r\n optionsDisplayLimit: PropTypes.number,\r\n selectedOptionsLimit: PropTypes.number,\r\n customizedDescription: PropTypes.string,\r\n customizedSearchPlaceholder: PropTypes.string,\r\n};\r\nPageFeedSelectorSection.defaultProps = {\r\n loadPageFeedsFactory,\r\n loadAssociatedPageFeedsFactory,\r\n campaignId: undefined,\r\n onChange: undefined,\r\n onSelectedOptionsUpdate: undefined,\r\n optionsDisplayLimit: defaultOptionsDisplayLimit,\r\n selectedOptionsLimit: defaultSelectedOptionsLimit,\r\n customizedDescription: undefined,\r\n customizedSearchPlaceholder: undefined,\r\n};\r\n","import { isEmpty } from 'underscore';\r\nimport { edmCampaign } from '@bingads-webui/edm-campaign';\r\n\r\nexport const loadPageFeedsFactory = (cid, aid) => ({ searchFilter = '', top }) => {\r\n const orderby = { Name: 1 };\r\n const filter = {\r\n where: [\r\n ...!isEmpty(searchFilter) ?\r\n [`contains(tolower(Name), '${searchFilter.toLocaleLowerCase().replace(/'/g, \"''\")}')`] :\r\n [],\r\n\r\n [\"FeedCategories/any(c:c eq Enum.FeedCategory'PageFeed')\"],\r\n ].join(' and '),\r\n };\r\n return edmCampaign\r\n .Customers.$withKey(cid)\r\n .Accounts.$withKey(aid)\r\n .Feeds\r\n .get({\r\n top,\r\n orderby,\r\n filter,\r\n })\r\n .toPromise()\r\n .then(({ value }) => value.map(feed => ({\r\n key: feed.Id,\r\n text: feed.Name,\r\n number: feed.FeedItemCount,\r\n })));\r\n};\r\n\r\nexport const loadAssociatedPageFeedsFactory = (cid, aid, campaignId) => () =>\r\n edmCampaign\r\n .Customers.$withKey(cid)\r\n .Accounts.$withKey(aid)\r\n .Campaigns.$withKey(campaignId)\r\n .FeedAssociations\r\n .get({\r\n top: 2147483647, // max Int32\r\n })\r\n .toPromise()\r\n .then(({ value }) => value.map(feedAssociation => ({\r\n key: feedAssociation.FeedId,\r\n text: feedAssociation.FeedName,\r\n })));\r\n","import _ from 'underscore';\r\nimport { odata } from '@bingads-webui/http-util';\r\nimport config from '@bingads-webui-component-legacy/config/index';\r\nimport { serverContextStore } from '@bingads-webui-campaign/global-context-store';\r\nimport {\r\n AssetEventFeature,\r\n} from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nexport const ResponsiveAdConfigs = {\r\n MAX_HEADLINE_SUGGESTIONS: 15,\r\n MAX_DESCRIPTION_SUGGESTIONS: 10,\r\n};\r\n\r\nexport const getEmptyRecommendationsContext = (finalUrl, recommendationSource) => (recommendationSource === 'copilot' ? {\r\n finalUrl,\r\n recommendationSource,\r\n themes: [],\r\n headlines: [],\r\n longHeadlines: [],\r\n descriptions: [],\r\n imageAssets: [],\r\n} : {\r\n finalUrl,\r\n recommendationSource,\r\n headlines: [],\r\n longHeadlines: [],\r\n descriptions: [],\r\n});\r\n\r\nconst getBaseUrl = ({\r\n cid, aid, campaignId, api,\r\n}) => {\r\n if (campaignId) {\r\n return `${config.get('odata.url')}${config.get('odata.path')}/Customers(${cid})/Accounts(${aid})/Campaigns(${campaignId})/${api}`;\r\n }\r\n return `${config.get('odata.url')}${config.get('odata.path')}/Customers(${cid})/Accounts(${aid})/${api}`;\r\n};\r\n\r\nexport const getODataConfig = (serverContext) => {\r\n const isLocal = () => {\r\n const hostname = document.location.hostname.toLowerCase();\r\n // For sign up local environment, the hostname is ccui.devdev.bingads.microsoft.com\r\n if (hostname.indexOf('devdev') > -1) {\r\n return true;\r\n }\r\n return hostname.indexOf('ads.microsoft.com') === -1 &&\r\n hostname.indexOf('ads-int.microsoft.com') === -1;\r\n };\r\n\r\n const odataPath = isLocal() ? 'Advertiser/V2' : 'Campaign/V2';\r\n\r\n const oDataConfig = {\r\n odataToken: serverContext.Token,\r\n oDataToken: serverContext.Token,\r\n odataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n oDataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n };\r\n\r\n return oDataConfig;\r\n};\r\n\r\nexport const getOnlineTextRecommendations = ({\r\n cid, aid, campaignId, finalUrl,\r\n}) => {\r\n const url = getBaseUrl({\r\n cid,\r\n aid,\r\n campaignId,\r\n api: 'Default.CreateResponsiveSearchAdRecommendation',\r\n });\r\n\r\n const requestBody = {\r\n count: 1,\r\n business: {\r\n Website: finalUrl,\r\n },\r\n headlineCount: ResponsiveAdConfigs.MAX_HEADLINE_SUGGESTIONS,\r\n descriptionCount: ResponsiveAdConfigs.MAX_DESCRIPTION_SUGGESTIONS,\r\n caller: 'cmmt_ra',\r\n };\r\n return odata.post(url, {\r\n oDataToken: config.get('odata.token'),\r\n data: JSON.stringify(requestBody),\r\n });\r\n};\r\n\r\nconst getOnlineTextRecommendationsNative = ({ cid, aid, finalUrl }) => {\r\n const query = {\r\n FinalURL: finalUrl,\r\n Locale: _.get(serverContextStore, ['state', 'serverContext', 'CurrentLocale'], 'en-US'),\r\n };\r\n\r\n const select = [\r\n 'FinalUrls',\r\n 'BusinessName',\r\n 'Model.ResponsiveAd/Headlines',\r\n 'Model.ResponsiveAd/LongHeadlines',\r\n 'Model.ResponsiveAd/Descriptions',\r\n ];\r\n\r\n const url = getBaseUrl({\r\n cid,\r\n aid,\r\n api: 'Ads/Default.GetResponsiveAdRecommendation',\r\n });\r\n\r\n return odata.post(\r\n `${url}?$select=${select.join(',')}`,\r\n _.extend({ data: query }, { oDataToken: config.get('odata.token') })\r\n );\r\n};\r\n\r\nexport const getOnlineNativeAndSearchTextRecommendations = ({\r\n cid, aid, campaignId, finalUrl,\r\n}) => {\r\n const nativeRecommendationsPromise = getOnlineTextRecommendationsNative({\r\n cid, aid, finalUrl,\r\n });\r\n\r\n const searchRecommendationsPromise = getOnlineTextRecommendations({\r\n cid, aid, campaignId, finalUrl,\r\n });\r\n\r\n return Promise.all([nativeRecommendationsPromise, searchRecommendationsPromise])\r\n .then(([nativeRecommendations, searchRecommendations]) => ({\r\n value: [{\r\n Headlines: _.flatten(_.union(nativeRecommendations.value.map(v => v.Headlines), searchRecommendations.value.map(v => v.Headlines))),\r\n LongHeadlines: _.flatten(_.union(nativeRecommendations.value.map(v => v.LongHeadlines), searchRecommendations.value.map(v => v.LongHeadlines))),\r\n Descriptions: _.flatten(_.union(nativeRecommendations.value.map(v => v.Descriptions), searchRecommendations.value.map(v => v.Descriptions))),\r\n }],\r\n }));\r\n};\r\n\r\nexport const getOnlineBusinessNameRecommendations = ({\r\n cid, aid, campaignId, finalUrl,\r\n}) => {\r\n const url = getBaseUrl({\r\n cid,\r\n aid,\r\n campaignId,\r\n api: 'Default.GetExtractedBusinessInfo',\r\n });\r\n\r\n const requestBody = {\r\n url: finalUrl,\r\n };\r\n return odata.post(url, {\r\n oDataToken: config.get('odata.token'),\r\n data: JSON.stringify(requestBody),\r\n });\r\n};\r\n\r\nexport const getOfflineRecommendations = ({\r\n cid, aid,\r\n}) => {\r\n const url = getBaseUrl({\r\n cid,\r\n aid,\r\n api: 'Default.PerformanceMaxAssetRecommendations',\r\n });\r\n return odata.post(url, {\r\n oDataToken: config.get('odata.token'),\r\n });\r\n};\r\n\r\nexport const convertOnlineTextRecommendationToOfflineFormat = (textRecommendations) => {\r\n if (_.isArray(textRecommendations) && textRecommendations.length > 0) {\r\n return {\r\n headlines: _.chain(textRecommendations[0].Headlines)\r\n .map(headline => ({\r\n Text: headline.Asset.Text,\r\n SuggestionId: headline.RecommendationId,\r\n }))\r\n .value(),\r\n longHeadlines: _.chain(textRecommendations[0].Descriptions)\r\n .map(description => ({\r\n Text: description.Asset.Text,\r\n SuggestionId: description.RecommendationId,\r\n }))\r\n .value(),\r\n descriptions: _.chain(textRecommendations[0].Descriptions)\r\n .map(description => ({\r\n Text: description.Asset.Text,\r\n SuggestionId: description.RecommendationId,\r\n }))\r\n .value(),\r\n };\r\n }\r\n\r\n return getEmptyRecommendationsContext();\r\n};\r\n\r\nexport const getSuggestionIdsFromOfflineRecommendations = (recommendation) => {\r\n let suggestionIds = [];\r\n if (recommendation.BusinessName && recommendation.BusinessName.SuggestionId) {\r\n suggestionIds.push(recommendation.BusinessName.SuggestionId);\r\n }\r\n suggestionIds = suggestionIds.concat(_.pluck(recommendation.Descriptions, 'SuggestionId'));\r\n suggestionIds = suggestionIds.concat(_.pluck(recommendation.Headlines, 'SuggestionId'));\r\n suggestionIds = suggestionIds.concat(_.pluck(recommendation.Images, 'SuggestionId'));\r\n suggestionIds = suggestionIds.concat(_.pluck(recommendation.LongHeadlines, 'SuggestionId'));\r\n return suggestionIds;\r\n};\r\n\r\nexport class SuggestionsTracker {\r\n constructor() {\r\n this.trackingData = {\r\n allTextSuggestions: {\r\n descriptions: [],\r\n headlines: [],\r\n longHeadlines: [],\r\n businessName: [],\r\n },\r\n };\r\n }\r\n\r\n add(finalUrl, isFinalUrlFromOfflineRecommendations, suggestions, suggestionsReport) {\r\n this.trackingData = this.trackingData || {};\r\n this.trackingData.finalUrl = finalUrl;\r\n this.trackingData.isFinalUrlFromOfflineRecommendations = isFinalUrlFromOfflineRecommendations;\r\n\r\n if (suggestions) {\r\n this.trackingData.allTextSuggestions = {\r\n descriptions: _.uniq((this.trackingData.allTextSuggestions.descriptions).concat(suggestions.descriptions)),\r\n headlines: _.uniq((this.trackingData.allTextSuggestions.headlines).concat(suggestions.headlines)),\r\n longHeadlines: _.uniq((this.trackingData.allTextSuggestions.longHeadlines).concat(suggestions.longHeadlines)),\r\n businessName: suggestions.businessName ?\r\n _.uniq([...this.trackingData.allTextSuggestions.businessName, suggestions.businessName]) :\r\n this.trackingData.allTextSuggestions.businessName,\r\n };\r\n }\r\n if (_.isArray(suggestionsReport.view)) {\r\n this.trackingData.view = _.uniq((this.trackingData.view || []).concat(suggestionsReport.view));\r\n }\r\n if (_.isArray(suggestionsReport.apply)) {\r\n this.trackingData.apply = _.uniq((this.trackingData.apply || []).concat(suggestionsReport.apply));\r\n }\r\n if (_.isArray(suggestionsReport.returned)) {\r\n this.trackingData.returned = _.uniq((this.trackingData.returned || []).concat(suggestionsReport.returned));\r\n }\r\n if (_.isArray(suggestionsReport.selectedImageSuggestions)) {\r\n this.trackingData.selectedImageSuggestions = _.uniq((this.trackingData.selectedImageSuggestions || []).concat(suggestionsReport.selectedImageSuggestions), false, item => item.suggestionId);\r\n }\r\n }\r\n}\r\n\r\nconst uniqByRecommendationId = arr => _.uniq(arr, false, item => item.RecommendationId);\r\n\r\nexport const uniqAssetRecommendationsInThemes = (themes) => {\r\n const headlines = [];\r\n const longHeadlines = [];\r\n const descriptions = [];\r\n const imageAssets = [];\r\n\r\n _.each(themes, (theme) => {\r\n if (theme.headlines) {\r\n headlines.push(...theme.headlines);\r\n }\r\n if (theme.longHeadlines) {\r\n longHeadlines.push(...theme.longHeadlines);\r\n }\r\n if (theme.descriptions) {\r\n descriptions.push(...theme.descriptions);\r\n }\r\n if (theme.images) {\r\n imageAssets.push(...theme.images);\r\n }\r\n });\r\n\r\n return {\r\n headlines: uniqByRecommendationId(headlines),\r\n longHeadlines: uniqByRecommendationId(longHeadlines),\r\n descriptions: uniqByRecommendationId(descriptions),\r\n imageAssets: _.uniq(imageAssets, false, item => item.suggestionId),\r\n };\r\n};\r\n\r\nexport const getFeatureForAssetEvent = ({ isSignup, isDisplayPlus, isMMA }) => {\r\n if (isSignup) {\r\n return AssetEventFeature.PMAX_LITE;\r\n }\r\n if (isDisplayPlus) {\r\n return AssetEventFeature.DISPLAY_PLUS;\r\n }\r\n if (isMMA) {\r\n return AssetEventFeature.MMA;\r\n }\r\n return AssetEventFeature.PMAX;\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\nimport { SuggestionStatus, mapSuggestionResponseToState } from '@bingads-webui-campaign/media-repository';\r\nimport { CopilotSuggestionsTracker } from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nimport { SuggestionsTracker } from './utils';\r\n\r\nexport const RecommendationContext = React.createContext([\r\n {},\r\n _.noop,\r\n _.noop,\r\n]);\r\n\r\nexport function RecommendationContextProvider(props) {\r\n const { children } = props;\r\n const [recommendationContext, setRecommendationContext] = useState({\r\n finalUrl: undefined,\r\n recommendationSource: 'undetermined',\r\n finalUrls: [],\r\n themes: [],\r\n headlines: [],\r\n longHeadlines: [],\r\n descriptions: [],\r\n businessName: undefined,\r\n images: { ...mapSuggestionResponseToState(SuggestionStatus.EmptyURL) },\r\n tracking: new SuggestionsTracker(),\r\n copilotTracking: new CopilotSuggestionsTracker(),\r\n });\r\n const updateRecommendationContext = useCallback((delta) => {\r\n setRecommendationContext(currentContext => ({\r\n ...currentContext,\r\n ...delta,\r\n }));\r\n }, []);\r\n\r\n const reportRecommendations = useCallback((recommendationsReport) => {\r\n setRecommendationContext((currentContext) => {\r\n const {\r\n finalUrl,\r\n recommendationSource,\r\n tracking,\r\n headlines,\r\n longHeadlines,\r\n descriptions,\r\n businessName,\r\n images,\r\n } = currentContext;\r\n const recommendations = {\r\n headlines,\r\n longHeadlines,\r\n descriptions,\r\n businessName,\r\n images,\r\n };\r\n if (recommendationSource !== 'copilot') {\r\n tracking.add(finalUrl, recommendationSource === 'offline', recommendations, recommendationsReport);\r\n }\r\n return currentContext;\r\n });\r\n }, []);\r\n\r\n return (\r\n <RecommendationContext.Provider value={[\r\n recommendationContext,\r\n updateRecommendationContext,\r\n reportRecommendations,\r\n ]}\r\n >\r\n {children}\r\n </RecommendationContext.Provider>\r\n );\r\n}\r\n\r\nRecommendationContextProvider.propTypes = {\r\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired,\r\n};\r\n\r\nexport const withRecommendationContext = (WrappedComponent) => {\r\n const HoC = props => (\r\n <RecommendationContextProvider>\r\n <WrappedComponent {...props} />\r\n </RecommendationContextProvider>\r\n );\r\n HoC.displayName = `WithRecommendationContext(${getDisplayName(WrappedComponent)})`;\r\n\r\n hoistNonReactStatics(HoC, WrappedComponent);\r\n\r\n return HoC;\r\n};\r\n","import { uniq, property, chain, reject, contains, filter } from 'underscore';\r\n\r\nimport { getUtcTime } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nconst getNewTextAssets = (assetGroup, originalAssetGroup) => {\r\n const headlines = [];\r\n const longHeadlines = [];\r\n const descriptions = [];\r\n let businessName;\r\n if (originalAssetGroup) {\r\n const { Headlines = {}, LongHeadlines = {}, Descriptions = {} } = assetGroup;\r\n const { Headlines: originalHeadlines = {}, LongHeadlines: originalLongHeadlines = {}, Descriptions: originalDescriptions = {} } = originalAssetGroup;\r\n const originalHeadlinesTexts = Object.values(originalHeadlines);\r\n const originalLongHeadlinesTexts = Object.values(originalLongHeadlines);\r\n const originalDescriptionsTexts = Object.values(originalDescriptions);\r\n Object.values(Headlines).forEach((headline) => {\r\n if (!originalHeadlinesTexts.includes(headline)) {\r\n headlines.push(headline);\r\n }\r\n });\r\n Object.values(LongHeadlines).forEach((longHeadline) => {\r\n if (!originalLongHeadlinesTexts.includes(longHeadline)) {\r\n longHeadlines.push(longHeadline);\r\n }\r\n });\r\n Object.values(Descriptions).forEach((description) => {\r\n if (!originalDescriptionsTexts.includes(description)) {\r\n descriptions.push(description);\r\n }\r\n });\r\n if (assetGroup.BusinessName !== originalAssetGroup.BusinessName) {\r\n businessName = assetGroup.BusinessName;\r\n }\r\n }\r\n return {\r\n headlines: uniq(headlines),\r\n longHeadlines: uniq(longHeadlines),\r\n descriptions: uniq(descriptions),\r\n businessName,\r\n };\r\n};\r\n\r\nconst getNewImageAssetIds = (assetGroup, originalAssetGroup) => {\r\n const assetIds = chain(assetGroup)\r\n .result('Images', [])\r\n .result('ImageList', [])\r\n .flatten()\r\n .map(property('id'))\r\n .map(id => id.toString())\r\n .uniq()\r\n .value();\r\n\r\n const originalAssetIds = chain(originalAssetGroup)\r\n .result('Images', [])\r\n .result('ImageAssets', [])\r\n .map(property('Asset'))\r\n .map(property('Id'))\r\n .map(id => id.toString())\r\n .uniq()\r\n .value();\r\n\r\n return reject(assetIds, assetId => contains(originalAssetIds, assetId));\r\n};\r\n\r\nconst getAppliedTextAssets = (allTextSuggestions, newTextAssets) => {\r\n const appliedTextAssets = [];\r\n appliedTextAssets.push(...allTextSuggestions.descriptions.filter(({ Text }) => newTextAssets.descriptions.includes(Text)));\r\n appliedTextAssets.push(...allTextSuggestions.headlines.filter(({ Text }) => newTextAssets.headlines.includes(Text)));\r\n appliedTextAssets.push(...allTextSuggestions.longHeadlines.filter(({ Text }) => newTextAssets.longHeadlines.includes(Text)));\r\n if (newTextAssets.businessName) {\r\n appliedTextAssets.push(...allTextSuggestions.businessName.filter(({ Text }) => newTextAssets.businessName === Text));\r\n }\r\n return appliedTextAssets\r\n .map(property('SuggestionId'))\r\n .filter(Boolean);\r\n};\r\n\r\nconst getAppliedImageAssets = (selectedImageSuggestions, newImageAssetIds) => filter(selectedImageSuggestions, selectedImage => contains(newImageAssetIds, selectedImage.imageId.toString()));\r\n\r\nconst getRecommendationLog = ({\r\n isEditing,\r\n accountId,\r\n userId,\r\n campaignId,\r\n assetGroupId,\r\n finalUrl,\r\n isFinalUrlFromOfflineRecommendations,\r\n view,\r\n apply,\r\n returned,\r\n appliedImageAssetIds,\r\n}) => {\r\n const logEntry = {\r\n Channel: 'bingadsweb',\r\n Feature: 'Pmax',\r\n Scenario: isEditing ? 'EditWorkFlow' : 'CreationWorkFlow',\r\n TimeStamp: getUtcTime(),\r\n AccountId: accountId,\r\n UserId: userId,\r\n FinalURL: finalUrl,\r\n UrlType: isFinalUrlFromOfflineRecommendations ? 'SuggestedURL' : 'NewURL',\r\n AcceptInfo: {\r\n ReturnedSuggestionIds: (returned && filter(returned, Boolean)) || [],\r\n ViewSuggestionIds: (view && filter(view, Boolean)) || [],\r\n ApplySuggestionIds: (apply && filter(apply, Boolean)) || [],\r\n },\r\n CampaignId: campaignId,\r\n AssetGroupId: assetGroupId,\r\n AppliedImgAssetIds: (appliedImageAssetIds && filter(appliedImageAssetIds, Boolean)) || [],\r\n };\r\n return logEntry;\r\n};\r\n\r\nexport const logRecommendations = ({\r\n recommendationContext, activity,\r\n aid, uid, campaignId, isEditing,\r\n assetGroup, originalAssetGroup,\r\n}) => {\r\n const { Id: assetGroupId } = assetGroup;\r\n if (activity && recommendationContext) {\r\n const newTextAssets = getNewTextAssets(assetGroup, originalAssetGroup);\r\n const newImageAssetIds = getNewImageAssetIds(assetGroup, originalAssetGroup);\r\n const { trackingData } = recommendationContext.tracking;\r\n const { allTextSuggestions, selectedImageSuggestions } = trackingData;\r\n const appliedTextAssets = getAppliedTextAssets(allTextSuggestions, newTextAssets);\r\n const appliedImageAssets = getAppliedImageAssets(selectedImageSuggestions, newImageAssetIds);\r\n\r\n const recommendationLog = getRecommendationLog({\r\n isEditing,\r\n accountId: aid,\r\n userId: uid,\r\n campaignId,\r\n assetGroupId,\r\n ...trackingData,\r\n apply: uniq([\r\n ...trackingData.apply || [],\r\n ...appliedTextAssets,\r\n ...appliedImageAssets.map(property('suggestionId')),\r\n ]),\r\n appliedImageAssetIds: appliedImageAssets.map(property('imageId')),\r\n });\r\n activity.signal(JSON.stringify(recommendationLog));\r\n }\r\n};\r\n","import _ from 'underscore';\r\nimport { useEffect, useContext, useState, useCallback, useRef } from 'react';\r\n\r\nimport { createAsyncToken } from '@bingads-webui-universal/primitive-utilities';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { useLogRecommendationsApiError } from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nimport { RecommendationContext } from './recommendation-context';\r\nimport { getOnlineBusinessNameRecommendations, getOnlineTextRecommendations, getOfflineRecommendations, convertOnlineTextRecommendationToOfflineFormat, getSuggestionIdsFromOfflineRecommendations, getEmptyRecommendationsContext, getOnlineNativeAndSearchTextRecommendations } from './utils';\r\nimport { useImageRecommendations } from './use-image-recommendations';\r\nimport { useCopilotRecommendations } from './use-copilot-recommendations';\r\n\r\nexport function useRecommendations({\r\n cid,\r\n aid,\r\n campaignId,\r\n finalUrl,\r\n permissions,\r\n instrumentation,\r\n isSignup = false,\r\n isDisplayPlus = false,\r\n isMMA = false,\r\n enableCopilotRecommendations = true,\r\n skipBusinessNameRecommendation = false,\r\n}) {\r\n const activity = useContext(ActivityContext);\r\n const logRecommendationsAPIError = useLogRecommendationsApiError(activity);\r\n const [, setRecommendationContext, reportRecommendations] = useContext(RecommendationContext);\r\n const [offlineRecommendations, setOfflineRecommendations] = useState(null);\r\n const [isOfflineRecommendationsFetched, setIsOfflineRecommendationsFetched] = useState(false);\r\n\r\n const {\r\n suggestionPoller,\r\n initImageRecommendationForUrl,\r\n setOfflineImageRecommendations,\r\n } = useImageRecommendations({\r\n cid,\r\n aid,\r\n campaignId,\r\n permissions,\r\n instrumentation,\r\n enableCopilotRecommendations,\r\n });\r\n\r\n const resetRecommendations = useCallback((newFinalUrl, recommendationSource) => {\r\n setRecommendationContext(getEmptyRecommendationsContext(newFinalUrl, recommendationSource));\r\n }, [setRecommendationContext]);\r\n\r\n const {\r\n handleCopilotBannerFetch,\r\n handleCopilotBannerFetchSucceeded,\r\n handleCopilotBannerFetchFailed,\r\n } = useCopilotRecommendations({\r\n resetRecommendations,\r\n isSignup,\r\n isDisplayPlus,\r\n isMMA,\r\n });\r\n\r\n const fetchOnlineTextRecommendationsAsyncToken = useRef(null);\r\n const fetchOnlineBusinessNameRecommendationsAsyncToken = useRef(null);\r\n\r\n const cancelFetchTextAndBusinessNameOnlineRecommendations = useCallback(() => {\r\n if (fetchOnlineTextRecommendationsAsyncToken.current) {\r\n fetchOnlineTextRecommendationsAsyncToken.current.cancel();\r\n fetchOnlineTextRecommendationsAsyncToken.current = null;\r\n }\r\n\r\n if (fetchOnlineBusinessNameRecommendationsAsyncToken.current) {\r\n fetchOnlineBusinessNameRecommendationsAsyncToken.current.cancel();\r\n fetchOnlineBusinessNameRecommendationsAsyncToken.current = null;\r\n }\r\n }, []);\r\n\r\n const fetchTextAndBusinessNameOnlineRecommendations = useCallback((currentFinalUrl) => {\r\n cancelFetchTextAndBusinessNameOnlineRecommendations();\r\n\r\n if (enableCopilotRecommendations && !skipBusinessNameRecommendation) {\r\n fetchOnlineBusinessNameRecommendationsAsyncToken.current = createAsyncToken(getOnlineBusinessNameRecommendations({\r\n cid, aid, campaignId, finalUrl: currentFinalUrl,\r\n })).on({\r\n onSuccess: (businessNameRecommendation) => {\r\n if (businessNameRecommendation.BusinessName) {\r\n setRecommendationContext({\r\n businessName: { Text: businessNameRecommendation.BusinessName, SuggestionId: null },\r\n });\r\n }\r\n },\r\n onError: logRecommendationsAPIError,\r\n });\r\n }\r\n\r\n // fetch online text recommendations\r\n if (!enableCopilotRecommendations) {\r\n if (isDisplayPlus) {\r\n fetchOnlineTextRecommendationsAsyncToken.current = createAsyncToken(getOnlineNativeAndSearchTextRecommendations({\r\n cid, aid, campaignId, finalUrl: currentFinalUrl,\r\n }));\r\n } else {\r\n fetchOnlineTextRecommendationsAsyncToken.current = createAsyncToken(getOnlineTextRecommendations({\r\n cid, aid, campaignId, finalUrl: currentFinalUrl,\r\n }));\r\n }\r\n fetchOnlineTextRecommendationsAsyncToken.current.on({\r\n onSuccess: (textRecommendations) => {\r\n const convertedRecommendations = convertOnlineTextRecommendationToOfflineFormat(textRecommendations.value);\r\n setRecommendationContext({\r\n headlines: convertedRecommendations.headlines,\r\n longHeadlines: convertedRecommendations.longHeadlines,\r\n descriptions: convertedRecommendations.descriptions,\r\n });\r\n const recommendationsToLog = [\r\n ...convertedRecommendations.headlines,\r\n ...convertedRecommendations.longHeadlines,\r\n ...convertedRecommendations.descriptions,\r\n ];\r\n reportRecommendations({\r\n returned: _.pluck(recommendationsToLog, 'SuggestionId'),\r\n });\r\n },\r\n onError: logRecommendationsAPIError,\r\n });\r\n }\r\n }, [enableCopilotRecommendations, cancelFetchTextAndBusinessNameOnlineRecommendations, cid, aid, campaignId, reportRecommendations, setRecommendationContext, logRecommendationsAPIError, isDisplayPlus]);\r\n\r\n const getOfflineRecommendationsForUrl = useCallback((currentFinalUrl) => {\r\n if (!offlineRecommendations) {\r\n return null;\r\n }\r\n\r\n const recommendationForFinalUrl = _.find(offlineRecommendations, recommendation => recommendation.FinalUrl === currentFinalUrl);\r\n return (recommendationForFinalUrl && recommendationForFinalUrl.AssetSuggestions && recommendationForFinalUrl.AssetSuggestions[0]);\r\n }, [offlineRecommendations]);\r\n\r\n const populateTextAndBusinessNameOfflineRecommendations = useCallback((offlineRecommendationsForUrl) => {\r\n if (enableCopilotRecommendations) {\r\n setRecommendationContext({\r\n businessName: offlineRecommendationsForUrl.BusinessName && offlineRecommendationsForUrl.BusinessName.Text,\r\n });\r\n } else {\r\n setRecommendationContext({\r\n headlines: offlineRecommendationsForUrl.Headlines,\r\n longHeadlines: offlineRecommendationsForUrl.LongHeadlines,\r\n descriptions: offlineRecommendationsForUrl.Descriptions,\r\n businessName: offlineRecommendationsForUrl.BusinessName && offlineRecommendationsForUrl.BusinessName.Text,\r\n });\r\n }\r\n }, [enableCopilotRecommendations, setRecommendationContext]);\r\n\r\n const determineRecommendationSource = useCallback((offlineRecommendationsFetched, offlineRecommendationForUrlExist) => {\r\n if (enableCopilotRecommendations) {\r\n return 'copilot';\r\n }\r\n if (offlineRecommendationsFetched) {\r\n return offlineRecommendationForUrlExist ? 'offline' : 'online';\r\n }\r\n return 'undetermined';\r\n }, [enableCopilotRecommendations]);\r\n\r\n // Fetch offline recommendations on mount\r\n useEffect(() => {\r\n if (!cid || !aid) {\r\n return;\r\n }\r\n getOfflineRecommendations({\r\n cid,\r\n aid,\r\n }).then((recommendations) => {\r\n setOfflineRecommendations(recommendations.value);\r\n if (!_.isNull(recommendations.value)) {\r\n const finalUrls = _.pluck(recommendations.value, 'FinalUrl');\r\n setRecommendationContext({\r\n finalUrls,\r\n });\r\n }\r\n }).catch(logRecommendationsAPIError)\r\n .finally(() => {\r\n setIsOfflineRecommendationsFetched(true);\r\n });\r\n }, [cid, aid, setRecommendationContext, logRecommendationsAPIError]);\r\n\r\n // Initialize image recommendation and trigger online image suggestion every finalUrl change.\r\n // Online recommendation is used by website images\r\n // We should always invoke it on URL change to be able to populate asset library -> website images panel\r\n useEffect(() => {\r\n if (!cid || !aid || !campaignId) {\r\n return;\r\n }\r\n initImageRecommendationForUrl(finalUrl);\r\n }, [aid, campaignId, cid, finalUrl, initImageRecommendationForUrl]);\r\n\r\n // Triggered on finalUrl change OR isOfflineRecommendationsFetched: Processes conditions and determine triggering of text,\r\n // business name and/or image recommendations\r\n useEffect(() => {\r\n cancelFetchTextAndBusinessNameOnlineRecommendations();\r\n\r\n const offlineRecommendationsForFinalUrl = getOfflineRecommendationsForUrl(finalUrl);\r\n const recommendationSource = determineRecommendationSource(isOfflineRecommendationsFetched, offlineRecommendationsForFinalUrl);\r\n if (!enableCopilotRecommendations) {\r\n resetRecommendations(finalUrl, recommendationSource);\r\n } // useCopilotRecommendations will reset recommendation context for copilot recommendations\r\n\r\n // We need to wait for offline recommendation to be fetched to determine if we should populate online or offline recommendation\r\n if (!_.isEmpty(finalUrl) && (isOfflineRecommendationsFetched)) {\r\n if (offlineRecommendationsForFinalUrl) {\r\n populateTextAndBusinessNameOfflineRecommendations(offlineRecommendationsForFinalUrl);\r\n if (!enableCopilotRecommendations) {\r\n setOfflineImageRecommendations(offlineRecommendationsForFinalUrl);\r\n reportRecommendations({ returned: getSuggestionIdsFromOfflineRecommendations(offlineRecommendationsForFinalUrl) });\r\n }\r\n // TODO: tailered report when copilot recommendations is on\r\n } else if (cid && aid) {\r\n fetchTextAndBusinessNameOnlineRecommendations(finalUrl);\r\n }\r\n }\r\n }, [\r\n aid,\r\n cid,\r\n enableCopilotRecommendations,\r\n fetchTextAndBusinessNameOnlineRecommendations,\r\n getOfflineRecommendationsForUrl,\r\n resetRecommendations,\r\n cancelFetchTextAndBusinessNameOnlineRecommendations,\r\n populateTextAndBusinessNameOfflineRecommendations,\r\n setOfflineImageRecommendations,\r\n determineRecommendationSource,\r\n reportRecommendations,\r\n isOfflineRecommendationsFetched,\r\n finalUrl,\r\n ]);\r\n\r\n return {\r\n handleCopilotBannerFetch,\r\n handleCopilotBannerFetchSucceeded,\r\n handleCopilotBannerFetchFailed,\r\n suggestionPoller,\r\n };\r\n}\r\n","import { map, debounce, isEmpty, pluck } from 'underscore';\r\nimport { useCallback, useMemo, useContext, useRef, useEffect, useState } from 'react';\r\n\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { getAdCreatorInstrumentation, instrumentationScenarios } from '@bingads-webui-campaign/ad-creator-tools-instrumentation';\r\nimport { SuggestionPoller, SuggestionStatus, mapSuggestionResponseToState, hasMoreImagesToFetch } from '@bingads-webui-campaign/media-repository';\r\nimport { constants } from '@bingads-webui-campaign-react/image-experience';\r\n\r\nimport { getODataConfig } from './utils';\r\nimport { RecommendationContext } from './recommendation-context';\r\n\r\nexport function useImageRecommendations({\r\n cid,\r\n aid,\r\n campaignId,\r\n permissions,\r\n instrumentation,\r\n enableCopilotRecommendations = true,\r\n}) {\r\n const serverContext = useContext(ServerContext);\r\n const [recommendationContext, setRecommendationContext, reportRecommendations] = useContext(RecommendationContext);\r\n\r\n const oDataConfig = useMemo(() => getODataConfig(serverContext), [serverContext]);\r\n\r\n // states keeping online/offline call status and responses\r\n const [onlineSuggestionStatus, setOnlineSuggestionStatus] = useState(SuggestionStatus.FetchSucceed);\r\n const [onlineRecommendationResponse, setOnlineRecommendationResponse] = useState(null);\r\n const [offlineRecommendationResponse, setOfflineRecommendationResponse] = useState(null);\r\n\r\n // states keeping current state of each component:\r\n // websiteImagesState - holds the state provided to image-experience to manage asset-library website images\r\n // carouselState - holds the state managing suggestion carousel. Can show online or offline recommendations\r\n // panelSate - hold the state managing recommended images panel. This pannel is accessible only from the carousel.\r\n const [websiteImagesState, setWebsiteImagesState] = useState(null);\r\n const [carouselState, setCarouselState] = useState(null);\r\n const [panelState, setPanelState] = useState(null);\r\n\r\n // refs keeping state needed for online recommendations pagination\r\n const pageNumber = useRef(1);\r\n const onlineHasMore = useRef(false);\r\n const currentFinalUrl = useRef(null);\r\n const getMoreImageSuggestionsRef = useRef(null);\r\n\r\n const minimumSize = useMemo(() => constants.getMinimumSizeForImage(), []);\r\n\r\n const onPollingSuggestionCompleted = useCallback((response, isSubdomainScraping) => {\r\n const suggestionStatus = response.error ? SuggestionStatus.ServerError : SuggestionStatus.FetchSucceed;\r\n setOnlineSuggestionStatus(suggestionStatus);\r\n setOnlineRecommendationResponse(response);\r\n setWebsiteImagesState(mapSuggestionResponseToState(suggestionStatus, response, isSubdomainScraping));\r\n }, []);\r\n\r\n const suggestionPoller = useMemo(() => new SuggestionPoller({\r\n cid,\r\n aid,\r\n cmpId: campaignId,\r\n oDataConfig,\r\n jobCompleteCallback: onPollingSuggestionCompleted,\r\n logger: getAdCreatorInstrumentation(instrumentation, instrumentationScenarios.MSAN, permissions).websiteSuggestionActivity, // eslint-disable-line max-len\r\n }), [aid, cid, campaignId, instrumentation, oDataConfig, onPollingSuggestionCompleted, permissions]);\r\n\r\n const getPanelImagesFromResponse = useCallback(response => map(response && response.Images, ({ ImageUrl, ThumbnailUrl, SuggestionId }) => ({\r\n fullUrl: ImageUrl,\r\n thumbnailSrc: ImageUrl || ThumbnailUrl,\r\n thumbnailUrl: ImageUrl || ThumbnailUrl,\r\n suggestionId: SuggestionId,\r\n })), []);\r\n\r\n // This is called by recommended image panel when showing online recommendations. Website images panel will call suggestionPoller directly\r\n // to grab additional images if needed.\r\n const getMoreImageSuggestions = useCallback(() => {\r\n if (onlineHasMore.current) {\r\n pageNumber.current += 1;\r\n suggestionPoller.getMoreLandingPageSuggestions({\r\n landingPageUrl: currentFinalUrl.current,\r\n pageNumber: pageNumber.current,\r\n minimumResolution: {\r\n width: minimumSize[0],\r\n height: minimumSize[1],\r\n },\r\n }).then((response) => {\r\n setPanelState({\r\n panelImages: [...panelState.panelImages, ...getPanelImagesFromResponse(response)],\r\n hasMore: hasMoreImagesToFetch(response),\r\n getMoreImageSuggestions: getMoreImageSuggestionsRef.current,\r\n });\r\n });\r\n }\r\n }, [getPanelImagesFromResponse, minimumSize, suggestionPoller, panelState]);\r\n\r\n // Regardless if online/offline recommendation, this should always be triggerd on URL change for website images.\r\n // We migtht use the response of the request initiated here if we wont have offline recommendations for this url.\r\n const getImageSuggestions = useCallback(debounce((url) => {\r\n suggestionPoller.cancel();\r\n setOnlineSuggestionStatus(SuggestionStatus.FetchInProgress);\r\n setWebsiteImagesState(mapSuggestionResponseToState(SuggestionStatus.FetchInProgress));\r\n currentFinalUrl.current = url;\r\n pageNumber.current = 1;\r\n onlineHasMore.current = false;\r\n suggestionPoller.getLandingPageSuggestions({\r\n landingPageUrl: url,\r\n enableOfflinePollingDelay: true,\r\n minimumResolution: {\r\n width: minimumSize[0],\r\n height: minimumSize[1],\r\n },\r\n });\r\n }, 2000), [suggestionPoller, minimumSize]);\r\n\r\n const cancelGetImageSuggestions = useCallback(() => {\r\n getImageSuggestions.cancel();\r\n suggestionPoller.cancel();\r\n setOnlineSuggestionStatus(SuggestionStatus.FetchSucceed);\r\n setOnlineRecommendationResponse(null);\r\n setWebsiteImagesState(mapSuggestionResponseToState(SuggestionStatus.FetchSucceed));\r\n }, [getImageSuggestions, suggestionPoller]);\r\n\r\n // Main starting point for image recommendation:\r\n // Initialize all states and cached responses. Trigger online request for website images.\r\n const initImageRecommendationForUrl = useCallback((url) => {\r\n cancelGetImageSuggestions();\r\n setOnlineSuggestionStatus(SuggestionStatus.FetchSucceed);\r\n setOnlineRecommendationResponse(null);\r\n setOfflineRecommendationResponse(null);\r\n setWebsiteImagesState(mapSuggestionResponseToState(SuggestionStatus.FetchSucceed));\r\n setCarouselState(null);\r\n setPanelState(null);\r\n if (!isEmpty(url)) {\r\n getImageSuggestions(url);\r\n }\r\n }, [cancelGetImageSuggestions, getImageSuggestions]);\r\n\r\n getMoreImageSuggestionsRef.current = getMoreImageSuggestions;\r\n\r\n const setOfflineImageRecommendations = useCallback((offlineAssetsSuggestions) => {\r\n setOfflineRecommendationResponse(offlineAssetsSuggestions);\r\n }, []);\r\n\r\n const updateImageRecommendations = useCallback(() => {\r\n if (enableCopilotRecommendations) {\r\n // We only pick website images here if copilot recommendations is enabled, and\r\n // images for carousel and panel are picked from copilot recommendations response.\r\n setRecommendationContext({\r\n images: {\r\n websiteImagesState,\r\n },\r\n });\r\n } else {\r\n const returnedImages = (panelState && panelState.panelImages) || [];\r\n reportRecommendations({ returned: pluck(returnedImages, 'suggestionId') });\r\n\r\n setRecommendationContext({\r\n images: {\r\n websiteImagesState,\r\n carouselState,\r\n panelState,\r\n },\r\n });\r\n }\r\n }, [enableCopilotRecommendations, setRecommendationContext, reportRecommendations, websiteImagesState, carouselState, panelState]);\r\n\r\n // Update carousel and panel state by online or offline recommendation update\r\n useEffect(() => {\r\n if (!enableCopilotRecommendations) {\r\n if (recommendationContext.recommendationSource === 'undetermined') {\r\n // Undetermined means we are waiting for offline recommendation to be fetched or recommendation phase2 pilot is off. set SuggestionStatus.FetchSucceed to show nothing.\r\n setCarouselState(mapSuggestionResponseToState(SuggestionStatus.FetchSucceed));\r\n } else if (recommendationContext.recommendationSource === 'offline' && offlineRecommendationResponse) {\r\n setCarouselState(mapSuggestionResponseToState(SuggestionStatus.FetchSucceed, offlineRecommendationResponse));\r\n setPanelState({\r\n panelImages: getPanelImagesFromResponse(offlineRecommendationResponse),\r\n hasMore: false,\r\n getMoreImageSuggestions: () => {},\r\n });\r\n } else if (recommendationContext.recommendationSource === 'online') {\r\n setCarouselState(mapSuggestionResponseToState(onlineSuggestionStatus, onlineRecommendationResponse));\r\n // if page number > 1 then online response is subsequent pages and state has been update by getMoreImageSuggestions\r\n if (pageNumber.current === 1) {\r\n setPanelState({\r\n panelImages: getPanelImagesFromResponse(onlineRecommendationResponse),\r\n hasMore: onlineHasMore.current,\r\n getMoreImageSuggestions: getMoreImageSuggestionsRef.current,\r\n });\r\n }\r\n }\r\n }\r\n }, [enableCopilotRecommendations, offlineRecommendationResponse, onlineRecommendationResponse, recommendationContext.recommendationSource, onlineSuggestionStatus, getPanelImagesFromResponse]);\r\n\r\n // Update recommendation context when websiteImages, carousel or panel state changes\r\n useEffect(() => {\r\n updateImageRecommendations();\r\n }, [websiteImagesState, carouselState, panelState, updateImageRecommendations]);\r\n\r\n return {\r\n suggestionPoller,\r\n initImageRecommendationForUrl,\r\n setOfflineImageRecommendations,\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport { useCallback, useContext } from 'react';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport {\r\n getFormattedThemeForApplying,\r\n getFormattedImage,\r\n useEventLog,\r\n useLogRecommendationsApiError,\r\n} from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nimport { RecommendationContext } from './recommendation-context';\r\nimport { getFeatureForAssetEvent } from './utils';\r\n\r\nexport function useCopilotRecommendations({\r\n resetRecommendations,\r\n isSignup,\r\n isDisplayPlus,\r\n isMMA,\r\n}) {\r\n const activity = useContext(ActivityContext);\r\n const logRecommendationsAPIError = useLogRecommendationsApiError(activity);\r\n\r\n const [recommendationContext, setRecommendationContext] = useContext(RecommendationContext);\r\n const { postAssetEventLog, copilotTracking } = recommendationContext;\r\n\r\n const feature = getFeatureForAssetEvent({ isSignup, isDisplayPlus, isMMA });\r\n\r\n const { logBannerGenerated } = useEventLog(_.isFunction(postAssetEventLog) ? postAssetEventLog : _.noop);\r\n\r\n const handleCopilotBannerFetch = useCallback((url) => {\r\n resetRecommendations(url, 'copilot');\r\n }, [resetRecommendations]);\r\n\r\n const handleCopilotBannerFetchSucceeded = useCallback((url, assetsResponse) => {\r\n logBannerGenerated(url, assetsResponse);\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets(assetsResponse.RecommendedAssets);\r\n }\r\n\r\n const {\r\n RecommendedAssets: {\r\n Themes,\r\n ShortHeadlines = [],\r\n LongHeadlines = [],\r\n Descriptions = [],\r\n ImageAssets = [],\r\n },\r\n Logo,\r\n Cta,\r\n IsCustomerIdInExclusionList,\r\n } = assetsResponse;\r\n\r\n const delta = {\r\n themes: _.map(Themes, getFormattedThemeForApplying),\r\n headlines: ShortHeadlines,\r\n longHeadlines: LongHeadlines,\r\n descriptions: Descriptions,\r\n imageAssets: _.map(ImageAssets, getFormattedImage),\r\n logo: Logo,\r\n cta: Cta,\r\n isCustomerIdInExclusionList: IsCustomerIdInExclusionList,\r\n };\r\n\r\n const counts = {\r\n feature,\r\n url,\r\n ..._.mapObject(delta, value => _.size(value)),\r\n };\r\n activity.trace(`handleCopilotBannerFetchSucceeded: counts=${JSON.stringify(counts)}`);\r\n\r\n setRecommendationContext(delta);\r\n }, [activity, copilotTracking, feature, logBannerGenerated, setRecommendationContext]);\r\n\r\n const handleCopilotBannerFetchFailed = logRecommendationsAPIError;\r\n\r\n return {\r\n handleCopilotBannerFetch,\r\n handleCopilotBannerFetchSucceeded,\r\n handleCopilotBannerFetchFailed,\r\n };\r\n}\r\n","import React, { useCallback, useMemo, useRef } from 'react';\r\nimport { isEmpty, debounce } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nexport function withFinalUrlRecommendationUpdate(WrappedFinalUrlComponent) {\r\n const HOC = (props) => {\r\n const {\r\n updateValidation,\r\n enableCopilotRecommendations,\r\n enableSpecialCharactersValidation,\r\n } = props;\r\n\r\n const currentValidation = useRef();\r\n\r\n const debouncedSetFinalUrl = useMemo(() => debounce((finalUrl) => {\r\n updateValidation(\r\n currentValidation.current.messages,\r\n { ...currentValidation.current.data, FinalUrlForRecommendation: finalUrl },\r\n currentValidation.current.dirtied\r\n );\r\n }, 500), [updateValidation]);\r\n\r\n const updateValidationInternal = useCallback((messages, data, dirtied) => {\r\n currentValidation.current = { messages, data, dirtied };\r\n\r\n const finalUrl = data && data.FinalUrls && data.FinalUrls[0];\r\n\r\n if (enableCopilotRecommendations) {\r\n // No debounce for copilot recommendations since it'll refresh recommendations when lose focus, otherwise the data might not have been set when lose focus\r\n updateValidation(\r\n messages,\r\n { ...data, FinalUrlForRecommendation: isEmpty(messages) && finalUrl },\r\n dirtied\r\n );\r\n } else {\r\n debouncedSetFinalUrl.cancel();\r\n debouncedSetFinalUrl(isEmpty(messages) && finalUrl);\r\n updateValidation(messages, data, dirtied);\r\n }\r\n }, [debouncedSetFinalUrl, enableCopilotRecommendations, updateValidation]);\r\n\r\n return (\r\n <WrappedFinalUrlComponent\r\n {...props}\r\n updateValidation={updateValidationInternal}\r\n enableSpecialCharactersValidation={enableSpecialCharactersValidation}\r\n />\r\n );\r\n };\r\n\r\n HOC.propTypes = {\r\n updateValidation: PropTypes.func.isRequired,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n enableSpecialCharactersValidation: PropTypes.bool,\r\n };\r\n\r\n HOC.defaultProps = {\r\n enableCopilotRecommendations: true,\r\n enableSpecialCharactersValidation: false,\r\n };\r\n\r\n HOC.displayName = `withFinalUrlRecommendationUpdate(${getDisplayName(WrappedFinalUrlComponent)})`;\r\n hoistNonReactStatics(HOC, WrappedFinalUrlComponent);\r\n\r\n return HOC;\r\n}\r\n","import React from 'react';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nexport const PerformanceMarkerContext = React.createContext(null);\r\n\r\nexport const withPerformanceMarker = Component =>\r\n hoistNonReactStatics(class extends React.PureComponent {\r\n static displayName = `withPerformanceMarker(${getDisplayName(Component)})`;\r\n\r\n render() {\r\n return (\r\n <PerformanceMarkerContext.Consumer>\r\n {context => <Component perfMarker={context} {...this.props} />}\r\n </PerformanceMarkerContext.Consumer>\r\n );\r\n }\r\n }, Component);\r\n","import { useContext, useMemo, useEffect, useLayoutEffect } from 'react';\r\n\r\nimport { PerformanceMarkerContext } from './perf-marker-context';\r\n\r\nexport const useCreateChildPerfMarker = (\r\n name,\r\n {\r\n immediateInit = true,\r\n autoEnd = true,\r\n } = {}\r\n) => {\r\n const perfMarkerParent = useContext(PerformanceMarkerContext);\r\n const perfMarkerChild = useMemo(\r\n () => {\r\n const child = perfMarkerParent.createChild(name, { autoEnd });\r\n if (immediateInit) child.willInit();\r\n return child;\r\n },\r\n [immediateInit, name, perfMarkerParent]\r\n );\r\n return perfMarkerChild;\r\n};\r\n\r\nexport const useUpdateChildPerfMarker = (perfMarkerChild, isLoading) => {\r\n // Every time the hook renders, call \"willRender\", so don't memoize this hook.\r\n perfMarkerChild.willRender();\r\n\r\n useEffect(() => {\r\n if (isLoading) {\r\n perfMarkerChild.willFetchData();\r\n }\r\n }, [isLoading, perfMarkerChild]);\r\n\r\n useLayoutEffect(() => {\r\n if (!isLoading) {\r\n // done after DOM has completed updating (via useLayoutEffect) and isLoading is false\r\n perfMarkerChild.done();\r\n }\r\n }, [isLoading, perfMarkerChild]);\r\n\r\n return perfMarkerChild;\r\n};\r\n\r\n// Hook for isLoading with three states: undefined, true, false\r\nexport const useUpdateChildPerfMarkerWithThreeStatesIsLoading = (perfMarkerChild, isLoading) => {\r\n // Every time the hook renders, call \"willRender\", so don't memoize this hook.\r\n perfMarkerChild.willRender();\r\n\r\n useEffect(() => {\r\n if (isLoading === true) {\r\n perfMarkerChild.willFetchData();\r\n }\r\n }, [isLoading, perfMarkerChild]);\r\n\r\n useLayoutEffect(() => {\r\n if (isLoading === false) {\r\n // done after DOM has completed updating (via useLayoutEffect) and isLoading is false\r\n perfMarkerChild.done();\r\n }\r\n }, [isLoading, perfMarkerChild]);\r\n\r\n return perfMarkerChild;\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useContext, useMemo, useLayoutEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { PerfMarkerFactory } from '@bingads-webui/performance-marker';\r\n\r\nimport { PerformanceMarkerContext } from './perf-marker-context';\r\n\r\nexport const PerformanceMarkerProvider = (props) => {\r\n const perfMarker =\r\n useMemo(\r\n () => {\r\n PerfMarkerFactory.init(props.instrumentation);\r\n const appPerfMarker = PerfMarkerFactory.createMarker(props.name);\r\n appPerfMarker.willInit();\r\n appPerfMarker.doneCallback = props.doneCallback;\r\n return appPerfMarker;\r\n },\r\n [props.doneCallback, props.instrumentation, props.name]\r\n );\r\n\r\n useLayoutEffect(() => {\r\n if (props.immediateDone && perfMarker) {\r\n perfMarker.done();\r\n }\r\n }, [perfMarker, props.immediateDone]);\r\n\r\n perfMarker.willRender();\r\n\r\n return (\r\n <PerformanceMarkerContext.Provider value={perfMarker}>\r\n {props.children}\r\n </PerformanceMarkerContext.Provider>\r\n );\r\n};\r\n\r\nPerformanceMarkerProvider.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n name: PropTypes.string.isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n immediateDone: PropTypes.bool,\r\n doneCallback: PropTypes.func,\r\n};\r\n\r\nPerformanceMarkerProvider.defaultProps = {\r\n immediateDone: true,\r\n doneCallback: _.noop,\r\n};\r\n\r\nexport const PerformanceMarkerChildProvider = (props) => {\r\n const perfMarkerParent = useContext(PerformanceMarkerContext);\r\n const perfMarkerChild = useMemo(\r\n () => {\r\n const child = perfMarkerParent.createChild(props.name, { autoEnd: true });\r\n child.willInit();\r\n return child;\r\n },\r\n [perfMarkerParent, props.name]\r\n );\r\n\r\n perfMarkerChild.willRender();\r\n\r\n return (\r\n <PerformanceMarkerContext.Provider value={perfMarkerChild}>\r\n {props.children}\r\n </PerformanceMarkerContext.Provider>\r\n );\r\n};\r\n\r\nPerformanceMarkerChildProvider.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n name: PropTypes.string.isRequired,\r\n};\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { IconButton } from '@bingads-webui-react/fabric-control';\r\n\r\n\r\nexport const PlayPauseButtons = React.memo(({\r\n newI18n, pause, play, isPlaying, customizedClassName,\r\n}) => (\r\n <div className={classNames('carousel-injected-controls', 'hidden', customizedClassName)}>\r\n {isPlaying ? <IconButton\r\n iconProps={{ iconName: 'Pause' }}\r\n ariaLabel={newI18n.getString(_TL_('Pause the slideshow'))}\r\n onClick={pause}\r\n /> : <IconButton\r\n iconProps={{ iconName: 'Play' }}\r\n ariaLabel={newI18n.getString(_TL_('Start the slideshow'))}\r\n onClick={play}\r\n />}\r\n </div>\r\n));\r\n\r\n\r\nexport const isPlayPausePreviewImageEnabled = permissions => _.chain(permissions).result('dynamic').result('PlayPausePreviewImage').value();\r\n\r\n\r\nPlayPauseButtons.propTypes = {\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n pause: PropTypes.func,\r\n play: PropTypes.func,\r\n isPlaying: PropTypes.bool,\r\n customizedClassName: PropTypes.string,\r\n};\r\n\r\nPlayPauseButtons.defaultProps = {\r\n customizedClassName: undefined,\r\n newI18n: {\r\n getString: () => {},\r\n },\r\n pause: () => {},\r\n play: () => {},\r\n isPlaying: false,\r\n};\r\n","import { floatButtonStyle, imageExperienceContentStyle, editImageCommonStyle, extensionEditorStyles } from '@bingads-webui-campaign-react/common-styles';\r\n\r\nconst pmaxImageExperienceContentStyle = (palette = {}, iconFontFamily = 'MsAds MDL2 Assets') => ({\r\n '& .image-experience-content': {\r\n marginBottom: 10,\r\n minWidth: 669,\r\n\r\n '& .image-list-view-content .image-list': {\r\n position: 'relative',\r\n marginBottom: 0,\r\n\r\n '& .image-list-content': {\r\n width: '100%',\r\n overflowX: 'auto',\r\n\r\n '&:after': {\r\n content: '\"\"',\r\n display: 'inline-flex',\r\n flexBasis: 28,\r\n flexShrink: 0,\r\n },\r\n\r\n '& .ms-ChoiceField-wrapper': {\r\n padding: 1.5,\r\n '&:after': {\r\n inset: 0,\r\n },\r\n },\r\n\r\n '& .image-list-item .image-list-item-image, & .image-list-item .image-list-item-video': {\r\n '&:hover': {\r\n '& .glyphicon.glyphicon-remove.image-delete': {\r\n opacity: 0.75,\r\n\r\n '&:hover': {\r\n opacity: 1,\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-pencil.image-edit': {\r\n opacity: 0.75,\r\n\r\n '&:hover': {\r\n opacity: 1,\r\n },\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-remove.image-delete': {\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontFamily: iconFontFamily,\r\n lineHeight: 1,\r\n fontSize: 16,\r\n margin: 0,\r\n padding: 8,\r\n position: 'absolute',\r\n left: 'auto',\r\n top: 'auto',\r\n right: 2,\r\n bottom: 2,\r\n borderRadius: '50%',\r\n marginBottom: 8,\r\n marginRight: 20,\r\n opacity: 0,\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n\r\n '&:hover, &:focus': {\r\n opacity: 1,\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-pencil.image-edit': {\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontFamily: iconFontFamily,\r\n lineHeight: 1,\r\n fontSize: 16,\r\n border: 'none',\r\n position: 'absolute',\r\n left: 2,\r\n top: 'auto',\r\n right: 'auto',\r\n bottom: 2,\r\n borderRadius: '50%',\r\n marginLeft: 20,\r\n marginBottom: 8,\r\n height: 32,\r\n width: 32,\r\n padding: 0,\r\n opacity: 0,\r\n\r\n '&:before': {\r\n content: '\"\\\\E70F\"',\r\n },\r\n\r\n '&:hover, &:focus': {\r\n opacity: 1,\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-plus.image-add': {\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontFamily: iconFontFamily,\r\n lineHeight: 1,\r\n fontSize: 16,\r\n border: 'none',\r\n position: 'absolute',\r\n height: 24,\r\n width: 32,\r\n left: 2,\r\n top: 'auto',\r\n right: 'auto',\r\n bottom: 2,\r\n background: 'transparent',\r\n marginLeft: 40,\r\n marginBottom: 32,\r\n padding: 0,\r\n opacity: 0.75,\r\n\r\n '&:before': {\r\n content: '\"\\\\E710\"',\r\n marginRight: 4,\r\n marginLeft: 4,\r\n },\r\n\r\n '&:hover': {\r\n opacity: 1,\r\n background: 'transparent',\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-pencil.image-edit.is-recommended-image': {\r\n opacity: 0.5,\r\n },\r\n\r\n '& .image-edit + .glyphicon.glyphicon-remove.image-delete': {\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontFamily: iconFontFamily,\r\n lineHeight: 1,\r\n fontSize: 16,\r\n border: 'none',\r\n position: 'absolute',\r\n left: 'auto',\r\n top: 'auto',\r\n right: 2,\r\n bottom: 2,\r\n backgroundColor: `${palette.white}d4`,\r\n borderRadius: '50%',\r\n marginRight: 20,\r\n marginBottom: 8,\r\n height: 32,\r\n width: 32,\r\n padding: 0,\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n\r\n '&:hover': {\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .image-list-item .image-list-item-image.with-copilot-option': {\r\n '&:hover': {\r\n '& .image-list-item-action-bar': {\r\n opacity: 1,\r\n },\r\n },\r\n '& .image-list-item-action-bar': {\r\n '&.open': {\r\n opacity: 1,\r\n },\r\n display: 'flex',\r\n backgroundColor: palette.white,\r\n borderRadius: 8,\r\n opacity: 0,\r\n position: 'absolute',\r\n bottom: 6,\r\n marginLeft: 6,\r\n padding: [0, 8, 0, 4],\r\n overflow: 'hidden',\r\n\r\n '& button': {\r\n minWidth: 24,\r\n margin: [6, 0, 6, 4],\r\n width: 24,\r\n height: 24,\r\n padding: 0,\r\n border: 'none',\r\n backgroundColor: palette.white,\r\n '& img': {\r\n width: 24,\r\n height: 24,\r\n },\r\n '& .active': {\r\n display: 'none',\r\n backgroundColor: palette.themeDarkAlt,\r\n },\r\n '& .passive': {\r\n display: 'inline-block',\r\n backgroundColor: palette.white,\r\n },\r\n '&:hover, &:focus': {\r\n '& .active': {\r\n display: 'inline-block',\r\n },\r\n '& .passive': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n '& .action-divider': {\r\n margin: [6, 0, 6, 4],\r\n width: 1,\r\n height: 24,\r\n display: 'inline-block',\r\n borderLeft: `1px solid ${palette.neutralQuaternaryAlt}`,\r\n },\r\n '& .glyphicon.glyphicon-remove.image-delete': {\r\n position: 'static',\r\n margin: [6, 0, 6, 4],\r\n width: 24,\r\n height: 24,\r\n extend: floatButtonStyle({ palette }).floatButton,\r\n fontSize: 16,\r\n color: palette.neutralPrimary,\r\n backgroundColor: palette.white,\r\n padding: 0,\r\n borderRadius: 'unset',\r\n opacity: 1,\r\n\r\n '&:before': {\r\n content: '\"\\\\E74D\"',\r\n },\r\n '&:hover': {\r\n backgroundColor: palette.themeDarkAlt,\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .glyphicon.glyphicon-pencil.image-edit': {\r\n position: 'static',\r\n margin: [6, 0, 6, 4],\r\n width: 24,\r\n height: 24,\r\n borderRadius: 'unset',\r\n backgroundColor: palette.white,\r\n '&:before': {\r\n color: palette.neutralPrimary,\r\n },\r\n '&:hover': {\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n backgroundColor: palette.themeDarkAlt,\r\n },\r\n opacity: 1,\r\n },\r\n },\r\n\r\n '& .image-list-add-placeholder': {\r\n position: 'relative',\r\n top: -6,\r\n width: 116,\r\n height: 99,\r\n background: 'transparent',\r\n borderStyle: 'dashed',\r\n borderColor: '#c8c6c4',\r\n borderRadius: 6,\r\n borderWidth: 1,\r\n },\r\n\r\n '& .remove-all-button': {\r\n visibility: 'hidden',\r\n },\r\n\r\n '& .image-list-choice-group': {\r\n '& .ms-Label, & .ms-ChoiceField-labelWrapper': {\r\n display: 'none',\r\n },\r\n\r\n '& .ms-ChoiceFieldGroup-flexContainer': {\r\n display: 'flex',\r\n flexFlow: 'row',\r\n flexWrap: 'wrap',\r\n width: '490px',\r\n\r\n '& .ms-ChoiceField': {\r\n marginRight: 8,\r\n background: 'transparent',\r\n\r\n '& .ms-ChoiceField-field': {\r\n borderWidth: 2,\r\n height: 99,\r\n width: 112,\r\n padding: 0,\r\n borderRadius: 6,\r\n\r\n '&:before, &:after': {\r\n zIndex: 1,\r\n },\r\n },\r\n\r\n '& .ms-ChoiceField-innerField': {\r\n padding: 0,\r\n height: 99,\r\n width: 112,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const getStyles = (components, { palette = {}, iconFontFamily = 'MsAds MDL2 Assets' }) => ({\r\n '@global': {\r\n ...extensionEditorStyles({ palette }),\r\n },\r\n imageExperienceContainer: {\r\n ...imageExperienceContentStyle(palette, iconFontFamily),\r\n ...pmaxImageExperienceContentStyle(palette, iconFontFamily),\r\n ...editImageCommonStyle(palette, iconFontFamily),\r\n },\r\n imageListLoadingContainer: {\r\n minHeight: 84,\r\n '& .loading': {\r\n paddingTop: 30,\r\n },\r\n },\r\n imageListErrorContainer: {\r\n paddingTop: 10,\r\n '& .alert': {\r\n alignItems: 'center',\r\n padding: [4, 16, 4, 12],\r\n\r\n '& .alert-image:before': {\r\n lineHeight: '32px',\r\n },\r\n\r\n '& .alert__content': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n alignItems: 'center',\r\n },\r\n\r\n '& .alert__action': {\r\n marginLeft: 'auto',\r\n marginTop: 'unset',\r\n },\r\n },\r\n },\r\n ariaAnnounce: {\r\n display: 'block',\r\n opacity: 0,\r\n height: 2,\r\n width: 2,\r\n margin: -1,\r\n },\r\n});\r\n\r\nexport const getAdPreviewStyles = (components, { palette = {} }) => ({\r\n adPreviewContainer: {\r\n '& .new-preview-carousel-container-adprelib': {\r\n border: 0,\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n borderRadius: '2px',\r\n backgroundColor: `${palette.white}`,\r\n },\r\n '& .ad-preview-controls-container': {\r\n paddingBottom: 10,\r\n },\r\n '& .ad-preview-actions': {\r\n '& button': {\r\n marginRight: 8,\r\n },\r\n },\r\n '& .ad-preview-title': {\r\n '& .preview-title-string-key': {\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n marginRight: 8,\r\n },\r\n '& .preview-title-preview-type': {\r\n fontSize: 14,\r\n },\r\n },\r\n '& .preview-type-string': {\r\n visibility: 'hidden',\r\n },\r\n '& .carousel-wrapper': {\r\n '& .carousel-inner': {\r\n height: 515,\r\n merginTop: 10,\r\n },\r\n '& .carousel-control': {\r\n background: 'transparent',\r\n },\r\n },\r\n },\r\n\r\n carouselLayoutClassName: {\r\n border: 0,\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n borderRadius: '2px',\r\n backgroundColor: `${palette.white}`,\r\n\r\n '& .carousel-wrapper': {\r\n '& .carousel-inner': {\r\n height: 515,\r\n },\r\n '& .carousel-control.left, .carousel-control.right': {\r\n left: 0,\r\n bottom: -7,\r\n background: 'transparent',\r\n zIndex: 20,\r\n },\r\n },\r\n },\r\n carouselControlsMsn: {\r\n '& .carousel-wrapper': {\r\n '& .carousel-control.left': {\r\n marginLeft: 200,\r\n },\r\n '& .carousel-control.right': {\r\n marginLeft: 430,\r\n },\r\n '& .carousel-indicators': {\r\n marginLeft: 240,\r\n margin: '20px 24px',\r\n left: 0,\r\n },\r\n },\r\n },\r\n carouselControlsOthers: {\r\n '& .carousel-wrapper': {\r\n '& .carousel-control.left': {\r\n marginLeft: 270,\r\n },\r\n '& .carousel-control.right': {\r\n marginLeft: 357,\r\n },\r\n '& .carousel-indicators': {\r\n marginLeft: 310,\r\n margin: '20px 24px',\r\n left: 0,\r\n },\r\n },\r\n },\r\n customCarouselRoot: {\r\n '& .custom-carousel-controls-and-indicators': {\r\n transform: 'translateX(-15px) translateX(-50%)',\r\n left: '50%',\r\n\r\n '& .carousel-control.left': {\r\n marginRight: '10px !important',\r\n },\r\n '& .carousel-control.right': {\r\n marginLeft: '5px !important',\r\n },\r\n },\r\n },\r\n adExtensionContainer: {\r\n // todo: add styles for ad extension preview components if needed\r\n margin: 10,\r\n },\r\n placementContainerClassName: {\r\n minWidth: 669,\r\n border: '0 !important',\r\n boxShadow: 'unset !important',\r\n borderRadius: '0 !important',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n\r\n '& .placement-validation-message': {\r\n display: 'inline-block',\r\n width: '100%',\r\n fontSize: 14,\r\n textAlign: 'center',\r\n lineHeight: 2,\r\n marginRight: 16,\r\n },\r\n },\r\n carouselLayoutHeader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n\r\n '& .carousel-header-texts': {\r\n display: 'inline-block',\r\n margin: '20px 8px 16px 24px',\r\n fontSize: 18,\r\n lineHeight: '24px',\r\n\r\n '& .carousel-header-ratio': {\r\n fontSize: 14,\r\n fontWeight: 'bold',\r\n marginRight: 8,\r\n },\r\n '& .carousel-header-title': {\r\n fontSize: 14,\r\n },\r\n },\r\n '& .ad-preview-actions': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n alignItems: 'center',\r\n marginRight: 16,\r\n '& button': {\r\n marginRight: 8,\r\n },\r\n },\r\n },\r\n});\r\n\r\nconst geCarouselStyleForMsan = {\r\n root: {\r\n '& .carousel-wrapper': {\r\n '& .carousel-control.left': {\r\n marginLeft: 200,\r\n },\r\n '& .carousel-control.right': {\r\n marginLeft: 430,\r\n },\r\n },\r\n },\r\n previewCarousel: {\r\n bottomCarouselNavigation: {\r\n '& .carousel-indicators': {\r\n marginLeft: 240,\r\n margin: '20px 24px',\r\n left: 0,\r\n },\r\n },\r\n },\r\n};\r\n\r\nconst geCarouselStyleForOthers = {\r\n root: {\r\n '& .carousel-wrapper': {\r\n '& .carousel-control.left': {\r\n marginLeft: 270,\r\n },\r\n '& .carousel-control.right': {\r\n marginLeft: 357,\r\n },\r\n },\r\n },\r\n previewCarousel: {\r\n bottomCarouselNavigation: {\r\n '& .carousel-indicators': {\r\n marginLeft: 310,\r\n margin: '20px 24px',\r\n left: 0,\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const getCarouselControlsAndIndicatorsStyleBySurface = (surface) => {\r\n switch (surface) {\r\n case 'Bing':\r\n case 'Edge':\r\n case 'Outlook':\r\n return geCarouselStyleForOthers;\r\n case 'Msn':\r\n default:\r\n return geCarouselStyleForMsan;\r\n }\r\n};\r\n\r\nexport const getSummaryCardStyles = () => ({\r\n ImageListCardDetailsContainer: {\r\n '& img': {\r\n borderRadius: 6,\r\n filter: 'drop-shadow(0px 0.6px 1.8px rgba(0, 0, 0, 0.1)) drop-shadow(0px 3.2px 7.2px rgba(0, 0, 0, 0.13))',\r\n maxHeight: 48,\r\n marginRight: 10,\r\n marginTop: 5,\r\n },\r\n },\r\n});\r\n\r\nexport const getImageSuggestionCarouselStyles = (_components, { palette } = {}) => ({\r\n ImageSuggestionCarouselContainer: {\r\n '& .image-suggestion-carousel-root': {\r\n '& .collapsible-title > a': {\r\n fontSize: 12,\r\n fontWeight: 600,\r\n '&:hover': {\r\n background: 'transparent',\r\n },\r\n },\r\n },\r\n },\r\n InfoMessageBar: {\r\n background: palette.themeLighterAlt,\r\n },\r\n});\r\n\r\nexport const getImageSuggestionPanelStyles = () => ({\r\n panel: {\r\n top: 60,\r\n },\r\n panelHeader: {\r\n paddingLeft: 32,\r\n paddingRight: 24,\r\n alignSelf: 'justify-start',\r\n flexGrow: 1,\r\n },\r\n panelTitle: {\r\n fontSize: 20,\r\n fontWeight: 600,\r\n display: 'inline-block',\r\n lineHeight: '27px',\r\n paddingBottom: 20,\r\n },\r\n backButton: {\r\n display: 'inline-block',\r\n paddingRight: 10,\r\n },\r\n theme: {\r\n marginBottom: 14,\r\n marginLeft: 4,\r\n },\r\n buttonContainer: {\r\n alignItems: 'center',\r\n },\r\n errorMessage: {\r\n marginTop: 16,\r\n },\r\n});\r\n\r\nexport const imageSuggestionPanelWidth = '920px';\r\n","import _ from 'underscore';\r\nimport { parseUrl } from '@bingads-webui-campaign-react/url-editor';\r\nimport { getFinalUrlWithPath } from '@bingads-webui-campaign-react/validated-url-input';\r\n\r\nimport {\r\n UAPPlacementTypeAlias as EPT,\r\n} from '@bingads-webui-campaign-react/unified-ad-preview-library-cmui';\r\n\r\nconst DEFAULT_URL_PREFIX = 'https';\r\nconst URL_COLON_SLASH_SLASH = '://';\r\n\r\nconst vmImagesFieldString = 'Images';\r\nconst vmImagesDataFieldString = 'ImageList';\r\nconst vmImageAssetsFieldString = 'ImageAssets';\r\n\r\nconst vmHeadlinesFieldString = 'Headlines';\r\nconst vmLongHeadlinesFieldString = 'LongHeadlines';\r\nconst vmDescriptionsFieldString = 'Descriptions';\r\nconst vmBusinessNameFieldString = 'BusinessName';\r\nconst vmCallToActionFieldString = 'CallToAction';\r\nconst vmFinalUrlsFieldString = 'FinalUrls';\r\nconst vmPath1FieldString = 'Path1';\r\nconst vmPath2FieldString = 'Path2';\r\n\r\nexport const pmaxRequiredAspectRatios = { Image191x100: 1, Image1x1: 1 };\r\n\r\n// ignore Image169x100 because the minimum size (703x372) is bigger than original image 703x368\r\nexport const audienceMMAV2RequiredAspectRatios = {\r\n OriginalImage: 1, Image201x100: 1, Image200x100: 1, Image191x100: 1, Image169x100: 1, Image153x100: 1, Image124x100: 1, Image120x100: 1, Image1x1: 1,\r\n};\r\nexport const specialMinimumSizeReqiurementAspectRatios = { Image169x100: [703, 372] };\r\n\r\nexport const getImagesFromImagesVm = vmImages => _.result(vmImages, vmImagesDataFieldString, undefined);\r\nconst getImageAssetsFromImagesVm = vmImages => _.result(vmImages, vmImageAssetsFieldString, []);\r\n\r\nexport const hasImages = imagesVm => _.result(getImagesFromImagesVm(imagesVm), 'length', 0) > 0;\r\n\r\nexport const getImageAssetsFromVm = (assetGroupVm, imageListPropName) => {\r\n const vmImages = _.result(assetGroupVm, imageListPropName || vmImagesFieldString, []);\r\n return getImageAssetsFromImagesVm(vmImages);\r\n};\r\n\r\nexport const getImageListFromVm = (assetGroupVm, imageListPropName) => {\r\n const vmImages = _.result(assetGroupVm, imageListPropName || vmImagesFieldString, {});\r\n return getImagesFromImagesVm(vmImages);\r\n};\r\n\r\nexport const createImagesVm = ({\r\n imageList,\r\n imageListPropName,\r\n}) => (\r\n imageListPropName && !imageList ? {} : {\r\n [imageListPropName || vmImagesFieldString]: {\r\n [vmImagesDataFieldString]: imageList,\r\n [vmImageAssetsFieldString]: null,\r\n },\r\n });\r\n\r\nexport const getInternalFinalUrlStateFromUrl = (url) => {\r\n const finalUrlProtocolAndDest = parseUrl(url);\r\n\r\n return {\r\n internalFinalUrl: url,\r\n internalFinalUrlProtocol: `${finalUrlProtocolAndDest.protocol || DEFAULT_URL_PREFIX}${URL_COLON_SLASH_SLASH}`,\r\n internalFinalUrlDest: finalUrlProtocolAndDest.url,\r\n };\r\n};\r\n\r\nconst getFirstNonEmptyItemKey = (items) => {\r\n const unEmptyItems = _.pick(items, _.identity);\r\n const keys = _.keys(unEmptyItems).sort();\r\n return _.first(keys);\r\n};\r\nconst getFirstNonEmptyItem = (items) => {\r\n const key = getFirstNonEmptyItemKey(items);\r\n return key ? items[key] : undefined;\r\n};\r\n\r\nexport const getAssetsFromVm = (assetGroupVm) => {\r\n const finalUrls = _.result(assetGroupVm, vmFinalUrlsFieldString, []);\r\n\r\n return ({\r\n shortHeadline: getFirstNonEmptyItem(_.result(assetGroupVm, vmHeadlinesFieldString, {})),\r\n longHeadline: getFirstNonEmptyItem(_.result(assetGroupVm, vmLongHeadlinesFieldString, {})),\r\n description: getFirstNonEmptyItem(_.result(assetGroupVm, vmDescriptionsFieldString, {})),\r\n businessName: _.result(assetGroupVm, vmBusinessNameFieldString, '') || '',\r\n callToAction: _.result(assetGroupVm, vmCallToActionFieldString, ''),\r\n finalUrl: _.first(finalUrls),\r\n displayUrl: getFinalUrlWithPath(finalUrls, _.result(assetGroupVm, vmPath1FieldString), _.result(assetGroupVm, vmPath2FieldString)),\r\n });\r\n};\r\n\r\nexport const adPreviewConfig = [{\r\n placementSetName: 'Msn',\r\n placementTypes: [\r\n EPT.PMax.AudienceWideImage,\r\n EPT.PMax.MSEdgeSingleCarousel,\r\n EPT.PMax.MSNInArticle,\r\n EPT.PMax.AudienceSquareImage,\r\n EPT.PMax.MSNSmallHeadline,\r\n EPT.PMax.MMAWideImage,\r\n EPT.PMax.MMAVerticalImage,\r\n ],\r\n}, {\r\n placementSetName: 'Bing',\r\n placementTypes: [\r\n EPT.PMax.MMALandscapeImage,\r\n EPT.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: 'Edge',\r\n placementTypes: [\r\n EPT.PMax.MSEdgeSingleCarousel,\r\n EPT.PMax.MMALandscapeImage,\r\n ],\r\n}, {\r\n placementSetName: 'Outlook',\r\n placementTypes: [\r\n EPT.Outlook.Mobile, EPT.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const adPreviewConfigV2 = [{\r\n placementSetName: 'Msn',\r\n placementTypes: [\r\n EPT.PMax.AudienceWideImage,\r\n EPT.PMax.AudienceSquareImage,\r\n EPT.PMax.MMAWideImage,\r\n EPT.PMax.MMAVerticalImage,\r\n EPT.PMax.MMAV2MSNSingleCarousel,\r\n EPT.PMax.MMAV2MSNRestoday,\r\n EPT.PMax.MMAV2MSNPartnerStripe,\r\n ],\r\n}, {\r\n placementSetName: 'Bing',\r\n placementTypes: [\r\n EPT.PMax.MMALandscapeImage,\r\n EPT.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: 'Edge',\r\n placementTypes: [\r\n EPT.PMax.MMALandscapeImage,\r\n EPT.PMax.MMAV2MSEdgeCarousel,\r\n ],\r\n}, {\r\n placementSetName: 'Outlook',\r\n placementTypes: [\r\n EPT.Outlook.Mobile, EPT.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const adPreviewConfigV3 = [{\r\n placementSetName: 'Msn',\r\n placementTypes: [\r\n EPT.PMax.MMAV2MSNRiver,\r\n EPT.PMax.MSEdgeMobile,\r\n EPT.PMax.MMAWideImage,\r\n EPT.PMax.MMAVerticalImage,\r\n EPT.PMax.MMAV2MSNSingleCarousel,\r\n EPT.PMax.MMAV2MSNRestoday,\r\n EPT.PMax.MMAV2MSNPartnerStripe,\r\n EPT.PMax.MMAV2MSEdgeCarousel,\r\n ],\r\n}, {\r\n placementSetName: 'Bing',\r\n placementTypes: [\r\n EPT.PMax.MMALandscapeImage,\r\n EPT.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: 'Outlook',\r\n placementTypes: [\r\n EPT.Outlook.Mobile, EPT.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const AdPreviewSurface = {\r\n Msn: 'Msn',\r\n Bing: 'Bing',\r\n Edge: 'Edge',\r\n Outlook: 'Outlook',\r\n VideoGaming: 'VideoGaming',\r\n};\r\n\r\nexport const AdPreviewSurfacePlacementKeys = {\r\n [AdPreviewSurface.Msn]: ['msan_191x100', 'msan_1x1', 'edge_178x100', 'msan_150x100', 'msan_133x100', 'mma_4x1', 'mma_1x2'],\r\n [AdPreviewSurface.Bing]: ['mma_191x100', 'bing_text'],\r\n [AdPreviewSurface.Edge]: ['mma_191x100', 'edge_178x100'],\r\n [AdPreviewSurface.Outlook]: ['outlook_text_mobile', 'outlook_text_web'],\r\n};\r\n\r\nexport const AdPreviewSurfacePlacementKeysV2 = {\r\n [AdPreviewSurface.Msn]: ['msan_191x100', 'msan_1x1', 'mma_4x1', 'mma_1x2', 'mma_169x100', 'mma_124x100', 'mma_153x100'],\r\n [AdPreviewSurface.Bing]: ['mma_191x100', 'bing_text'],\r\n [AdPreviewSurface.Edge]: ['mma_191x100', 'edge_201x100'],\r\n [AdPreviewSurface.Outlook]: ['outlook_text_mobile', 'outlook_text_web'],\r\n};\r\n\r\nexport const AdPreviewSurfacePlacementKeysV3 = {\r\n [AdPreviewSurface.Msn]: ['msan_191x100', 'msan_1x1', 'mma_4x1', 'mma_1x2', 'mma_169x100', 'mma_124x100', 'mma_153x100', 'edge_201x100'],\r\n [AdPreviewSurface.Bing]: ['mma_191x100', 'bing_text'],\r\n [AdPreviewSurface.Outlook]: ['outlook_text_mobile', 'outlook_text_web'],\r\n};\r\n\r\nexport const getNumberOfPlacementBySurface = surface =>\r\n AdPreviewSurfacePlacementKeys[surface].length;\r\n\r\nexport const getNumberOfPlacementByCustomSurface = (surface, customSurfaceKeys) => customSurfaceKeys[surface] && customSurfaceKeys[surface].placements.length;\r\nexport const getNumberOfPlacementBySurfaceV2 = surface =>\r\n AdPreviewSurfacePlacementKeysV2[surface].length;\r\n\r\nexport const getNumberOfPlacementBySurfaceV3 = surface =>\r\n AdPreviewSurfacePlacementKeysV3[surface].length;\r\n\r\nexport const AdPreviewOverideStylesByKey = {\r\n mma_191x100: { imagePreviewHeight: 153, imagePreviewWidth: 292 },\r\n edge_178x100: { imagePreviewHeight: 220, imagePreviewWidth: 390 },\r\n msan_191x100: { imagePreviewHeight: 200, imagePreviewWidth: 382 },\r\n msan_150x100: { imagePreviewHeight: 200, imagePreviewWidth: 300 },\r\n mma_1x2: { imagePreviewHeight: 320, imagePreviewWidth: 160 },\r\n};\r\n\r\n\r\nexport const responsiveAdPreviewConfig = [{\r\n placementSetName: AdPreviewSurface.Msn,\r\n placementTypes: [\r\n EPT.Responsive.PMax.AudienceWideImage,\r\n EPT.Responsive.PMax.MSEdgeSingleCarousel,\r\n EPT.Responsive.PMax.MSNInArticle,\r\n EPT.Responsive.PMax.AudienceSquareImage,\r\n EPT.Responsive.PMax.MSNSmallHeadline,\r\n EPT.Responsive.PMax.MMAWideImage,\r\n EPT.Responsive.PMax.MMAVerticalImage,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Bing,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MMALandscapeImage,\r\n EPT.Responsive.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Edge,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MSEdgeSingleCarousel,\r\n EPT.Responsive.PMax.MMALandscapeImage,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Outlook,\r\n placementTypes: [\r\n EPT.Responsive.Outlook.Mobile, EPT.Responsive.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const responsiveAdPreviewConfigV2 = [{\r\n placementSetName: AdPreviewSurface.Msn,\r\n placementTypes: [\r\n EPT.Responsive.PMax.AudienceWideImage,\r\n EPT.Responsive.PMax.AudienceSquareImage,\r\n EPT.Responsive.PMax.MMAWideImage,\r\n EPT.Responsive.PMax.MMAVerticalImage,\r\n EPT.Responsive.PMax.MMAV2MSNSingleCarousel,\r\n EPT.Responsive.PMax.MMAV2MSNRestoday,\r\n EPT.Responsive.PMax.MMAV2MSNPartnerStripe,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Bing,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MMALandscapeImage,\r\n EPT.Responsive.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Edge,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MMALandscapeImage,\r\n EPT.Responsive.PMax.MMAV2MSEdgeCarousel,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Outlook,\r\n placementTypes: [\r\n EPT.Responsive.Outlook.Mobile, EPT.Responsive.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const responsiveAdPreviewConfigV3 = [{\r\n placementSetName: AdPreviewSurface.Msn,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MMAV2MSNRiver,\r\n EPT.Responsive.PMax.MSEdgeMobile,\r\n EPT.Responsive.PMax.MMAWideImage,\r\n EPT.Responsive.PMax.MMAVerticalImage,\r\n EPT.Responsive.PMax.MMAV2MSNSingleCarousel,\r\n EPT.Responsive.PMax.MMAV2MSNRestoday,\r\n EPT.Responsive.PMax.MMAV2MSNPartnerStripe,\r\n EPT.Responsive.PMax.MMAV2MSEdgeCarousel,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Bing,\r\n placementTypes: [\r\n EPT.Responsive.PMax.MMALandscapeImage,\r\n EPT.Responsive.BingSearch.Text,\r\n ],\r\n}, {\r\n placementSetName: AdPreviewSurface.Outlook,\r\n placementTypes: [\r\n EPT.Outlook.Mobile, EPT.Outlook.Web,\r\n ],\r\n}];\r\n\r\nexport const getResponsiveAdPreviewConfig = (isAdPreviewRefreshEnabled, isPMaxAspectRatiosV2Enabled, permissions) => {\r\n let config = responsiveAdPreviewConfig;\r\n if (isAdPreviewRefreshEnabled && isPMaxAspectRatiosV2Enabled) {\r\n config = responsiveAdPreviewConfigV3;\r\n } else if (isPMaxAspectRatiosV2Enabled) {\r\n config = responsiveAdPreviewConfigV2;\r\n }\r\n\r\n if (permissions.dynamic.PMaxVideo) {\r\n // update Msn placment with video\r\n const msnSurfacePlacements = config.find(placement => placement.placementSetName === AdPreviewSurface.Msn);\r\n\r\n if (msnSurfacePlacements && !msnSurfacePlacements.placementTypes.includes(EPT.PMax.Video)) {\r\n msnSurfacePlacements.placementTypes.push(EPT.PMax.Video);\r\n }\r\n\r\n // if config doesn't have VideoGaming surface, add it\r\n const videoGamingSurface = config.find(placement => placement.placmentSetName === AdPreviewSurface.VideoGaming);\r\n if (!videoGamingSurface) {\r\n config.push({\r\n placementSetName: AdPreviewSurface.VideoGaming,\r\n placementTypes: [\r\n EPT.PMax.Video,\r\n ],\r\n });\r\n }\r\n }\r\n\r\n return config;\r\n};\r\n\r\n\r\nexport const getExtraPlacementInfo = hasLogo => ({\r\n [EPT.Responsive.PMax.AudienceWideImage]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('MSN feed'),\r\n customClassName: 'msan_191x100',\r\n imagePreviewHeight: AdPreviewOverideStylesByKey.msan_191x100.imagePreviewHeight,\r\n },\r\n [EPT.Responsive.PMax.MSEdgeSingleCarousel]: {\r\n aspectRatioUIString: '1.78:1',\r\n previewTitle: _TL_('Microsoft Edge single carousel'),\r\n customClassName: 'edge_178x100',\r\n imagePreviewHeight: AdPreviewOverideStylesByKey.edge_178x100.imagePreviewHeight,\r\n },\r\n [EPT.Responsive.PMax.MSNInArticle]: {\r\n aspectRatioUIString: '1.5:1',\r\n previewTitle: _TL_('MSN in-article ad'),\r\n customClassName: 'msan_150x100',\r\n imagePreviewHeight: AdPreviewOverideStylesByKey.msan_150x100.imagePreviewHeight,\r\n },\r\n [EPT.Responsive.PMax.AudienceSquareImage]: {\r\n aspectRatioUIString: '1:1',\r\n previewTitle: _TL_('MSN square image'),\r\n customClassName: 'msan_1x1',\r\n },\r\n [EPT.Responsive.PMax.MSNSmallHeadline]: {\r\n aspectRatioUIString: '1.33:1',\r\n previewTitle: _TL_('MSN small headline'),\r\n customClassName: 'msan_133x100',\r\n },\r\n [EPT.Responsive.PMax.MMAWideImage]: {\r\n aspectRatioUIString: '4:1',\r\n previewTitle: _TL_('Wide image'),\r\n customClassName: 'mma_4x1',\r\n },\r\n [EPT.Responsive.PMax.MMAVerticalImage]: {\r\n aspectRatioUIString: '1:2',\r\n previewTitle: _TL_('Vertical image'),\r\n customClassName: 'mma_1x2',\r\n imagePreviewHeight: AdPreviewOverideStylesByKey.mma_1x2.imagePreviewHeight,\r\n },\r\n [EPT.Responsive.PMax.MMALandscapeImage]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('Landscape Image Multimedia Ad'),\r\n customClassName: 'mma_191x100',\r\n imagePreviewHeight: AdPreviewOverideStylesByKey.mma_191x100.imagePreviewHeight,\r\n hasLogo,\r\n },\r\n [EPT.Responsive.BingSearch.Text]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Bing search ad'),\r\n customClassName: 'bing_text',\r\n hasLogo,\r\n },\r\n [EPT.Responsive.Outlook.Mobile]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (mobile)'),\r\n customClassName: 'outlook_text_mobile',\r\n hasLogo,\r\n },\r\n [EPT.Responsive.Outlook.Web]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (computer)'),\r\n customClassName: 'outlook_text_web',\r\n hasLogo,\r\n },\r\n [EPT.UnifiedAppAds.VideoHorizontal]: {\r\n aspectRatioUIString: '16:9',\r\n previewTitle: _TL_('Horizontal fullscreen video'),\r\n customClassName: 'video_16x9',\r\n },\r\n [EPT.UnifiedAppAds.M365Outlook]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Outlook Mobile'),\r\n customClassName: 'outlook_text_mobile',\r\n hasLogo,\r\n },\r\n [EPT.UnifiedAppAds.MSNDisplay]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('MSN Landscape Image'),\r\n },\r\n [EPT.UnifiedAppAds.CasualGamesDimensions]: {\r\n aspectRatioUIString: '1:1',\r\n previewTitle: _TL_('Square image'),\r\n },\r\n [EPT.Responsive.PMax.MMAV2MSEdgeCarousel]: {\r\n aspectRatioUIString: '2.01:1',\r\n previewTitle: _TL_('Microsoft Edge carousel'),\r\n customClassName: 'edge_201x100',\r\n hasLogo: true,\r\n },\r\n [EPT.Responsive.PMax.MMAV2MSNSingleCarousel]: {\r\n aspectRatioUIString: '1.69:1',\r\n previewTitle: _TL_('MSN Single Carousel'),\r\n customClassName: 'mma_169x100',\r\n },\r\n [EPT.Responsive.PMax.MMAV2MSNRestoday]: {\r\n aspectRatioUIString: '1.24:1',\r\n previewTitle: _TL_('MSN Restoday'),\r\n customClassName: 'mma_124x100',\r\n },\r\n [EPT.Responsive.PMax.MMAV2MSNPartnerStripe]: {\r\n aspectRatioUIString: '1.53:1',\r\n previewTitle: _TL_('MSN Partner Stripe'),\r\n customClassName: 'mma_153x100',\r\n },\r\n [EPT.Responsive.PMax.MMAV2MSNRiver]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('MSN feed'),\r\n hasLogo: true,\r\n },\r\n [EPT.Responsive.PMax.MSEdgeMobile]: {\r\n aspectRatioUIString: '1:1',\r\n previewTitle: _TL_('Microsoft Edge mobile'),\r\n hasLogo: true,\r\n },\r\n [EPT.PMax.Video]: {\r\n previewTitle: _TL_('Video'),\r\n customClassName: 'video',\r\n },\r\n [EPT.Outlook.Mobile]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (mobile)'),\r\n customClassName: 'outlook_text_mobile',\r\n hasLogo,\r\n },\r\n [EPT.Outlook.Web]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (computer)'),\r\n customClassName: 'outlook_text_web',\r\n hasLogo,\r\n },\r\n});\r\n","import _ from 'underscore';\r\nimport { getFlattenedImageAssetList, updateAssetsIdsAsync, setMTImageModel, getImagesFromMTAssetsAsync } from '@bingads-webui-campaign-react/responsive-ad-editor-utils';\r\nimport { ImageOData } from '@bingads-webui-campaign/image-odata';\r\nimport odata from '@bingads-webui-component-legacy/http/channel/odata';\r\nimport { createAsyncToken } from '@bingads-webui-universal/primitive-utilities';\r\n\r\nexport const getODataConfig = (serverContext) => {\r\n const isLocal = () => {\r\n const hostname = document.location.hostname.toLowerCase();\r\n return hostname.indexOf('ads.microsoft.com') === -1 &&\r\n hostname.indexOf('ads-int.microsoft.com') === -1;\r\n };\r\n\r\n const odataPath = isLocal() ? 'Advertiser/V2' : 'Campaign/V2';\r\n\r\n const oDataConfig = {\r\n odataToken: serverContext.Token,\r\n oDataToken: serverContext.Token,\r\n odataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n oDataPath: `${serverContext.ServicesEndpoints.CampaignAPI}${odataPath}`,\r\n };\r\n\r\n return oDataConfig;\r\n};\r\n\r\nexport const processImageListViewModelToModel = (imageListVm, serverContext, cid, aid) => {\r\n const imageOData = new ImageOData(cid, aid, getODataConfig(serverContext));\r\n const flattenedIncludedImageAssetList = getFlattenedImageAssetList(imageListVm, true /* isMultimediaAdinMSANEnabled */, false /* isMultimediaAd */);\r\n const originalData = {};\r\n\r\n return updateAssetsIdsAsync(flattenedIncludedImageAssetList, 0, true /* isAdCreatorEnabled */, imageOData)\r\n .then((updates) => {\r\n // isMultimediaAdinMSANEnabled unset because right now pmax MT does not support autofill (we have to specify all included aspect ratios - no data optimizations)\r\n // TODO: Refactor code to have more calrity on functionality specifying isMultimediaAdinMSANEnabled and isMultimediaAd values\r\n setMTImageModel(\r\n originalData,\r\n updates,\r\n _.map(imageListVm, imageArray => _.filter(imageArray, imageObj => imageObj.isIncluded)) /* imageList */,\r\n {\r\n isMultimediaAdinMSANEnabled: false,\r\n isMultimediaAd: false,\r\n },\r\n [] /* UiUnsupportedRatios */\r\n );\r\n return originalData;\r\n });\r\n};\r\n\r\nexport const processImageListModelToViewModel = (imageAssetArray, cid, aid, overrideParameters) => {\r\n const baseUrl = `/Customers(${cid})/Accounts(${aid})/`;\r\n const isCombinedMsanAndMmaAspectRatios = overrideParameters && overrideParameters.isCombinedMsanAndMmaAspectRatios !== undefined ? overrideParameters.isCombinedMsanAndMmaAspectRatios : true;\r\n const isLinkedInAd = overrideParameters && overrideParameters.isLinkedInAd !== undefined ? overrideParameters.isLinkedInAd : false;\r\n const isPMaxAspectRatiosV2Enabled = overrideParameters && overrideParameters.isPMaxAspectRatiosV2Enabled;\r\n\r\n const promise = getImagesFromMTAssetsAsync(\r\n odata,\r\n baseUrl,\r\n imageAssetArray,\r\n true /* isMultimediaAd */,\r\n true /* isAdCreatorEnabled */,\r\n isCombinedMsanAndMmaAspectRatios, /* isCombinedMsanAndMmaAspectRatios */\r\n false /* isStoreAppProng */,\r\n false /* isStoreAppSpotLight */,\r\n false /* isStoreAppTransparentLogo */,\r\n isLinkedInAd /* isLinkedInAd */,\r\n false /* isImageFittingEnabled */,\r\n isPMaxAspectRatiosV2Enabled\r\n );\r\n\r\n return createAsyncToken(promise);\r\n};\r\n","import React, { useState, useMemo, useContext, useCallback, useEffect, useRef } from 'react';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { ImageExperience, AdTypeEnum, getDefaultCurrentSelectedImageId, getDefaultSelectedImageId } from '@bingads-webui-campaign-react/image-experience';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { ScopeContext } from '@bingads-webui-react/scope-service';\r\nimport odata from '@bingads-webui-component-legacy/http/channel/odata';\r\nimport { mergeI18n } from '@bingads-webui-campaign-react/i18n-merger';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withPreference } from '@bingads-webui-react/preference-context';\r\nimport { withInstrumentation } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport { instrumentationScenarios } from '@bingads-webui-campaign/ad-creator-tools-instrumentation';\r\nimport { MediaRepository } from '@bingads-webui-campaign/media-repository';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { validateAdUrl } from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\nimport { useAssetLibraryEventHandler, AssetPropertyName } from '@bingads-webui-campaign-react/copilot-common';\r\n\r\nimport { getStyles } from './style';\r\nimport { getInternalFinalUrlStateFromUrl, getImageListFromVm, getAssetsFromVm, createImagesVm, getImageAssetsFromVm, pmaxRequiredAspectRatios, audienceMMAV2RequiredAspectRatios, specialMinimumSizeReqiurementAspectRatios, adPreviewConfig as PMAXAdPreviewConfig, adPreviewConfigV2 as PMaxAdPreviewConfigV2, adPreviewConfigV3 as PMaxAdPreviewConfigV3 } from './shared';\r\nimport { getODataConfig, processImageListModelToViewModel } from './image-list-data';\r\n\r\nexport const PMaxImageExperienceMaxImageCount = 20;\r\n\r\nconst ImageExperienceWrapperInternal = (props) => {\r\n const {\r\n validationProps,\r\n updateValidation,\r\n imageAssetsOptional,\r\n isLogoEnabled,\r\n isBoostPortraitEnabled,\r\n updateFinalUrlCallback,\r\n updateImageListCallback,\r\n i18n,\r\n permissions,\r\n preferenceService,\r\n imagesContaineRef,\r\n logosContaineRef,\r\n portraitContainerRef,\r\n campaignId,\r\n previewImagesSharedState,\r\n setPreviewImagesSharedState,\r\n updatePortalContainerState,\r\n setImageExperienceAddNewImageCallback,\r\n suggestionPoller,\r\n wizardPerfMarker,\r\n postAssetEventLog,\r\n isCombinedMsanAndMmaAspectRatios,\r\n customMaxImageCount,\r\n UAPLPMaxIntegration,\r\n isMSANBoostEnabled,\r\n imageListPropName,\r\n isBulkEditMMA,\r\n isImproveMMA,\r\n genericImage,\r\n isMultimediaAd,\r\n isMultimediaAdinMSANEnabled,\r\n isCopilotRecommendations,\r\n adPreviewConfig,\r\n optionalAspectRatio,\r\n isStoreAppProng,\r\n isStoreAppSpotLight,\r\n isAd,\r\n isStockImageEnabled,\r\n isStoreAppTransparentLogo,\r\n isMMAV2Enabled,\r\n showCopilotOptionForImage,\r\n customAssetLibraryEventHandler,\r\n isLinkedInAd,\r\n customPreviewTexts,\r\n customOnEditImage,\r\n customOnSaveEditImage,\r\n onRenderAllowedAspectRatioControl,\r\n isAudienceAd,\r\n supportImageUpscale,\r\n isImageFittingEnabled,\r\n isUnifiedAppCampaignWindowsStore,\r\n isPMaxAspectRatiosV2Enabled,\r\n isAdPreviewRefreshEnabled,\r\n } = props;\r\n if (adPreviewConfig.placementConfig === undefined) {\r\n const refreshedAdPreviewConfig = isAdPreviewRefreshEnabled ? PMaxAdPreviewConfigV3 : PMaxAdPreviewConfigV2;\r\n adPreviewConfig.placementConfig = isPMaxAspectRatiosV2Enabled ? refreshedAdPreviewConfig : PMAXAdPreviewConfig;\r\n }\r\n\r\n const [recommendationContext, , reportRecommendations] = useContext(RecommendationContext);\r\n const { copilotTracking } = recommendationContext;\r\n\r\n const [finalUrlState, setFinalUrlState] = useState({\r\n wizardFinalUrl: null,\r\n internalFinalUrl: null,\r\n internalFinalUrlProtocol: null,\r\n internalFinalUrlDest: null,\r\n });\r\n\r\n const [state, setState] = useState({\r\n thumbnailRecord: null,\r\n currentSelectedImageId: null,\r\n currentSelectedLogoId: null,\r\n });\r\n\r\n const imageExperienceAddImageCalbackRef = useRef(_.noop);\r\n const suggestedImageBeingAdded = useRef(null);\r\n\r\n useEffect(() => {\r\n setImageExperienceAddNewImageCallback(() => (images, imageSource, replaceExistingAssets) => {\r\n const { fullUrl, suggestionId } = images[images.length - 1];\r\n if (images.length === 1) {\r\n suggestedImageBeingAdded.current = { fullUrl, suggestionId };\r\n }\r\n if (isCopilotRecommendations) {\r\n return imageExperienceAddImageCalbackRef.current(images, imageSource, replaceExistingAssets);\r\n }\r\n return imageExperienceAddImageCalbackRef.current(fullUrl, imageSource);\r\n });\r\n }, [isCopilotRecommendations, setImageExperienceAddNewImageCallback]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n const serverContext = useContext(ServerContext);\r\n const { scope } = useContext(ScopeContext);\r\n\r\n const activity = useContext(ActivityContext);\r\n\r\n const isMeetingMinimumRequirementPerAspectRatio = useCallback((imageList, forLogos) => {\r\n let requiredAspectRatios = pmaxRequiredAspectRatios;\r\n if (isMMAV2Enabled) {\r\n requiredAspectRatios = audienceMMAV2RequiredAspectRatios;\r\n }\r\n if (isLinkedInAd) {\r\n return imageList && imageList.length > 0;\r\n }\r\n const ratioCounts = _.mapObject(optionalAspectRatio || requiredAspectRatios, () => 0);\r\n _.each(imageList, imageArray =>\r\n _.each(imageArray, (imageObj) => {\r\n if (imageObj.isIncluded && imageObj.isLogo === forLogos && !imageObj.isPortrait && _.has(requiredAspectRatios, imageObj.type)) {\r\n ratioCounts[imageObj.type] += 1;\r\n }\r\n\r\n if (isMMAV2Enabled && _.has(specialMinimumSizeReqiurementAspectRatios, imageObj.type) && imageObj.isLogo === false && !imageObj.isPortrait) {\r\n // for Image169x100, the minimum size (703x372) is bigger than original image (required) 703x368\r\n const minimumSizerequirement = specialMinimumSizeReqiurementAspectRatios[imageObj.type];\r\n const imageActualCroppedSize = imageObj.cropSettings || {};\r\n const isThisAspectRatioExcludedForMinimumSizeReqiurement = imageActualCroppedSize.SourceWidth < minimumSizerequirement[0] || imageActualCroppedSize.SourceHeight < minimumSizerequirement[1];\r\n ratioCounts[imageObj.type] += isThisAspectRatioExcludedForMinimumSizeReqiurement ? 1 : 0;\r\n }\r\n }));\r\n return _.every(requiredAspectRatios, (minCount, type) => ratioCounts[type] >= minCount);\r\n }, [isLinkedInAd, isMMAV2Enabled, optionalAspectRatio]);\r\n\r\n const validateImageList = useCallback((imageList, logos) => {\r\n if (imageAssetsOptional || logos) {\r\n return [];\r\n }\r\n\r\n if (!isMeetingMinimumRequirementPerAspectRatio(imageList, logos)) {\r\n let error = logos ?\r\n i18n.getString(_TL_('You need to add at least 1 logo with 1:1 aspect ratio to your asset group.')) :\r\n i18n.getString(_TL_('You need to add at least 1 image with 1.91:1 aspect ratio and 1 image with 1:1 aspect ratio to your asset group.'));\r\n\r\n if (isAd) {\r\n error = logos ?\r\n i18n.getString(_TL_('You need to add at least 1 logo with 1:1 aspect ratio to the ad.')) :\r\n i18n.getString(_TL_('You need to add at least 1 image with 1.91:1 aspect ratio and 1 image with 1:1 aspect ratio to the ad.'));\r\n }\r\n\r\n if (isMMAV2Enabled) {\r\n error = logos ?\r\n i18n.getString(_TL_('You need to add at least 1 logo to the ad.')) :\r\n i18n.getString(_TL_('You need to add at least 1 image to the ad with minimum requirement.'));\r\n }\r\n\r\n if (isLinkedInAd) {\r\n error = i18n.getString(_TL_('You need to add 1 image to the ad.'));\r\n }\r\n\r\n return [error];\r\n }\r\n\r\n return [];\r\n }, [imageAssetsOptional, isMeetingMinimumRequirementPerAspectRatio, i18n, isAd, isMMAV2Enabled]);\r\n\r\n const updateFinalUrlStateFromWizardIfChanged = useCallback((vmAssetsInfo) => {\r\n const vmFinalUrl = vmAssetsInfo.finalUrl;\r\n if (vmFinalUrl !== finalUrlState.wizardFinalUrl) {\r\n setFinalUrlState({\r\n wizardFinalUrl: vmFinalUrl,\r\n ...getInternalFinalUrlStateFromUrl(vmFinalUrl),\r\n });\r\n }\r\n }, [finalUrlState]);\r\n\r\n const onImageSelected = useCallback((imageId, isLogoSelected = false) => {\r\n if (isLogoSelected) {\r\n setState({\r\n ...state,\r\n currentSelectedLogoId: imageId,\r\n });\r\n\r\n setPreviewImagesSharedState({\r\n ...previewImagesSharedState, previewLogoId: imageId,\r\n });\r\n } else {\r\n setState({\r\n ...state,\r\n currentSelectedImageId: imageId,\r\n });\r\n\r\n setPreviewImagesSharedState({\r\n ...previewImagesSharedState, cropImageObj: null, previewImageId: imageId, editingPlacementType: '',\r\n });\r\n }\r\n }, [state, setPreviewImagesSharedState, previewImagesSharedState]);\r\n\r\n const onImageRemoved = useCallback((imageId, updatedImageList, isLogo) => {\r\n if ((isLogo && `${state.currentSelectedLogoId}` === `${imageId}`) || (!isLogo && `${state.currentSelectedImageId}` === `${imageId}`)) {\r\n const selectedImageId = getDefaultSelectedImageId(updatedImageList, isLogo);\r\n onImageSelected(selectedImageId, isLogo);\r\n }\r\n if (!copilotTracking || !copilotTracking.isInRemainingInitialSuggestions(AssetPropertyName.IMAGE, imageId)) { return; }\r\n copilotTracking.removeInitialSuggestion(AssetPropertyName.IMAGE, imageId);\r\n }, [copilotTracking, onImageSelected, state.currentSelectedImageId, state.currentSelectedLogoId]);\r\n\r\n const vmImageAssets = getImageAssetsFromVm(validationProps.data, imageListPropName);\r\n const vmImageList = getImageListFromVm(validationProps.data, imageListPropName);\r\n const latestImageList = useRef();\r\n\r\n const getNewlyAddedImageId = useCallback((latest, updated) => {\r\n const newImage = _.find(updated, image => !_.contains(latest, image));\r\n if (_.isArray(newImage)) {\r\n const { id } = _.first(newImage);\r\n return id;\r\n }\r\n return null;\r\n }, []);\r\n\r\n const onImageListUpdated = useCallback((updatedImageList, currentSelectedImageId, isLogo, shouldDirty = true) => {\r\n setPreviewImagesSharedState(prevState => ({ ...prevState, cropImageObj: null, editingPlacementType: '' }));\r\n const imagesErrorList = [...validateImageList(updatedImageList, false)];\r\n const logosErrorList = [...validateImageList(updatedImageList, true)];\r\n const allErrors = [...imagesErrorList, ...logosErrorList];\r\n\r\n const listSizeChange = _.size(updatedImageList) - _.size(latestImageList.current);\r\n\r\n updatePortalContainerState({\r\n imageErrors: imagesErrorList,\r\n logoErrors: logosErrorList,\r\n isDirty: shouldDirty,\r\n imageListSizeChange: listSizeChange,\r\n });\r\n\r\n updateImageListCallback(updatedImageList);\r\n if (customAssetLibraryEventHandler && customAssetLibraryEventHandler.onImageListUpdate) {\r\n customAssetLibraryEventHandler.onImageListUpdate(activity, updatedImageList, latestImageList.current);\r\n }\r\n\r\n if (suggestedImageBeingAdded.current) {\r\n const addedImageId = getNewlyAddedImageId(latestImageList.current, updatedImageList);\r\n if (addedImageId) {\r\n const { suggestionId } = suggestedImageBeingAdded.current;\r\n reportRecommendations({ selectedImageSuggestions: [{ suggestionId, imageId: addedImageId }] });\r\n }\r\n suggestedImageBeingAdded.current = null;\r\n }\r\n\r\n latestImageList.current = updatedImageList;\r\n updateValidation(allErrors, createImagesVm({ imageList: updatedImageList, imageListPropName }, shouldDirty));\r\n\r\n if (currentSelectedImageId) {\r\n onImageSelected(currentSelectedImageId, isLogo);\r\n }\r\n\r\n if (activity) {\r\n activity.signal(`onImageListUpdated - currentImageSize: ${JSON.stringify(updatedImageList)}`);\r\n }\r\n }, [setPreviewImagesSharedState, validateImageList, updatePortalContainerState, updateImageListCallback, customAssetLibraryEventHandler, updateValidation, imageListPropName, activity, getNewlyAddedImageId, reportRecommendations, onImageSelected]);\r\n\r\n useEffect(() => {\r\n if (latestImageList.current !== vmImageList) {\r\n // This trigger image list validate that is not triggered by image experience udating image list:\r\n // 1. On first run after render - we should not mark dirty in this case\r\n // 2. When image list is updated externally by ad-preview - we should mark dirty in this case\r\n onImageListUpdated(vmImageList, null, null, previewImagesSharedState.isImageListUpdatedByPreview /* shouldDirty */);\r\n }\r\n }, [onImageListUpdated, previewImagesSharedState.isImageListUpdatedByPreview, vmImageList]);\r\n\r\n const asyncTokenRef = useRef();\r\n\r\n useEffect(() => {\r\n if (vmImageAssets && vmImageAssets.length > 0) {\r\n if (asyncTokenRef.current != null) {\r\n asyncTokenRef.current.cancel();\r\n }\r\n updatePortalContainerState({ imageAssetsLoadPending: true });\r\n asyncTokenRef.current = processImageListModelToViewModel(vmImageAssets, scope.values.cid, scope.values.aid, {\r\n isCombinedMsanAndMmaAspectRatios: !isMultimediaAd,\r\n isLinkedInAd,\r\n isPMaxAspectRatiosV2Enabled,\r\n })\r\n .on({\r\n onSuccess: (loadedImageList) => {\r\n let selectedImageId = null;\r\n if (isMultimediaAd) {\r\n selectedImageId = getDefaultCurrentSelectedImageId(loadedImageList);\r\n }\r\n return onImageListUpdated(loadedImageList, selectedImageId, null, false /* shouldDirty */);\r\n },\r\n onError: () => {\r\n const errorArray = ['Image asset load failure'];\r\n updatePortalContainerState({\r\n imageErrors: errorArray,\r\n logoErrors: errorArray,\r\n imageAssetsLoadFailure: true,\r\n });\r\n updateValidation(errorArray, createImagesVm({ imageList: null, imageListPropName }));\r\n },\r\n });\r\n } else {\r\n onImageListUpdated(vmImageList, null, null, false /* shouldDirty */);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n onImageListUpdated(vmImageList, null, null, false /* shouldDirty */);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [imageAssetsOptional]);\r\n\r\n const onImageEditCancelled = useCallback(() => {\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, cropImageObj: null, editingPlacementType: '' });\r\n }, [previewImagesSharedState, setPreviewImagesSharedState]);\r\n\r\n const onImagePreviewRequested = () => {\r\n };\r\n\r\n const onSaveThumbnailAsDraft = () => {\r\n };\r\n\r\n const vmAssetsInfo = getAssetsFromVm(validationProps.data);\r\n updateFinalUrlStateFromWizardIfChanged(vmAssetsInfo);\r\n\r\n const updateFinalUrl = useCallback((newFinalUrl) => {\r\n // if url is valid then trigger the wizard to update the final url which will trigger this component to update entire state in updateFinalUrlStateFromWizardIfChanged\r\n // if its not valid, just update internal state\r\n if (_.isEmpty(validateAdUrl(newFinalUrl, '', i18n))) {\r\n updateFinalUrlCallback([newFinalUrl]);\r\n } else {\r\n setFinalUrlState({\r\n ...finalUrlState,\r\n ...getInternalFinalUrlStateFromUrl(newFinalUrl),\r\n });\r\n }\r\n }, [updateFinalUrlCallback, i18n, finalUrlState]);\r\n\r\n const onUpdateFinalUrlPrefix = useCallback((ev, newPrefix) => {\r\n const prefixText = newPrefix.text;\r\n const newFinalUrl = prefixText + finalUrlState.internalFinalUrlDest;\r\n updateFinalUrl(newFinalUrl);\r\n }, [finalUrlState.internalFinalUrlDest, updateFinalUrl]);\r\n\r\n const onUpdateFinalUrl = useCallback((ev) => {\r\n const newUrl = ev && ev.target && ev.target.value;\r\n const newFinalUrl = finalUrlState.internalFinalUrlProtocol + newUrl;\r\n updateFinalUrl(newFinalUrl);\r\n }, [finalUrlState.internalFinalUrlProtocol, updateFinalUrl]);\r\n\r\n const oDataConfig = useMemo(() => getODataConfig(serverContext), [serverContext]);\r\n\r\n const legacyI18n = useMemo(() => window.globalLegacyI18n.get('$/i18n!legacy/global'), []);\r\n const i18nMerged = useMemo(() => mergeI18n(legacyI18n, i18n), [legacyI18n, i18n]);\r\n\r\n const mediaRepository = useMemo(() => new MediaRepository({\r\n cid: scope.values.cid,\r\n aid: scope.values.aid,\r\n cmpId: campaignId,\r\n oDataConfig,\r\n }), [scope.values.cid, scope.values.aid, campaignId, oDataConfig]);\r\n\r\n const assetLibraryEventHandler = useAssetLibraryEventHandler(postAssetEventLog);\r\n const finalAssetLibraryEventHandler = useMemo(\r\n () => ({\r\n ...assetLibraryEventHandler,\r\n onUploadImage: (imgId) => {\r\n if (customAssetLibraryEventHandler && customAssetLibraryEventHandler.onUploadImage) {\r\n customAssetLibraryEventHandler.onUploadImage(activity, imgId);\r\n }\r\n },\r\n }),\r\n [activity, assetLibraryEventHandler, customAssetLibraryEventHandler]\r\n );\r\n\r\n const perfMarker = wizardPerfMarker.createChild('PerfMaxImageExperienceWrapper', { autoEnd: true });\r\n return (\r\n <div className={classes.imageExperienceContainer}>\r\n <ImageExperience\r\n i18n={i18nMerged}\r\n cid={scope.values.cid}\r\n aid={scope.values.aid}\r\n odata={odata}\r\n oDataConfig={oDataConfig}\r\n perfMarker={perfMarker}\r\n activityLogger={activity}\r\n permissions={permissions}\r\n imageList={vmImageList}\r\n shortHeadline={vmAssetsInfo.shortHeadline}\r\n longHeadline={vmAssetsInfo.longHeadline}\r\n description={vmAssetsInfo.description}\r\n businessName={vmAssetsInfo.businessName}\r\n url={vmAssetsInfo.displayUrl}\r\n callToAction={vmAssetsInfo.callToAction}\r\n finalUrlProtocol={finalUrlState.internalFinalUrlProtocol}\r\n finalUrl={finalUrlState.internalFinalUrl}\r\n dateFormat={_.get(serverContext, ['CurrentUser', 'CultureDateTimeFormat', 'ShortDatePattern'])}\r\n timeZone={_.get(serverContext, ['CurrentAccount', 'TimeZone'])}\r\n customThumbnailRecord={state.thumbnailRecord}\r\n currentSelectedImageId={state.currentSelectedImageId}\r\n currentSelectedLogoId={state.currentSelectedLogoId}\r\n onImageEditCancelled={onImageEditCancelled}\r\n onImageSelected={onImageSelected}\r\n onImageRemoved={onImageRemoved}\r\n onImageListUpdated={onImageListUpdated}\r\n onImagePreviewRequested={onImagePreviewRequested}\r\n onSaveThumbnailAsDraft={onSaveThumbnailAsDraft}\r\n onUpdateFinalUrlPrefix={onUpdateFinalUrlPrefix}\r\n onUpdateFinalUrl={onUpdateFinalUrl}\r\n isForVNext\r\n isAudienceAd={isAudienceAd}\r\n isMultimediaAdinMSANEnabled={isMultimediaAdinMSANEnabled}\r\n isMultimediaAd={isMultimediaAd}\r\n isMMAV2Enabled={isMMAV2Enabled}\r\n isCombinedMsanAndMmaAspectRatios={isCombinedMsanAndMmaAspectRatios === undefined ? true : isCombinedMsanAndMmaAspectRatios}\r\n isStockPhotoEnabled\r\n isVideo={false}\r\n isBoostPortraitEnabled={isBoostPortraitEnabled}\r\n cropImage={previewImagesSharedState.cropImageObj}\r\n suggestion={recommendationContext && recommendationContext.images && recommendationContext.images.websiteImagesState && recommendationContext.images.websiteImagesState.suggestion}\r\n suggestionPoller={suggestionPoller}\r\n isAdCreatorEnabled\r\n isFinalUrlImageRetrievalEnabled={false}\r\n isLogoEnabled={isLogoEnabled}\r\n mediaRepository={mediaRepository}\r\n setAddNewImageCallback={isCopilotRecommendations ? _.noop : (callback) => { imageExperienceAddImageCalbackRef.current = callback; }}\r\n setAddNewImagesCallback={isCopilotRecommendations ? (callback) => { imageExperienceAddImageCalbackRef.current = callback; } : _.noop}\r\n setOpenAddImageCallback={_.noop}\r\n adCreatorScenario={instrumentationScenarios.default}\r\n onManualCropLogo={() => setState({ ...state, hasManualCroppedLogo: true })}\r\n onManualCropImage={() => setState({ ...state, hasManualCroppedImage: true })}\r\n preferencesService={preferenceService}\r\n imagesPortalContainer={imagesContaineRef.current}\r\n logosPortalContainer={isLogoEnabled && logosContaineRef.current}\r\n portraitPortalContainer={portraitContainerRef && portraitContainerRef.current}\r\n isRenderAddInImageList\r\n customMaxImageCount={customMaxImageCount || PMaxImageExperienceMaxImageCount}\r\n showCopilotOptionForImage={showCopilotOptionForImage}\r\n postAssetEventLog={postAssetEventLog}\r\n assetLibraryEventHandler={finalAssetLibraryEventHandler}\r\n editingPlacementType={previewImagesSharedState.editingPlacementType}\r\n adPreviewConfig={adPreviewConfig}\r\n enableUnifiedAdPreview={UAPLPMaxIntegration}\r\n isMSANBoostEnabled={isMSANBoostEnabled}\r\n isBulkEditMMA={isBulkEditMMA}\r\n isImproveMMA={isImproveMMA}\r\n genericImage={genericImage}\r\n isStockImageEnabled={isStockImageEnabled}\r\n isStoreAppProng={isStoreAppProng}\r\n isStoreAppSpotLight={isStoreAppSpotLight}\r\n isStoreAppTransparentLogo={isStoreAppTransparentLogo}\r\n enableImageListEdit={!isStoreAppProng && !isStoreAppSpotLight && !isStoreAppTransparentLogo}\r\n isUnifiedAppCampaignWindowsStore={isUnifiedAppCampaignWindowsStore}\r\n isLinkedInAd={isLinkedInAd}\r\n customPreviewTexts={customPreviewTexts}\r\n customOnEditImage={customOnEditImage}\r\n customOnSaveEditImage={customOnSaveEditImage}\r\n onRenderAllowedAspectRatioControl={onRenderAllowedAspectRatioControl}\r\n supportImageUpscale={supportImageUpscale}\r\n isImageFittingEnabled={isImageFittingEnabled}\r\n isPMaxAspectRatiosV2Enabled={isPMaxAspectRatiosV2Enabled}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nImageExperienceWrapperInternal.propTypes = {\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n Images: PropTypes.shape({}),\r\n }),\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n DisplayPlusCopilotRecommendations: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n preferenceService: PropTypes.shape({}).isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n updateFinalUrlCallback: PropTypes.func.isRequired,\r\n imagesContaineRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }).isRequired,\r\n logosContaineRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }).isRequired,\r\n portraitContainerRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }),\r\n isBoostPortraitEnabled: PropTypes.bool,\r\n campaignId: PropTypes.string,\r\n imageAssetsOptional: PropTypes.bool,\r\n isLogoEnabled: PropTypes.bool,\r\n previewImagesSharedState: PropTypes.shape({\r\n cropImageObj: PropTypes.shape({}),\r\n isImageListUpdatedByPreview: PropTypes.bool,\r\n editingPlacementType: PropTypes.string,\r\n }).isRequired,\r\n setPreviewImagesSharedState: PropTypes.func.isRequired,\r\n updatePortalContainerState: PropTypes.func.isRequired,\r\n suggestionPoller: PropTypes.shape({\r\n getLandingPageSuggestions: PropTypes.func.isRequired,\r\n cancel: PropTypes.func.isRequired,\r\n }).isRequired,\r\n setImageExperienceAddNewImageCallback: PropTypes.func,\r\n wizardPerfMarker: PropTypes.shape({\r\n createChild: PropTypes.func.isRequired,\r\n }).isRequired,\r\n postAssetEventLog: PropTypes.func,\r\n isCombinedMsanAndMmaAspectRatios: PropTypes.bool,\r\n customMaxImageCount: PropTypes.number,\r\n UAPLPMaxIntegration: PropTypes.bool,\r\n isMSANBoostEnabled: PropTypes.bool,\r\n imageListPropName: PropTypes.string,\r\n isBulkEditMMA: PropTypes.bool,\r\n isImproveMMA: PropTypes.bool,\r\n genericImage: PropTypes.string,\r\n isMultimediaAd: PropTypes.bool,\r\n isMultimediaAdinMSANEnabled: PropTypes.bool,\r\n isCopilotRecommendations: PropTypes.bool,\r\n adPreviewConfig: PropTypes.shape({\r\n adType: PropTypes.string,\r\n placementConfig: PropTypes.arrayOf(PropTypes.shape({})),\r\n extraPlacementInfo: PropTypes.shape({}),\r\n }),\r\n optionalAspectRatio: PropTypes.shape({}),\r\n updateImageListCallback: PropTypes.func,\r\n isStoreAppProng: PropTypes.bool,\r\n isStoreAppSpotLight: PropTypes.bool,\r\n isAd: PropTypes.bool,\r\n isStockImageEnabled: PropTypes.bool,\r\n isStoreAppTransparentLogo: PropTypes.bool,\r\n isMMAV2Enabled: PropTypes.bool,\r\n showCopilotOptionForImage: PropTypes.bool,\r\n customAssetLibraryEventHandler: PropTypes.shape({}),\r\n isLinkedInAd: PropTypes.bool,\r\n customPreviewTexts: PropTypes.shape({}),\r\n customOnEditImage: PropTypes.func,\r\n customOnSaveEditImage: PropTypes.func,\r\n onRenderAllowedAspectRatioControl: PropTypes.func,\r\n isAudienceAd: PropTypes.bool,\r\n supportImageUpscale: PropTypes.bool,\r\n isImageFittingEnabled: PropTypes.bool,\r\n isUnifiedAppCampaignWindowsStore: PropTypes.bool,\r\n isPMaxAspectRatiosV2Enabled: PropTypes.bool,\r\n isAdPreviewRefreshEnabled: PropTypes.bool,\r\n};\r\n\r\nImageExperienceWrapperInternal.defaultProps = {\r\n campaignId: null,\r\n imageAssetsOptional: false,\r\n isLogoEnabled: true,\r\n postAssetEventLog: _.noop,\r\n customMaxImageCount: null,\r\n portraitContainerRef: null,\r\n isBoostPortraitEnabled: false,\r\n UAPLPMaxIntegration: false,\r\n isMSANBoostEnabled: false,\r\n imageListPropName: null,\r\n setImageExperienceAddNewImageCallback: _.noop,\r\n isBulkEditMMA: false,\r\n isImproveMMA: false,\r\n genericImage: null,\r\n isMultimediaAd: false,\r\n isMultimediaAdinMSANEnabled: true,\r\n isCopilotRecommendations: true,\r\n adPreviewConfig: {\r\n adType: AdTypeEnum.pMax,\r\n placementConfig: undefined,\r\n extraPlacementInfo: undefined,\r\n },\r\n optionalAspectRatio: null,\r\n updateImageListCallback: _.noop,\r\n isStoreAppProng: false,\r\n isStoreAppSpotLight: false,\r\n isAd: false,\r\n isStockImageEnabled: true,\r\n isStoreAppTransparentLogo: false,\r\n isMMAV2Enabled: false,\r\n showCopilotOptionForImage: false,\r\n customAssetLibraryEventHandler: null,\r\n isLinkedInAd: false,\r\n customPreviewTexts: undefined,\r\n customOnEditImage: null,\r\n customOnSaveEditImage: null,\r\n onRenderAllowedAspectRatioControl: null,\r\n isAudienceAd: false,\r\n supportImageUpscale: false,\r\n isImageFittingEnabled: false,\r\n isUnifiedAppCampaignWindowsStore: false,\r\n isPMaxAspectRatiosV2Enabled: false,\r\n isAdPreviewRefreshEnabled: false,\r\n};\r\n\r\nexport const ValidatedImageExperienceWrapper = withInstrumentation(withPreference(withCustomValidation(ImageExperienceWrapperInternal)));\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\nimport { useNeedsAttentionForAdapter } from '@bingads-webui-campaign-react/attention-beacon';\r\n\r\nexport const ImageListPortalBeaconAdapter = (WrappedComponent) => {\r\n const HOC = ({\r\n containerState,\r\n isLogos,\r\n validationProps,\r\n attentionBeaconAdapterProps: attentionBeaconAdapterPropsFromProps,\r\n ...restProps\r\n }) => {\r\n const {\r\n imageAssetsLoadFailure,\r\n imageErrors,\r\n logoErrors,\r\n isDirty,\r\n } = containerState;\r\n\r\n const errorMessages = isLogos ? logoErrors : imageErrors;\r\n\r\n const needsAttentionLocal = useMemo(() => {\r\n const showValidationError = (isDirty || validationProps.alwaysShowError) && !_.isEmpty(errorMessages);\r\n return imageAssetsLoadFailure || showValidationError;\r\n }, [errorMessages, imageAssetsLoadFailure, isDirty, validationProps.alwaysShowError]);\r\n\r\n const { attentionBeaconAdapterProps } = useNeedsAttentionForAdapter({ needsAttentionLocal, attentionBeaconAdapterProps: attentionBeaconAdapterPropsFromProps });\r\n\r\n return (\r\n <WrappedComponent\r\n containerState={containerState}\r\n isLogos={isLogos}\r\n validationProps={validationProps}\r\n {...restProps}\r\n {...WrappedComponent.isAttentionBeaconAdapter ? { attentionBeaconAdapterProps } : {}}\r\n />\r\n );\r\n };\r\n\r\n HOC.propTypes = {\r\n isLogos: PropTypes.bool.isRequired,\r\n containerState: PropTypes.shape({\r\n imageAssetsLoadFailure: PropTypes.bool,\r\n imageErrors: PropTypes.arrayOf(PropTypes.string),\r\n logoErrors: PropTypes.arrayOf(PropTypes.string),\r\n isDirty: PropTypes.bool,\r\n }).isRequired,\r\n validationProps: PropTypes.shape({\r\n alwaysShowError: PropTypes.bool,\r\n }),\r\n attentionBeaconAdapterProps: PropTypes.shape({\r\n onAdapterNeedsAttentionChange: PropTypes.func.isRequired,\r\n }).isRequired,\r\n };\r\n\r\n HOC.defaultProps = {\r\n validationProps: {},\r\n };\r\n\r\n hoistNonReactStatics(HOC, WrappedComponent);\r\n HOC.displayName = `ValidationBeaconAdapter(${getDisplayName(WrappedComponent)})`;\r\n HOC.isAttentionBeaconAdapter = true;\r\n\r\n return HOC;\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Loading } from '@bingads-webui-campaign-react/loading';\r\nimport { Alert } from '@bingads-webui-react/alert';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { ErrorMessages } from '@bingads-webui-react/validation';\r\nimport { FocusableActuator } from '@bingads-webui-campaign-react/actuator';\r\nimport { withControlErrorHandling } from '@bingads-webui-campaign-react/error-handling';\r\nimport { withFormError, withAlwaysShowError, codeIs, propertyIs, entityIs } from '@bingads-webui-campaign-react/form-error';\r\nimport { ImageListPortalBeaconAdapter } from './image-list-portal-beacon-adapter';\r\n\r\nimport { getStyles } from './style';\r\n\r\nexport const ImageListPortalContainer = (props) => {\r\n const {\r\n i18n,\r\n containerRef,\r\n containerState,\r\n isLogos,\r\n validationProps,\r\n } = props;\r\n\r\n const {\r\n imageAssetsLoadPending,\r\n imageAssetsLoadFailure,\r\n imageErrors,\r\n logoErrors,\r\n isDirty,\r\n imageListSizeChange,\r\n } = containerState;\r\n\r\n const errorMessages = isLogos ? logoErrors : imageErrors;\r\n const classes = useDefaultStyles(getStyles);\r\n\r\n const ariaAnnounceMessage = useMemo(() => {\r\n if (imageListSizeChange === 0) {\r\n return '';\r\n } else if (imageListSizeChange === 1) {\r\n return i18n.getString(_TL_('One image added'));\r\n } else if (imageListSizeChange === -1) {\r\n return i18n.getString(_TL_('One image removed'));\r\n } else if (imageListSizeChange > 1) {\r\n return i18n.getString(_TL_('{{count}} images added'), { count: imageListSizeChange });\r\n }\r\n\r\n return i18n.getString(_TL_('{{count}} images removed'), { count: Math.abs(imageListSizeChange) });\r\n }, [imageListSizeChange, i18n]);\r\n\r\n\r\n const loadingImagesSpinner = useMemo(() => (\r\n <div className={classes.imageListLoadingContainer}>\r\n <Loading text={i18n.getString(_TL_('Loading assets...'))} isVisible />\r\n </div>\r\n ), [classes.imageListLoadingContainer, i18n]);\r\n\r\n const loadingImageError = useMemo(() => (\r\n <div className={classes.imageListErrorContainer}>\r\n <Alert\r\n message={i18n.getString(_TL_('Cannot continue because image assets failed to load. Please try again or contact customer support.'))}\r\n level=\"Error\"\r\n icon={(<div className=\"alert-image\" />)}\r\n dismissible={false}\r\n />\r\n </div>\r\n ), [classes.imageListErrorContainer, i18n]);\r\n\r\n const imageListContainer = useMemo(() => (\r\n <div className={classes.imageExperienceContainer}>\r\n <div className=\"image-experience-content\" ref={containerRef} />\r\n <span className={classes.ariaAnnounce} aria-live=\"assertive\" role=\"alert\" >{ariaAnnounceMessage}</span>\r\n <ErrorMessages messages={(validationProps.alwaysShowError || isDirty) && errorMessages} />\r\n </div>), [classes.imageExperienceContainer, classes.ariaAnnounce, containerRef, errorMessages, isDirty, validationProps.alwaysShowError, imageListSizeChange]);\r\n\r\n if (imageAssetsLoadPending) {\r\n return loadingImagesSpinner;\r\n }\r\n\r\n if (imageAssetsLoadFailure) {\r\n return loadingImageError;\r\n }\r\n\r\n return imageListContainer;\r\n};\r\n\r\nImageListPortalContainer.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n containerRef: PropTypes.shape({}).isRequired,\r\n containerState: PropTypes.shape({}),\r\n isLogos: PropTypes.bool.isRequired,\r\n validationProps: PropTypes.shape({\r\n alwaysShowError: PropTypes.bool,\r\n }),\r\n};\r\n\r\nImageListPortalContainer.defaultProps = {\r\n containerState: {},\r\n validationProps: {},\r\n};\r\n\r\nexport const ImageListPortalContainerWithControlErrorHandling =\r\n withAlwaysShowError(withControlErrorHandling(ImageListPortalContainer, [FocusableActuator], [ImageListPortalBeaconAdapter]));\r\n\r\n// DuplicateImage should only occure for logo (as it currently lack proper handling for adding duplicate images in some scenarios. This should not occur on image list)\r\nexport const LogoListPortalContainerWithControlErrorHandling =\r\n withFormError(withAlwaysShowError(withControlErrorHandling(ImageListPortalContainer, [FocusableActuator], [ImageListPortalBeaconAdapter])), { filter: entityIs('assetGroup') && propertyIs('Images') && codeIs('DuplicateImage') });\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getImagesFromImagesVm } from './shared';\r\nimport { getSummaryCardStyles } from './style';\r\n\r\nconst MaxThumbnails = 5;\r\n\r\nexport const ImageListSummaryCardDetails = (props) => {\r\n const {\r\n images, isLogos, i18n, isPortrait, videos, isVideos,\r\n } = props;\r\n\r\n const imageList = getImagesFromImagesVm(images);\r\n\r\n let noDataString;\r\n if (isLogos) {\r\n noDataString = _TL_('No logos');\r\n } else if (isVideos) {\r\n noDataString = _TL_('No videos');\r\n } else {\r\n noDataString = _TL_('No images');\r\n }\r\n\r\n const thumbnails = _.reduce(\r\n imageList,\r\n (memo, image) => {\r\n const firstImg = _.first(image);\r\n\r\n if (isPortrait && firstImg.isPortrait) {\r\n return firstImg.isPortrait === isPortrait ? [...memo, firstImg.ThumbnailUrl] : [...memo];\r\n }\r\n return firstImg.isLogo === isLogos ? [...memo, firstImg.ThumbnailUrl] : [...memo];\r\n },\r\n []\r\n );\r\n\r\n const videoThumbnails = videos.map(video => video.thumbnailUrl);\r\n const allThumbnails = [...thumbnails, ...videoThumbnails];\r\n\r\n const moreMediaCount = allThumbnails.length - MaxThumbnails;\r\n const thumbnailsToDisplay = allThumbnails.slice(0, MaxThumbnails);\r\n\r\n const classes = useDefaultStyles(getSummaryCardStyles);\r\n\r\n return (\r\n <div className={classNames('image-list-card-details-container', classes.ImageListCardDetailsContainer)}>\r\n {thumbnailsToDisplay.map(url => (<img src={url} alt=\"\" />))}\r\n {moreMediaCount > 0 && (<span className=\"summary-card-more-text\">{i18n.getString(_TL_('+{{count}} more'), { count: moreMediaCount })}</span>)}\r\n {allThumbnails.length === 0 && (<span className=\"summary-card-empty-text\">{i18n.getString(noDataString)}</span>)}\r\n </div>\r\n );\r\n};\r\n\r\nImageListSummaryCardDetails.propTypes = {\r\n images: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n isLogos: PropTypes.bool.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isPortrait: PropTypes.bool,\r\n isVideos: PropTypes.bool,\r\n videos: PropTypes.arrayOf(PropTypes.shape({\r\n id: PropTypes.number.isRequired,\r\n idString: PropTypes.string.isRequired,\r\n thumbnailUrl: PropTypes.string.isRequired,\r\n })),\r\n};\r\n\r\nImageListSummaryCardDetails.defaultProps = {\r\n isPortrait: false,\r\n isVideos: false,\r\n videos: [],\r\n};\r\n","import React, { useCallback, useMemo, useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { Pivot, PivotItem } from '@fluentui/react';\r\nimport { Tab, TabList } from '@fluentui/react-components';\r\nimport { AdPreviewSurface } from './shared';\r\n\r\nexport const PerfMaxAdPreviewControls = (props) => {\r\n const {\r\n onSurfaceChange,\r\n onPlacementFilterChange,\r\n permissions,\r\n showAdPreviewControlsV2 = false,\r\n } = props;\r\n\r\n const [surfaceChoice, setSurfaceChoice] = useState('Msn');\r\n\r\n const surfaceMap = useMemo(() => {\r\n if (showAdPreviewControlsV2) {\r\n return ({\r\n [AdPreviewSurface.Msn]: ['msan_191x100', 'msan_1x1', 'mma_4x1', 'mma_1x2', 'mma_169x100', 'mma_124x100', 'mma_153x100', 'edge_201x100'],\r\n [AdPreviewSurface.Bing]: ['mma_191x100', 'bing_text'],\r\n [AdPreviewSurface.Outlook]: ['outlook_text_mobile', 'outlook_text_web'],\r\n });\r\n }\r\n return ({\r\n Bing: ['mma_191x100', 'bing_text'],\r\n Msn: ['msan_191x100', 'msan_1x1', 'edge_178x100', 'msan_150x100', 'msan_133x100', 'mma_4x1', 'mma_1x2'],\r\n Edge: ['mma_191x100', 'edge_178x100'],\r\n Outlook: ['outlook_text_mobile', 'outlook_text_web'],\r\n });\r\n }, [showAdPreviewControlsV2]);\r\n\r\n const placementFilterByPreviewControlState = useCallback((placemenet) => {\r\n const { key } = placemenet;\r\n const surfaceList = surfaceMap[surfaceChoice];\r\n\r\n return _.contains(surfaceList, key);\r\n }, [surfaceChoice, surfaceMap]);\r\n\r\n useEffect(() => {\r\n onPlacementFilterChange(placementFilterByPreviewControlState);\r\n }, [onPlacementFilterChange, placementFilterByPreviewControlState]);\r\n\r\n useEffect(() => {\r\n onSurfaceChange(surfaceChoice);\r\n }, [onSurfaceChange, surfaceChoice]);\r\n\r\n return (\r\n <div className=\"ad-preview-controls-container\">\r\n <Pivot onLinkClick={item => setSurfaceChoice(item.props.itemKey)}>\r\n <PivotItem\r\n itemKey=\"Msn\"\r\n headerText={showAdPreviewControlsV2 ? 'MSN' : 'msn.com'}\r\n />\r\n <PivotItem\r\n itemKey=\"Bing\"\r\n headerText=\"Bing Search\"\r\n />\r\n {\r\n !showAdPreviewControlsV2 && (\r\n <PivotItem\r\n itemKey=\"Edge\"\r\n headerText=\"Edge\"\r\n />\r\n )\r\n }\r\n <PivotItem\r\n itemKey=\"Outlook\"\r\n headerText=\"Outlook\"\r\n />\r\n {\r\n permissions && permissions.dynamic.PMaxVideo && (\r\n <PivotItem\r\n itemKey=\"VideoGaming\"\r\n headerText=\"Video Gaming\"\r\n />\r\n )\r\n }\r\n </Pivot>\r\n </div>);\r\n};\r\n\r\nPerfMaxAdPreviewControls.propTypes = {\r\n onSurfaceChange: PropTypes.func.isRequired,\r\n onPlacementFilterChange: PropTypes.func.isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n PMaxVideo: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n showAdPreviewControlsV2: PropTypes.bool,\r\n};\r\n\r\nexport const CustomAdPreviewControls = (props) => {\r\n const {\r\n onSurfaceChange,\r\n onPlacementFilterChange,\r\n customSurfaceKeys,\r\n i18n,\r\n } = props;\r\n\r\n const [surfaceChoice, setSurfaceChoice] = useState(_.keys(customSurfaceKeys)[0]);\r\n\r\n const placementFilterByPreviewControlState = useCallback((placement) => {\r\n const { key } = placement;\r\n const surfaceMap = _.keys(customSurfaceKeys);\r\n\r\n const surfaceList = surfaceMap[surfaceChoice];\r\n\r\n return _.contains(surfaceList, key);\r\n }, [surfaceChoice, customSurfaceKeys]);\r\n\r\n useEffect(() => {\r\n onPlacementFilterChange(placementFilterByPreviewControlState);\r\n }, [onPlacementFilterChange, placementFilterByPreviewControlState]);\r\n\r\n useEffect(() => {\r\n onSurfaceChange(surfaceChoice);\r\n }, [onSurfaceChange, surfaceChoice]);\r\n\r\n return (\r\n <div className=\"ad-preview-controls-container\">\r\n <TabList\r\n size=\"small\"\r\n onTabSelect={(e, item) => setSurfaceChoice(item.value)}\r\n defaultSelectedValue={_.keys(customSurfaceKeys)[0]}\r\n >\r\n {\r\n Object.keys(customSurfaceKeys).map(key => (\r\n <Tab\r\n key={key}\r\n itemKey={key}\r\n value={key}\r\n >\r\n {i18n.getString(customSurfaceKeys[key].title)}\r\n </Tab>\r\n ))\r\n }\r\n </TabList>\r\n </div>\r\n );\r\n};\r\n","import React, { useCallback, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { usePreviewCarouselLayout } from '@bingads-webui-campaign-react/ad-placement-factory';\r\nimport { AdPlacementsGroupType } from '@bingads-webui-campaign-react/ad-placement-consts';\r\nimport { PerfMaxAdPreviewControls } from './ad-preview-controls';\r\nimport previewPlaceholder from '../media/preview-placeholder.png';\r\nimport { getAdPreviewStyles, getCarouselControlsAndIndicatorsStyleBySurface } from './style';\r\nimport { pmaxRequiredAspectRatios } from './shared';\r\n\r\nconst shortHeadlineMaxLength = 40;\r\nconst longHeadlineMaxLength = 90;\r\nconst descriptionMaxLength = 90;\r\n\r\nexport const PerfMaxAdPreview = (props) => {\r\n const {\r\n imageList,\r\n updateImageList,\r\n previewImagesSharedState,\r\n setPreviewImagesSharedState,\r\n isMSANAd,\r\n enableAutoPlay,\r\n placementCustomizationPredicate,\r\n adPlacementsGroupType = AdPlacementsGroupType.perfMax,\r\n hideHeaderButtons,\r\n isAppCampaignPreview,\r\n } = props;\r\n\r\n const adDataProps = ['shortHeadline', 'longHeadline', 'description', 'url', 'displayUrl', 'callToAction', 'businessName'];\r\n const currentAdData = _.pick(props, adDataProps);\r\n const [adData, setAdData] = React.useState(currentAdData);\r\n\r\n const isAdDataUpdated = useCallback(newAdData => (newAdData.length !== adData.length || !_.isMatch(newAdData, adData)), [adData]);\r\n const debouncedSetAdData = useMemo(() => _.debounce(setAdData, 500), []);\r\n if (isAdDataUpdated(currentAdData)) {\r\n debouncedSetAdData.cancel();\r\n debouncedSetAdData(currentAdData);\r\n }\r\n\r\n const getImageIndexFromId = useCallback((id) => {\r\n const index = _.findIndex(imageList, placement => _.first(placement).id === id && !_.first(placement).isLogo && !_.first(placement).isPortrait);\r\n return index >= 0 ? index : null;\r\n }, [imageList]);\r\n\r\n const getPreviewImageIndex = useCallback((idRequestedByImageExperience) => {\r\n let index = getImageIndexFromId(idRequestedByImageExperience);\r\n\r\n if (!index) {\r\n const firstImageIndex = _.findIndex(imageList, placement => !_.first(placement).isLogo && !_.first(placement).isPortrait);\r\n index = firstImageIndex >= 0 ? firstImageIndex : null;\r\n }\r\n\r\n return index;\r\n }, [getImageIndexFromId, imageList]);\r\n\r\n const { previewImageId } = previewImagesSharedState;\r\n\r\n let imagesToDisplay = [];\r\n let previewImageIndex = null;\r\n if (imageList && isAppCampaignPreview) {\r\n // for app campaign, always send all images for preview\r\n imagesToDisplay = imageList.flat();\r\n } else if (imageList && imageList.length > 0) {\r\n previewImageIndex = getPreviewImageIndex(previewImageId);\r\n imagesToDisplay = _.isNumber(previewImageIndex) ? imageList[previewImageIndex] : [];\r\n }\r\n\r\n const canExcludeAspectRatio = useCallback((typeToCheck) => {\r\n const minCount = pmaxRequiredAspectRatios[typeToCheck];\r\n if (!minCount) {\r\n return true;\r\n }\r\n\r\n let typeCount = 0;\r\n _.each(imageList, imageArray =>\r\n _.each(imageArray, (imageObj) => {\r\n if (imageObj.isIncluded && typeToCheck === imageObj.type) {\r\n typeCount += 1;\r\n }\r\n }));\r\n\r\n return (typeCount - 1) >= minCount;\r\n }, [imageList]);\r\n\r\n const getIsRequiredByIndex = useCallback((index, template) => {\r\n const { type } = template;\r\n return !canExcludeAspectRatio(type);\r\n }, [canExcludeAspectRatio]);\r\n\r\n const onAddAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = true;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onRemoveAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = false;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onEdit = useCallback((type) => {\r\n const cropImageObj = _.find(imageList[previewImageIndex], imagePlacement => imagePlacement.type === type);\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, cropImageObj });\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState]);\r\n\r\n const truncatedAdData = useMemo(() => {\r\n const validAdData = { ...adData };\r\n\r\n if (validAdData.shortHeadline && validAdData.shortHeadline.length > shortHeadlineMaxLength) {\r\n validAdData.shortHeadline = validAdData.shortHeadline.substring(0, shortHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.longHeadline && validAdData.longHeadline.length > longHeadlineMaxLength) {\r\n validAdData.longHeadline = validAdData.longHeadline.substring(0, longHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.description && validAdData.description.length > descriptionMaxLength) {\r\n validAdData.description = validAdData.description.substring(0, descriptionMaxLength - 1);\r\n }\r\n\r\n return validAdData;\r\n }, [adData]);\r\n\r\n const [placementFilter, setPlacementFilter] = useState({ func: () => true });\r\n\r\n const getFirstElement = useCallback((item) => {\r\n if (_.isArray(item)) {\r\n return _.first(item);\r\n }\r\n return item;\r\n }, []);\r\n\r\n const getLogo = useCallback(() => {\r\n const logos = _.filter(imageList, imageArr =>\r\n getFirstElement(imageArr).isLogo === true);\r\n\r\n return _.first(logos);\r\n }, [getFirstElement, imageList]);\r\n\r\n const { PreviewCarouselLayout } = usePreviewCarouselLayout({\r\n groupType: adPlacementsGroupType,\r\n placementFilterPredicate: placementFilter.func,\r\n customDefaultImage: previewPlaceholder,\r\n placementCustomizationPredicate: placementCustomizationPredicate || null,\r\n });\r\n\r\n const classes = useDefaultStyles(getAdPreviewStyles);\r\n const [surfaceChoice, setSurfaceChoice] = useState({});\r\n const styleOverrides = useMemo(() => getCarouselControlsAndIndicatorsStyleBySurface(surfaceChoice), [surfaceChoice]);\r\n\r\n const onPlacementFilterChange = useCallback((newPlacementFilter) => {\r\n setPlacementFilter({ func: newPlacementFilter });\r\n }, []);\r\n\r\n return (\r\n <div className={classes.adPreviewContainer}>\r\n {!isMSANAd &&\r\n <PerfMaxAdPreviewControls onSurfaceChange={setSurfaceChoice} onPlacementFilterChange={onPlacementFilterChange} />}\r\n <PreviewCarouselLayout\r\n imagesToDisplay={imagesToDisplay}\r\n logo={_.find(getLogo(), logo => logo.isIncluded)}\r\n headerButtonProps={{\r\n onAddAspectRatio,\r\n onRemoveAspectRatio,\r\n onEdit,\r\n }}\r\n adData={truncatedAdData}\r\n getIsRequiredByIndex={getIsRequiredByIndex}\r\n enableAutoPlay={_.isNull(enableAutoPlay) ? isMSANAd : enableAutoPlay}\r\n styleOverrides={styleOverrides}\r\n hideHeaderButtons={hideHeaderButtons}\r\n />\r\n </div>);\r\n};\r\n\r\nPerfMaxAdPreview.propTypes = {\r\n imageList: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))),\r\n updateImageList: PropTypes.func.isRequired,\r\n previewImagesSharedState: PropTypes.shape({\r\n previewImageId: PropTypes.shape({}),\r\n }).isRequired,\r\n setPreviewImagesSharedState: PropTypes.func.isRequired,\r\n isMSANAd: PropTypes.bool,\r\n enableAutoPlay: PropTypes.bool,\r\n placementCustomizationPredicate: PropTypes.func,\r\n adPlacementsGroupType: PropTypes.string,\r\n hideHeaderButtons: PropTypes.bool,\r\n isAppCampaignPreview: PropTypes.bool,\r\n};\r\n\r\nPerfMaxAdPreview.defaultProps = {\r\n imageList: null,\r\n isMSANAd: false,\r\n enableAutoPlay: null,\r\n placementCustomizationPredicate: null,\r\n adPlacementsGroupType: AdPlacementsGroupType.perfMax,\r\n hideHeaderButtons: false,\r\n isAppCampaignPreview: false,\r\n};\r\n","import classNames from 'classnames';\r\nimport React, { useCallback, useEffect, useMemo, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { DefaultButton } from '@bingads-webui-react/fabric-control';\r\nimport {\r\n UAPPlacementTypeAlias as EPT,\r\n useImageExperienceAdPreviewModel,\r\n AdPreviewCarouselLayoutEx,\r\n UAPAdExtensionType as EAdExtensionType,\r\n AdPreviewAdExtensionComponents,\r\n} from '@bingads-webui-campaign-react/unified-ad-preview-library-cmui';\r\nimport { PerfMaxAdPreviewControls } from './ad-preview-controls';\r\nimport previewPlaceholder from '../media/preview-placeholder.png';\r\nimport { getAdPreviewStyles } from './style';\r\nimport {\r\n pmaxRequiredAspectRatios,\r\n audienceMMAV2RequiredAspectRatios,\r\n adPreviewConfig as PMaxAdPreviewConfig,\r\n adPreviewConfigV2 as PMaxAdPreviewConfigV2,\r\n adPreviewConfigV3 as PMaxAdPreviewConfigV3,\r\n} from './shared';\r\n\r\nconst shortHeadlineMaxLength = 40;\r\nconst longHeadlineMaxLength = 90;\r\nconst descriptionMaxLength = 90;\r\n\r\nconst getPMaxExtraPlacementInfo = hasLogo => ({\r\n [EPT.PMax.AudienceWideImage]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('MSN feed'),\r\n },\r\n [EPT.PMax.MSEdgeSingleCarousel]: {\r\n aspectRatioUIString: '1.78:1',\r\n previewTitle: _TL_('Microsoft Edge single carousel'),\r\n },\r\n [EPT.PMax.MSNInArticle]: {\r\n aspectRatioUIString: '1.5:1',\r\n previewTitle: _TL_('MSN in-article ad'),\r\n },\r\n [EPT.PMax.AudienceSquareImage]: {\r\n aspectRatioUIString: '1:1',\r\n previewTitle: _TL_('MSN square image'),\r\n },\r\n [EPT.PMax.MSNSmallHeadline]: {\r\n aspectRatioUIString: '1.33:1',\r\n previewTitle: _TL_('MSN small headline'),\r\n },\r\n [EPT.PMax.MMAWideImage]: {\r\n aspectRatioUIString: '4:1',\r\n previewTitle: _TL_('Wide image'),\r\n },\r\n [EPT.PMax.MMAVerticalImage]: {\r\n aspectRatioUIString: '1:2',\r\n previewTitle: _TL_('Vertical image'),\r\n },\r\n [EPT.PMax.MMALandscapeImage]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('Landscape Image Multimedia Ad'),\r\n hasLogo,\r\n },\r\n [EPT.BingSearch.Text]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Bing search ad'),\r\n hasLogo,\r\n },\r\n [EPT.Outlook.Mobile]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (mobile)'),\r\n hasLogo,\r\n },\r\n [EPT.Outlook.Web]: {\r\n aspectRatioUIString: '',\r\n previewTitle: _TL_('Microsoft Outlook web (computer)'),\r\n hasLogo,\r\n },\r\n [EPT.PMax.MMAV2MSEdgeCarousel]: {\r\n aspectRatioUIString: '2.01:1',\r\n previewTitle: _TL_('Microsoft Edge carousel'),\r\n },\r\n [EPT.PMax.MMAV2MSNSingleCarousel]: {\r\n aspectRatioUIString: '1.69:1',\r\n previewTitle: _TL_('MSN Single Carousel'),\r\n },\r\n [EPT.PMax.MMAV2MSNRestoday]: {\r\n aspectRatioUIString: '1.24:1',\r\n previewTitle: _TL_('MSN Restoday'),\r\n },\r\n [EPT.PMax.MMAV2MSNPartnerStripe]: {\r\n aspectRatioUIString: '1.53:1',\r\n previewTitle: _TL_('MSN Partner Stripe'),\r\n },\r\n [EPT.PMax.MMAV2MSNRiver]: {\r\n aspectRatioUIString: '1.91:1',\r\n previewTitle: _TL_('MSN feed'),\r\n hasLogo,\r\n },\r\n [EPT.PMax.MSEdgeMobile]: {\r\n aspectRatioUIString: '1:1',\r\n previewTitle: _TL_('Microsoft Edge mobile'),\r\n hasLogo,\r\n },\r\n});\r\n\r\nconst AdExtensionTypes = [\r\n EAdExtensionType.SiteLink,\r\n EAdExtensionType.Callout,\r\n EAdExtensionType.Promotion,\r\n EAdExtensionType.StructuredSnippet,\r\n EAdExtensionType.Price,\r\n];\r\n\r\nexport const getExtensionData = (extensions, extensionType, extensionFormatters) => {\r\n switch (extensionType) {\r\n case EAdExtensionType.SiteLink: {\r\n const siteLinks = _.result(extensions, EAdExtensionType.SiteLink, []).slice(0, 4); // only show 4 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.SiteLink])) {\r\n return siteLinks.map(siteLink => extensionFormatters[EAdExtensionType.SiteLink](siteLink));\r\n }\r\n return siteLinks;\r\n }\r\n case EAdExtensionType.Callout: {\r\n const callOuts = _.result(extensions, EAdExtensionType.Callout, []).slice(0, 4); // only show 4 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Callout])) {\r\n return callOuts.map(callOut => extensionFormatters[EAdExtensionType.Callout](callOut));\r\n }\r\n return callOuts;\r\n }\r\n case EAdExtensionType.Promotion: {\r\n const promotions = _.result(extensions, EAdExtensionType.Promotion, []).slice(0, 1); // only show 1 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Promotion])) {\r\n return promotions.map(promotion => extensionFormatters[EAdExtensionType.Promotion](promotion));\r\n }\r\n return promotions;\r\n }\r\n case EAdExtensionType.StructuredSnippet: {\r\n const structuredSnippets = _.result(extensions, EAdExtensionType.StructuredSnippet, []).slice(0, 1).map(({ Category, Texts }) => ({\r\n Category,\r\n Texts: Texts.slice(0, 3),\r\n })); // only show 3 values at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.StructuredSnippet])) {\r\n return structuredSnippets.map(structuredSnippet => extensionFormatters[EAdExtensionType.StructuredSnippet](structuredSnippet));\r\n }\r\n return structuredSnippets;\r\n }\r\n case EAdExtensionType.Price: {\r\n const prices = _.result(extensions, EAdExtensionType.Price, []).reduce((acc, { TableRows }) => [...acc, ...TableRows], []).slice(0, 8); // only show 8 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Price])) {\r\n return prices.map(price => extensionFormatters[EAdExtensionType.Price](price));\r\n }\r\n return prices;\r\n }\r\n default:\r\n return [];\r\n }\r\n};\r\n\r\nexport const PerfMaxAdPreview = (props) => {\r\n const {\r\n extraPlacementInfo: extraPlacementInfoProp,\r\n imageList,\r\n updateImageList,\r\n previewImagesSharedState,\r\n setPreviewImagesSharedState,\r\n isMSANAd,\r\n enableAutoPlay,\r\n i18n,\r\n logoPreviewEnabled,\r\n customPlacementContainerClassName,\r\n customPlacementHeaderClassName,\r\n isAdExtensionPreviewEnabled,\r\n extensionsAssociations,\r\n extensionFormatters,\r\n isMMAV2Enabled,\r\n isImageFittingEnabled,\r\n activity,\r\n isPMaxAspectRatiosV2Enabled,\r\n isAdPreviewRefreshEnabled,\r\n hotspots,\r\n } = props;\r\n let { adPreviewConfig } = props;\r\n\r\n if (adPreviewConfig === undefined) {\r\n const refreshPmaxAdPreviewConfig = isAdPreviewRefreshEnabled ? PMaxAdPreviewConfigV3 : PMaxAdPreviewConfigV2;\r\n adPreviewConfig = isPMaxAspectRatiosV2Enabled ? refreshPmaxAdPreviewConfig : PMaxAdPreviewConfig;\r\n }\r\n\r\n const extraPlacementInfo = useMemo(() => {\r\n if (extraPlacementInfoProp) {\r\n return extraPlacementInfoProp;\r\n }\r\n return getPMaxExtraPlacementInfo(logoPreviewEnabled);\r\n }, [extraPlacementInfoProp, logoPreviewEnabled]);\r\n\r\n const hasSurfaceChoicePivot = !isMSANAd;\r\n\r\n const adDataProps = ['shortHeadline', 'longHeadline', 'description', 'url', 'displayUrl', 'callToAction', 'businessName'];\r\n const currentAdData = _.pick(props, adDataProps);\r\n const [adData, setAdData] = React.useState(currentAdData);\r\n\r\n const isAdDataUpdated = useCallback(newAdData => (newAdData.length !== adData.length || !_.isMatch(newAdData, adData)), [adData]);\r\n const debouncedSetAdData = useMemo(() => _.debounce(setAdData, 500), []);\r\n if (isAdDataUpdated(currentAdData)) {\r\n debouncedSetAdData.cancel();\r\n debouncedSetAdData(currentAdData);\r\n }\r\n\r\n const getImageIndexFromId = useCallback((id) => {\r\n const index = _.findIndex(imageList, placement => _.first(placement).id === id && !_.first(placement).isLogo && !_.first(placement).isPortrait);\r\n return index >= 0 ? index : null;\r\n }, [imageList]);\r\n\r\n const getPreviewImageIndex = useCallback((idRequestedByImageExperience) => {\r\n let index = getImageIndexFromId(idRequestedByImageExperience);\r\n\r\n if (!index) {\r\n const firstImageIndex = _.findIndex(imageList, placement => !_.first(placement).isLogo);\r\n index = firstImageIndex >= 0 ? firstImageIndex : null;\r\n }\r\n\r\n return index;\r\n }, [getImageIndexFromId, imageList]);\r\n\r\n const { previewImageId, previewLogoId } = previewImagesSharedState;\r\n\r\n let previewImageIndex = null;\r\n if (imageList && imageList.length > 0) {\r\n previewImageIndex = getPreviewImageIndex(previewImageId);\r\n }\r\n\r\n const requiredAspectRatios = isMMAV2Enabled ? audienceMMAV2RequiredAspectRatios : pmaxRequiredAspectRatios;\r\n const canExcludeAspectRatio = useCallback((typeToCheck) => {\r\n const minCount = requiredAspectRatios[typeToCheck];\r\n if (!minCount) {\r\n return true;\r\n }\r\n\r\n let typeCount = 0;\r\n _.each(imageList, imageArray =>\r\n _.each(imageArray, (imageObj) => {\r\n if (imageObj.isIncluded && typeToCheck === imageObj.type) {\r\n typeCount += 1;\r\n }\r\n }));\r\n\r\n return (typeCount - 1) >= minCount;\r\n }, [imageList]);\r\n\r\n const onAddAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = true;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true, editingPlacementType: '' });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onRemoveAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = false;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true, editingPlacementType: '' });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onEdit = useCallback((type, placementType) => {\r\n if (activity && activity.signal) {\r\n activity.signal(`Perf max ad preview: re-crop clicked, isMSANAd:${isMSANAd}, type:${type}`);\r\n }\r\n const cropImageObj = _.find(imageList[previewImageIndex], imagePlacement => imagePlacement.type === type);\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, cropImageObj, editingPlacementType: placementType });\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState]);\r\n\r\n const truncatedAdData = useMemo(() => {\r\n const validAdData = { ...adData };\r\n\r\n if (validAdData.shortHeadline && validAdData.shortHeadline.length > shortHeadlineMaxLength) {\r\n validAdData.shortHeadline = validAdData.shortHeadline.substring(0, shortHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.longHeadline && validAdData.longHeadline.length > longHeadlineMaxLength) {\r\n validAdData.longHeadline = validAdData.longHeadline.substring(0, longHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.description && validAdData.description.length > descriptionMaxLength) {\r\n validAdData.description = validAdData.description.substring(0, descriptionMaxLength - 1);\r\n }\r\n\r\n return _.defaults(validAdData, {\r\n shortHeadline: i18n.getString(_TL_('Short headline')),\r\n longHeadline: i18n.getString(_TL_('Long headline')),\r\n description: i18n.getString(_TL_('Ad text')),\r\n businessName: i18n.getString(_TL_('Business name')),\r\n callToAction: i18n.getString(_TL_('Please select language first')),\r\n url: 'https://example.com',\r\n });\r\n }, [adData, i18n]);\r\n\r\n const classes = useDefaultStyles(getAdPreviewStyles);\r\n const [surfaceChoice, setSurfaceChoice] = useState({});\r\n // use extensionCount and extensionRerenderFlag to force rerender when extension count decreases\r\n const extensionCount = useRef(0);\r\n const [extensionRerenderFlag, setExtensionRerenderFlag] = useState(0);\r\n\r\n const {\r\n onUpdateImageExperienceImageList,\r\n imageExperiencePlacementSets: placementSets,\r\n } = useImageExperienceAdPreviewModel(adPreviewConfig, previewPlaceholder, isImageFittingEnabled);\r\n\r\n useEffect(() => {\r\n // get correct image index fitler out logo\r\n const imageListWithoutLogo = _.compact(_.map(imageList, (placementList) => {\r\n const placements = _.filter(placementList, placement => !placement.isLogo && !placement.isPortrait);\r\n return !_.isEmpty(placements) ? placements : null;\r\n })) || [];\r\n\r\n // get current preview image\r\n const imageToPreview = _.find(imageListWithoutLogo, (placementList) => {\r\n const {\r\n id, idString, baseId, baseImage,\r\n } = _.first(placementList) || {};\r\n const { id: baseImageId, idString: baseImageIdString } = baseImage || {};\r\n return id === previewImageId || idString === previewImageId || baseId === previewImageId || baseImageId === previewImageId || baseImageIdString === previewImageId;\r\n }) || imageListWithoutLogo[0];\r\n\r\n _.debounce(onUpdateImageExperienceImageList, 100)([imageToPreview], null);\r\n // !! when *previewImageSharedState* changes update the image list, this component relies on in-place updates to imageList\r\n }, [previewImagesSharedState, imageList, onUpdateImageExperienceImageList, previewImageId]);\r\n\r\n const curPlacementList = useMemo(() => {\r\n const { placementList: pl } = _.find(placementSets, ({ placementSetName }) => !hasSurfaceChoicePivot || placementSetName === surfaceChoice) || {};\r\n if (isAdExtensionPreviewEnabled && surfaceChoice === 'Bing') {\r\n const bingSearchAdPlacement = _.find(pl, ({ placementMeta }) => placementMeta.placementType === EPT.BingSearch.Text);\r\n // extend the placement list to add new placements for ad extensions\r\n if (bingSearchAdPlacement) {\r\n const placementListWithExtensions = [\r\n ...pl,\r\n // add additional property to identity the extension type to render\r\n ...AdExtensionTypes.reduce((pls, adExtensionType) => {\r\n if (_.has(extensionsAssociations, adExtensionType) && extensionsAssociations[adExtensionType].length > 0) {\r\n pls.push({ ...bingSearchAdPlacement, adExtensionType });\r\n }\r\n return pls;\r\n }, []),\r\n ];\r\n const preExtensionCount = extensionCount.current;\r\n extensionCount.current = placementListWithExtensions.length - pl.length;\r\n if (preExtensionCount > extensionCount.current) {\r\n setExtensionRerenderFlag(prevState => (prevState + 1) % 1000);\r\n }\r\n return placementListWithExtensions;\r\n }\r\n }\r\n return pl;\r\n }, [extensionsAssociations, hasSurfaceChoicePivot, isAdExtensionPreviewEnabled, placementSets, surfaceChoice]);\r\n\r\n const isSizeValid = useCallback((placement) => {\r\n const { placementMeta, imageMeta } = placement || {};\r\n const { minSize } = placementMeta || {};\r\n const [minWidth, minHeight] = minSize || [];\r\n const { width, height } = imageMeta || {};\r\n return width >= minWidth && height >= minHeight;\r\n }, []);\r\n\r\n const getFirstElement = useCallback((item) => {\r\n if (_.isArray(item)) {\r\n return _.first(item);\r\n }\r\n return item;\r\n }, []);\r\n\r\n const curPreviewLogo = useMemo(() => {\r\n const allLogos = _.filter(imageList, imageArr => getFirstElement(imageArr).isLogo === true);\r\n let curLogos = previewLogoId && _.find(allLogos, logo => _.first(logo).Id === previewLogoId);\r\n curLogos = curLogos || _.first(allLogos);\r\n\r\n // currently only square logo is supported, 4x1 logo are ignored\r\n const curLogoRatio = _.find(curLogos, logo => logo.isIncluded === true && logo.type === 'Image1x1');\r\n return curLogoRatio;\r\n }, [getFirstElement, imageList, previewLogoId]);\r\n\r\n const renderAdExtensionPreivew = useCallback((placement, adExtensionType) => {\r\n const AdExtensionPreviewComponent = AdPreviewAdExtensionComponents[adExtensionType];\r\n if (AdExtensionPreviewComponent) {\r\n return <AdExtensionPreviewComponent {...placement} extensionData={getExtensionData(extensionsAssociations, adExtensionType, extensionFormatters)} />;\r\n }\r\n return null;\r\n }, [extensionFormatters, extensionsAssociations]);\r\n\r\n const onRenderPlacement = useCallback((placement, AdPlacementComponent) => {\r\n const {\r\n placementMeta, imageMeta, hasImageExperienceData, adExtensionType,\r\n } = placement || {};\r\n const isPlaceholderImage = imageMeta && (imageMeta.url === previewPlaceholder);\r\n const { minSize, placementType } = placementMeta || {};\r\n const [minWidth, minHeight] = minSize || [];\r\n const isValid = isSizeValid(placement);\r\n const {\r\n hasLogo, customClassName, imagePreviewHeight, previewTitle, disclaimerMessage,\r\n } = extraPlacementInfo[placementType] || {};\r\n\r\n return (\r\n <div className={classNames(customPlacementContainerClassName || classes.placementContainerClassName)}>\r\n {hasImageExperienceData && !isValid &&\r\n <span className=\"placement-validation-message action-label\">\r\n {\r\n i18n.getString(_TL_('To include this aspect ratio, add a new image that is at least {{width}} x {{height}} pixels.'), {\r\n width: minWidth,\r\n height: minHeight,\r\n })\r\n }\r\n </span>\r\n }\r\n <AdPlacementComponent\r\n isEnabled={!!placement.isPlacementIncluded && isValid && !isPlaceholderImage}\r\n placementData={placement}\r\n {...truncatedAdData}\r\n finalUrl={truncatedAdData.url}\r\n i18n={i18n}\r\n logo={hasLogo && curPreviewLogo}\r\n hotspots={hotspots}\r\n customClassName={customClassName || undefined}\r\n imagePreviewHeight={imagePreviewHeight || undefined}\r\n adExtensionContainerClassName={classes.adExtensionContainer}\r\n >\r\n {adExtensionType && renderAdExtensionPreivew(placement, adExtensionType)}\r\n </AdPlacementComponent>\r\n {isMSANAd && previewTitle && (\r\n <div className=\"preview-string\">{i18n.getString(previewTitle)}</div>\r\n )}\r\n {isMSANAd && disclaimerMessage && (\r\n <div className=\"additional-disclaimer-message\">{i18n.getString(disclaimerMessage)}</div>\r\n )}\r\n </div>\r\n );\r\n }, [classes.adExtensionContainer, classes.placementContainerClassName, curPreviewLogo, customPlacementContainerClassName, extraPlacementInfo, i18n, isMSANAd, isSizeValid, renderAdExtensionPreivew, truncatedAdData]);\r\n\r\n const onRenderCarouselHeader = useCallback((placement) => {\r\n const { placementMeta, isPlacementIncluded, hasImageExperienceData } = placement || {};\r\n const { imageType, placementType } = placementMeta || {};\r\n if (!placementType) {\r\n return null;\r\n }\r\n const canBeExcluded = canExcludeAspectRatio(imageType);\r\n const {\r\n aspectRatioUIString, previewTitle, previewHeaderTitle, hideHeaderButtons = false,\r\n } = extraPlacementInfo[placementMeta.placementType] || {};\r\n const isValid = isSizeValid(placement);\r\n return (\r\n <div className={classNames(classes.carouselLayoutHeader, customPlacementHeaderClassName)}>\r\n {isMSANAd ? (\r\n <div className=\"ad-preview-title\" >\r\n <span className=\"preview-title-string-key\">{previewHeaderTitle ? i18n.getString(previewHeaderTitle) : i18n.getString(previewTitle)}</span>\r\n </div>\r\n ) : (\r\n <div className=\"carousel-header-texts\">\r\n <span className=\"carousel-header-ratio\">{aspectRatioUIString}</span>\r\n <span className=\"carousel-header-title\">{i18n.getString(previewTitle)}</span>\r\n </div>\r\n )}\r\n {hasImageExperienceData && isValid && !hideHeaderButtons && (\r\n <div className=\"ad-preview-actions\">\r\n {isPlacementIncluded && <DefaultButton className=\"crop-image-button\" onClick={() => onEdit(imageType, placementType)} text={i18n.getString(_TL_('Edit aspect ratio'))} />}\r\n {isPlacementIncluded && <DefaultButton className=\"exclude-aspect-ratio-button\" onClick={() => onRemoveAspectRatio(imageType)} text={i18n.getString(_TL_('Exclude'))} disabled={!canBeExcluded} />}\r\n {!isPlacementIncluded && <DefaultButton className=\"include-aspect-ratio-button\" onClick={() => onAddAspectRatio(imageType)} text={i18n.getString(_TL_('Include'))} />}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }, [canExcludeAspectRatio, classes.carouselLayoutHeader, customPlacementHeaderClassName, extraPlacementInfo, i18n, isMSANAd, isSizeValid, onAddAspectRatio, onEdit, onRemoveAspectRatio]);\r\n\r\n const carouselLayoutClassName = useMemo(() => classNames(\r\n classes.carouselLayoutClassName,\r\n surfaceChoice === 'Msn' ? classes.carouselControlsMsn : classes.carouselControlsOthers\r\n ), [classes, surfaceChoice]);\r\n\r\n return (\r\n <div className={classes.adPreviewContainer}>\r\n {hasSurfaceChoicePivot &&\r\n <PerfMaxAdPreviewControls onSurfaceChange={setSurfaceChoice} onPlacementFilterChange={_.noop} />}\r\n <AdPreviewCarouselLayoutEx\r\n placementList={curPlacementList}\r\n onRenderPlacement={onRenderPlacement}\r\n onRenderHeader={onRenderCarouselHeader}\r\n enableAutoPlay={_.isNull(enableAutoPlay) ? isMSANAd : enableAutoPlay}\r\n i18n={i18n}\r\n useCustomCarousel={isAdExtensionPreviewEnabled}\r\n customCarouselRootClassName={isAdExtensionPreviewEnabled ? classes.customCarouselRoot : carouselLayoutClassName}\r\n resetOn={`${surfaceChoice}-${extensionRerenderFlag}`}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nPerfMaxAdPreview.propTypes = {\r\n adPreviewConfig: PropTypes.arrayOf(PropTypes.shape({})),\r\n extraPlacementInfo: PropTypes.shape({}),\r\n imageList: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))),\r\n updateImageList: PropTypes.func.isRequired,\r\n previewImagesSharedState: PropTypes.shape({\r\n previewImageId: PropTypes.string,\r\n previewLogoId: PropTypes.string,\r\n }).isRequired,\r\n setPreviewImagesSharedState: PropTypes.func.isRequired,\r\n isMSANAd: PropTypes.bool,\r\n enableAutoPlay: PropTypes.bool,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n logoPreviewEnabled: PropTypes.bool,\r\n customPlacementContainerClassName: PropTypes.string,\r\n customPlacementHeaderClassName: PropTypes.string,\r\n isAdExtensionPreviewEnabled: PropTypes.bool,\r\n extensionsAssociations: PropTypes.shape({}),\r\n extensionFormatters: PropTypes.shape({}),\r\n isMMAV2Enabled: PropTypes.bool,\r\n isImageFittingEnabled: PropTypes.bool,\r\n activity: PropTypes.shape({}),\r\n isPMaxAspectRatiosV2Enabled: PropTypes.bool,\r\n isAdPreviewRefreshEnabled: PropTypes.bool,\r\n};\r\n\r\nPerfMaxAdPreview.defaultProps = {\r\n adPreviewConfig: undefined,\r\n extraPlacementInfo: undefined,\r\n imageList: null,\r\n isMSANAd: false,\r\n enableAutoPlay: null,\r\n logoPreviewEnabled: false,\r\n customPlacementContainerClassName: undefined,\r\n customPlacementHeaderClassName: undefined,\r\n isAdExtensionPreviewEnabled: false,\r\n extensionsAssociations: {},\r\n extensionFormatters: {},\r\n isMMAV2Enabled: false,\r\n isImageFittingEnabled: false,\r\n activity: undefined,\r\n isPMaxAspectRatiosV2Enabled: false,\r\n isAdPreviewRefreshEnabled: false,\r\n};\r\n","import { AdPreviewOverideStylesByKey } from './shared';\r\n\r\nconst IndicatorWidth = 10;\r\nconst IndicatorsGap = 8;\r\n\r\nconst getIndicatorsWidth = placements => (placements * IndicatorWidth) + ((placements - 1) * IndicatorsGap);\r\n\r\nexport const getAdAssetsPreviewStyles = () => ({\r\n container: {\r\n position: 'sticky',\r\n top: '0',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: '8px',\r\n width: 'fit-content',\r\n maxWidth: '100%',\r\n\r\n '& .auto-height': {\r\n '& .carousel-inner': {\r\n height: 'auto !important',\r\n },\r\n },\r\n '& .new-preview-carousel-container-adprelib': {\r\n backgroundColor: '#ffffff',\r\n border: 'none',\r\n borderRadius: '4px',\r\n boxShadow: '0px 2px 4px 0px rgba(0, 0, 0, 0.10)',\r\n maxWidth: '420px',\r\n minWidth: 'unset !important',\r\n\r\n '& .ad-placement-card-preview.mma_191x100': {\r\n '& .card-parent': {\r\n maxWidth: AdPreviewOverideStylesByKey.mma_191x100.imagePreviewWidth,\r\n '& .text-container': {\r\n padding: '5px 12px 12px 12px',\r\n '& .short-headline': {\r\n wordWrap: 'break-word',\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .ad-placement-card-preview.edge_178x100': {\r\n '& .card-parent': {\r\n '& .placement-card-content': {\r\n height: 'fit-content',\r\n width: 'fit-content',\r\n maxWidth: '100%',\r\n '& .text-container': {\r\n maxWidth: 'calc(100% - 25px)',\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .ad-placement-card-preview.msan_191x100': {\r\n '& .card-parent': {\r\n maxWidth: AdPreviewOverideStylesByKey.msan_191x100.imagePreviewWidth,\r\n },\r\n },\r\n\r\n '& .ad-placement-card-preview.msan_150x100': {\r\n '& .card-parent': {\r\n maxWidth: AdPreviewOverideStylesByKey.msan_150x100.imagePreviewWidth,\r\n },\r\n },\r\n\r\n '& .ad-placement-card-preview.msan_1x1': {\r\n padding: 20,\r\n },\r\n '& .ad-placement-card-preview.mma_4x1': {\r\n padding: 20,\r\n },\r\n '& .ad-placement-card-preview.mma_1x2': {\r\n padding: 20,\r\n maxWidth: AdPreviewOverideStylesByKey.mma_1x2.imagePreviewWidth,\r\n },\r\n '& .ad-placement-card-preview.msan_133x100': {\r\n padding: 20,\r\n },\r\n\r\n '& .ad-placement-card-preview.outlook_text_mobile': {\r\n boxSizing: 'content-box',\r\n maxWidth: 'calc(100% - 50px)',\r\n },\r\n\r\n '& .ad-placement-card-preview.outlook_text_web': {\r\n padding: '0px 8px',\r\n },\r\n },\r\n },\r\n 'container-l': {\r\n '& .new-preview-carousel-container-adprelib': {\r\n width: '100%',\r\n },\r\n },\r\n 'container-m': {\r\n '& .new-preview-carousel-container-adprelib': {\r\n width: '100%',\r\n },\r\n },\r\n 'container-s': {\r\n '& .new-preview-carousel-container-adprelib': {\r\n width: '100%',\r\n },\r\n },\r\n adExtensionContainer: {\r\n // todo: add styles for ad extension preview components if needed\r\n margin: 10,\r\n },\r\n placementContainerClassName: {\r\n opacity: '100%',\r\n },\r\n carouselLayoutHeader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n '& .carousel-header-texts': {\r\n width: '100%',\r\n height: 24,\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n margin: '20px 8px 16px 24px',\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n lineHeight: '24px',\r\n '& .carousel-header-ratio': {\r\n color: 'rgb(50, 49, 48)',\r\n fontSize: 14,\r\n fontWeight: 700,\r\n marginRight: 8,\r\n },\r\n '& .carousel-header-title': {\r\n fontSize: 14,\r\n },\r\n },\r\n '& .ad-preview-actions': {\r\n flexGrow: 0,\r\n textAligh: 'center',\r\n marginRight: 16,\r\n textWrap: 'nowrap',\r\n },\r\n },\r\n customCarouselClassName: {\r\n boxShadow: 'rgba(0, 0, 0, 0.1) 0px 2px 4px 0px',\r\n '& .carousel-inner': {\r\n minHeight: 450,\r\n },\r\n\r\n '& .carousel-indicators': {\r\n display: 'flex !important',\r\n left: '50% !important',\r\n margin: '48px 0 !important',\r\n transform: 'translateX(-50%) !important',\r\n gap: '8px !important',\r\n\r\n '& li': {\r\n margin: '0 !important',\r\n },\r\n },\r\n\r\n '& .carousel-control': {\r\n display: 'flex !important',\r\n width: '12px !important',\r\n margin: '12px 0 !important',\r\n left: '50% !important',\r\n },\r\n\r\n '& .carousel-control.left': {\r\n transform: ({ placements }) => {\r\n const transformations = [];\r\n\r\n // Move left arrow to the center\r\n transformations.push('translateX(-50%)');\r\n\r\n // Move left arrow to the left of the indicators\r\n const indicatorsWidth = getIndicatorsWidth(placements);\r\n transformations.push(`translateX(-${indicatorsWidth / 2}px)`);\r\n\r\n // Add extra space between the left arrow and the indicators\r\n transformations.push('translateX(-16px)');\r\n\r\n return transformations.join(' ');\r\n },\r\n bottom: '16px !important',\r\n },\r\n\r\n '& .carousel-control.right': {\r\n transform: ({ placements }) => {\r\n const transformations = [];\r\n\r\n // Move right arrow to the center\r\n transformations.push('translateX(-50%)');\r\n\r\n // Move right arrow to the right of the indicators\r\n const indicatorsWidth = getIndicatorsWidth(placements);\r\n transformations.push(`translateX(${indicatorsWidth / 2}px)`);\r\n\r\n // Add extra space between the right arrow and the indicators\r\n transformations.push('translateX(14px)');\r\n\r\n return transformations.join(' ');\r\n },\r\n bottom: '16px !important',\r\n },\r\n },\r\n disclaimerMessage: {\r\n maxWidth: '420px',\r\n fontSize: '12px',\r\n color: '#605E5C',\r\n },\r\n 'disclaimerMessage-l': {\r\n width: '100%',\r\n },\r\n 'disclaimerMessage-m': {\r\n width: '100%',\r\n },\r\n 'disclaimerMessage-s': {\r\n width: '100%',\r\n },\r\n adPreviewActions: {\r\n display: 'flex',\r\n columnGap: '5px',\r\n },\r\n});\r\n","import classNames from 'classnames';\r\nimport React, { useCallback, useEffect, useMemo, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { DefaultButton } from '@bingads-webui-react/fabric-control';\r\nimport {\r\n UAPPlacementTypeAlias as EPT,\r\n useImageExperienceAdPreviewModel,\r\n AdPreviewCarouselLayoutEx,\r\n UAPAdExtensionType as EAdExtensionType,\r\n AdPreviewAdExtensionComponents,\r\n} from '@bingads-webui-campaign-react/unified-ad-preview-library-cmui';\r\nimport { OverlayTrigger, Tooltip } from '@bingads-webui-react/primitive';\r\nimport { useResponsiveStyles } from '@bingads-webui-campaign-react/common-hooks';\r\nimport { PerfMaxAdPreviewControls, CustomAdPreviewControls } from './ad-preview-controls';\r\nimport previewPlaceholder from '../media/preview-placeholder.png';\r\nimport {\r\n AdPreviewSurface,\r\n getExtraPlacementInfo,\r\n getNumberOfPlacementBySurface,\r\n getNumberOfPlacementByCustomSurface,\r\n getNumberOfPlacementBySurfaceV2,\r\n getNumberOfPlacementBySurfaceV3,\r\n pmaxRequiredAspectRatios,\r\n getResponsiveAdPreviewConfig,\r\n} from './shared';\r\nimport { getAdAssetsPreviewStyles } from './ad-preview-responsive-styles';\r\n\r\nconst shortHeadlineMaxLength = 40;\r\nconst longHeadlineMaxLength = 90;\r\nconst descriptionMaxLength = 90;\r\n\r\nconst AdExtensionTypes = [\r\n EAdExtensionType.SiteLink,\r\n EAdExtensionType.Callout,\r\n EAdExtensionType.Promotion,\r\n EAdExtensionType.StructuredSnippet,\r\n EAdExtensionType.Price,\r\n];\r\n\r\nexport const getExtensionData = (extensions, extensionType, extensionFormatters) => {\r\n switch (extensionType) {\r\n case EAdExtensionType.SiteLink: {\r\n const siteLinks = _.result(extensions, EAdExtensionType.SiteLink, []).slice(0, 4); // only show 4 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.SiteLink])) {\r\n return siteLinks.map(siteLink => extensionFormatters[EAdExtensionType.SiteLink](siteLink));\r\n }\r\n return siteLinks;\r\n }\r\n case EAdExtensionType.Callout: {\r\n const callOuts = _.result(extensions, EAdExtensionType.Callout, []).slice(0, 4); // only show 4 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Callout])) {\r\n return callOuts.map(callOut => extensionFormatters[EAdExtensionType.Callout](callOut));\r\n }\r\n return callOuts;\r\n }\r\n case EAdExtensionType.Promotion: {\r\n const promotions = _.result(extensions, EAdExtensionType.Promotion, []).slice(0, 1); // only show 1 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Promotion])) {\r\n return promotions.map(promotion => extensionFormatters[EAdExtensionType.Promotion](promotion));\r\n }\r\n return promotions;\r\n }\r\n case EAdExtensionType.StructuredSnippet: {\r\n const structuredSnippets = _.result(extensions, EAdExtensionType.StructuredSnippet, []).slice(0, 1).map(({ Category, Texts }) => ({\r\n Category,\r\n Texts: Texts.slice(0, 3),\r\n })); // only show 3 values at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.StructuredSnippet])) {\r\n return structuredSnippets.map(structuredSnippet => extensionFormatters[EAdExtensionType.StructuredSnippet](structuredSnippet));\r\n }\r\n return structuredSnippets;\r\n }\r\n case EAdExtensionType.Price: {\r\n const prices = _.result(extensions, EAdExtensionType.Price, []).reduce((acc, { TableRows }) => [...acc, ...TableRows], []).slice(0, 8); // only show 8 at most.\r\n if (_.isFunction(extensionFormatters[EAdExtensionType.Price])) {\r\n return prices.map(price => extensionFormatters[EAdExtensionType.Price](price));\r\n }\r\n return prices;\r\n }\r\n default:\r\n return [];\r\n }\r\n};\r\n\r\nexport const PerfMaxAdPreview = (props) => {\r\n const {\r\n extraPlacementInfo: extraPlacementInfoProp,\r\n imageList,\r\n updateImageList,\r\n previewImagesSharedState,\r\n setPreviewImagesSharedState,\r\n isMSANAd,\r\n enableAutoPlay,\r\n i18n,\r\n logoPreviewEnabled,\r\n customPlacementHeaderClassName,\r\n isAdExtensionPreviewEnabled,\r\n extensionsAssociations,\r\n extensionFormatters,\r\n customSurfaceKeys,\r\n appLogo,\r\n isPMaxAspectRatiosV2Enabled,\r\n isAdPreviewRefreshEnabled,\r\n permissions,\r\n } = props;\r\n\r\n let { adPreviewConfig } = props;\r\n if (adPreviewConfig === undefined) {\r\n adPreviewConfig = getResponsiveAdPreviewConfig(isAdPreviewRefreshEnabled, isPMaxAspectRatiosV2Enabled, permissions);\r\n }\r\n\r\n const extraPlacementInfo = useMemo(() => {\r\n if (extraPlacementInfoProp) {\r\n return extraPlacementInfoProp;\r\n }\r\n\r\n return getExtraPlacementInfo(logoPreviewEnabled);\r\n }, [extraPlacementInfoProp, logoPreviewEnabled]);\r\n\r\n const hasSurfaceChoicePivot = !isMSANAd;\r\n\r\n const adDataProps = ['shortHeadline', 'videos', 'longHeadline', 'description', 'url', 'displayUrl', 'callToAction', 'businessName'];\r\n const currentAdData = _.pick(props, adDataProps);\r\n const [adData, setAdData] = React.useState(currentAdData);\r\n\r\n const isAdDataUpdated = useCallback(newAdData => (newAdData.length !== adData.length || !_.isMatch(newAdData, adData)), [adData]);\r\n const debouncedSetAdData = useMemo(() => _.debounce(setAdData, 500), []);\r\n if (isAdDataUpdated(currentAdData)) {\r\n debouncedSetAdData.cancel();\r\n debouncedSetAdData(currentAdData);\r\n }\r\n\r\n const getImageIndexFromId = useCallback((id) => {\r\n const index = _.findIndex(imageList, placement => _.first(placement).id === id && !_.first(placement).isLogo && !_.first(placement).isPortrait);\r\n return index >= 0 ? index : null;\r\n }, [imageList]);\r\n\r\n const getPreviewImageIndex = useCallback((idRequestedByImageExperience) => {\r\n let index = getImageIndexFromId(idRequestedByImageExperience);\r\n\r\n if (!index) {\r\n const firstImageIndex = _.findIndex(imageList, placement => !_.first(placement).isLogo);\r\n index = firstImageIndex >= 0 ? firstImageIndex : null;\r\n }\r\n\r\n return index;\r\n }, [getImageIndexFromId, imageList]);\r\n\r\n const { previewImageId, previewLogoId } = previewImagesSharedState;\r\n\r\n let previewImageIndex = null;\r\n if (imageList && imageList.length > 0) {\r\n previewImageIndex = getPreviewImageIndex(previewImageId);\r\n }\r\n\r\n const canExcludeAspectRatio = useCallback((typeToCheck) => {\r\n const minCount = pmaxRequiredAspectRatios[typeToCheck];\r\n if (!minCount) {\r\n return true;\r\n }\r\n\r\n let typeCount = 0;\r\n _.each(imageList, imageArray =>\r\n _.each(imageArray, (imageObj) => {\r\n if (imageObj.isIncluded && typeToCheck === imageObj.type) {\r\n typeCount += 1;\r\n }\r\n }));\r\n\r\n return (typeCount - 1) >= minCount;\r\n }, [imageList]);\r\n\r\n const onAddAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = true;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true, editingPlacementType: '' });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onRemoveAspectRatio = useCallback((type) => {\r\n const newImageList = [...imageList];\r\n _.find(newImageList[previewImageIndex], imagePlacement => imagePlacement.type === type).isIncluded = false;\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, isImageListUpdatedByPreview: true, editingPlacementType: '' });\r\n updateImageList(newImageList);\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState, updateImageList]);\r\n\r\n const onEdit = useCallback((type, placementType) => {\r\n const cropImageObj = _.find(imageList[previewImageIndex], imagePlacement => imagePlacement.type === type);\r\n setPreviewImagesSharedState({ ...previewImagesSharedState, cropImageObj, editingPlacementType: placementType });\r\n }, [imageList, previewImageIndex, previewImagesSharedState, setPreviewImagesSharedState]);\r\n\r\n const truncatedAdData = useMemo(() => {\r\n const validAdData = { ...adData };\r\n\r\n if (validAdData.shortHeadline && validAdData.shortHeadline.length > shortHeadlineMaxLength) {\r\n validAdData.shortHeadline = validAdData.shortHeadline.substring(0, shortHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.longHeadline && validAdData.longHeadline.length > longHeadlineMaxLength) {\r\n validAdData.longHeadline = validAdData.longHeadline.substring(0, longHeadlineMaxLength - 1);\r\n }\r\n\r\n if (validAdData.description && validAdData.description.length > descriptionMaxLength) {\r\n validAdData.description = validAdData.description.substring(0, descriptionMaxLength - 1);\r\n }\r\n\r\n return _.defaults(validAdData, {\r\n shortHeadline: i18n.getString(_TL_('Short headline')),\r\n longHeadline: i18n.getString(_TL_('Long headline')),\r\n description: i18n.getString(_TL_('Ad text')),\r\n businessName: i18n.getString(_TL_('Business name')),\r\n callToAction: i18n.getString(_TL_('Please select language first')),\r\n url: 'https://example.com',\r\n });\r\n }, [adData, i18n]);\r\n\r\n // const classes = useDefaultStyles(getAdPreviewStyles);\r\n const [surfaceChoice, setSurfaceChoice] = useState(customSurfaceKeys ? customSurfaceKeys[Object.keys(customSurfaceKeys)[0]] : AdPreviewSurface.Msn);\r\n\r\n // use extensionCount and extensionRerenderFlag to force rerender when extension count decreases\r\n const extensionCount = useRef(0);\r\n const [extensionRerenderFlag, setExtensionRerenderFlag] = useState(0);\r\n\r\n const {\r\n onUpdateImageExperienceImageList,\r\n imageExperiencePlacementSets: placementSets,\r\n } = useImageExperienceAdPreviewModel(adPreviewConfig, previewPlaceholder);\r\n\r\n useEffect(() => {\r\n // get correct image index fitler out logo\r\n const imageListWithoutLogo = _.compact(_.map(imageList, (placementList) => {\r\n const placements = _.filter(placementList, placement => !placement.isLogo && !placement.isPortrait);\r\n return !_.isEmpty(placements) ? placements : null;\r\n })) || [];\r\n\r\n // get current preview image\r\n const imageToPreview = _.find(imageListWithoutLogo, (placementList) => {\r\n const {\r\n id, idString, baseId, baseImage,\r\n } = _.first(placementList) || {};\r\n const { id: baseImageId, idString: baseImageIdString } = baseImage || {};\r\n return id === previewImageId || idString === previewImageId || baseId === previewImageId || baseImageId === previewImageId || baseImageIdString === previewImageId;\r\n }) || imageListWithoutLogo[0];\r\n\r\n _.debounce(onUpdateImageExperienceImageList, 100)([imageToPreview], null);\r\n // !! when *previewImageSharedState* changes update the image list, this component relies on in-place updates to imageList\r\n }, [previewImagesSharedState, imageList, onUpdateImageExperienceImageList, previewImageId]);\r\n\r\n const curPlacementList = useMemo(() => {\r\n const { placementList: pl } = _.find(placementSets, ({ placementSetName }) => !hasSurfaceChoicePivot || placementSetName === surfaceChoice) || {};\r\n if (isAdExtensionPreviewEnabled && surfaceChoice === 'Bing') {\r\n const bingSearchAdPlacement = _.find(pl, ({ placementMeta }) => placementMeta.placementType === EPT.Responsive.BingSearch.Text);\r\n // extend the placement list to add new placements for ad extensions\r\n if (bingSearchAdPlacement) {\r\n const placementListWithExtensions = [\r\n ...pl,\r\n // add additional property to identity the extension type to render\r\n ...AdExtensionTypes.reduce((pls, adExtensionType) => {\r\n if (_.has(extensionsAssociations, adExtensionType) && extensionsAssociations[adExtensionType].length > 0) {\r\n pls.push({ ...bingSearchAdPlacement, adExtensionType });\r\n }\r\n return pls;\r\n }, []),\r\n ];\r\n const preExtensionCount = extensionCount.current;\r\n extensionCount.current = placementListWithExtensions.length - pl.length;\r\n if (preExtensionCount > extensionCount.current) {\r\n setExtensionRerenderFlag(prevState => (prevState + 1) % 1000);\r\n }\r\n return placementListWithExtensions;\r\n }\r\n }\r\n return pl;\r\n }, [extensionsAssociations, hasSurfaceChoicePivot, isAdExtensionPreviewEnabled, placementSets, surfaceChoice]);\r\n\r\n const stylingProps = useMemo(() => {\r\n let placements = null;\r\n\r\n if (customSurfaceKeys) {\r\n placements = getNumberOfPlacementByCustomSurface(surfaceChoice, customSurfaceKeys);\r\n } else {\r\n placements = (curPlacementList && curPlacementList.length) || getNumberOfPlacementBySurface(surfaceChoice);\r\n }\r\n\r\n if (isPMaxAspectRatiosV2Enabled) {\r\n placements = isAdPreviewRefreshEnabled ? getNumberOfPlacementBySurfaceV3(surfaceChoice) : getNumberOfPlacementBySurfaceV2(surfaceChoice);\r\n }\r\n\r\n return ({\r\n component:\r\n {\r\n placements,\r\n },\r\n });\r\n }, [curPlacementList, customSurfaceKeys, isAdPreviewRefreshEnabled, isPMaxAspectRatiosV2Enabled, surfaceChoice]);\r\n\r\n const getStyles = useResponsiveStyles(getAdAssetsPreviewStyles, stylingProps);\r\n\r\n const isSizeValid = useCallback((placement) => {\r\n const { placementMeta, imageMeta } = placement || {};\r\n const { minSize } = placementMeta || {};\r\n const [minWidth, minHeight] = minSize || [];\r\n const { width, height } = imageMeta || {};\r\n return width >= minWidth && height >= minHeight;\r\n }, []);\r\n\r\n const getFirstElement = useCallback((item) => {\r\n if (_.isArray(item)) {\r\n return _.first(item);\r\n }\r\n return item;\r\n }, []);\r\n\r\n const curPreviewLogo = useMemo(() => {\r\n const allLogos = _.filter(imageList, imageArr => getFirstElement(imageArr).isLogo === true);\r\n let curLogos = previewLogoId && _.find(allLogos, logo => _.first(logo).Id === previewLogoId);\r\n curLogos = curLogos || _.first(allLogos);\r\n\r\n // currently only square logo is supported, 4x1 logo are ignored\r\n const curLogoRatio = _.find(curLogos, logo => logo.isIncluded === true && logo.type === 'Image1x1');\r\n return curLogoRatio;\r\n }, [getFirstElement, imageList, previewLogoId]);\r\n\r\n const renderAdExtensionPreivew = useCallback((placement, adExtensionType) => {\r\n const AdExtensionPreviewComponent = AdPreviewAdExtensionComponents[adExtensionType];\r\n if (AdExtensionPreviewComponent) {\r\n return <AdExtensionPreviewComponent {...placement} extensionData={getExtensionData(extensionsAssociations, adExtensionType, extensionFormatters)} />;\r\n }\r\n return null;\r\n }, [extensionFormatters, extensionsAssociations]);\r\n\r\n const onRenderPlacement = useCallback((placement, AdPlacementComponent) => {\r\n const {\r\n placementMeta, imageMeta, hasImageExperienceData, adExtensionType,\r\n } = placement || {};\r\n const isPlaceholderImage = imageMeta && (imageMeta.url === previewPlaceholder);\r\n const { minSize, placementType } = placementMeta || {};\r\n const [minWidth, minHeight] = minSize || [];\r\n const isValid = isSizeValid(placement);\r\n const {\r\n hasLogo, customClassName, imagePreviewHeight, previewTitle, disclaimerMessage,\r\n } = extraPlacementInfo[placementType] || {};\r\n\r\n return (\r\n <div className={classNames(getStyles('placementContainerClassName'))}>\r\n {hasImageExperienceData && !isValid &&\r\n <span className=\"placement-validation-message action-label\">\r\n {\r\n i18n.getString(_TL_('To include this aspect ratio, add a new image that is at least {{width}} x {{height}} pixels.'), {\r\n width: minWidth,\r\n height: minHeight,\r\n })\r\n }\r\n </span>\r\n }\r\n <AdPlacementComponent\r\n isEnabled={!!placement.isPlacementIncluded && isValid && !isPlaceholderImage}\r\n placementData={placement}\r\n {...truncatedAdData}\r\n finalUrl={truncatedAdData.url}\r\n i18n={i18n}\r\n logo={appLogo || (hasLogo && curPreviewLogo)}\r\n customClassName={customClassName || undefined}\r\n imagePreviewHeight={imagePreviewHeight || undefined}\r\n adExtensionContainerClassName={getStyles('adExtensionContainer')}\r\n >\r\n {adExtensionType && renderAdExtensionPreivew(placement, adExtensionType)}\r\n </AdPlacementComponent>\r\n {isMSANAd && previewTitle && (\r\n <div className=\"preview-string\">{i18n.getString(previewTitle)}</div>\r\n )}\r\n {isMSANAd && disclaimerMessage && (\r\n <div className=\"additional-disclaimer-message\">{i18n.getString(disclaimerMessage)}</div>\r\n )}\r\n </div>\r\n );\r\n }, [curPreviewLogo, appLogo, extraPlacementInfo, getStyles, i18n, isMSANAd, isSizeValid, renderAdExtensionPreivew, truncatedAdData]);\r\n\r\n const onRenderCarouselHeader = useCallback((placement) => {\r\n const { placementMeta, isPlacementIncluded, hasImageExperienceData } = placement || {};\r\n const { imageType, placementType } = placementMeta || {};\r\n if (!placementType) {\r\n return null;\r\n }\r\n const canBeExcluded = canExcludeAspectRatio(imageType);\r\n const {\r\n aspectRatioUIString, previewTitle, previewHeaderTitle, hideHeaderButtons = false,\r\n } = extraPlacementInfo[placementMeta.placementType] || {};\r\n const shouldRenderPreviewActions = hasImageExperienceData && isSizeValid(placement) && !hideHeaderButtons;\r\n return (\r\n <div className={classNames(getStyles('carouselLayoutHeader'), customPlacementHeaderClassName)}>\r\n {isMSANAd ? (\r\n <div className=\"ad-preview-title\" >\r\n <span className=\"preview-title-string-key\">{previewHeaderTitle ? i18n.getString(previewHeaderTitle) : i18n.getString(previewTitle)}</span>\r\n </div>\r\n ) : (\r\n <div className=\"carousel-header-texts\">\r\n <span className=\"carousel-header-ratio\">{aspectRatioUIString}</span>\r\n <OverlayTrigger\r\n key=\"top\"\r\n placement=\"top\"\r\n overlay={\r\n <Tooltip id=\"tooltip-top\" className={shouldRenderPreviewActions && previewTitle ? '' : 'hide'}>\r\n {previewTitle && i18n.getString(previewTitle)}\r\n </Tooltip>\r\n }\r\n >\r\n <span className=\"carousel-header-title\">{previewTitle && i18n.getString(previewTitle)}</span>\r\n </OverlayTrigger>\r\n </div>\r\n )}\r\n {shouldRenderPreviewActions && (\r\n <div className={classNames('ad-preview-actions', getStyles('adPreviewActions'))}>\r\n {isPlacementIncluded && <DefaultButton className=\"crop-image-button\" onClick={() => onEdit(imageType, placementType)} text={i18n.getString(_TL_('Edit aspect ratio'))} />}\r\n {isPlacementIncluded && <DefaultButton className=\"exclude-aspect-ratio-button\" onClick={() => onRemoveAspectRatio(imageType)} text={i18n.getString(_TL_('Exclude'))} disabled={!canBeExcluded} />}\r\n {!isPlacementIncluded && <DefaultButton className=\"include-aspect-ratio-button\" onClick={() => onAddAspectRatio(imageType)} text={i18n.getString(_TL_('Include'))} />}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }, [canExcludeAspectRatio, customPlacementHeaderClassName, extraPlacementInfo, getStyles, i18n, isMSANAd, isSizeValid, onAddAspectRatio, onEdit, onRemoveAspectRatio]);\r\n\r\n return (\r\n <div className={classNames(getStyles('container'))}>\r\n {\r\n hasSurfaceChoicePivot &&\r\n customSurfaceKeys ? (\r\n <CustomAdPreviewControls\r\n onSurfaceChange={setSurfaceChoice}\r\n onPlacementFilterChange={_.noop}\r\n customSurfaceKeys={customSurfaceKeys}\r\n i18n={i18n}\r\n />\r\n ) : (\r\n <PerfMaxAdPreviewControls onSurfaceChange={setSurfaceChoice} onPlacementFilterChange={_.noop} permissions={permissions} showAdPreviewControlsV2={isAdPreviewRefreshEnabled && isPMaxAspectRatiosV2Enabled} />\r\n )\r\n }\r\n <AdPreviewCarouselLayoutEx\r\n placementList={curPlacementList}\r\n onRenderPlacement={onRenderPlacement}\r\n onRenderHeader={onRenderCarouselHeader}\r\n enableAutoPlay={_.isNull(enableAutoPlay) ? isMSANAd : enableAutoPlay}\r\n i18n={i18n}\r\n useCustomCarousel={false}\r\n customCarouselRootClassName={classNames(getStyles('customCarouselClassName'), props.autoHeightCarousel && 'auto-height')}\r\n customCarouselWrapperClassName={isAdExtensionPreviewEnabled ? getStyles('customCarouselClassName') : ''}\r\n resetOn={`${surfaceChoice}-${extensionRerenderFlag}`}\r\n />\r\n <div className={classNames(getStyles('disclaimerMessage'))}>\r\n {i18n.getString(_TL_('These are examples of how your ads could appear. Depending on placement, the actual ad may appear differently.'))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nPerfMaxAdPreview.propTypes = {\r\n adPreviewConfig: PropTypes.arrayOf(PropTypes.shape({})),\r\n extraPlacementInfo: PropTypes.shape({}),\r\n imageList: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))),\r\n updateImageList: PropTypes.func.isRequired,\r\n previewImagesSharedState: PropTypes.shape({\r\n previewImageId: PropTypes.string,\r\n previewLogoId: PropTypes.string,\r\n }).isRequired,\r\n setPreviewImagesSharedState: PropTypes.func.isRequired,\r\n isMSANAd: PropTypes.bool,\r\n enableAutoPlay: PropTypes.bool,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n logoPreviewEnabled: PropTypes.bool,\r\n customPlacementContainerClassName: PropTypes.string,\r\n customPlacementHeaderClassName: PropTypes.string,\r\n isAdExtensionPreviewEnabled: PropTypes.bool,\r\n extensionsAssociations: PropTypes.shape({}),\r\n extensionFormatters: PropTypes.shape({}),\r\n appLogo: PropTypes.shape({}),\r\n isPMaxAspectRatiosV2Enabled: PropTypes.bool,\r\n customSurfaceKeys: PropTypes.shape({}),\r\n isAdPreviewRefreshEnabled: PropTypes.bool,\r\n permissions: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nPerfMaxAdPreview.defaultProps = {\r\n adPreviewConfig: undefined,\r\n extraPlacementInfo: undefined,\r\n imageList: null,\r\n isMSANAd: false,\r\n enableAutoPlay: null,\r\n logoPreviewEnabled: false,\r\n customPlacementContainerClassName: undefined,\r\n customPlacementHeaderClassName: undefined,\r\n isAdExtensionPreviewEnabled: false,\r\n extensionsAssociations: {},\r\n extensionFormatters: {},\r\n appLogo: null,\r\n isPMaxAspectRatiosV2Enabled: false,\r\n customSurfaceKeys: null,\r\n isAdPreviewRefreshEnabled: false,\r\n};\r\n","const IMAGE_DIM = {\r\n width: 106,\r\n height: 76,\r\n marginRight: 8,\r\n};\r\n\r\nconst PaddleBottomValue = 18;\r\n\r\nexport const initialImageContainerLeftMargin = 10;\r\n\r\nexport const getFullyShownImagesCount = (width) => {\r\n if (!width) {\r\n return 0;\r\n }\r\n\r\n const itemWidth = IMAGE_DIM.width + IMAGE_DIM.marginRight;\r\n\r\n return Math.floor(width / itemWidth);\r\n};\r\n\r\nexport const getCarouselStyles = (components, { palette = {} } = {}, iconFontFamily = 'MsAds MDL2 Assets') => ({\r\n carouselParent: {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n width: '100%',\r\n alignItems: 'end',\r\n },\r\n disabledCarouselParent: {\r\n pointerEvents: 'none',\r\n opacity: 0.4,\r\n },\r\n image: {\r\n ...IMAGE_DIM,\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n objectFit: 'cover',\r\n borderRadius: 6,\r\n },\r\n imageContainer: ({ imageContainerLeftMargin, isCollapsible }) => ({\r\n height: IMAGE_DIM.height,\r\n overflowX: 'hidden',\r\n overflowY: 'hidden',\r\n display: 'inline-block',\r\n marginLeft: isCollapsible ? imageContainerLeftMargin : 0,\r\n flexGrow: 1,\r\n }),\r\n imageParentContainer: ({ imageParentLeftOffset, numberOfImages }) => ({\r\n display: 'flex',\r\n width: (IMAGE_DIM.width + IMAGE_DIM.marginRight) * numberOfImages,\r\n position: 'relative',\r\n left: ((-1 * IMAGE_DIM.width) - IMAGE_DIM.marginRight) * imageParentLeftOffset,\r\n }),\r\n imageClickableContainer: {\r\n display: 'inline',\r\n '& :hover': {\r\n cursor: 'pointer',\r\n },\r\n },\r\n loadingMessageContainer: {\r\n marginTop: 16,\r\n marginLeft: 16,\r\n },\r\n loadingText: {\r\n display: 'inline-block',\r\n fontSize: '12px',\r\n lineHeight: '16px',\r\n verticalAlign: 'top',\r\n },\r\n panel: {},\r\n panelHeading: {\r\n display: 'flex',\r\n },\r\n panelTitle: {\r\n flexGrow: 0,\r\n },\r\n panelIcon: {\r\n marginRight: 3,\r\n paddingBottom: 12,\r\n '&:before': {\r\n fontFamily: iconFontFamily,\r\n content: '\"\\\\E3AF\"',\r\n },\r\n },\r\n panelHelpButton: {\r\n display: 'flex',\r\n '& .helpbutton': {\r\n margin: '4px 0px',\r\n },\r\n },\r\n imageHintRight: {\r\n display: 'inline-block',\r\n position: 'absolute',\r\n background: 'linear-gradient(270deg, #FFFFFF 0%, rgba(255, 255, 255, 0.927755) 18.23%, rgba(255, 255, 255, 0.776042) 48.44%, rgba(250, 249, 255, 0.5) 78.24%, rgba(255, 255, 255, 0) 100%)',\r\n width: 20,\r\n height: IMAGE_DIM.height,\r\n right: 32,\r\n },\r\n imageHintLeft: {\r\n display: 'inline-block',\r\n position: 'absolute',\r\n background: 'linear-gradient(270deg, #FFFFFF 0%, rgba(255, 255, 255, 0.927755) 18.23%, rgba(255, 255, 255, 0.776042) 48.44%, rgba(250, 249, 255, 0.5) 78.24%, rgba(255, 255, 255, 0) 100%)',\r\n width: 30,\r\n height: IMAGE_DIM.height,\r\n left: 34,\r\n transform: 'rotate(-180deg)',\r\n },\r\n paddleBtn: {\r\n bottom: PaddleBottomValue,\r\n },\r\n moreIcon: {\r\n fontSize: '18px',\r\n height: '60px',\r\n width: '33px',\r\n color: palette.themeDarkAlt,\r\n },\r\n seeAll: {\r\n display: 'inline-block',\r\n position: 'absolute',\r\n right: 0,\r\n bottom: 12,\r\n whiteSpace: 'nowrap',\r\n maxWidth: 50,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n seeAllInHeader: {\r\n marginLeft: 'auto',\r\n '& a': {\r\n position: 'static',\r\n color: palette.themePrimary,\r\n fontSize: 12,\r\n '&:hover, $:acitve, $:focus': {\r\n color: palette.themeDarkAlt,\r\n },\r\n '&:hover': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n },\r\n spinner: {\r\n ...components.getBlockerStyle(16, palette),\r\n display: 'inline-block',\r\n lineHeight: '16px',\r\n },\r\n parentContainer: {\r\n '& $panel': { // need more selector specificity to override styles applied to top of grid panels\r\n marginLeft: 0,\r\n marginTop: 12,\r\n },\r\n '& $panelHeading': {\r\n border: 'none',\r\n '& $panelTitle.collapsible-title': {\r\n fontSize: '12px',\r\n fontWeight: 600,\r\n lineHeight: '24px',\r\n '& > a': {\r\n '& .helpbutton': {\r\n fontSize: '14px',\r\n lineHeight: '24px',\r\n display: 'inline',\r\n verticalAlign: 'bottom',\r\n },\r\n },\r\n marginTop: 0,\r\n },\r\n },\r\n '& + .alert-info': {\r\n marginTop: 8,\r\n '& a': {\r\n color: palette.themeDarkAlt,\r\n },\r\n },\r\n },\r\n});\r\n","import React, { useCallback, useState, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { findIndex, filter, map, extend, find, chain, where, isEmpty } from 'underscore';\r\nimport { DefaultButton, Panel, PanelType, Stack, PrimaryButton, MessageBar, MessageBarType } from '@fluentui/react';\r\nimport { IconButton } from '@bingads-webui-react/fabric-control';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { FluentImagePicker } from '@bingads-webui-campaign-react/fluent-image-picker';\r\nimport { AssetLibrarySpinner } from '@bingads-webui-campaign-react/asset-library-spinner';\r\nimport { panelStylesProp } from '@bingads-webui-campaign-react/asset-library-shared-add-media-layout';\r\nimport { CopilotTab, CopilotTabItem } from '@bingads-webui/inline-copilot-ui';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { getImageSuggestionPanelStyles, imageSuggestionPanelWidth } from './style';\r\n\r\nconst getImageWithDefaultSelectState = images => map(images, image => extend({}, image, { isSelected: false }));\r\n\r\nconst mapSelectSate = (allImages, needUpdateImages) => map(needUpdateImages, (image) => {\r\n const newImage = find(allImages, img => img.fullUrl === image.fullUrl);\r\n return newImage || image;\r\n});\r\n\r\nexport const ImageRecommendationsPanel = (props) => {\r\n const {\r\n i18n,\r\n title,\r\n images,\r\n themes,\r\n hasMore,\r\n showThemes,\r\n loadNextPage,\r\n onSelectImage,\r\n onDismiss,\r\n isMultiSelect,\r\n onAdd,\r\n maxUploadNum,\r\n } = props;\r\n\r\n const isLoadingFirstPage = false;\r\n\r\n const defaultImagesWithSelectState = useMemo(() => getImageWithDefaultSelectState(images), [images]);\r\n const classes = useDefaultStyles(getImageSuggestionPanelStyles);\r\n const [error, setError] = useState(null);\r\n const [allImages, setAllImages] = useState(defaultImagesWithSelectState);\r\n const [activeImages, setActiveImages] = useState(allImages);\r\n const [activeTheme, setActiveTheme] = useState(i18n.getString(_TL_('All')));\r\n const themeNames = useMemo(() => [\r\n ...map(themes.filter(theme => !isEmpty(theme.images)), ({ name }) => name),\r\n ], [themes]);\r\n\r\n const onSwitchTheme = useCallback((key) => {\r\n setActiveTheme(key);\r\n if (key === i18n.getString(_TL_('All'))) {\r\n setActiveImages(allImages);\r\n } else {\r\n const rawImages = chain(themes)\r\n .filter(theme => theme.name === key)\r\n .first()\r\n .result('images')\r\n .map(img => extend({}, img))\r\n .value();\r\n const imagesWithState = mapSelectSate(allImages, rawImages);\r\n setActiveImages(imagesWithState);\r\n }\r\n }, [allImages, i18n, themes]);\r\n\r\n const onClickAdd = useCallback(() => {\r\n onAdd(filter(allImages, image => image.isSelected));\r\n }, [onAdd, allImages]);\r\n\r\n const onClickCancel = useCallback((e) => {\r\n onDismiss(e);\r\n }, [onDismiss]);\r\n\r\n const onRenderHeader = useCallback(() => (\r\n <div className={classes.panelHeader}>\r\n <div className={classes.backButton}>\r\n <IconButton iconProps={{ iconName: 'Back' }} className=\"back-button\" onClick={onClickCancel} />\r\n </div>\r\n <div className={classes.panelTitle}>\r\n {i18n.getString(title)}\r\n </div>\r\n </div>\r\n ), [classes.backButton, classes.panelHeader, classes.panelTitle, i18n, onClickCancel, title]);\r\n\r\n const onRenderFooterContent = useCallback(() => (\r\n <Stack className={classnames('image-recommendations-panel-buttons', classes.buttonContainer)} horizontal tokens={{ childrenGap: 8 }}>\r\n { isMultiSelect &&\r\n <Stack.Item key=\"btn-add\">\r\n <PrimaryButton className=\"btn-add\" onClick={onClickAdd} disabled={findIndex(allImages, image => image.isSelected) === -1}>\r\n {i18n.getString(_TL_('Add'))}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n }\r\n <Stack.Item key=\"btn-cancel\">\r\n <DefaultButton className=\"btn-cancel\" onClick={onClickCancel}>\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack.Item>\r\n { isMultiSelect &&\r\n <Stack.Item key=\"selected-label\">\r\n <span className=\"selected-label\">{i18n.getString(_TL_('Selected images: {{count}}'), { count: where(allImages, { isSelected: true }).length })}</span>\r\n </Stack.Item>\r\n }\r\n </Stack>\r\n ), [classes.buttonContainer, isMultiSelect, onClickAdd, allImages, i18n, onClickCancel]);\r\n\r\n const onSelectImageInternal = useCallback((index) => {\r\n const { fullUrl, suggestionId } = isMultiSelect || showThemes ? activeImages[index] : images[index];\r\n\r\n if (!isMultiSelect) {\r\n onDismiss();\r\n onSelectImage(fullUrl, index, suggestionId);\r\n } else {\r\n const image = find(allImages, img => img.fullUrl === fullUrl);\r\n\r\n if (!image.isSelected && maxUploadNum !== undefined && filter(allImages, img => img.isSelected).length >= maxUploadNum) {\r\n setError(i18n.getString(_TL_('You\\'ve exceeded the max. number of assets you can add at a time ({{limitNumber}}). Please try again.'), { limitNumber: maxUploadNum }));\r\n return;\r\n }\r\n\r\n setError(null);\r\n if (image) {\r\n image.isSelected = !image.isSelected;\r\n }\r\n setAllImages([...allImages]);\r\n setActiveImages(mapSelectSate(allImages, activeImages));\r\n }\r\n }, [isMultiSelect, showThemes, activeImages, images, onDismiss, onSelectImage, allImages, maxUploadNum, i18n]);\r\n\r\n return (\r\n <Panel\r\n onRenderHeader={onRenderHeader}\r\n isOpen\r\n onDismiss={onClickCancel}\r\n onRenderFooterContent={onRenderFooterContent}\r\n isFooterAtBottom\r\n type={PanelType.custom}\r\n customWidth={imageSuggestionPanelWidth}\r\n styles={panelStylesProp}\r\n className=\"image-recommendations-panel\"\r\n >\r\n {(isMultiSelect || showThemes) &&\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classes.theme}>\r\n <CopilotTab\r\n active={activeTheme}\r\n onActiveChange={key => onSwitchTheme(key)}\r\n >\r\n <CopilotTabItem tabKey={i18n.getString(_TL_('All'))}>\r\n {i18n.getString(_TL_('All'))}\r\n </CopilotTabItem>\r\n {map(themeNames, name => (\r\n <CopilotTabItem tabKey={name}>\r\n {name}\r\n </CopilotTabItem>\r\n ))}\r\n </CopilotTab>\r\n </div>\r\n </FluentProvider>\r\n }\r\n {\r\n isLoadingFirstPage ? <AssetLibrarySpinner useCustomSize customStyle={{ marginTop: '50px' }} /> :\r\n <FluentImagePicker\r\n images={isMultiSelect || showThemes ? activeImages : images}\r\n pageSize={30}\r\n loadMoreImages={loadNextPage}\r\n onSelectImage={onSelectImageInternal}\r\n hasMoreImages={hasMore}\r\n imageCellWidth={260}\r\n imageCellHeight={243}\r\n isMultiSelect={isMultiSelect}\r\n />\r\n }\r\n {\r\n error && <MessageBar messageBarType={MessageBarType.error} className={classes.errorMessage}>{error}</MessageBar>\r\n }\r\n </Panel>);\r\n};\r\n\r\nImageRecommendationsPanel.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n title: PropTypes.string,\r\n images: PropTypes.arrayOf(PropTypes.shape({\r\n thumbnailSrc: PropTypes.string,\r\n fullUrl: PropTypes.string,\r\n suggestionId: PropTypes.string,\r\n })).isRequired,\r\n showThemes: PropTypes.bool,\r\n themes: PropTypes.arrayOf(PropTypes.shape({})),\r\n hasMore: PropTypes.bool.isRequired,\r\n loadNextPage: PropTypes.func.isRequired,\r\n onSelectImage: PropTypes.func.isRequired,\r\n onDismiss: PropTypes.func.isRequired,\r\n isMultiSelect: PropTypes.bool,\r\n onAdd: PropTypes.func,\r\n maxUploadNum: PropTypes.number,\r\n};\r\n\r\nImageRecommendationsPanel.defaultProps = {\r\n title: _TL_('Recommended images'),\r\n themes: [],\r\n showThemes: true,\r\n isMultiSelect: false,\r\n onAdd: () => {},\r\n maxUploadNum: undefined,\r\n};\r\n","import React, { useContext, useState, useCallback, useEffect, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { AssetEventRecordType, AssetType, POST_ASSET_EVENT_NAME } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { constants } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport { ImageSuggestionCarousel } from '@bingads-webui-campaign-react/image-suggestion-carousel';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { MessageBar, MessageBarType } from '@bingads-webui-react/fabric-control';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { withInstrumentation } from '@bingads-webui-react/hoc-with-instrumentation';\r\nimport { withPermissions } from '@bingads-webui-react/hoc-with-permissions';\r\nimport classNames from 'classnames';\r\nimport { getImageSuggestionCarouselStyles } from './style';\r\nimport { getCarouselStyles, getFullyShownImagesCount, initialImageContainerLeftMargin } from './carousel-pmax-style';\r\nimport { ImageRecommendationsPanel } from './image-recommendations-panel';\r\n\r\nexport const SuggestionViewImageCount = 5;\r\nconst MaxSuggestionsInCarousel = 15;\r\nconst isEmptySuggestionsHintEnabled = true;\r\n\r\nconst PerfMaxImageSuggestionCarouselInternal = (props) => {\r\n const {\r\n i18n,\r\n addImageCallback = _.noop,\r\n maxUploadNum,\r\n isCopilotRecommendations,\r\n customMessageBarText,\r\n } = props;\r\n\r\n const [recommendationContext, , reportRecommendations] = useContext(RecommendationContext);\r\n const {\r\n themes, imageAssets, postAssetEventLog = _.noop, copilotTracking,\r\n } = recommendationContext;\r\n const { carouselState, panelState } = useMemo(() => {\r\n if (isCopilotRecommendations) {\r\n return {\r\n carouselState: {\r\n carousel: {\r\n isError: _.isEmpty(imageAssets),\r\n },\r\n suggestion: {\r\n images: imageAssets,\r\n },\r\n },\r\n panelState: {\r\n panelImages: imageAssets,\r\n hasMore: false,\r\n },\r\n };\r\n }\r\n return (recommendationContext && recommendationContext.images) || {};\r\n }, [imageAssets, isCopilotRecommendations, recommendationContext]);\r\n const { suggestion, carousel } = carouselState || {};\r\n const { images: suggestionImages, inProgress: suggestionInProgress } = suggestion || {};\r\n\r\n const [imagesToSuggest, setImagesToSuggest] = useState([]);\r\n const [carouselErrorMessage, setCarouselErrorMessage] = useState({});\r\n const [blockCarousel, setBlockCarousel] = useState(false);\r\n const [isSuggestionsPanelOpen, setIsSuggestionsPanelOpen] = useState(false);\r\n\r\n const logCopilotViewedImageSuggestions = useCallback((suggestionIds) => {\r\n if (copilotTracking) {\r\n const viewedImageSuggestionIds = copilotTracking.getUntrackedViewedSuggestionIds(suggestionIds);\r\n if (viewedImageSuggestionIds.length > 0) {\r\n postAssetEventLog({\r\n EventName: POST_ASSET_EVENT_NAME,\r\n EventValue: {\r\n AssetType: _.map(viewedImageSuggestionIds, () => AssetType.IMAGE),\r\n SuggestionIds: viewedImageSuggestionIds,\r\n RecordType: AssetEventRecordType.VIEWED,\r\n },\r\n });\r\n copilotTracking.trackViewedSuggestionIds(viewedImageSuggestionIds);\r\n }\r\n }\r\n }, [copilotTracking, postAssetEventLog]);\r\n\r\n if (isSuggestionsPanelOpen) {\r\n const panelViewedSuggestionIds = _.pluck(panelState.panelImages, 'suggestionId');\r\n reportRecommendations({ view: panelViewedSuggestionIds });\r\n if (isCopilotRecommendations) {\r\n logCopilotViewedImageSuggestions(panelViewedSuggestionIds);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const truncatedImages = _.isArray(suggestionImages) && suggestionImages.slice(0, MaxSuggestionsInCarousel);\r\n setImagesToSuggest(truncatedImages || []);\r\n }, [suggestionImages]);\r\n\r\n const classes = useDefaultStyles(getImageSuggestionCarouselStyles);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const onSelectImage = useCallback((fullUrl, index, suggestionId) => {\r\n setBlockCarousel(true);\r\n addImageCallback([{ fullUrl, suggestionId }], constants.imageOptionKeys.Image)\r\n .then((response) => {\r\n if (response.processedImage) {\r\n if (isCopilotRecommendations) {\r\n const { idString } = response.processedImage;\r\n logCopilotViewedImageSuggestions([suggestionId]);\r\n copilotTracking.trackSelectedImageAssets({ ImageAssets: [{ suggestionId, imageId: idString }] });\r\n }\r\n }\r\n if (response.errorMessage) {\r\n setCarouselErrorMessage({\r\n type: MessageBarType.error,\r\n message: response.errorMessage,\r\n });\r\n }\r\n return Promise.resolve();\r\n })\r\n .finally(() => {\r\n setImagesToSuggest(_.reject(imagesToSuggest, image => image.fullUrl === fullUrl));\r\n setBlockCarousel(false);\r\n });\r\n }, [addImageCallback, copilotTracking, imagesToSuggest, isCopilotRecommendations, logCopilotViewedImageSuggestions]);\r\n\r\n const onAdd = useCallback((images) => {\r\n setBlockCarousel(true);\r\n setIsSuggestionsPanelOpen(false);\r\n addImageCallback(images, constants.imageOptionKeys.Image)\r\n .then((response) => {\r\n if (response.processedImages) {\r\n if (isCopilotRecommendations) {\r\n response.processedImages.forEach((image) => {\r\n copilotTracking.trackSelectedImageAssets({ ImageAssets: [{ suggestionId: image.suggestionId, imageId: image.idString }] });\r\n });\r\n }\r\n }\r\n if (response.errorMessage) {\r\n setCarouselErrorMessage({\r\n type: MessageBarType.error,\r\n message: response.errorMessage,\r\n });\r\n }\r\n return Promise.resolve();\r\n })\r\n .finally(() => {\r\n // setImagesToSuggest(_.reject(imagesToSuggest, image => image.fullUrl === fullUrl));\r\n setBlockCarousel(false);\r\n });\r\n }, [addImageCallback, copilotTracking, isCopilotRecommendations]);\r\n\r\n const onSelectSeeAllImages = useCallback(() => {\r\n setIsSuggestionsPanelOpen(true);\r\n }, []);\r\n\r\n const onOffsetChange = useCallback((offset) => {\r\n const viewedImages = imagesToSuggest.slice(offset, offset + SuggestionViewImageCount);\r\n const suggestionIds = _.pluck(viewedImages, 'suggestionId');\r\n reportRecommendations({ view: suggestionIds });\r\n if (isCopilotRecommendations) {\r\n logCopilotViewedImageSuggestions(suggestionIds);\r\n }\r\n }, [imagesToSuggest, isCopilotRecommendations, logCopilotViewedImageSuggestions, reportRecommendations]);\r\n\r\n const shouldDisplayEmptySuggestionsHint = isEmptySuggestionsHintEnabled && isCopilotRecommendations && !suggestionInProgress && maxUploadNum > 0 && _.isEmpty(imagesToSuggest);\r\n\r\n return (\r\n <React.Fragment>\r\n <div className={classes.ImageSuggestionCarouselContainer}>\r\n {shouldDisplayEmptySuggestionsHint && (\r\n <MessageBar\r\n className={classNames('empty-image-suggestions-hint', classes.InfoMessageBar)}\r\n isMultiline\r\n messageBarType={MessageBarType.info}\r\n >\r\n {customMessageBarText || i18n.getString(_TL_('Select the add image icon above to find relevant stock images or generate custom AI images for your ads.'))\r\n }\r\n </MessageBar>\r\n )}\r\n <UiBlocker\r\n blocking={blockCarousel}\r\n loadingText={i18n.getString(_TL_('Loading'))}\r\n >\r\n <ImageSuggestionCarousel\r\n title={_TL_('Recommended images')}\r\n helpTopic={isCopilotRecommendations ? 'pop_BA_Recommendations_Pmax_Recommended_Images' : 'pop_BA_Recommendations_Pmax_images'}\r\n isLoading={suggestionInProgress}\r\n images={maxUploadNum > 0 ? imagesToSuggest : []}\r\n i18n={i18n}\r\n isEmpty={carousel && carousel.isError}\r\n messageInfo={carouselErrorMessage}\r\n onSelectImage={onSelectImage}\r\n onSelectSeeAll={onSelectSeeAllImages}\r\n showEllipsisWhenNoMoreImages\r\n showViewAllInHeader={isCopilotRecommendations}\r\n stylingOverrides={{\r\n getCarouselStyles,\r\n getFullyShownImagesCount,\r\n initialImageContainerLeftMargin,\r\n seeAllLinkText: _TL_('View all'),\r\n }}\r\n onOffsetChange={onOffsetChange}\r\n />\r\n </UiBlocker>\r\n </div>\r\n {isSuggestionsPanelOpen &&\r\n <ImageRecommendationsPanel\r\n i18n={i18n}\r\n title={_TL_('Recommended images')}\r\n images={panelState.panelImages}\r\n themes={themes}\r\n hasMore={panelState.hasMore}\r\n loadNextPage={panelState.getMoreImageSuggestions}\r\n onSelectImage={onSelectImage}\r\n onDismiss={() => setIsSuggestionsPanelOpen(false)}\r\n isMultiSelect={isCopilotRecommendations}\r\n onAdd={onAdd}\r\n maxUploadNum={maxUploadNum}\r\n />\r\n }\r\n </React.Fragment>);\r\n};\r\n\r\nPerfMaxImageSuggestionCarouselInternal.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n instrumentation: PropTypes.shape({}).isRequired,\r\n addImageCallback: PropTypes.func.isRequired,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n DisplayPlusCopilotRecommendations: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n maxUploadNum: PropTypes.number.isRequired,\r\n isCopilotRecommendations: PropTypes.bool,\r\n customMessageBarText: PropTypes.string,\r\n};\r\n\r\nPerfMaxImageSuggestionCarouselInternal.defaultProps = {\r\n isCopilotRecommendations: true,\r\n};\r\n\r\nexport const PerfMaxImageSuggestionCarousel = withPermissions(withInstrumentation(PerfMaxImageSuggestionCarouselInternal));\r\n","import React, { useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n TextTitle,\r\n ValidatedPanel,\r\n getPanelErrorProps,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { ImageListPortalContainerWithControlErrorHandling } from './image-list-portal-container';\r\nimport { PerfMaxImageSuggestionCarousel } from './perf-max-image-suggestion-carousel';\r\nimport { ImageListSummaryCardDetails } from './image-list-card-details';\r\nimport ImageAssetsImg from '../media/image-assets.svg';\r\n\r\nexport const ImageListPortalContainerWithCarouselSection = ({\r\n expand,\r\n images,\r\n imageLimit,\r\n maxUploadNum,\r\n containerRef,\r\n containerState,\r\n addImageCallback,\r\n classes,\r\n isMultimediaAd,\r\n ...rest\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <ValidatedPanel\r\n key=\"images\"\r\n title={<TextTitle\r\n titleKey={_TL_('Images')}\r\n topicKey=\"pop_BA_CampaignCreate_AudAds_Images\"\r\n icon={ImageAssetsImg}\r\n iconAltText={i18n.getString(_TL_('\"Images\" panel\\'s image'))}\r\n details={<ImageListSummaryCardDetails i18n={i18n} images={images} isLogos={false} />}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'images',\r\n }}\r\n {...rest}\r\n >\r\n <span>\r\n {i18n.getString(_TL_('You can add up to {{limit}} images to your ad.'), { limit: imageLimit })}\r\n {isMultimediaAd && i18n.getString(_TL_(' Required aspect ratios: 1.91:1 and 1:1. Minimum image upload dimensions: 703 x 368 pixels.'))}\r\n </span>\r\n <div className={classes.imageExperienceStyle}>\r\n <ImageListPortalContainerWithControlErrorHandling\r\n i18n={i18n}\r\n containerRef={containerRef}\r\n containerState={containerState}\r\n isLogos={false}\r\n />\r\n <PerfMaxImageSuggestionCarousel\r\n i18n={i18n}\r\n addImageCallback={addImageCallback}\r\n maxUploadNum={maxUploadNum}\r\n />\r\n </div>\r\n </ValidatedPanel>\r\n );\r\n};\r\n\r\nImageListPortalContainerWithCarouselSection.propTypes = {\r\n expand: PropTypes.func.isRequired,\r\n images: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n imageLimit: PropTypes.number.isRequired,\r\n maxUploadNum: PropTypes.number.isRequired,\r\n containerRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }).isRequired,\r\n containerState: PropTypes.shape({}),\r\n addImageCallback: PropTypes.func.isRequired,\r\n classes: PropTypes.shape({\r\n imageExperienceStyle: PropTypes.string,\r\n }),\r\n isMultimediaAd: PropTypes.bool,\r\n};\r\n\r\nImageListPortalContainerWithCarouselSection.defaultProps = {\r\n containerState: {},\r\n classes: {},\r\n isMultimediaAd: true,\r\n};\r\n","import React, { useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n TextTitle,\r\n ValidatedPanel,\r\n getPanelErrorProps,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { ImageListPortalContainerWithControlErrorHandling } from './image-list-portal-container';\r\nimport { ImageListSummaryCardDetails } from './image-list-card-details';\r\nimport LogoAssetsImg from '../media/logo-assets.svg';\r\n\r\nexport const LogoListPortalContainerSection = ({\r\n expand,\r\n images,\r\n containerRef,\r\n containerState,\r\n ...rest\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <ValidatedPanel\r\n key=\"logos\"\r\n title={<TextTitle\r\n titleKey={_TL_('Logos')}\r\n icon={LogoAssetsImg}\r\n iconAltText={i18n.getString(_TL_('\"Logos\" panel\\'s image'))}\r\n topicKey=\"pop_BA_CampaignCreate_MMA_Logos\"\r\n details={<ImageListSummaryCardDetails i18n={i18n} images={images} isLogos />}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'logos',\r\n }}\r\n {...rest}\r\n >\r\n <span>{i18n.getString(_TL_('You can add up to 5 different logos. Each logo can have one or both 4:1 aspect ratio and 1:1 aspect ratio.'))}</span>\r\n <ImageListPortalContainerWithControlErrorHandling\r\n i18n={i18n}\r\n containerRef={containerRef}\r\n containerState={containerState}\r\n isLogos\r\n />\r\n </ValidatedPanel>\r\n );\r\n};\r\n\r\nLogoListPortalContainerSection.propTypes = {\r\n expand: PropTypes.func.isRequired,\r\n images: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n containerRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }).isRequired,\r\n containerState: PropTypes.shape({}),\r\n};\r\n\r\nLogoListPortalContainerSection.defaultProps = {\r\n containerState: {},\r\n};\r\n","import React, { useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n TextTitle,\r\n ValidatedPanel,\r\n getPanelErrorProps,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { ImageListPortalContainerWithControlErrorHandling } from './image-list-portal-container';\r\nimport { ImageListSummaryCardDetails } from './image-list-card-details';\r\nimport ImageAssetsImg from '../media/image-assets.svg';\r\n\r\nexport const ImageListPortalContainerSection = ({\r\n expand,\r\n images,\r\n imageLimit,\r\n containerRef,\r\n containerState,\r\n classes,\r\n ...rest\r\n}) => {\r\n const i18n = useContext(I18nContext);\r\n return (\r\n <ValidatedPanel\r\n key=\"images\"\r\n title={<TextTitle\r\n titleKey={_TL_('Images')}\r\n topicKey=\"pop_BA_CampaignCreate_AudAds_Images\"\r\n icon={ImageAssetsImg}\r\n iconAltText={i18n.getString(_TL_('\"Images\" panel\\'s image'))}\r\n details={<ImageListSummaryCardDetails i18n={i18n} images={images} isLogos={false} />}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'images',\r\n }}\r\n {...rest}\r\n >\r\n <span>{i18n.getString(_TL_('You can add up to {{limit}} images to your ad.'), { limit: imageLimit })}</span>\r\n <div className={classes.imageExperienceStyle}>\r\n <ImageListPortalContainerWithControlErrorHandling\r\n i18n={i18n}\r\n containerRef={containerRef}\r\n containerState={containerState}\r\n isLogos={false}\r\n />\r\n </div>\r\n </ValidatedPanel>\r\n );\r\n};\r\n\r\nImageListPortalContainerSection.propTypes = {\r\n expand: PropTypes.func.isRequired,\r\n images: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n imageLimit: PropTypes.number.isRequired,\r\n containerRef: PropTypes.shape({\r\n current: PropTypes.shape({}),\r\n }).isRequired,\r\n containerState: PropTypes.shape({}),\r\n classes: PropTypes.shape({\r\n imageExperienceStyle: PropTypes.string,\r\n }),\r\n};\r\n\r\nImageListPortalContainerSection.defaultProps = {\r\n containerState: {},\r\n classes: {},\r\n};\r\n","export const mockRecommendations = {\r\n Headlines: [\r\n { text: 'Best Nike Shoes' },\r\n { text: 'Nike Com Shoes' },\r\n { text: 'Fitness Gear For All You Do' },\r\n ],\r\n LongHeadlines: [\r\n { text: 'Style your summer. Discover your summer color. The latest from Nike basketball' },\r\n { text: 'Shipping on all orders. Customize your so-you shoes.' },\r\n { text: 'Shop member exclusive styles' },\r\n ],\r\n Descriptions: [\r\n { text: 'Discover you summer color. The latest from Nike.' },\r\n { text: 'Shop member exclusive styles' },\r\n ],\r\n};\r\n\r\nexport const unlocalizedRecommendationTitle = {\r\n Headlines: _TL_('View recommended healines'),\r\n LongHeadlines: _TL_('View recommended long healines'),\r\n Descriptions: _TL_('View recommended descriptions'),\r\n};\r\n","export const getTextAssetRecommendationsStyles = () => ({\r\n TextAssetRecommendationsContent: {\r\n '& .text-recommendation-title': {\r\n fontWeight: 'bold',\r\n fontSize: '14px',\r\n padding: '8px 9px 8px 9px',\r\n },\r\n '& .ms-Button': {\r\n border: 'none',\r\n textAlign: 'left',\r\n paddingLeft: '5px',\r\n marginLeft: '0px',\r\n marginBottom: '5px',\r\n '& .ms-Button-label': {\r\n fontWeight: 'normal',\r\n fontSize: '14px',\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const getFinalUrlRecommendationsStyles = () => ({\r\n TextFinalUrlRecommendationsContent: {\r\n '& .text-recommendation-title': {\r\n fontWeight: 'bold',\r\n fontSize: '14px',\r\n padding: '8px 9px 8px 9px',\r\n },\r\n '& .ms-Button': {\r\n border: 'none',\r\n textAlign: 'left',\r\n paddingLeft: '5px',\r\n marginLeft: '0px',\r\n marginBottom: '5px',\r\n '& .ms-Button-label': {\r\n fontWeight: 'normal',\r\n fontSize: '14px',\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const getTextAssetRecommendationsDropdownStyles = () => ({\r\n TextAssetRecommendationsDropdown: {\r\n listStyle: 'none',\r\n margin: 0,\r\n padding: 0,\r\n maxHeight: 250,\r\n width: '100%',\r\n\r\n '& li': {\r\n display: 'list-item',\r\n fontSize: 14,\r\n height: 36,\r\n },\r\n\r\n '& .text-asset-recommendation-theme-icon': {\r\n position: 'absolute',\r\n left: 12,\r\n marginTop: 12,\r\n },\r\n\r\n '& .text-asset-recommendation-theme-title': {\r\n borderTop: '1px solid #f3f2f1',\r\n fontWeight: 'bold',\r\n padding: '12px 8px 0 36px',\r\n },\r\n\r\n '& .text-asset-recommendation-asset': {\r\n '& .ms-Button': {\r\n border: 'none',\r\n height: 36,\r\n width: '100%',\r\n margin: 0,\r\n padding: '0 8px 0 32px',\r\n textAlign: 'left',\r\n\r\n '& .ms-Button-label': {\r\n fontWeight: 'normal',\r\n },\r\n },\r\n },\r\n },\r\n});\r\n","import { contains, filter, map, property, values, size, isEmpty, negate, isFunction } from 'underscore';\r\nimport React, { useCallback, useState, useMemo, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { DefaultButton, PrimaryButton, Panel, PanelType, Stack } from '@bingads-webui-react/fluent-controls';\r\nimport { SuggestedItemsMultiSelect } from '@bingads-webui-campaign-react/pill-item-components';\r\n\r\nconst SUGGESTED_ITEMS_PANEL_DESRCIPTION = _TL_('These are sourced from existing ads that share the same Final URL as the current asset group or from your website. Microsoft Adverting’s advanced AI models may generate asset recommendations based on your website content.');\r\n\r\nconst deriveSuggestedItems = (availableRecommendations, fieldValues) => () => {\r\n const selectedRecommendations = filter(fieldValues, text => contains(availableRecommendations, text));\r\n\r\n return map(availableRecommendations, text => ({\r\n key: text,\r\n itemText: text,\r\n isSelected: contains(selectedRecommendations, text),\r\n }));\r\n};\r\n\r\nexport const TextAssetRecommendationsPanel = ({\r\n i18n, onSave, onCancel, collection, availableRecommendations, maxCollectionSize, title, disabledSuggestionTooltip, reportDisplayedRecommendations,\r\n}) => {\r\n const fieldValues = useMemo(() => values(collection), [collection]);\r\n const [suggestedItems, setSuggestedItems] = useState(deriveSuggestedItems(availableRecommendations, fieldValues));\r\n const selectedItemsCount = useMemo(() => size(suggestedItems.filter(property('isSelected'))), [suggestedItems]);\r\n const emptyFieldsCount = useMemo(() => maxCollectionSize - size(filter(fieldValues, negate(isEmpty))), [maxCollectionSize, fieldValues]);\r\n const remaningItemsCount = emptyFieldsCount - selectedItemsCount;\r\n\r\n useEffect(() => {\r\n if (!isEmpty(availableRecommendations) && isFunction(reportDisplayedRecommendations)) {\r\n reportDisplayedRecommendations(availableRecommendations);\r\n }\r\n }, [availableRecommendations, reportDisplayedRecommendations]);\r\n\r\n const onSuggestedItemToggle = useCallback((itemIndex, itemText) => {\r\n setSuggestedItems(suggestedItems.map(item => ({\r\n ...item,\r\n isSelected: item.itemText === itemText ? !item.isSelected : item.isSelected,\r\n })));\r\n }, [suggestedItems]);\r\n\r\n const onSaveClick = useCallback(() => {\r\n onSave(suggestedItems.filter(property('isSelected')).map(item => item.itemText));\r\n }, [suggestedItems, onSave]);\r\n const onCancelClick = useCallback(() => {\r\n onCancel();\r\n }, [onCancel]);\r\n\r\n const onRenderFooterContent = useCallback(() => (\r\n <Stack className=\"text-asset-recommendations-panel-buttons\" horizontal tokens={{ childrenGap: 8 }}>\r\n <Stack.Item key=\"btn-add\">\r\n <PrimaryButton className=\"btn-add\" onClick={onSaveClick} disabled={!(selectedItemsCount > 0)}>\r\n {i18n.getString(_TL_('Add'))}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n <Stack.Item key=\"btn-cancel\">\r\n <DefaultButton className=\"btn-cancel\" onClick={onCancelClick}>\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack.Item>\r\n </Stack>\r\n ), [i18n, onSaveClick, onCancelClick, selectedItemsCount]);\r\n\r\n return (\r\n <Panel\r\n className={classNames('text-asset-recommendations-panel')}\r\n headerText={title}\r\n closeButtonAriaLabel={i18n.getString(_TL_('Close'))}\r\n isOpen\r\n onDismiss={onCancelClick}\r\n onRenderFooterContent={onRenderFooterContent}\r\n isFooterAtBottom\r\n type={PanelType.medium}\r\n >\r\n <SuggestedItemsMultiSelect\r\n suggestedItems={suggestedItems}\r\n onSuggestedItemToggle={onSuggestedItemToggle}\r\n suggestedSectionDescription={i18n.getString(SUGGESTED_ITEMS_PANEL_DESRCIPTION)}\r\n disableAllUnselectedSuggestions={!(remaningItemsCount > 0)}\r\n disabledSuggestionTooltip={disabledSuggestionTooltip}\r\n />\r\n </Panel>\r\n );\r\n};\r\n\r\nTextAssetRecommendationsPanel.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onSave: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n collection: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n availableRecommendations: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n title: PropTypes.string.isRequired,\r\n disabledSuggestionTooltip: PropTypes.string.isRequired,\r\n reportDisplayedRecommendations: PropTypes.func,\r\n};\r\n\r\nTextAssetRecommendationsPanel.defaultProps = {\r\n reportDisplayedRecommendations: undefined,\r\n};\r\n","import { chain, contains, filter, isEmpty, isFunction, map, negate, noop, property, size, values } from 'underscore';\r\nimport React, { useCallback, useState, useMemo, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { DefaultButton, PrimaryButton, Panel, PanelType, Stack } from '@bingads-webui-react/fluent-controls';\r\nimport { FluentProvider, makeStyles, webLightTheme } from '@fluentui/react-components';\r\nimport { SuggestedItemsMultiSelect } from '@bingads-webui-campaign-react/pill-item-components';\r\nimport { CopilotTab, CopilotTabItem } from '@bingads-webui/inline-copilot-ui';\r\nimport { HelpButton } from '@bingads-webui-react/help-popup';\r\n\r\nconst useInlineCopilotUIStyles = makeStyles({\r\n header: {\r\n display: 'flex',\r\n fontSize: '20px',\r\n fontWeight: '600',\r\n lineHeight: '27px',\r\n justifyContent: 'flex-start',\r\n paddingLeft: '24px',\r\n paddingRight: '24px',\r\n width: '100%',\r\n\r\n '& button': {\r\n marginLeft: '8px',\r\n },\r\n },\r\n theme: {\r\n marginTop: '10px',\r\n marginBottom: '16px',\r\n },\r\n summary: {\r\n marginLeft: '16px',\r\n },\r\n});\r\n\r\nconst deriveSuggestedItems = (recommendations, fieldValues) => () =>\r\n chain(recommendations)\r\n .map(({ name, assets }) => ({\r\n assets: map(assets, asset => ({\r\n key: asset,\r\n itemText: asset,\r\n theme: name,\r\n })),\r\n }))\r\n .pluck('assets')\r\n .flatten()\r\n .filter(({ itemText }) => !contains(fieldValues, itemText))\r\n .value();\r\n\r\nexport const TextAssetRecommendationsWithThemesPanel = ({\r\n i18n,\r\n onSave,\r\n onCancel,\r\n collection,\r\n availableRecommendations,\r\n maxCollectionSize,\r\n title,\r\n topicKey,\r\n topicAriaLabel,\r\n disabledSuggestionTooltip,\r\n reportDisplayedRecommendations,\r\n DKIThemeName,\r\n replaceMode,\r\n}) => {\r\n const [activeTheme, setActiveTheme] = useState(i18n.getString(_TL_('All')));\r\n\r\n const fieldValues = useMemo(() => values(collection), [collection]);\r\n const [allSuggestedItems, setAllSuggestedItems] = useState(deriveSuggestedItems(availableRecommendations, fieldValues));\r\n const [suggestedItems, setSuggestedItems] = useState(allSuggestedItems);\r\n\r\n const selectedItemsCount = useMemo(() => size(allSuggestedItems.filter(property('isSelected'))), [allSuggestedItems]);\r\n const emptyFieldsCount = useMemo(() => (replaceMode? 1: maxCollectionSize - size(filter(fieldValues, negate(isEmpty)))), [maxCollectionSize, fieldValues, replaceMode]);\r\n const remaningItemsCount = useMemo(() => (replaceMode? (1 - selectedItemsCount) : emptyFieldsCount - selectedItemsCount), [emptyFieldsCount, selectedItemsCount, replaceMode]);\r\n\r\n const styles = useInlineCopilotUIStyles();\r\n\r\n useEffect(() => {\r\n if (!isEmpty(availableRecommendations) && isFunction(reportDisplayedRecommendations)) {\r\n // TODO: Logging\r\n // reportDisplayedRecommendations(availableRecommendations);\r\n }\r\n }, [availableRecommendations, reportDisplayedRecommendations]);\r\n\r\n const onSwitchTheme = useCallback((theme) => {\r\n setActiveTheme(theme);\r\n if (theme === i18n.getString(_TL_('All'))) {\r\n setSuggestedItems(allSuggestedItems);\r\n } else {\r\n setSuggestedItems(filter(allSuggestedItems, item => item.theme === theme));\r\n }\r\n }, [allSuggestedItems, i18n]);\r\n\r\n const onSuggestedItemToggle = useCallback((itemIndex, itemText) => {\r\n setSuggestedItems(suggestedItems.map(item => ({\r\n ...item,\r\n isSelected: item.itemText === itemText ? !item.isSelected : item.isSelected,\r\n })));\r\n setAllSuggestedItems(allSuggestedItems.map(item => ({\r\n ...item,\r\n isSelected: item.itemText === itemText ? !item.isSelected : item.isSelected,\r\n })));\r\n }, [allSuggestedItems, suggestedItems]);\r\n\r\n const onSaveClick = useCallback(() => {\r\n onSave(allSuggestedItems.filter(property('isSelected')).map(item => item.itemText));\r\n }, [allSuggestedItems, onSave]);\r\n\r\n const onCancelClick = useCallback(() => {\r\n onCancel();\r\n }, [onCancel]);\r\n\r\n const onRenderHeader = useCallback(() => (\r\n <div className={styles.header}>\r\n <span>{title}</span>\r\n <HelpButton\r\n topic={topicKey}\r\n aria-label={topicAriaLabel}\r\n />\r\n </div>\r\n ), [styles.header, title, topicAriaLabel, topicKey]);\r\n\r\n const onRenderFooterContent = useCallback(() => (\r\n <Stack className=\"text-asset-recommendations-panel-buttons\" horizontal tokens={{ childrenGap: 8 }}>\r\n <Stack.Item key=\"btn-add\">\r\n <PrimaryButton className=\"btn-add\" onClick={onSaveClick} disabled={!(selectedItemsCount > 0)}>\r\n {replaceMode? i18n.getString(_TL_('Replace')) : i18n.getString(_TL_('Add'))}\r\n </PrimaryButton>\r\n </Stack.Item>\r\n <Stack.Item key=\"btn-cancel\">\r\n <DefaultButton className=\"btn-cancel\" onClick={onCancelClick}>\r\n {i18n.getString(_TL_('Cancel'))}\r\n </DefaultButton>\r\n </Stack.Item>\r\n <Stack.Item key=\"selection-summary\" align=\"center\">\r\n <span className={styles.summary}>\r\n {i18n.getString(_TL_('{{count}} selected'), { count: selectedItemsCount })}\r\n </span>\r\n </Stack.Item>\r\n </Stack>\r\n ), [onSaveClick, selectedItemsCount, i18n, onCancelClick, styles.summary, replaceMode]);\r\n\r\n return (\r\n <Panel\r\n className={classNames('text-asset-recommendations-panel')}\r\n closeButtonAriaLabel={i18n.getString(_TL_('Close'))}\r\n onDismiss={onCancelClick}\r\n onOuterClick={noop}\r\n onRenderHeader={onRenderHeader}\r\n onRenderFooterContent={onRenderFooterContent}\r\n isFooterAtBottom\r\n isOpen\r\n type={PanelType.medium}\r\n focusTrapZoneProps={{\r\n disableFirstFocus: true,\r\n }}\r\n >\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={styles.theme}>\r\n <CopilotTab\r\n active={activeTheme}\r\n onActiveChange={key => onSwitchTheme(key)}\r\n >\r\n <CopilotTabItem tabKey={i18n.getString(_TL_('All'))}>\r\n {i18n.getString(_TL_('All'))}\r\n </CopilotTabItem>\r\n {map(availableRecommendations, ({ name }) => (\r\n <CopilotTabItem tabKey={name}>\r\n {name === DKIThemeName ? i18n.getString(DKIThemeName) : name}\r\n </CopilotTabItem>\r\n ))}\r\n </CopilotTab>\r\n </div>\r\n <SuggestedItemsMultiSelect\r\n key={activeTheme}\r\n suggestedItems={suggestedItems}\r\n onSuggestedItemToggle={onSuggestedItemToggle}\r\n disableAllUnselectedSuggestions={!(remaningItemsCount > 0)}\r\n disabledSuggestionTooltip={disabledSuggestionTooltip}\r\n />\r\n </FluentProvider>\r\n </Panel>\r\n );\r\n};\r\n\r\nTextAssetRecommendationsWithThemesPanel.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onSave: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n collection: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.shape({}))).isRequired,\r\n availableRecommendations: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n title: PropTypes.string.isRequired,\r\n topicKey: PropTypes.string.isRequired,\r\n topicAriaLabel: PropTypes.string.isRequired,\r\n disabledSuggestionTooltip: PropTypes.string.isRequired,\r\n reportDisplayedRecommendations: PropTypes.func,\r\n DKIThemeName: PropTypes.string,\r\n replaceMode: PropTypes.bool,\r\n};\r\n\r\nTextAssetRecommendationsWithThemesPanel.defaultProps = {\r\n reportDisplayedRecommendations: undefined,\r\n DKIThemeName: '',\r\n replaceMode: false,\r\n};\r\n","import { chain, findKey, isEmpty, isFunction, result, size } from 'underscore';\r\nimport React, { useCallback, useState, useEffect, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Separator } from '@bingads-webui-react/fluent-controls';\r\nimport { SuggestionSectionCollapse } from '@bingads-webui-campaign-react/pill-item-components';\r\n\r\nimport RecommendationsSectionIcon from '../media/recommendations-section.svg';\r\nimport { useCircularBufferView } from './use-circular-buffer-view';\r\nimport { TextAssetRecommendationsPanel } from './text-asset-recommendations-panel';\r\nimport { TextAssetRecommendationsWithThemesPanel } from './text-asset-recommendations-with-themes-panel';\r\n\r\nexport const MAX_INLINE_RECOMMENDATIONS_PER_PAGE = 5;\r\nexport const MAX_DKI_INLINE_RECOMMENDATIONS_PER_PAGE = 1;\r\n\r\nconst keyIsEmpty = ([text] = []) => isEmpty(text);\r\n\r\nexport const InlineRecommendations = ({\r\n i18n, collection, maxCollectionSize, availableRecommendations, singleAssetValidationPropsField,\r\n inlineRecommendationsHelpTopicKey, inlineRecommendationsHelpTopicAriaLabel, inlineRecommendationsTitle,\r\n inlineRecommendationsDisabledItemTooltip, applyRecommendation, applyRecommendations,\r\n reportDisplayedRecommendations, permissions, enableCopilotRecommendations,\r\n hideAddAllSuggestionsButton, enableDKI, DKIThemeName, replaceMode,\r\n}) => {\r\n const flattenedAvailableRecommendations = useMemo(() => {\r\n if (enableCopilotRecommendations) {\r\n return chain(availableRecommendations)\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .value();\r\n }\r\n return availableRecommendations;\r\n }, [availableRecommendations, enableCopilotRecommendations]);\r\n\r\n const flattenedAllAvailableRecommendations = useMemo(() => {\r\n if (enableCopilotRecommendations && enableDKI) {\r\n const flattenedAvailableDKIRecommendations = chain(availableRecommendations.filter(theme => theme.name === DKIThemeName))\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .uniq() // dedup\r\n .value();\r\n\r\n const flattenedAvailableNoDKIRecommendations = chain(availableRecommendations.filter(theme => theme.name !== DKIThemeName))\r\n .map(theme => result(theme, 'assets'))\r\n .flatten()\r\n .compact()\r\n .uniq() // dedup\r\n .value();\r\n return [...flattenedAvailableDKIRecommendations.slice(0, MAX_DKI_INLINE_RECOMMENDATIONS_PER_PAGE), ...flattenedAvailableNoDKIRecommendations];\r\n }\r\n return flattenedAvailableRecommendations;\r\n }, [DKIThemeName, availableRecommendations, enableCopilotRecommendations, enableDKI, flattenedAvailableRecommendations]);\r\n\r\n const [availableInlineRecommendations, canMoveNext, moveNext] = useCircularBufferView(flattenedAllAvailableRecommendations, MAX_INLINE_RECOMMENDATIONS_PER_PAGE);\r\n\r\n useEffect(() => {\r\n if (!isEmpty(availableInlineRecommendations) && isFunction(reportDisplayedRecommendations)) {\r\n reportDisplayedRecommendations(availableInlineRecommendations);\r\n }\r\n }, [availableInlineRecommendations, reportDisplayedRecommendations]);\r\n\r\n const firstAvailableKey = useMemo(() => {\r\n let keyToUpdate = findKey(collection, keyIsEmpty);\r\n\r\n if (!keyToUpdate) {\r\n if (size(collection) < maxCollectionSize) {\r\n keyToUpdate = `${singleAssetValidationPropsField}${size(collection)}`;\r\n } else if (replaceMode) {\r\n keyToUpdate = `${singleAssetValidationPropsField}${size(collection) -1}`;\r\n }\r\n }\r\n return keyToUpdate;\r\n }, [collection, singleAssetValidationPropsField, maxCollectionSize, replaceMode]);\r\n\r\n const [prevAvailbleKeyWasDefined, setPrevAvailbleKeyWasDefined] = useState(!!firstAvailableKey);\r\n const [shouldForceCloseCollapse, setShouldForceCloseCollapse] = useState(!firstAvailableKey);\r\n useEffect(() => {\r\n const firstAvailableKeyIsDefined = !!firstAvailableKey;\r\n if (prevAvailbleKeyWasDefined !== firstAvailableKeyIsDefined) {\r\n if (!shouldForceCloseCollapse && (prevAvailbleKeyWasDefined && !firstAvailableKeyIsDefined)) {\r\n setShouldForceCloseCollapse(true);\r\n } else if (shouldForceCloseCollapse && (!prevAvailbleKeyWasDefined && firstAvailableKeyIsDefined)) {\r\n setShouldForceCloseCollapse(false);\r\n }\r\n setPrevAvailbleKeyWasDefined(firstAvailableKeyIsDefined);\r\n }\r\n }, [firstAvailableKey, prevAvailbleKeyWasDefined, shouldForceCloseCollapse]);\r\n\r\n const onAddSuggestedItem = useCallback(\r\n (itemIndex, itemText) => firstAvailableKey && applyRecommendation(firstAvailableKey, itemText),\r\n [firstAvailableKey, applyRecommendation]\r\n );\r\n\r\n const onAddAllSuggestedItems = useCallback(\r\n () => applyRecommendations(availableInlineRecommendations),\r\n [availableInlineRecommendations, applyRecommendations]\r\n );\r\n\r\n const [isSuggestionsPanelOpen, setIsSuggestionsPanelOpen] = useState(false);\r\n\r\n const onMoreSuggestionsButtonClick = useCallback(() => {\r\n setIsSuggestionsPanelOpen(true);\r\n reportDisplayedRecommendations(flattenedAvailableRecommendations);\r\n }, [flattenedAvailableRecommendations, reportDisplayedRecommendations]);\r\n\r\n const onCancelAddingMultipleRecommendations = useCallback(\r\n () => setIsSuggestionsPanelOpen(false),\r\n []\r\n );\r\n\r\n const onAddMultipleRecommendations = useCallback(\r\n (recommendations) => {\r\n applyRecommendations(recommendations, replaceMode);\r\n setIsSuggestionsPanelOpen(false);\r\n },\r\n [applyRecommendations, replaceMode]\r\n );\r\n\r\n if (!isEmpty(availableInlineRecommendations)) {\r\n return (\r\n <>\r\n <Separator styles={{ root: { marginBottom: 6 } }} />\r\n <SuggestionSectionCollapse\r\n topicKey={inlineRecommendationsHelpTopicKey}\r\n topicAriaLabel={i18n.getString(inlineRecommendationsHelpTopicAriaLabel)}\r\n icon={RecommendationsSectionIcon}\r\n iconAltText={inlineRecommendationsTitle}\r\n suggestedItems={availableInlineRecommendations.map(itemText => ({ itemText, key: itemText }))}\r\n onAddSuggestedItem={onAddSuggestedItem}\r\n onAddAllSuggestedItems={onAddAllSuggestedItems}\r\n suggestedSectionTitle={i18n.getString(inlineRecommendationsTitle)}\r\n showSuggestionsSectionShimmer={false}\r\n showMoreSuggestionsInlineButton={canMoveNext}\r\n onMoreSuggestionsInlineButtonClick={moveNext}\r\n showAddAllSuggestionsButton={!hideAddAllSuggestionsButton && !!firstAvailableKey}\r\n addAllSuggestionsButtonText={i18n.getString(_TL_('Add all'))}\r\n showMoreSuggestionsButton={canMoveNext}\r\n moreSuggestionsButtonText={i18n.getString(_TL_('View more'))}\r\n disableAllSuggestions={!firstAvailableKey}\r\n disabledSuggestionTooltip={i18n.getString(inlineRecommendationsDisabledItemTooltip)}\r\n useStyleFluent2\r\n onMoreSuggestionsButtonClick={onMoreSuggestionsButtonClick}\r\n forceClose={shouldForceCloseCollapse}\r\n />\r\n {isSuggestionsPanelOpen && (enableCopilotRecommendations ?\r\n <TextAssetRecommendationsWithThemesPanel\r\n i18n={i18n}\r\n collection={collection}\r\n availableRecommendations={availableRecommendations}\r\n allRecommendations={flattenedAvailableRecommendations}\r\n maxCollectionSize={maxCollectionSize}\r\n title={i18n.getString(inlineRecommendationsTitle)}\r\n topicKey={inlineRecommendationsHelpTopicKey}\r\n topicAriaLabel={i18n.getString(inlineRecommendationsHelpTopicAriaLabel)}\r\n onSave={onAddMultipleRecommendations}\r\n onCancel={onCancelAddingMultipleRecommendations}\r\n disabledSuggestionTooltip={i18n.getString(inlineRecommendationsDisabledItemTooltip)}\r\n reportDisplayedRecommendations={reportDisplayedRecommendations}\r\n permissions={permissions}\r\n DKIThemeName={DKIThemeName}\r\n replaceMode={replaceMode}\r\n /> :\r\n <TextAssetRecommendationsPanel\r\n i18n={i18n}\r\n collection={collection}\r\n availableRecommendations={availableRecommendations}\r\n maxCollectionSize={maxCollectionSize}\r\n title={i18n.getString(inlineRecommendationsTitle)}\r\n onSave={onAddMultipleRecommendations}\r\n onCancel={onCancelAddingMultipleRecommendations}\r\n disabledSuggestionTooltip={i18n.getString(inlineRecommendationsDisabledItemTooltip)}\r\n reportDisplayedRecommendations={reportDisplayedRecommendations}\r\n />\r\n )}\r\n </>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nInlineRecommendations.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n collection: PropTypes.objectOf(PropTypes.string).isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n availableRecommendations: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n singleAssetValidationPropsField: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicKey: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicAriaLabel: PropTypes.string.isRequired,\r\n inlineRecommendationsTitle: PropTypes.string.isRequired,\r\n inlineRecommendationsDisabledItemTooltip: PropTypes.string.isRequired,\r\n applyRecommendation: PropTypes.func.isRequired,\r\n applyRecommendations: PropTypes.func.isRequired,\r\n reportDisplayedRecommendations: PropTypes.func,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n hideAddAllSuggestionsButton: PropTypes.bool,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n replaceMode: PropTypes.bool,\r\n};\r\n\r\nInlineRecommendations.defaultProps = {\r\n reportDisplayedRecommendations: undefined,\r\n enableCopilotRecommendations: true,\r\n hideAddAllSuggestionsButton: false,\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n replaceMode: false,\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\n\r\nexport const useCircularBufferView = (collection, pageSize) => {\r\n const [page, setPage] = useState([]);\r\n const [currentIndex, setCurrentIndex] = useState(0);\r\n\r\n useEffect(() => {\r\n if (collection.length === 0) {\r\n setPage([]);\r\n return;\r\n }\r\n\r\n const newPage = [];\r\n let index = currentIndex % collection.length;\r\n let count = 0;\r\n while (count < pageSize && count < collection.length) {\r\n newPage.push(collection[index]);\r\n index = (index + 1) % collection.length;\r\n count += 1;\r\n }\r\n setPage(newPage);\r\n }, [collection, currentIndex, pageSize]);\r\n\r\n const canMoveNext = collection.length > pageSize;\r\n\r\n const moveNext = useCallback(() => {\r\n setCurrentIndex((currentIndex + pageSize) % collection.length);\r\n }, [currentIndex, collection.length, pageSize]);\r\n\r\n return [page, canMoveNext, moveNext];\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { DefaultButton, FontIcon } from '@bingads-webui-react/fluent-controls';\r\nimport { registerIcons } from '@fluentui/style-utilities';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n\r\nimport { getTextAssetRecommendationsDropdownStyles } from './styles';\r\nimport copilot from '../media/copilot.svg';\r\n\r\nregisterIcons({\r\n icons: {\r\n copilot: (<img src={copilot} alt=\"copilot\" />),\r\n },\r\n});\r\n\r\nconst TextAssetRecommendationsDropdownUnstyled = ({\r\n classes,\r\n assetKey,\r\n applyRecommendation,\r\n recommendations,\r\n i18n,\r\n DKIThemeName,\r\n}) => (\r\n <ul className={classnames('text-asset-recommendation-list', classes.TextAssetRecommendationsDropdown)} role=\"menu\">\r\n {\r\n recommendations.map(({ name, assets }) => (\r\n <>\r\n <FontIcon className=\"text-asset-recommendation-theme-icon\" iconName=\"copilot\" />\r\n <li className=\"text-asset-recommendation-theme-title\" role=\"presentation\">\r\n {name === DKIThemeName ? i18n.getString(DKIThemeName) : name}\r\n </li>\r\n {\r\n assets.map(asset => (\r\n <li className=\"text-asset-recommendation-asset\" role=\"menuitem\">\r\n <DefaultButton onClick={() => applyRecommendation(assetKey, asset)}>\r\n {asset}\r\n </DefaultButton>\r\n </li>\r\n ))\r\n }\r\n </>\r\n ))\r\n }\r\n </ul>\r\n);\r\n\r\nTextAssetRecommendationsDropdownUnstyled.propTypes = {\r\n classes: PropTypes.shape({\r\n TextAssetRecommendationsDropdown: PropTypes.string,\r\n }).isRequired,\r\n assetKey: PropTypes.string.isRequired,\r\n applyRecommendation: PropTypes.func.isRequired,\r\n recommendations: PropTypes.arrayOf(PropTypes.shape({\r\n name: PropTypes.string,\r\n assets: PropTypes.arrayOf(PropTypes.string),\r\n })).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n DKIThemeName: PropTypes.string,\r\n};\r\n\r\nTextAssetRecommendationsDropdownUnstyled.defaultProps = {\r\n DKIThemeName: '',\r\n};\r\n\r\nexport const TextAssetRecommendationsDropdown = withDefaultStyles(TextAssetRecommendationsDropdownUnstyled, getTextAssetRecommendationsDropdownStyles);\r\n","import _ from 'underscore';\r\nimport { propertyIs } from '@bingads-webui-campaign-react/form-error';\r\n\r\nexport const DKIThemeDefaultName = 'Asset_Theme_For_DKI';\r\nconst pmaxCollectionConfig = {\r\n headlines: {\r\n labelText: _TL_('Short headlines (up to 15)'),\r\n placeholderText: _TL_('Enter your short headline'),\r\n fieldName: 'short-headline',\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your short headline'),\r\n deleteButtonLabel: _TL_('Remove short headline'),\r\n minCollectionSize: 3,\r\n maxCollectionSize: 15,\r\n errorMessage: _TL_('At least three short headlines are required'),\r\n helpPopupTopic: ' pop_BA_CampaignCreate_AudAds_ShortHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended short headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Shortheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about short headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of short headlines. Please remove one short headline if you\\'d like to add this recommended short headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headlines') },\r\n },\r\n longHeadlines: {\r\n labelText: _TL_('Long headlines (up to five)'),\r\n placeholderText: _TL_('Enter your long headline'),\r\n fieldName: 'long-headline',\r\n singleAssetValidationPropsField: 'LongHeadline',\r\n validationPropsField: 'LongHeadlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your long headline'),\r\n deleteButtonLabel: _TL_('Remove long headline'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 5,\r\n errorMessage: _TL_('At least one long headline is required'),\r\n helpPopupTopic: 'pop_BA_CampaignCreate_AudAds_LongHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about long headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended long headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Longheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about long headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of long headlines. Please remove one long headline if you\\'d like to add this recommended long headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('LongHeadlines') },\r\n },\r\n descriptions: {\r\n labelText: _TL_('Descriptions (up to five)'),\r\n placeholderText: _TL_('Enter your description'),\r\n fieldName: 'description',\r\n singleAssetValidationPropsField: 'Description',\r\n validationPropsField: 'Descriptions',\r\n addButtonText: _TL_('Add description'),\r\n copilotButtonLabel: _TL_('Get recommendations for your description'),\r\n deleteButtonLabel: _TL_('Remove description'),\r\n minCollectionSize: 2,\r\n maxCollectionSize: 5,\r\n errorMessage: _TL_('At least two descriptions are required'),\r\n helpPopupTopic: 'pop_BA_PMAX_Description',\r\n helpPopupAriaLabel: _TL_('Click to learn more about descriptions'),\r\n inlineRecommendationsTitle: _TL_('Recommended descriptions '),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Descriptions',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about descriptions recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of descriptions. Please remove one description if you\\'d like to add this recommended description.'),\r\n duplicateErrorMessage: _TL_('Duplicate descriptions are not allowed'),\r\n formErrorProps: { filter: propertyIs('Descriptions') },\r\n },\r\n};\r\n\r\nconst unifiedAppAdsConfig = {\r\n headlines: {\r\n labelText: _TL_('Short headlines (up to 15)'),\r\n placeholderText: _TL_('Enter your short headline'),\r\n fieldName: 'short-headline',\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your short headline'),\r\n deleteButtonLabel: _TL_('Remove short headline'),\r\n minCollectionSize: 2,\r\n maxCollectionSize: 15,\r\n errorMessage: _TL_('At least two short headlines are required'),\r\n helpPopupTopic: ' pop_BA_CampaignCreate_AudAds_ShortHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended short headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Apps_Headlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about short headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of short headlines. Please remove one short headline if you\\'d like to add this recommended short headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headlines') },\r\n },\r\n descriptions: {\r\n labelText: _TL_('Descriptions (up to five)'),\r\n placeholderText: _TL_('Enter your description'),\r\n fieldName: 'description',\r\n singleAssetValidationPropsField: 'Description',\r\n validationPropsField: 'Descriptions',\r\n addButtonText: _TL_('Add description'),\r\n copilotButtonLabel: _TL_('Get recommendations for your description'),\r\n deleteButtonLabel: _TL_('Remove description'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 5,\r\n errorMessage: _TL_('At least two descriptions are required'),\r\n helpPopupTopic: 'pop_BA_PMAX_Description',\r\n helpPopupAriaLabel: _TL_('Click to learn more about descriptions'),\r\n inlineRecommendationsTitle: _TL_('Recommended descriptions '),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Apps_Descriptions',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about descriptions recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of descriptions. Please remove one description if you\\'d like to add this recommended description.'),\r\n duplicateErrorMessage: _TL_('Duplicate descriptions are not allowed'),\r\n formErrorProps: { filter: propertyIs('Descriptions') },\r\n },\r\n};\r\n\r\nconst windowsStoreAdsConfig = {\r\n headlines: {\r\n labelText: _TL_('Short headlines (up to 1)'),\r\n placeholderText: _TL_('Enter your short headline'),\r\n fieldName: 'short-headline',\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your short headline'),\r\n deleteButtonLabel: _TL_('Remove short headline'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 1,\r\n errorMessage: _TL_('At least two short headlines are required'),\r\n helpPopupTopic: ' pop_BA_CampaignCreate_AudAds_ShortHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended short headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Shortheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about short headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of short headlines. Please remove one short headline if you\\'d like to add this recommended short headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headlines') },\r\n },\r\n};\r\n\r\nexport const pmaxLiteCollectionConfig = {\r\n headlines: {\r\n fieldName: 'short-headline',\r\n validationPropsField: 'Headlines',\r\n singleAssetValidationPropsField: 'Headline',\r\n maxCollectionSize: 15,\r\n minCollectionSize: 3,\r\n labelText: _TL_('Short headlines'),\r\n placeholderText: _TL_('Enter your headline'),\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your short headline'),\r\n deleteButtonLabel: _TL_('Remove short headline'),\r\n errorMessage: _TL_('At least 3 short headlines are required'),\r\n helpPopupTopic: ' pop_BA_CampaignCreate_AudAds_ShortHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended short headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Shortheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about short headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of short headlines. Please remove one short headline if you\\'d like to add this recommended short headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headlines') },\r\n },\r\n longHeadlines: {\r\n fieldName: 'long-headline',\r\n validationPropsField: 'LongHeadlines',\r\n singleAssetValidationPropsField: 'LongHeadline',\r\n maxCollectionSize: 5,\r\n minCollectionSize: 1,\r\n labelText: _TL_('Long headlines'),\r\n placeholderText: _TL_('Enter your long headline'),\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your long headline'),\r\n deleteButtonLabel: _TL_('Remove long headline'),\r\n errorMessage: _TL_('At least 1 long headline is required'),\r\n helpPopupTopic: 'pop_BA_CampaignCreate_AudAds_LongHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about long headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended long headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Longheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about long headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of long headlines. Please remove one long headline if you\\'d like to add this recommended long headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('LongHeadlines') },\r\n },\r\n descriptions: {\r\n fieldName: 'description',\r\n validationPropsField: 'Descriptions',\r\n singleAssetValidationPropsField: 'Description',\r\n maxCollectionSize: 5,\r\n minCollectionSize: 2,\r\n labelText: _TL_('Descriptions'),\r\n placeholderText: _TL_('Enter your description'),\r\n addButtonText: _TL_('Add description'),\r\n copilotButtonLabel: _TL_('Get recommendations for your description'),\r\n deleteButtonLabel: _TL_('Remove description'),\r\n errorMessage: _TL_('At least 2 descriptions are required'),\r\n helpPopupTopic: 'pop_BA_PMAX_Description',\r\n helpPopupAriaLabel: _TL_('Click to learn more about descriptions'),\r\n inlineRecommendationsTitle: _TL_('Recommended descriptions '),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Descriptions',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about descriptions recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of descriptions. Please remove one description if you\\'d like to add this recommended description.'),\r\n duplicateErrorMessage: _TL_('Duplicate descriptions are not allowed'),\r\n formErrorProps: { filter: propertyIs('Descriptions') },\r\n },\r\n};\r\n\r\nexport const displayPlusCollectionConfig = {\r\n headlines: {\r\n labelText: _TL_('Short headlines (up to 15)'),\r\n placeholderText: _TL_('Enter your short headline'),\r\n fieldName: 'short-headline',\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your short headline'),\r\n deleteButtonLabel: _TL_('Remove short headline'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 15,\r\n errorMessage: _TL_('At least one short headline are required'),\r\n helpPopupTopic: ' pop_BA_CampaignCreate_AudAds_ShortHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended short headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Shortheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about short headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of short headlines. Please remove one short headline if you\\'d like to add this recommended short headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headlines') },\r\n },\r\n longHeadlines: {\r\n labelText: _TL_('Long headlines (up to five)'),\r\n placeholderText: _TL_('Enter your long headline'),\r\n fieldName: 'long-headline',\r\n singleAssetValidationPropsField: 'LongHeadline',\r\n validationPropsField: 'LongHeadlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your long headline'),\r\n deleteButtonLabel: _TL_('Remove long headline'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 5,\r\n errorMessage: _TL_('At least one long headline is required'),\r\n helpPopupTopic: 'pop_BA_CampaignCreate_AudAds_LongHeadline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about long headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended long headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Longheadlines',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about long headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of long headlines. Please remove one long headline if you\\'d like to add this recommended long headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('LongHeadlines') },\r\n },\r\n descriptions: {\r\n labelText: _TL_('Descriptions (up to five)'),\r\n placeholderText: _TL_('Enter a description'),\r\n fieldName: 'description',\r\n singleAssetValidationPropsField: 'Description',\r\n validationPropsField: 'Descriptions',\r\n addButtonText: _TL_('Add description'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 5,\r\n errorMessage: _TL_('At least one description is required'),\r\n helpPopupTopic: 'pop_BA_Onboarding_Descriptions',\r\n helpPopupAriaLabel: _TL_('Click to learn more about descriptions'),\r\n inlineRecommendationsTitle: _TL_('Recommended descriptions '),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_Recommendations_Pmax_Descriptions',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about descriptions recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You’ve reached the maximum number of descriptions. Please remove one description if you’d like to add this recommended description.'),\r\n duplicateErrorMessage: _TL_('Duplicate descriptions are not allowed'),\r\n formErrorProps: { filter: propertyIs('Descriptions') },\r\n },\r\n};\r\n\r\nexport const searchMMACollectionConfig = {\r\n ...pmaxLiteCollectionConfig,\r\n longHeadlines: {\r\n ...pmaxLiteCollectionConfig.longHeadlines,\r\n addButtonText: _TL_('Add long headline'),\r\n formErrorProps: { filter: propertyIs('ResponsiveAdLongHeadlines') },\r\n },\r\n headlines: {\r\n ...pmaxLiteCollectionConfig.headlines,\r\n minCollectionSize: 1,\r\n maxCollectionSize: 15,\r\n errorMessage: _TL_('At least 1 short headline is required'),\r\n formErrorProps: { filter: propertyIs('ResponsiveAdHeadlines') },\r\n enableDKI: true,\r\n DKIThemeName: _TL_('Headline with dynamic keyword'),\r\n },\r\n descriptions: {\r\n ...pmaxLiteCollectionConfig.descriptions,\r\n labelText: _TL_('Ad text'),\r\n minCollectionSize: 1,\r\n errorMessage: _TL_('At least 1 description is required'),\r\n formErrorProps: { filter: propertyIs('ResponsiveAdDescriptions') },\r\n },\r\n};\r\n\r\nexport const linkedinAdCollectionConfig = {\r\n headlines: {\r\n labelText: _TL_('Headline'),\r\n placeholderText: _TL_('Enter your headline'),\r\n fieldName: 'headline',\r\n singleAssetValidationPropsField: 'Headline',\r\n validationPropsField: 'Headlines',\r\n addButtonText: _TL_('Add headline'),\r\n copilotButtonLabel: _TL_('Get recommendations for your headline'),\r\n deleteButtonLabel: _TL_('Remove headline'),\r\n minCollectionSize: 1,\r\n maxCollectionSize: 1,\r\n errorMessage: _TL_('At least one headline are required'),\r\n helpPopupTopic: 'pop_BA_LinkedIn_Headline',\r\n helpPopupAriaLabel: _TL_('Click to learn more about short headlines'),\r\n inlineRecommendationsTitle: _TL_('Recommended headlines'),\r\n inlineRecommendationsHelpTopicKey: 'pop_BA_LinkedIn_Headline',\r\n inlineRecommendationsHelpTopicAriaLabel: _TL_('Click to learn more about headlines recommendations'),\r\n inlineRecommendationsDisabledItemTooltip: _TL_('You\\'ve reached the maximum number of headlines. Please remove one headline if you\\'d like to add this recommended headline.'),\r\n duplicateErrorMessage: _TL_('Duplicate headlines are not allowed'),\r\n formErrorProps: { filter: propertyIs('Headline') },\r\n hideAddButtonWhenLimitReached: true,\r\n hideAddAllSuggestionsButton: true,\r\n showAssetLabelledBy: true,\r\n replaceMode: true,\r\n },\r\n};\r\n\r\nexport const featureConfigMapping = {\r\n pmax: pmaxCollectionConfig,\r\n pmaxLite: pmaxLiteCollectionConfig,\r\n searchMMA: searchMMACollectionConfig,\r\n displayPlus: displayPlusCollectionConfig,\r\n linkedin: linkedinAdCollectionConfig,\r\n unifiedAppAds: unifiedAppAdsConfig,\r\n windowsStoreAds: windowsStoreAdsConfig,\r\n};\r\n\r\nexport const getTextAssetCollectionConfig = (collectionName, i18n, collectionConfig = pmaxCollectionConfig) => {\r\n const unlocalizedArgs = _.result(collectionConfig, collectionName, undefined);\r\n\r\n if (!unlocalizedArgs) {\r\n throw new Error(`Invalid text asset collection name: ${collectionName}`);\r\n }\r\n\r\n const localizedArgs = {\r\n ...unlocalizedArgs,\r\n labelText: i18n.getString(unlocalizedArgs.labelText),\r\n placeholderText: i18n.getString(unlocalizedArgs.placeholderText),\r\n addButtonText: i18n.getString(unlocalizedArgs.addButtonText),\r\n errorMessage: i18n.getString(unlocalizedArgs.errorMessage),\r\n helpPopupAriaLabel: i18n.getString(unlocalizedArgs.helpPopupAriaLabel),\r\n duplicateErrorMessage: i18n.getString(unlocalizedArgs.duplicateErrorMessage),\r\n };\r\n\r\n if (unlocalizedArgs.copilotButtonLabel) {\r\n localizedArgs.copilotButtonLabel = i18n.getString(unlocalizedArgs.copilotButtonLabel);\r\n }\r\n if (unlocalizedArgs.deleteButtonLabel) {\r\n localizedArgs.deleteButtonLabel = i18n.getString(unlocalizedArgs.deleteButtonLabel);\r\n }\r\n\r\n return localizedArgs;\r\n};\r\n","import React, { useCallback, useMemo, useContext, useState, useEffect } from 'react';\r\nimport { Callout, Stack, DefaultButton } from '@bingads-webui-react/fluent-controls';\r\nimport _, { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { FluentProvider, webLightTheme } from '@fluentui/react-components';\r\nimport { useId } from '@fluentui/react-hooks';\r\nimport {\r\n AssetEventRecordType,\r\n AssetPropertyName,\r\n AssetType,\r\n useEventLog,\r\n POST_ASSET_EVENT_NAME,\r\n EMPTY_ASSET_HINTS,\r\n NOT_SUPPORT_DYNAMIC_TEXT,\r\n NO_FINAL_URL_HINT\r\n} from '@bingads-webui-campaign-react/copilot-common';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { UnvalidatedTextAssetCollection } from '@bingads-webui-campaign-react/validated-text-collection';\r\nimport { withCustomValidation } from '@bingads-webui-react/validation';\r\nimport { withPermissions } from '@bingads-webui-react/hoc-with-permissions';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { CopilotTextAssetRecommendation } from '@bingads-webui/inline-copilot';\r\nimport { getCharCountExcludingAdCustomizers } from '@bingads-webui-campaign/ad-customizers-next';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { isCopilotRegionRestricted } from '@bingads-webui-react/copilot-utils';\r\n\r\nimport { unlocalizedRecommendationTitle } from './recommendations-constants';\r\nimport { getTextAssetRecommendationsStyles } from './styles';\r\nimport { InlineRecommendations } from './inline-recommendations';\r\nimport { TextAssetRecommendationsDropdown } from './text-asset-recommendations-dropdown';\r\nimport { DKIThemeDefaultName } from './pmax-text-asset-collection-config';\r\n\r\nconst recommendationFieldMap = {\r\n Headlines: 'headlines',\r\n LongHeadlines: 'longHeadlines',\r\n Descriptions: 'descriptions',\r\n};\r\n\r\nconst recommendationAssetTypeMap = {\r\n Headlines: 'headline',\r\n LongHeadlines: 'longHeadline',\r\n Descriptions: 'description',\r\n};\r\n\r\nconst propertyNameSingularMap = {\r\n Headlines: AssetPropertyName.HEADLINE,\r\n LongHeadlines: AssetPropertyName.LONG_HEADLINE,\r\n Descriptions: AssetPropertyName.DESCRIPTION,\r\n};\r\n\r\nconst textAssetCollectionStyleOverridesForInlineRecommendations = {\r\n AddAssetButton: {\r\n marginBottom: 'unset',\r\n },\r\n};\r\n\r\nexport const UnvalidatedTextAssetCollectionWithRecommendations = React.memo((props) => {\r\n const {\r\n validationPropsField,\r\n validationProps,\r\n updateValidation,\r\n maxCollectionSize,\r\n inlineRecommendationsTitle,\r\n inlineRecommendationsHelpTopicKey,\r\n inlineRecommendationsHelpTopicAriaLabel,\r\n inlineRecommendationsDisabledItemTooltip,\r\n singleAssetValidationPropsField,\r\n i18n,\r\n permissions,\r\n withInlineRecommendations,\r\n withDeleteIconDisabled,\r\n setAddTextAssetCallback,\r\n copilotButtonLabel,\r\n onFocusTextAsset,\r\n onApplyRecommendation,\r\n enableCopilotRecommendations,\r\n onDeleteTextAsset,\r\n enableCustomizer,\r\n hideAddAllSuggestionsButton,\r\n showAssetLabelledBy,\r\n isAudienceAd,\r\n enableDKI,\r\n DKIThemeName,\r\n replaceMode,\r\n } = props;\r\n\r\n const isAmplifyEnabled = _.chain(permissions).result('IsAmplifyEnabled').value();\r\n const is40CharHeadlinePilotEnabled = _.chain(permissions).result('dynamic').result('AudienceCampaignExpandedHeadlineCharLimits').value();\r\n const isExpandedHeadlineCharLimitEnabled = (isAudienceAd && !isAmplifyEnabled && is40CharHeadlinePilotEnabled);\r\n const updatedValidationSchema = {\r\n ...validationProps,\r\n schema: {\r\n ...validationProps.schema,\r\n properties: {\r\n ...validationProps.schema.properties,\r\n Headlines: {\r\n ...validationProps.schema.properties.Headlines,\r\n schema: {\r\n ...validationProps.schema.properties.Headlines.schema,\r\n properties: Object.fromEntries(Object.entries(validationProps.schema.properties.Headlines.schema.properties).map(([key, property]) =>\r\n [\r\n key,\r\n { ...property, maxLength: 40 },\r\n ])),\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n const newValidationProps = isExpandedHeadlineCharLimitEnabled ? updatedValidationSchema : validationProps;\r\n\r\n const { data } = validationProps;\r\n const collection = _.result(data, validationPropsField, {});\r\n const [viewedCopilotCollectionObj, setViewedCopilotCollectionObj] = useState();\r\n\r\n const finalUrlForRecommendation = useMemo(() => _.result(data, 'FinalUrlForRecommendation', false), [data]);\r\n\r\n const classes = useDefaultStyles(getTextAssetRecommendationsStyles);\r\n const [visibleCalloutKey, setVisibleCalloutKey] = React.useState();\r\n const [recommendationContext, , reportRecommendations] = useContext(RecommendationContext);\r\n const { postAssetEventLog = noop, copilotTracking } = recommendationContext;\r\n\r\n const serverContext = useContext(ServerContext);\r\n const [isCopilotEnabled, setIsCopilotEnabled] = useState();\r\n useEffect(() => {\r\n if (enableCopilotRecommendations) {\r\n isCopilotRegionRestricted({\r\n feature: 'Recommendations',\r\n permissions,\r\n serverContext,\r\n }).then(isRestricted => setIsCopilotEnabled(!isRestricted));\r\n } else {\r\n setIsCopilotEnabled(false);\r\n }\r\n }, [enableCopilotRecommendations, permissions, serverContext]);\r\n\r\n const logCopilotSuggestions = useCallback((suggestionIds) => {\r\n if (copilotTracking) {\r\n const suggestionsToLog = copilotTracking.getUntrackedViewedSuggestionIds(suggestionIds);\r\n if (suggestionsToLog.length > 0) {\r\n postAssetEventLog({\r\n EventName: POST_ASSET_EVENT_NAME,\r\n EventValue: {\r\n AssetType: _.map(suggestionsToLog, () => AssetType.TEXT),\r\n SuggestionIds: suggestionsToLog,\r\n RecordType: AssetEventRecordType.VIEWED,\r\n },\r\n });\r\n copilotTracking.trackViewedSuggestionIds(suggestionsToLog);\r\n }\r\n }\r\n }, [copilotTracking, postAssetEventLog]);\r\n\r\n const {\r\n logTextAssetMenuOpen,\r\n logTextAssetDialogOpen,\r\n logRefineTextAsset,\r\n logRefineTextAssetSucceeded,\r\n logTextAssetApplied,\r\n logRemoveSingleAsset,\r\n } = useEventLog(postAssetEventLog);\r\n\r\n const onSuggestionsRendered = useCallback((finalUrl, params, textSuggestions) => {\r\n const textSuggestionIds = _.pluck(textSuggestions, 'RecommendationId');\r\n logRefineTextAssetSucceeded(finalUrl, params, textSuggestionIds);\r\n\r\n if (copilotTracking) {\r\n copilotTracking.trackReturnedTextAssets({ TextAssets: textSuggestions });\r\n copilotTracking.trackViewedSuggestionIds(textSuggestionIds);\r\n }\r\n }, [copilotTracking, logRefineTextAssetSucceeded]);\r\n\r\n const recommendationsField = recommendationFieldMap[validationPropsField];\r\n const collectionRecommendations = useMemo(() => {\r\n if (isCopilotEnabled) {\r\n const { themes } = recommendationContext;\r\n return _.map(themes, theme => ({\r\n name: theme.name,\r\n assets: _.result(theme, recommendationsField),\r\n }));\r\n }\r\n return _.result(recommendationContext, recommendationsField);\r\n }, [isCopilotEnabled, recommendationContext, recommendationsField]);\r\n\r\n const currentCollectionTexts = useMemo(\r\n () => _.chain(data).result(validationPropsField, {}).values().value(),\r\n [data, validationPropsField]\r\n );\r\n\r\n const availableRecommendations = useMemo(\r\n () => {\r\n if (isCopilotEnabled) {\r\n let availableCollectionRecommendations = collectionRecommendations.filter(theme => theme.name !== DKIThemeDefaultName);\r\n if (permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation && enableDKI) {\r\n const DKItheme = collectionRecommendations.filter(theme => theme.name === DKIThemeDefaultName);\r\n availableCollectionRecommendations = [...DKItheme, ...availableCollectionRecommendations];\r\n }\r\n return _.chain(availableCollectionRecommendations)\r\n .map(theme => ({\r\n name: theme.name === DKIThemeDefaultName ? DKIThemeName : theme.name,\r\n assets: _.chain(theme.assets)\r\n .map(_.property('Text'))\r\n .filter(recommendation => !_.contains(currentCollectionTexts, recommendation))\r\n .value(),\r\n }))\r\n .filter(theme => !_.isEmpty(theme.assets))\r\n .value();\r\n }\r\n return _.chain(collectionRecommendations)\r\n .map(_.property('Text'))\r\n .filter(recommendation => !_.contains(currentCollectionTexts, recommendation))\r\n .value();\r\n },\r\n [DKIThemeName, collectionRecommendations, currentCollectionTexts, enableDKI, isCopilotEnabled, permissions]\r\n );\r\n\r\n const recommendationsMap = useMemo(() => {\r\n if (isCopilotEnabled) {\r\n return _.chain(collectionRecommendations)\r\n .map(theme => _.chain(theme.assets)\r\n .map(recommendation => [\r\n _.property('Text')(recommendation),\r\n {\r\n Text: _.property('Text')(recommendation),\r\n SuggestionId: _.property('RecommendationId')(recommendation),\r\n },\r\n ])\r\n .object()\r\n .value())\r\n .reduce((result, theme) => _.extend(result, theme), {})\r\n .value();\r\n }\r\n return _.chain(collectionRecommendations)\r\n .map(recommendation => [\r\n recommendation.Text,\r\n {\r\n ...recommendation,\r\n SuggestionId: recommendation.SuggestionId,\r\n },\r\n ])\r\n .object()\r\n .value();\r\n }, [collectionRecommendations, isCopilotEnabled]);\r\n\r\n const reportDisplayedRecommendations = useCallback((recommendations) => {\r\n const displayedRecommendations = _.chain(recommendations)\r\n .map(recommendation => recommendationsMap[recommendation])\r\n .compact()\r\n .value();\r\n\r\n if (!_.isEmpty(displayedRecommendations)) {\r\n const displayedRecommendationsIds = _.pluck(displayedRecommendations, 'SuggestionId');\r\n reportRecommendations({\r\n view: displayedRecommendationsIds,\r\n });\r\n if (isCopilotEnabled) {\r\n logCopilotSuggestions(displayedRecommendationsIds);\r\n }\r\n }\r\n }, [logCopilotSuggestions, isCopilotEnabled, recommendationsMap, reportRecommendations]);\r\n\r\n useEffect(() => {\r\n if (viewedCopilotCollectionObj && recommendationContext) {\r\n reportDisplayedRecommendations(viewedCopilotCollectionObj);\r\n }\r\n }, [recommendationContext, reportDisplayedRecommendations, viewedCopilotCollectionObj]);\r\n\r\n const applyRecommendation = useCallback((key, text) => {\r\n const collectionData = cloneDeep(collection);\r\n collectionData[key] = text;\r\n const newData = {\r\n ...data,\r\n [validationPropsField]: collectionData,\r\n };\r\n\r\n setVisibleCalloutKey(null);\r\n updateValidation(null, newData);\r\n\r\n onApplyRecommendation(key);\r\n }, [collection, data, onApplyRecommendation, updateValidation, validationPropsField]);\r\n\r\n const applyRecommendations = useCallback((recommendations, replaceExistingAssets) => {\r\n const availableRecommendationsStack = [...recommendations].reverse();\r\n const collectionObj = _.result(data, validationPropsField, {});\r\n const fieldsToSet = Math.max(maxCollectionSize, _.size(collectionObj));\r\n\r\n // Remove all existing assets if replaceExistingAssets is true\r\n if (replaceExistingAssets) {\r\n for (let currentFieldIndex = 0; currentFieldIndex < fieldsToSet; currentFieldIndex += 1) {\r\n delete collectionObj[`${singleAssetValidationPropsField}${currentFieldIndex}`];\r\n }\r\n }\r\n\r\n for (let currentFieldIndex = 0; currentFieldIndex < fieldsToSet && !_.isEmpty(availableRecommendationsStack); currentFieldIndex += 1) {\r\n const key = `${singleAssetValidationPropsField}${currentFieldIndex}`;\r\n if (_.isEmpty(collectionObj[key])) {\r\n const recommendation = availableRecommendationsStack.pop();\r\n collectionObj[key] = recommendation;\r\n }\r\n }\r\n\r\n const newData = {\r\n [validationPropsField]: collectionObj,\r\n };\r\n updateValidation([], newData);\r\n if (isCopilotEnabled) {\r\n setViewedCopilotCollectionObj(collectionObj);\r\n }\r\n }, [data, maxCollectionSize, isCopilotEnabled, singleAssetValidationPropsField, updateValidation, validationPropsField]);\r\n\r\n if (_.isFunction(setAddTextAssetCallback)) {\r\n setAddTextAssetCallback((recommendations, replaceExistingAssets) => {\r\n const filteredRecommendations = !replaceExistingAssets\r\n ? recommendations.filter(recommendation => !_.contains(currentCollectionTexts, recommendation))\r\n : recommendations;\r\n\r\n applyRecommendations(filteredRecommendations, replaceExistingAssets);\r\n });\r\n }\r\n\r\n const headlineTitle = useMemo(() => i18n.getString(unlocalizedRecommendationTitle[validationPropsField]), [i18n, validationPropsField]);\r\n\r\n const renderRecommendations = useCallback((key, itemValue) => {\r\n const filteredRecommendations = isCopilotEnabled\r\n ? _.chain(availableRecommendations)\r\n .map((theme) => {\r\n if (theme.name === DKIThemeName) {\r\n return {\r\n ...theme,\r\n assets: _.filter(theme.assets, recommendation => recommendation.toLowerCase().startsWith(itemValue.toLowerCase())).slice(0, 2),\r\n };\r\n }\r\n return {\r\n ...theme,\r\n assets: _.filter(theme.assets, recommendation => recommendation.toLowerCase().startsWith(itemValue.toLowerCase())),\r\n };\r\n })\r\n .filter(theme => !_.isEmpty(theme.assets))\r\n .value()\r\n : _.filter(availableRecommendations, recommendation => recommendation.toLowerCase().startsWith(itemValue.toLowerCase()));\r\n\r\n const displayedRecommendations = isCopilotEnabled\r\n ? _.chain(availableRecommendations)\r\n .map(theme => _.filter(theme.assets, recommendation => recommendation.toLowerCase().startsWith(itemValue.toLowerCase())))\r\n .flatten()\r\n .value()\r\n : filteredRecommendations;\r\n\r\n if (_.isEmpty(filteredRecommendations)) {\r\n return null;\r\n }\r\n\r\n reportDisplayedRecommendations(displayedRecommendations);\r\n\r\n return isCopilotEnabled ? (\r\n <TextAssetRecommendationsDropdown\r\n assetKey={key}\r\n applyRecommendation={applyRecommendation}\r\n recommendations={filteredRecommendations}\r\n i18n={i18n}\r\n DKIThemeName={DKIThemeName}\r\n />\r\n ) : (\r\n <div className={classnames('text-asset-recommendation-content', classes.TextAssetRecommendationsContent)}>\r\n <Stack>\r\n <span className=\"text-recommendation-title\">{headlineTitle}</span>\r\n {filteredRecommendations.map(recommendation => <DefaultButton onClick={() => applyRecommendation(key, recommendation)}>{recommendation}</DefaultButton>)}\r\n </Stack>\r\n </div>\r\n );\r\n }, [isCopilotEnabled, availableRecommendations, reportDisplayedRecommendations, classes.TextAssetRecommendationsContent, headlineTitle, applyRecommendation]);\r\n\r\n const { Headlines, LongHeadlines, Descriptions } = data || {};\r\n const existingAssets = useMemo(() => ({\r\n shortHeadlines: _.values(Headlines),\r\n longHeadlines: _.values(LongHeadlines),\r\n descriptions: _.values(Descriptions),\r\n }), [Headlines, LongHeadlines, Descriptions]);\r\n\r\n const handleDeleteTextAsset = useCallback((key, deletedValue) => {\r\n onDeleteTextAsset(key);\r\n\r\n const propertyName = propertyNameSingularMap[validationPropsField];\r\n if (!isCopilotEnabled || !copilotTracking || !copilotTracking.isInRemainingInitialSuggestions(propertyName, deletedValue)) { return; }\r\n\r\n copilotTracking.removeInitialSuggestion(propertyNameSingularMap[validationPropsField], deletedValue);\r\n\r\n const recommendationId = _.chain(collectionRecommendations)\r\n .map('assets')\r\n .flatten()\r\n .filter(recommendation => recommendation.Text === deletedValue)\r\n .map('RecommendationId')\r\n .first()\r\n .value();\r\n\r\n if (recommendationId) {\r\n logRemoveSingleAsset(propertyName, recommendationId);\r\n }\r\n }, [onDeleteTextAsset, isCopilotEnabled, collectionRecommendations, validationPropsField, logRemoveSingleAsset, copilotTracking]);\r\n\r\n const renderInlineCopilot = useCallback((key, itemValue) => {\r\n const assetType = recommendationAssetTypeMap[validationPropsField];\r\n\r\n let disableReason;\r\n if (!finalUrlForRecommendation) {\r\n disableReason = i18n.getString(NO_FINAL_URL_HINT);\r\n }\r\n if (_.isEmpty(itemValue.trim())) {\r\n disableReason = i18n.getString(EMPTY_ASSET_HINTS[assetType]);\r\n }\r\n\r\n if (enableCustomizer) {\r\n if (getCharCountExcludingAdCustomizers({\r\n text: itemValue,\r\n adType: 'ResponsiveAd',\r\n field: validationPropsField,\r\n }) !== itemValue.length) {\r\n disableReason = i18n.getString(NOT_SUPPORT_DYNAMIC_TEXT);\r\n }\r\n }\r\n\r\n const currentAssetIndex = parseInt(key.match(/\\d+/)[0], 10);\r\n\r\n const onSelect = (assets, operationName) => {\r\n const text = _.get(assets, ['value', 0, 'text']);\r\n logTextAssetApplied(assetType, operationName);\r\n return applyRecommendation(key, text);\r\n };\r\n\r\n return (\r\n <CopilotTextAssetRecommendation\r\n assetType={assetType}\r\n currentIndex={currentAssetIndex}\r\n existingAssets={existingAssets}\r\n disableReason={disableReason}\r\n menuButtonAriaLabel={copilotButtonLabel}\r\n onMenuOpen={logTextAssetMenuOpen}\r\n onOperationDialogOpen={logTextAssetDialogOpen}\r\n onFetch={logRefineTextAsset}\r\n onSelect={onSelect}\r\n onSuggestionsRendered={onSuggestionsRendered}\r\n isNewLogo={_.get(permissions, ['dynamic', 'AdsCopilotUxImprovements'])}\r\n />\r\n );\r\n }, [\r\n applyRecommendation,\r\n copilotButtonLabel,\r\n existingAssets,\r\n finalUrlForRecommendation,\r\n i18n,\r\n logRefineTextAsset,\r\n logTextAssetApplied,\r\n logTextAssetDialogOpen,\r\n logTextAssetMenuOpen,\r\n onSuggestionsRendered,\r\n validationPropsField,\r\n enableCustomizer,\r\n permissions,\r\n ]);\r\n\r\n const labelledById = useId('textAssetLabel');\r\n\r\n const renderFunction = useCallback((key, renderItemFunction, itemValue) => {\r\n const onClickOrChangeHandler = () => setVisibleCalloutKey(availableRecommendations.length > 0 && key);\r\n\r\n const additionalTextFieldProps = {\r\n id: key,\r\n onClick: onClickOrChangeHandler,\r\n onChange: onClickOrChangeHandler,\r\n renderInlineCopilot: isCopilotEnabled ? renderInlineCopilot : null,\r\n onFocus: () => onFocusTextAsset(key),\r\n };\r\n\r\n if (isCopilotEnabled && availableRecommendations.length > 0) {\r\n // when inline recommendations are available, hide the browser's native autocomplete\r\n additionalTextFieldProps.autoComplete = 'off';\r\n }\r\n\r\n if (showAssetLabelledBy) {\r\n additionalTextFieldProps['aria-labelledBy'] = labelledById;\r\n }\r\n\r\n return (\r\n <React.Fragment>\r\n {renderItemFunction(additionalTextFieldProps)}\r\n {visibleCalloutKey === key &&\r\n <Callout\r\n target={`#${key}`}\r\n isBeakVisible={false}\r\n gapSpace={0}\r\n role=\"dialog\"\r\n onDismiss={() => setVisibleCalloutKey(undefined)}\r\n calloutMinWidth={435}\r\n >\r\n {renderRecommendations(key, itemValue)}\r\n </Callout>\r\n }\r\n </React.Fragment>);\r\n }, [availableRecommendations.length, isCopilotEnabled, labelledById, onFocusTextAsset, renderInlineCopilot, renderRecommendations, showAssetLabelledBy, visibleCalloutKey]);\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <UnvalidatedTextAssetCollection\r\n {...{ ...props, validationProps: newValidationProps }}\r\n onDeleteTextAsset={handleDeleteTextAsset}\r\n renderWrapperFunction={renderFunction}\r\n withDeleteIconDisabled={withDeleteIconDisabled}\r\n labelId={labelledById}\r\n {...withInlineRecommendations ? { styleOverrides: textAssetCollectionStyleOverridesForInlineRecommendations } : {}}\r\n />\r\n {withInlineRecommendations &&\r\n <InlineRecommendations\r\n i18n={i18n}\r\n collection={collection}\r\n collectionRecommendations={collectionRecommendations}\r\n maxCollectionSize={maxCollectionSize}\r\n availableRecommendations={availableRecommendations}\r\n singleAssetValidationPropsField={singleAssetValidationPropsField}\r\n inlineRecommendationsHelpTopicKey={inlineRecommendationsHelpTopicKey}\r\n inlineRecommendationsHelpTopicAriaLabel={inlineRecommendationsHelpTopicAriaLabel}\r\n inlineRecommendationsTitle={inlineRecommendationsTitle}\r\n inlineRecommendationsDisabledItemTooltip={inlineRecommendationsDisabledItemTooltip}\r\n applyRecommendation={applyRecommendation}\r\n applyRecommendations={applyRecommendations}\r\n reportDisplayedRecommendations={reportDisplayedRecommendations}\r\n permissions={permissions}\r\n enableCopilotRecommendations={isCopilotEnabled}\r\n hideAddAllSuggestionsButton={hideAddAllSuggestionsButton}\r\n enableDKI={permissions && permissions.dynamic && permissions.dynamic.CopilotDKIRecommendation && enableDKI}\r\n DKIThemeName={DKIThemeName}\r\n replaceMode={replaceMode}\r\n />\r\n }\r\n </FluentProvider>\r\n );\r\n});\r\n\r\nUnvalidatedTextAssetCollectionWithRecommendations.propTypes = {\r\n updateValidation: PropTypes.func.isRequired,\r\n campaignId: PropTypes.number.isRequired,\r\n validationPropsField: PropTypes.string.isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({}),\r\n }).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n getLocale: PropTypes.func.isRequired,\r\n }).isRequired,\r\n singleAssetValidationPropsField: PropTypes.string.isRequired,\r\n maxCollectionSize: PropTypes.number.isRequired,\r\n inlineRecommendationsTitle: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicKey: PropTypes.string.isRequired,\r\n inlineRecommendationsHelpTopicAriaLabel: PropTypes.string.isRequired,\r\n inlineRecommendationsDisabledItemTooltip: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.element,\r\n PropTypes.arrayOf(PropTypes.element),\r\n ]).isRequired,\r\n withInlineRecommendations: PropTypes.bool,\r\n withDeleteIconDisabled: PropTypes.bool,\r\n setAddTextAssetCallback: PropTypes.func,\r\n copilotButtonLabel: PropTypes.string,\r\n onFocusTextAsset: PropTypes.func,\r\n onApplyRecommendation: PropTypes.func,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n onDeleteTextAsset: PropTypes.func,\r\n enableCustomizer: PropTypes.bool,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({\r\n isAmplifyEnabled: PropTypes.bool,\r\n AudienceCampaignExpandedHeadlineCharLimits: PropTypes.bool,\r\n }),\r\n }).isRequired,\r\n hideAddAllSuggestionsButton: PropTypes.bool,\r\n showAssetLabelledBy: PropTypes.bool,\r\n isAudienceAd: PropTypes.bool,\r\n enableDKI: PropTypes.bool,\r\n DKIThemeName: PropTypes.string,\r\n replaceMode: PropTypes.bool,\r\n};\r\n\r\nUnvalidatedTextAssetCollectionWithRecommendations.defaultProps = {\r\n withInlineRecommendations: false,\r\n withDeleteIconDisabled: false,\r\n setAddTextAssetCallback: noop,\r\n copilotButtonLabel: undefined,\r\n onFocusTextAsset: noop,\r\n onApplyRecommendation: noop,\r\n enableCopilotRecommendations: true,\r\n onDeleteTextAsset: noop,\r\n enableCustomizer: false,\r\n hideAddAllSuggestionsButton: false,\r\n showAssetLabelledBy: false,\r\n isAudienceAd: false,\r\n enableDKI: false,\r\n DKIThemeName: '',\r\n replaceMode: false,\r\n};\r\n\r\nexport const TextAssetCollectionWithRecommendations = withPermissions(withCustomValidation(UnvalidatedTextAssetCollectionWithRecommendations));\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './pmax-text-asset-collection-config';\r\n\r\nexport const TextAssetCollections = React.memo((props) => {\r\n const {\r\n isOptional, showDeleteButton, renderInlineCopilot, textAssetConfig, validationProps, withInlineRecommendations,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const headlineConfig = useMemo(() => getTextAssetCollectionConfig('headlines', i18n, textAssetConfig), [i18n, textAssetConfig]);\r\n const longHeadlineConfig = useMemo(() => getTextAssetCollectionConfig('longHeadlines', i18n, textAssetConfig), [i18n, textAssetConfig]);\r\n const descriptionsConfig = useMemo(() => getTextAssetCollectionConfig('descriptions', i18n, textAssetConfig), [i18n, textAssetConfig]);\r\n\r\n return (\r\n <div className=\"text-asset-collections\">\r\n <TextAssetCollectionWithRecommendations\r\n {...headlineConfig}\r\n validationProps={validationProps}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n withInlineRecommendations={withInlineRecommendations}\r\n />\r\n <TextAssetCollectionWithRecommendations\r\n {...longHeadlineConfig}\r\n validationProps={validationProps}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n withInlineRecommendations={withInlineRecommendations}\r\n />\r\n <TextAssetCollectionWithRecommendations\r\n {...descriptionsConfig}\r\n validationProps={validationProps}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n withInlineRecommendations={withInlineRecommendations}\r\n />\r\n </div>);\r\n});\r\n\r\nTextAssetCollections.propTypes = {\r\n isOptional: PropTypes.bool,\r\n showDeleteButton: PropTypes.bool,\r\n renderInlineCopilot: PropTypes.func,\r\n textAssetConfig: PropTypes.shape({\r\n headlines: PropTypes.shape({}),\r\n longHeadlines: PropTypes.shape({}),\r\n descriptions: PropTypes.shape({}),\r\n }),\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n Headline: PropTypes.shape({}),\r\n LongHeadlines: PropTypes.shape({}),\r\n Descriptions: PropTypes.shape({}),\r\n }),\r\n }),\r\n withInlineRecommendations: PropTypes.bool,\r\n};\r\n\r\nTextAssetCollections.defaultProps = {\r\n isOptional: false,\r\n showDeleteButton: false,\r\n renderInlineCopilot: null,\r\n textAssetConfig: {\r\n headlines: {},\r\n longHeadlines: {},\r\n descriptions: {},\r\n },\r\n validationProps: {\r\n data: {\r\n Headline: {},\r\n LongHeadlines: {},\r\n Descriptions: {},\r\n },\r\n },\r\n withInlineRecommendations: false,\r\n};\r\n","import { noop } from 'underscore';\r\nimport React, { useContext, useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withStoreFromProviderId } from '@bingads-webui-campaign-react/with-store-details';\r\nimport { withCustomValidation, withError } from '@bingads-webui-react/validation';\r\nimport { withUnvalidatedControlErrors, withControlErrorHandling } from '@bingads-webui-campaign-react/error-handling';\r\nimport { BusinessNameWithValidation } from '@bingads-webui-campaign-react/business-name';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { ActivityContext } from '@bingads-webui-react/hoc-with-signal';\r\n\r\nconst BusinessNameMaxLength = 25;\r\n\r\nconst StoreBackedBusinessName = (props) => {\r\n const {\r\n id,\r\n storeDetails,\r\n i18n,\r\n validationProps,\r\n updateValidation,\r\n } = props;\r\n\r\n const { data } = validationProps;\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n const currentBusinessName = (data && data.BusinessName) || '';\r\n const storeName = storeDetails && storeDetails.name;\r\n const [prepopulated, setPrepopulated] = useState(false);\r\n\r\n const activity = useContext(ActivityContext);\r\n const businessNameRecommendationText = recommendationContext && recommendationContext.businessName && recommendationContext.businessName.Text;\r\n\r\n const [prevRecommendation, setPrevRecommendation] = useState();\r\n\r\n // handle prepopulate of store name on mount if there's no pre-existing business name\r\n useEffect(() => {\r\n if (!prepopulated) {\r\n setPrepopulated(true);\r\n if (storeName && !currentBusinessName) {\r\n updateValidation([], { BusinessName: storeName }, false /* shouldDirty */);\r\n\r\n if (activity) {\r\n activity.signal(`onBusinessNameChanged - name: ${storeName}`);\r\n }\r\n }\r\n }\r\n }, [prepopulated, storeName, currentBusinessName, updateValidation]);\r\n\r\n // triggered on recommendation change to populate recommendation if field is empty\r\n useEffect(() => {\r\n if (!prepopulated || prevRecommendation === businessNameRecommendationText) {\r\n // if we havn't yet prepopulated the business name, or if the recommendation hasn't changed, do nothing\r\n return;\r\n }\r\n\r\n // set the prev recommendation so we don't trigger this flow again\r\n setPrevRecommendation(businessNameRecommendationText);\r\n if (!currentBusinessName && businessNameRecommendationText) {\r\n updateValidation([], { BusinessName: businessNameRecommendationText }, false /* shouldDirty */);\r\n }\r\n }, [prepopulated, prevRecommendation, businessNameRecommendationText, currentBusinessName, updateValidation]);\r\n\r\n return (\r\n <BusinessNameWithValidation\r\n id={id}\r\n validationProps={{\r\n data: { BusinessName: currentBusinessName },\r\n }}\r\n maxLength={BusinessNameMaxLength}\r\n i18n={i18n}\r\n updateValidation={updateValidation}\r\n />);\r\n};\r\n\r\nStoreBackedBusinessName.propTypes = {\r\n id: PropTypes.string,\r\n storeDetails: PropTypes.shape({\r\n name: PropTypes.string,\r\n }),\r\n i18n: PropTypes.shape({}).isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n BusinessName: PropTypes.string,\r\n }),\r\n }),\r\n updateValidation: PropTypes.func,\r\n recommendationContext: PropTypes.shape({\r\n businessName: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nStoreBackedBusinessName.defaultProps = {\r\n id: undefined,\r\n updateValidation: noop,\r\n storeDetails: undefined,\r\n validationProps: undefined,\r\n};\r\n\r\nexport const ValidatedStoreBackedBusinessName\r\n = withControlErrorHandling(withUnvalidatedControlErrors(withError(withCustomValidation(withStoreFromProviderId(React.memo(StoreBackedBusinessName))))));\r\n","import { noop } from 'underscore';\r\nimport React, { useContext, useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withCustomValidation, withError } from '@bingads-webui-react/validation';\r\nimport { withUnvalidatedControlErrors, withControlErrorHandling } from '@bingads-webui-campaign-react/error-handling';\r\nimport { BusinessNameWithValidation } from '@bingads-webui-campaign-react/business-name';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\n\r\nconst BusinessNameMaxLength = 25;\r\n\r\nconst BusinessNameWithRecommendation = (props) => {\r\n const {\r\n id,\r\n i18n,\r\n validationProps,\r\n updateValidation,\r\n } = props;\r\n\r\n const { data } = validationProps;\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n const currentBusinessName = (data && data.BusinessName) || '';\r\n const businessNameRecommendationText = recommendationContext && recommendationContext.businessName && recommendationContext.businessName.Text;\r\n const [prevRecommendation, setPrevRecommendation] = useState();\r\n\r\n // triggered on recommendation change to populate recommendation if field is empty\r\n useEffect(() => {\r\n if (prevRecommendation === businessNameRecommendationText) {\r\n // if we havn't yet prepopulated the business name, or if the recommendation hasn't changed, do nothing\r\n return;\r\n }\r\n\r\n // set the prev recommendation so we don't trigger this flow again\r\n setPrevRecommendation(businessNameRecommendationText);\r\n if (!currentBusinessName && businessNameRecommendationText) {\r\n updateValidation([], { BusinessName: businessNameRecommendationText }, false /* shouldDirty */);\r\n }\r\n }, [prevRecommendation, businessNameRecommendationText, currentBusinessName, updateValidation]);\r\n\r\n return (\r\n <BusinessNameWithValidation\r\n id={id}\r\n validationProps={{\r\n data: { BusinessName: currentBusinessName },\r\n }}\r\n maxLength={BusinessNameMaxLength}\r\n i18n={i18n}\r\n updateValidation={updateValidation}\r\n />);\r\n};\r\n\r\nBusinessNameWithRecommendation.propTypes = {\r\n id: PropTypes.string,\r\n storeDetails: PropTypes.shape({\r\n name: PropTypes.string,\r\n }),\r\n i18n: PropTypes.shape({}).isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n BusinessName: PropTypes.string,\r\n }),\r\n }),\r\n updateValidation: PropTypes.func,\r\n recommendationContext: PropTypes.shape({\r\n businessName: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nBusinessNameWithRecommendation.defaultProps = {\r\n id: undefined,\r\n updateValidation: noop,\r\n storeDetails: undefined,\r\n validationProps: undefined,\r\n};\r\n\r\nexport const ValidatedBusinessNameWithRecommendation\r\n = withControlErrorHandling(withUnvalidatedControlErrors(withError(withCustomValidation(React.memo(BusinessNameWithRecommendation)))));\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n getPanelErrorProps,\r\n TextTitle,\r\n ValidatedPanel,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { andComp, propertyIs, entityIs } from '@bingads-webui-campaign-react/form-error';\r\n\r\nimport { ValidatedBusinessNameWithRecommendation } from './business-name-with-recommendation';\r\nimport BusinessNameImg from '../media/business-name.svg';\r\n\r\nconst getBusinessNameProp = (entity) => {\r\n const businessNameProp = andComp(entityIs(entity), propertyIs('BusinessName'));\r\n return businessNameProp;\r\n};\r\n\r\nexport const ValidatedBusinessNameWithRecommendationSection = React.memo((props) => {\r\n const {\r\n businessName, expand, entity, ...rest\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const nativeAdBusinessNameProp = useMemo(() => getBusinessNameProp(entity), [entity]);\r\n\r\n return (\r\n <ValidatedPanel\r\n key=\"business-name\"\r\n title={<TextTitle\r\n titleKey={_TL_('Business name')}\r\n topicKey=\"pop_BA_CampaignCreate_AudAds_BusinessName\"\r\n icon={BusinessNameImg}\r\n iconAltText={i18n.getString(_TL_('\"Business name\" panel\\'s image'))}\r\n details={businessName}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'business-name',\r\n }}\r\n {...rest}\r\n >\r\n <ValidatedBusinessNameWithRecommendation\r\n id=\"input-business-name\"\r\n i18n={i18n}\r\n validationProps={{\r\n data: { BusinessName: businessName },\r\n initialValue: { BusinessName: businessName },\r\n }}\r\n formErrorProps={{ filter: nativeAdBusinessNameProp }}\r\n />\r\n </ValidatedPanel>\r\n );\r\n});\r\n\r\nValidatedBusinessNameWithRecommendationSection.propTypes = {\r\n businessName: PropTypes.string.isRequired,\r\n entity: PropTypes.string.isRequired,\r\n expand: PropTypes.func.isRequired,\r\n};\r\n","import React, { useCallback, useState, useContext, useMemo } from 'react';\r\nimport { isArray, result, first, noop, difference } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { Stack, Callout, DefaultButton } from '@bingads-webui-react/fluent-controls';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { useEventLog } from '@bingads-webui-campaign-react/copilot-common';\r\nimport { withFluentSwitcher } from '@bingads-webui-react/fluent-version-switcher';\r\nimport { ValidatedFinalUrl as ValidatedFinalUrlV1 } from '@bingads-webui-campaign-react/validated-url-input';\r\nimport { ValidatedFinalUrl as ValidatedFinalUrlV2 } from '@bingads-webui-campaign-react/validated-url-input-fluent-v2';\r\nimport { RecommendationContext } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { getUrlPrefixAndDestination } from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { getFinalUrlRecommendationsStyles } from './styles';\r\n\r\nconst FinalURlKey = 'FinalUrls';\r\n\r\nconst ValidatedFinalUrl = withFluentSwitcher(ValidatedFinalUrlV1, ValidatedFinalUrlV2);\r\n\r\nexport const ValidatedFinalUrlWithRecommendations= (props) => {\r\n const {\r\n updateValidation,\r\n validationProps,\r\n additionalProperties,\r\n i18n,\r\n enableUrlRecommendation,\r\n enableCopilotRecommendations,\r\n enableSpecialCharactersValidation,\r\n } = props;\r\n const classes = useDefaultStyles(getFinalUrlRecommendationsStyles);\r\n const createFinalUrlsViewModel = urls => ({ [FinalURlKey]: urls });\r\n const [showFinalUrlRecommendations, setShowFinalUrlRecommendations] = useState(false);\r\n const [recommendationContext] = useContext(RecommendationContext);\r\n\r\n const { postAssetEventLog = noop, copilotTracking } = recommendationContext;\r\n const { logFinalUrlRecommendations } = useEventLog(postAssetEventLog);\r\n\r\n const logCopilotSuggestions = useCallback((suggestions) => {\r\n if (copilotTracking) {\r\n const suggestionsToLog = difference(suggestions, copilotTracking.trackingData.viewedSuggestions);\r\n if (suggestionsToLog.length > 0) {\r\n logFinalUrlRecommendations(suggestionsToLog);\r\n }\r\n copilotTracking.trackViewedSuggestionIds(suggestionsToLog);\r\n }\r\n }, [copilotTracking, logFinalUrlRecommendations]);\r\n\r\n const currentFinalUrlDestinationValue = useMemo(() => {\r\n const { data } = validationProps;\r\n const finalUrls = result(data, FinalURlKey, undefined);\r\n const [, dest] = getUrlPrefixAndDestination(first(finalUrls));\r\n return dest;\r\n }, [validationProps]);\r\n\r\n const onClickOrChangeHandler = useCallback(() => {\r\n setShowFinalUrlRecommendations(isArray(recommendationContext.finalUrls) && recommendationContext.finalUrls.length > 0);\r\n }, [recommendationContext.finalUrls]);\r\n\r\n const onDismissFinalUrlRecommendations = useCallback(() => {\r\n setShowFinalUrlRecommendations(false);\r\n }, []);\r\n\r\n const applyRecommendation = useCallback((finalUrlRecommendation) => {\r\n updateValidation([], createFinalUrlsViewModel([finalUrlRecommendation]));\r\n onDismissFinalUrlRecommendations();\r\n }, [onDismissFinalUrlRecommendations, updateValidation]);\r\n\r\n const renderRecommendations = useCallback(() => {\r\n const filteredRecommendations = recommendationContext.finalUrls.filter((recommendation) => {\r\n const [, recommendationDestination] = getUrlPrefixAndDestination(recommendation);\r\n\r\n return recommendationDestination.toLowerCase().startsWith(currentFinalUrlDestinationValue.toLowerCase());\r\n });\r\n\r\n if (filteredRecommendations.length === 0) {\r\n return null;\r\n }\r\n if (enableCopilotRecommendations) {\r\n logCopilotSuggestions(filteredRecommendations);\r\n }\r\n\r\n return (\r\n <div className={classnames('text-final-url-recommendation-content', classes.TextFinalUrlRecommendationsContent)}>\r\n <Stack>\r\n <span className=\"text-recommendation-title\">{i18n.getString(_TL_('Recommended Final URL'))}</span>\r\n {filteredRecommendations.map(finalUrlRecommendation => <DefaultButton onClick={() => applyRecommendation(finalUrlRecommendation)}>{finalUrlRecommendation}</DefaultButton>)}\r\n </Stack>\r\n </div>);\r\n }, [recommendationContext.finalUrls, enableCopilotRecommendations, classes.TextFinalUrlRecommendationsContent, i18n, currentFinalUrlDestinationValue, logCopilotSuggestions, applyRecommendation]);\r\n\r\n return (\r\n <React.Fragment>\r\n <ValidatedFinalUrl\r\n {...props}\r\n additionalProperties={{\r\n onClick: onClickOrChangeHandler,\r\n ...additionalProperties,\r\n }}\r\n enableSpecialCharactersValidation={enableSpecialCharactersValidation}\r\n />\r\n {enableUrlRecommendation && showFinalUrlRecommendations &&\r\n <Callout\r\n target=\".final-url .url-field input\"\r\n isBeakVisible={false}\r\n gapSpace={0}\r\n role=\"dialog\"\r\n onDismiss={onDismissFinalUrlRecommendations}\r\n >\r\n {renderRecommendations()}\r\n </Callout>\r\n }\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nValidatedFinalUrlWithRecommendations.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n updateValidation: PropTypes.func.isRequired,\r\n validationProps: PropTypes.shape({\r\n data: PropTypes.shape({\r\n FinalUrls: PropTypes.arrayOf(PropTypes.string),\r\n }),\r\n updateOnMount: PropTypes.bool,\r\n }).isRequired,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n enableUrlRecommendation: PropTypes.bool,\r\n enableSpecialCharactersValidation: PropTypes.bool,\r\n additionalProperties: PropTypes.shape({}),\r\n};\r\n\r\nValidatedFinalUrlWithRecommendations.defaultProps = {\r\n additionalProperties: {},\r\n enableCopilotRecommendations: true,\r\n enableUrlRecommendation: true,\r\n enableSpecialCharactersValidation: false,\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport { isFunction, noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { withFinalUrlRecommendationUpdate } from '@bingads-webui-campaign-react/perf-max-recommendation';\r\nimport { withCustomValidation, withError } from '@bingads-webui-react/validation';\r\nimport { withControlErrorHandling, withUnvalidatedControlErrors } from '@bingads-webui-campaign-react/error-handling';\r\nimport {\r\n Collapse,\r\n getPanelErrorProps,\r\n TextTitle,\r\n ValidatedFixedPanel,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { entityIs, andComp, propertyIs } from '@bingads-webui-campaign-react/form-error';\r\n\r\nimport { ValidatedFinalUrlWithRecommendations } from './validated-final-url-with-recommendations';\r\nimport FinalUrlImg from '../media/final-url.svg';\r\n\r\nconst getServerValidatedFinalUrl = (entity) => {\r\n const finalUrlsProp = andComp(entityIs(entity), propertyIs('FinalUrls'));\r\n const ValidatedFinalUrlWithStoreURL = withError(withCustomValidation(withFinalUrlRecommendationUpdate(ValidatedFinalUrlWithRecommendations)));\r\n const ServerValidatedFinalUrl = withControlErrorHandling(withUnvalidatedControlErrors(ValidatedFinalUrlWithStoreURL, { filter: finalUrlsProp }));\r\n return ServerValidatedFinalUrl;\r\n};\r\n\r\nconst finalUrl = 'final-url';\r\nconst finalUrlSection = [finalUrl];\r\n\r\nexport const ValidatedFinalUrlWithRecommendationsSection = (props) => {\r\n const {\r\n customUrlProtocol,\r\n finalUrls,\r\n onFinalURLFocusOut,\r\n onFinalURLEnterKeyUp,\r\n entity,\r\n enableCopilotRecommendations,\r\n enableUrlRecommendation,\r\n } = props;\r\n\r\n const i18n = useContext(I18nContext);\r\n const ServerValidatedFinalUrl = useMemo(() => getServerValidatedFinalUrl(entity), [entity]);\r\n\r\n const finalUrlValidationProps = useMemo(() => ({\r\n data: {\r\n FinalUrls: finalUrls,\r\n },\r\n initialValue: {\r\n FinalUrls: finalUrls,\r\n },\r\n debounce: 700,\r\n }), [finalUrls]);\r\n\r\n const onKeyUp = useMemo(() => {\r\n if (!isFunction(onFinalURLEnterKeyUp)) {\r\n return undefined;\r\n }\r\n\r\n return (keyboardEvent) => {\r\n if (keyboardEvent.key === 'Enter') {\r\n onFinalURLEnterKeyUp();\r\n }\r\n };\r\n }, [onFinalURLEnterKeyUp]);\r\n\r\n return (\r\n <Collapse allPanelItems={finalUrlSection} checkItems skipItemsTypeCheck activeKeys={finalUrlSection} setActiveKeys={noop}>\r\n <ValidatedFixedPanel\r\n key=\"final-url\"\r\n title={<TextTitle titleKey={_TL_('Final URL')} topicKey=\"pop_BA_NewAdCreate_FinalURL\" icon={FinalUrlImg} />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n >\r\n <div className=\"final-url-container\">\r\n <ServerValidatedFinalUrl\r\n i18n={i18n}\r\n validationProps={finalUrlValidationProps}\r\n enableUrlRecommendation={enableUrlRecommendation}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n validateOnRender\r\n isDisplayPlus\r\n additionalProperties={{ onBlur: onFinalURLFocusOut, onKeyUp }}\r\n customUrlProtocol={customUrlProtocol}\r\n />\r\n </div>\r\n </ValidatedFixedPanel>\r\n </Collapse>\r\n );\r\n};\r\n\r\nValidatedFinalUrlWithRecommendationsSection.propTypes = {\r\n entity: PropTypes.string,\r\n onFinalURLFocusOut: PropTypes.func.isRequired,\r\n onFinalURLEnterKeyUp: PropTypes.func,\r\n permissions: PropTypes.shape({}).isRequired,\r\n finalUrls: PropTypes.arrayOf(PropTypes.string).isRequired,\r\n customUrlProtocol: PropTypes.bool,\r\n enableUrlRecommendation: PropTypes.bool,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n};\r\n\r\nValidatedFinalUrlWithRecommendationsSection.defaultProps = {\r\n customUrlProtocol: false,\r\n entity: 'ResponsiveAd',\r\n enableUrlRecommendation: true,\r\n enableCopilotRecommendations: true,\r\n onFinalURLEnterKeyUp: undefined,\r\n};\r\n","\r\nimport { featureConfigMapping } from './pmax-text-asset-collection-config';\r\n\r\nexport const getTextAssetCollectionConfigByFeature = ({\r\n featureName,\r\n}) => featureConfigMapping[featureName];\r\n","import React, { useContext, useMemo, useRef, useEffect } from 'react';\r\nimport { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './pmax-text-asset-collection-config';\r\nimport { getTextAssetCollectionConfigByFeature } from './utils';\r\n\r\nexport const DescriptionAssetCollection = React.memo((props) => {\r\n const {\r\n featureName, enableCopilotRecommendations, enableCustomizer, isOptional, withDeleteIconDisabled, showDeleteButton, renderInlineCopilot, setAddNewDescriptionCallback, onFocusTextAsset, onDeleteTextAsset, onApplyRecommendation,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const textAssetCollectionConfig = useMemo(() => getTextAssetCollectionConfigByFeature({ featureName }), [featureName]);\r\n\r\n const descriptionsConfig = useMemo(() => getTextAssetCollectionConfig('descriptions', i18n, textAssetCollectionConfig), [i18n, textAssetCollectionConfig]);\r\n const addNewHeadlinesCallback = useRef(noop);\r\n\r\n useEffect(() => {\r\n if (setAddNewDescriptionCallback) {\r\n setAddNewDescriptionCallback(() => (recommendations) => {\r\n addNewHeadlinesCallback.current(recommendations);\r\n });\r\n }\r\n }, [setAddNewDescriptionCallback]);\r\n\r\n return (\r\n <div className=\"description-asset-collection\">\r\n <TextAssetCollectionWithRecommendations\r\n {...descriptionsConfig}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n onDeleteTextAsset={onDeleteTextAsset}\r\n onApplyRecommendation={onApplyRecommendation}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n onFocusTextAsset={onFocusTextAsset}\r\n withInlineRecommendations\r\n setAddTextAssetCallback={(callback) => { addNewHeadlinesCallback.current = callback; }}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n enableCustomizer={enableCustomizer}\r\n withDeleteIconDisabled={withDeleteIconDisabled}\r\n />\r\n </div>);\r\n});\r\n\r\nDescriptionAssetCollection.propTypes = {\r\n isOptional: PropTypes.bool,\r\n showDeleteButton: PropTypes.bool,\r\n onDeleteTextAsset: PropTypes.func,\r\n onApplyRecommendation: PropTypes.func,\r\n renderInlineCopilot: PropTypes.func,\r\n setAddNewDescriptionCallback: PropTypes.func,\r\n onFocusTextAsset: PropTypes.func,\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n enableCustomizer: PropTypes.bool,\r\n withDeleteIconDisabled: PropTypes.bool,\r\n};\r\n\r\nDescriptionAssetCollection.defaultProps = {\r\n isOptional: false,\r\n showDeleteButton: false,\r\n onDeleteTextAsset: noop,\r\n onApplyRecommendation: noop,\r\n renderInlineCopilot: null,\r\n setAddNewDescriptionCallback: null,\r\n onFocusTextAsset: noop,\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: false,\r\n withDeleteIconDisabled: true,\r\n};\r\n","import React, { useContext, useMemo, useRef, useEffect } from 'react';\r\nimport { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './pmax-text-asset-collection-config';\r\nimport { getTextAssetCollectionConfigByFeature } from './utils';\r\n\r\nexport const HeadlineAssetCollection = React.memo((props) => {\r\n const {\r\n featureName,\r\n enableCopilotRecommendations,\r\n enableCustomizer,\r\n isOptional,\r\n showDeleteButton,\r\n renderInlineCopilot,\r\n setAddNewShortHeadlinesCallback,\r\n onFocusTextAsset,\r\n onDeleteTextAsset,\r\n onApplyRecommendation,\r\n isAudienceAd,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n\r\n const textAssetCollectionConfig = useMemo(() => getTextAssetCollectionConfigByFeature({ featureName }), [featureName]);\r\n\r\n const headlineConfig = useMemo(() => getTextAssetCollectionConfig('headlines', i18n, textAssetCollectionConfig), [i18n, textAssetCollectionConfig]);\r\n const addNewHeadlinesCallback = useRef(noop);\r\n\r\n useEffect(() => {\r\n if (setAddNewShortHeadlinesCallback) {\r\n setAddNewShortHeadlinesCallback(() => (recommendations, replaceExistingAssets) => {\r\n addNewHeadlinesCallback.current(recommendations, replaceExistingAssets);\r\n });\r\n }\r\n }, [setAddNewShortHeadlinesCallback]);\r\n\r\n return (\r\n <div className=\"headline-asset-collection\">\r\n <TextAssetCollectionWithRecommendations\r\n {...headlineConfig}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n onDeleteTextAsset={onDeleteTextAsset}\r\n onApplyRecommendation={onApplyRecommendation}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n onFocusTextAsset={onFocusTextAsset}\r\n withInlineRecommendations\r\n setAddTextAssetCallback={(callback) => { addNewHeadlinesCallback.current = callback; }}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n enableCustomizer={enableCustomizer}\r\n withDeleteIconDisabled\r\n isAudienceAd={isAudienceAd}\r\n />\r\n </div>);\r\n});\r\n\r\nHeadlineAssetCollection.propTypes = {\r\n isOptional: PropTypes.bool,\r\n showDeleteButton: PropTypes.bool,\r\n onDeleteTextAsset: PropTypes.func,\r\n onApplyRecommendation: PropTypes.func,\r\n renderInlineCopilot: PropTypes.func,\r\n setAddNewShortHeadlinesCallback: PropTypes.func,\r\n onFocusTextAsset: PropTypes.func,\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n enableCustomizer: PropTypes.bool,\r\n isAudienceAd: PropTypes.bool,\r\n};\r\n\r\nHeadlineAssetCollection.defaultProps = {\r\n isOptional: false,\r\n showDeleteButton: false,\r\n onDeleteTextAsset: noop,\r\n onApplyRecommendation: noop,\r\n renderInlineCopilot: null,\r\n setAddNewShortHeadlinesCallback: null,\r\n onFocusTextAsset: noop,\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: false,\r\n isAudienceAd: false,\r\n};\r\n","import React, { useContext, useMemo, useRef, useEffect } from 'react';\r\nimport { noop } from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport { TextAssetCollectionWithRecommendations } from './text-asset-collection-with-recommendations';\r\nimport { getTextAssetCollectionConfig } from './pmax-text-asset-collection-config';\r\nimport { getTextAssetCollectionConfigByFeature } from './utils';\r\n\r\nexport const LongHeadlineAssetCollection = React.memo((props) => {\r\n const {\r\n featureName, enableCopilotRecommendations, enableCustomizer, isOptional, withDeleteIconDisabled, showDeleteButton, renderInlineCopilot, setAddNewLongHeadlinesCallback, onFocusTextAsset, onDeleteTextAsset, onApplyRecommendation,\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const textAssetCollectionConfig = useMemo(() => getTextAssetCollectionConfigByFeature({ featureName }), [featureName]);\r\n\r\n const longHeadlineConfig = useMemo(() => getTextAssetCollectionConfig('longHeadlines', i18n, textAssetCollectionConfig), [i18n, textAssetCollectionConfig]);\r\n\r\n const addNewHeadlinesCallback = useRef(noop);\r\n\r\n useEffect(() => {\r\n if (setAddNewLongHeadlinesCallback) {\r\n setAddNewLongHeadlinesCallback(() => (recommendations) => {\r\n addNewHeadlinesCallback.current(recommendations);\r\n });\r\n }\r\n }, [setAddNewLongHeadlinesCallback]);\r\n\r\n return (\r\n <div className=\"long-headline-asset-collection\">\r\n <TextAssetCollectionWithRecommendations\r\n {...longHeadlineConfig}\r\n isOptional={isOptional}\r\n showDeleteButton={showDeleteButton}\r\n onDeleteTextAsset={onDeleteTextAsset}\r\n onApplyRecommendation={onApplyRecommendation}\r\n renderInlineCopilot={renderInlineCopilot}\r\n i18n={i18n}\r\n onFocusTextAsset={onFocusTextAsset}\r\n withInlineRecommendations\r\n setAddTextAssetCallback={(callback) => { addNewHeadlinesCallback.current = callback; }}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n enableCustomizer={enableCustomizer}\r\n withDeleteIconDisabled={withDeleteIconDisabled}\r\n />\r\n </div>);\r\n});\r\n\r\nLongHeadlineAssetCollection.propTypes = {\r\n isLite: PropTypes.bool,\r\n isOptional: PropTypes.bool,\r\n showDeleteButton: PropTypes.bool,\r\n onDeleteTextAsset: PropTypes.func,\r\n onApplyRecommendation: PropTypes.func,\r\n renderInlineCopilot: PropTypes.func,\r\n setAddNewLongHeadlinesCallback: PropTypes.func,\r\n onFocusTextAsset: PropTypes.func,\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n enableCustomizer: PropTypes.bool,\r\n withDeleteIconDisabled: PropTypes.bool,\r\n};\r\n\r\nLongHeadlineAssetCollection.defaultProps = {\r\n isLite: false,\r\n isOptional: false,\r\n showDeleteButton: false,\r\n onDeleteTextAsset: noop,\r\n onApplyRecommendation: noop,\r\n renderInlineCopilot: null,\r\n setAddNewLongHeadlinesCallback: null,\r\n onFocusTextAsset: noop,\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: false,\r\n withDeleteIconDisabled: true,\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n getPanelErrorProps,\r\n TextTitle,\r\n ValidatedPanel,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { getDescriptionsCardSummaryDetails } from '@bingads-webui-campaign-react/validated-text-collection';\r\nimport { DescriptionAssetCollection } from './description-asset-collection';\r\nimport TextAssetsImg from '../media/text-assets.svg';\r\n\r\nexport const DescriptionAssetCollectionSection = React.memo((props) => {\r\n const {\r\n featureName, enableCopilotRecommendations, descriptions, expand, setAddNewDescriptionCallback, enableCustomizer, ...rest\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const descriptionsCardSummaryDetails = useMemo(() => getDescriptionsCardSummaryDetails(i18n, descriptions), [descriptions, i18n]);\r\n\r\n return (\r\n <ValidatedPanel\r\n key=\"descriptions\"\r\n title={<TextTitle\r\n titleKey={_TL_('Descriptions')}\r\n icon={TextAssetsImg}\r\n iconAltText={i18n.getString(_TL_('Descriptions'))}\r\n details={descriptionsCardSummaryDetails}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'descriptions',\r\n }}\r\n {...rest}\r\n >\r\n <DescriptionAssetCollection\r\n showDeleteButton={enableCopilotRecommendations}\r\n setAddNewDescriptionCallback={setAddNewDescriptionCallback}\r\n featureName={featureName}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n enableCustomizer={enableCustomizer}\r\n withDeleteIconDisabled\r\n />\r\n </ValidatedPanel>\r\n );\r\n});\r\n\r\nDescriptionAssetCollectionSection.propTypes = {\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n descriptions: PropTypes.shape({}).isRequired,\r\n expand: PropTypes.func.isRequired,\r\n setAddNewDescriptionCallback: PropTypes.func.isRequired,\r\n enableCustomizer: PropTypes.bool,\r\n withDeleteIconDisabled: PropTypes.bool,\r\n};\r\n\r\nDescriptionAssetCollectionSection.defaultProps = {\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: true,\r\n withDeleteIconDisabled: true,\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n getPanelErrorProps,\r\n TextTitle,\r\n ValidatedPanel,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { getHeadlinesCardSummaryDetails } from '@bingads-webui-campaign-react/validated-text-collection';\r\nimport { HeadlineAssetCollection } from './headline-asset-collection';\r\nimport TextAssetsImg from '../media/text-assets.svg';\r\n\r\nexport const HeadlineAssetCollectionSection = React.memo((props) => {\r\n const {\r\n featureName, enableCopilotRecommendations, headlines, expand, setAddNewShortHeadlinesCallback, enableCustomizer, ...rest\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const headlinesCardSummaryDetails = useMemo(() => getHeadlinesCardSummaryDetails(i18n, headlines), [headlines, i18n]);\r\n\r\n return (\r\n <ValidatedPanel\r\n key=\"headlines\"\r\n title={<TextTitle\r\n titleKey={_TL_('Short headlines')}\r\n icon={TextAssetsImg}\r\n iconAltText={i18n.getString(_TL_('Short headlines'))}\r\n details={headlinesCardSummaryDetails}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'headlines',\r\n }}\r\n {...rest}\r\n >\r\n <HeadlineAssetCollection\r\n showDeleteButton={enableCopilotRecommendations}\r\n featureName={featureName}\r\n setAddNewShortHeadlinesCallback={setAddNewShortHeadlinesCallback}\r\n enableCustomizer={enableCustomizer}\r\n />\r\n </ValidatedPanel>\r\n );\r\n});\r\n\r\nHeadlineAssetCollectionSection.propTypes = {\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n headlines: PropTypes.shape({}).isRequired,\r\n expand: PropTypes.func.isRequired,\r\n setAddNewShortHeadlinesCallback: PropTypes.func.isRequired,\r\n enableCustomizer: PropTypes.bool,\r\n};\r\n\r\nHeadlineAssetCollectionSection.defaultProps = {\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: true,\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n getPanelErrorProps,\r\n TextTitle,\r\n ValidatedPanel,\r\n} from '@bingads-webui-campaign/wizard-jumbo-card';\r\nimport { getLongHeadlinesCardSummaryDetails } from '@bingads-webui-campaign-react/validated-text-collection';\r\nimport { LongHeadlineAssetCollection } from './long-headline-asset-collection';\r\nimport TextAssetsImg from '../media/text-assets.svg';\r\n\r\nexport const LongHeadlineAssetCollectionSection = React.memo((props) => {\r\n const {\r\n featureName, enableCopilotRecommendations, longHeadlines, expand, isOptional, setAddNewLongHeadlinesCallback, enableCustomizer, ...rest\r\n } = props;\r\n const i18n = useContext(I18nContext);\r\n const longHeadlinesCardSummaryDetails = useMemo(() => getLongHeadlinesCardSummaryDetails(i18n, longHeadlines), [longHeadlines, i18n]);\r\n\r\n return (\r\n <ValidatedPanel\r\n key=\"long-headlines\"\r\n title={<TextTitle\r\n titleKey={_TL_('Long headlines')}\r\n icon={TextAssetsImg}\r\n iconAltText={i18n.getString(_TL_('Long headlines'))}\r\n details={longHeadlinesCardSummaryDetails}\r\n />}\r\n attentionBeaconProps={{ getExtraProps: getPanelErrorProps }}\r\n actuationProps={{\r\n expand,\r\n expandKey: 'long-headlines',\r\n }}\r\n {...rest}\r\n >\r\n <LongHeadlineAssetCollection\r\n isOptional={isOptional}\r\n showDeleteButton={enableCopilotRecommendations}\r\n setAddNewLongHeadlinesCallback={setAddNewLongHeadlinesCallback}\r\n featureName={featureName}\r\n enableCopilotRecommendations={enableCopilotRecommendations}\r\n enableCustomizer={enableCustomizer}\r\n withDeleteIconDisabled\r\n />\r\n </ValidatedPanel>\r\n );\r\n});\r\n\r\nLongHeadlineAssetCollectionSection.propTypes = {\r\n isOptional: PropTypes.bool,\r\n featureName: PropTypes.string,\r\n enableCopilotRecommendations: PropTypes.bool,\r\n longHeadlines: PropTypes.shape({}).isRequired,\r\n expand: PropTypes.func.isRequired,\r\n setAddNewLongHeadlinesCallback: PropTypes.func.isRequired,\r\n enableCustomizer: PropTypes.bool,\r\n withDeleteIconDisabled: PropTypes.bool,\r\n};\r\n\r\nLongHeadlineAssetCollectionSection.defaultProps = {\r\n isOptional: false,\r\n featureName: undefined,\r\n enableCopilotRecommendations: true,\r\n enableCustomizer: true,\r\n withDeleteIconDisabled: true,\r\n};\r\n","import { isString, size, isFinite } from 'underscore';\r\n\r\n/**\r\n * Regex Pattern for wide characters\r\n */\r\nconst wideCharPattern = new RegExp(\r\n '[\\\\u1100-\\\\u11FF]' + // IsHangulJamo\r\n '|[\\\\u2E80-\\\\u2EFF]' + // IsCJKRadicalsSupplement\r\n '|[\\\\u3000-\\\\u303F]' + // IsCJKSymbolsandPunctuation\r\n '|[\\\\u3040-\\\\u309F]' + // IsHiragana\r\n '|[\\\\u30A0-\\\\u30FF]' + // IsKatakana\r\n '|[\\\\u3130-\\\\u318F]' + // IsHangulCompatibilityJamo\r\n '|[\\\\u3200-\\\\u32FF]' + // IsEnclosedCJKLettersandMonths\r\n '|[\\\\u3300-\\\\u33FF]' + // IsCJKCompatibility\r\n '|[\\\\u3400-\\\\u4DBF]' + // IsCJKUnifiedIdeographsExtensionA\r\n '|[\\\\u4E00-\\\\u9FFF]' + // IsCJKUnifiedIdeographs\r\n '|[\\\\uAC00-\\\\uD7AF]' + // IsHangulSyllables\r\n '|[\\\\uF900-\\\\uFAFF]' + // IsCJKCompatibilityIdeographs\r\n '|[\\\\uFE30-\\\\uFE4F]' + // IsCJKCompatibilityForms\r\n '|[\\\\uFF01-\\\\uFF60]' + // Fullwidth Forms Part 1\r\n '|[\\\\uFFE0-\\\\uFFE6]' + // Fullwidth Forms Part 2\r\n '|[\\\\uD800-\\\\uDBFF][\\\\uDC00-\\\\uDFFF]' // Astral Planes\r\n , 'g'\r\n);\r\n\r\n/**\r\n * Get string length, which counting CJK character or Emojis as 2\r\n * @param {string} str - string to count\r\n * @returns {int} - length of string\r\n */\r\nconst displayLength = str =>\r\n (isString(str) ? str.replace(wideCharPattern, '12').length : 0);\r\n\r\nexport const getLength = (str, distinguishWideChar = false) =>\r\n (distinguishWideChar ? displayLength(str) : size(str));\r\n\r\nconst intRemaining = (str, schema) => {\r\n if (!isFinite(schema.maxLength)) {\r\n return Number.POSITIVE_INFINITY;\r\n }\r\n\r\n return schema.maxLength - getLength(str, schema.distinguishWideChar);\r\n};\r\n\r\nexport const strRemaining = (i18n, str, schema, newI18n) => {\r\n const remaining = intRemaining(str, schema);\r\n\r\n if (!isFinite(remaining)) {\r\n return '';\r\n }\r\n if (newI18n) {\r\n return remaining >= 0 ?\r\n newI18n.getString(_TL_('{{count}} characters remaining'), { count: remaining }) :\r\n newI18n.getString(_TL_('Exceeded by {{count}} characters'), { count: 0 - remaining });\r\n }\r\n return remaining >= 0 ?\r\n i18n.getString('RemainingCharactersText_New', { count: remaining }) :\r\n i18n.getString('ExceededCharactersText_New', { count: 0 - remaining });\r\n};\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport { strRemaining } from './string-util';\r\n\r\nexport const RemainingCharsHint = ({\r\n str, i18n, schema, newI18n,\r\n}) => (\r\n schema.maxLength && _.isString(str) ?\r\n (<div className=\"remaining-hint help-block\">{strRemaining(i18n, str, schema, newI18n)}</div>) : null);\r\n\r\nRemainingCharsHint.propTypes = {\r\n str: PropTypes.string,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n schema: PropTypes.shape({\r\n maxLength: PropTypes.number,\r\n }).isRequired,\r\n newI18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nRemainingCharsHint.defaultProps = {\r\n str: undefined,\r\n i18n: undefined,\r\n newI18n: undefined,\r\n};\r\n","import React from 'react';\r\nimport { reduce, result } from 'underscore';\r\nimport { ViewmodelSchema } from '@bingads-webui/viewmodel-schema';\r\n\r\nimport { RemainingCharsHint } from './remaining-chars-hint';\r\n\r\nexport const getRemainingCharsHintTextWithSchema = (str, i18n, schema, field) => {\r\n const vmSchema = new ViewmodelSchema(schema, i18n, [field]);\r\n const vmField = reduce(field.split('/'), (obj, seg) => result(obj, seg), vmSchema);\r\n const vmFieldSchema = result(vmField, 'prop', {});\r\n const fieldSchema = {\r\n distinguishWideChar: true,\r\n ...vmFieldSchema,\r\n };\r\n return (<RemainingCharsHint str={str} newI18n={i18n} schema={fieldSchema} />);\r\n};\r\n\r\nexport const getRemainingCharsHintText = (str, i18n, maxLength) => {\r\n const fieldSchema = {\r\n maxLength,\r\n distinguishWideChar: true,\r\n };\r\n return (<RemainingCharsHint str={str} newI18n={i18n} schema={fieldSchema} />);\r\n};\r\n","export const getTextInputContainerStyles = () => ({\r\n TextInputContainer: {\r\n width: '435px',\r\n '& div .error': {\r\n color: '#A80000',\r\n },\r\n },\r\n});\r\n\r\nexport const getRemainingCharsStyles = () => ({\r\n RemainingCharsContainer: {\r\n display: 'flex',\r\n flexDirection: 'row-reverse',\r\n },\r\n});\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { withError, withValidation } from '@bingads-webui-react/validation';\r\nimport { withControlErrorHandling, withUnvalidatedControlErrors } from '@bingads-webui-campaign-react/error-handling';\r\nimport { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { getTextInputContainerStyles } from './style';\r\nimport { withRemainingChars } from './with-remaining-chars';\r\n\r\nconst ValidatedTextField = withValidation(TextField);\r\n\r\nconst RemainingCharsValidatedTextFieldInternal = withControlErrorHandling(withUnvalidatedControlErrors(withError(withRemainingChars(ValidatedTextField))));\r\n\r\nexport const RemainingCharsValidatedTextField = React.memo((props) => {\r\n const classes = useDefaultStyles(getTextInputContainerStyles);\r\n\r\n return (\r\n <div className={classnames('text-input-container', classes.TextInputContainer)}>\r\n <RemainingCharsValidatedTextFieldInternal {...props} />\r\n </div>\r\n );\r\n});\r\n","import React, { useState } from 'react';\r\nimport { reduce, result, noop } from 'underscore';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\nimport { getRemainingCharsHintTextWithSchema } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withRemainingChars(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const getNestedDataByPath = (data, path) => reduce(path.split('/'), (obj, seg) => result(obj, seg, {}), data);\r\n\r\n const [value, setValue] = useState(undefined);\r\n\r\n const onValidate = (validationResult) => {\r\n setValue(getNestedDataByPath(validationResult.data, props.validationProps.field));\r\n props.validationProps.onValidate(validationResult);\r\n };\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n const newValidationProps = {\r\n ...props.validationProps,\r\n onValidate,\r\n };\r\n\r\n return (\r\n <React.Fragment>\r\n <WrappedComponent {...props} validationProps={newValidationProps} />\r\n <div aria-live=\"polite\" className={classnames('remaining-chars-container', classes.RemainingCharsContainer)} >\r\n { getRemainingCharsHintTextWithSchema(value, props.i18n, newValidationProps.schema, newValidationProps.field) }\r\n </div>\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n validationProps: PropTypes.shape({\r\n onValidate: PropTypes.func.isRequired,\r\n field: PropTypes.string.isRequired,\r\n schema: PropTypes.shape({}).isRequired,\r\n }),\r\n };\r\n\r\n RemainingCharsHOC.defaultProps = {\r\n validationProps: {\r\n onValidate: noop,\r\n field: undefined,\r\n schema: undefined,\r\n },\r\n };\r\n\r\n RemainingCharsHOC.displayName = `withRemainingChars(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","import { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { withRemainingCharsUnvalidated } from './with-remaining-chars-unvalidated';\r\n\r\nexport const RemainingCharsUnvalidatedTextField = withRemainingCharsUnvalidated(TextField);\r\n","import React, { useState, useCallback } from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nimport { getRemainingCharsHintText } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withRemainingCharsUnvalidated(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const {\r\n maxLengthHint,\r\n onChange,\r\n i18n,\r\n defaultValue,\r\n } = props;\r\n\r\n const [value, setValue] = useState(defaultValue);\r\n\r\n const localOnChange = useCallback((event, result) => {\r\n setValue(result);\r\n onChange(event, result);\r\n }, [onChange]);\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n const newProps = {\r\n ...props,\r\n onChange: localOnChange,\r\n };\r\n\r\n return (\r\n <React.Fragment>\r\n <WrappedComponent {...newProps} />\r\n <div className={classnames('remaining-chars-container', classes.RemainingCharsContainer)} >\r\n { getRemainingCharsHintText(value, i18n, maxLengthHint) }\r\n </div>\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n maxLengthHint: PropTypes.number.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n defaultValue: PropTypes.string,\r\n };\r\n\r\n RemainingCharsHOC.defaultProps = {\r\n defaultValue: '',\r\n };\r\n\r\n RemainingCharsHOC.displayName = `withRemainingCharsUnvalidated(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","import { TextField } from '@bingads-webui-react/fluent-controls';\r\n\r\nimport { withControlledRemainingCharsUnvalidated } from './with-controlled-remaining-chars-unvalidated';\r\n\r\nexport const ControlledRemainingCharsUnvalidatedTextField = withControlledRemainingCharsUnvalidated(TextField);\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { getDisplayName } from '@bingads-webui-react/hoc-utils';\r\n\r\nimport { getRemainingCharsHintText } from './shared';\r\nimport { getRemainingCharsStyles } from './style';\r\n\r\nexport function withControlledRemainingCharsUnvalidated(WrappedComponent) {\r\n const RemainingCharsHOC = (props) => {\r\n const {\r\n maxLengthHint,\r\n i18n,\r\n value,\r\n } = props;\r\n\r\n const classes = useDefaultStyles(getRemainingCharsStyles);\r\n\r\n return (\r\n <React.Fragment>\r\n <WrappedComponent {...props} />\r\n <div className={classnames('remaining-chars-container', classes.RemainingCharsContainer)} >\r\n { getRemainingCharsHintText(value, i18n, maxLengthHint) }\r\n </div>\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n RemainingCharsHOC.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n maxLengthHint: PropTypes.number.isRequired,\r\n value: PropTypes.string.isRequired,\r\n };\r\n\r\n\r\n RemainingCharsHOC.displayName = `withControlledRemainingCharsUnvalidated(${getDisplayName(WrappedComponent)})`;\r\n hoistNonReactStatics(RemainingCharsHOC, WrappedComponent);\r\n\r\n return RemainingCharsHOC;\r\n}\r\n","export const glyphList = [\r\n { key: 'ActionCenter', text: 'Action Center' },\r\n { key: 'AllApps', text: 'All Apps' },\r\n { key: 'Camera', text: 'Camera' },\r\n { key: 'EdgeLogo', text: 'Edge Logo' },\r\n { key: 'Feedback', text: 'Feedback' },\r\n { key: 'GameController', text: 'Game Controller' },\r\n { key: 'GetStartedApp', text: 'Get Started App' },\r\n { key: 'MagnifyingGlass', text: 'Magnifying Glass' },\r\n { key: 'MapsApp', text: 'Maps App' },\r\n { key: 'MicrosoftLogo', text: 'Microsoft Logo' },\r\n { key: 'MMX-CellPhone', text: 'MMX-Cell Phone' },\r\n { key: 'MMX-CellPhoneHistory', text: 'MMX-Cell Phone History' },\r\n { key: 'MMX-CellPhoneSend', text: 'MMX-Cell Phone Send' },\r\n { key: 'News', text: 'News' }, { key: 'Office', text: 'Office' },\r\n { key: 'OneDriveApp', text: 'OneDrive App' },\r\n { key: 'PhotoApp', text: 'Photo App' },\r\n { key: 'RewardsGlyph', text: 'RewardsGlyph' },\r\n { key: 'Settings', text: 'Settings' },\r\n { key: 'StoreApp', text: 'Store App' },\r\n { key: 'VideoApp', text: 'Video App' },\r\n { key: 'WebURL', text: 'Web URL' },\r\n { key: 'XboxApp', text: 'Xbox App' },\r\n];\r\n","export const placementList = [\r\n { key: 'TopLeft', text: 'Top left' },\r\n { key: 'Center', text: 'Center' },\r\n { key: 'BottomRight', text: 'Bottom right' },\r\n];\r\n","import React from 'react';\r\nimport { Dropdown, TextField, ITextFieldStyles } from '@fluentui/react';\r\nimport { glyphList } from './glyphList';\r\nimport { placementList } from './placementList';\r\nimport { IHotspot } from './hotspot-panel';\r\n\r\ndeclare let _TL_: any;\r\n\r\ninterface IProps {\r\n i18n: any;\r\n hotspot: IHotspot;\r\n hotspots: IHotspot[];\r\n index: number;\r\n enableHotSpotPlacement: boolean;\r\n showHotspotCount: boolean;\r\n\r\n handleChangeTextField: (index: number, field: string, value: string) => void\r\n handleChangeGlyph: (index: number, value: string) => void;\r\n handleChangePlacement: (index: number, value: string) => void;\r\n}\r\n\r\nfunction remainingWarning(text: string, limit: number, i18n: any): string {\r\n if (text.length > limit) {\r\n return i18n.getString(_TL_('Exceeded by {{count}} characters'), { count: text.length - limit });\r\n }\r\n return `${limit - text.length} ${i18n.getString(_TL_('characters remaining'))}`;\r\n}\r\n\r\nfunction getErrorMessage(text: string, limit: number, i18n: any): string {\r\n if (text.length > limit) {\r\n return i18n.getString(_TL_('Field should not exceed {{count}} characters'), { count: text.length - limit });\r\n }\r\n\r\n return '';\r\n}\r\n\r\nfunction getPlacementMessage(placement: string, hotspots: IHotspot[], i18n: any): string {\r\n const placements = hotspots.map(i => i.placement).filter(i => !!i);\r\n if (new Set(placements).size !== placements.length) {\r\n return i18n.getString(_TL_('Duplicate placement'));\r\n }\r\n\r\n return '';\r\n}\r\n\r\nexport class Hotspot extends React.Component<IProps> {\r\n handleChangeTitle = (field: string, _, value) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangeTextField(index, field, value as string);\r\n };\r\n\r\n handleChangeGlyph = (_, item) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangeGlyph(index, item.key);\r\n };\r\n\r\n handleChangePlacement = (_, item) => {\r\n const { index } = this.props;\r\n\r\n this.props.handleChangePlacement(index, item.key);\r\n };\r\n\r\n render() {\r\n const {\r\n i18n, hotspot, hotspots, index, showHotspotCount = false,\r\n } = this.props;\r\n\r\n const {\r\n title, desc, actionText, uri, glyph, placement,\r\n } = hotspot;\r\n\r\n const textFiledStyles: Partial<ITextFieldStyles> = {\r\n description: {\r\n width: '100%',\r\n display: 'inline-block',\r\n textAlign: 'right',\r\n fontSize: 14,\r\n },\r\n };\r\n\r\n return (\r\n <div>\r\n { showHotspotCount && (<h6>{`${i18n.getString(_TL_('Hotspot'))} ${index + 1}`}</h6>) }\r\n <Dropdown\r\n label={i18n.getString(_TL_('Icon'))}\r\n required\r\n onChange={this.handleChangeGlyph}\r\n selectedKey={glyph}\r\n options={glyphList}\r\n />\r\n <TextField\r\n required\r\n value={title}\r\n className=\"hotspot-title\"\r\n onChange={this.handleChangeTitle.bind(this, 'title')}\r\n errorMessage={getErrorMessage(title, 108, i18n)}\r\n description={remainingWarning(title, 108, i18n)}\r\n label={i18n.getString(_TL_('Title'))}\r\n styles={textFiledStyles}\r\n />\r\n <TextField\r\n value={desc}\r\n className=\"hotspot-desc\"\r\n onChange={this.handleChangeTitle.bind(this, 'desc')}\r\n errorMessage={getErrorMessage(desc, 200, i18n)}\r\n description={remainingWarning(desc, 200, i18n)}\r\n label={i18n.getString(_TL_('Description'))}\r\n styles={textFiledStyles}\r\n />\r\n <TextField\r\n required\r\n className=\"hotspot-actionText\"\r\n value={actionText}\r\n onChange={this.handleChangeTitle.bind(this, 'actionText')}\r\n errorMessage={getErrorMessage(actionText, 54, i18n)}\r\n description={remainingWarning(actionText, 54, i18n)}\r\n label={i18n.getString(_TL_('Action Text'))}\r\n styles={textFiledStyles}\r\n />\r\n <TextField\r\n required\r\n className=\"hotspot-uri\"\r\n value={uri}\r\n onChange={this.handleChangeTitle.bind(this, 'uri')}\r\n errorMessage={getErrorMessage(uri, 400, i18n)}\r\n description={remainingWarning(uri, 400, i18n)}\r\n label={i18n.getString(_TL_('URI'))}\r\n styles={textFiledStyles}\r\n />\r\n {this.props.enableHotSpotPlacement && (\r\n <Dropdown\r\n label={i18n.getString(_TL_('Placement'))}\r\n className=\"hotspot-placement\"\r\n required\r\n onChange={this.handleChangePlacement}\r\n errorMessage={getPlacementMessage(placement, hotspots, i18n)}\r\n selectedKey={placement}\r\n options={placementList}\r\n />\r\n )}\r\n\r\n </div>\r\n );\r\n }\r\n}\r\n\r\n","import React from 'react';\r\nimport { isEmpty, uniq, any } from 'underscore';\r\nimport { Stack, FontIcon, CommandButton } from '@fluentui/react';\r\n\r\nimport { Hotspot } from './hotspot';\r\n\r\ndeclare let _TL_: any;\r\n\r\nexport interface IHotspot {\r\n glyph: string;\r\n title: string;\r\n desc: string;\r\n actionText: string;\r\n uri: string;\r\n placement: string;\r\n}\r\n\r\ninterface IProps {\r\n i18n: any;\r\n enableHotSpotPlacement: boolean;\r\n onUpdateHotspots: (hotspots: IHotspot[]) => void;\r\n hotspots: IHotspot[];\r\n hideTitle: boolean;\r\n showHotspotCount: boolean;\r\n}\r\n\r\ninterface IState {\r\n hotspots: IHotspot[];\r\n error: string;\r\n}\r\n\r\nconst hotspotsUpperLimit = 3;\r\n\r\nexport class HotspotPanel extends React.Component<IProps, IState> {\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {\r\n error: '',\r\n hotspots: props.hotspots || [],\r\n };\r\n }\r\n\r\n getData = () => this.state.hotspots.map(hotspot => ({\r\n Title: hotspot.title,\r\n Description: hotspot.desc,\r\n ActionText: hotspot.actionText,\r\n Uri: hotspot.uri,\r\n Glyph: hotspot.glyph,\r\n Placement: hotspot.placement,\r\n }));\r\n\r\n setError(error: string) {\r\n this.setState({\r\n error,\r\n });\r\n }\r\n\r\n handleChangeTextField = (index: number, field: string, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index][field] = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleChangeGlyph = (index: number, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index].glyph = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleChangePlacement = (index: number, value: string) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots[index].placement = value;\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n AddHotspot = () => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots.push({\r\n glyph: 'ActionCenter',\r\n title: '',\r\n desc: '',\r\n actionText: '',\r\n uri: '',\r\n placement: '',\r\n });\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n handleRemoveHotspot = (index: number) => {\r\n const { hotspots } = this.state;\r\n\r\n hotspots.splice(index, 1);\r\n\r\n this.setState({\r\n hotspots: [...hotspots],\r\n }, () => {\r\n this.props.onUpdateHotspots(this.state.hotspots);\r\n });\r\n };\r\n\r\n validate = () => {\r\n const { i18n, enableHotSpotPlacement } = this.props;\r\n\r\n const missField = this.state.hotspots.map(i =>\r\n isEmpty(i.glyph) || isEmpty(i.title) || isEmpty(i.actionText) || isEmpty(i.uri) ||\r\n (enableHotSpotPlacement && isEmpty(i.placement)));\r\n\r\n if (any(missField)) {\r\n this.setError(i18n.getString(_TL_('HotSpot missing required field')));\r\n return false;\r\n }\r\n\r\n // check if any duplicate hotspot\r\n const hotspotStrings = this.state.hotspots.map(hotspot => hotspot.title + hotspot.actionText + hotspot.desc + hotspot.uri + hotspot.glyph);\r\n\r\n if (this.state.hotspots.length !== uniq(hotspotStrings).length) {\r\n this.setError(i18n.getString(_TL_('HotSpots duplication')));\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n render() {\r\n const { i18n, showHotspotCount = false } = this.props;\r\n const {\r\n hotspots,\r\n error,\r\n } = this.state;\r\n\r\n const { hideTitle = false } = this.props;\r\n\r\n const disableAddhotspot = hotspots.length >= hotspotsUpperLimit;\r\n\r\n return (\r\n <div style={{ marginBottom: 5 }}>\r\n <h6>{!hideTitle && i18n.getString(_TL_('Hotspot'))}</h6>\r\n {hotspots.map((hotspot, index) => (\r\n <div\r\n className=\"hotspot\"\r\n style={{\r\n border: '1px solid gray', borderRadius: 10, padding: 10, marginBottom: 5,\r\n }}\r\n >\r\n <Hotspot\r\n index={index}\r\n i18n={i18n}\r\n showHotspotCount={showHotspotCount}\r\n enableHotSpotPlacement={this.props.enableHotSpotPlacement}\r\n hotspot={hotspot}\r\n hotspots={hotspots}\r\n handleChangeTextField={this.handleChangeTextField}\r\n handleChangeGlyph={this.handleChangeGlyph}\r\n handleChangePlacement={this.handleChangePlacement}\r\n />\r\n <Stack horizontal horizontalAlign=\"space-between\" >\r\n <span />\r\n <FontIcon\r\n className=\"delete-hotspot\"\r\n style={{ cursor: 'pointer', marginTop: 5 }}\r\n onClick={this.handleRemoveHotspot.bind(this, index)}\r\n iconName=\"Delete\"\r\n aria-label={i18n.getString(_TL_('Delete'))}\r\n />\r\n </Stack>\r\n </div>\r\n ))}\r\n <Stack horizontal horizontalAlign=\"space-between\" >\r\n <div className=\"error\" >{error}</div>\r\n <CommandButton\r\n styles={{ root: { marginLeft: 250 } }}\r\n iconProps={{ iconName: 'Add' }}\r\n className=\"add-hotspot\"\r\n text={i18n.getString(_TL_('Add hotspot'))}\r\n onClick={this.AddHotspot}\r\n disabled={disableAddhotspot}\r\n />\r\n </Stack>\r\n </div>\r\n );\r\n }\r\n}\r\n","import React, { useState, forwardRef, useImperativeHandle, useEffect } from 'react';\r\nimport { Dropdown, IDropdownOption, DropdownMenuItemType } from '@fluentui/react/lib/Dropdown';\r\n\r\n// eslint-disable-next-line no-underscore-dangle\r\ndeclare let _TL_: any;\r\ninterface BoostAnchorsProps {\r\n i18n: any;\r\n defaultSelectedKey: string | undefined;\r\n onUpdate: (key: string | number | undefined) => void;\r\n}\r\n\r\nconst getDropdownOptions = (i18n): IDropdownOption[] => {\r\n const options: IDropdownOption[] = [\r\n { key: 'key1', text: i18n.getString(_TL_('Top Bar')), itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_waffle', text: i18n.getString(_TL_('App Launcher')) },\r\n { key: 'ntp_cm_locationGreeting', text: i18n.getString(_TL_('Location and Weather')) },\r\n { key: 'ntp_cm_rewardsMedallion', text: i18n.getString(_TL_('Rewards')) },\r\n { key: 'ntp_cm_notificationBell', text: i18n.getString(_TL_('Notification')) },\r\n { key: 'ntp_cm_settingsGear', text: i18n.getString(_TL_('Settings')) },\r\n { key: 'ntp_cm_personalizeButton', text: i18n.getString(_TL_('Personalize Settings')) },\r\n\r\n { key: 'key2', text: '-', itemType: DropdownMenuItemType.Divider },\r\n { key: 'key3', text: i18n.getString(_TL_('Search Box')), itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_searchBox', text: i18n.getString(_TL_('Search')) },\r\n\r\n { key: 'key4', text: '-', itemType: DropdownMenuItemType.Divider },\r\n { key: 'key5', text: 'Navigation', itemType: DropdownMenuItemType.Header },\r\n { key: 'ntp_cm_followingNav', text: i18n.getString(_TL_('Following')) },\r\n { key: 'ntp_cm_gamingNav', text: i18n.getString(_TL_('Gaming')) },\r\n { key: 'ntp_cm_weatherNav', text: i18n.getString(_TL_('Weather')) },\r\n { key: 'ntp_cm_watchNav', text: i18n.getString(_TL_('Watch')) },\r\n { key: 'ntp_cm_shoppingNav', text: i18n.getString(_TL_('Shopping')) },\r\n ];\r\n\r\n return options;\r\n};\r\n\r\nconst BoostAnchors: React.FC<BoostAnchorsProps> = forwardRef(({ i18n, defaultSelectedKey, onUpdate }: BoostAnchorsProps, ref) => {\r\n const [selectedKey, setSelectedKey] = useState<string | number | undefined>(defaultSelectedKey);\r\n\r\n const handleDropdownChange = (event: React.FormEvent<HTMLDivElement>, option?: IDropdownOption) => {\r\n setSelectedKey(option?.key);\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n getData: (): string | number | undefined => selectedKey,\r\n }));\r\n\r\n useEffect(() => {\r\n if (onUpdate) {\r\n onUpdate(selectedKey);\r\n }\r\n }, [onUpdate, selectedKey]);\r\n\r\n return (\r\n <Dropdown\r\n placeholder={i18n.getString(_TL_('Select an option'))}\r\n label={i18n.getString(_TL_('Select the element on page'))}\r\n options={getDropdownOptions(i18n)}\r\n selectedKey={selectedKey}\r\n onChange={handleDropdownChange}\r\n />\r\n );\r\n});\r\n\r\nexport { BoostAnchors };\r\n","export interface ICropSettings {\r\n SourceX: number,\r\n SourceY: number,\r\n SourceWidth: number,\r\n SourceHeight: number\r\n}\r\n\r\n\r\nexport interface IAssetPayload {\r\n id: number;\r\n idString: string;\r\n subType: string;\r\n cropX?: number;\r\n cropY?: number;\r\n cropWidth?: number;\r\n cropHeight?: number;\r\n}\r\n\r\nexport enum AssociationType {\r\n Image191x100 = 'Image191x100',\r\n Image178x100 = 'Image178x100',\r\n Image172x100 = 'Image172x100',\r\n Image169x100 = 'Image169x100',\r\n Image155x100 = 'Image155x100',\r\n Image150x100 = 'Image150x100',\r\n Image133x100 = 'Image133x100',\r\n Image1x1 = 'Image1x1',\r\n Image93x100 = 'Image93x100',\r\n OriginalImage = 'OriginalImage',\r\n}\r\n\r\nexport interface IImageExperienceImage {\r\n setIncluded(val: boolean): void;\r\n isMaunalCropped(): boolean;\r\n isManualEdited(val: boolean): boolean;\r\n setCropSettings(cropSettings: ICropSettings): void;\r\n formatToSave(isMultimediaAd?: boolean, isVideoThumbnail?: boolean, overrideInfo?: any, isMMAV2Enabled?: boolean, isImageFittingEnabled?: boolean): IAssetPayload;\r\n copyEffectsFromOther(another: IImageExperienceImage): void;\r\n setType(AssociationType): void;\r\n isLogo: boolean;\r\n IsIncluded: boolean;\r\n isAutoCropping: boolean;\r\n Type: AssociationType;\r\n Id: string;\r\n IdString: string;\r\n isVirtual?: boolean;\r\n Width: number;\r\n Height: number;\r\n FinalSrc: string;\r\n CropSettings?: ICropSettings;\r\n BaseId?: number;\r\n associationType: string;\r\n originalImageCropSettings?: ICropSettings;\r\n}\r\n\r\nexport interface IImageAssetUpdate {\r\n id: number;\r\n}\r\n\r\nexport interface IImageExperienceImageWithUpdate {\r\n finalIdString: string;\r\n image: IImageExperienceImage;\r\n}\r\n\r\nexport interface IImageInfo {\r\n url: string,\r\n width: number,\r\n height: number,\r\n baseId: string,\r\n metadata: string,\r\n sourceType: string;\r\n isRecommendedImage: boolean;\r\n originalUrl: string;\r\n cropSettingOnOriginal: ICropSettings,\r\n placementSettings: Array<ICropSettings>,\r\n originalWidth: number,\r\n originalHeight: number,\r\n\r\n}\r\n\r\nexport interface IImageMapUrl {\r\n [key: string]: IImageInfo,\r\n}\r\n\r\nexport interface IMTAsset {\r\n Id: string,\r\n SubType: string,\r\n CropX: number,\r\n CropY: number,\r\n CropWidth: number,\r\n CropHeight: number,\r\n CroppingType: string,\r\n IdString: string,\r\n ImageUrl: string;\r\n Height: number;\r\n Width: number;\r\n AltText: string,\r\n}\r\n\r\ninterface ITextAsset {\r\n Asset: {\r\n Text: string;\r\n AssetType: string;\r\n }\r\n}\r\n\r\nexport interface IImageAsset {\r\n Asset: IMTAsset;\r\n}\r\n\r\nexport interface IRecommendAd {\r\n FinalUrls: string[];\r\n Text: string;\r\n Headline: string;\r\n LongHeadline: string;\r\n BusinessName: string;\r\n Headlines: ITextAsset[];\r\n Descriptions: ITextAsset[];\r\n LongHeadlines: ITextAsset[];\r\n Images: IImageAsset[];\r\n}\r\n\r\nexport interface IAdRecommendResponse {\r\n value: IRecommendAd[];\r\n}\r\n\r\nexport interface IActivityLogger {\r\n signal: (args0: string, args1: string) => void;\r\n}\r\n\r\nexport interface ISetUpAdWithRecommendAdParam {\r\n ad: IRecommendAd,\r\n isAdEditShown?: boolean,\r\n shouldSaveAdFromRecommend: boolean,\r\n}\r\n\r\nexport interface ResponsiveAdForPreview {\r\n images: IImageExperienceImage[][],\r\n shortHeadline: string;\r\n longHeadline: string;\r\n description: string;\r\n businessName: string;\r\n url: string;\r\n}\r\n","import _ from 'underscore';\r\nimport { deserializeImageAssetMetadata } from '@bingads-webui-campaign/media-metadata-model';\r\nimport { updatePlacementWithBaseCropSettings, updatePlacementWithPlacementSettings } from '@bingads-webui-campaign/image-experience-utils';\r\n\r\n/* Restore image model to UI state\r\n * When there is effect applied, need to convert Metadata to effectSettings\r\n */\r\nexport const processImagePlacementsMetadata =\r\n (placements, baseImageIdStr, baseImageInfo, isImageFittingEnabled, isCombinedMsanAndMmaAspectRatios) => {\r\n let imageLevelSettings;\r\n let propagateToImageLevel = false;\r\n\r\n const includedPlacements = _.filter(placements, placement => placement.IsIncluded);\r\n const excludedPlacements = _.filter(placements, placement => !placement.IsIncluded);\r\n const hasBeenBulkCropped = placements[0].baseImage.originalUrl &&\r\n placements[0].baseImage.originalUrl !== placements[0].baseImage.src;\r\n const hasPlacementSettings =\r\n placements[0].baseImage.placementSettings &&\r\n placements[0].baseImage.placementSettings.length > 0;\r\n\r\n const uniqueCountOfIds = _.chain(includedPlacements)\r\n .pluck('Id').uniq().size()\r\n .value();\r\n\r\n if (uniqueCountOfIds === 1) {\r\n // when placements have same effect, propagate it to image level\r\n propagateToImageLevel = true;\r\n }\r\n\r\n const cachedDeserializedMetadataById = {};\r\n\r\n _.each(includedPlacements, (placement) => {\r\n const cachedValue = cachedDeserializedMetadataById[placement.Id];\r\n let effectSettings;\r\n\r\n if (_.isUndefined(cachedValue)) {\r\n const deserializeMetadata = deserializeImageAssetMetadata(placement.Metadata) || {};\r\n\r\n cachedDeserializedMetadataById[placement.Id] = deserializeMetadata;\r\n ({ effectSettings } = deserializeMetadata);\r\n } else {\r\n ({ effectSettings } = cachedValue);\r\n }\r\n\r\n if (placement.IdString !== baseImageIdStr && effectSettings) {\r\n // restore placement various settings (effect, crop) in UI state\r\n const effectSrc = placement.Src;\r\n\r\n placement.setEffectSettings(_.defaults({ effectSrc }, effectSettings));\r\n }\r\n\r\n if (propagateToImageLevel && !imageLevelSettings) {\r\n imageLevelSettings = { effectSettings: placement.effectSettings };\r\n }\r\n });\r\n\r\n // restore image level UI state when all placements have same effect\r\n _.each(includedPlacements, (placement) => {\r\n const { url: originalSrc } = baseImageInfo;\r\n\r\n placement.BaseImage.setSrc(originalSrc);\r\n placement.BaseImage\r\n .setEffectSettings(imageLevelSettings && imageLevelSettings.effectSettings);\r\n });\r\n\r\n // let excluded placements inherit image level\r\n if (!_.isEmpty(includedPlacements)) {\r\n _.each(excludedPlacements, (placement) => {\r\n placement.setBaseImage(includedPlacements[0].BaseImage.clone());\r\n placement.setEffectSettings(placement.BaseImage.EffectSettings);\r\n });\r\n }\r\n\r\n if (hasBeenBulkCropped) {\r\n const { BaseImage } = placements[0];\r\n\r\n _.each(placements, (placement) => {\r\n updatePlacementWithBaseCropSettings({\r\n placement,\r\n mtImgObject: BaseImage,\r\n IsCroppingbasedOriginal: true,\r\n setCroppingType: isImageFittingEnabled,\r\n });\r\n });\r\n }\r\n\r\n if (hasPlacementSettings && !isCombinedMsanAndMmaAspectRatios) {\r\n const { BaseImage } = placements[0];\r\n\r\n _.each(placements, (placement) => {\r\n updatePlacementWithPlacementSettings({\r\n placement,\r\n mtImgObject: BaseImage,\r\n updatePlacementSettings:\r\n !placement.isMaunalCropped(), // fill in placement settings when\r\n // crop settings are auto-filled in MSAN workflow\r\n isMultimediaAd: false,\r\n isMultimediaAdinMSANEnabled: true,\r\n setCroppingType: isImageFittingEnabled,\r\n });\r\n });\r\n }\r\n };\r\n\r\nconst DefaultKey = 'default';\r\n\r\nconst containMetadata = metadata => !_.isEmpty(metadata);\r\nexport const getMetadataKey = metadata => (containMetadata(metadata) ? metadata : DefaultKey);\r\n\r\n/* This is to optimize bulkUpsert call to create new assets.\r\n If asset content exists in db, same asset id is returned from MT.\r\n So here we collect such information to reduce unnecessary calls.\r\n\r\nReturn result is a dictionary whose key is asset id which doesn't have any effects applied.\r\n{\r\n [base-id-1]: {\r\n default: { id, src },\r\n [metadata1]: { id, src },\r\n },\r\n}\r\n\r\n*/\r\nexport const collectExistingMetadata = assetList => _.reduce(assetList, (memo, asset) => {\r\n const key = asset.BaseId.toString();\r\n const original = memo[key];\r\n const metadataKey = getMetadataKey(asset.Metadata);\r\n const isProcessed = containMetadata(asset.Metadata);\r\n\r\n return {\r\n ...memo,\r\n [key]: _.extend({\r\n ...original,\r\n [metadataKey]: {\r\n // id and src should be matched\r\n // when apply effects, we only modify EffectSettings and keep src read-only.\r\n id: asset.Id,\r\n bingSrc: asset.Src,\r\n },\r\n }, isProcessed && {\r\n [DefaultKey]: {\r\n id: asset.BaseImage.Id,\r\n bingSrc: asset.BaseImage.Src,\r\n },\r\n }),\r\n };\r\n}, {});\r\n\r\nexport const insertMetadata = (dict, id, metadata, data) => {\r\n const key = getMetadataKey(metadata);\r\n _.extend(dict[id.toString()], {\r\n [key]: {\r\n id: data.id,\r\n bingSrc: data.bingSrc,\r\n },\r\n });\r\n};\r\n\r\nexport const findMetadata = (dict, id, metadata) => {\r\n const metadataKey = getMetadataKey(metadata);\r\n const assetsFromImage = dict[id.toString()];\r\n\r\n return assetsFromImage[metadataKey];\r\n};\r\n\r\nexport const isMetadataExisting = (dict, id, metadata) => {\r\n const found = findMetadata(dict, id, metadata);\r\n\r\n return !_.isUndefined(found);\r\n};\r\n","import _ from 'underscore';\r\nimport {\r\n getAutoCroppedImages,\r\n constants,\r\n ImageExperienceImage,\r\n getCenterCroppedSettings,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\nimport { constants as C } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport {\r\n ICropSettings,\r\n IImageExperienceImage,\r\n IImageMapUrl,\r\n IMTAsset,\r\n AssociationType,\r\n IImageAssetUpdate,\r\n IImageExperienceImageWithUpdate,\r\n IAssetPayload,\r\n} from './types';\r\nimport { processImagePlacementsMetadata } from '../image-metadata-util';\r\n\r\nconst { subTypeToType } = constants;\r\n\r\nconst getImageProps = (\r\n asset: IMTAsset,\r\n imageToUrlMap: IImageMapUrl,\r\n options: {\r\n isIncluded?: boolean,\r\n isLogo?: boolean,\r\n cs?: ICropSettings\r\n },\r\n image: IImageExperienceImage\r\n) => {\r\n const { cs, isIncluded, isLogo } = options;\r\n\r\n const idString = asset.IdString || String(asset.Id);\r\n const assetExtraInfo = imageToUrlMap[idString];\r\n\r\n let croppingType = asset.CroppingType;\r\n if (asset.SubType !== AssociationType.OriginalImage && !croppingType) {\r\n croppingType = C.CroppingType.ManualCrop;\r\n }\r\n\r\n let cropSettings = {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n CroppingType: croppingType,\r\n };\r\n\r\n // Recommeded image don't support auto crop\r\n if (assetExtraInfo.isRecommendedImage) {\r\n cropSettings = {\r\n SourceX: asset.CropX,\r\n SourceY: asset.CropY,\r\n SourceWidth: asset.CropWidth,\r\n SourceHeight: asset.CropHeight,\r\n CroppingType: '',\r\n };\r\n }\r\n\r\n return ({\r\n id: asset.Id,\r\n idString: String(asset.Id),\r\n baseId: imageToUrlMap[asset.Id].baseId,\r\n metadata: imageToUrlMap[asset.Id].metadata,\r\n src: imageToUrlMap[asset.Id].url,\r\n type: subTypeToType[asset.SubType],\r\n width: imageToUrlMap[asset.Id].width,\r\n height: imageToUrlMap[asset.Id].height,\r\n source: imageToUrlMap[asset.Id].sourceType,\r\n altText: asset.AltText,\r\n cropSettings,\r\n isIncluded,\r\n isLogo,\r\n originCropSetting: cs,\r\n isRecommendedImage: assetExtraInfo.isRecommendedImage,\r\n originalUrl: assetExtraInfo.originalUrl,\r\n cropSettingOnOriginal: assetExtraInfo.cropSettingOnOriginal,\r\n placementSettings: assetExtraInfo.placementSettings,\r\n originalWidth: assetExtraInfo.originalWidth,\r\n originalHeight: assetExtraInfo.originalHeight,\r\n associationType: image && image.associationType,\r\n });\r\n};\r\n\r\nconst getMTAssetBaseId = (asset: IMTAsset, imageToUrlMap: IImageMapUrl) => {\r\n const info = imageToUrlMap[asset.Id];\r\n\r\n return info.baseId || asset.Id.toString();\r\n};\r\n\r\n/**\r\n * judge if the are using same base image\r\n * e.g. assets may come from base image and some effect\r\n */\r\nconst compareBaseImage = (\r\n image: IImageExperienceImage,\r\n asset: IMTAsset,\r\n imageToUrlMap: IImageMapUrl,\r\n isAdCreatorEnabled: boolean\r\n): boolean => {\r\n const matchedId = isAdCreatorEnabled\r\n ? image.BaseId!.toString() === getMTAssetBaseId(asset, imageToUrlMap)\r\n : image.IdString === asset.IdString;\r\n\r\n return matchedId;\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst generateMTAssetV2 = (payloadV1: IMTAsset, imageToUrlMap: IImageMapUrl): IMTAsset => {\r\n const payloadV2 = _.clone(payloadV1);\r\n payloadV2.SubType = 'OriginalImage';\r\n payloadV2.CropHeight = payloadV1.CropHeight;\r\n payloadV2.CropWidth = payloadV1.CropWidth;\r\n payloadV2.CropX = payloadV1.CropX;\r\n payloadV2.CropY = payloadV1.CropY;\r\n return payloadV2;\r\n};\r\n\r\nconst generateMTAssetWithOriginalImage = (\r\n originalAssets: IMTAsset[],\r\n imageToUrlMap: IImageMapUrl\r\n) => {\r\n // generate original image payload\r\n const assets: IMTAsset[] = [];\r\n const originalAssetsFor191x100AspectRatio = _.filter(originalAssets, asset => subTypeToType[asset.SubType] === AssociationType.Image191x100);\r\n\r\n _.each(originalAssetsFor191x100AspectRatio || [], (assetsV1) => {\r\n // add original image to payload\r\n assets.push(generateMTAssetV2(assetsV1, imageToUrlMap));\r\n });\r\n\r\n return assets;\r\n};\r\n\r\n/**\r\n * MMA In MSAN UI Dev Spec:\r\n * https://microsoft-my.sharepoint.com/:w:/g/personal/xiao_microsoft_com1/ESfoVZCPYKlFn5p0Ee_Xx-4ByJuBjdDMNQ7vl7CgotNScg?e=cLqZae\r\n * pseudo code for this:\r\n * https://microsoft-my.sharepoint.com/personal/xiao_microsoft_com1/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments%2Fsample%2Ejs&parent=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments\r\n * get the image associations to display for each image\r\n *\r\n * MMA V2 In MSAN UI Dev Spec:\r\n * to support more aspect ratios and use original image as default image.\r\n * https://microsoft-my.sharepoint.com/:w:/r/personal/youngim_microsoft_com/Documents/MMA%20V2%20DevSpec.docx?d=w145d99a164574567a3c7187597b204a8&csf=1&web=1&e=TBLlhW\r\n */\r\nexport const getMultiImages =\r\n (\r\n originalAssets: IMTAsset[],\r\n imageToUrlMap: IImageMapUrl,\r\n options: {\r\n isAdCreatorEnabled: boolean,\r\n isMMAV2Enabled?: boolean,\r\n isBoost200x100ImageEnabled?: boolean,\r\n isBoostNewAspectRatioSupportEnabled?: boolean,\r\n isImageFittingEnabled?: boolean,\r\n }\r\n ) => {\r\n let assets: IMTAsset[] = originalAssets;\r\n const isV2Format = options.isMMAV2Enabled && _.some(originalAssets, asset => (asset.SubType === AssociationType.OriginalImage));\r\n\r\n // this is true when editing an existing ad which is not in V2 format (at least has one original image)\r\n // when creating a new ad, the returned recommended ad are all in V2 format.\r\n const shouldConvertAssetToV2Format = options.isMMAV2Enabled && !_.some(originalAssets, asset => (asset.SubType === AssociationType.OriginalImage));\r\n if (shouldConvertAssetToV2Format) {\r\n assets = _.union(generateMTAssetWithOriginalImage(originalAssets, imageToUrlMap), originalAssets);\r\n }\r\n\r\n const imageGroupByType = _.groupBy(assets, (asset: IMTAsset) => subTypeToType[asset.SubType]);\r\n const multiImagesGroup = options.isAdCreatorEnabled\r\n ? _.uniq(_.map(assets, asset => getMTAssetBaseId(asset, imageToUrlMap)))\r\n : Object.keys(imageToUrlMap);\r\n\r\n const multiImages = multiImagesGroup.map((key) => {\r\n let imagesExperience: IImageExperienceImage[] = getAutoCroppedImages({\r\n // @ts-ignore\r\n originalImageToCrop: {\r\n Id: key,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n isMultimediaAdinMSANEnabled: true,\r\n isRecommendedImage: imageToUrlMap[key].isRecommendedImage,\r\n isMMAV2Enabled: options.isMMAV2Enabled,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n setCroppingType: options.isImageFittingEnabled,\r\n });\r\n\r\n // @ts-ignore\r\n imagesExperience = imagesExperience.map((image) => {\r\n // find image association\r\n const asset: IMTAsset | undefined = _.find(assets, (mtAsset) => {\r\n const matchedType = subTypeToType[mtAsset.SubType] === image.Type;\r\n\r\n return matchedType && compareBaseImage(image, mtAsset, imageToUrlMap, options.isAdCreatorEnabled);\r\n });\r\n\r\n if (asset) {\r\n // @ts-ignore\r\n return new ImageExperienceImage(getImageProps(\r\n asset,\r\n imageToUrlMap,\r\n { isIncluded: true, isLogo: image.isLogo, cs: image.CropSettings },\r\n image\r\n ));\r\n }\r\n\r\n image.setIncluded(false);\r\n\r\n return image;\r\n });\r\n\r\n /* If default image (1.91 is the default image for legacy RA/MMA V1 AND OriginalImage is the default image for MMA V2)\r\n * is included, process other ratios which are not included with below rule:\r\n * --- When there are no associations for this aspect ratio in ad image associations, auto include this ratio.\r\n * --- unless the image fails size validation for this aspect ratio, then it will still be excluded (cannot be auto included).\r\n */\r\n const landscapeFound = getLandscapeImage(imagesExperience);\r\n const originalImageFound = options.isMMAV2Enabled && getOriginalImage(imagesExperience);\r\n\r\n if ((landscapeFound && landscapeFound.IsIncluded && !isV2Format)\r\n || (originalImageFound && originalImageFound.IsIncluded)) {\r\n _.each(imagesExperience, (image) => {\r\n // if no image association for this aspect ratio, then include the image.\r\n if (!image.IsIncluded && !imageGroupByType[image.Type]) {\r\n if (options.isAdCreatorEnabled) {\r\n image.copyEffectsFromOther(originalImageFound || landscapeFound);\r\n }\r\n\r\n image.setIncluded(true);\r\n }\r\n });\r\n }\r\n\r\n if (options.isAdCreatorEnabled) {\r\n processImagePlacementsMetadata(imagesExperience, key, imageToUrlMap[key], options.isImageFittingEnabled);\r\n }\r\n\r\n if (shouldConvertAssetToV2Format) {\r\n // check size validation before return\r\n // (in V2 aspect ratio contract, 1.69 size (min height 372) is bigger than default image (minheight 368))\r\n // it may be auto-included by the rule above (which is \"When there are no associations for this aspect ratio in ad image associations, auto include this ratio\")\r\n const aspectRatios = C.getAspectRatios({\r\n isMultimediaAd: true,\r\n isMultimediaAdinMSANEnabled: true,\r\n imageOption: C.defaultImageOption,\r\n isCombinedMsanAndMmaAspectRatios: false,\r\n isMMAV2Enabled: true,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n });\r\n _.each(imagesExperience, (image) => {\r\n const { minSize } = aspectRatios[image.Type];\r\n if (image.Type !== AssociationType.OriginalImage &&\r\n // original image is always included\r\n (image.CropSettings!.SourceWidth < minSize[0] || image.CropSettings!.SourceHeight < minSize[1])) {\r\n // Simulating the logic in XAP that if customer explicitly provided the image association for this aspect ratio and it's smaller than the requested ad placement size\r\n // XAP will drop this traffic directly, as a result, we exclude this image directly.\r\n // even if the src or default image is bigger than the minimum.\r\n image.setIncluded(false);\r\n }\r\n });\r\n }\r\n return imagesExperience;\r\n });\r\n\r\n if (shouldConvertAssetToV2Format) {\r\n // filter out the image with all aspect ratio excluded\r\n return _.filter(multiImages, imageExperience => _.some(imageExperience, image => image.IsIncluded));\r\n }\r\n\r\n return multiImages;\r\n };\r\n\r\nconst getLandscapeImage =\r\n (images: IImageExperienceImage[]): IImageExperienceImage => _.find(images, image => image.Type === AssociationType.Image191x100)!;\r\n\r\nconst getOriginalImage =\r\n (images: IImageExperienceImage[]): IImageExperienceImage => _.find(images, image => image.Type === AssociationType.OriginalImage)!;\r\n\r\n// when nonLandscapeImageListOfOneType has same assets + auto crop settings, we treat the type as redundant info and will not send to MT\r\nconst checkIfShouldKeepImageType = (\r\n landscapeImageList: IImageExperienceImageWithUpdate[],\r\n nonLandscapeImageListOfOneType: IImageExperienceImageWithUpdate[],\r\n options: {\r\n isMMAV2Enabled: boolean,\r\n isBoost200x100ImageEnabled: boolean,\r\n isBoostNewAspectRatioSupportEnabled: boolean,\r\n }\r\n) => {\r\n const landscapeSize = _.size(landscapeImageList);\r\n const sizeofThisType = _.size(nonLandscapeImageListOfOneType);\r\n\r\n if (landscapeSize !== sizeofThisType) { // when length not equal, keep this type\r\n return true;\r\n }\r\n\r\n // compare image content + crop settings\r\n const orderedLandscapeImageList =\r\n _.sortBy(landscapeImageList, 'finalIdString');\r\n const orderedNonLandscapeImageListOfOneType =\r\n _.sortBy(nonLandscapeImageListOfOneType, 'finalIdString');\r\n\r\n const aspectRatios = constants.getAspectRatios({\r\n isMultimediaAdinMSANEnabled: true,\r\n isMMAV2Enabled: options.isMMAV2Enabled,\r\n isBoost200x100ImageEnabled: options.isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled: options.isBoostNewAspectRatioSupportEnabled,\r\n });\r\n const type = nonLandscapeImageListOfOneType[0].image.Type;\r\n const ratio = aspectRatios[type].aspectRatio;\r\n\r\n for (let i = 0; i < landscapeSize; i += 1) {\r\n const { finalIdString: landscapeImageFinalId, image: landscapeImage } = orderedLandscapeImageList[i];\r\n const { finalIdString: imageOfThisTypeId, image: imageOfThisType } = orderedNonLandscapeImageListOfOneType[i];\r\n\r\n if (landscapeImageFinalId !== imageOfThisTypeId) {\r\n return true;\r\n }\r\n\r\n // compare image crop settings:\r\n // instead of checking UI activities to decide if it is auto cropped or not, directly compare with center crop algorithm output.\r\n // In this way, we can decouple UI logic with mt/de related logic. This will help better maintain in the future.\r\n const autoCroppedSettings = getCenterCroppedSettings({\r\n // use full image as box to crop\r\n SourceWidth: landscapeImage.Width,\r\n SourceHeight: landscapeImage.Height,\r\n SourceX: 0,\r\n SourceY: 0,\r\n }, ratio);\r\n\r\n const isCropSettingsEqual = (cropSettings, originalCropSettings) => (\r\n cropSettings.SourceX === originalCropSettings.SourceX &&\r\n cropSettings.SourceY === originalCropSettings.SourceY &&\r\n cropSettings.SourceWidth === originalCropSettings.SourceWidth &&\r\n cropSettings.SourceHeight === originalCropSettings.SourceHeight\r\n );\r\n\r\n // for image fitting, if originalImageCropSettings is equal to CropSettings, then it is not cropped\r\n if ((!imageOfThisType.originalImageCropSettings && !isCropSettingsEqual(imageOfThisType.CropSettings, autoCroppedSettings)) ||\r\n (imageOfThisType.originalImageCropSettings && !isCropSettingsEqual(imageOfThisType.CropSettings, imageOfThisType.originalImageCropSettings)\r\n && !isCropSettingsEqual(imageOfThisType.CropSettings, autoCroppedSettings))) {\r\n return true;\r\n }\r\n }\r\n\r\n // if image looks + crop settings match, then not necessary to keep\r\n return false;\r\n};\r\n\r\n/**\r\n * MMA In MSAN UI Dev Spec:\r\n * https://microsoft-my.sharepoint.com/:w:/g/personal/xiao_microsoft_com1/ESfoVZCPYKlFn5p0Ee_Xx-4ByJuBjdDMNQ7vl7CgotNScg?e=cLqZae\r\n * https://microsoft-my.sharepoint.com/:w:/p/taxiahou/EYnHXWA0PPxNsABcWrfolBIB9HGCXO4OM7pjIKNGRF8sew\r\n * pseudo code for this:\r\n * https://microsoft-my.sharepoint.com/personal/xiao_microsoft_com1/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments%2Fsample%2Ejs&parent=%2Fpersonal%2Fxiao%5Fmicrosoft%5Fcom1%2FDocuments\r\n * convert imageList to image asset from MT\r\n * @param imageList A flattened included assets list. Otherwise, it is UI state two dimension array.\r\n * @param imageIdsUpdatesByIndex Information on updated ids. In some cases such as applying effect, the new ids are saved here by position in imagelist.\r\n * @returns selected asset list that will be sent to MT\r\n */\r\nexport const getMMAPayloadV2 = (\r\n flattenedImageList: IImageExperienceImage[],\r\n imageIdsUpdatesByIndex: IImageAssetUpdate[],\r\n isMMAV2Enabled: boolean = false,\r\n isBoost200x100ImageEnabled: boolean = false,\r\n isBoostNewAspectRatioSupportEnabled: boolean = false,\r\n isImageFittingEnabled: boolean = false\r\n): IAssetPayload[] => {\r\n // Motivation: If DE could not find association for a ratio, they will generate from landscape ratio 1.91\r\n const includedImageListByType = _.reduce(flattenedImageList, (memo, value, index) => {\r\n const key = value.Type;\r\n const overrideInfo = imageIdsUpdatesByIndex && imageIdsUpdatesByIndex[index];\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n memo[key] = memo[key] || [];\r\n memo[key].push({\r\n finalIdString: ((overrideInfo && overrideInfo.id) || value.Id).toString(),\r\n image: value,\r\n });\r\n\r\n return memo;\r\n }, {}) as Record<AssociationType, IImageExperienceImageWithUpdate[]>;\r\n\r\n // default behavior: user cannot exclude one aspect ratio for all images in UI.\r\n // in MMA V2, if image size is smaller than 703x372 (default image is 703x368)\r\n // Aspect Ratio 1.69:1 will be excluded due to size validation\r\n // so we will add a validation here to check if we need to keep this type of image\r\n const aspectRatios = constants.getAspectRatios({\r\n isMultimediaAdinMSANEnabled: true,\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n });\r\n const shouldIgnoreThisAlgorithm = isMMAV2Enabled && _.size(includedImageListByType) !== _.size(aspectRatios);\r\n\r\n const payload: IAssetPayload[] = [];\r\n\r\n _.each(includedImageListByType, (imageWithUpdateListOfThisType, type) => {\r\n let keep = false;\r\n\r\n // we only need to handle non-landscape ratios to check if they can be ignored\r\n const checkType = isMMAV2Enabled ? AssociationType.OriginalImage : AssociationType.Image191x100;\r\n if (type === checkType || shouldIgnoreThisAlgorithm) {\r\n keep = true;\r\n } else {\r\n keep =\r\n checkIfShouldKeepImageType(\r\n includedImageListByType[checkType],\r\n imageWithUpdateListOfThisType,\r\n {\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n }\r\n );\r\n }\r\n\r\n if (keep) {\r\n const mtModelArr = imageWithUpdateListOfThisType.map(({\r\n finalIdString,\r\n image,\r\n }) => image.formatToSave(false, false, { id: parseInt(finalIdString, 10) || finalIdString }, isMMAV2Enabled, isImageFittingEnabled)); // recommended image is not existing asset, so it's id is image url string\r\n\r\n payload.push(...mtModelArr);\r\n }\r\n });\r\n\r\n return payload;\r\n};\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport {\r\n ImageExperienceImage,\r\n getAutoCroppedImages,\r\n ImageRepository,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\nimport { DependencyResolver } from '@bingads-webui-campaign/dependency-resolver';\r\nimport { queryify } from '@bingads-webui/url-util';\r\nimport { getCenterCroppedSettings } from '@bingads-webui-campaign/image-experience-utils';\r\nimport { getMultiImages, getLogoExperience, getPortraitExperience } from './data-process';\r\nimport { processImagePlacementsMetadata } from './image-metadata-util';\r\n\r\nconst {\r\n subTypeToType,\r\n getImageTypesWithOrder,\r\n logoSubtypes,\r\n portraitSubtypes,\r\n} = constants;\r\n\r\nconst autoFillMissingImagesAsync = (imageObjArr) => {\r\n const autoCroppedImages = getAutoCroppedImages({\r\n originalImageToCrop: imageObjArr[0],\r\n isMultimediaAd: false,\r\n });\r\n const imagesToReturn = [];\r\n\r\n _.each(autoCroppedImages, (croppedImage) => {\r\n const savedImage = _.find(imageObjArr, imageObj => imageObj.Type === croppedImage.Type);\r\n if (savedImage) {\r\n imagesToReturn.push(savedImage);\r\n } else {\r\n imagesToReturn.push(croppedImage);\r\n }\r\n });\r\n\r\n return imagesToReturn;\r\n};\r\n\r\nconst imageAssetCenterCrop = (asset) => {\r\n const {\r\n SourceHeight,\r\n SourceWidth,\r\n SourceX,\r\n SourceY,\r\n } = getCenterCroppedSettings({\r\n SourceHeight: asset.CropHeight,\r\n SourceWidth: asset.CropWidth,\r\n SourceX: 0,\r\n SourceY: 0,\r\n }, 1.91);\r\n\r\n return {\r\n ...asset,\r\n CropX: SourceX,\r\n CropY: SourceY,\r\n CropWidth: SourceWidth,\r\n CropHeight: SourceHeight,\r\n };\r\n};\r\n\r\nexport async function uploadRecommendImage(images, props, recommendAssetIdImageUrlMap) {\r\n const config = DependencyResolver.get('component/config/index');\r\n\r\n const odataToken = config.get('odata.token');\r\n const odataPath = config.get('odata.url') + config.get('odata.path');\r\n const odataRootUrl = config.get('CampaignAzureDomain');\r\n\r\n const { cid, aid } = props;\r\n const oDataConfig = {\r\n odataRootUrl,\r\n odataPath,\r\n odataToken,\r\n };\r\n\r\n const imagesWithoutId = images.filter(image => !image.Asset.Id);\r\n const urls = imagesWithoutId\r\n .map(image => ({ url: image.Asset.ImageUrl }));\r\n const imageRepository = new ImageRepository(cid, aid, oDataConfig);\r\n\r\n const ids = await imageRepository.bulkSaveImagesByUrl(urls);\r\n\r\n // save the mapping for log\r\n _.each(_.filter(images, i => !!i.Asset.Id), (image) => {\r\n recommendAssetIdImageUrlMap[image.Asset.Id] = image.Asset.ImageUrl; // eslint-disable-line no-param-reassign\r\n });\r\n _.each(ids, (id, index) => {\r\n recommendAssetIdImageUrlMap[id] = _.get(urls, [index, 'url']); // eslint-disable-line no-param-reassign\r\n });\r\n\r\n // eslint-disable-next-line\r\n const promises = imagesWithoutId.map((image, index) => {\r\n return imageRepository.getImageByIdAsync(ids[index]).then((imageInfo) => {\r\n image.Asset = { // eslint-disable-line no-param-reassign\r\n ...image.Asset,\r\n Id: ids[index],\r\n IdString: ids[index],\r\n SubType: 'LandscapeImageMedia',\r\n CropHeight: imageInfo.Height || 800,\r\n CropWidth: imageInfo.Width || 400,\r\n };\r\n }).catch(() => {\r\n image.Asset = { // eslint-disable-line no-param-reassign\r\n ...image.Asset,\r\n Id: ids[index],\r\n IdString: ids[index],\r\n SubType: 'LandscapeImageMedia',\r\n CropHeight: 800,\r\n CropWidth: 400,\r\n };\r\n }).finally(() => {\r\n image.Asset = imageAssetCenterCrop(image.Asset); // eslint-disable-line no-param-reassign\r\n });\r\n });\r\n\r\n await Promise.all(promises);\r\n return ids;\r\n}\r\n\r\nconst getImageProps = (asset, imageToUrlMap, isIncluded, isMultimediaAd) => {\r\n const idString = asset.IdString || String(asset.Id);\r\n const assetExtraInfo = imageToUrlMap[idString];\r\n const isLogo = asset.SubType in constants.logoSubtypes;\r\n return {\r\n id: isMultimediaAd && isLogo ? `${idString}-${asset.SubType}` : idString,\r\n baseId: assetExtraInfo.baseId,\r\n metadata: assetExtraInfo.metadata,\r\n src: assetExtraInfo.url,\r\n type: subTypeToType[asset.SubType],\r\n associationType: asset.SubType,\r\n isLogo,\r\n width: assetExtraInfo.width,\r\n height: assetExtraInfo.height,\r\n cropSettings: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ?\r\n asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ?\r\n asset.CropHeight : assetExtraInfo.height,\r\n },\r\n isIncluded,\r\n isRecommendedImage: asset.IsRecommendedImage,\r\n disableEdit: asset.DisableEdit,\r\n originalUrl: assetExtraInfo.originalUrl,\r\n cropSettingOnOriginal: assetExtraInfo.cropSettingOnOriginal,\r\n placementSettings: assetExtraInfo.placementSettings,\r\n originalWidth: assetExtraInfo.originalWidth,\r\n originalHeight: assetExtraInfo.originalHeight,\r\n };\r\n};\r\n\r\nconst getImageTasks = (mTAssetArrays, baseURL, odata, isImageFittingEnabled) => {\r\n let imageIdsToFetch = _.map(mTAssetArrays, mtAsset => mtAsset.Asset.IdString || mtAsset.Asset.Id);\r\n\r\n imageIdsToFetch = _.compact(_.uniq(imageIdsToFetch));\r\n\r\n return _.map(imageIdsToFetch, (imageId) => {\r\n let url = `${baseURL}Images(${imageId})`;\r\n if (isImageFittingEnabled) {\r\n url = `${url}?AdType=Audience`;\r\n }\r\n\r\n return odata.get(url)\r\n .then(response => ({\r\n ...response,\r\n\r\n // &c=0 means no crop. It wil help convert tiff to jpg so that img tag can be displayed.\r\n // This is to mitigate unexpected MMA demand associated with tiff images caused by a MT bug\r\n // Attention: this is not an official support for tiff format.\r\n // If we want to officially support a new image type, need more changes/tests.\r\n Url: queryify(response.Url, { c: 0 }),\r\n }));\r\n });\r\n};\r\n\r\n// fetch image info as well as base image info if any\r\nconst getAllImagesInfoFromMTAssets = ({\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n}) => {\r\n const imageInfoArr = [];\r\n\r\n return Promise.all(getImageTasks(mTAssetArrays, baseURL, odata, isImageFittingEnabled))\r\n .then((values) => {\r\n imageInfoArr.push(...values);\r\n\r\n if (isAdCreatorEnabled) {\r\n const existingIds = _.pluck(imageInfoArr, 'Id');\r\n const baseAssetArrays = _.chain(values)\r\n .pluck('BaseIdString')\r\n .compact()\r\n .difference(existingIds)\r\n .map(Id => ({ Asset: { Id } }))\r\n .value();\r\n\r\n if (!_.isEmpty(baseAssetArrays)) {\r\n return Promise.all(getImageTasks(baseAssetArrays, baseURL, odata, isImageFittingEnabled));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .then((baseImageInfos) => {\r\n imageInfoArr.push(...baseImageInfos);\r\n\r\n const ret = _.reduce(imageInfoArr, (memo, value) => _.extend(memo, {\r\n [value.IdString]: _.extend({\r\n url: value.Url,\r\n height: value.Height,\r\n sourceType: value.SourceType,\r\n width: value.Width,\r\n }, isAdCreatorEnabled && {\r\n baseId: value.BaseIdString,\r\n metadata: value.Metadata,\r\n }, {\r\n originalUrl: value.OriginalUrl,\r\n cropSettingOnOriginal: value.CropSettingOnOriginal,\r\n placementSettings: value.PlacementSettings,\r\n originalHeight: value.OriginalHeight,\r\n originalWidth: value.OriginalWidth,\r\n roiInfo: isImageFittingEnabled ? value.ROIInfo : undefined,\r\n }),\r\n }), {});\r\n\r\n return ret;\r\n });\r\n};\r\n\r\nconst buildAssetModels = ({\r\n mTAssetArrays,\r\n imageToUrlMap,\r\n imageTypesWithOrder,\r\n isMultimediaAd,\r\n}) => {\r\n // build ImageExperienceImage for all existing placements\r\n let imageObjArr = _.map(\r\n mTAssetArrays,\r\n mtAsset => new ImageExperienceImage(getImageProps(mtAsset.Asset, imageToUrlMap, true, isMultimediaAd))\r\n );\r\n\r\n imageObjArr = imageObjArr.sort((imageObj1, imageObj2) => {\r\n const obj1Inx = imageTypesWithOrder.indexOf(imageObj1.Type);\r\n const obj2Inx = imageTypesWithOrder.indexOf(imageObj2.Type);\r\n\r\n if (obj1Inx < obj2Inx) {\r\n return -1;\r\n }\r\n return 1;\r\n });\r\n\r\n return imageObjArr;\r\n};\r\n\r\nconst autoFillMissingImageIdAndSizeFromRecommendation = (mTAssetArrays, imageToUrlMap) => {\r\n _.each(mTAssetArrays, (mTAsset) => {\r\n if (_.isNull(mTAsset.Asset.Id)) {\r\n // Use image url as id because id is necessary field in ad preview components.\r\n _.extend(mTAsset.Asset, {\r\n Id: mTAsset.Asset.ImageUrl,\r\n });\r\n\r\n // Fill image url, height and width from recommendation.\r\n _.extend(imageToUrlMap, {\r\n [mTAsset.Asset.Id]: {\r\n url: mTAsset.Asset.ImageUrl,\r\n height: mTAsset.Asset.ImageHeight,\r\n width: mTAsset.Asset.ImageWidth,\r\n isRecommendedImage: mTAsset.Asset.IsRecommendedImage,\r\n },\r\n });\r\n }\r\n });\r\n};\r\n\r\nconst getMultiImagesFromMTAssetsAsync = (\r\n odata,\r\n baseURL,\r\n mTAssetArrays,\r\n isAdCreatorEnabled,\r\n isImproveMMA,\r\n isMMAV2Enabled,\r\n isBoostPortraitImageEnabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n isImageFittingEnabled\r\n) => {\r\n const options = {\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n };\r\n\r\n return getAllImagesInfoFromMTAssets(options)\r\n .then((imageToUrlMap) => {\r\n // When image asset id is null, auto fill image url and size from recommendation.\r\n if (isImproveMMA) {\r\n autoFillMissingImageIdAndSizeFromRecommendation(mTAssetArrays, imageToUrlMap);\r\n }\r\n\r\n const logoAssets = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter(asset => logoSubtypes[asset.SubType]);\r\n const logoExperiences = getLogoExperience(logoAssets, imageToUrlMap);\r\n\r\n const imageAsset = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter((asset) => {\r\n if (isBoostPortraitImageEnabled) {\r\n return !logoSubtypes[asset.SubType] && !portraitSubtypes[asset.SubType];\r\n }\r\n return !logoSubtypes[asset.SubType];\r\n });\r\n\r\n const portraitAssets = mTAssetArrays\r\n .map(mtAsset => mtAsset.Asset).filter(asset => portraitSubtypes[asset.SubType]);\r\n const portraitExperiences = getPortraitExperience(portraitAssets, imageToUrlMap);\r\n\r\n const imageExperiences = getMultiImages(\r\n imageAsset,\r\n imageToUrlMap,\r\n {\r\n isAdCreatorEnabled,\r\n isMMAV2Enabled,\r\n isBoost200x100ImageEnabled,\r\n isBoostNewAspectRatioSupportEnabled,\r\n isImageFittingEnabled,\r\n }\r\n );\r\n\r\n if (isImageFittingEnabled) {\r\n _.each(imageExperiences, (image) => {\r\n _.each(image, (placement) => {\r\n const { roiInfo } = imageToUrlMap[placement.IdString] || {};\r\n placement.setROIInfo(roiInfo, isMMAV2Enabled, true);\r\n });\r\n });\r\n }\r\n\r\n return [...logoExperiences, ...imageExperiences, ...portraitExperiences];\r\n });\r\n};\r\n\r\nconst groupImageObjectsByBaseImage = (imageObjArr, isAdCreatorEnabled) => {\r\n const initialObj = {\r\n image: {},\r\n logo: {},\r\n };\r\n\r\n return imageObjArr.reduce((memo, imageObj) => {\r\n const id = isAdCreatorEnabled ? imageObj.BaseId : imageObj.Id;\r\n const category = imageObj.isLogo ? 'logo' : 'image';\r\n\r\n const previousPlacements = memo[category][id] ? memo[category][id].placements : [];\r\n\r\n return {\r\n image: {\r\n ...memo.image,\r\n },\r\n logo: {\r\n ...memo.logo,\r\n },\r\n [category]: {\r\n ...memo[category],\r\n [id]: { baseId: id, placements: [...previousPlacements, imageObj] },\r\n },\r\n };\r\n }, initialObj);\r\n};\r\n\r\nconst getImagesFromMTAssetsAsync = (\r\n odata,\r\n baseURL,\r\n mTAssetArrays,\r\n isMultimediaAd = false,\r\n isAdCreatorEnabled = false,\r\n isCombinedMsanAndMmaAspectRatios = false,\r\n isStoreAppProng = false,\r\n isStoreAppSpotLight = false,\r\n isStoreAppTransparentLogo = false,\r\n isLinkedInAd = false,\r\n isImageFittingEnabled = false,\r\n isPMaxAspectRatiosV2Enabled = false\r\n) => {\r\n const options = {\r\n mTAssetArrays,\r\n baseURL,\r\n odata,\r\n isAdCreatorEnabled,\r\n isImageFittingEnabled,\r\n };\r\n\r\n return getAllImagesInfoFromMTAssets(options).then((imageToUrlMap) => {\r\n const imageTypesWithOrder =\r\n getImageTypesWithOrder(isMultimediaAd, isCombinedMsanAndMmaAspectRatios, isStoreAppProng, isStoreAppSpotLight, isStoreAppTransparentLogo, isLinkedInAd, isPMaxAspectRatiosV2Enabled);\r\n\r\n // When image asset id is null, auto fill image url and size from recommendation.\r\n autoFillMissingImageIdAndSizeFromRecommendation(mTAssetArrays, imageToUrlMap);\r\n\r\n // build ImageExperienceImage for all existing placements\r\n let imageObjArr = buildAssetModels({\r\n mTAssetArrays,\r\n imageToUrlMap,\r\n imageTypesWithOrder,\r\n isMultimediaAd,\r\n });\r\n\r\n if (isMultimediaAd || isStoreAppProng || isStoreAppSpotLight || isStoreAppTransparentLogo || isLinkedInAd) {\r\n // for MMA, UI state imageList is 2-dimensional array.\r\n // Each image element consists of multiple placements state.\r\n const mmaAspectRatios = constants.getAspectRatios({\r\n isMultimediaAd,\r\n isMultimediaAdinMSANEnabled: false,\r\n isCombinedMsanAndMmaAspectRatios,\r\n isStoreAppProng,\r\n isStoreAppSpotLight,\r\n isStoreAppTransparentLogo,\r\n isLinkedInAd,\r\n isPMaxAspectRatiosV2Enabled,\r\n });\r\n\r\n imageObjArr = _.filter(imageObjArr, image => image.type in mmaAspectRatios);\r\n\r\n // group by base image\r\n let imageObjArrById = groupImageObjectsByBaseImage(imageObjArr, isAdCreatorEnabled);\r\n\r\n // process placements metadata and fill in missing placements for each base image\r\n imageObjArrById = _.map([\r\n ..._.values(imageObjArrById.image),\r\n ..._.values(imageObjArrById.logo),\r\n ], ({ baseId, placements: imageArr }) => {\r\n const baseImageId = baseId.toString().indexOf('-') > -1 ? baseId.match(/(\\S*)-/)[1] : baseId;\r\n\r\n // preprocess metadata in existing placement\r\n if (isAdCreatorEnabled) {\r\n processImagePlacementsMetadata(imageArr, baseImageId, imageToUrlMap[baseImageId], isImageFittingEnabled, isCombinedMsanAndMmaAspectRatios);\r\n }\r\n\r\n // fill in missing placement and generate full list of placements\r\n const missingTypes = _.difference(imageTypesWithOrder, _.pluck(imageArr, 'type'));\r\n const autoCroppedImages =\r\n getAutoCroppedImages({\r\n originalImageToCrop: isAdCreatorEnabled\r\n ? _.first(imageArr).BaseImage : _.first(imageArr),\r\n isMultimediaAd: true,\r\n imageOption: _.first(imageArr).isLogo ?\r\n constants.imageOptionKeys.Logo : constants.imageOptionKeys.Image,\r\n isRecommendedImage: _.first(imageArr).isRecommendedImage,\r\n isCombinedMsanAndMmaAspectRatios,\r\n isLinkedInAd,\r\n disableEdit: _.first(imageArr).disableEdit,\r\n isPMaxAspectRatiosV2Enabled,\r\n });\r\n\r\n return _.compact(_.map(imageTypesWithOrder, (type) => {\r\n const isMissingType = missingTypes.indexOf(type) >= 0;\r\n let placement;\r\n\r\n if (isMissingType) {\r\n placement = _.find(autoCroppedImages, image => image.type === type);\r\n if (placement) {\r\n placement.setIncluded(false);\r\n\r\n if (isAdCreatorEnabled) {\r\n placement.setBaseImage(imageArr[0].BaseImage.clone());\r\n placement.setEffectSettings(placement.BaseImage.EffectSettings);\r\n }\r\n }\r\n } else {\r\n placement = _.find(imageArr, image => image.type === type);\r\n }\r\n\r\n return placement;\r\n }));\r\n });\r\n\r\n return _.values(imageObjArrById);\r\n }\r\n\r\n if (imageObjArr.length === imageTypesWithOrder.length) {\r\n return imageObjArr;\r\n }\r\n\r\n return autoFillMissingImagesAsync(imageObjArr);\r\n });\r\n};\r\n\r\nexport {\r\n getImagesFromMTAssetsAsync,\r\n getMultiImagesFromMTAssetsAsync,\r\n getImageProps,\r\n getAllImagesInfoFromMTAssets,\r\n};\r\n","import {\r\n getAutoCroppedImages,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\n\r\nimport { IMTAsset, IImageMapUrl } from './types';\r\n\r\nexport function getLogoExperience(assets: IMTAsset[], imageToUrlMap: IImageMapUrl) {\r\n const logoGroup = Object.keys(imageToUrlMap);\r\n\r\n // ImageToUrlMap contains distinct ids, while assets could contain multiple assets with same id\r\n return assets.filter(ass => logoGroup.includes(ass.IdString)).map((asset) => {\r\n const key = asset.IdString;\r\n const assetExtraInfo = imageToUrlMap[key];\r\n\r\n return getAutoCroppedImages({\r\n originalImageToCrop: {\r\n Id: `${key}-${asset.SubType}`,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n imageOption: constants.imageOptionKeys.Logo,\r\n aspectRatioOption: constants.logoSubtypes[asset.SubType],\r\n isMultimediaAdinMSANEnabled: true,\r\n maxCropBox: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n },\r\n });\r\n });\r\n}\r\n","import {\r\n getAutoCroppedImages,\r\n constants,\r\n} from '@bingads-webui-campaign-react/image-experience';\r\n\r\nimport { IMTAsset, IImageMapUrl } from './types';\r\n\r\nexport function getPortraitExperience(assets: IMTAsset[], imageToUrlMap: IImageMapUrl) {\r\n const portraitGroup = Object.keys(imageToUrlMap);\r\n\r\n // ImageToUrlMap contains distinct ids, while assets could contain multiple assets with same id\r\n return assets.filter(ass => portraitGroup.includes(ass.IdString)).map((asset) => {\r\n const key = asset.IdString;\r\n const assetExtraInfo = imageToUrlMap[key];\r\n\r\n return getAutoCroppedImages({\r\n originalImageToCrop: {\r\n Id: key,\r\n IdString: key,\r\n Src: imageToUrlMap[key].url,\r\n Width: imageToUrlMap[key].width,\r\n Height: imageToUrlMap[key].height,\r\n source: imageToUrlMap[key].sourceType,\r\n },\r\n imageOption: constants.imageOptionKeys.Portrait,\r\n aspectRatioOption: constants.portraitSubtypes[asset.SubType],\r\n isMultimediaAdinMSANEnabled: true,\r\n isPortraitImage: true,\r\n maxCropBox: {\r\n SourceX: asset.CropX ? asset.CropX : 0,\r\n SourceY: asset.CropY ? asset.CropY : 0,\r\n SourceWidth: asset.CropWidth ? asset.CropWidth : assetExtraInfo.width,\r\n SourceHeight: asset.CropHeight ? asset.CropHeight : assetExtraInfo.height,\r\n },\r\n });\r\n });\r\n}\r\n","export const MMAAssetConfigs = {\r\n MAX_HEADLINES: 15,\r\n DEFAULT_HEADLINES: 1,\r\n MIN_HEADLINES: 1,\r\n MAX_LONGHEADLINES: 5,\r\n DEFAULT_LONGHEADLINES: 1,\r\n MIN_LONGHEADLINES: 1,\r\n MAX_DESCRIPTIONS: 5,\r\n DEFAULT_DESCRIPTIONS: 1,\r\n MIN_DESCRIPTIONS: 1,\r\n MAX_HEADLINE_SUGGESTIONS: 15, // MAX_HEADLINES\r\n MAX_DESCRIPTION_SUGGESTIONS: 10, // MAX_DESCRIPTIONS + MAX_LONGHEADLINES\r\n MAX_BUSINESS_NAME: 25,\r\n};\r\n\r\n\r\nexport const ResponsiveAdConfigs = {\r\n MAX_HEADLINE_SUGGESTIONS: 15,\r\n MAX_DESCRIPTION_SUGGESTIONS: 10,\r\n};\r\n","import _ from 'underscore';\r\nimport { MMAAssetConfigs } from './config';\r\n\r\nexport const headlineFields = _.map(_.range(MMAAssetConfigs.MAX_HEADLINES), i => `Headline${i}`);\r\nexport const longHeadlineFields = _.map(_.range(MMAAssetConfigs.MAX_LONGHEADLINES), i => `LongHeadline${i}`);\r\nexport const descriptionFields = _.map(_.range(MMAAssetConfigs.MAX_DESCRIPTIONS), i => `Description${i}`);\r\n\r\nexport const ResponsiveAdScenarios = {\r\n MMASearch: 'MMASearch',\r\n MMAResponsive: 'MMAResponsive',\r\n NonMMAResponsive: 'NonMMAResponsive',\r\n};\r\n\r\nexport const AdEditFields = {\r\n Headline: 'Headline',\r\n LongHeadline: 'LongHeadline',\r\n Description: 'Description',\r\n Text: 'Text',\r\n BusinessName: 'BusinessName',\r\n};\r\n\r\nexport const assetSuggestionType = {\r\n // use for asset suggestions\r\n [AdEditFields.Headline]: 'headline',\r\n [AdEditFields.LongHeadline]: 'description',\r\n [AdEditFields.Description]: 'description',\r\n [AdEditFields.Text]: 'description',\r\n [AdEditFields.BusinessName]: 'business',\r\n};\r\n\r\nexport const singleAssetSuggestionType = {\r\n [AdEditFields.Headline]: 'shortHeadline',\r\n [AdEditFields.LongHeadline]: 'longHeadline',\r\n [AdEditFields.Text]: 'description',\r\n};\r\n","import { forEach, omit, isEmpty, get, reduce, map, filter, defaults } from 'underscore';\r\nimport { isEmptyUrl } from '@bingads-webui-campaign-react/url-input-fluent';\r\nimport { newVideoFromMTObject } from '@bingads-webui-campaign-react/image-experience-video-part';\r\nimport { headlineFields, longHeadlineFields, descriptionFields } from './constants';\r\n\r\n/**\r\n * The optional parameters that are set to empty will be set to 'delete_value' during update,\r\n * need to remove these params before feed to model on edit UI, otherwise the string 'delete_value'\r\n * will be shown on UI instead of empty value.\r\n *\r\n * @param {object} params The object returned from the update request.\r\n *\r\n * @returns {object} Updated object to be saved for edit on UI later.\r\n *\r\n */\r\nexport function omitDeletedParameters(params) {\r\n const optionalParameters = [\r\n 'MobileFinalUrls',\r\n 'FinalUrlSuffix',\r\n 'TrackingUrlTemplate',\r\n 'UrlCustomParameters',\r\n 'LandscapeLogoMediaId',\r\n 'SquareLogoMediaId',\r\n ];\r\n\r\n let formattedParams = params;\r\n\r\n forEach(optionalParameters, (p) => {\r\n if (formattedParams[p] === 'delete_value') {\r\n formattedParams = omit(formattedParams, p);\r\n }\r\n });\r\n\r\n return formattedParams;\r\n}\r\n\r\nexport function convertToLowerCaseKey(objs) {\r\n return objs.map((obj) => {\r\n const item = {};\r\n Object.keys(obj).forEach((key) => {\r\n item[key.charAt(0).toLowerCase() + key.substring(1)] = obj[key];\r\n });\r\n\r\n return item;\r\n });\r\n}\r\n\r\nexport function convertFromAdModel(ad, processImages = true) {\r\n if (!Array.isArray(ad.Headlines)) {\r\n return ad;\r\n }\r\n\r\n const headlines = reduce(get(ad, ['Headlines'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`Headline${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const longHeadlines = reduce(get(ad, ['LongHeadlines'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`LongHeadline${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const descriptions = reduce(get(ad, ['Descriptions'], []), (memo, val, idx) => {\r\n const results = { ...memo };\r\n results[`Description${idx}`] = isEmpty(val.Asset) ? val.Text : val.Asset.Text;\r\n return results;\r\n }, {});\r\n\r\n const CallToAction = ad && ad.CallToAction ? {\r\n CallToAction: {\r\n cta: ad.CallToAction,\r\n language: ad.CallToActionLanguage,\r\n },\r\n } : {};\r\n\r\n const adModel = {\r\n ...ad,\r\n Headlines: headlines,\r\n LongHeadlines: longHeadlines,\r\n Descriptions: descriptions,\r\n ...CallToAction,\r\n };\r\n\r\n if (ad && ad.Videos) {\r\n adModel.videos = map(ad.Videos, video => newVideoFromMTObject(video.Asset));\r\n }\r\n\r\n if (processImages) {\r\n adModel.Images = isEmpty(ad.ImageList) ? {\r\n ImageAssets: ad.Images,\r\n } : {\r\n ImageList: ad.ImageList,\r\n };\r\n }\r\n\r\n return adModel;\r\n}\r\n\r\nexport function convertFromBulkResponse(ad = {}) {\r\n const Headlines = JSON.parse(get(ad, ['Headlines'], '[]'));\r\n const LongHeadlines = JSON.parse(get(ad, ['LongHeadlines'], '[]'));\r\n const Descriptions = JSON.parse(get(ad, ['Descriptions'], '[]'));\r\n const Images = JSON.parse(get(ad, ['Images'], '[]'));\r\n\r\n return convertFromAdModel({\r\n ...ad,\r\n Headlines,\r\n LongHeadlines,\r\n Descriptions,\r\n Images,\r\n }, false);\r\n}\r\n\r\nconst mapAssets = (fields, viewModel) => JSON.stringify(map(filter(\r\n fields,\r\n field => !isEmpty(viewModel[field])\r\n), field => ({ Text: viewModel[field] })));\r\n\r\nexport function convertToAdModel(viewModel) {\r\n const data = {\r\n ...viewModel,\r\n Headlines: mapAssets(headlineFields, viewModel.Headlines),\r\n LongHeadlines: mapAssets(longHeadlineFields, viewModel.LongHeadlines),\r\n Descriptions: mapAssets(descriptionFields, viewModel.Descriptions),\r\n CallToAction: viewModel.CallToAction.cta,\r\n CallToActionLanguage: viewModel.CallToAction.language,\r\n UrlCustomParameters: filter(viewModel.UrlCustomParameters, param => !isEmpty(param.Key)),\r\n MobileFinalUrls: isEmptyUrl(viewModel.MobileFinalUrls) ? [] : viewModel.MobileFinalUrls,\r\n };\r\n\r\n return omit(data, isEmpty);\r\n}\r\n\r\nexport function convertToAdModelInResponse(ad = {}) {\r\n const Headlines = map(get(ad, ['Headlines'], {}), headline => ({ Asset: { Text: headline } }));\r\n const LongHeadlines = map(get(ad, ['LongHeadlines'], {}), longHeadline => ({ Asset: { Text: longHeadline } }));\r\n const Descriptions = map(get(ad, ['Descriptions'], {}), description => ({ Asset: { Text: description } }));\r\n const CallToAction = get(ad, ['CallToAction', 'cta']);\r\n const CallToActionLanguage = get(ad, ['CallToAction', 'language']);\r\n const Images = get(ad, ['Images', 'ImageAssets'], []);\r\n const ImageList = get(ad, ['Images', 'ImageList'], []);\r\n\r\n return {\r\n ...ad,\r\n Headlines,\r\n LongHeadlines,\r\n Descriptions,\r\n CallToAction,\r\n CallToActionLanguage,\r\n Images,\r\n ImageList,\r\n };\r\n}\r\n\r\nfunction deleteUndefinedParameters(params) {\r\n const optionalParameters = ['MobileFinalUrls', 'TrackingUrlTemplate', 'UrlCustomParameters', 'LandscapeLogoMediaId', 'SquareLogoMediaId', 'FinalUrlSuffix', 'Headline', 'LongHeadline', 'Text'];\r\n\r\n forEach(optionalParameters, (p) => {\r\n if (isEmpty(params[p]) || (params[p] instanceof Array && params[p].length === 0)) {\r\n // eslint-disable-next-line no-param-reassign\r\n params[p] = 'delete_value';\r\n }\r\n });\r\n\r\n return params;\r\n}\r\n\r\nexport function processViewModelDataForSaving(viewModel, campaignId, adGroupId, adId) {\r\n const adData = defaults(convertToAdModel(viewModel), {\r\n Campaign: {\r\n Id: Number(campaignId),\r\n },\r\n AdGroup: {\r\n Id: Number(adGroupId),\r\n },\r\n });\r\n\r\n if (adId) {\r\n adData.Id = adId;\r\n return deleteUndefinedParameters(adData);\r\n }\r\n\r\n return adData;\r\n}\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { constants, ImageExperienceImage } from '@bingads-webui-campaign-react/image-experience';\r\nimport { serializeImageAssetMetadata } from '@bingads-webui-campaign/media-metadata-model';\r\nimport { getMMAPayloadV2 } from './data-process';\r\nimport { findMetadata, insertMetadata, isMetadataExisting, collectExistingMetadata } from './image-metadata-util';\r\nimport { convertToLowerCaseKey } from './format-data-util';\r\n\r\nconst removeRatioTypeInId = (flattenImageList) => {\r\n flattenImageList.forEach((image) => {\r\n // eslint-disable-next-line no-param-reassign\r\n image.id = image.id.toString().indexOf('-') > -1 && image.isLogo ? image.id.match(/(\\S*)-/)[1] : image.id;\r\n });\r\n return flattenImageList;\r\n};\r\n\r\nconst getMMAImageList = imageList =>\r\n _.map(\r\n imageList,\r\n imageArray => _.filter(\r\n imageArray,\r\n imageObj => imageObj.type in constants.getMmaAspectRatios() && imageObj.isIncluded // eslint-disable-line max-len\r\n )\r\n );\r\n\r\nexport const getFlattenedImageAssetList = (imageList, isMultimediaAdinMSANEnabled, isMultimediaAd) => {\r\n let filteredImageList = imageList;\r\n\r\n if (isMultimediaAdinMSANEnabled) {\r\n filteredImageList = _.map(\r\n imageList,\r\n imageArray => _.filter(imageArray, imageObj => imageObj.isIncluded)\r\n );\r\n } else if (isMultimediaAd) {\r\n filteredImageList = getMMAImageList(imageList);\r\n }\r\n const flattenImageList = _.flatten(filteredImageList, 1);\r\n return removeRatioTypeInId(flattenImageList);\r\n};\r\n\r\n// flattenedImageAssetList and flattenedImageAssetsPayload are mutually exclusive\r\n// only one will be used at one time\r\nexport const getImagesDataModel = ({\r\n flattenedImageAssetList, updates, flattenedImageAssetsPayload, isMultimediaAd, UiUnsupportedRatios,\r\n}) => {\r\n const imagesModel = flattenedImageAssetsPayload || _.map(\r\n flattenedImageAssetList,\r\n (imageObj, index) => {\r\n const overrideInfo = updates && updates[index];\r\n const model = imageObj.formatToSave(isMultimediaAd, false, overrideInfo);\r\n\r\n return model;\r\n }\r\n );\r\n\r\n const UIUnSupportedImagesModel = convertToLowerCaseKey(UiUnsupportedRatios\r\n .map(association =>\r\n _.pick(association.Asset, ['Id', 'CropWidth', 'CropHeight', 'CropX', 'CropY', 'IdString', 'SubType'])));\r\n\r\n return {\r\n Images: JSON.stringify([...imagesModel, ...UIUnSupportedImagesModel]),\r\n };\r\n};\r\n\r\nexport const setMTImageModel = (\r\n originalData,\r\n updates = {},\r\n imageList,\r\n options = {}, // isMultimediaAdinMSANEnabled, isMultimediaAd, isMMAV2Enabled\r\n UiUnsupportedRatios,\r\n portraitImage = {}\r\n) => {\r\n const flattenedImageList = getFlattenedImageAssetList(imageList, options.isMultimediaAdinMSANEnabled, options.isMultimediaAd);\r\n if (options.isMultimediaAdinMSANEnabled) {\r\n let payload = getMMAPayloadV2(\r\n flattenedImageList.filter(item => !item.isLogo),\r\n updates,\r\n options.isMMAV2Enabled,\r\n options.isBoost200x100ImageEnabled,\r\n options.isBoostNewAspectRatioSupportEnabled,\r\n options.isImageFittingEnabled\r\n );\r\n\r\n payload = payload.concat(flattenedImageList\r\n .filter(item => item.isLogo)\r\n .map(item => item.formatToSave()));\r\n\r\n if (options.isBoostPortraitImageEnabled && portraitImage instanceof ImageExperienceImage) {\r\n const portraitImagePayload = portraitImage.formatToSave();\r\n payload.push(portraitImagePayload);\r\n }\r\n\r\n _.extend(originalData, getImagesDataModel({\r\n flattenedImageAssetsPayload: payload,\r\n isMultimediaAd: options.isMultimediaAd,\r\n UiUnsupportedRatios,\r\n }));\r\n } else {\r\n _.extend(originalData, getImagesDataModel({\r\n flattenedImageAssetList: flattenedImageList,\r\n updates,\r\n isMultimediaAd: options.isMultimediaAd,\r\n UiUnsupportedRatios,\r\n }));\r\n }\r\n};\r\n\r\n// If applying effect to an image, need to upload to get a new image Id\r\nexport const updateAssetsIdsAsync = (flattenedImageAssetList, imageIndexAsThumbnail, isAdCreatorEnabled, imageOData) => {\r\n const updates = {};\r\n\r\n if (isAdCreatorEnabled) {\r\n const assetPositionsToUpdate = [];\r\n const newAssets = [];\r\n\r\n // use this mapping to update id. collect metadata-id mapping from existing assets\r\n const existingMetadataIdMapping = collectExistingMetadata(flattenedImageAssetList);\r\n\r\n _.each(flattenedImageAssetList, (asset, index) => {\r\n const metadata = serializeImageAssetMetadata({ effectSettings: asset.EffectSettings });\r\n\r\n // check if any assets have updates in metadata, if so, need to update id\r\n if (asset.isEffectEdited()) {\r\n assetPositionsToUpdate.push({ position: index, baseId: asset.BaseId, metadata });\r\n\r\n if (!isMetadataExisting(existingMetadataIdMapping, asset.BaseId, metadata)) {\r\n newAssets.push({\r\n url: asset.FinalSrc,\r\n baseId: asset.BaseId,\r\n metadata,\r\n });\r\n }\r\n }\r\n });\r\n\r\n if (!_.isEmpty(assetPositionsToUpdate)) {\r\n const saveNewImagesPromise = _.isEmpty(newAssets)\r\n ? Promise.resolve([]) : imageOData.bulkSaveImagesByUrl(newAssets);\r\n\r\n return saveNewImagesPromise\r\n .then((ids) => {\r\n const hasError = _.some(ids, id => id && id.code);\r\n\r\n if (hasError) {\r\n const error = {\r\n errors: _.compact(_.map(ids, id => id.code && {\r\n Error: id.code,\r\n })),\r\n };\r\n\r\n // reject to reuse common catch logic\r\n return Promise.reject(error);\r\n }\r\n\r\n _.each(ids, (id, index) => {\r\n const { baseId, metadata } = newAssets[index];\r\n insertMetadata(existingMetadataIdMapping, baseId, metadata, {\r\n id,\r\n bingSrc: undefined, // for new assets, we don't have bing url yet\r\n });\r\n });\r\n\r\n _.each(assetPositionsToUpdate, ({ position, baseId, metadata }) => {\r\n const foundInfo = findMetadata(existingMetadataIdMapping, baseId, metadata);\r\n\r\n updates[position] = {\r\n id: foundInfo.id,\r\n bingSrc: foundInfo.bingSrc,\r\n };\r\n });\r\n\r\n // if asset used for thumbnail is updated without latest bing src, send call\r\n if (updates[imageIndexAsThumbnail] && !updates[imageIndexAsThumbnail].bingSrc) {\r\n const thumbnailAsset = updates[imageIndexAsThumbnail];\r\n\r\n return imageOData.getImageByIdAsync(thumbnailAsset.id)\r\n .then((value) => {\r\n thumbnailAsset.bingSrc = value.Url;\r\n\r\n return updates;\r\n });\r\n }\r\n\r\n return updates;\r\n });\r\n }\r\n }\r\n\r\n return Promise.resolve(updates);\r\n};\r\n\r\nexport const processImageListViewModelToModel = (imageList, imageOData, isMultimediaAd = true, isMultimediaAdinMSANEnabled = false, isMMAV2Enabled = false, UiUnsupportedRatios = []) => {\r\n const flattenedIncludedImageAssetList = getFlattenedImageAssetList(imageList, isMultimediaAdinMSANEnabled, isMultimediaAd);\r\n const imageIndexAsThumbnail = 0;\r\n const originalData = {};\r\n\r\n return updateAssetsIdsAsync(flattenedIncludedImageAssetList, imageIndexAsThumbnail, true /* isAdCreatorEnabled */, imageOData)\r\n .then((updates) => {\r\n const originalThumbnailAsset = flattenedIncludedImageAssetList[imageIndexAsThumbnail];\r\n const overrideInfo = updates[imageIndexAsThumbnail];\r\n let imageToGenerateThumbnail;\r\n\r\n if (overrideInfo) {\r\n imageToGenerateThumbnail = originalThumbnailAsset.copyThumbnailLookToNewImage({\r\n id: overrideInfo.id,\r\n src: overrideInfo.bingSrc,\r\n });\r\n } else {\r\n imageToGenerateThumbnail = originalThumbnailAsset;\r\n }\r\n\r\n setMTImageModel(\r\n originalData,\r\n updates,\r\n imageList,\r\n {\r\n isMultimediaAdinMSANEnabled,\r\n isMultimediaAd,\r\n isMMAV2Enabled,\r\n isBoostPortraitImageEnabled: false,\r\n isBoost200x100ImageEnabled: false,\r\n isBoostNewAspectRatioSupportEnabled: false,\r\n },\r\n UiUnsupportedRatios\r\n );\r\n\r\n return {\r\n mtModel: originalData,\r\n imageToGenerateThumbnail,\r\n };\r\n });\r\n};\r\n","import React from 'react';\r\nimport { useId, useConst } from '@fluentui/react-hooks';\r\nimport { TooltipHost } from '@fluentui/react/lib/Tooltip';\r\nimport PropTypes from 'prop-types';\r\n\r\n\r\nexport const EditableImageButton = (props) => {\r\n const {\r\n imageItem, i18n, baseImageId, onEdit,\r\n } = props;\r\n const tooltipId = useId('disableEditImageToolTip');\r\n const buttonId = useId('targetButton');\r\n const calloutProps = useConst({\r\n gapSpace: 0,\r\n target: `#${buttonId}`,\r\n });\r\n\r\n return (\r\n <React.Fragment>\r\n {\r\n !imageItem.disableEdit && <button\r\n aria-label={i18n.getString(_TL_('Edit Image'))}\r\n className=\"glyphicon glyphicon-pencil image-edit\"\r\n onClick={onEdit}\r\n data-imageid={baseImageId}\r\n />\r\n }\r\n {\r\n imageItem.disableEdit &&\r\n <TooltipHost\r\n content={i18n.getString(_TL_('We don’t allow you to edit system-generated images.'))}\r\n id={tooltipId}\r\n calloutProps={calloutProps}\r\n >\r\n <button\r\n id={buttonId}\r\n aria-label={i18n.getString(_TL_('Edit Image'))}\r\n aria-describedby={tooltipId}\r\n className=\"glyphicon glyphicon-pencil image-edit is-recommended-image\"\r\n />\r\n </TooltipHost>\r\n }\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nEditableImageButton.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onEdit: PropTypes.func.isRequired,\r\n baseImageId: PropTypes.string.isRequired,\r\n imageItem: PropTypes.shape({\r\n disableEdit: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n};\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport {\r\n MenuGroup,\r\n Menu,\r\n MenuTrigger,\r\n MenuList,\r\n MenuItem,\r\n MenuPopover,\r\n MenuGroupHeader,\r\n FluentProvider,\r\n webLightTheme,\r\n makeStyles,\r\n} from '@fluentui/react-components';\r\nimport CopilotIcon from './media/sparkle.svg';\r\nimport CopilotIconSelected from './media/sparkle-selected.svg';\r\nimport TryBackgroundIcon from './media/try-background.svg';\r\n\r\nconst padding = '6px';\r\nconst useInlineCopilotUIStyles = makeStyles({\r\n image: {\r\n paddingRight: '4px',\r\n },\r\n popover: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n groupHeader: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n menuItem: {\r\n paddingTop: padding,\r\n paddingBottom: padding,\r\n paddingLeft: padding,\r\n paddingRight: padding,\r\n },\r\n});\r\n\r\nexport const SparkleMenuButton = (props) => {\r\n const {\r\n imageItem, i18n, baseImageId, onChangeBackgroundScene, onMeuOpenChange,\r\n } = props;\r\n const classes = useInlineCopilotUIStyles();\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <Menu className=\"sparkle-menu\" closeOnScroll onOpenChange={onMeuOpenChange}>\r\n <MenuTrigger>\r\n {triggerprops => (\r\n <button {...triggerprops} className=\"copilot-button\">\r\n <img src={CopilotIconSelected} className=\"active\" alt={i18n.getString(_TL_('Ads Copilot'))} />\r\n <img src={CopilotIcon} className=\"passive\" alt={i18n.getString(_TL_('Ads Copilot'))} />\r\n </button>\r\n )}\r\n </MenuTrigger>\r\n <MenuPopover className={classnames('copilot-menu-popover', classes.popover)}>\r\n <MenuList>\r\n <MenuGroup>\r\n <MenuGroupHeader className={classes.groupHeader}>{i18n.getString(_TL_('Copilot can assist you'))}</MenuGroupHeader>\r\n <MenuItem onClick={onChangeBackgroundScene} className={classnames('copilot-different-background-item', classes.menuItem)} data-imageid={baseImageId} disabled={!!imageItem.disableEdit}>\r\n <img src={TryBackgroundIcon} alt={i18n.getString(_TL_('Change to a new background'))} className={classes.image} />\r\n <span>{i18n.getString(_TL_('Change to a new background'))}</span>\r\n </MenuItem>\r\n </MenuGroup>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nSparkleMenuButton.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n onChangeBackgroundScene: PropTypes.func.isRequired,\r\n baseImageId: PropTypes.string.isRequired,\r\n imageItem: PropTypes.shape({\r\n disableEdit: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n onMeuOpenChange: PropTypes.func.isRequired,\r\n};\r\n\r\n","/* eslint-disable react-hooks/rules-of-hooks */\r\nimport React, { useState, useCallback } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport { ChoiceGroup } from '@bingads-webui-react/fabric-control';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { ImageExperienceImage, constants as C } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { EditableImageButton } from './editable-image-button';\r\nimport { SparkleMenuButton } from './sparkle-menu-button';\r\n\r\nconst logSignal = (props, message) => {\r\n if (props.logger) {\r\n props.logger.signal(`${message}: isLogo:${props.isLogo} isPortrait:${props.isPortrait}`, 'ResponsiveImageListView');\r\n }\r\n};\r\n\r\nexport const handleMouseEnter = (props) => {\r\n logSignal(props, 'mouse enter image-list-item');\r\n setClarityTag({ HoverResponsiveImageListView: 'Hover' });\r\n if (props.showCopilotOption) {\r\n logSignal(props, 'mouse enter image-list-item: show copilot option');\r\n setClarityTag({ HoverResponsiveImageListView: 'HoverCopilotMenu' });\r\n }\r\n};\r\n\r\nexport const handleMouseLeave = (props) => {\r\n logSignal(props, 'mouse leave image-list-item');\r\n if (props.showCopilotOption) {\r\n logSignal(props, 'mouse leave image-list-item: show copilot option');\r\n }\r\n};\r\n\r\nexport class ResponsiveImageListView extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n // Only for test purpose\r\n if (this.props.testRef) {\r\n this.props.testRef.current = {\r\n that: this,\r\n };\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n logSignal(this.props, 'mount');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'mount: show copilot option');\r\n }\r\n }\r\n\r\n onSelect = (_event, option) => {\r\n if (!option.isAddButton) {\r\n this.props.onSelectImage(option.key, option.isLogo);\r\n }\r\n };\r\n\r\n onRemove = (event) => {\r\n logSignal(this.props, 'remove');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'remove: show copilot option');\r\n }\r\n this.props.onRemoveImage(event.currentTarget.dataset.imageid, this.props.isLogo, this.props.isPortrait);\r\n };\r\n\r\n onEdit = (event) => {\r\n logSignal(this.props, 'edit');\r\n if (this.props.showCopilotOption) {\r\n logSignal(this.props, 'edit: show copilot option');\r\n }\r\n this.props.onEditImage(event.currentTarget.dataset.imageid, this.props.isLogo, this.props.isPortrait);\r\n };\r\n\r\n onChangeBackgroundScene = (event) => {\r\n logSignal(this.props, 'change background');\r\n this.props.onChangeBackgroundScene(event.currentTarget.dataset.imageid);\r\n };\r\n\r\n getKeyForImageItem(placements) {\r\n const [firstPlacement] = placements;\r\n const baseImageId = firstPlacement.BaseId;\r\n return baseImageId;\r\n }\r\n\r\n getChoiceGroupOption() {\r\n return _.map(this.props.imageList, (placements, index) => {\r\n const imageItem = _.first(placements);\r\n const baseImageId = this.getKeyForImageItem(placements);\r\n\r\n if (imageItem) {\r\n const contentWidth = 112; // choice box width\r\n const contentHeight = 99;\r\n // ad creator restyles buttons, adjust height accordingly\r\n let desiredImageWidth = contentWidth;\r\n let desiredImageHeight = contentHeight;\r\n\r\n const styles = {};\r\n\r\n let imageSrc = imageItem.Src;\r\n // distinguish the thumbnail of logo\r\n const isLandscapeLogoMedia = imageItem.isLogo && imageItem.id.indexOf('LandscapeLogoMedia') > -1;\r\n\r\n // if there is image crop, re-locate the image based on the crop box\r\n const ratio = contentHeight / imageItem.Height > contentWidth / imageItem.Width ?\r\n contentHeight / imageItem.Height : contentWidth / imageItem.Width;\r\n\r\n desiredImageHeight = imageItem.Height * ratio;\r\n desiredImageWidth = imageItem.Width * ratio;\r\n\r\n let midPointOffsetX = desiredImageWidth > contentWidth ?\r\n Math.ceil(-(desiredImageWidth - contentWidth) / 2) : 0;\r\n let midPointOffsetY = desiredImageHeight > contentHeight ?\r\n Math.ceil(-(desiredImageHeight - contentHeight) / 2) : 0;\r\n\r\n _.extend(styles, {\r\n field: {\r\n alignItems: 'center',\r\n justifyContent: 'start',\r\n overflow: 'hidden',\r\n },\r\n selectedImageWrapper: {\r\n marginLeft: midPointOffsetX,\r\n marginTop: midPointOffsetY,\r\n },\r\n imageWrapper: {\r\n marginLeft: midPointOffsetX,\r\n marginTop: midPointOffsetY,\r\n },\r\n });\r\n\r\n /* istanbul ignore if */\r\n if (isLandscapeLogoMedia) {\r\n let landscapeLogoRatio = C.getMmaAspectRatios('Logo');\r\n // get the ratio :4\r\n landscapeLogoRatio = landscapeLogoRatio.Image4x1.aspectRatio;\r\n const landscapeLogoMarginTop = (contentHeight - (contentHeight / landscapeLogoRatio)) / 2;\r\n const landscapeLogoShowHeight = contentHeight / landscapeLogoRatio;\r\n const landscapeLogoTop = ((desiredImageHeight - contentHeight) / 2) + landscapeLogoMarginTop;\r\n\r\n _.extend(styles, {\r\n innerField: {\r\n height: `${landscapeLogoShowHeight}px !important`,\r\n overflow: 'hidden',\r\n marginTop: landscapeLogoMarginTop,\r\n },\r\n selectedImageWrapper: {\r\n position: 'absolute',\r\n top: -landscapeLogoTop,\r\n },\r\n imageWrapper: {\r\n position: 'absolute',\r\n top: -landscapeLogoTop,\r\n },\r\n });\r\n }\r\n\r\n const imageCropSettings = imageItem.BaseImage && imageItem.BaseImage.CropSettings;\r\n imageSrc = imageItem.BaseImage.FinalSrc;\r\n\r\n if (imageCropSettings\r\n && imageCropSettings.SourceWidth > 0\r\n && imageCropSettings.SourceHeight > 0) {\r\n let desiredCropWidth = contentWidth;\r\n let desiredCropHeight = contentHeight;\r\n\r\n const cropImageWidth = imageCropSettings.SourceWidth;\r\n const cropImageHeight = imageCropSettings.SourceHeight;\r\n\r\n const cropRatio = contentHeight / cropImageHeight > contentWidth / cropImageWidth ?\r\n contentHeight / cropImageHeight : contentWidth / cropImageWidth;\r\n\r\n desiredCropHeight = cropImageHeight * cropRatio;\r\n desiredCropWidth = cropImageWidth * cropRatio;\r\n\r\n const xscale = desiredCropWidth / imageCropSettings.SourceWidth;\r\n const yscale = desiredCropHeight / imageCropSettings.SourceHeight;\r\n\r\n // use original image width/height and use css to re-position to show cropped area\r\n desiredImageWidth = imageItem.Width * xscale;\r\n desiredImageHeight = imageItem.Height * yscale;\r\n\r\n midPointOffsetX = desiredCropWidth > contentWidth ?\r\n Math.ceil(-(desiredCropWidth - contentWidth) / 2) : 0;\r\n midPointOffsetY = desiredCropHeight > contentHeight ?\r\n Math.ceil(-(desiredCropHeight - contentHeight) / 2) : 0;\r\n\r\n _.extend(styles, {\r\n selectedImageWrapper: {\r\n marginLeft: (-imageCropSettings.SourceX * xscale) + midPointOffsetX,\r\n marginTop: (-imageCropSettings.SourceY * yscale) + midPointOffsetY,\r\n },\r\n imageWrapper: {\r\n marginLeft: (-imageCropSettings.SourceX * xscale) + midPointOffsetX,\r\n marginTop: (-imageCropSettings.SourceY * yscale) + midPointOffsetY,\r\n },\r\n });\r\n }\r\n\r\n const {\r\n i18n,\r\n isLogo,\r\n showCopilotOption,\r\n enableEdit,\r\n } = this.props;\r\n\r\n return {\r\n key: baseImageId,\r\n imageSrc,\r\n selectedImageSrc: imageSrc,\r\n imageSize: {\r\n /* istanbul ignore next */\r\n width: desiredImageWidth, height: desiredImageHeight,\r\n },\r\n text: '',\r\n isLogo,\r\n styles,\r\n ariaLabel: `${i18n.getString(_TL_('Image'))} ${index + 1}`,\r\n onRenderLabel: () => null,\r\n onRenderField: (props, render) => {\r\n const [open, setOpen] = useState(false);\r\n const onMeuOpenChange = useCallback((e, data) => {\r\n logSignal(this.props, `open copilot menu: ${data.open}`);\r\n if (data.open) {\r\n setClarityTag({ HoverResponsiveImageListView: 'OpenCopilotMenu' });\r\n }\r\n setOpen(data.open);\r\n }, []);\r\n\r\n\r\n return (\r\n <div\r\n className=\"image-list-item\"\r\n onMouseEnter={() => handleMouseEnter(this.props)}\r\n onMouseLeave={() => handleMouseLeave(this.props)}\r\n key={imageItem.Type}\r\n style={{ overflow: 'hidden' }}\r\n data-imageid={baseImageId}\r\n >\r\n <div className={`image-list-item-image ${showCopilotOption ? 'with-copilot-option' : ''}`}>\r\n { render(props) }\r\n <div className={`image-list-item-action-bar ${open ? 'open' : ''}`}>\r\n {showCopilotOption &&\r\n <SparkleMenuButton\r\n baseImageId={baseImageId}\r\n onChangeBackgroundScene={this.onChangeBackgroundScene}\r\n imageItem={imageItem}\r\n i18n={i18n}\r\n onMeuOpenChange={onMeuOpenChange}\r\n />\r\n }\r\n {enableEdit &&\r\n <EditableImageButton\r\n baseImageId={baseImageId}\r\n onEdit={this.onEdit}\r\n imageItem={imageItem}\r\n i18n={i18n}\r\n />}\r\n {showCopilotOption && <div className=\"action-divider\" />}\r\n <button\r\n aria-label={i18n.getString(_TL_('Remove this image'))}\r\n className=\"image-delete glyphicon glyphicon-remove\"\r\n onClick={this.onRemove}\r\n data-imageid={baseImageId}\r\n />\r\n {\r\n imageItem.isRecommendedImage && <span\r\n aria-label={i18n.getString(_TL_('AI generated asset'))}\r\n className=\"iconba iconba-Lightbulb\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n });\r\n }\r\n\r\n addButtonChoiceOption = ({\r\n key: 'choice-group-add-img',\r\n isAddButton: true,\r\n text: '',\r\n styles: {\r\n field: {\r\n alignItems: 'center',\r\n justifyContent: 'start',\r\n overflow: 'hidden',\r\n '&:before, &:after': {\r\n visibility: 'hidden',\r\n },\r\n },\r\n },\r\n ariaLabel: 'choice-group-add-img',\r\n onRenderLabel: () => null,\r\n onRenderField: (props, render) => (\r\n <button\r\n className=\"image-list-item image-list-add-placeholder\"\r\n style={{ overflow: 'hidden' }}\r\n onClick={this.props.onAddImage}\r\n aria-label={this.props.i18n.getString(_TL_('Add an image'))}\r\n >\r\n <div className=\"image-list-item-image\">\r\n { render(props) }\r\n <div\r\n className=\"glyphicon glyphicon-plus image-add\"\r\n />\r\n </div>\r\n </button>\r\n ),\r\n });\r\n\r\n render() {\r\n const { portalContainer, blocking } = this.props;\r\n\r\n const choiceGroupOptions = this.getChoiceGroupOption();\r\n if (this.props.isRenderAddInImageList) {\r\n choiceGroupOptions.push(this.addButtonChoiceOption);\r\n }\r\n\r\n const renderContent = (\r\n <UiBlocker\r\n blocking={blocking}\r\n loadingText={this.props.i18n.getString(_TL_('Loading...'))}\r\n >\r\n <div className=\"image-list-view-content\">\r\n <div className=\"image-list\">\r\n <div className=\"image-list-content\">\r\n <ChoiceGroup\r\n className={classnames('image-list-choice-group', 'image-list-choice-group-ad-creator')}\r\n label={this.props.i18n.getString(_TL_('Images'))}\r\n defaultSelectedKey={_.isEmpty(this.props.imageList) ? null : this.getKeyForImageItem(this.props.imageList[0])}\r\n selectedKey={this.props.currentSelectedImageId}\r\n options={choiceGroupOptions}\r\n onChange={this.onSelect}\r\n style={{ height: 'fit-content' }}\r\n />\r\n <button\r\n className=\"remove-all-button\"\r\n onClick={this.props.onRemoveAllImages}\r\n aria-label={this.props.i18n.getString(_TL_('Remove all images'))}\r\n />\r\n </div>\r\n </div>\r\n {this.props.error ? (\r\n <div className=\"error\" role=\"alert\">\r\n {this.props.error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </UiBlocker>\r\n );\r\n\r\n return portalContainer ? ReactDOM.createPortal(renderContent, portalContainer) : renderContent;\r\n }\r\n}\r\n\r\nResponsiveImageListView.propTypes = {\r\n imageList: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.instanceOf(ImageExperienceImage)))\r\n .isRequired,\r\n onRemoveAllImages: PropTypes.func.isRequired,\r\n onRemoveImage: PropTypes.func.isRequired,\r\n onEditImage: PropTypes.func,\r\n onChangeBackgroundScene: PropTypes.func,\r\n onSelectImage: PropTypes.func.isRequired,\r\n isRenderAddInImageList: PropTypes.bool,\r\n onAddImage: PropTypes.func,\r\n currentSelectedImageId: PropTypes.any,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n parseDecimal: PropTypes.func.isRequired,\r\n }).isRequired,\r\n isLogo: PropTypes.bool,\r\n portalContainer: PropTypes.instanceOf(Element),\r\n showCopilotOption: PropTypes.bool,\r\n enableEdit: PropTypes.bool,\r\n blocking: PropTypes.bool,\r\n error: PropTypes.string,\r\n isPortrait: PropTypes.bool,\r\n logger: PropTypes.shape({\r\n signal: PropTypes.func.isRequired,\r\n }),\r\n};\r\n\r\nResponsiveImageListView.defaultProps = {\r\n isRenderAddInImageList: false,\r\n onAddImage: null,\r\n currentSelectedImageId: null,\r\n onEditImage: _.noop,\r\n onChangeBackgroundScene: _.noop,\r\n isLogo: false,\r\n portalContainer: null,\r\n showCopilotOption: false,\r\n enableEdit: true,\r\n blocking: false,\r\n error: undefined,\r\n isPortrait: false,\r\n logger: undefined,\r\n};\r\n","export const strengthStrings = {\r\n Poor: _TL_('Poor'),\r\n Average: _TL_('Average'),\r\n Good: _TL_('Good'),\r\n Excellent: _TL_('Excellent'),\r\n};\r\n\r\nexport const actionItemStrings = {\r\n AddMoreHeadlines: _TL_('Add more headlines'),\r\n AddMoreDescriptions: _TL_('Add more descriptions'),\r\n MoreCombinations: _TL_('Add more combinations'),\r\n LongerHeadlines: _TL_('Add longer headlines'),\r\n LongerDescriptions: _TL_('Add longer descriptions'),\r\n DistinctHeadlines: _TL_('Make your headlines more unique'),\r\n DistinctDescriptions: _TL_('Make your descriptions more unique'),\r\n UnpinHeadlinePositions: _TL_('Unpin headline positions'),\r\n UnpinDescriptionPositions: _TL_('Unpin description positions'),\r\n};\r\n\r\nexport const adStrengthSuggestionTipsStrings = {\r\n Ad_Strength_Suggestion_Tips_Category_Product_Title: _TL_('Products or service'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Subtitle: _TL_('What does your business offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item1: _TL_('Reliable AC Systems'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item2: _TL_('Top-Rated Moving Service'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item3: _TL_('Secure Self Storage'),\r\n Ad_Strength_Suggestion_Tips_Category_Product_Item4: _TL_('Workout Clothes & Activewear'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Title: _TL_('Benefits'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Subtitle: _TL_('How do your products or services help people?'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item1: _TL_('No Cooking Required'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item2: _TL_('Three Convenient Locations'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item3: _TL_('In-Home Tutoring'),\r\n Ad_Strength_Suggestion_Tips_Category_Benefits_Item4: _TL_('Quick Delivery'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Title: _TL_('Brand'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Subtitle: _TL_('What phrases use your brand?'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item1: _TL_('[Brand Name]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item2: _TL_('[Brand.com]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item3: _TL_('Best Prices from [Brand]'),\r\n Ad_Strength_Suggestion_Tips_Category_Brand_Item4: _TL_('Official [Brand] site'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Title: _TL_('Call to action'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Subtitle: _TL_('What do you want your customers to do?'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item1: _TL_('Book Your Next Adventure'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item2: _TL_('Schedule a Test Drive'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item3: _TL_('Call for an Appointment'),\r\n Ad_Strength_Suggestion_Tips_Category_Action_Item4: _TL_('Get a Free Personalized Quote'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Title: _TL_('Inventory and selection'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Subtitle: _TL_('What categories, options, and selections do you offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item1: _TL_('The Latest Summer Styles'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item2: _TL_('Puppy Toys'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item3: _TL_('50 Styles in 50 Colors'),\r\n Ad_Strength_Suggestion_Tips_Category_Inventory_Item4: _TL_('Thousands of Instruments to Choose From'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Title: _TL_('Pricing and fees'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Subtitle: _TL_('What are your prices, taxes, shipping, returns, and fees?'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item1: _TL_('$10/Month Self-Storage'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item2: _TL_('Free Delivery Over $49'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item3: _TL_('No Risk 90-Day Returns'),\r\n Ad_Strength_Suggestion_Tips_Category_Pricing_Item4: _TL_('Prices as low as $29.99'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Title: _TL_('Promotion and discount'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Subtitle: _TL_('What type of deals do you offer?'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item1: _TL_('Save Up to 30% Off All Orders'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item2: _TL_('Weekend Deals Available Now'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item3: _TL_('Get A $100 Sign-up Bonus'),\r\n Ad_Strength_Suggestion_Tips_Category_Promotion_Item4: _TL_('Buy One, Get One Free'),\r\n};\r\n\r\nexport const adStrengthSuggestionPerspectiveStrings = {\r\n Ad_Strength_Suggestion_Perspective_Headline_Title: _TL_('Recommending optimal headlines combinations'),\r\n Ad_Strength_Suggestion_Perspective_Headline_Pitching_Point: _TL_('Microsoft Advertising recommends the most optimal headline combinations to highlight your business and create effective ads for potential customers.'),\r\n Ad_Strength_Suggestion_Perspective_Description_Title: _TL_('Recommending optimal descriptions combinations'),\r\n Ad_Strength_Suggestion_Perspective_Description_Pitching_Point: _TL_('Microsoft Advertising recommends the most optimal description combinations to highlight your business and create effective ads for potential customers.'),\r\n};\r\n\r\nexport const defaultPromotionSuggestions = [\r\n { AssetType: 'Headline', Asset: 'Get More for Less' },\r\n { AssetType: 'Headline', Asset: 'Try Something New' },\r\n { AssetType: 'Headline', Asset: 'Fast Shipping Available' },\r\n { AssetType: 'Headline', Asset: 'Limited Time Offer' },\r\n { AssetType: 'Headline', Asset: 'Free Shipping Today' },\r\n { AssetType: 'Description', Asset: 'Discover the best deals on our website! Find what you need at unbeatable prices.' },\r\n { AssetType: 'Description', Asset: 'Discover endless possibilities with our website!' },\r\n];\r\n","import _ from 'underscore';\r\nimport { actionItemStrings } from './strings';\r\n\r\nconst SuggestionState = {\r\n Met: 'met',\r\n HalfMet: 'half-met',\r\n NotMet: 'not-met',\r\n};\r\n\r\nconst StrengthScore = {\r\n Poor: 25,\r\n Average: 50,\r\n Good: 75,\r\n Excellent: 100,\r\n};\r\n\r\nconst NewStrengthScore = {\r\n Incomplete: 7,\r\n Poor: 14,\r\n Average: 49,\r\n Good: 83,\r\n Excellent: 98,\r\n};\r\n\r\nconst StrengthColor = {\r\n Poor: '#BC0505',\r\n Average: '#F2610C',\r\n Good: '#107C10',\r\n Excellent: '#107C10',\r\n};\r\n\r\nconst StrengthIcon = {\r\n Poor: 'Error',\r\n Average: 'Warning',\r\n Good: 'Completed',\r\n Excellent: 'Completed',\r\n};\r\n\r\nexport const maxHeadlineCount = 15;\r\n\r\nexport const maxDescriptionCount = 4;\r\n\r\nexport const ViewSuggestionType = {\r\n None: 'none',\r\n Headline: 'headline',\r\n Description: 'description',\r\n};\r\n\r\nexport const assetStrMap = {\r\n Headlines: 'headline',\r\n Descriptions: 'description',\r\n};\r\n\r\nexport const assetTypeMap = {\r\n headline: 'Headlines',\r\n description: 'Descriptions',\r\n};\r\n\r\nexport function getStrengthScore(strength) {\r\n return StrengthScore[strength] || 0;\r\n}\r\n\r\nexport function getNewStrengthScore(strength) {\r\n return NewStrengthScore[strength] || 0;\r\n}\r\n\r\nexport function getStrengthColor(strength) {\r\n return StrengthColor[strength] || '#BC0505';\r\n}\r\n\r\nexport function getStrengthIcon(strength) {\r\n return StrengthIcon[strength] || 'Error';\r\n}\r\n\r\nexport function newGenerateSuggestion({\r\n i18n,\r\n actionItem,\r\n xValue,\r\n priority,\r\n}) {\r\n let suggestion;\r\n switch (actionItem) {\r\n case 'AddMoreHeadlines': {\r\n suggestion = i18n.getString(_TL_('Add {{x}} more headlines.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddMoreDescriptions': {\r\n suggestion = i18n.getString(_TL_('Add {{x}} more descriptions.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddLongerHeadlines': {\r\n suggestion = i18n.getString(_TL_('Create longer headlines. Your current average number of characters is {{x}}.'), { x: xValue });\r\n break;\r\n }\r\n case 'AddLongerDescriptions': {\r\n suggestion = i18n.getString(_TL_('Create longer Descriptions. Your current average number of characters is {{x}}.'), { x: xValue });\r\n break;\r\n }\r\n case 'UnpinHeadlines': {\r\n suggestion = i18n.getString(_TL_('Unpin headline for more combination.'));\r\n break;\r\n }\r\n case 'UnpinDescriptions': {\r\n suggestion = i18n.getString(_TL_('Unpin description for more combination.'));\r\n break;\r\n }\r\n case 'IncludeKeywordsOrKeywordInsertionHeadlines': {\r\n const keywordList = xValue.split('#');\r\n if (keywordList.length === 0) {\r\n suggestion = i18n.getString(_TL_('Include popular keywords in headlines.'));\r\n } else if (keywordList.length===1) {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in headlines such as \"{{x}}\".'), { x: keywordList[0] });\r\n } else {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in headlines such as \"{{x}}\" or \"{{y}}\".'), { x: keywordList[0], y: keywordList[1] });\r\n }\r\n break;\r\n }\r\n case 'IncludeKeywordsOrKeywordInsertionDescriptions': {\r\n const keywordList = xValue.split('#');\r\n if (keywordList.length === 0) {\r\n suggestion = i18n.getString(_TL_('Include popular keywords in descriptions.'));\r\n } else if (keywordList.length===1) {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in descriptions such as \"{{x}}\".'), { x: keywordList[0] });\r\n } else {\r\n suggestion = i18n.getString(_TL_('Include a popular keyword in descriptions such as \"{{x}}\" or \"{{y}}\".'), { x: keywordList[0], y: keywordList[1] });\r\n }\r\n break;\r\n }\r\n case 'MakeHeadlinesUnique': {\r\n suggestion = i18n.getString(_TL_('Try to diversify your headlines.'));\r\n break;\r\n }\r\n case 'MakeDescriptionsUnique': {\r\n suggestion = i18n.getString(_TL_('Try to diversify your descriptions.'));\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n return {\r\n suggestion,\r\n priority,\r\n };\r\n}\r\n\r\n\r\nexport function generateSuggestion({\r\n i18n,\r\n assets,\r\n actionItem,\r\n strength,\r\n priority,\r\n length,\r\n}) {\r\n const suggestion = i18n.getString(actionItemStrings[actionItem]);\r\n let state = 'not-met';\r\n let suggestionType = ViewSuggestionType.None;\r\n\r\n switch (actionItem) {\r\n case 'AddMoreHeadlines': {\r\n const headlineCount = assets.headlines.length;\r\n if (headlineCount < 5) {\r\n state = SuggestionState.NotMet;\r\n } else if (headlineCount >= maxHeadlineCount\r\n || (headlineCount > 8 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'AddMoreDescriptions': {\r\n const descriptionCount = assets.descriptions.length;\r\n if (descriptionCount < 2) {\r\n state = SuggestionState.NotMet;\r\n } else if (descriptionCount >= maxDescriptionCount\r\n || (descriptionCount > 3 && getStrengthScore(strength) >= StrengthScore.Good)) {\r\n state = SuggestionState.Met;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n }\r\n case 'DistinctHeadlines': {\r\n state = _.uniq(assets.headlines).length === assets.headlines.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n }\r\n case 'DistinctDescriptions':\r\n state = _.uniq(assets.descriptions).length === assets.descriptions.length\r\n ? SuggestionState.HalfMet\r\n : SuggestionState.NotMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'LongerHeadlines':\r\n state = (_.size(assets.headlines) === 0\r\n || _.any(assets.headlines, headline => _.size(headline) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Headline;\r\n break;\r\n case 'LongerDescriptions':\r\n state = (_.size(assets.descriptions) === 0\r\n || _.any(assets.descriptions, description => _.size(description) < 10))\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n suggestionType = ViewSuggestionType.Description;\r\n break;\r\n case 'UnpinHeadlinePositions': {\r\n const pinCount = assets.headlinePins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.headlines.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'UnpinDescriptionPositions': {\r\n const pinCount = assets.descriptionPins.length;\r\n if (pinCount > 0) {\r\n state = pinCount === assets.descriptions.length\r\n ? SuggestionState.NotMet\r\n : SuggestionState.HalfMet;\r\n } else {\r\n state = SuggestionState.Met;\r\n }\r\n suggestionType = ViewSuggestionType.None;\r\n break;\r\n }\r\n case 'MoreCombinations':\r\n if (assets.headlines.length < 5 || assets.descriptions.length < 3) {\r\n state = SuggestionState.NotMet;\r\n } else {\r\n state = SuggestionState.HalfMet;\r\n }\r\n if (assets.headlines.length < 10) {\r\n suggestionType = ViewSuggestionType.Headline;\r\n } else if (assets.descriptions.length < maxDescriptionCount) {\r\n suggestionType = ViewSuggestionType.Description;\r\n } else {\r\n suggestionType = ViewSuggestionType.None;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return {\r\n action: actionItem,\r\n state,\r\n suggestion,\r\n suggestionType,\r\n priority: actionItem === 'MoreCombinations' ? length : priority,\r\n };\r\n}\r\n\r\nexport function sortSuggestions(suggestions) {\r\n const orderFromMT = {};\r\n const currentOrders = {\r\n AddMoreHeadlines: 1,\r\n AddMoreDescriptions: 2,\r\n LongerHeadlines: 3,\r\n LongerDescriptions: 4,\r\n DistinctHeadlines: 5,\r\n DistinctDescriptions: 6,\r\n UnpinHeadlinePositions: 7,\r\n UnpinDescriptionPositions: 8,\r\n MoreCombinations: 9,\r\n };\r\n suggestions.forEach((suggestion) => {\r\n orderFromMT[`${suggestion.action}-not-met`] = suggestion.priority + ((currentOrders[suggestion.action] || 0) / 10);\r\n orderFromMT[`${suggestion.action}-half-met`] = suggestion.priority + suggestions.length + ((currentOrders[suggestion.action] || 0) / 10);\r\n orderFromMT[`${suggestion.action}-met`] = suggestion.priority + (suggestions.length * 2) + ((currentOrders[suggestion.action] || 0) / 10);\r\n });\r\n return _.sortBy(suggestions, suggestion => orderFromMT[`${suggestion.action}-${suggestion.state}`] || 100);\r\n}\r\n\r\nexport function isViewSuggestionApplied(assets, suggestionContent = '') {\r\n if (_.isEmpty(assets)) return false;\r\n const index = _.findIndex(_.range(assets.length), i =>\r\n _.isString(assets[i].Asset.Text) &&\r\n suggestionContent.toLowerCase() === assets[i].Asset.Text.toLowerCase());\r\n\r\n return (index !== -1);\r\n}\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport { HighchartReactWrapper } from '@bingads-webui-react/highchart-react-wrapper';\r\nimport { getNewStrengthScore, getStrengthColor } from './ad-strength-helper';\r\n\r\nexport function NewAdStrengthScore({\r\n strength, width,\r\n}) {\r\n if (!strength) return null;\r\n\r\n const score = getNewStrengthScore(strength);\r\n const color = getStrengthColor(strength);\r\n const options = {\r\n chart: {\r\n width,\r\n height: 12,\r\n margin: [0, 0, 0, 0],\r\n type: 'bar',\r\n },\r\n title: {\r\n text: null,\r\n },\r\n xAxis: {\r\n visible: false,\r\n },\r\n yAxis: {\r\n visible: false,\r\n tickPositions: [-0.2, 100.2],\r\n },\r\n legend: {\r\n enabled: false,\r\n },\r\n credits: {\r\n enabled: false,\r\n },\r\n tooltip: {\r\n enabled: false,\r\n formatter: null,\r\n },\r\n plotOptions: {\r\n bar: {\r\n animation: false,\r\n pointWidth: 16,\r\n },\r\n series: {\r\n stacking: 'normal',\r\n states: {\r\n hover: {\r\n enabled: false,\r\n },\r\n inactive: {\r\n enabled: false,\r\n },\r\n },\r\n },\r\n },\r\n series: [{\r\n data: [100-score],\r\n color: '#D9D9D9',\r\n }, {\r\n data: [0.2],\r\n color: '#FFFFFF',\r\n }, {\r\n data: [score],\r\n color,\r\n },\r\n ],\r\n };\r\n\r\n return (\r\n <HighchartReactWrapper\r\n className=\"ad-strength-score ad-strength-score-vnext\"\r\n options={options}\r\n />\r\n );\r\n}\r\n\r\nNewAdStrengthScore.propTypes = {\r\n strength: PropTypes.string,\r\n width: PropTypes.number,\r\n};\r\n\r\nNewAdStrengthScore.defaultProps = {\r\n strength: '',\r\n width: 418,\r\n};\r\n","import _ from 'underscore';\r\nimport { getTheme } from '@fluentui/react';\r\nimport { mergeStyles, mergeStyleSets } from '@fluentui/react/lib/Styling';\r\n\r\nconst { palette } = getTheme();\r\n\r\nexport const iconNames = {\r\n met: 'CompletedSolid',\r\n 'half-met': 'AlertSolid',\r\n 'not-met': 'RadioBtnOff',\r\n};\r\n\r\nexport const iconNamesUINext = {\r\n met: 'CompletedSolid',\r\n 'half-met': 'CRMCustomerInsightsApp',\r\n 'not-met': 'CRMCustomerInsightsApp',\r\n};\r\n\r\nconst iconClass = mergeStyles({\r\n fontSize: 16,\r\n marginRight: 6,\r\n verticalAlign: 'text-top',\r\n});\r\n\r\nexport const iconClasses = mergeStyleSets({\r\n met: [{ color: '#107C10' }, iconClass],\r\n 'half-met': [{ color: '#FFB900' }, iconClass],\r\n 'not-met': [{ color: palette.neutralSecondary }, iconClass],\r\n});\r\n\r\nexport const iconClassesUINext = mergeStyleSets({\r\n met: [{ color: '#107C10' }, iconClass],\r\n 'half-met': [{ color: '#0078D4' }, iconClass],\r\n 'not-met': [{ color: '#0078D4' }, iconClass],\r\n});\r\n\r\nexport const styles = {\r\n root: {\r\n borderRadius: 2,\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.108), 0px 1.6px 3.6px rgba(0, 0, 0, 0.132)',\r\n margin: '2px 0 32px 0',\r\n padding: '15px 20px',\r\n position: 'relative',\r\n\r\n selectors: {\r\n '& ul.ad-strength-actions': {\r\n listStyleType: 'none',\r\n paddingInlineStart: 0,\r\n },\r\n\r\n '& ul.ad-strength-actions li': {\r\n padding: '2px 0',\r\n lineHeight: '20px',\r\n },\r\n\r\n '& .ad-strength-content': {\r\n display: 'inline-flex',\r\n marginTop: 15,\r\n },\r\n\r\n '& .ad-strength-score': {\r\n marginRight: 16,\r\n textAlign: 'center',\r\n },\r\n\r\n '& .ad-strength-score-vnext': {\r\n marginTop: -10,\r\n marginLeft: -20,\r\n },\r\n\r\n '& .ad-strength-suggestions': {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n },\r\n\r\n '& .ad-strength-suggestions-detail': {\r\n display: 'block !important',\r\n },\r\n '& .ad-strength-suggestion-detail-tips-item-container': {\r\n display: 'block !important',\r\n },\r\n },\r\n },\r\n};\r\n\r\nexport const getNewAdStrengthStyles = () => ({\r\n container: {\r\n '& .ad-strength-title': {\r\n fontWeight: 600,\r\n '& .icon': {\r\n fontSize: 10,\r\n marginRight: 4,\r\n height: 20,\r\n width: 20,\r\n lineHeight: '20px',\r\n fontWeight: 600,\r\n textAlign: 'center',\r\n borderRadius: '50%',\r\n },\r\n '& .Incomplete': {\r\n color: '#BC0505',\r\n background: '#FDE7E9',\r\n },\r\n '& .Poor': {\r\n color: '#BC0505',\r\n background: '#FDE7E9',\r\n },\r\n '& .Average': {\r\n color: '#D83B01',\r\n background: '#FFF4CE',\r\n },\r\n '& .Good': {\r\n color: '#107C10',\r\n background: '#DFF6DD',\r\n },\r\n '& .Excellent': {\r\n color: '#107C10',\r\n background: '#DFF6DD',\r\n },\r\n },\r\n '& .ad-strength-score-vnext': {\r\n marginTop: 8,\r\n },\r\n '& ul.ad-strength-actions': {\r\n listStyleType: 'none',\r\n paddingInlineStart: 0,\r\n },\r\n '& ul.ad-strength-actions li': {\r\n padding: '2px 0',\r\n lineHeight: '20px',\r\n '& .suggestion-icon': {\r\n fontSize: 16,\r\n marginRight: 6,\r\n verticalAlign: 'text-top',\r\n color: '#0078D4',\r\n },\r\n },\r\n '& .ad-strength-suggestions': {\r\n marginTop: 16,\r\n },\r\n },\r\n cardTitle: {\r\n fontSize: '18px',\r\n display: 'inline',\r\n },\r\n});\r\n\r\nexport const getAdStrengthTopGridStyles = () => ({\r\n container: _.extend({\r\n margin: '16px 16px 16px 32px',\r\n padding: '22px 16px 16px 32px',\r\n width: 'fit-content',\r\n boxShadow: '0px 0.3px 0.9px rgba(0, 0, 0, 0.1), 0px 1.6px 3.6px rgba(0, 0, 0, 0.13)',\r\n borderRadius: '2px',\r\n '& .ad-strengh-panel-title': {\r\n fontSize: '18px',\r\n fontWeight: 900,\r\n paddingBottom: '16px',\r\n },\r\n }, getNewAdStrengthStyles().container),\r\n});\r\n\r\nexport const getPickerListStyles = () => ({\r\n root: {\r\n boxShadow: '0px 3.2px 7.2px 0px rgba(0, 0, 0, 0.132), 0px 0.6px 1.8px 0px rgba(0, 0, 0, 0.108)',\r\n backgroundColor: '#fff',\r\n minWidth: '180px',\r\n '&>li>a': {\r\n color: palette.neutralPrimary,\r\n height: '36px',\r\n lineHeight: '36px',\r\n padding: '0 8px',\r\n whiteSpace: 'nowrap',\r\n display: 'block',\r\n\r\n '&:hover': {\r\n backgroundColor: palette.neutralLighter,\r\n color: '#201f1e',\r\n },\r\n\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n color: palette.neutralPrimary,\r\n position: 'relative',\r\n textDecoration: 'none',\r\n outline: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n },\r\n },\r\n pickerTitle: {\r\n padding: '10px 10px 3px 10px',\r\n fontWeight: 'bold',\r\n },\r\n});\r\n\r\nexport const getLLMPickerListStyles = () => ({\r\n root: {\r\n backgroundColor: '#fff',\r\n minWidth: '350px',\r\n position: 'relative',\r\n paddingLeft: 0,\r\n margin: 0,\r\n listStyle: 'none',\r\n '&>li>a': {\r\n color: palette.neutralPrimary,\r\n height: '36px',\r\n lineHeight: '36px',\r\n padding: '0 8px',\r\n paddingLeft: 32,\r\n whiteSpace: 'nowrap',\r\n display: 'block',\r\n\r\n '&:hover': {\r\n backgroundColor: palette.neutralLighter,\r\n color: '#201f1e',\r\n },\r\n\r\n '&:focus': {\r\n backgroundColor: 'transparent',\r\n color: palette.neutralPrimary,\r\n position: 'relative',\r\n textDecoration: 'none',\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n },\r\n },\r\n pickerTitle: {\r\n borderTop: '1px solid #f3f2f1',\r\n color: '#323130',\r\n padding: '10px 10px 3px 32px',\r\n fontWeight: 'bold',\r\n },\r\n});\r\n\r\nexport const shimmerWrapperClass = mergeStyles({\r\n padding: 2,\r\n selectors: {\r\n '& > .ms-Shimmer-container': {\r\n margin: '10px 0',\r\n },\r\n },\r\n});\r\n\r\nexport const llmIconClass = mergeStyles({\r\n position: 'absolute',\r\n top: 18,\r\n left: 24,\r\n});\r\n","/* eslint-disable @typescript-eslint/no-shadow */\r\nimport _ from 'underscore';\r\nimport React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FontIcon } from '@fluentui/react/lib/Icon';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport classNames from 'classnames';\r\nimport { Collapse, TextTitle } from '@bingads-webui-campaign/wizard-jumbo-card';\r\n\r\nimport { NewAdStrengthScore } from './new-ad-strength-score';\r\nimport { getStrengthIcon, newGenerateSuggestion } from './ad-strength-helper';\r\nimport { getNewAdStrengthStyles } from './styles';\r\n\r\nconst suggestionLimit = 5;\r\n\r\nexport function ResponsiveSearchAdStrength(props) {\r\n const {\r\n adItem,\r\n campaignId,\r\n adGroupId,\r\n onFetchAdStrength,\r\n logAdStrength,\r\n i18n,\r\n } = props;\r\n const [adStrength, setAdStrength] = useState();\r\n const [actionItems, setActionItems] = useState([]);\r\n const [priority, setPriority] = useState([]);\r\n const [suggestions, setSuggestions] = useState([]);\r\n const iconName = getStrengthIcon(adStrength);\r\n const { Headlines, Descriptions } = adItem;\r\n const notEmptyHeadlines = useMemo(() => (Headlines ? Headlines.filter(item => item.Asset.Text !== '') : []), [Headlines]);\r\n const notEmptyDescriptions = useMemo(() => (Descriptions ? Descriptions.filter(item => item.Asset.Text !== '') : []), [Descriptions]);\r\n const IsCompleteAd = useMemo(() => (notEmptyHeadlines.length >= 3 && notEmptyDescriptions.length >= 2), [notEmptyHeadlines, notEmptyDescriptions]);\r\n const classes = useDefaultStyles(getNewAdStrengthStyles);\r\n const [activeKeys, setActiveKeys] = useState(['adStrength']);\r\n useEffect(() => {\r\n const rawActionItems = Object.keys(actionItems).map((key, index) => newGenerateSuggestion({\r\n i18n,\r\n actionItem: key,\r\n xValue: actionItems[key],\r\n priority: priority[index],\r\n }));\r\n\r\n const sortedSuggestions=_.sortBy(rawActionItems, suggestion => suggestion.priority || 100);\r\n\r\n setSuggestions(sortedSuggestions.slice(0, suggestionLimit));\r\n }, [Descriptions, Headlines, actionItems, adStrength, i18n, priority]);\r\n\r\n const lazyFetchNewAdStrength = useMemo(() => _.debounce((ad, campaignId, adGroupId, logAdStrength) => {\r\n onFetchAdStrength(ad, campaignId, adGroupId).then((response) => {\r\n const {\r\n Strength,\r\n ActionItemsV2,\r\n Priorities,\r\n } = response;\r\n\r\n setAdStrength(Strength);\r\n setActionItems(ActionItemsV2 ? JSON.parse(ActionItemsV2) : {});\r\n setPriority(Priorities || []);\r\n logAdStrength && logAdStrength({ Strength, ActionItemsV2, Priorities });\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, 1000), []);\r\n\r\n useEffect(() => {\r\n if (IsCompleteAd && campaignId) {\r\n lazyFetchNewAdStrength({ Headlines: notEmptyHeadlines, Descriptions: notEmptyDescriptions, adId: adItem.Id }, campaignId, adGroupId || '0', logAdStrength);\r\n } else {\r\n setAdStrength('Incomplete');\r\n }\r\n }, [adGroupId, adItem.Id, campaignId, IsCompleteAd, lazyFetchNewAdStrength, logAdStrength, notEmptyDescriptions, notEmptyHeadlines]);\r\n\r\n return (\r\n <React.Fragment>\r\n <Collapse activeKeys={activeKeys} setActiveKeys={setActiveKeys}>\r\n <Collapse.Panel key=\"adStrength\" title={<TextTitle titleKey={_TL_('Ad strength')} topicKey=\"pop_BA_RSA_AdStrength\" as=\"h3\" headingClassName={classes.cardTitle} />}>\r\n <div className={classNames('ad-strength-content', classes.container)}>\r\n { adStrength &&\r\n <div className=\"ad-strength-title\">\r\n <FontIcon\r\n iconName={iconName}\r\n className={`icon ${adStrength}`}\r\n />\r\n {adStrength === 'Incomplete'? i18n.getString(_TL_('Incomplete')) : i18n.getString(_TL_(`${adStrength} Performance`))}\r\n </div>\r\n }\r\n <NewAdStrengthScore\r\n strength={adStrength}\r\n />\r\n { adStrength !== 'Excellent' && adStrength !== 'Incomplete' &&\r\n <div className=\"ad-strength-suggestions\">\r\n <ul className=\"ad-strength-actions\">\r\n {_.map(suggestions, suggestion => (\r\n <li>\r\n <FontIcon\r\n iconName=\"CRMCustomerInsightsApp\"\r\n className=\"suggestion-icon\"\r\n />\r\n {suggestion.suggestion}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n }\r\n { adStrength === 'Incomplete' &&\r\n <div className=\"ad-strength-suggestions\">\r\n <ul className=\"ad-strength-actions\">\r\n { notEmptyHeadlines.length < 3 &&\r\n <li>\r\n <FontIcon\r\n iconName=\"CRMCustomerInsightsApp\"\r\n className=\"suggestion-icon\"\r\n />\r\n {i18n.getString(_TL_('Add 3 headlines to start ad strength.'))}\r\n </li>\r\n }\r\n { notEmptyDescriptions.length < 2 &&\r\n <li>\r\n <FontIcon\r\n iconName=\"CRMCustomerInsightsApp\"\r\n className=\"suggestion-icon\"\r\n />\r\n {i18n.getString(_TL_('Add 2 descriptions to start ad strength.'))}\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n </Collapse.Panel>\r\n </Collapse>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nResponsiveSearchAdStrength.propTypes = {\r\n adItem: PropTypes.shape({\r\n Id: PropTypes.number,\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n }).isRequired,\r\n\r\n onFetchAdStrength: PropTypes.func.isRequired,\r\n\r\n logAdStrength: PropTypes.func,\r\n\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n\r\n campaignId: PropTypes.number,\r\n\r\n adGroupId: PropTypes.number,\r\n};\r\n\r\nResponsiveSearchAdStrength.defaultProps = {\r\n campaignId: null,\r\n adGroupId: null,\r\n logAdStrength: _.noop,\r\n};\r\n","const getDefaultAsset = (num) => {\r\n const assetList = new Array(num);\r\n const emptyAsset= {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n };\r\n assetList.fill(emptyAsset);\r\n return assetList;\r\n};\r\nexport class AdStrengthRepository {\r\n constructor({\r\n edm,\r\n jsdata,\r\n }) {\r\n this.edm = edm;\r\n this.jsdata = jsdata;\r\n }\r\n\r\n fetchAdStrengthV2(ad, campaignId, adGroupId) {\r\n const params = {\r\n query: {\r\n entitySet: this.edm.currentAccount\r\n .Campaigns.$withKey(campaignId)\r\n .AdGroups.$withKey(adGroupId)\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines || getDefaultAsset(5),\r\n Descriptions: ad.Descriptions || getDefaultAsset(2),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return this.jsdata.Ad.findAll(params, options);\r\n }\r\n\r\n fetchAdStrength(ad) {\r\n const params = {\r\n query: {\r\n entitySet: this.edm.currentAccount\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines,\r\n Descriptions: ad.Descriptions,\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return this.jsdata.Ad.findAll(params, options);\r\n }\r\n}\r\n","/* eslint-disable jsx-a11y/anchor-is-valid, no-param-reassign */\r\nimport React, { useCallback, useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport _ from 'underscore';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { FocusLock } from '@bingads-webui-react/focus-lock';\r\nimport { mergeStyles, FontIcon, registerIcons } from '@fluentui/react';\r\nimport { ViewSuggestionType, isViewSuggestionApplied, assetStrMap } from './ad-strength-helper';\r\nimport { getPickerListStyles, getLLMPickerListStyles } from './styles';\r\nimport { adStrengthSuggestionPerspectiveStrings } from './strings';\r\nimport llmIcon from '../media/llm.svg';\r\n\r\nregisterIcons({\r\n icons: {\r\n 'llm-svg': (<img style={{ position: 'absolute', left: -4 }} src={llmIcon} alt=\"chatgpt-logo\" />),\r\n },\r\n});\r\n\r\nconst DKIThemeDefaultName = 'Asset_Theme_For_DKI';\r\n\r\nexport const AdStrengthSuggestionPicker = (props) => {\r\n const {\r\n i18n, target, suggestions, updateItem, hideSuggestionPicker, assetType, displayPostion,\r\n updateSuggestionMeasurement,\r\n } = props;\r\n\r\n const pickerListClass = useDefaultStyles(getPickerListStyles);\r\n const containerStyle = { position: 'absolute', left: `${displayPostion.left}px`, top: `${displayPostion.top}px` };\r\n\r\n useEffect(() => {\r\n const clickedAway = (event) => {\r\n if (!target.contains(event.target) &&\r\n event.target.closest('.ad-strength-suggestion-container') === null\r\n ) {\r\n hideSuggestionPicker();\r\n window.removeEventListener('click', clickedAway);\r\n }\r\n };\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape': {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer.hasChildNodes()) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target)) {\r\n window.addEventListener('click', clickedAway);\r\n target.addEventListener('keydown', event => keydown(event));\r\n\r\n return () => {\r\n window.removeEventListener('click', clickedAway);\r\n target.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [hideSuggestionPicker, target]);\r\n\r\n const addAssetSuggestion = (event, Asset, SuggestionId) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n\r\n if (!_.isEmpty(target)) {\r\n updateItem(Asset);\r\n updateSuggestionMeasurement({ applySuggestionIds: [SuggestionId] });\r\n }\r\n };\r\n\r\n const pickerTitle = assetType === ViewSuggestionType.Headline ?\r\n i18n.getString(_TL_('View recommended headlines')) :\r\n i18n.getString(_TL_('View recommended descriptions'));\r\n\r\n updateSuggestionMeasurement({\r\n viewSuggestionIds: _.map(suggestions, suggestion => suggestion.SuggestionId),\r\n });\r\n\r\n return (\r\n <React.Fragment>\r\n {\r\n suggestions.length > 0 ?\r\n <FocusLock\r\n onExit={hideSuggestionPicker}\r\n focusFirstItemOnMount\r\n >\r\n <ul className={classNames('picker-list', pickerListClass.root)} role=\"menu\" style={containerStyle}>\r\n <li className={classNames('ad-strength-suggestion-picker-title', pickerListClass.pickerTitle)}>\r\n {pickerTitle}\r\n </li>\r\n {\r\n suggestions.map(({ SuggestionId, Asset }, index) => (\r\n <li key={SuggestionId} role=\"menuitem\">\r\n <a\r\n role=\"menuitem\"\r\n arial-label={Asset}\r\n href=\"#\"\r\n onClick={event => addAssetSuggestion(event, Asset, SuggestionId)}\r\n key={SuggestionId}\r\n data-index={index}\r\n >\r\n {Asset || null}\r\n </a>\r\n </li>))\r\n }\r\n </ul>\r\n </FocusLock>\r\n : null\r\n }\r\n </React.Fragment>);\r\n};\r\n\r\nAdStrengthSuggestionPicker.propTypes = {\r\n suggestions: PropTypes.arrayOf({\r\n SuggestionId: PropTypes.string.isRequired,\r\n Asset: PropTypes.string.isRequired,\r\n }).isRequired,\r\n target: PropTypes.shape({\r\n addEventListener: PropTypes.func,\r\n removeEventListener: PropTypes.func,\r\n contains: PropTypes.func,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n assetType: PropTypes.string.isRequired,\r\n updateItem: PropTypes.func.isRequired,\r\n hideSuggestionPicker: PropTypes.func.isRequired,\r\n displayPostion: PropTypes.shape({\r\n left: PropTypes.number.isRequired,\r\n top: PropTypes.number.isRequired,\r\n }).isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n};\r\n\r\nAdStrengthSuggestionPicker.defaultProps = {\r\n target: null,\r\n};\r\n\r\nexport const AdStrengthLLMSuggestionPicker = (props) => {\r\n const {\r\n target, suggestions, perspectives, updateItem, showSuggestionPicker, hideSuggestionPicker, displayPostion,\r\n updateSuggestionMeasurement, autoFocus,\r\n } = props;\r\n\r\n const pickerRef = useRef(null);\r\n const pickerListClass = useDefaultStyles(getLLMPickerListStyles);\r\n const containerStyle = {\r\n position: 'absolute',\r\n left: `${displayPostion.left}px`,\r\n top: `${displayPostion.top}px`,\r\n maxHeight: 180,\r\n overflowY: 'auto',\r\n border: '1px solid #B3B0AD',\r\n borderRadius: 2,\r\n };\r\n\r\n useEffect(() => {\r\n const clickedAway = (event) => {\r\n if (!target.contains(event.target) &&\r\n event.target.closest('.ad-strength-suggestion-container') === null\r\n ) {\r\n hideSuggestionPicker();\r\n window.removeEventListener('click', clickedAway);\r\n }\r\n };\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n const pickerContainer = document.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer.hasChildNodes()) {\r\n if (event.key === 'Escape') {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n hideSuggestionPicker();\r\n }\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n showSuggestionPicker(event);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target)) {\r\n window.addEventListener('click', clickedAway);\r\n target.addEventListener('keydown', event => keydown(event));\r\n\r\n return () => {\r\n window.removeEventListener('click', clickedAway);\r\n target.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [hideSuggestionPicker, showSuggestionPicker, target]);\r\n\r\n useEffect(() => {\r\n if (pickerRef.current && autoFocus) {\r\n const firstItem = pickerRef.current.querySelector('[role=\"menuitem\"]');\r\n if (firstItem) {\r\n firstItem.focus();\r\n }\r\n }\r\n if (pickerRef.current) {\r\n const keydown = (event) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n hideSuggestionPicker();\r\n if (target) {\r\n target.focus();\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n };\r\n const pickerTarget = pickerRef.current;\r\n pickerTarget.addEventListener('keydown', event => keydown(event));\r\n return () => {\r\n pickerTarget.removeEventListener('keydown', keydown);\r\n };\r\n }\r\n return () => { };\r\n }, [autoFocus, hideSuggestionPicker, pickerRef, target]);\r\n\r\n const addAssetSuggestion = (event, Asset, SuggestionId) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n hideSuggestionPicker();\r\n\r\n if (!_.isEmpty(target)) {\r\n target.focus();\r\n updateItem(Asset);\r\n updateSuggestionMeasurement({ applySuggestionIds: [SuggestionId] });\r\n }\r\n };\r\n\r\n updateSuggestionMeasurement({\r\n viewSuggestionIds: _.map(suggestions, suggestion => suggestion.SuggestionId),\r\n });\r\n\r\n const iconClass = mergeStyles({\r\n position: 'absolute',\r\n top: 12,\r\n left: 12,\r\n });\r\n\r\n const perspectiveItems = _.map(perspectives, (perspective) => {\r\n const filteredPerspectiveSuggestions = _.filter(suggestions, suggestion =>\r\n suggestion.Perspective.toLowerCase() === perspective.Perspective.toLowerCase());\r\n\r\n const suggestionItems = _.map(filteredPerspectiveSuggestions, (suggestion, index) => (\r\n <li key={suggestion.SuggestionId}>\r\n <a\r\n role=\"menuitem\"\r\n className=\"ad-strength-suggestion-picker-item\"\r\n aria-label={suggestion.Asset}\r\n href=\"#\"\r\n onClick={event => addAssetSuggestion(event, suggestion.Asset, suggestion.SuggestionId)}\r\n key={suggestion.SuggestionId}\r\n data-index={index}\r\n >\r\n {suggestion.Asset || null}\r\n </a>\r\n </li>));\r\n\r\n return (\r\n suggestionItems.length > 0 ?\r\n <ul className={classNames('picker-list', pickerListClass.root)} role=\"presentation\">\r\n <FontIcon iconName=\"llm-svg\" className={iconClass} role=\"none\" />\r\n <li className={classNames('ad-strength-suggestion-picker-title', pickerListClass.pickerTitle)} role=\"presentation\">\r\n {perspective.Perspective}\r\n </li>\r\n {suggestionItems}\r\n </ul> :\r\n null\r\n );\r\n });\r\n\r\n return (\r\n <React.Fragment>\r\n {\r\n suggestions.length > 0 ?\r\n <div className=\"ad-strength-llm-suggestion-picker\" style={containerStyle} ref={pickerRef} role=\"menu\">\r\n {perspectiveItems}\r\n </div>\r\n : null\r\n }\r\n </React.Fragment>);\r\n};\r\n\r\nAdStrengthLLMSuggestionPicker.propTypes = {\r\n suggestions: PropTypes.arrayOf({\r\n SuggestionId: PropTypes.string.isRequired,\r\n Asset: PropTypes.string.isRequired,\r\n }).isRequired,\r\n target: PropTypes.shape({\r\n addEventListener: PropTypes.func,\r\n removeEventListener: PropTypes.func,\r\n contains: PropTypes.func,\r\n focus: PropTypes.func,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n updateItem: PropTypes.func.isRequired,\r\n showSuggestionPicker: PropTypes.func.isRequired,\r\n hideSuggestionPicker: PropTypes.func.isRequired,\r\n displayPostion: PropTypes.shape({\r\n left: PropTypes.number.isRequired,\r\n top: PropTypes.number.isRequired,\r\n }).isRequired,\r\n updateSuggestionMeasurement: PropTypes.func.isRequired,\r\n perspectives: PropTypes.arrayOf({\r\n Perspective: PropTypes.string.isRequired,\r\n }).isRequired,\r\n autoFocus: PropTypes.bool,\r\n};\r\n\r\nAdStrengthLLMSuggestionPicker.defaultProps = {\r\n target: null,\r\n autoFocus: false,\r\n};\r\n\r\nfunction filterLLMSuggestion(suggestions, assetTypeString, value, assets) {\r\n const filteredTypeSuggestions = _.filter(suggestions.Suggestions, suggestion =>\r\n suggestion.AssetType.toLowerCase() === assetTypeString &&\r\n !_.isEmpty(suggestion.Asset) &&\r\n !isViewSuggestionApplied(assets, suggestion.Asset) &&\r\n !(!_.isEmpty(value) && (!suggestion.Asset.toLowerCase().startsWith(value.toLowerCase()) || suggestion.Asset.toLowerCase() === value.toLowerCase())));\r\n\r\n return filteredTypeSuggestions;\r\n}\r\n\r\nfunction getDisplayPosition(target, container) {\r\n // Calculate the position of the popup relative to the container.\r\n // The container needs to be non-statically positioned, either fixed, relative or absolute\r\n const targetRect = target.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n return {\r\n top: (targetRect.bottom - containerRect.top) + 1,\r\n left: targetRect.left - containerRect.left - 1,\r\n };\r\n}\r\n\r\nexport const useAdStrengthSuggestion = ({\r\n container,\r\n i18n,\r\n ref,\r\n llmAssetsSuggestions,\r\n assets,\r\n assetType,\r\n updateItem,\r\n isForVnext,\r\n index,\r\n updateSuggestionMeasurement,\r\n enableDKI,\r\n DKIThemeName,\r\n}) => {\r\n const assetTypeString = assetStrMap[assetType];\r\n const containerElement = document.querySelector(container);\r\n\r\n if (containerElement && containerElement.querySelectorAll('.ad-strength-suggestion-container').length === 0) {\r\n const div = document.createElement('div');\r\n div.className = 'ad-strength-suggestion-container open';\r\n containerElement.appendChild(div);\r\n }\r\n\r\n const hideSuggestionPicker = useCallback(() => {\r\n if (containerElement) {\r\n const pickerContainer = containerElement.querySelector('.ad-strength-suggestion-container');\r\n if (pickerContainer) {\r\n ReactDOM.unmountComponentAtNode(pickerContainer);\r\n }\r\n }\r\n }, [containerElement]);\r\n\r\n useEffect(() => {\r\n const target = ref.current;\r\n let displayPostion = {};\r\n if (containerElement && target) {\r\n displayPostion = getDisplayPosition(target, containerElement);\r\n }\r\n\r\n const showSuggestionPicker = (event) => {\r\n if (event && event.type === 'keydown' && event.key === 'Escape') {\r\n return;\r\n }\r\n\r\n if (!containerElement) {\r\n return;\r\n }\r\n\r\n const assetsCopy = cloneDeep(assets);\r\n assetsCopy[index].Asset.Text = target.value;\r\n\r\n if (_.isEmpty(llmAssetsSuggestions)) { return; }\r\n\r\n if (llmAssetsSuggestions.ModelName === 'Fallback' && !_.isEmpty(llmAssetsSuggestions.Suggestions)) {\r\n llmAssetsSuggestions.Perspectives = [\r\n {\r\n Perspective: assetType === ViewSuggestionType.Headline ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Title :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Title,\r\n PitchingPoint: assetType === ViewSuggestionType.Headline ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Pitching_Point :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Pitching_Point,\r\n },\r\n ];\r\n _.each(llmAssetsSuggestions.Suggestions, (suggestion) => {\r\n // eslint-disable-next-line no-param-reassign\r\n suggestion.Perspective = assetType === 'headline' ?\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Headline_Title :\r\n adStrengthSuggestionPerspectiveStrings.Ad_Strength_Suggestion_Perspective_Description_Title;\r\n });\r\n }\r\n\r\n let filteredSuggestions = filterLLMSuggestion(llmAssetsSuggestions, assetTypeString, target.value, assetsCopy);\r\n let perspectives = llmAssetsSuggestions.Perspectives.sort(perspective => perspective.Perspective);\r\n\r\n if (enableDKI) {\r\n const DKIfilteredSuggestions = filteredSuggestions.filter(suggestion => suggestion.Perspective === DKIThemeDefaultName).slice(0, 2).map(suggestion => ({ ...suggestion, Perspective: i18n.getString(DKIThemeName) }));\r\n const normalfilteredSuggestions = filteredSuggestions.filter(suggestion => suggestion.Perspective !== DKIThemeDefaultName);\r\n filteredSuggestions = [...DKIfilteredSuggestions, ...normalfilteredSuggestions];\r\n perspectives=[{ Perspective: i18n.getString(DKIThemeName), PitchingPoint: '' }, ...perspectives.filter(perspective => perspective.Perspective !== DKIThemeDefaultName)];\r\n }\r\n const autoFocus = event && event.type === 'keydown' && event.key === 'ArrowDown';\r\n\r\n if (filteredSuggestions.length > 0) {\r\n ReactDOM.render(<AdStrengthLLMSuggestionPicker\r\n i18n={i18n}\r\n target={target}\r\n suggestions={filteredSuggestions}\r\n perspectives={perspectives}\r\n assets={assets}\r\n assetType={assetTypeString}\r\n updateItem={updateItem}\r\n value={target.value}\r\n showSuggestionPicker={showSuggestionPicker}\r\n hideSuggestionPicker={hideSuggestionPicker}\r\n displayPostion={displayPostion}\r\n updateSuggestionMeasurement={updateSuggestionMeasurement}\r\n autoFocus={autoFocus}\r\n />, containerElement.querySelector('.ad-strength-suggestion-container'));\r\n } else {\r\n hideSuggestionPicker();\r\n }\r\n };\r\n\r\n if (!_.isEmpty(target) && (assetType === 'Headlines' || assetType === 'Descriptions') && isForVnext) {\r\n if (target === document.activeElement) {\r\n showSuggestionPicker();\r\n }\r\n target.addEventListener('input', showSuggestionPicker);\r\n target.addEventListener('click', showSuggestionPicker);\r\n target.addEventListener('keydown', showSuggestionPicker);\r\n\r\n return () => {\r\n target.removeEventListener('input', showSuggestionPicker);\r\n target.removeEventListener('click', showSuggestionPicker);\r\n target.removeEventListener('keydown', showSuggestionPicker);\r\n };\r\n }\r\n\r\n return () => { };\r\n }, [assetType, assetTypeString, assets, containerElement, hideSuggestionPicker, i18n, index, isForVnext, llmAssetsSuggestions, ref, updateItem, updateSuggestionMeasurement]);\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FontIcon } from '@fluentui/react/lib/Icon';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport classNames from 'classnames';\r\nimport jsdata from '@bingads-webui-component-legacy/js-data-campaign/index';\r\nimport edmCampaign from '@bingads-webui-component-legacy/edm-campaign/index';\r\n\r\nimport { NewAdStrengthScore } from './new-ad-strength-score';\r\nimport { getStrengthIcon, newGenerateSuggestion } from './ad-strength-helper';\r\nimport { getAdStrengthTopGridStyles } from './styles';\r\n\r\nconst getDefaultAsset = (num) => {\r\n const assetList = new Array(num);\r\n const emptyAsset= {\r\n Asset: {\r\n '@odata.type': '#Model.TextAsset',\r\n AssetType: 'Text',\r\n Name: null,\r\n Text: '',\r\n },\r\n PinnedField: 'None',\r\n };\r\n assetList.fill(emptyAsset);\r\n return assetList;\r\n};\r\n\r\nconst fetchAdStrength = (ad, scope) => {\r\n const { campaignId, adGroupId } = scope.values;\r\n const params = {\r\n query: {\r\n entitySet: edmCampaign.currentAccount\r\n .Campaigns.$withKey(campaignId)\r\n .AdGroups.$withKey(adGroupId)\r\n .Ads['Default.GetAdStrengthAndActionItems']\r\n .$call({\r\n ad: {\r\n '@odata.type': '#Model.ResponsiveSearchAd',\r\n Type: 'ResponsiveSearch',\r\n adId: ad.Id,\r\n Headlines: ad.Headlines || getDefaultAsset(5),\r\n Descriptions: ad.Descriptions || getDefaultAsset(2),\r\n },\r\n })\r\n .toJSON(),\r\n },\r\n };\r\n const options = {\r\n cacheResponse: false,\r\n };\r\n return jsdata.Ad.findAll(params, options);\r\n};\r\n\r\nexport function AdStrengthTopGrid(props) {\r\n const {\r\n adItem,\r\n scope,\r\n i18n,\r\n } = props;\r\n const [adStrength, setAdStrength] = useState();\r\n const [actionItems, setActionItems] = useState([]);\r\n const [priority, setPriority] = useState([]);\r\n const [suggestions, setSuggestions] = useState([]);\r\n const iconName = getStrengthIcon(adStrength);\r\n const classes = useDefaultStyles(getAdStrengthTopGridStyles);\r\n useEffect(() => {\r\n const rawActionItems = Object.keys(actionItems).map((key, index) => newGenerateSuggestion({\r\n i18n,\r\n actionItem: key,\r\n xValue: actionItems[key],\r\n priority: priority[index],\r\n }));\r\n const sortedSuggestions=_.sortBy(rawActionItems, suggestion => suggestion.priority || 100);\r\n\r\n setSuggestions(sortedSuggestions);\r\n }, [actionItems, adStrength, i18n, priority]);\r\n\r\n useEffect(() => {\r\n if (adItem) {\r\n const { Headlines, Descriptions } = adItem;\r\n const notEmptyHeadlines = Headlines && Headlines.filter(item => item.Asset.Text !== '');\r\n const notEmptyDescriptions = Descriptions && Descriptions.filter(item => item.Asset.Text !== '');\r\n fetchAdStrength({ Headlines: notEmptyHeadlines, Descriptions: notEmptyDescriptions, adId: adItem.Id }, scope).then((response) => {\r\n const {\r\n Strength,\r\n ActionItemsV2,\r\n Priorities,\r\n } = response;\r\n\r\n setAdStrength(Strength);\r\n setActionItems(JSON.parse(ActionItemsV2));\r\n setPriority(Priorities || []);\r\n });\r\n }\r\n }, [adItem, scope]);\r\n\r\n return (\r\n <React.Fragment>\r\n { adStrength &&\r\n <div className={classNames('ad-strength-container', classes.container)}>\r\n <div className=\"ad-strengh-panel-title\">Ad Strength</div>\r\n <div className=\"ad-strength-content\">\r\n <div className=\"ad-strength-title\">\r\n <FontIcon\r\n iconName={iconName}\r\n className={`icon ${adStrength}`}\r\n />\r\n {i18n.getString(_TL_(`${adStrength} Performance`))}\r\n </div>\r\n <NewAdStrengthScore\r\n strength={adStrength}\r\n />\r\n { adStrength !== 'Excellent' &&\r\n <div className=\"ad-strength-suggestions\">\r\n <ul className=\"ad-strength-actions\">\r\n {_.map(suggestions, suggestion => (\r\n <li>\r\n <FontIcon\r\n iconName=\"CRMCustomerInsightsApp\"\r\n className=\"suggestion-icon\"\r\n />\r\n {suggestion.suggestion}\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nAdStrengthTopGrid.propTypes = {\r\n adItem: PropTypes.shape({\r\n Headlines: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n Descriptions: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\r\n }).isRequired,\r\n scope: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\n","// todo: [4183561] should update to use palette provided by theme provider\r\nexport const palette = {\r\n neutralLight: '#edebe9',\r\n neutralLighter: '#f3f2f1',\r\n neutralPrimary: '#323130',\r\n neutralQuaternaryAlt: '#e1dfdd',\r\n neutralSecondary: '#605e5c',\r\n neutralSecondaryAlt: '#8a8886',\r\n neutralTertiary: '#a19f9d',\r\n themeDark: '#005a9e',\r\n themeDarkAlt: '#106ebe',\r\n themeDarker: '#004578',\r\n themePrimary: '#0078d4',\r\n white: '#ffffff',\r\n};\r\n","import {\r\n predicateValueEditorStyle,\r\n editImageCommonStyle,\r\n} from '@bingads-webui-campaign-react/common-styles';\r\nimport { getCommonPreviewContainerStyles } from '@bingads-webui-campaign-react/shared-image-preview-styles';\r\n\r\nimport { palette } from './palette';\r\n\r\nconst panelStyle = () => ({\r\n '& .panel-body': {\r\n height: '100%',\r\n marginBottom: '65px',\r\n },\r\n});\r\n\r\nconst floatButtonStyle = () => ({\r\n floatButton: {\r\n background: palette.neutralLighter,\r\n border: 'none',\r\n borderRadius: 0,\r\n color: palette.themeDarkAlt,\r\n fontWeight: 'normal',\r\n height: 'auto',\r\n minHeight: 'auto',\r\n minWidth: 'auto',\r\n width: 'auto',\r\n padding: '14px 8px',\r\n\r\n '&:active, &:focus, &:hover': {\r\n color: palette.themeDark,\r\n background: palette.neutralQuaternaryAlt,\r\n },\r\n },\r\n});\r\n\r\nconst paginationStyle = ({ iconFontFamily = 'MsAds MDL2 Assets' }) => ({\r\n '& .ba-pagination, .dlb-pager-container, .pagination-control': {\r\n height: 'auto',\r\n padding: '6px 0',\r\n\r\n '& > .text': {\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n padding: '0px 0px 8px 5px',\r\n '& > span': {\r\n marginRight: '5px',\r\n },\r\n },\r\n '& button': {\r\n border: 0,\r\n background: 'transparent',\r\n minWidth: '1px',\r\n padding: 0,\r\n color: palette.neutralSecondary,\r\n },\r\n\r\n '& button:hover': {\r\n borderRadius: 2,\r\n background: palette.neutralLighter,\r\n },\r\n\r\n '& button:disabled': {\r\n background: 'transparent',\r\n color: '#BEBBB8',\r\n },\r\n\r\n '& .pager-input': {\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n padding: '6px 8px',\r\n height: 32,\r\n textAlign: 'center',\r\n margin: '0 12px',\r\n width: 70,\r\n display: 'inline-block',\r\n borderRadius: 2,\r\n boxSizing: 'border-box',\r\n color: palette.neutralPrimary,\r\n },\r\n\r\n '& .glyphicon-triangle-left, & .glyphicon-triangle-right': {\r\n display: 'inline-block',\r\n fontFamily: iconFontFamily,\r\n color: 'inherit',\r\n },\r\n\r\n '& .glyphicon-triangle-left:before': {\r\n content: '\"\\\\E76B\"',\r\n },\r\n\r\n '& .glyphicon-triangle-right:before': {\r\n content: '\"\\\\E76C\"',\r\n },\r\n },\r\n\r\n '& .pager, .location-bid-pager-view': {\r\n height: 32,\r\n padding: 0,\r\n margin: 0,\r\n\r\n '& .pager-input, .page-number-input, .grid-pager-input': {\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n padding: '6px 8px',\r\n height: 32,\r\n textAlign: 'center',\r\n margin: '0 12px',\r\n width: 70,\r\n display: 'inline-block',\r\n borderRadius: 2,\r\n boxSizing: 'border-box',\r\n color: palette.neutralPrimary,\r\n background: palette.white,\r\n },\r\n\r\n '& .pager-input[disabled], & .page-number-input[disabled], & .grid-pager-input[disabled]': {\r\n backgroundColor: palette.neutralLighter,\r\n },\r\n\r\n '& .pager-previous, & .pager-next, & .glyphicon-triangle-left, & .glyphicon-triangle-right': {\r\n fontFamily: iconFontFamily,\r\n color: palette.neutralSecondary,\r\n background: 'transparent',\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n padding: '2px 5px',\r\n height: 32,\r\n lineHeight: '32px',\r\n marginTop: '-7px',\r\n outline: 'none',\r\n },\r\n\r\n '& .pager-previous, & .pager-next': {\r\n '&:focus': {\r\n outline: `1px solid ${palette.neutralSecondary}`,\r\n outlineOffset: '-2px',\r\n },\r\n },\r\n\r\n '& .pager-previous:hover, & .pager-next:hover': {\r\n borderRadius: 2,\r\n background: palette.neutralLighter,\r\n },\r\n\r\n '& .pager-previous-disabled, & .pager-next-disabled': {\r\n fontFamily: iconFontFamily,\r\n color: '#BEBBB8',\r\n background: 'transparent',\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n padding: '2px 5px',\r\n height: 32,\r\n lineHeight: '32px',\r\n marginTop: '-7px',\r\n },\r\n\r\n '& .pager-previous-disabled:before, & .pager-previous:before': {\r\n content: '\"\\\\E76B\"',\r\n },\r\n\r\n '& .pager-next-disabled:before, & .pager-next:before': {\r\n content: '\"\\\\E76C\"',\r\n },\r\n\r\n '& .pager-totalCount': {\r\n verticalAlign: 'unset',\r\n marginLeft: 4,\r\n },\r\n },\r\n\r\n '& .pagination-control': {\r\n textAlign: 'left',\r\n\r\n '& .text': {\r\n display: 'inline-block',\r\n width: 'auto',\r\n },\r\n\r\n '& .page-size-selector': {\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n height: 32,\r\n textAlign: 'center',\r\n margin: '0 12px',\r\n width: '70px !important',\r\n display: 'inline-block',\r\n borderRadius: 2,\r\n boxSizing: 'border-box',\r\n color: palette.neutralPrimary,\r\n },\r\n },\r\n\r\n});\r\n\r\nexport const btnStyle = () => {\r\n const primary = {\r\n height: 32,\r\n minWidth: 80,\r\n background: palette.themePrimary,\r\n borderRadius: 2,\r\n textAlign: 'center',\r\n color: palette.white,\r\n boxSizing: 'border-box',\r\n\r\n '&:hover': {\r\n background: palette.themeDarkAlt,\r\n },\r\n\r\n '&:focus': {\r\n background: palette.themePrimary,\r\n outline: 'none',\r\n },\r\n\r\n '&:active': {\r\n background: palette.themeDark,\r\n },\r\n\r\n '&:disabled': {\r\n background: palette.neutralLighter,\r\n color: palette.neutralTertiary,\r\n },\r\n };\r\n\r\n return {\r\n '.btn-primary': primary,\r\n '.btn-hero': primary,\r\n\r\n '.btn-default': {\r\n height: 32,\r\n minWidth: 80,\r\n background: palette.white,\r\n borderRadius: 2,\r\n textAlign: 'center',\r\n color: palette.neutralPrimary,\r\n border: `1px solid ${palette.neutralSecondaryAlt}`,\r\n\r\n '&:hover': {\r\n background: palette.neutralLighter,\r\n },\r\n\r\n '&:focus': {\r\n background: palette.neutralLight,\r\n },\r\n\r\n '&:disabled': {\r\n background: palette.neutralLighter,\r\n color: palette.neutralTertiary,\r\n },\r\n },\r\n };\r\n};\r\n\r\nconst controlStyle = () => ({\r\n '.form-control': {\r\n '-webkit-box-shadow': 'none',\r\n backgroundColor: palette.white,\r\n backgroundImage: 'none',\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n borderRadius: 2,\r\n boxShadow: 'none',\r\n color: palette.neutralPrimary,\r\n display: 'block',\r\n fontSize: 14,\r\n height: 32,\r\n lineHeight: 1.5,\r\n padding: '6px 12px',\r\n transition: 'border-color .15s ease-in-out, box-shadow .15s ease-in-out',\r\n\r\n '&:active': {\r\n borderColor: palette.themePrimary,\r\n },\r\n\r\n '&:hover': {\r\n borderColor: palette.neutralPrimary,\r\n },\r\n\r\n '&:focus': {\r\n '-webkit-box-shadow': 'none',\r\n borderColor: palette.themePrimary,\r\n boxShadow: 'none',\r\n outline: 0,\r\n },\r\n },\r\n});\r\n\r\nconst addEditCommonStyle = ({ iconFontFamily = 'MsAds MDL2 Assets' }) => ({\r\n '& .add-image-content, & .image-edit-content': {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n position: 'relative',\r\n\r\n '& .add-image-label, & .edit-image-title': {\r\n fontSize: 20,\r\n fontWeight: 600,\r\n lineHeight: '27px',\r\n marginBottom: 16,\r\n },\r\n\r\n '& .add-image-description': {\r\n marginBottom: 20,\r\n paddingBottom: 32,\r\n borderBottom: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n\r\n '& .image-preview-crop-description': {\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n margin: '0 0 32px 0',\r\n },\r\n\r\n '& .image-cropper-ratio-label': {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n lineHeight: '20px',\r\n margin: '16px 0',\r\n },\r\n\r\n '& .close-dialog-button': {\r\n backgroundColor: 'transparent',\r\n color: palette.neutralSecondary,\r\n fontFamily: iconFontFamily,\r\n fontSize: 12,\r\n lineHeight: 1,\r\n position: 'absolute',\r\n right: 0,\r\n top: 0,\r\n border: 'none',\r\n background: 'none',\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n },\r\n\r\n '& .search-box-container': {\r\n width: '40%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n\r\n '& .search-box__input-group': {\r\n display: 'flex',\r\n\r\n '& input.search-box__input': {\r\n color: palette.neutralSecondary,\r\n marginLeft: -32,\r\n padding: '6px 8px 6px 32px',\r\n order: 1,\r\n },\r\n\r\n '& .search-box__icon': {\r\n position: 'relative',\r\n fontFamily: iconFontFamily,\r\n fontSize: 16,\r\n lineHeight: 1,\r\n order: 0,\r\n padding: 8,\r\n\r\n '&:before': {\r\n content: '\"\\\\E721\"',\r\n },\r\n },\r\n },\r\n\r\n '& .ba-search-box': {\r\n flex: 1,\r\n },\r\n\r\n '& .clear-search': {\r\n marginLeft: 10,\r\n border: 'none',\r\n backgroundColor: 'transparent',\r\n cursor: 'pointer',\r\n fontFamily: iconFontFamily,\r\n },\r\n },\r\n\r\n '& .sort-by-label': {\r\n display: 'none',\r\n },\r\n\r\n '& .dropdown-selector-container': {\r\n float: 'right',\r\n minWidth: '25%',\r\n\r\n '& .dropdown-toggle': {\r\n background: 'url(\"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMiAxMiI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiM0ODQ2NDQ7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMS4zNyw0bC41Mi41M0w2LDEwLjQ1LjEyLDQuNTYuNjQsNCw2LDkuNFoiLz48L3N2Zz4=\") no-repeat right 8px top 8px transparent',\r\n backgroundSize: '14px 14px',\r\n borderColor: palette.neutralSecondary,\r\n borderRadius: 2,\r\n boxShadow: 'none',\r\n color: palette.neutralPrimary,\r\n fontWeight: 'normal',\r\n height: 32,\r\n padding: '0px 28px 0px 8px',\r\n transition: 'border-color .15s ease-in-out,box-shadow .15s ease-in-out',\r\n width: '100%',\r\n '-webkit-box-shadow': 'none',\r\n '-webkit-appearance': 'none',\r\n '-moz-appearance': 'none',\r\n\r\n '&:active': {\r\n borderColor: palette.themePrimary,\r\n },\r\n\r\n '&:focus': {\r\n borderColor: palette.themePrimary,\r\n outline: 0,\r\n },\r\n\r\n '&:hover': {\r\n borderColor: palette.neutralPrimary,\r\n },\r\n\r\n '& span': {\r\n margin: 'auto 0',\r\n },\r\n\r\n '& .glyphicon-triangle-bottom': {\r\n display: 'none',\r\n },\r\n },\r\n },\r\n\r\n '& .image-picker-container': {\r\n '& .image-name-section': {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100%',\r\n marginTop: 5,\r\n marginBottom: 5,\r\n\r\n '& .image-name': {\r\n position: 'relative',\r\n left: 0,\r\n bottom: 0,\r\n width: 'auto',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n\r\n '& .glyphicon-pencil': {\r\n border: 'none',\r\n background: 'none',\r\n color: palette.themeDark,\r\n display: 'inline',\r\n fontFamily: iconFontFamily,\r\n paddingLeft: 8,\r\n position: 'relative',\r\n top: 'unset',\r\n right: 'unset',\r\n\r\n '&:before': {\r\n content: '\"\\\\E70F\"',\r\n },\r\n },\r\n },\r\n\r\n '& .image-name-container': {\r\n background: palette.white,\r\n border: 'rgba(0, 0, 0, 0.2)',\r\n boxShadow: '0px 0px 6px rgba(0, 0, 0, 0.2)',\r\n position: 'absolute',\r\n top: 90,\r\n left: 0,\r\n margin: 1,\r\n padding: 16,\r\n minWidth: 240,\r\n width: 'max-content',\r\n zIndex: 9,\r\n display: 'grid',\r\n gridTemplateColumns: 'auto auto 1fr',\r\n\r\n '& .image-name-input': {\r\n extend: controlStyle()['.form-control'],\r\n gridColumnStart: '1',\r\n gridColumnEnd: 'span 3',\r\n\r\n '& + button': {\r\n extend: btnStyle()['.btn-primary'],\r\n },\r\n },\r\n\r\n '& #image-name-field': {\r\n width: '100%',\r\n },\r\n\r\n '& button': {\r\n marginLeft: 0,\r\n marginTop: 16,\r\n\r\n '& ~ button': {\r\n marginLeft: 8,\r\n },\r\n },\r\n },\r\n\r\n '& .replace-failed-video': {\r\n position: 'absolute',\r\n right: 43,\r\n bottom: 30,\r\n padding: '13px 5px',\r\n border: 'none',\r\n },\r\n\r\n '& .replace-failed-video:hover': {\r\n background: '#e1dfdd',\r\n },\r\n\r\n '& button.glyphicon-remove': {\r\n extend: floatButtonStyle().floatButton,\r\n position: 'absolute',\r\n top: 'unset',\r\n right: 5,\r\n bottom: 31,\r\n fontFamily: iconFontFamily,\r\n fontSize: 16,\r\n lineHeight: 1,\r\n float: 'right',\r\n borderRadius: 0,\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n\r\n '&.circular-hover': {\r\n backgroundColor: `${palette.white}d4`,\r\n padding: 0,\r\n borderRadius: 0,\r\n height: 32,\r\n width: 32,\r\n right: 0,\r\n bottom: 36,\r\n },\r\n\r\n '&.circular-hover:hover': {\r\n backgroundColor: `${palette.themeDarkAlt}ff`,\r\n '&:before': {\r\n color: palette.white,\r\n },\r\n },\r\n },\r\n\r\n '& .image-delete.glyphicon.glyphicon-remove': {\r\n display: 'inline',\r\n },\r\n\r\n '& .image-info-section': {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100%',\r\n whiteSpace: 'nowrap',\r\n '& .image-id': {\r\n fontWeight: 'inherit',\r\n padding: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n },\r\n },\r\n\r\n '& .image-picker': {\r\n background: 'none',\r\n border: 'none',\r\n margin: '16px 0',\r\n padding: 0,\r\n\r\n '& .existing-images': {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n height: 'auto',\r\n justifyContent: 'space-between',\r\n\r\n '& .existing-image-container': {\r\n display: 'inline-flex',\r\n margin: '0 0 24px 0',\r\n paddingBottom: 20,\r\n\r\n '& .image-section-wrapper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n height: 202,\r\n width: 202,\r\n\r\n '& .image-section': {\r\n position: 'relative',\r\n\r\n '& .image-dimensions': {\r\n display: 'none',\r\n },\r\n\r\n '& button.existing-image': {\r\n border: '1px solid transparent',\r\n\r\n '&:before': {\r\n fontFamily: iconFontFamily,\r\n fontSize: 18,\r\n position: 'absolute',\r\n right: 5,\r\n top: 5,\r\n },\r\n\r\n '& img': {\r\n margin: 0,\r\n maxHeight: 200,\r\n maxWidth: 200,\r\n },\r\n },\r\n\r\n '&:active button.existing-image': {\r\n border: `1px solid ${palette.themePrimary}`,\r\n\r\n '&:before': {\r\n color: palette.themePrimary,\r\n content: '\"\\\\ECCB\"',\r\n },\r\n },\r\n\r\n '&:focus button.existing-image': {\r\n border: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n\r\n '&:hover button.existing-image': {\r\n border: `1px solid ${palette.neutralPrimary}`,\r\n\r\n '&:before': {\r\n color: palette.neutralPrimary,\r\n content: '\"\\\\ECCA\"',\r\n },\r\n },\r\n\r\n '& button.glyphicon-remove': {\r\n extend: floatButtonStyle().floatButton,\r\n position: 'absolute',\r\n top: 'unset',\r\n right: 1,\r\n bottom: 1,\r\n fontFamily: iconFontFamily,\r\n fontSize: 16,\r\n lineHeight: 1,\r\n float: 'right',\r\n\r\n '&:before': {\r\n content: '\"\\\\E711\"',\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .image-name-section': {\r\n bottom: 0,\r\n left: 0,\r\n position: 'absolute',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100%',\r\n\r\n '& .image-name': {\r\n position: 'relative',\r\n left: 0,\r\n bottom: 0,\r\n width: 'auto',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n\r\n '& .glyphicon-pencil': {\r\n border: 'none',\r\n background: 'none',\r\n color: palette.themeDark,\r\n display: 'inline',\r\n fontFamily: iconFontFamily,\r\n paddingLeft: 8,\r\n position: 'relative',\r\n top: 'unset',\r\n right: 'unset',\r\n\r\n '&:before': {\r\n content: '\"\\\\E70F\"',\r\n },\r\n },\r\n },\r\n\r\n '& .image-name-container': {\r\n background: palette.white,\r\n border: 'rgba(0, 0, 0, 0.2)',\r\n boxShadow: '0px 0px 6px rgba(0, 0, 0, 0.2)',\r\n left: 0,\r\n margin: 1,\r\n padding: 16,\r\n width: 220,\r\n zIndex: 9,\r\n\r\n '& .image-name-input': {\r\n extend: controlStyle()['.form-control'],\r\n\r\n '& + button': {\r\n extend: btnStyle()['.btn-primary'],\r\n },\r\n },\r\n\r\n '& #image-name-field': {\r\n width: '100%',\r\n },\r\n\r\n '& button': {\r\n marginLeft: 0,\r\n marginTop: 16,\r\n\r\n '& ~ button': {\r\n marginLeft: 8,\r\n },\r\n },\r\n },\r\n\r\n '& .image-delete.glyphicon.glyphicon-remove': {\r\n display: 'inline',\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .ba-pagination': {\r\n display: 'block',\r\n textAlign: 'center',\r\n },\r\n\r\n '& .choose-file-description': {\r\n borderTop: `1px solid ${palette.neutralSecondary}`,\r\n paddingTop: 32,\r\n },\r\n\r\n '& .edit-url-description': {\r\n paddingTop: 16,\r\n },\r\n\r\n '& .file-picker-react-wrapper': {\r\n margin: 0,\r\n padding: '14px 0 0 0',\r\n width: '100%',\r\n\r\n '& .file-picker-btn': {\r\n extend: btnStyle()['.btn-default'],\r\n display: 'inline-block',\r\n float: 'none',\r\n marginLeft: 0,\r\n\r\n '& ~ .file-text': {\r\n display: 'inline-block',\r\n border: 'none',\r\n },\r\n },\r\n },\r\n\r\n '& .file-drag-container': {\r\n position: 'relative',\r\n width: '100%',\r\n height: '190px',\r\n marginTop: '8px',\r\n overflow: 'hidden',\r\n\r\n '& .file-picker-react-wrapper': {\r\n },\r\n\r\n '& .file-picker-react-wrapper.disabled': {\r\n display: 'none',\r\n },\r\n },\r\n\r\n '& .add-image-button-bar, & .image-edit-actions': {\r\n borderTop: '1px solid #EDEBE9',\r\n bottom: 0,\r\n margin: '0 -16px',\r\n padding: '16px',\r\n position: 'fixed',\r\n width: '100%',\r\n\r\n '& button ~ button': {\r\n marginLeft: 12,\r\n },\r\n },\r\n\r\n '& .image-cropper-in-edit': {\r\n margin: 0,\r\n padding: 0,\r\n },\r\n\r\n '& .edit-preview-section': {\r\n display: 'flex',\r\n\r\n '& .edit-section': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n },\r\n\r\n '& > .error': {\r\n color: '#A80000',\r\n fontSize: 12,\r\n margin: '4px 0 0 0',\r\n },\r\n\r\n '& .HelpTopic, & .a': {\r\n color: '#106ebe',\r\n textDecoration: 'underline',\r\n },\r\n },\r\n});\r\n\r\nexport const getEditImageStyle = (_, { iconFontFamily = 'MsAds MDL2 Assets' }) => ({\r\n editImageStyle: {\r\n '& .image-edit-content .edit-image-title': {\r\n fontSize: 14,\r\n fontFamily: '\"Segoe UI\"',\r\n fontWeight: '400',\r\n fontStyle: 'normal',\r\n },\r\n '& .image-edit-content .close-dialog-button': {\r\n top: 10,\r\n right: 5,\r\n },\r\n '& .image-edit-content .image-preview-crop-description': {\r\n fontSize: 12,\r\n margin: '10px 0',\r\n },\r\n '& .image-edit-content .image-cropper-in-edit': {\r\n padding: 5,\r\n marginTop: 30,\r\n },\r\n '& .image-edit-content .image-cropper-in-edit .image-cropper-ratio-label': {\r\n fontSize: 12,\r\n margin: '10px 0 5px 0',\r\n width: '100%',\r\n fontWeight: '700',\r\n textAlign: 'center',\r\n },\r\n '& .image-edit-content .image-replace-description': {\r\n fontSize: 12,\r\n margin: '10px 0',\r\n },\r\n '& .image-edit-content .preview-section': {\r\n border: '1px solid #CCCCCC',\r\n },\r\n '& .image-edit-content .image-edit-actions': {\r\n marginTop: 40,\r\n },\r\n '& .edit-image-content-container': {\r\n minWidth: 1350,\r\n width: 1350,\r\n },\r\n ...getCommonPreviewContainerStyles(),\r\n ...addEditCommonStyle({ iconFontFamily }),\r\n ...paginationStyle({ iconFontFamily }),\r\n ...panelStyle(),\r\n ...editImageCommonStyle(),\r\n },\r\n previewPlacementContainerRoot: {\r\n display: 'flex',\r\n '& > div:first-child': {\r\n top: -20,\r\n },\r\n },\r\n adPreviewCarousel133x100Container: {\r\n '& .ad-placement-card-preview .carousel-control': {\r\n '& .glyphicon-chevron-left, & .glyphicon-chevron-right': {\r\n top: '5px !important',\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const getAddImageStyle = (_, { iconFontFamily = 'MsAds MDL2 Assets' }) => ({\r\n addImageStyle: {\r\n '& .video-inactive': {\r\n paddingTop: 60,\r\n },\r\n '& .video-inactive:hover': {\r\n cursor: 'not-allowed',\r\n },\r\n '& .add-image-content': {\r\n fontSize: 12,\r\n position: 'relative',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n ['& .image-selector-for-thumbnail .user-image-picker-container .image-picker-container,' +\r\n '& .image-selector-for-thumbnail .stock-image-picker-container .image-picker-container']: {\r\n maxHeight: '50vh',\r\n maxWidth: '60vw',\r\n },\r\n ['& .user-image-picker-container, .stock-image-picker-container, .image-suggestion-picker-container' +\r\n ', .image-suggestion-picker-container > .react-block-ui-none, .image-suggestion-picker-container > .react-block-ui-none > .react-block-ui-none, .image-suggestion-picker-container > .react-block-ui-none > .react-block-ui']: {\r\n flexGrow: 1,\r\n overflow: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n },\r\n '& .social-media-container': {\r\n flexGrow: 1,\r\n overflow: 'auto',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n '& .suggestion-error-invalid': {\r\n marginTop: 16,\r\n textAlign: 'center',\r\n color: 'red',\r\n },\r\n '& .suggestion-error img': {\r\n marginLeft: 129,\r\n marginBottom: 24,\r\n },\r\n '& .desc': {\r\n width: '100%',\r\n },\r\n },\r\n '& .add-image-content .disable-mouse': {\r\n pointerEvents: 'none',\r\n },\r\n '& .add-image-content .add-image-label': {\r\n marginBottom: 15,\r\n fontSize: 14,\r\n fontFamily: '\"Segoe UI\"',\r\n fontWeight: '400',\r\n fontStyle: 'normal',\r\n },\r\n '& .add-image-description': {\r\n marginBottom: 20,\r\n paddingBottom: 32,\r\n borderBottom: `1px solid ${palette.neutralSecondary}`,\r\n },\r\n '& .add-image-content .add-image-description': {\r\n marginBottom: 5,\r\n },\r\n '& .add-image-content .search-box-container': {\r\n width: '45%',\r\n float: 'left',\r\n },\r\n '& .add-image-content .search-box-container .search-box__input-group .search-box__input.form-control': {\r\n borderRadius: '0',\r\n },\r\n '& .add-image-content .search-box-container .search-box__input-group .search-box__icon': {\r\n fontSize: 12,\r\n },\r\n '& .add-image-content .add-image-button-bar': {\r\n marginTop: 15,\r\n },\r\n '& .add-image-content .dropdown-selector-container': {\r\n float: 'right',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector': {\r\n position: 'relative',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector button.dropdown-toggle': {\r\n borderRadius: '0',\r\n minWidth: 190,\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector button.dropdown-toggle .icon-right.glyphicon-triangle-bottom': {\r\n paddingTop: 3,\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .list-selector-content': {\r\n border: 'none',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .empty-message': {\r\n position: 'absolute',\r\n padding: '5px 10px',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .list-selector-item': {\r\n padding: '5px 10px',\r\n margin: '0',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .list-selector-item:hover': {\r\n cursor: 'pointer',\r\n backgroundColor: '#f5f5f5',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .list-selector-item.selected': {\r\n background: '#E7F0F6',\r\n },\r\n '& .add-image-content .dropdown-selector-container .ba-dropdown-selector .ba-list-selector .list-selector-item .item-actions': {\r\n float: 'right',\r\n },\r\n '& .add-image-content .sort-by-label': {\r\n paddingTop: 9,\r\n paddingRight: 5,\r\n float: 'right',\r\n },\r\n '& .add-image-content .image-picker': {\r\n marginTop: 15,\r\n marginBottom: 5,\r\n backgroundColor: '#f4f4f4',\r\n padding: 15,\r\n border: '1px solid #bbb',\r\n },\r\n '& .add-image-content .image-picker .existing-images': {\r\n overflowY: 'auto',\r\n height: 400,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container': {\r\n position: 'relative',\r\n display: 'inline-block',\r\n padding: '0',\r\n margin: 10,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container:hover .image-dimensions, .add-image-content .image-picker .existing-images .existing-image-container:hover .image-edit.glyphicon.glyphicon-pencil, .add-image-content .image-picker .existing-images .existing-image-container:hover .image-delete.glyphicon.glyphicon-remove': {\r\n display: 'inline',\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .existing-image': {\r\n display: 'inline-block',\r\n position: 'relative',\r\n cursor: 'pointer',\r\n border: 'none',\r\n background: 'none',\r\n padding: '0',\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .existing-image img': {\r\n margin: 15,\r\n width: 225,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-dimensions': {\r\n display: 'none',\r\n position: 'absolute',\r\n bottom: 15,\r\n left: 15,\r\n textIndent: 5,\r\n color: 'white',\r\n backgroundColor: 'rgba(27,27,27,0.616)',\r\n width: 225,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-name-container': {\r\n position: 'absolute',\r\n left: 15,\r\n bottom: '0',\r\n marginBottom: -15,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-name-container input': {\r\n width: 100,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-name-container button': {\r\n marginLeft: 3,\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-name-container [role=alert]': {\r\n position: 'absolute',\r\n },\r\n '& .add-image-content .image-picker .existing-images .existing-image-container .image-name': {\r\n position: 'absolute',\r\n width: 225,\r\n left: 15,\r\n bottom: '0',\r\n marginBottom: -5,\r\n textAlign: 'center',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n },\r\n '& .existing-image-container .upload-progress': {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flexDirection: 'column',\r\n },\r\n '& .add-image-content .file-picker-react-wrapper': {\r\n marginTop: 5,\r\n marginBottom: 5,\r\n },\r\n '& .add-image-content .pagination-control-container': {\r\n marginBottom: 10,\r\n },\r\n '& .add-image-content .pagination-control-container .ba-pagination>*': {\r\n display: 'inline',\r\n },\r\n '& .add-image-content .pagination-control-container .pager-input': {\r\n border: '1px solid #BBB',\r\n width: 25,\r\n padding: '0 3px',\r\n marginRight: 5,\r\n },\r\n '& .add-image-content .pagination-control-container .btn.btn-default': {\r\n border: 'none',\r\n },\r\n '& .add-image-content .pagination-control-container .btn.btn-default:disabled': {\r\n backgroundColor: 'inherit',\r\n },\r\n '& .add-image-content .pagination-control-container .btn.btn-default:disabled .glyphicon': {\r\n color: '#a2a2a2',\r\n },\r\n '& .add-image-content .pagination-control-container span': {\r\n marginRight: 5,\r\n },\r\n '& .add-image-content .existing-opt-in-disclaimer': {\r\n marginTop: 15,\r\n\r\n '& .middle-info.btn-link': {\r\n paddingRight: 0,\r\n },\r\n\r\n '& .btn-link': {\r\n color: palette.themePrimary,\r\n },\r\n },\r\n '& .add-image-button': {\r\n margin: '10px 0',\r\n background: '#008272',\r\n },\r\n '& .panel-body > .react-block-ui-none, .panel-body > .react-block-ui': {\r\n height: '100%',\r\n },\r\n '& .add-image-content-container': {\r\n width: 1059,\r\n height: '100%',\r\n '&.image-selector-for-thumbnail': {\r\n width: '100%',\r\n },\r\n },\r\n\r\n '& .image-suggestion-picker-container': {\r\n '& + div > div > div, .react-block-ui > div:last-child > div > div': {\r\n flexDirection: 'column',\r\n },\r\n '& + div .blocker-image, .react-block-ui > div:last-child > div > div > .blocker-image': {\r\n margin: '0 auto 8px auto !important',\r\n },\r\n },\r\n '& .image-suggestion-picker-container > div > .subdomain-fields': {\r\n marginTop: 16,\r\n '& .divider': {\r\n display: 'inline-block',\r\n marginLeft: 10,\r\n marginRight: 10,\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n },\r\n },\r\n '& .image-suggestion-picker-container > div > .suggestion-error': {\r\n marginTop: 16,\r\n display: 'inline-block',\r\n marginLeft: 271,\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n '& img': {\r\n marginLeft: 129,\r\n marginBottom: 24,\r\n },\r\n '& .suggestion-error-invalid': {\r\n marginTop: 16,\r\n color: 'red',\r\n },\r\n },\r\n\r\n ...addEditCommonStyle({ iconFontFamily }),\r\n ...paginationStyle({ iconFontFamily }),\r\n ...panelStyle(),\r\n '& .add-video-content-container .upload-choice-group': {\r\n marginTop: -4,\r\n '& .ms-Label': {\r\n fontWeight: 400,\r\n marginBottom: 6,\r\n },\r\n },\r\n '& .add-video-content-container .ms-ChoiceField:first-child': {\r\n marginTop: 26,\r\n },\r\n '& .add-video-content-container .ms-ChoiceField:nth-child(2)': {\r\n marginTop: 10,\r\n },\r\n '& .add-video-content-container .ms-ChoiceField-field': {\r\n padding: 0,\r\n fontWeight: 400,\r\n },\r\n '& .add-video-content-container .upload-local-file-container': {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n marginTop: 20,\r\n marginLeft: 26,\r\n },\r\n '& .add-video-content-container .upload-progress-container': {\r\n marginLeft: 26,\r\n paddingTop: 4,\r\n '& .bar-upload-progress': {\r\n width: 400,\r\n },\r\n '& .bar-upload-progress-text': {\r\n marginTop: -10,\r\n },\r\n },\r\n '& .add-video-content-container .cancel-upload-button': {\r\n marginLeft: 26,\r\n },\r\n '& .add-video-content-container .file-picker-input': {\r\n display: 'inline-block',\r\n width: 400,\r\n },\r\n '& .add-video-content-container .file-picker-container': {\r\n display: 'inline-block',\r\n marginLeft: 8,\r\n '& .file-picker-react-wrapper': {\r\n padding: 0,\r\n },\r\n },\r\n '& .add-video-content-container .image-url-container': {\r\n background: palette.white,\r\n width: 500,\r\n display: 'flex',\r\n marginTop: 20,\r\n marginLeft: 26,\r\n '& .image-url-input': {\r\n extend: controlStyle()['.form-control'],\r\n width: 400,\r\n display: 'inline-block',\r\n },\r\n\r\n '& #image-url-field, #image-description-field': {\r\n width: '100%',\r\n },\r\n\r\n '& .image-url-button': {\r\n extend: btnStyle()['.btn-default'],\r\n display: 'inline-block',\r\n marginLeft: 8,\r\n width: 130,\r\n },\r\n },\r\n },\r\n '@global': {\r\n '.popover-content': {\r\n overflow: 'auto',\r\n 'max-height': '500px',\r\n },\r\n },\r\n});\r\n\r\nexport const getStockPhotoFilterStyle = (components, { palette: themePalette = {} }) => ({\r\n filterContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n '& > .predicate-list': {\r\n paddingLeft: 0,\r\n },\r\n '& .add-filter-button': {\r\n background: 'transparent',\r\n marginLeft: 0,\r\n '&:focus': {\r\n background: 'transparent',\r\n },\r\n '&:focus:after': {\r\n border: 0,\r\n },\r\n },\r\n '& .filter-bar-button': {\r\n height: '56px',\r\n border: 0,\r\n '&:focus:after': {\r\n border: 0,\r\n },\r\n '& .iconba': {\r\n color: themePalette.themePrimary,\r\n },\r\n },\r\n '& .btn:focus': {\r\n outline: '1px solid',\r\n },\r\n '& .selector-placeholder.labels-selector': predicateValueEditorStyle.selector({ palette: themePalette }),\r\n },\r\n});\r\n\r\nexport const getCircleProgressStyle = () => ({\r\n circle: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n '& .radial-progress-text': {\r\n textAlign: 'center',\r\n display: 'block',\r\n color: 'white',\r\n fontSize: 10,\r\n fontWeight: 600,\r\n },\r\n },\r\n});\r\n","// originally from image-experience/imageCommonStyles, so common across legacy UI and ui-next\r\n\r\nexport const getCommonPreviewContainerStyles = () => ({\r\n '& .new-responsive-ad-preview-container': {\r\n fontFamily: '\"Segoe UI\",\"Segoe WP\",Arial,Sans-Serif',\r\n fontSize: 10,\r\n height: 620,\r\n position: 'relative',\r\n },\r\n '& .new-responsive-ad-preview-container .responsive-ad-preview-content': {\r\n boxSizing: 'unset',\r\n position: 'absolute',\r\n top: '47%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n margin: '0',\r\n overflow: 'hidden',\r\n },\r\n '& .new-responsive-ad-preview-container .preview-type-string': {\r\n position: 'absolute',\r\n bottom: 75,\r\n fontSize: 12,\r\n textAlign: 'center',\r\n width: '100%',\r\n },\r\n '& .preview-section': {\r\n border: '1px solid #C8C8C8',\r\n padding: '20px 24px',\r\n\r\n '& .preview-section-title': {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n lineHeight: '24px',\r\n },\r\n },\r\n '& .disclaimer-info, & .additional-disclaimer': {\r\n fontSize: 12,\r\n lineHeight: '20px',\r\n textAlign: 'left',\r\n },\r\n '& .disclaimer-info': {\r\n padding: '0 24px 20px 24px',\r\n },\r\n\r\n '& .additional-disclaimer': {\r\n bottom: 0,\r\n padding: '0 24px',\r\n },\r\n\r\n '& .panel-content': {\r\n '@media screen and (max-width: 1400px)': {\r\n maxWidth: '90%',\r\n },\r\n },\r\n});\r\n","import PropTypes from 'prop-types';\r\n\r\nexport const i18n = PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n});\r\n\r\nexport const tileFooterConfigShape = PropTypes.shape({\r\n isRequired: PropTypes.bool,\r\n buttons: PropTypes.arrayOf(PropTypes.shape({\r\n text: PropTypes.string.isRequired,\r\n callback: PropTypes.func,\r\n })),\r\n PageNavigator: PropTypes.func,\r\n});\r\n\r\nexport const tileHeaderConfigShape = PropTypes.shape({\r\n isRequired: PropTypes.bool,\r\n isLargeHeader: PropTypes.bool,\r\n renderHeaderText: PropTypes.func,\r\n actions: PropTypes.arrayOf(PropTypes.shape({\r\n text: PropTypes.string.isRequired,\r\n callback: PropTypes.func,\r\n })),\r\n i18n: i18n.isRequired,\r\n as: PropTypes.elementType,\r\n moreOptionsLabel: PropTypes.string,\r\n actionComponentType: PropTypes.oneOf(['OverflowSet', 'DropdownButton']),\r\n});\r\n\r\nexport const tileContentConfigShape = PropTypes.shape({\r\n styles: PropTypes.shape({\r\n root: PropTypes.shape({\r\n width: PropTypes.string,\r\n height: PropTypes.string,\r\n }),\r\n }),\r\n shimmerLineCount: PropTypes.number,\r\n onRenderShimmer: PropTypes.func,\r\n isShimmerRequired: PropTypes.bool,\r\n});\r\n","import { getTheme } from '@fluentui/react';\r\n\r\nconst { palette } = getTheme();\r\n\r\nconst mobileMaxWidth = 600;\r\nconst mobileDeviceQuery = `(max-width:${mobileMaxWidth}px)`;\r\nconst mobileDevice = `@media ${mobileDeviceQuery}`;\r\n\r\nexport const getStyles = () => {\r\n const tileContainer = {\r\n minHeight: '100px',\r\n marginBottom: '16px',\r\n width: '520px',\r\n fontSize: '14px',\r\n color: '#333333',\r\n display: 'grid',\r\n float: 'left',\r\n gridTemplateColumns: '100%',\r\n background: palette.white,\r\n 'box-shadow': '0px 1.6px 3.6px rgba(0, 0, 0, 0.132)',\r\n 'border-radius': '2px',\r\n [mobileDevice]: {\r\n width: 'auto',\r\n },\r\n };\r\n\r\n const wideTileContainer = {\r\n width: '1056px !important',\r\n };\r\n\r\n const tileSection = {\r\n paddingLeft: '16px',\r\n paddingRight: '16px',\r\n };\r\n\r\n const headerBorder = {\r\n borderBottom: `solid 1px ${palette.neutralLight}`,\r\n };\r\n\r\n const headerContainer = {\r\n gridRow: '1',\r\n marginTop: '9px',\r\n marginBottom: '9px',\r\n display: 'flex',\r\n };\r\n\r\n const dropdownContainer = {\r\n display: 'flex',\r\n };\r\n\r\n const closeButton = {\r\n color: palette.neutralSecondary,\r\n '&:hover': {\r\n color: palette.neutralSecondary,\r\n background: 'transparent',\r\n },\r\n };\r\n\r\n const contentContainer = {\r\n gridRow: '2',\r\n 'margin-top': '16px',\r\n 'margin-bottom': '8px',\r\n };\r\n\r\n const footerContainer = {\r\n gridRow: '3',\r\n 'margin-top': '8px',\r\n 'margin-bottom': '16px',\r\n };\r\n const footerContentContainer = {\r\n minHeight: '30px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n position: 'relative',\r\n '& a': {\r\n paddingLeft: '20px',\r\n paddingRight: '20px',\r\n fontWeight: 600,\r\n },\r\n '& .pager-navigation': {\r\n marginTop: 0,\r\n right: 0,\r\n position: 'absolute',\r\n },\r\n };\r\n\r\n const footerButton = {\r\n backgroundColor: 'white',\r\n float: 'left',\r\n 'font-style': 'normal',\r\n 'font-weight': '600',\r\n 'font-size': '14px',\r\n 'line-height': '20px',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n };\r\n\r\n const headerText = {\r\n fontWeight: '600',\r\n fontStyle: 'normal',\r\n display: 'inline-block',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n height: '100%',\r\n width: 'auto',\r\n color: '#323130',\r\n marginTop: '3px',\r\n marginBottom: '3px',\r\n };\r\n\r\n const headerHelp = {\r\n flexGrow: 1,\r\n alignSelf: 'flex-end',\r\n };\r\n\r\n const smallHeaderText = {\r\n fontSize: '18px',\r\n 'line-height': '24px',\r\n whiteSpace: 'nowrap',\r\n [mobileDevice]: {\r\n whiteSpace: 'initial',\r\n },\r\n };\r\n\r\n const largeHeaderText = {\r\n fontSize: '28px',\r\n };\r\n\r\n return {\r\n tileSection,\r\n headerBorder,\r\n headerContainer,\r\n headerText,\r\n headerHelp,\r\n smallHeaderText,\r\n largeHeaderText,\r\n dropdownContainer,\r\n closeButton,\r\n contentContainer,\r\n tileContainer,\r\n wideTileContainer,\r\n footerContainer,\r\n footerContentContainer,\r\n footerButton,\r\n };\r\n};\r\n\r\nexport const tileStyles = {\r\n shimmerItem: { root: { marginBottom: '16px' } },\r\n};\r\n\r\n","import _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport React, { useState, useCallback, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { OverflowSet } from '@fluentui/react/lib/OverflowSet';\r\nimport { IconButton, CommandBarButton } from '@fluentui/react/lib/Button';\r\n\r\nimport { tileHeaderConfigShape } from './shared-props';\r\nimport { getStyles } from './get-styles';\r\n\r\nconst getDropdownItems = actions => _.map(actions, ({ text, callback, disabled }) => ({\r\n key: text,\r\n name: text,\r\n text,\r\n onClick: callback,\r\n disabled,\r\n}));\r\n\r\nexport const actionComponentTypes = {\r\n OverflowSet: 'OverflowSet',\r\n DropdownButton: 'DropdownButton',\r\n};\r\n\r\nexport const TileHeaderUnstyled = (props) => {\r\n const {\r\n classes,\r\n config: {\r\n renderHeaderText = () => null,\r\n helpIcon,\r\n isRequired,\r\n actions: headerOptions = [],\r\n onCloseTile,\r\n i18n,\r\n isLargeHeader = false,\r\n as: Component = 'h3',\r\n moreOptionsLabel,\r\n actionComponentType = actionComponentTypes.OverflowSet,\r\n },\r\n classPrefix = '',\r\n } = props;\r\n\r\n const hasHeaderOptions = !_.isEmpty(headerOptions);\r\n const items = getDropdownItems(headerOptions);\r\n\r\n const onRenderOverflowButton = () => {\r\n const buttonStyles = {\r\n root: {\r\n minWidth: 0,\r\n padding: '0 4px',\r\n alignSelf: 'stretch',\r\n height: 'auto',\r\n },\r\n };\r\n return (\r\n <IconButton\r\n title={i18n.getString(_TL_('More options'))}\r\n styles={buttonStyles}\r\n menuIconProps={{ iconName: 'More' }}\r\n menuProps={{ items }}\r\n aria-label={moreOptionsLabel}\r\n />\r\n );\r\n };\r\n\r\n const ActionOverflowSet = useCallback(() => (\r\n <OverflowSet\r\n items={[]}\r\n overflowItems={items}\r\n onRenderOverflowButton={() => onRenderOverflowButton()}\r\n />\r\n ), [items, onRenderOverflowButton]);\r\n\r\n const [selectedAction, setSelectedAction] = useState(hasHeaderOptions ? items[0].text : null);\r\n\r\n const ActionDropdownButton = useCallback(() => {\r\n const newItems = items.map(item => ({\r\n ...item,\r\n onClick: (...args) => {\r\n item.onClick(...args);\r\n setSelectedAction(item.text);\r\n },\r\n }));\r\n\r\n return (<CommandBarButton\r\n text={selectedAction}\r\n menuProps={{ items: newItems }}\r\n />);\r\n }, [items, selectedAction]);\r\n\r\n useEffect(() => {\r\n if (!_.isEmpty(items) && actionComponentType === actionComponentTypes.DropdownButton) {\r\n setSelectedAction(items[0].text);\r\n }\r\n }, [actionComponentType]);\r\n\r\n useEffect(() => {\r\n if (!_.isEmpty(items) &&\r\n actionComponentType === actionComponentTypes.DropdownButton &&\r\n _.isFunction(items[0].onClick)) {\r\n items[0].onClick();\r\n }\r\n }, [actionComponentType]);\r\n\r\n if (isRequired !== true) { return null; }\r\n\r\n const headerClasses = classNames(\r\n `${classPrefix}tile-header-text`,\r\n classes.headerText,\r\n isLargeHeader ? classes.largeHeaderText : classes.smallHeaderText\r\n );\r\n\r\n return (\r\n <div className={classNames(classes.headerContainer, `${classPrefix}tile-header-container`, 'tile-header-container')}>\r\n <Component className={headerClasses}>\r\n {renderHeaderText()}\r\n </Component>\r\n <div className={classNames(`${classPrefix}tile-header-help`, classes.headerHelp, 'tile-header-help')}>\r\n {helpIcon}\r\n </div>\r\n {hasHeaderOptions ? (\r\n <div className={classNames(`${classPrefix}dropdown-container`, classes.dropdownContainer, 'dropdown-container')}>\r\n {actionComponentType === actionComponentTypes.OverflowSet && (<ActionOverflowSet />)}\r\n {actionComponentType === actionComponentTypes.DropdownButton && (<ActionDropdownButton />)}\r\n </div>\r\n ) : null}\r\n {onCloseTile &&\r\n <IconButton\r\n className={classes.closeButton}\r\n onClick={onCloseTile}\r\n iconProps={{ iconName: 'Cancel' }}\r\n />\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nTileHeaderUnstyled.propTypes = {\r\n classes: PropTypes.shape(_.mapObject(getStyles(), _.constant(PropTypes.string.isRequired)))\r\n .isRequired,\r\n config: tileHeaderConfigShape,\r\n classPrefix: PropTypes.string,\r\n};\r\n\r\nTileHeaderUnstyled.defaultProps = {\r\n config: {\r\n isRequired: false,\r\n actions: [],\r\n onCloseTile: undefined,\r\n renderHeaderText: () => null,\r\n helpIcon: null,\r\n moreOptionsLabel: null,\r\n actionComponentType: actionComponentTypes.OverflowSet,\r\n },\r\n classPrefix: '',\r\n};\r\n\r\nexport const TileHeader = withDefaultStyles(\r\n TileHeaderUnstyled,\r\n getStyles\r\n);\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { Button } from '@bingads-webui-react/primitive-with-signal';\r\nimport { Link } from '@bingads-webui-react/fabric-with-signal';\r\n\r\nimport { tileFooterConfigShape } from './shared-props';\r\nimport { getStyles } from './get-styles';\r\n\r\nexport const TileFooterUnstyled = (props) => {\r\n const {\r\n classes,\r\n config: {\r\n buttons = [],\r\n isRequired = false,\r\n PageNavigator = null,\r\n footerTips = null,\r\n },\r\n classPrefix = '',\r\n } = props;\r\n if (!isRequired) { return null; }\r\n const hasButtons = !_.isEmpty(buttons);\r\n return (\r\n <div className={classes.footerContainer}>\r\n <div className={classNames(classes.footerContentContainer, `${classPrefix}tile-buttons`, 'tile-buttons')}>\r\n {hasButtons ? buttons.map(btn => (\r\n btn.type === 'link' ?\r\n (\r\n <Link\r\n href={btn.href}\r\n key={buttons.indexOf(btn)}\r\n name={btn.name || btn.text}\r\n disabled={btn.disabled || false}\r\n title={btn.text}\r\n >\r\n {btn.text}\r\n </Link>\r\n ) :\r\n (\r\n <Button\r\n className={classes.footerButton}\r\n key={btn.text}\r\n btnStyle={btn.type}\r\n onClick={btn.callback}\r\n name={btn.name || btn.text}\r\n disabled={btn.disabled || false}\r\n title={btn.text}\r\n >\r\n {btn.text}\r\n </Button>\r\n )\r\n )) : null}\r\n {PageNavigator && <PageNavigator />}\r\n </div>\r\n { footerTips }\r\n </div>\r\n );\r\n};\r\n\r\nTileFooterUnstyled.propTypes = {\r\n classes: PropTypes.shape(_.mapObject(getStyles(), _.constant(PropTypes.string.isRequired)))\r\n .isRequired,\r\n config: tileFooterConfigShape,\r\n classPrefix: PropTypes.string,\r\n};\r\n\r\nTileFooterUnstyled.defaultProps = {\r\n config: {\r\n isRequired: false,\r\n buttons: [],\r\n },\r\n classPrefix: '',\r\n};\r\n\r\nexport const TileFooter = withDefaultStyles(\r\n TileFooterUnstyled,\r\n getStyles\r\n);\r\n","import _ from 'underscore';\r\nimport React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { Shimmer } from '@fluentui/react';\r\n\r\nimport {\r\n tileFooterConfigShape as footerConfigProp,\r\n tileHeaderConfigShape as headerConfigProp,\r\n tileContentConfigShape as contentConfigPro,\r\n} from './shared-props';\r\nimport { getStyles, tileStyles } from './get-styles';\r\nimport { TileHeader } from './tile-header';\r\nimport { TileFooter } from './tile-footer';\r\n\r\nexport const SharedTileUnstyled = (props) => {\r\n const {\r\n config: {\r\n header: headerConfig,\r\n footer: footerConfig,\r\n content: contentConfig,\r\n tileClassName,\r\n tileId,\r\n tileRef,\r\n wide = false,\r\n },\r\n isLoading,\r\n classes,\r\n children,\r\n classPrefix = '',\r\n } = props;\r\n\r\n const { isLargeHeader = false } = headerConfig || {};\r\n\r\n const {\r\n onRenderShimmer,\r\n styles: {\r\n root = {},\r\n } = {},\r\n shimmerLineCount = 3,\r\n isShimmerRequired = false,\r\n } = contentConfig || {};\r\n\r\n const isShowingShimmer = useMemo(() =>\r\n isLoading && isShimmerRequired, [isLoading, isShimmerRequired]);\r\n\r\n const loadingItems = useMemo(() => {\r\n if (_.isFunction(onRenderShimmer)) {\r\n return onRenderShimmer();\r\n }\r\n const items = [];\r\n const shimmerWidthList = ['292px', '254px', '219px'];\r\n _.map(_.range(shimmerLineCount), (index) => {\r\n items.push(<Shimmer\r\n key={index}\r\n width={shimmerWidthList[index % _.size(shimmerWidthList)]}\r\n styles={tileStyles.shimmerItem}\r\n />);\r\n });\r\n return (\r\n <div className={classNames(`${classPrefix}tile-shimmer`, classes.contentContainer, classes.tileSection, 'tile-shimmer')}>\r\n {items}\r\n </div>\r\n );\r\n }, [classPrefix, classes.contentContainer, classes.tileSection, onRenderShimmer, shimmerLineCount]);\r\n\r\n return (\r\n <div id={tileId} className={classNames(`${classPrefix}tile-container`, tileClassName, 'tile-container')}>\r\n <div\r\n className={classNames(classes.tileContainer, wide ? classes.wideTileContainer : '', `${classPrefix}tile-content`, 'tile-content')}\r\n style={root}\r\n ref={tileRef}\r\n >\r\n {\r\n headerConfig &&\r\n <span className={classNames(classes.tileSection, isLargeHeader ? '' : classes.headerBorder, `${classPrefix}tile-header`, 'tile-header')}>\r\n <TileHeader config={headerConfig} classPrefix={classPrefix} />\r\n </span>\r\n }\r\n {\r\n isShowingShimmer && loadingItems\r\n }\r\n {\r\n !isShowingShimmer &&\r\n <div className={classNames(`${classPrefix}tile-contents-container`, classes.contentContainer, classes.tileSection, 'tile-contents-container')}>\r\n {children}\r\n </div>\r\n }\r\n {\r\n footerConfig && !isShowingShimmer &&\r\n <span className={classNames(classes.tileSection, `${classPrefix}tile-footer`, 'tile-footer')}>\r\n <TileFooter config={footerConfig} classPrefix={classPrefix} />\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nSharedTileUnstyled.propTypes = {\r\n children: PropTypes.oneOfType([\r\n PropTypes.arrayOf(PropTypes.node),\r\n PropTypes.node,\r\n ]),\r\n classes: PropTypes.shape({\r\n headerContainer: PropTypes.string,\r\n tileContainer: PropTypes.string,\r\n footerContainer: PropTypes.string,\r\n dottedContainer: PropTypes.string,\r\n contentContainer: PropTypes.string,\r\n }).isRequired,\r\n config: PropTypes.shape({\r\n tileClassName: PropTypes.string.isRequired,\r\n tileId: PropTypes.string,\r\n tileRef: PropTypes.shape({}),\r\n wide: PropTypes.bool,\r\n header: headerConfigProp,\r\n footer: footerConfigProp,\r\n content: contentConfigPro,\r\n }),\r\n isLoading: PropTypes.bool,\r\n};\r\n\r\nSharedTileUnstyled.defaultProps = {\r\n config: {},\r\n children: [],\r\n isLoading: false,\r\n};\r\n\r\nexport const SharedTile = withDefaultStyles(SharedTileUnstyled, getStyles);\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { IconButton } from '@fluentui/react/lib/Button';\r\n\r\nimport { getStyles } from './page-navigation-footer-styles';\r\n\r\nconst PageNavigationFooterUnstyled = (props) => {\r\n const {\r\n i18n,\r\n pageIndex,\r\n totalPageNumber,\r\n onNextPageClick,\r\n onPreviousPageClick,\r\n classes,\r\n allowDisable,\r\n } = props;\r\n\r\n const pageIndexContent = totalPageNumber !== 1 ?\r\n i18n.getString(_TL_('{{index}} of {{totalPageNumber}} pages'), { index: pageIndex + 1, totalPageNumber })\r\n : i18n.getString(_TL_('{{index}} of {{totalPageNumber}} page'), { index: pageIndex + 1, totalPageNumber });\r\n\r\n return (\r\n <div className={classNames(classes.pagerIcon, 'pager-navigation')} >\r\n <span className={classNames(classes.pageNumber, 'page-number')}>\r\n {pageIndexContent}\r\n </span>\r\n <IconButton\r\n className={classNames(classes.pageNavigationButton, 'previous-page')}\r\n iconProps={{ iconName: 'ChevronUp' }}\r\n ariaLabel={i18n.getString(_TL_('Previous page'))}\r\n onClick={onPreviousPageClick}\r\n disabled={allowDisable && pageIndex === 0}\r\n />\r\n <IconButton\r\n className={classNames(classes.pageNavigationButton, 'next-page')}\r\n iconProps={{ iconName: 'ChevronDown' }}\r\n ariaLabel={i18n.getString(_TL_('Next page'))}\r\n onClick={onNextPageClick}\r\n disabled={allowDisable && pageIndex === totalPageNumber - 1}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nPageNavigationFooterUnstyled.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n pageIndex: PropTypes.number.isRequired,\r\n totalPageNumber: PropTypes.number.isRequired,\r\n onNextPageClick: PropTypes.func.isRequired,\r\n onPreviousPageClick: PropTypes.func.isRequired,\r\n classes: PropTypes.shape(_.mapObject(\r\n getStyles(),\r\n _.constant(PropTypes.string.isRequired)\r\n )).isRequired,\r\n allowDisable: PropTypes.bool,\r\n};\r\n\r\nPageNavigationFooterUnstyled.defaultProps = {\r\n allowDisable: true,\r\n};\r\n\r\nexport const PageNavigationFooter = withDefaultStyles(PageNavigationFooterUnstyled, getStyles);\r\n","export const getStyles = (_, { palette = {} } = {}) => {\r\n const pagerIcon = {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n paddingRight: 4,\r\n marginTop: 8,\r\n };\r\n\r\n const pageNavigationButton = {\r\n background: 'transparent',\r\n };\r\n\r\n const pageNumber = {\r\n fontSize: 12,\r\n lineHeight: '32px',\r\n color: palette.neutralPrimary,\r\n };\r\n\r\n return {\r\n pagerIcon,\r\n pageNavigationButton,\r\n pageNumber,\r\n };\r\n};\r\n"],"names":["LANGUAGE_STRINGS","English","_TL_","German","French","Spanish","Italian","Portuguese","Dutch","Swedish","TraditionalChinese","Danish","Finnish","Norwegian","Bulgarian","Croatian","Czech","Estonian","Greek","Hungarian","Latvian","Lithuanian","Maltese","Polish","Romanian","Slovak","Slovenian","Albanian","Bosnian","Icelandic","Macedonian","Serbian","Turkish","Japanese","Russian","Hebrew","Arabic","SimplifiedChinese","Hindi","Malay","Thai","Indonesian","Tagalog","Vietnamese","pickLanguages","languages","_","reduce","memo","language","outMemo","pairs","value","LanguageSelect","_ref","className","id","ariaLabel","onChange","selected","i18n","enabledLanguageList","_useState","useState","_useState2","_slicedToArray","selectedLanguage","setSelectedLanguage","_jsx","Select","event","target","children","map","_ref2","_ref3","key","getString","defaultProps","undefined","languageAll","LanguageSelector","props","selectedLanguages","onSelectedLanguagesChanged","multiSelect","isSelectAll","useMemo","length","useContext","I18nContext","options","text","disabled","find","option","classNames","Dropdown","multiselect","placeholder","selectedOptions","onOptionSelect","styles","dropdown","width","Option","getStyles","bidSetting","marginTop","paddingLeft","maxWidth","LegacyBidSetting","React","container","activity","budgetAmount","validateWithBudget","defaultBidValue","view","useRef","useEffect","current","BidSetting","activityLogger","isAudienceCampaign","isMSStoreCampaign","withRealTimeValidation","render","$el","appendTo","remove","classes","useDefaultStyles","classnames","ref","CallToActionAriaText","forwardRef","textFieldRef","_React$useState","_React$useState2","errorMessage","setErrorMessage","maxLength","ResponsiveAd","properties","legacyI18n","buildLegacyI18n","ValidationStringMap","getErrorMessage","newValue","isString","useImperativeHandle","getData","trim","isValid","message","RemainingCharsValidatedTextField","label","componentRef","validationProps","schema","field","alwaysShowError","convertor","fromModel","CallToActionText","defaultValue","validationSchema","type","required","components","theme","callToActionContainer","_objectSpread","mergeStyles","convertToLocalStyle","actionDropdownStyles","dropdownMinWidthPx","noLeftMargin","searchboxStyle","languageContainer","top","marginBottom","langCodeMapper","ar","bg","bs","cs","da","de","el","en","es","et","fi","fr","hr","hu","is","it","iw","ja","lt","lv","mk","mt","nl","no","pl","pt","ro","ru","sk","sl","sq","sr","sv","tr","zh","getLocalLanguage","locale","split","DEFAULT_LANGUAGE","getLanguage","permissions","supportedLanguages","globalizationModelSetup","culture","LANGUAGES","lcLocale","arguments","toLocaleLowerCase","localesToTry","i","localeToTry","has","localeToLanguage","contains","IsDomesticSimplifiedChineseEnabled","LegacyCallToAction","setNewCTACallback","languageValue","ctaText","ctaAriaText","isPmaxAd","isBoostScenario","isBoostCustomCTAEnabled","isCustomCTAEnabled","valueText","languageView","isBoostCTAAriaTextEnabled","IsAmplifyEnabled","IsBoostCTAAriaTextEnabled","cta","setCta","_useState3","_useState4","ctaString","setCtaString","_useState5","_useState6","setLanguage","viewModel","ActionType","ko","isEmpty","Language","CallToAction","CallToActionLanguage","observable","isFunction","actionTypeAdapter","BackboneCallToActionAdapter","callback","selectedOption","updateCTA","defaultActionText","languageAdapter","BackboneCallToActionLanguageAdapter","updateLanguage","onGlobalShortcut","useCallback","e","document","getElementsByClassName","preventDefault","click","addEventListener","removeEventListener","_jsxs","_Fragment","concat","noop","LegacyCallToActionWithCustomValidation","updateValidation","restProps","_objectWithoutProperties","_excluded","data","ActivityContext","CallToActionValue","signal","JSON","stringify","ValidatedLegacyCallToAction","withCustomValidation","actionTextLocalization","actionType","ctaInfo","getActionText","CallToActionDescription","isMMAAutomatedCTAOptInEnabled","automatedCTAEnable","isDisplayPlusMMA","isBulk","ReactTemplate","model","b","template","helpLinkElement","HelpLink","query","boldFinalUrlElement","boldEnableMMAAutoElement","LegacyCallToActionWithLanguage","ctaContainer","langContainer","isMultimediaAd","ctaView","langView","selectedCta","setSelectedCta","selectedCtaText","setSelectedCtaText","_ref4","BackboneLanguageAdapter","noEntiyCheck","tooltipId","Label","HelpPopup","topic","LegacyCallToActionWithLanguageWithCustomValidation","onChangeFromProps","updates","extraParameters","ValidatedLegacyCallToActionWithLanguage","ValidatedLegacyCallToActionWithLanguageSection","callToAction","rest","ctaValidationProps","ValidatedFixedPanel","title","TextTitle","titleKey","topicKey","icon","CallToActionImg","iconAltText","noOverflowHidden","relativePosition","attentionBeaconProps","getExtraProps","getPanelErrorProps","LegacyDepsContext","withLegacyDeps","AReactComponent","Consumer","context","legacyDeps","palette","budgetContainer","color","neutralPrimary","padding","lineHeight","minHeight","marginLeft","border","background","display","paddingRight","fontWeight","paddingTop","fontSize","borderColor","LegacySharedBudget","campaignId","budget","validationDailyMinBudget","hideBudgetMinRecommendation","noApplyBudgetFromSharedLibrary","viewListener","clone","Backbone","budgetFactory","SharedBudgetView","newFactory","BudgetView","showBudgetMinRecommend","minimumBudget","Amount","withRealTimeUpdates","isForVNext","hideDailyBudgetOptions","currencySymbol","getCurrencySymbol","PageContext","AccountCurrencyCode","showInitialUiBlocker","showNoSharedBudgetLink","listenTo","stopListening","shoppingSettings","minWidth","LegacyShoppingSettings","shoppingSettingsRef","shoppingSettingOptions","ShoppingSettings","isCPSSelected","targetOptions","everywhere","specific","quick","getLocationOptionsMap","_defineProperty","getTheme","getLocationTargetingStyles","LocationTargeting","outline","neutralSecondary","flexDirection","maxHeight","height","locationTargetOptions","intentTarget","intentTargetOptions","radiusShimmerElement","ShimmerElementType","line","gap","SectionShimmer","Shimmer","shimmerElements","LocationTargetingSelection","selectedLocationOption","onChangeLocationOption","optionsConfig","updateErrorMessage","isLoading","targetEditorProps","strings","locationTargetingTitle","choiceGroupOptions","locationOptionsMap","ChoiceGroup","selectedKey","LocationTargetsEditor","getIntentTargetingStyles","errormessage","stackTokens","childrenGap","LocationTargetingIntent","isPeopleInLocationChecked","isPeopleSearchingForLocationChecked","onPeopleInLocationChange","onPeopleSearchingForLocationChange","titleLabel","intentTitle","checkboxLabel1","intentText1","checkboxLabel2","intentText2","prev","intent","Text","Stack","tokens","Checkbox","checked","ev","isChecked","ErrorMessages","messages","LocationTargetErrorType","mobileDeviceQuery","mobileDevice","errorStringsMap","description","fixDescription","LocationTargetErrorCalloutUnstyled","error","locationTargets","onDismiss","onLocationTargetRemove","errorStrings","isSingleLocationTarget","handleLocationTargetRemove","item","columns","name","onRender","_item","index","number","isCollapsible","isResizable","fieldName","ExpandedName","IconButton","iconProps","iconName","onClick","Callout","locationTargetErrorCallout","directionalHint","DirectionalHint","rightCenter","hidden","DetailsList","isHeaderVisible","items","layoutMode","DetailsListLayoutMode","justified","selectionMode","SelectionMode","none","LocationTargetErrorCallout","withDefaultStyles","errorMessageMap","shouldDisplayLink","LocationTargetErrorMessage","locationTarget","onErrorCalloutShow","supportedCountries","handleLinkClick","Link","as","onNotifyValidationResult","allowNegativeLocationTargeting","negativeLocationTargets","onLocationTargetsChange","onNegativeLocationTargetsChange","defaultRadiusSize","defaultRadiusUnit","mapRef","maxLocationTargets","maxRadiusInMiles","maxRadiusInKilometers","onLocationTargetsGetErrorMessage","onNegativeLocationTargetsGetErrorMessage","onSingleLocationTargetGetErrorMessage","isReadonly","getIsRadiusTarget","getIsBoundaryTarget","searchResultsFooter","searchResultsFooterOnClick","defaultSelectedSearchType","isMixedLocationSearch","showSearchTypeOptions","useInternalValidation","_props$validationProp","errorsMap","getErrorMessages","getLocationTargetsForCallout","shouldShowTargetingIntent","errorCalloutProps","setErrorCalloutProps","handleErrorCalloutHide","handleErrorCalloutShow","handleLocationTargetsValidate","_getErrorMessages","_getErrorMessages2","validationResultMessage","editorMessage","handleSingleLocationGetTargetErrorMessage","get","handleNegativeLocationTargetsValidate","_getErrorMessages3","isNegativeLocationTarget","_getErrorMessages4","toRemove","defaultGetIsRadiusTarget","defaultGetIsBoundaryTarget","Map","LocationTargetTypes","New","Included","Excluded","Recommended","areaTargetNameTypeComboGenerator","countryCode","targetType","locationDMAString","pageContext","Permissions","dynamic","getLocalizedTargetType","ENTITY_ACTION_TYPES","Delete","Add","Update","RADIUS_UNIT_MAP","mi","km","Miles","Kilometers","INTENT_TARGET_VALUE","fromLocationCriterionToBingMapTarget","filter","criterion","Criterion","Type","LocationTarget","CreateExcludedLocationTarget","CountryCode","Name","GeoPoint","Latitude","Longitude","Id","LocationId","LocationType","Radius","RadiusUnit","CreateIncludedLocationTarget","getIntentCriterion","criterions","getIntentCriterionValues","intentCriterion","peopleInLocation","peopleSearchingForLocation","IntentOption","getIntentValue","peopleInOrSearchingForLocation","getLocationsToSave","initialTargets","targets","diff","compareLocationTargetArrays","locationsToAdd","locationsToDelete","Deleted","deletedTarget","push","Added","addedTarget","Updated","updatedTarget","generateIntentTargetValues","CriterionType","LocationIntentCriterion","Campaign","fromBingMapTargetToLocationTargetEDM","locations","entityActionType","location","criterionType","isRadiusLocationTarget","targetingType","LOCATION_TARGET_TYPES","locationToSend","SelectionStatus","Status","RadiusCriterion","radiusSize","radiusUnit","LocationCriterion","EnclosingLocationIds","LesLocationType","LocationStatus","useOptionStyles","makeStyles","root","flexGrow","shorthands","optionText","optionNumber","flexShrink","colorNeutralForegroundDisabled","OptionItem","_ref$option","isNumber","mergeClasses","NoInitialDataAlert","Alert","level","dismissible","SystemErrorAlert","MaxSelectionAlert","selectedOptionsLimit","MoreOptionsInlineAlert","optionsLimit","NoDataInlineAlert","searchFilter","MultiSelectCombobox","withMultiSelectCombobox","Combobox","usePageFeedSelectorSectionStyles","position","rootLoading","spacingVerticalS","tagsList","spacingVerticalXS","gridGap","spacingHorizontalXS","flexWrap","comboAndSpinner","columnGap","spacingHorizontalM","combobox","listbox","checkIcon","PageFeedSelectorSectionImpl","onChangeFromProp","searchStartDelayMs","customizedDescription","customizedSearchPlaceholder","comboboxId","useId","fluentV1ComboboxStyles","useFluentV1Styles","_useMultiSelectContex","useMultiSelectContext","isLoadingOptions","isFirstOptionsLoad","isNoOptionsAfterFirstLoad","isMoreOptionsThanLimit","optionsLoadError","lastLoadedSearchFilter","optionsDisplayLimit","isLoadingSelectedOptions","isSelectedOptionsLimitReached","selectedOptionsLoadError","setSelectedOptions","setSearchFilterFromContext","setSearchFilter","_useDebouncedState","useDebouncedState","_useDebouncedState2","debouncedSearchFilter","rawValue","resolvedSelectedOptions","isOpen","setIsOpen","isDropdownOpenStateChangedByUser","setIsDropdownOpenStateChangedByUser","onOpenChange","open","onDeleteItem","newSelectedOptions","splice","selectedOptionKeys","pluck","selectedOptionsSet","Set","shouldDisableSelection","isAnyLoading","hasLoadErrors","showInitialLoading","canUserStartOperating","_usePrevProp","usePrevProp","hasIsLoadingOptionsChanged","_usePrevProp3","hasIsLoadingSelectedOptionsChanged","_usePrevProp5","hasOptionsLoadErrorChanged","_usePrevProp7","hasSelectedOptionsLoadErrorChanged","SelectedItem","itemText","itemIndex","onDelete","LoadingOverlay","isVisible","InlineLoading","PageFeedSelectorSection","cid","aid","onSelectedOptionsUpdate","loadPageFeedsFactoryFromProp","loadPageFeedsFactory","loadAssociatedPageFeedsFactoryFromProp","loadAssociatedPageFeedsFactory","loadPageFeeds","loadSelectedPageFeeds","Promise","useOptions","makeUseOptionsAsyncDataSource","useSelectedOptions","makeUseSelectedOptionsAsyncDataSource","MultiSelectorContextProvider","_ref$searchFilter","where","_toConsumableArray","replace","join","edmCampaign","Customers","$withKey","Accounts","Feeds","orderby","toPromise","then","feed","FeedItemCount","Campaigns","FeedAssociations","feedAssociation","FeedId","FeedName","ResponsiveAdConfigs","getEmptyRecommendationsContext","finalUrl","recommendationSource","themes","headlines","longHeadlines","descriptions","imageAssets","getBaseUrl","api","config","getODataConfig","serverContext","odataPath","hostname","toLowerCase","indexOf","isLocal","odataToken","Token","oDataToken","ServicesEndpoints","CampaignAPI","oDataPath","getOnlineTextRecommendations","url","requestBody","count","business","Website","headlineCount","descriptionCount","caller","odata","post","getOnlineNativeAndSearchTextRecommendations","nativeRecommendationsPromise","FinalURL","Locale","serverContextStore","getOnlineTextRecommendationsNative","searchRecommendationsPromise","all","_ref5","_ref6","nativeRecommendations","searchRecommendations","Headlines","v","LongHeadlines","Descriptions","getOnlineBusinessNameRecommendations","_ref7","getOfflineRecommendations","_ref8","convertOnlineTextRecommendationToOfflineFormat","textRecommendations","headline","Asset","SuggestionId","RecommendationId","getSuggestionIdsFromOfflineRecommendations","recommendation","suggestionIds","BusinessName","Images","SuggestionsTracker","_createClass","_classCallCheck","this","trackingData","allTextSuggestions","businessName","isFinalUrlFromOfflineRecommendations","suggestions","suggestionsReport","apply","returned","selectedImageSuggestions","suggestionId","uniqByRecommendationId","arr","uniqAssetRecommendationsInThemes","images","getFeatureForAssetEvent","_ref9","isSignup","isDisplayPlus","isMMA","AssetEventFeature","PMAX_LITE","DISPLAY_PLUS","MMA","PMAX","RecommendationContext","RecommendationContextProvider","finalUrls","mapSuggestionResponseToState","SuggestionStatus","EmptyURL","tracking","copilotTracking","CopilotSuggestionsTracker","recommendationContext","setRecommendationContext","updateRecommendationContext","delta","currentContext","reportRecommendations","recommendationsReport","recommendations","add","Provider","withRecommendationContext","WrappedComponent","HoC","displayName","getDisplayName","hoistNonReactStatics","logRecommendations","uid","isEditing","assetGroup","originalAssetGroup","assetGroupId","newTextAssets","_assetGroup$Headlines","_assetGroup$LongHeadl","_assetGroup$Descripti","_originalAssetGroup$H","originalHeadlines","_originalAssetGroup$L","originalLongHeadlines","_originalAssetGroup$D","originalDescriptions","originalHeadlinesTexts","Object","values","originalLongHeadlinesTexts","originalDescriptionsTexts","forEach","includes","longHeadline","uniq","getNewTextAssets","newImageAssetIds","assetIds","chain","result","flatten","property","toString","originalAssetIds","reject","assetId","getNewImageAssetIds","appliedTextAssets","Boolean","getAppliedTextAssets","appliedImageAssets","selectedImage","imageId","getAppliedImageAssets","recommendationLog","accountId","userId","appliedImageAssetIds","Channel","Feature","Scenario","TimeStamp","getUtcTime","AccountId","UserId","UrlType","AcceptInfo","ReturnedSuggestionIds","ViewSuggestionIds","ApplySuggestionIds","CampaignId","AssetGroupId","AppliedImgAssetIds","getRecommendationLog","useRecommendations","instrumentation","_ref$isSignup","_ref$isDisplayPlus","_ref$isMMA","_ref$enableCopilotRec","enableCopilotRecommendations","_ref$skipBusinessName","skipBusinessNameRecommendation","logRecommendationsAPIError","useLogRecommendationsApiError","_useContext","_useContext2","offlineRecommendations","setOfflineRecommendations","isOfflineRecommendationsFetched","setIsOfflineRecommendationsFetched","_useImageRecommendati","ServerContext","oDataConfig","FetchSucceed","onlineSuggestionStatus","setOnlineSuggestionStatus","onlineRecommendationResponse","setOnlineRecommendationResponse","offlineRecommendationResponse","setOfflineRecommendationResponse","_useState7","_useState8","websiteImagesState","setWebsiteImagesState","_useState9","_useState10","carouselState","setCarouselState","_useState11","_useState12","panelState","setPanelState","pageNumber","onlineHasMore","currentFinalUrl","getMoreImageSuggestionsRef","minimumSize","constants","getMinimumSizeForImage","onPollingSuggestionCompleted","response","isSubdomainScraping","suggestionStatus","ServerError","suggestionPoller","SuggestionPoller","cmpId","jobCompleteCallback","logger","getAdCreatorInstrumentation","instrumentationScenarios","MSAN","websiteSuggestionActivity","getPanelImagesFromResponse","ImageUrl","ThumbnailUrl","fullUrl","thumbnailSrc","thumbnailUrl","getMoreImageSuggestions","getMoreLandingPageSuggestions","landingPageUrl","minimumResolution","panelImages","hasMore","hasMoreImagesToFetch","getImageSuggestions","debounce","cancel","FetchInProgress","getLandingPageSuggestions","enableOfflinePollingDelay","cancelGetImageSuggestions","initImageRecommendationForUrl","setOfflineImageRecommendations","offlineAssetsSuggestions","updateImageRecommendations","returnedImages","useImageRecommendations","resetRecommendations","newFinalUrl","_useCopilotRecommenda","postAssetEventLog","feature","logBannerGenerated","useEventLog","handleCopilotBannerFetch","handleCopilotBannerFetchSucceeded","assetsResponse","trackReturnedTextAssets","RecommendedAssets","_assetsResponse$Recom","Themes","_assetsResponse$Recom2","ShortHeadlines","_assetsResponse$Recom3","_assetsResponse$Recom4","_assetsResponse$Recom5","ImageAssets","Logo","Cta","IsCustomerIdInExclusionList","getFormattedThemeForApplying","getFormattedImage","logo","isCustomerIdInExclusionList","counts","trace","handleCopilotBannerFetchFailed","useCopilotRecommendations","fetchOnlineTextRecommendationsAsyncToken","fetchOnlineBusinessNameRecommendationsAsyncToken","cancelFetchTextAndBusinessNameOnlineRecommendations","fetchTextAndBusinessNameOnlineRecommendations","createAsyncToken","on","onSuccess","businessNameRecommendation","onError","convertedRecommendations","recommendationsToLog","getOfflineRecommendationsForUrl","recommendationForFinalUrl","FinalUrl","AssetSuggestions","populateTextAndBusinessNameOfflineRecommendations","offlineRecommendationsForUrl","determineRecommendationSource","offlineRecommendationsFetched","offlineRecommendationForUrlExist","catch","finally","offlineRecommendationsForFinalUrl","withFinalUrlRecommendationUpdate","WrappedFinalUrlComponent","HOC","enableSpecialCharactersValidation","currentValidation","debouncedSetFinalUrl","FinalUrlForRecommendation","dirtied","updateValidationInternal","FinalUrls","PerformanceMarkerContext","withPerformanceMarker","Component","_Class","_React$PureComponent","_callSuper","_inherits","_this","perfMarker","useCreateChildPerfMarker","_ref$immediateInit","immediateInit","_ref$autoEnd","autoEnd","perfMarkerParent","child","createChild","willInit","useUpdateChildPerfMarker","perfMarkerChild","willRender","willFetchData","useLayoutEffect","done","PerformanceMarkerProvider","PerfMarkerFactory","init","appPerfMarker","createMarker","doneCallback","immediateDone","PlayPauseButtons","newI18n","pause","play","isPlaying","customizedClassName","isPlayPausePreviewImageEnabled","propTypes","PropTypes","isRequired","pmaxImageExperienceContentStyle","iconFontFamily","overflowX","content","flexBasis","inset","opacity","extend","floatButtonStyle","floatButton","fontFamily","margin","left","right","bottom","borderRadius","marginRight","backgroundColor","white","overflow","themeDarkAlt","borderLeft","neutralQuaternaryAlt","borderStyle","borderWidth","visibility","flexFlow","zIndex","_ref$palette","_ref$iconFontFamily","extensionEditorStyles","imageExperienceContainer","imageExperienceContentStyle","editImageCommonStyle","imageListLoadingContainer","imageListErrorContainer","alignItems","ariaAnnounce","getAdPreviewStyles","_ref2$palette","adPreviewContainer","boxShadow","paddingBottom","merginTop","carouselLayoutClassName","carouselControlsMsn","carouselControlsOthers","customCarouselRoot","transform","adExtensionContainer","placementContainerClassName","justifyContent","textAlign","carouselLayoutHeader","geCarouselStyleForMsan","previewCarousel","bottomCarouselNavigation","geCarouselStyleForOthers","getSummaryCardStyles","ImageListCardDetailsContainer","getImageSuggestionCarouselStyles","_components","ImageSuggestionCarouselContainer","InfoMessageBar","themeLighterAlt","getImageSuggestionPanelStyles","panel","panelHeader","alignSelf","panelTitle","backButton","buttonContainer","vmImagesFieldString","vmImagesDataFieldString","vmImageAssetsFieldString","pmaxRequiredAspectRatios","Image191x100","Image1x1","audienceMMAV2RequiredAspectRatios","OriginalImage","Image201x100","Image200x100","Image169x100","Image153x100","Image124x100","Image120x100","specialMinimumSizeReqiurementAspectRatios","getImagesFromImagesVm","vmImages","hasImages","imagesVm","getImageAssetsFromVm","assetGroupVm","imageListPropName","getImageAssetsFromImagesVm","createImagesVm","imageList","getInternalFinalUrlStateFromUrl","finalUrlProtocolAndDest","parseUrl","internalFinalUrl","internalFinalUrlProtocol","protocol","internalFinalUrlDest","getFirstNonEmptyItem","unEmptyItems","keys","sort","getFirstNonEmptyItemKey","adPreviewConfig","placementSetName","placementTypes","EPT","PMax","AudienceWideImage","MSEdgeSingleCarousel","MSNInArticle","AudienceSquareImage","MSNSmallHeadline","MMAWideImage","MMAVerticalImage","MMALandscapeImage","BingSearch","Outlook","Mobile","Web","adPreviewConfigV2","MMAV2MSNSingleCarousel","MMAV2MSNRestoday","MMAV2MSNPartnerStripe","MMAV2MSEdgeCarousel","adPreviewConfigV3","MMAV2MSNRiver","MSEdgeMobile","AdPreviewSurface","AdPreviewSurfacePlacementKeys","AdPreviewSurfacePlacementKeysV2","AdPreviewSurfacePlacementKeysV3","AdPreviewOverideStylesByKey","imagePreviewHeight","imagePreviewWidth","responsiveAdPreviewConfig","Responsive","responsiveAdPreviewConfigV2","responsiveAdPreviewConfigV3","processImageListViewModelToModel","imageListVm","imageOData","ImageOData","flattenedIncludedImageAssetList","getFlattenedImageAssetList","originalData","updateAssetsIdsAsync","setMTImageModel","imageArray","imageObj","isIncluded","isMultimediaAdinMSANEnabled","processImageListModelToViewModel","imageAssetArray","overrideParameters","baseUrl","isCombinedMsanAndMmaAspectRatios","isLinkedInAd","isPMaxAspectRatiosV2Enabled","promise","getImagesFromMTAssetsAsync","PMaxImageExperienceMaxImageCount","ImageExperienceWrapperInternal","imageAssetsOptional","isLogoEnabled","isBoostPortraitEnabled","updateFinalUrlCallback","updateImageListCallback","preferenceService","imagesContaineRef","logosContaineRef","portraitContainerRef","previewImagesSharedState","setPreviewImagesSharedState","updatePortalContainerState","setImageExperienceAddNewImageCallback","wizardPerfMarker","customMaxImageCount","UAPLPMaxIntegration","isMSANBoostEnabled","isBulkEditMMA","isImproveMMA","genericImage","isCopilotRecommendations","optionalAspectRatio","isStoreAppProng","isStoreAppSpotLight","isAd","isStockImageEnabled","isStoreAppTransparentLogo","isMMAV2Enabled","showCopilotOptionForImage","customAssetLibraryEventHandler","customPreviewTexts","customOnEditImage","customOnSaveEditImage","onRenderAllowedAspectRatioControl","isAudienceAd","supportImageUpscale","isImageFittingEnabled","isUnifiedAppCampaignWindowsStore","isAdPreviewRefreshEnabled","placementConfig","refreshedAdPreviewConfig","PMaxAdPreviewConfigV3","PMaxAdPreviewConfigV2","PMAXAdPreviewConfig","wizardFinalUrl","finalUrlState","setFinalUrlState","thumbnailRecord","currentSelectedImageId","currentSelectedLogoId","state","setState","imageExperienceAddImageCalbackRef","suggestedImageBeingAdded","imageSource","replaceExistingAssets","_images","scope","ScopeContext","isMeetingMinimumRequirementPerAspectRatio","forLogos","requiredAspectRatios","ratioCounts","isLogo","isPortrait","minimumSizerequirement","imageActualCroppedSize","cropSettings","isThisAspectRatioExcludedForMinimumSizeReqiurement","SourceWidth","SourceHeight","minCount","validateImageList","logos","updateFinalUrlStateFromWizardIfChanged","vmAssetsInfo","vmFinalUrl","onImageSelected","previewLogoId","cropImageObj","previewImageId","editingPlacementType","onImageRemoved","updatedImageList","selectedImageId","getDefaultSelectedImageId","isInRemainingInitialSuggestions","AssetPropertyName","IMAGE","removeInitialSuggestion","vmImageAssets","vmImageList","getImageListFromVm","latestImageList","getNewlyAddedImageId","latest","updated","newImage","image","onImageListUpdated","shouldDirty","prevState","imagesErrorList","logosErrorList","allErrors","listSizeChange","imageErrors","logoErrors","isDirty","imageListSizeChange","onImageListUpdate","addedImageId","isImageListUpdatedByPreview","asyncTokenRef","imageAssetsLoadPending","loadedImageList","getDefaultCurrentSelectedImageId","errorArray","imageAssetsLoadFailure","onImageEditCancelled","shortHeadline","displayUrl","getFinalUrlWithPath","getAssetsFromVm","updateFinalUrl","validateAdUrl","onUpdateFinalUrlPrefix","newPrefix","onUpdateFinalUrl","newUrl","window","globalLegacyI18n","i18nMerged","mergeI18n","mediaRepository","MediaRepository","assetLibraryEventHandler","useAssetLibraryEventHandler","finalAssetLibraryEventHandler","onUploadImage","imgId","ImageExperience","finalUrlProtocol","dateFormat","timeZone","customThumbnailRecord","onImagePreviewRequested","onSaveThumbnailAsDraft","isStockPhotoEnabled","isVideo","cropImage","suggestion","isAdCreatorEnabled","isFinalUrlImageRetrievalEnabled","setAddNewImageCallback","setAddNewImagesCallback","setOpenAddImageCallback","adCreatorScenario","default","onManualCropLogo","hasManualCroppedLogo","onManualCropImage","hasManualCroppedImage","preferencesService","imagesPortalContainer","logosPortalContainer","portraitPortalContainer","isRenderAddInImageList","enableUnifiedAdPreview","enableImageListEdit","adType","AdTypeEnum","pMax","extraPlacementInfo","ValidatedImageExperienceWrapper","withInstrumentation","withPreference","ImageListPortalBeaconAdapter","containerState","isLogos","attentionBeaconAdapterPropsFromProps","attentionBeaconAdapterProps","errorMessages","needsAttentionLocal","showValidationError","useNeedsAttentionForAdapter","isAttentionBeaconAdapter","ImageListPortalContainer","containerRef","ariaAnnounceMessage","Math","abs","loadingImagesSpinner","Loading","loadingImageError","imageListContainer","role","ImageListPortalContainerWithControlErrorHandling","withAlwaysShowError","withControlErrorHandling","FocusableActuator","LogoListPortalContainerWithControlErrorHandling","withFormError","entityIs","propertyIs","codeIs","ImageListSummaryCardDetails","noDataString","videos","isVideos","thumbnails","firstImg","videoThumbnails","video","allThumbnails","moreMediaCount","thumbnailsToDisplay","slice","src","alt","PerfMaxAdPreviewControls","onSurfaceChange","onPlacementFilterChange","_props$showAdPreviewC","showAdPreviewControlsV2","surfaceChoice","setSurfaceChoice","surfaceMap","Bing","Msn","Edge","placementFilterByPreviewControlState","placemenet","surfaceList","Pivot","onLinkClick","itemKey","PivotItem","headerText","PMaxVideo","CustomAdPreviewControls","customSurfaceKeys","placement","TabList","size","onTabSelect","defaultSelectedValue","Tab","PerfMaxAdPreview","updateImageList","isMSANAd","enableAutoPlay","placementCustomizationPredicate","_props$adPlacementsGr","adPlacementsGroupType","AdPlacementsGroupType","perfMax","hideHeaderButtons","isAppCampaignPreview","currentAdData","adData","setAdData","isAdDataUpdated","newAdData","debouncedSetAdData","getImageIndexFromId","getPreviewImageIndex","idRequestedByImageExperience","firstImageIndex","imagesToDisplay","previewImageIndex","flat","canExcludeAspectRatio","typeToCheck","typeCount","getIsRequiredByIndex","onAddAspectRatio","newImageList","imagePlacement","onRemoveAspectRatio","onEdit","truncatedAdData","validAdData","substring","shortHeadlineMaxLength","longHeadlineMaxLength","descriptionMaxLength","func","placementFilter","setPlacementFilter","getFirstElement","getLogo","imageArr","PreviewCarouselLayout","usePreviewCarouselLayout","groupType","placementFilterPredicate","customDefaultImage","previewPlaceholder","styleOverrides","surface","getCarouselControlsAndIndicatorsStyleBySurface","newPlacementFilter","headerButtonProps","AdExtensionTypes","EAdExtensionType","SiteLink","Promotion","StructuredSnippet","Price","getExtensionData","extensions","extensionType","extensionFormatters","siteLinks","siteLink","callOuts","callOut","promotions","promotion","structuredSnippets","Category","Texts","structuredSnippet","prices","acc","TableRows","price","extraPlacementInfoProp","logoPreviewEnabled","customPlacementContainerClassName","customPlacementHeaderClassName","isAdExtensionPreviewEnabled","extensionsAssociations","hotspots","PMaxAdPreviewConfig","hasLogo","aspectRatioUIString","previewTitle","getPMaxExtraPlacementInfo","hasSurfaceChoicePivot","placementType","extensionCount","extensionRerenderFlag","setExtensionRerenderFlag","_useImageExperienceAd","useImageExperienceAdPreviewModel","onUpdateImageExperienceImageList","placementSets","imageExperiencePlacementSets","imageListWithoutLogo","placementList","placements","imageToPreview","idString","baseId","baseImage","baseImageId","baseImageIdString","curPlacementList","bingSearchAdPlacement","placementMeta","placementListWithExtensions","pls","adExtensionType","preExtensionCount","isSizeValid","imageMeta","_ref11","minSize","_ref12","_ref13","curPreviewLogo","allLogos","curLogos","renderAdExtensionPreivew","AdExtensionPreviewComponent","AdPreviewAdExtensionComponents","extensionData","onRenderPlacement","AdPlacementComponent","_ref14","hasImageExperienceData","isPlaceholderImage","_ref15","_ref16","_ref17","_ref18","customClassName","disclaimerMessage","isEnabled","isPlacementIncluded","placementData","adExtensionContainerClassName","onRenderCarouselHeader","_ref19","_ref20","imageType","canBeExcluded","_ref21","previewHeaderTitle","_ref21$hideHeaderButt","DefaultButton","AdPreviewCarouselLayoutEx","onRenderHeader","useCustomCarousel","customCarouselRootClassName","resetOn","getIndicatorsWidth","getAdAssetsPreviewStyles","wordWrap","boxSizing","whiteSpace","textOverflow","textAligh","textWrap","customCarouselClassName","transformations","indicatorsWidth","adPreviewActions","appLogo","msnSurfacePlacements","Video","placmentSetName","getResponsiveAdPreviewConfig","UnifiedAppAds","VideoHorizontal","M365Outlook","MSNDisplay","CasualGamesDimensions","getExtraPlacementInfo","stylingProps","getNumberOfPlacementByCustomSurface","getNumberOfPlacementBySurfaceV3","getNumberOfPlacementBySurfaceV2","component","useResponsiveStyles","_ref10","_ref20$hideHeaderButt","shouldRenderPreviewActions","OverlayTrigger","overlay","Tooltip","autoHeightCarousel","customCarouselWrapperClassName","IMAGE_DIM","getFullyShownImagesCount","itemWidth","floor","getCarouselStyles","carouselParent","disabledCarouselParent","pointerEvents","objectFit","imageContainer","imageContainerLeftMargin","overflowY","imageParentContainer","imageParentLeftOffset","numberOfImages","imageClickableContainer","cursor","loadingMessageContainer","loadingText","verticalAlign","panelHeading","panelIcon","panelHelpButton","imageHintRight","imageHintLeft","paddleBtn","moreIcon","seeAll","seeAllInHeader","themePrimary","spinner","getBlockerStyle","parentContainer","mapSelectSate","allImages","needUpdateImages","img","ImageRecommendationsPanel","showThemes","loadNextPage","onSelectImage","isMultiSelect","onAdd","maxUploadNum","defaultImagesWithSelectState","isSelected","getImageWithDefaultSelectState","setError","setAllImages","activeImages","setActiveImages","activeTheme","setActiveTheme","themeNames","onSwitchTheme","rawImages","first","imagesWithState","onClickAdd","onClickCancel","onRenderFooterContent","horizontal","Item","PrimaryButton","findIndex","onSelectImageInternal","limitNumber","Panel","isFooterAtBottom","PanelType","custom","customWidth","panelStylesProp","FluentProvider","webLightTheme","CopilotTab","active","onActiveChange","CopilotTabItem","tabKey","FluentImagePicker","pageSize","loadMoreImages","hasMoreImages","imageCellWidth","imageCellHeight","MessageBar","messageBarType","MessageBarType","SuggestionViewImageCount","PerfMaxImageSuggestionCarouselInternal","_props$addImageCallba","addImageCallback","customMessageBarText","_recommendationContex","_useMemo","carousel","isError","suggestionImages","suggestionInProgress","inProgress","imagesToSuggest","setImagesToSuggest","carouselErrorMessage","setCarouselErrorMessage","blockCarousel","setBlockCarousel","isSuggestionsPanelOpen","setIsSuggestionsPanelOpen","logCopilotViewedImageSuggestions","viewedImageSuggestionIds","getUntrackedViewedSuggestionIds","EventName","POST_ASSET_EVENT_NAME","EventValue","AssetType","SuggestionIds","RecordType","AssetEventRecordType","VIEWED","trackViewedSuggestionIds","panelViewedSuggestionIds","truncatedImages","imageOptionKeys","Image","processedImage","trackSelectedImageAssets","resolve","processedImages","onSelectSeeAllImages","onOffsetChange","offset","viewedImages","shouldDisplayEmptySuggestionsHint","isMultiline","info","UiBlocker","blocking","ImageSuggestionCarousel","helpTopic","messageInfo","onSelectSeeAll","showEllipsisWhenNoMoreImages","showViewAllInHeader","stylingOverrides","initialImageContainerLeftMargin","seeAllLinkText","PerfMaxImageSuggestionCarousel","withPermissions","ImageListPortalContainerWithCarouselSection","expand","imageLimit","ValidatedPanel","ImageAssetsImg","details","actuationProps","expandKey","limit","imageExperienceStyle","LogoListPortalContainerSection","LogoAssetsImg","ImageListPortalContainerSection","unlocalizedRecommendationTitle","getTextAssetRecommendationsStyles","TextAssetRecommendationsContent","getFinalUrlRecommendationsStyles","TextFinalUrlRecommendationsContent","TextAssetRecommendationsPanel","onSave","onCancel","collection","availableRecommendations","maxCollectionSize","disabledSuggestionTooltip","reportDisplayedRecommendations","fieldValues","selectedRecommendations","deriveSuggestedItems","suggestedItems","setSuggestedItems","selectedItemsCount","remaningItemsCount","negate","onSuggestedItemToggle","onSaveClick","onCancelClick","closeButtonAriaLabel","medium","SuggestedItemsMultiSelect","suggestedSectionDescription","disableAllUnselectedSuggestions","useInlineCopilotUIStyles","header","summary","TextAssetRecommendationsWithThemesPanel","topicAriaLabel","DKIThemeName","replaceMode","assets","asset","allSuggestedItems","setAllSuggestedItems","emptyFieldsCount","HelpButton","align","onOuterClick","focusTrapZoneProps","disableFirstFocus","MAX_INLINE_RECOMMENDATIONS_PER_PAGE","keyIsEmpty","InlineRecommendations","singleAssetValidationPropsField","inlineRecommendationsHelpTopicKey","inlineRecommendationsHelpTopicAriaLabel","inlineRecommendationsTitle","inlineRecommendationsDisabledItemTooltip","applyRecommendation","applyRecommendations","hideAddAllSuggestionsButton","enableDKI","flattenedAvailableRecommendations","compact","_useCircularBufferVie","page","setPage","currentIndex","setCurrentIndex","newPage","useCircularBufferView","flattenedAvailableDKIRecommendations","flattenedAvailableNoDKIRecommendations","_useCircularBufferVie2","availableInlineRecommendations","canMoveNext","moveNext","firstAvailableKey","keyToUpdate","findKey","prevAvailbleKeyWasDefined","setPrevAvailbleKeyWasDefined","shouldForceCloseCollapse","setShouldForceCloseCollapse","firstAvailableKeyIsDefined","onAddSuggestedItem","onAddAllSuggestedItems","onMoreSuggestionsButtonClick","onCancelAddingMultipleRecommendations","onAddMultipleRecommendations","Separator","SuggestionSectionCollapse","RecommendationsSectionIcon","suggestedSectionTitle","showSuggestionsSectionShimmer","showMoreSuggestionsInlineButton","onMoreSuggestionsInlineButtonClick","showAddAllSuggestionsButton","addAllSuggestionsButtonText","showMoreSuggestionsButton","moreSuggestionsButtonText","disableAllSuggestions","useStyleFluent2","forceClose","allRecommendations","registerIcons","icons","copilot","TextAssetRecommendationsDropdownUnstyled","assetKey","TextAssetRecommendationsDropdown","FontIcon","listStyle","borderTop","DKIThemeDefaultName","pmaxCollectionConfig","labelText","placeholderText","validationPropsField","addButtonText","copilotButtonLabel","deleteButtonLabel","minCollectionSize","helpPopupTopic","helpPopupAriaLabel","duplicateErrorMessage","formErrorProps","unifiedAppAdsConfig","windowsStoreAdsConfig","pmaxLiteCollectionConfig","displayPlusCollectionConfig","searchMMACollectionConfig","linkedinAdCollectionConfig","hideAddButtonWhenLimitReached","showAssetLabelledBy","featureConfigMapping","pmax","pmaxLite","searchMMA","displayPlus","linkedin","unifiedAppAds","windowsStoreAds","getTextAssetCollectionConfig","collectionName","collectionConfig","unlocalizedArgs","Error","localizedArgs","recommendationFieldMap","recommendationAssetTypeMap","propertyNameSingularMap","HEADLINE","LONG_HEADLINE","DESCRIPTION","textAssetCollectionStyleOverridesForInlineRecommendations","AddAssetButton","UnvalidatedTextAssetCollectionWithRecommendations","withInlineRecommendations","withDeleteIconDisabled","setAddTextAssetCallback","onFocusTextAsset","onApplyRecommendation","onDeleteTextAsset","enableCustomizer","isAmplifyEnabled","is40CharHeadlinePilotEnabled","isExpandedHeadlineCharLimitEnabled","updatedValidationSchema","fromEntries","entries","newValidationProps","viewedCopilotCollectionObj","setViewedCopilotCollectionObj","finalUrlForRecommendation","visibleCalloutKey","setVisibleCalloutKey","isCopilotEnabled","setIsCopilotEnabled","isCopilotRegionRestricted","isRestricted","logCopilotSuggestions","suggestionsToLog","TEXT","_useEventLog","logTextAssetMenuOpen","logTextAssetDialogOpen","logRefineTextAsset","logRefineTextAssetSucceeded","logTextAssetApplied","logRemoveSingleAsset","onSuggestionsRendered","params","textSuggestions","textSuggestionIds","TextAssets","recommendationsField","collectionRecommendations","currentCollectionTexts","availableCollectionRecommendations","CopilotDKIRecommendation","DKItheme","recommendationsMap","object","displayedRecommendations","displayedRecommendationsIds","collectionData","cloneDeep","newData","availableRecommendationsStack","reverse","collectionObj","fieldsToSet","max","currentFieldIndex","pop","filteredRecommendations","headlineTitle","renderRecommendations","itemValue","startsWith","existingAssets","shortHeadlines","handleDeleteTextAsset","deletedValue","propertyName","recommendationId","renderInlineCopilot","disableReason","assetType","NO_FINAL_URL_HINT","EMPTY_ASSET_HINTS","getCharCountExcludingAdCustomizers","NOT_SUPPORT_DYNAMIC_TEXT","currentAssetIndex","parseInt","match","CopilotTextAssetRecommendation","menuButtonAriaLabel","onMenuOpen","onOperationDialogOpen","onFetch","onSelect","operationName","isNewLogo","labelledById","renderFunction","renderItemFunction","onClickOrChangeHandler","additionalTextFieldProps","onFocus","autoComplete","isBeakVisible","gapSpace","calloutMinWidth","UnvalidatedTextAssetCollection","renderWrapperFunction","labelId","TextAssetCollectionWithRecommendations","isOptional","showDeleteButton","textAssetConfig","headlineConfig","longHeadlineConfig","descriptionsConfig","Headline","StoreBackedBusinessName","storeDetails","currentBusinessName","storeName","prepopulated","setPrepopulated","businessNameRecommendationText","prevRecommendation","setPrevRecommendation","BusinessNameWithValidation","ValidatedStoreBackedBusinessName","withUnvalidatedControlErrors","withError","withStoreFromProviderId","BusinessNameWithRecommendation","ValidatedBusinessNameWithRecommendation","ValidatedBusinessNameWithRecommendationSection","entity","nativeAdBusinessNameProp","andComp","getBusinessNameProp","BusinessNameImg","initialValue","FinalURlKey","ValidatedFinalUrl","withFluentSwitcher","ValidatedFinalUrlV1","ValidatedFinalUrlV2","ValidatedFinalUrlWithRecommendations","additionalProperties","enableUrlRecommendation","showFinalUrlRecommendations","setShowFinalUrlRecommendations","logFinalUrlRecommendations","difference","viewedSuggestions","currentFinalUrlDestinationValue","_getUrlPrefixAndDesti","getUrlPrefixAndDestination","isArray","onDismissFinalUrlRecommendations","finalUrlRecommendation","urls","_getUrlPrefixAndDesti3","finalUrlSection","ValidatedFinalUrlWithRecommendationsSection","customUrlProtocol","onFinalURLFocusOut","onFinalURLEnterKeyUp","ServerValidatedFinalUrl","finalUrlsProp","ValidatedFinalUrlWithStoreURL","getServerValidatedFinalUrl","finalUrlValidationProps","onKeyUp","keyboardEvent","Collapse","allPanelItems","checkItems","skipItemsTypeCheck","activeKeys","setActiveKeys","FinalUrlImg","validateOnRender","onBlur","getTextAssetCollectionConfigByFeature","featureName","DescriptionAssetCollection","setAddNewDescriptionCallback","textAssetCollectionConfig","addNewHeadlinesCallback","HeadlineAssetCollection","setAddNewShortHeadlinesCallback","LongHeadlineAssetCollection","setAddNewLongHeadlinesCallback","isLite","DescriptionAssetCollectionSection","descriptionsCardSummaryDetails","getDescriptionsCardSummaryDetails","TextAssetsImg","HeadlineAssetCollectionSection","headlinesCardSummaryDetails","getHeadlinesCardSummaryDetails","LongHeadlineAssetCollectionSection","longHeadlinesCardSummaryDetails","getLongHeadlinesCardSummaryDetails","wideCharPattern","RegExp","getLength","str","displayLength","strRemaining","remaining","isFinite","distinguishWideChar","Number","POSITIVE_INFINITY","intRemaining","RemainingCharsHint","getRemainingCharsHintTextWithSchema","vmSchema","ViewmodelSchema","vmField","obj","seg","vmFieldSchema","fieldSchema","getRemainingCharsHintText","getTextInputContainerStyles","TextInputContainer","getRemainingCharsStyles","RemainingCharsContainer","ValidatedTextField","withValidation","TextField","RemainingCharsValidatedTextFieldInternal","RemainingCharsHOC","setValue","onValidate","validationResult","path","withRemainingChars","RemainingCharsUnvalidatedTextField","maxLengthHint","localOnChange","newProps","withRemainingCharsUnvalidated","ControlledRemainingCharsUnvalidatedTextField","withControlledRemainingCharsUnvalidated","glyphList","remainingWarning","getPlacementMessage","Hotspot","handleChangeTitle","handleChangeTextField","handleChangeGlyph","handleChangePlacement","hotspot","showHotspotCount","desc","actionText","uri","glyph","textFiledStyles","bind","enableHotSpotPlacement","HotspotPanel","constructor","super","Title","Description","ActionText","Uri","Glyph","Placement","onUpdateHotspots","AddHotspot","handleRemoveHotspot","validate","missField","any","hotspotStrings","hideTitle","disableAddhotspot","style","horizontalAlign","CommandButton","getDropdownOptions","itemType","Header","Divider","BoostAnchors","defaultSelectedKey","onUpdate","setSelectedKey","AssociationType","processImagePlacementsMetadata","baseImageIdStr","baseImageInfo","imageLevelSettings","propagateToImageLevel","includedPlacements","IsIncluded","excludedPlacements","hasBeenBulkCropped","originalUrl","hasPlacementSettings","placementSettings","cachedDeserializedMetadataById","effectSettings","cachedValue","deserializeMetadata","deserializeImageAssetMetadata","Metadata","IdString","effectSrc","Src","setEffectSettings","originalSrc","BaseImage","setSrc","setBaseImage","EffectSettings","updatePlacementWithBaseCropSettings","mtImgObject","IsCroppingbasedOriginal","setCroppingType","updatePlacementWithPlacementSettings","updatePlacementSettings","isMaunalCropped","DefaultKey","containMetadata","metadata","getMetadataKey","findMetadata","dict","metadataKey","subTypeToType","getMTAssetBaseId","imageToUrlMap","generateMTAssetWithOriginalImage","originalAssets","originalAssetsFor191x100AspectRatio","SubType","assetsV1","payloadV1","payloadV2","CropHeight","CropWidth","CropX","CropY","generateMTAssetV2","getMultiImages","isV2Format","shouldConvertAssetToV2Format","imageGroupByType","multiImages","imagesExperience","originalImageToCrop","Width","Height","source","sourceType","isRecommendedImage","isBoost200x100ImageEnabled","isBoostNewAspectRatioSupportEnabled","mtAsset","BaseId","compareBaseImage","assetExtraInfo","String","croppingType","CroppingType","ManualCrop","SourceX","SourceY","altText","AltText","originCropSetting","cropSettingOnOriginal","originalWidth","originalHeight","associationType","getImageProps","CropSettings","setIncluded","landscapeFound","getLandscapeImage","originalImageFound","getOriginalImage","copyEffectsFromOther","aspectRatios","getAspectRatios","imageOption","defaultImageOption","imageExperience","getMMAPayloadV2","flattenedImageList","imageIdsUpdatesByIndex","includedImageListByType","overrideInfo","finalIdString","shouldIgnoreThisAlgorithm","payload","imageWithUpdateListOfThisType","keep","checkType","landscapeImageList","nonLandscapeImageListOfOneType","landscapeSize","orderedLandscapeImageList","orderedNonLandscapeImageListOfOneType","ratio","aspectRatio","landscapeImageFinalId","landscapeImage","imageOfThisTypeId","imageOfThisType","autoCroppedSettings","isCropSettingsEqual","originalCropSettings","originalImageCropSettings","checkIfShouldKeepImageType","mtModelArr","formatToSave","getImageTypesWithOrder","logoSubtypes","portraitSubtypes","imageAssetCenterCrop","_getCenterCroppedSett","getCenterCroppedSettings","uploadRecommendImage","_x","_x2","_x3","_uploadRecommendImage","_asyncToGenerator","_regeneratorRuntime","mark","_callee","recommendAssetIdImageUrlMap","odataRootUrl","imagesWithoutId","imageRepository","ids","promises","wrap","_context","next","DependencyResolver","ImageRepository","bulkSaveImagesByUrl","sent","getImageByIdAsync","imageInfo","abrupt","stop","IsRecommendedImage","disableEdit","DisableEdit","getImageTasks","mTAssetArrays","baseURL","imageIdsToFetch","Url","queryify","c","getAllImagesInfoFromMTAssets","imageInfoArr","existingIds","baseAssetArrays","baseImageInfos","SourceType","BaseIdString","OriginalUrl","CropSettingOnOriginal","PlacementSettings","OriginalHeight","OriginalWidth","roiInfo","ROIInfo","autoFillMissingImageIdAndSizeFromRecommendation","mTAsset","ImageHeight","ImageWidth","getMultiImagesFromMTAssetsAsync","isBoostPortraitImageEnabled","logoExperiences","logoGroup","ass","aspectRatioOption","maxCropBox","getLogoExperience","imageAsset","portraitExperiences","portraitGroup","Portrait","isPortraitImage","getPortraitExperience","imageExperiences","setROIInfo","imageTypesWithOrder","imageObjArr","ImageExperienceImage","imageObj1","imageObj2","buildAssetModels","mmaAspectRatios","imageObjArrById","category","previousPlacements","groupImageObjectsByBaseImage","missingTypes","autoCroppedImages","getAutoCroppedImages","imagesToReturn","croppedImage","savedImage","autoFillMissingImagesAsync","MMAAssetConfigs","MAX_HEADLINES","DEFAULT_HEADLINES","MIN_HEADLINES","MAX_LONGHEADLINES","DEFAULT_LONGHEADLINES","MIN_LONGHEADLINES","MAX_DESCRIPTIONS","DEFAULT_DESCRIPTIONS","MIN_DESCRIPTIONS","MAX_HEADLINE_SUGGESTIONS","MAX_DESCRIPTION_SUGGESTIONS","MAX_BUSINESS_NAME","headlineFields","longHeadlineFields","descriptionFields","AdEditFields","omitDeletedParameters","formattedParams","p","omit","convertFromAdModel","ad","processImages","Array","val","idx","results","adModel","Videos","newVideoFromMTObject","ImageList","convertFromBulkResponse","parse","mapAssets","fields","convertToAdModelInResponse","processViewModelDataForSaving","adGroupId","adId","defaults","UrlCustomParameters","param","Key","MobileFinalUrls","isEmptyUrl","convertToAdModel","AdGroup","filteredImageList","getMmaAspectRatios","getMMAImageList","flattenImageList","removeRatioTypeInId","getImagesDataModel","flattenedImageAssetList","flattenedImageAssetsPayload","UiUnsupportedRatios","imagesModel","UIUnSupportedImagesModel","association","charAt","portraitImage","portraitImagePayload","imageIndexAsThumbnail","assetList","assetPositionsToUpdate","newAssets","existingMetadataIdMapping","original","isProcessed","bingSrc","serializeImageAssetMetadata","isEffectEdited","found","isMetadataExisting","FinalSrc","code","errors","_newAssets$index","insertMetadata","foundInfo","thumbnailAsset","imageToGenerateThumbnail","originalThumbnailAsset","copyThumbnailLookToNewImage","mtModel","EditableImageButton","imageItem","buttonId","calloutProps","useConst","TooltipHost","popover","groupHeader","menuItem","SparkleMenuButton","onChangeBackgroundScene","onMeuOpenChange","Menu","closeOnScroll","MenuTrigger","triggerprops","CopilotIconSelected","CopilotIcon","MenuPopover","MenuList","MenuGroup","MenuGroupHeader","MenuItem","TryBackgroundIcon","logSignal","ResponsiveImageListView","_event","isAddButton","onRemove","showCopilotOption","onRemoveImage","currentTarget","dataset","imageid","onEditImage","addButtonChoiceOption","onRenderLabel","onRenderField","onAddImage","testRef","that","_this2","getKeyForImageItem","contentWidth","contentHeight","desiredImageWidth","desiredImageHeight","imageSrc","isLandscapeLogoMedia","midPointOffsetX","ceil","midPointOffsetY","selectedImageWrapper","imageWrapper","landscapeLogoRatio","C","landscapeLogoMarginTop","Image4x1","landscapeLogoShowHeight","landscapeLogoTop","innerField","imageCropSettings","desiredCropWidth","desiredCropHeight","cropImageWidth","cropImageHeight","cropRatio","xscale","yscale","_this2$props","enableEdit","selectedImageSrc","imageSize","setOpen","setClarityTag","HoverResponsiveImageListView","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","_this$props","portalContainer","getChoiceGroupOption","renderContent","onRemoveAllImages","ReactDOM","adStrengthSuggestionPerspectiveStrings","NewStrengthScore","Incomplete","Poor","Average","Good","Excellent","StrengthColor","StrengthIcon","ViewSuggestionType","assetStrMap","getStrengthIcon","strength","newGenerateSuggestion","actionItem","xValue","priority","x","keywordList","y","NewAdStrengthScore","score","getNewStrengthScore","getStrengthColor","chart","xAxis","visible","yAxis","tickPositions","legend","enabled","credits","tooltip","formatter","plotOptions","bar","animation","pointWidth","series","stacking","states","hover","inactive","HighchartReactWrapper","iconClass","getNewAdStrengthStyles","mergeStyleSets","met","listStyleType","paddingInlineStart","cardTitle","getAdStrengthTopGridStyles","getPickerListStyles","neutralLighter","textDecoration","pickerTitle","getLLMPickerListStyles","suggestionLimit","selectors","ResponsiveSearchAdStrength","adItem","onFetchAdStrength","logAdStrength","adStrength","setAdStrength","actionItems","setActionItems","setPriority","setSuggestions","notEmptyHeadlines","notEmptyDescriptions","IsCompleteAd","rawActionItems","sortedSuggestions","lazyFetchNewAdStrength","Strength","ActionItemsV2","Priorities","headingClassName","getDefaultAsset","num","fill","PinnedField","AdStrengthRepository","edm","jsdata","entitySet","currentAccount","AdGroups","Ads","$call","toJSON","Ad","findAll","cacheResponse","llmIcon","updateItem","hideSuggestionPicker","displayPostion","updateSuggestionMeasurement","pickerListClass","containerStyle","clickedAway","closest","keydown","querySelector","hasChildNodes","stopPropagation","viewSuggestionIds","FocusLock","onExit","focusFirstItemOnMount","href","applySuggestionIds","addAssetSuggestion","AdStrengthLLMSuggestionPicker","perspectives","showSuggestionPicker","autoFocus","pickerRef","firstItem","focus","pickerTarget","perspectiveItems","perspective","filteredPerspectiveSuggestions","Perspective","suggestionItems","filterLLMSuggestion","assetTypeString","filteredTypeSuggestions","Suggestions","suggestionContent","isViewSuggestionApplied","useAdStrengthSuggestion","llmAssetsSuggestions","isForVnext","containerElement","querySelectorAll","div","createElement","appendChild","pickerContainer","targetRect","getBoundingClientRect","containerRect","getDisplayPosition","assetsCopy","ModelName","Perspectives","PitchingPoint","filteredSuggestions","DKIfilteredSuggestions","normalfilteredSuggestions","activeElement","fetchAdStrength","_scope$values","AdStrengthTopGrid","neutralLight","neutralSecondaryAlt","neutralTertiary","themeDark","themeDarker","paginationStyle","outlineOffset","btnStyle","primary","controlStyle","backgroundImage","transition","addEditCommonStyle","_ref2$iconFontFamily","borderBottom","order","flex","float","backgroundSize","gridTemplateColumns","gridColumnStart","gridColumnEnd","getEditImageStyle","_ref3$iconFontFamily","editImageStyle","fontStyle","getCommonPreviewContainerStyles","previewPlacementContainerRoot","adPreviewCarousel133x100Container","getAddImageStyle","_objectSpread2","_ref4$iconFontFamily","addImageStyle","textIndent","getStockPhotoFilterStyle","_ref5$palette","themePalette","filterContainer","predicateValueEditorStyle","selector","getCircleProgressStyle","circle","buttons","PageNavigator","isLargeHeader","renderHeaderText","actions","moreOptionsLabel","actionComponentType","shimmerLineCount","onRenderShimmer","isShimmerRequired","tileContainer","headerBorder","closeButton","tileSection","headerContainer","gridRow","headerHelp","smallHeaderText","largeHeaderText","dropdownContainer","contentContainer","wideTileContainer","footerContainer","footerContentContainer","footerButton","tileStyles","shimmerItem","actionComponentTypes","TileHeaderUnstyled","_props$config","_props$config$renderH","helpIcon","_props$config$actions","headerOptions","onCloseTile","_props$config$isLarge","_props$config$as","_props$config$actionC","_props$classPrefix","classPrefix","hasHeaderOptions","onRenderOverflowButton","menuIconProps","menuProps","ActionOverflowSet","OverflowSet","overflowItems","selectedAction","setSelectedAction","ActionDropdownButton","newItems","CommandBarButton","headerClasses","TileHeader","TileFooterUnstyled","_props$config$buttons","_props$config$isRequi","_props$config$PageNav","_props$config$footerT","footerTips","hasButtons","btn","Button","TileFooter","SharedTileUnstyled","headerConfig","footerConfig","footer","contentConfig","tileClassName","tileId","tileRef","_props$config$wide","wide","_ref$isLargeHeader","_ref2$styles","_ref2$styles2$root","_ref2$shimmerLineCoun","_ref2$isShimmerRequir","isShowingShimmer","loadingItems","shimmerWidthList","SharedTile","PageNavigationFooterUnstyled","pageIndex","totalPageNumber","onNextPageClick","onPreviousPageClick","allowDisable","pageIndexContent","pagerIcon","pageNavigationButton"],"sourceRoot":""}