{"version":3,"sources":["../../smart-page-facebook-import-dialog/src/components/facebook-import-dialog-step-fb-connect.js","../../smart-page-facebook-import-dialog/src/components/facebook-import-dialog-step-fb-import.js","../../smart-page-facebook-import-dialog/src/util/facebook-import-util.js","../../smart-page-facebook-import-dialog/src/facebook-import-dialog-internal.js","../../smart-page-facebook-import-dialog/src/util/facebook-page-info-filter-config.js","../../smart-page-facebook-import-dialog/src/util/facebook-import-data-helper.js","../../smart-page-facebook-import-dialog/src/util/facebook-error-helper.js","../../smart-page-util/src/get-environment.js","../../smart-page-util/src/get-facebook-app-id.js","../../smart-page-util/src/get-smart-page-url.js","../../smart-page-util/src/get-landing-page-url.js","../../smart-page-util/src/get-device.js","../../smart-page-template/src/consts.js","../../smart-page-template/src/template-service.js","../../smart-page-template/src/site-templates/default-template.js","../../smart-page-template/src/helper/apply-template-suggestion.js","../../smart-page-data/src/smart-page-helpers.js","../../smart-page-data/src/use-smart-page-service-context.js","../../smart-page-context/src/server-context.js","../../smart-page-context/src/client-context.js","../../smart-page-context/src/instrumentation-context.js","../../smart-page-context/src/instrumentation-schema.js","../../smart-page-context/src/global-error-view.js","../../smart-page-context/src/instrumentation.js","../../smart-page-context/src/site-config-reducer.js","../../smart-page-context/src/site-config-context.js","../../smart-page-context/src/editor-status-context.js","../../smart-page-context/src/editor-status-reducer.js","../../smart-page-context/src/country-context.js","../../smart-page-context/src/preference.js","../../smart-page-context/src/i18n-context.js","../../smart-page-context/src/integration-context.js","../../smart-page-context/src/hooks/use-pilot.js","../../smart-page-context/src/hooks/use-server-context-property.js","../../smart-page-context/src/hooks/use-user-account-customer.js","../../smart-page-context/src/hooks/use-mobile-content.js","../../smart-page-context/src/preview-page-context.js","../../smart-page-context/src/appinsights-context.js","../../smart-page-error-boundary/src/default-error-view.js","../../smart-page-error-boundary/src/with-error-boundary-options.js","../../smart-page-error-boundary/src/with-error-view.js","../index.js","../../smart-page-site-builder/src/loader/runtime-smart-components-loader.js","../../smart-page-site-builder/src/util/build-tree.js","../../smart-page-site-builder/src/layout/fluent-grid-layout-components.js","../../smart-page-site-builder/src/layout/node-factory.js","../../smart-page-site-builder/src/layout/node-render.js","../../smart-page-site-builder/src/dynamic-component-render.js","../../smart-page-site-builder/src/site-builder-internal.js","../../smart-page-site-builder/src/layout/fluent-grid-layout.js","../../smart-page-site-builder/src/styles.js","../../smart-page-site-builder/src/site-builder-wrapper.js","../../smart-page-runtime-component/src/smart-page-runtime.js","../../smart-page-runtime-component/src/use-wcp-consent.js","../../smart-page-runtime-component/src/tracking-scripts.js","../../smart-page-data-service/src/odata-options.js","../../smart-page-data-service/src/odata-wrapper.js","../../smart-page-data-service/src/service-utils.js","../../smart-page-data-service/src/smart-page-service.js","../../smart-page-data-service/src/image-service.js","../../smart-page-data-service/src/bulkify.js","../../smart-page-data-service/src/email-service.js","../../smart-page-data-service/src/error-mapping.js","../../smart-page-data-service/src/hooks/use-context-locale.js","../../smart-page-data-service/src/hooks/use-content-suggestions.js","../../smart-page-data-service/src/booking-service.js","../../smart-page-data-service/src/hooks/use-booking-services.js","../../smart-page-site-theme/src/default-theme.js"],"names":["FacebookImportDialogStepFBConnect","withDefaultStyles","withI18nConsumer","_ref","i18n","classes","onConnectClick","React","createElement","id","className","facebookImportDialogStepFBConnect","classNames","fbConnectSection","fbConnected","onClick","onKeyPress","role","tabIndex","fbConnectIcon","fbConnectTips","getString","_TL_","tipsSection","left","position","transform","height","background","lineHeight","textAlign","marginBottom","boxShadow","padding","color","fontSize","fontFamily","&:before","content","marginTop","UnStyledFacebookImportDialogStepFBImport","fbSites","onFBSiteSelected","onReConnectFB","options","_","map","fbSite","key","facebookId","text","businessName","_useState","useState","_useState2","_slicedToArray","selectedPage","setSelectedPage","logger","useContext","InstrumentationServiceContext","useEffect","facebookImportDialogStepFBImport","Dropdown","placeholder","label","selectedKey","onChange","event","item","logTrace","concat","calloutProps","directionalHintFixed","fbReconnect","fbReconnectLink","fbImportDesc","defaultProps","noop","FacebookImportDialogStepFBImport","cursor","fbSdkUrl","pollForFacebookJsSdk","maxAttempts","arguments","length","undefined","interval","currentAttempts","sdk","FB","window","isUndefined","init","getFacebookJsSdk","Promise","resolve","delay","then","facebookInit","DMCAppId","handleFacebookSDKError","appId","document","domain","match","fbAppIdInUse","getElementById","remove","fbAsyncInit","checkAndDoCleanIfAppIdNotMatch","status","xfbml","version","loadScriptAsynchronously","src","Error","error","err","JSON","stringify","fetch","res","ok","statusText","catch","e","facebookLogout","onLogoutSuccess","fbAppId","getLoginStatus","loginStatus","debouncedOnLogoutSucceed","debounce","logout","IMPORT_STEP","FB_ERRORS","UnStyledSmartPageFacebookImportDialogInternal","updateFBInfo","dataFilter","onDismiss","siteAuthInfo","setSiteAuthInfo","showWarningMessage","autoConnect","onInitFailed","onGetPageListFailed","setFbSites","_useState3","_useState4","selectedFBSiteId","setSelectedFBSiteId","_useState5","_useState6","step","setStep","_useState7","_useState8","startStep","setStartStep","_useContext","DataServiceContext","smartPageService","hostSystemScenario","loadingTxtConfig","Initiating","Importing","_useState9","isLoading","loadingTxt","_useState10","loading","setLoading","useCallback","handleErrors","messageElement","ReactTemplate","model","link","Link","href","target","style","paddingLeft","template","getFBPageListInfo","fbInfo","authResponse","accessToken","authInfo","fbToken","fbUserId","userID","getFacebookPageList","data","isEmpty","finally","connectFacebook","onSuccess","onFail","loginOptions","scope","return_scopes","login","response","facebookLogin","connect","getParameter","seleniumFBInfo","connectFacebookForSelenium","onNextClick","getFacebookPage","fbSiteConfig","errors","haveError","each","handleFBPagePartialErrors","fbErrors","handleSetStartStep","stepToSet","onPreviousClick","onCancelClick","_objectSpread","facebookUserId","dialogSteps","title","subtitle","updateFBSites","Panel","isOpen","headerText","onRenderFooterContent","nextBtnText","panelFooter","PrimaryButton","disabled","btnNext","DefaultButton","isFooterAtBottom","isBlocking","panel","closeButtonAriaLabel","UiBlocker","blocking","loadingText","panelContent","panelSubTitle","paddingBottom","marginRight","facebookPageInfoFilter","all","basic","posts","ratings","photos","callToActions","postsPhotos","batchTransformImagesInComponent","imageService","images","bulkUpsert","results","imageIds","compact","imageId","batchGet","getImageUrls","isFacebookImportSupported","siteConfig","smartPageDataContext","UserId","PageId","importFromFacebook","reject","hasFBOAuthError","some","Code","Environment","PROD","BETAPROD","TIP","SI","BETASI","CI","getEnvironment","isProdEnvironment","env","FACEBOOK_APP_ID_FOR_SMART","ProdApp","TestApp","TestApp-CI","FACEBOOK_APP_ID_FOR_EXPERT","getFacebookAppId","isExpertAccount","environment","FACEBOOK_APP_ID","SmartPageUrlSuffix","getSmartPageUrlSuffix","getSmartPageUrl","subdomain","siteSuffix","getCustomDomain","domainDetail","CustomDomain","SMART_PAGE_ENV_MAPPING",".biz.site",".beta.smartpage.microsoft.com",".si.smartpage.microsoft.com",".ci.smartpage.microsoft.com",".betasi.smartpage.microsoft.com","ENV_LANDING_PAGE_DOMAIN_MAPPING","_defineProperty","getLandingPageUrl","queries","enviroment","keys","i","indexOf","getSmartPageEnviroment","landingPageDomain","appendedQueries","queryString","skipNull","skipEmptyString","formattedQueries","reAndroid","reIOS","ua","navigator","userAgent","vendor","opera","isAndroid","test","isIOS","SmartPageTemplate","requiredComponentList","filter","componentsConfig","required","TemplateComponentListMapping","uniq","_toConsumableArray","businessHours","callToAction","professionalService","review","summary","config","type","TemplateService","service","defaultSiteTemplate","siteStructureTemplate","dataSource","pages","generateId","components","theme","themeId","websiteSourceData","_siteStructureTemplat","push","apply","generateSectionWithComponent","componentType","sectionIndex","order","getDefaultSiteTemplate","getTemplates","defaultTemplate","getConfig","createContext","CurrentUser","CurrentAccount","CurrentCustomer","CurrentLocale","templateService","customerContext","accountContext","campaignContext","tagContext","navigationContext","Permissions","CCUIPilots","DynamicPermissions","Urls","Omniture","PageTrackingId","DataServiceContextProvider","props","serverContext","overrideProps","isM365PremiumUser","useIsM365PremiumUser","fbHostSystemScenario","DMC","permissions","useMemo","IsM365PremiumUser","dataServiceContext","SmartPageService","ImageService","Provider","value","children","extendProps","defaultClientContext","isMobile","responsiveMode","ResponsiveMode","LargeDesktop","isRuntime","ClientContext","useClientContext","logError","logMetrics","instrumentation","useInstrumentationServiceContext","defaultSchema","name","activity","appVersion","errorMappers","odataErrorMapper","OdataErrorMapper","odataErrorCodes","campaignApiErrorMapper","CampaignApiErrorMapper","campaignApiErrorCodes","urlErrorMapper","UrlErrorMapper","invalidDomains","formattedUserErrorCodes","chain","errorCode","trim","toUpperCase","formatNameValue","isObject","onLine","getInstrumentation","isProdRuntime","userContext","getInstrumentationInstance","pageTrackingId","isInDevelopmentMode","isTestEnvironment","applicationName","systemName","subSystemName","objectsToStub","getInstrumentationService","_ref2","_ref2$scenario","scenario","addScenario","InstrumentationSchema","defaultScenario","create","stubOptions","lcid","Locale","eventHandler","AjaxEventHandler","shouldAddHeaders","ajaxContext","isInternalUrl","url","ajaxStub","AjaxStub","errorStub","ErrorStub","stub","errorResponseJson","isUserError","isArray","errorCodesInResponse","pluck","code","index","contains","isUserErrorCodes","isIgnorable","readyState","trace","siteConfigReducer","state","action","newState","_action$payload","payload","_action$payload2","_action$payload3","snapshots","subDomain","siteContextInfo","orderedComponentsInPages","migrationContext","forceUpdate","associations","isEqual","cloneDeep","_action$payload4","page","pageIndex","newPage","newPages","getUpdatedPages","_action$payload5","updatedConfig","getComponentByType","coverImageConfig","COMPONENT_TYPE_MAPPING","CoverImage","_action$payload6","uetTagId","isMTagMigrated","_action$payload7","imageIdsToRemove","imagesToAdd","finalImageIdsToRemove","filterImageIdsToRemove","getUpdateImages","localImageUrl","_action$payload8","orderedComponents","_action$payload9","SiteConfigContext","dispatchSiteConfig","useSiteConfig","useDebouncedDispatchSiteConfig","wait","SavedSiteConfigContext","savedSiteConfig","updateSavedSiteConfig","useSavedSiteConfig","useCurrentLocale","siteConfigLocale","getWebsiteSourceDataByKey","WEBSITE_SOURCE_DATA_KEY_MAPPING","Localization","useSiteConfigLocale","contextLocale","useContextLocale","EditorStatusContext","PreviewMode","Desktop","Mobile","useEditorStatusContext","useIsComponentSelected","context","editingComponentType","editorStatusLoadingWrapperForPromise","dispatch","CountryContext","useCountryContext","PreferenceService","setAtUserLevel","Name","Data","useI18n","I18nContext","IntegrationContext","INTEGRATE_ENV_TYPE","STANDALONE","useIntegrationContext","useIsPmaxLiteIntegration","PMAX_LITE_WIZARD","usePilotsValue","getPilotValue","useIsBusinessHourSectionEnabled","PILOTS","isSmartPageBusinessHourSectionEnabled","useIsSmartPageImageTextSuggestionEnabled","isSmartPageImageTextSuggestionEnabled","useIsSmartPageM365StockImageEnabled","isSmartPageM365StockImageEnabled","useIsSmartPageM365StockImageGalleryEnabled","isSmartPageM365StockImageGalleryEnabled","useIsSmartPageVideoSectionEnabled","isSmartPageVideoSectionEnabled","useIsSmartPageMapEnabled","isSmartPageMapEnabled","useIsSmartPageCustomizedUpdateEnabled","isSmartPageCustomizedUpdateEnabled","useIsSmartPageM365BannerEnabled","isSmartPageM365BannerEnabled","useIsSmartPageDarkModeEnabled","isSmartPageDarkModeEnabled","useIsSmartPageBookAppointmentEnabled","isSmartPageBookAppointmentEnabled","useIsSmartPageTemplateSuggestionEnabled","isSmartPageTemplateSuggestionEnabled","useIsSmartPageImprovedReviewsEnabled","isSmartPageImprovedReviewsEnabled","useIsSmartPagePrivacyPolicyEnabled","isSmartPagePrivacyPolicyEnabled","useIsSmartPageRuntimePageWcpConsentEnabled","isSmartPageRuntimePageWcpConsentEnabled","useIsM365Premium","isSmartPageM365PremiumFeatureEnabled","useAllPilots","isM365Premium","allPilots","pilots","Object","forEach","useIsDraftOrPendingAccount","Status","useUserAccountCustomer","postponeRead","_ref$componentName","componentName","accountLevelVariables","useAccountLevelVariables","customerLevelVariables","useCustomerLevelVariables","postponeReadConfig","usePostponeReadVariables","_useUser","useUser","_useUser2","user","_useUser2$","updateUserOR","update","readUserOR","read","_useAccount","useAccount","_useAccount2","account","_useAccount2$","updateAccountOR","readAccountOR","_useCustomer","useCustomer","_useCustomer2","customer","_useCustomer2$","updateCustomerOR","readCustomerOR","_usePromisify","usePromisify","_usePromisify2","updateUser","updateAccount","updateCustomer","readUser","readAccount","readCustomer","updateUserWithLog","promiseLogWrapper","updateAccountWithLog","updateCustomerWithLog","readUserWithLog","readAccountWithLog","readCustomerWithLog","useMobileSupportEnabled","useMediaQuery","isHookedInWizard","UP_WIZARD","SUB_ADS_WIZARD","SUB_ADS_WIZARD2","STREAMLINED_WIZARD","useIsHookedInWizard","ComponentLoadingStatus","LOADED","NOT_LOADED","UNSET","LOADING","defaultElementStatus","reason","PreviewPageContext","elementsLoadingStatus","coverImage","description","updateElementsLoadingStatus","usePreviewPageContext","AppInsightsContext","DefaultErrorView","errorViewMode","errorViewProps","location","GlobalErrorView","getErrorView","getErrorOptions","_ref3","info","_ref$componentStack","componentStack","isString","errorStack","stack","message","toString","createErrorMessage","renderErrorView","loop","withErrorView","WrappedComponent","Component","memo","assign","errorOptions","withErrorOptions","_objectWithoutProperties","_excluded","GlobalErrorBoundary","__webpack_require__","r","__webpack_exports__","runtimeComponentsMapping","_runtimeComponentsMap","header","SmartHeader","footer","SmartFooter","introduction","SmartIntroduction","SmartCoverImage","SmartActionButton","gallery","SmartGallery","contact","SmartContact","SmartBusinessHours","SmartUpdate","SmartSummary","SmartProfessionalService","video","SmartVideo","socialLinks","SmartSocialLinks","SmartReview","UnStyledSmartGroup","colStart","colSpan","totalNodesWithSameLevel","breakpointsClasses","customBreakPoint","itemContainer","layoutComponentsMapping","_ref4","dir","section","group","_ref3$palette","palette","display","flexDirection","primaryBackground","& .component-title","primaryText","minHeight","Factory","node","rootId","dynamicComponentRender","nodeComponent","rest","LayoutComponent","nodeShape","PropTypes","string","isRequired","arrayOf","shape","NodeRender","childNodes","childNode","DynamicComponentRender","_ref$config","restConfigs","ItemComponent","componentsMapping","data-component-type","data-component-id","PageLayout","SiteBuilderInternal","onRenderCompleted","enabledComponentsConfig","useRef","current","tree","allComponents","removeDisabledComponents","root","idMapping","reduce","component","parentId","parentSection","buildNestedTree","componentConfig","newComponentsInPage","getStyles","container","minWidth","maxWidth","boxSizing","margin","largeDesktopContainer","marginLeft","alignContent","SiteBuilder","_ref2$","_ref2$2","editingComponentId","setTimeout","navigateToEditingComponent","useDefaultStyles","getEnabledComponentsConfig","SmartPageRuntime","siteInfo","isDarkModeEnabled","_useReducer","useReducer","_useReducer2","componentRef","_useResponsiveMode","useResponsiveMode","clientContext","lang","locale","documentElement","language","insertScripts","consent","Analytics","Advertising","inlineCode","WcpConsent","_siteConsent","siteConsent","getConsent","themes","light","useWcpConsent","getCurrentTheme","themeConfig","getThemeConfigFromWSD","core","outerBackground","ref","ThemeProvider","SmartBanner","getCommonOdataOptions","currentCustomer","currentAccount","host","ServicesEndpoints","CampaignAPI","path","CampaignAPIPath","token","Token","_serverContext$Urls","_serverContext$Urls2$","SignOutUrl","cid","Id","aid","signOutOnTokenExpire","signOutUrl","addOptionsToODataMethod","methodName","_len","args","Array","_key","_http$signature","http","signature","_http$signature2","cb","odata","defaults","xhr","textStatus","errorThrown","wrapOptionsOfODataMethods","wrappedOdata","get","post","put","patch","delete","SmartPageAction","SmartPageStatus","Published","Offline","Deleted","Draft","PendingPublish","UnpublishedChanges","siteConfigToModel","attrs","getAttributesFromSiteConfig","snapshotAttrs","getAttributesFromSnapshot","_getDataSourceByKeys","getDataSourceByKeys","DATA_SOURCE_KEY_MAPPING","BusinessName","BusinessDescription","BusinessCategories","_getDataSourceByKeys2","businessDescription","businessCategories","generateGuid","descriptionFromCategory","join","@odata.type","Description","SubDomain","SiteSuffix","UetTagId","IsMTagMigrated","Attributes","Snapshots","ImageIds","SmartPageDataContext","Action","WebsiteSourceData","createWebsiteSourceData","WSDMigrationContext","_getCommonOdataOption","initOption","baseUrl","defaultQuery","$top","$skip","$count","oDataOption","contentType","oDataToken","getUrlWithId","pollCompletion","retry","dataType","getAll","customQuery","query","extend","modelToSiteConfig","publish","pollStatus","fbPageId","fbAuthInfo","fbPageAuthorizationData","Scenario","Content","facebookPageToSiteConfig","UserToken","sortBy","pageInfo","isSubdomainAvailable","getBusinessCategorySuggestions","searchQueries","_ref2$locale","associateEntities","entityIds","associatedEntityStatus","EntityIds","AssociationType","AssociatedEntityStatus","disassociateEntities","getAssociationsByEntityIds","getSmartPageMetrics","startDate","endDate","first","campaignOption","accountOption","campaignBaseUrl","accountBaseUrl","campaignBaseUrlWithId","attachCampaignParams","params","paramStr","entries","includes","getCampaign","expand","patchCampaign","getCampaigns","getBudgetSuggestion","getSocialProfileIds","profile","getActivitesCount","_ref5","activityTypes","lastCheckPoint","profileIds","getAdsPerformanceMetrics","getCategorySuggestions","getContentSuggestions","keywords","resultOption","imageSource","entity","getTemplateSuggestions","categories","getExistingBookings","emailAddress","EmailAddress","phoneNumber","PhoneNumber","sequence","Sequence","time","Time","timeInMinutes","TimeInMinutes","Message","Service","userTimeZoneOffset","UserTimeZoneOffset","upsertSmartPageBookings","_ref6","manageAppointmentLink","customerEmailAddress","bookingDetail","smartPageId","customerTimeZoneOffset","userLocale","Bookings","SPEmailAddress","ManageAppointmentLink","SPTimeZoneOffset","UserLocale","updateDomain","_ref7","customDomain","isAutoUpdateDNS","userId","userToken","ignoreUpdateInterval","Subdomain","IgnoreUpdateInterval","IsAutoUpdateDNSRecords","M365AuthorizationData","getM365Domains","domainName","DomainName","domainType","DomainType","dnsProviderName","DnsProviderName","saveCampaignToGoLiveLater","campaignId","SignupCampaignIds","odataService","ImageODataService","getImage","IdString","ImageUrl","Url","Width","Height","ids","upload","imageData","base64Index","body","substr","Type","postImage","result","imageUrls","csvRows","imageUrl","serializecsvRow","flatten","serializeCSV","CsvRows","imageInfo","csvData","headers","slice","errorColIndex","imageIdColIndex","uploadUrlColIndex","col","row","uploadUrl","parse","MailService","customerName","customerEmail","protocol","sendMail","mailType","userName","userMail","userPhone","MailType","SmartPage","CustomerName","CustomerEmail","UserName","UserEmail","UserPhone","UserMessage","generalErrorMessage","getDomainsOAuthErrorMessage","SmartPageErrorMap","GeneralError","TimeOut","SmartPageInvalidStatusForAdd","SmartPageSubdomainIsNotAvailable","SmartPageLimitExceeded","SmartPageSiteSuffixAlreadyExists","SmartPageMissingSiteSuffix","SmartPageListIsNullOrEmpty","SmartPageInvalidSiteSuffix","SmartPageIsNull","SmartPageInvalidStatus","SmartPageInvalidSubdomain","CustomerNotInPilotForSmartPage","SmartPageGetFbPageUserError","SmartPageGetFbPageApiError","SmartPageIdIsInvalid","SmartPageConcurrentUpdatingIsNotAllowed","SmartPageIncompleteInfoProvided","SmartPageTableStorageError","SmartPageAssociationListIsNullOrEmpty","SmartPageAssociationInvalidStatus","DuplicateSmartPageAssociation","SmartPageAssociationInvalidType","SmartPageSubdomainExceedsMaxLength","SmartPageFbImportParamMissing","SmartPageFbImportNoTokenFoundInKeyVault","SmartPageSubdomainChangeIsNotAllowed","SmartPageUrlIsRejectedByEditorial","SmartPageCustomDomainIsNotAvailable","SmartPagePreviousCustomDomainIsNotFreedUp","SmartPagePreviousSubdomainIsNotFreedUp","SmartPageUpdateDomainWithin24HoursNotAllow","SmartPageM365TokenIsNullInKeyVault","SmartPageInvalidM365TokenInKeyVault","SmartPageM365OAuthError","SmartPageM365AdminApiError","getContextLocale","DEBOUNCE_WAIT_IN_MS","ContentSuggestionOption","None","ImageOnly","TextOnly","Both","ContentSuggestionSource","TemplateAdsOnly","M365","useContentSuggestions","initWithLoading","imageSuggestions","textSuggestion","suggestions","setSuggestions","setError","setIsLoading","previousSearchOptions","cbBusinessName","cbKeywords","cbResultOption","finalBusinessName","finalKeywords","finalResultOption","option","newTextSuggestion","Text","newImageSuggestions","Images","debouncedGetContentSuggestions","cancel","errorCodeMapping","SlotNotAvailable","useBookingService","bookingService","createBooking","SmartPageId","BookingDetails","bookingDetails","BookingService","isCreatingBooking","setIsCreatingBooking","isGetExistingBookings","setIsGetExistingBookings","getBookingError","setGetBookingError","createBookingError","setCreateBookingError","existingBookings","setExistingBookings","errorMessage","getExistingBooking","getSmartPageDefaultSiteTheme","disableEvents","eventsStyles","pointerEvents","getEventsStyles","defaultPageMarginLeft","defaultPageMarginRight","sectionTitle","justifyContent","navLink","defaultButton","secondaryText","border","width","&:hover, &:focus","primaryButton","buttonText","buttonBackground","fixedMobileFooter","truncate","whiteSpace","overflow","textOverflow","effects","elevation"],"mappings":"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","file":"static/js/application.initial~493df0b3.b389a7a1.chunk.js","sourcesContent":["import React from 'react';\r\nimport classNames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\n\r\nconst getStyles = () => ({\r\n facebookImportDialogStepFBConnect: {\r\n left: '50%',\r\n position: 'relative',\r\n transform: 'translate(-50%, 0px)',\r\n },\r\n fbConnectSection: {\r\n height: 112,\r\n background: '#FFFFFF',\r\n lineHeight: '100px',\r\n textAlign: 'center',\r\n marginBottom: 24,\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n padding: 25,\r\n },\r\n fbConnectIcon: {\r\n color: '#1877F2',\r\n fontSize: 32,\r\n lineHeight: '32px',\r\n left: '50%',\r\n transform: 'translate(-50%, 0)',\r\n position: 'relative',\r\n fontFamily: 'MsAds MDL2 Assets',\r\n '&:before': {\r\n content: '\"\\\\ECB3\"',\r\n },\r\n },\r\n fbConnectTips: {\r\n marginTop: 10,\r\n height: 24,\r\n lineHeight: '24px',\r\n },\r\n});\r\n\r\nconst UnStyledFacebookImportDialogStepFBConnect = ({\r\n i18n,\r\n classes,\r\n onConnectClick,\r\n}) => (\r\n
\r\n \r\n
\r\n
\r\n {i18n.getString(_TL_('Connect Facebook page'))}\r\n
\r\n
\r\n
\r\n {i18n.getString(_TL_('You do not have any connected Facebook profile. Connect to your Facebook account to proceed. Your account will not be added to DMC social management.'))}\r\n
\r\n
\r\n);\r\n\r\nUnStyledFacebookImportDialogStepFBConnect.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n classes: PropTypes.shape({\r\n itemContainer: PropTypes.string,\r\n }).isRequired,\r\n onConnectClick: PropTypes.func.isRequired,\r\n};\r\n\r\nexport const FacebookImportDialogStepFBConnect = withDefaultStyles(\r\n withI18nConsumer(UnStyledFacebookImportDialogStepFBConnect),\r\n getStyles\r\n);\r\n","import _ from 'underscore';\r\nimport React, { useState, useEffect, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Dropdown } from '@fluentui/react/lib/Dropdown';\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport { InstrumentationServiceContext } from '@bingads-webui-campaign-react/smart-page-context';\r\n\r\nconst getStyles = () => ({\r\n fbImportDesc: {\r\n marginTop: 20,\r\n marginBottom: 20,\r\n },\r\n fbReconnect: {\r\n marginTop: 24,\r\n },\r\n fbReconnectLink: {\r\n color: '#0078D4',\r\n cursor: 'pointer',\r\n },\r\n});\r\n\r\nconst UnStyledFacebookImportDialogStepFBImport = ({\r\n i18n,\r\n classes,\r\n fbSites,\r\n onFBSiteSelected,\r\n onReConnectFB,\r\n}) => {\r\n const transformFBSitesData =\r\n () => _.map(fbSites, fbSite => ({ key: fbSite.facebookId, text: fbSite.businessName }));\r\n\r\n const options = transformFBSitesData(fbSites);\r\n const [selectedPage, setSelectedPage] = useState(options[0] ? options[0].key : '');\r\n\r\n const logger = useContext(InstrumentationServiceContext);\r\n\r\n useEffect(() => {\r\n onFBSiteSelected(selectedPage);\r\n }, [selectedPage]);\r\n\r\n const onChange = (event, item) => {\r\n setSelectedPage(item.key);\r\n logger.logTrace(`FacebookImportDialog|ImportStep|PageDropdownSelection|Selected: ${item.key}`);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n {i18n.getString(_TL_('If you don\\'t see your pages listed:'))}\r\n
    \r\n
  • \r\n \r\n {i18n.getString(_TL_('Reconnect your Facebook account.'))}\r\n \r\n
  • \r\n
  • \r\n {i18n.getString(_TL_('Check if you\\'re signed in to the correct Facebook account.'))}\r\n
  • \r\n
  • \r\n {i18n.getString(_TL_('Check if you\\'re the administrator for the Facebook page in your Facebook account.'))}\r\n
  • \r\n
\r\n
\r\n
\r\n {i18n.getString(_TL_('We\\'ll import your:'))}\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nUnStyledFacebookImportDialogStepFBImport.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n classes: PropTypes.shape({\r\n itemContainer: PropTypes.string,\r\n }).isRequired,\r\n fbSites: PropTypes.arrayOf(PropTypes.any),\r\n onFBSiteSelected: PropTypes.func,\r\n onReConnectFB: PropTypes.func,\r\n};\r\n\r\nUnStyledFacebookImportDialogStepFBImport.defaultProps = {\r\n fbSites: [],\r\n onFBSiteSelected: _.noop,\r\n onReConnectFB: _.noop,\r\n};\r\n\r\nexport const FacebookImportDialogStepFBImport = withDefaultStyles(\r\n withI18nConsumer(UnStyledFacebookImportDialogStepFBImport),\r\n getStyles\r\n);\r\n","import Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { loadScriptAsynchronously } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nconst fbSdkScriptId = 'facebook-js-sdk';\r\nconst fbSdkUrl = 'https://connect.facebook.net/en_US/sdk.js';\r\n\r\nconst getFacebookJsSdk = () => {\r\n const { FB } = window;\r\n\r\n if (_.isUndefined(FB) || _.isUndefined(FB.init)) {\r\n return null;\r\n }\r\n\r\n return FB;\r\n};\r\n\r\n/**\r\n * Poll until the Facebook JS SDK is available on this page.\r\n * @param {Number} [maxAttempts=10] - Max number of attempts.\r\n * @param {Number} [interval=100] - Time in ms to wait between attempts.\r\n * @param {Number} [currentAttempts=0] - Current number of attempts.\r\n * @returns {Promise} - Promise that resolves to the Facebook SDK or null if it failed to load.\r\n */\r\nconst pollForFacebookJsSdk = (maxAttempts = 10, interval = 100, currentAttempts = 0) => {\r\n const sdk = getFacebookJsSdk();\r\n\r\n if (!sdk) {\r\n if (currentAttempts >= maxAttempts) {\r\n // reached max attempts\r\n return Promise.resolve(null);\r\n }\r\n\r\n // delay and then poll again\r\n return Promise.delay(interval)\r\n .then(() => pollForFacebookJsSdk(maxAttempts, interval, currentAttempts + 1));\r\n }\r\n\r\n return Promise.resolve(sdk);\r\n};\r\n\r\n// check if already initialize the FB SDK with a different appId\r\n// if so, we need to remove the sdk first\r\nconst checkAndDoCleanIfAppIdNotMatch = (appId) => {\r\n if (window.fbAppIdInUse && window.fbAppIdInUse !== appId) {\r\n if (document.getElementById(fbSdkScriptId)) {\r\n document.getElementById(fbSdkScriptId).remove();\r\n }\r\n window.fbAsyncInit = undefined;\r\n window.FB = undefined;\r\n window.fbAppIdInUse = undefined;\r\n }\r\n};\r\n\r\nexport const facebookInit = (DMCAppId, logger, handleFacebookSDKError) => {\r\n logger.logTrace('Initializing Facebook SDK');\r\n\r\n // TODO: DMC will provide an appId in development mode,\r\n // For dev, we all have no permissions to that fb app.\r\n // So just use DMC SI appId for our local env here,\r\n // Will follow up with DMC for the permissions and remove here.\r\n let appId = DMCAppId;\r\n const localEnvPattern = /^(app1\\.)?(beta\\.)?ui\\.ads-int\\.microsoft\\.com$/;\r\n const localEnvCCPattern = /^(app1\\.)?(beta\\.)?ads-int\\.microsoft\\.com$/;\r\n if (document.domain.match(localEnvPattern) || document.domain.match(localEnvCCPattern)) {\r\n appId = '647456452727479';\r\n }\r\n\r\n // check if already initialize the FB SDK with a different appId\r\n checkAndDoCleanIfAppIdNotMatch(appId);\r\n\r\n // setup the initialization callback\r\n if (!window.fbAsyncInit) {\r\n window.fbAsyncInit = () => {\r\n window.FB.init({\r\n appId,\r\n status: true,\r\n xfbml: false,\r\n version: 'v8.0',\r\n });\r\n\r\n logger.logTrace('Successfully initialized Facebook SDK');\r\n };\r\n }\r\n\r\n return loadScriptAsynchronously({ id: fbSdkScriptId, src: fbSdkUrl, logger })\r\n .then(pollForFacebookJsSdk)\r\n .then((sdk) => {\r\n if (sdk) {\r\n window.fbAppIdInUse = appId;\r\n logger.logTrace('Successfully loaded Facebook SDK');\r\n } else {\r\n logger.logTrace('Failed to loaded Facebook SDK, SDK is empty');\r\n throw new Error('Facebook SDK is empty');\r\n }\r\n\r\n return sdk;\r\n })\r\n .error((err) => {\r\n logger.logTrace(`Error while loading Facebook SDK: ${JSON.stringify(err)}`);\r\n\r\n // Try to get the sdk and retrieve more logs for investigating sdk load timeout\r\n fetch(fbSdkUrl)\r\n .then((res) => {\r\n if (res.ok) {\r\n logger.logTrace('Refetch fb sdk succeed.');\r\n } else {\r\n logger.logTrace(`Refetch fb sdk failed. status: ${res.status} statusText: ${res.statusText}`);\r\n }\r\n })\r\n .catch((e) => {\r\n logger.logTrace(`Error while fetch FB SDK: ${JSON.stringify(e)}`);\r\n });\r\n\r\n if (document.getElementById(fbSdkScriptId)) {\r\n logger.logTrace('Removing Facebook SDK script due to error.');\r\n document.getElementById(fbSdkScriptId).remove();\r\n }\r\n\r\n handleFacebookSDKError();\r\n });\r\n};\r\n\r\nexport const facebookLogin = (onSuccess, onFail, logger, fbAppId, handleFacebookSDKError) => {\r\n logger.logTrace('Trying to login Facebook account');\r\n\r\n facebookInit(fbAppId, logger, handleFacebookSDKError)\r\n .then((sdk) => {\r\n sdk.getLoginStatus((loginStatus) => {\r\n if (loginStatus.status === 'connected') {\r\n onSuccess(loginStatus);\r\n logger.logTrace('Facebook account already logged in');\r\n } else {\r\n const permissions = 'pages_read_engagement, pages_read_user_content, business_management, pages_manage_ads';\r\n const loginOptions = {\r\n scope: permissions,\r\n return_scopes: true,\r\n };\r\n\r\n try {\r\n window.FB.login(\r\n (fbInfo) => {\r\n onSuccess(fbInfo);\r\n logger.logTrace('Successfully logged in Facebook account');\r\n },\r\n loginOptions\r\n );\r\n } catch (response) {\r\n if (response.error) {\r\n onFail({\r\n error: response.error,\r\n });\r\n\r\n logger.logTrace(`Error while login Facebook account: ${response.error}`);\r\n return;\r\n }\r\n\r\n onFail({\r\n error: 'AUTH_ERROR',\r\n });\r\n logger.logTrace('Error while login Facebook account');\r\n }\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n logger.logTrace(`Error while login Facebook account. ${JSON.stringify(error)}`);\r\n });\r\n};\r\n\r\nexport const facebookLogout = (onLogoutSuccess, logger, fbAppId, handleFacebookSDKError) => {\r\n logger.logTrace('Trying to logout Facebook account');\r\n\r\n facebookInit(fbAppId, logger, handleFacebookSDKError)\r\n .then((sdk) => {\r\n sdk.getLoginStatus((loginStatus) => {\r\n if (loginStatus.status === 'connected') {\r\n // For some reason, the callback in logout has been executed twice\r\n // add debounce for workaround\r\n const debouncedOnLogoutSucceed = _.debounce(() => {\r\n onLogoutSuccess();\r\n logger.logTrace('Successfully logout Facebook account');\r\n }, 10);\r\n window.FB.logout(debouncedOnLogoutSucceed);\r\n } else {\r\n onLogoutSuccess();\r\n logger.logTrace('Facebook account is not logged in, skip logout');\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n logger.logTrace(`Error while logout Facebook account. ${JSON.stringify(error)}`);\r\n });\r\n};\r\n","import React, { useState, useContext, useEffect, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classNames from 'classnames';\r\n\r\nimport { ReactTemplate } from '@bingads-webui-react/react-template';\r\nimport { Panel, Link, PrimaryButton, DefaultButton } from '@fluentui/react';\r\nimport { withI18nConsumer } from '@bingads-webui-react/i18n-context';\r\nimport { withDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport {\r\n DataServiceContext,\r\n InstrumentationServiceContext,\r\n} from '@bingads-webui-campaign-react/smart-page-context';\r\nimport { UiBlocker } from '@bingads-webui-react/ui-blocker';\r\nimport { getParameter } from '@bingads-webui/url-util';\r\n\r\nimport { FacebookImportDialogStepFBConnect } from './components/facebook-import-dialog-step-fb-connect';\r\nimport { FacebookImportDialogStepFBImport } from './components/facebook-import-dialog-step-fb-import';\r\nimport { facebookInit, facebookLogin, facebookLogout } from './util/facebook-import-util';\r\n\r\nconst IMPORT_STEP = {\r\n connect: 0,\r\n pageList: 1,\r\n};\r\n\r\nconst getStyles = () => ({\r\n panelContent: {\r\n marginTop: 20,\r\n paddingBottom: 65,\r\n },\r\n panelSubTitle: {\r\n marginBottom: 16,\r\n },\r\n btnNext: {\r\n marginRight: 8,\r\n },\r\n});\r\n\r\nconst FB_ERRORS = {\r\n SignInError: 'SIGN_IN_ERR',\r\n GetPageListError: 'GET_PAGE_LIST_ERROR',\r\n GetPageError: 'GET_PAGE_INFO_ERROR',\r\n};\r\n\r\nconst UnStyledSmartPageFacebookImportDialogInternal = ({\r\n i18n,\r\n classes,\r\n updateFBInfo,\r\n dataFilter,\r\n onDismiss,\r\n siteAuthInfo,\r\n setSiteAuthInfo,\r\n showWarningMessage,\r\n autoConnect,\r\n onInitFailed,\r\n onGetPageListFailed,\r\n}) => {\r\n const [fbSites, setFbSites] = useState([]);\r\n const [selectedFBSiteId, setSelectedFBSiteId] = useState('');\r\n const [step, setStep] = useState(-1);\r\n const [startStep, setStartStep] = useState(-1);\r\n const { smartPageService, hostSystemScenario, fbAppId } = useContext(DataServiceContext);\r\n const logger = useContext(InstrumentationServiceContext);\r\n\r\n const loadingTxtConfig = {\r\n Initiating: i18n.getString(_TL_('Initiating Facebook import...')),\r\n Importing: i18n.getString(_TL_('Importing your content over...')),\r\n };\r\n const [loading, setLoading] =\r\n useState({ isLoading: false, loadingTxt: loadingTxtConfig.Initiating });\r\n\r\n const handleFacebookSDKError = useCallback(() => {\r\n onInitFailed();\r\n showWarningMessage(i18n.getString(_TL_('Failed to connect to Facebook server, please try again later.')));\r\n }, [i18n, showWarningMessage, onInitFailed]);\r\n\r\n const handleErrors = (error) => {\r\n switch (error) {\r\n case FB_ERRORS.SignInError:\r\n showWarningMessage(i18n.getString(_TL_('We were not able to sign you into Facebook. Please try again.')));\r\n facebookLogout(_.noop, logger, fbAppId, handleFacebookSDKError);\r\n break;\r\n case FB_ERRORS.GetPageListError: {\r\n const messageElement = (\r\n {text} }}\r\n template={i18n.getString(_TL_('The Facebook account you\\'ve logged in with is not associated with any Facebook Business Pages. Please create a new Page or {{link}}log into a different Facebook account{{/link}}.'))}\r\n />\r\n );\r\n showWarningMessage(messageElement);\r\n facebookLogout(_.noop, logger, fbAppId, handleFacebookSDKError);\r\n break;\r\n }\r\n case FB_ERRORS.GetPageError:\r\n showWarningMessage(i18n.getString(_TL_('We were not able to import the information from this Facebook page. Please try again.')));\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const handleFBPagePartialErrors = (errors) => {\r\n let haveError = false;\r\n _.each(errors, (error) => {\r\n if (!_.isEmpty(error)) {\r\n haveError = true;\r\n }\r\n });\r\n if (haveError) {\r\n showWarningMessage(i18n.getString(_TL_('We weren’t able to import everything necessary for your website. This may be due to some permission not being accepted or privacy settings on your Facebook page.')));\r\n }\r\n };\r\n\r\n const getFBPageListInfo = (fbInfo) => {\r\n if (!fbInfo || !fbInfo.authResponse || !fbInfo.authResponse.accessToken) {\r\n setLoading({ isLoading: false, loadingTxt: loadingTxtConfig.Initiating });\r\n handleErrors(FB_ERRORS.SignInError);\r\n return;\r\n }\r\n\r\n const authInfo = {\r\n fbToken: fbInfo.authResponse.accessToken,\r\n fbUserId: fbInfo.authResponse.userID,\r\n };\r\n\r\n setSiteAuthInfo(authInfo);\r\n smartPageService.getFacebookPageList(authInfo, [], hostSystemScenario)\r\n .then((data) => {\r\n if (_.isEmpty(data)) {\r\n handleErrors(FB_ERRORS.GetPageListError);\r\n onGetPageListFailed();\r\n return;\r\n }\r\n setFbSites(data);\r\n setStep(IMPORT_STEP.pageList);\r\n }).catch((err) => {\r\n handleErrors(FB_ERRORS.GetPageListError);\r\n logger.logTrace('FacebookImportDialog|GetPageListError', err);\r\n onGetPageListFailed();\r\n }).finally(() => {\r\n setLoading({ isLoading: false, loadingTxt: loadingTxtConfig.Initiating });\r\n });\r\n };\r\n\r\n const connectFacebookForSelenium = () => {\r\n const fbUserId = getParameter('fbUserId');\r\n const fbToken = getParameter('fbToken');\r\n const seleniumFBInfo = {\r\n authResponse: {\r\n accessToken: fbToken,\r\n userID: fbUserId,\r\n },\r\n };\r\n setLoading({ isLoading: true, loadingTxt: loadingTxtConfig.Initiating });\r\n getFBPageListInfo(seleniumFBInfo);\r\n };\r\n\r\n const connectFacebook = () => {\r\n setLoading({ isLoading: true, loadingTxt: loadingTxtConfig.Initiating });\r\n facebookLogin(getFBPageListInfo, (err) => {\r\n handleErrors(FB_ERRORS.SignInError);\r\n logger.logTrace('FacebookImportDialog|LoginError', err);\r\n }, logger, fbAppId, handleFacebookSDKError);\r\n };\r\n\r\n const connect = () => {\r\n const envPattern = /^(app1\\.)?(ui\\.)?(beta\\.)?ads-int\\.microsoft\\.com$/;\r\n const isSISelenium = getParameter('isSelenium') && document.domain.match(envPattern);\r\n\r\n if (isSISelenium) {\r\n connectFacebookForSelenium();\r\n } else {\r\n connectFacebook();\r\n }\r\n };\r\n\r\n const onNextClick = () => {\r\n switch (step) {\r\n case IMPORT_STEP.connect:\r\n logger.logTrace('FacebookImportDialog|ConnectStep|ConnectButton|clicked');\r\n connect();\r\n break;\r\n case IMPORT_STEP.pageList:\r\n logger.logTrace('FacebookImportDialog|ImportStep|ImportButton|clicked');\r\n setLoading({ isLoading: true, loadingTxt: loadingTxtConfig.Importing });\r\n smartPageService\r\n .getFacebookPage(selectedFBSiteId, siteAuthInfo, dataFilter, hostSystemScenario)\r\n .then((fbSiteConfig) => {\r\n updateFBInfo(fbSiteConfig, siteAuthInfo.fbUserId);\r\n handleFBPagePartialErrors(fbSiteConfig.fbErrors);\r\n }).catch((err) => {\r\n handleErrors(FB_ERRORS.GetPageError);\r\n logger.logTrace('FacebookImportDialog|GetPageDetailError', err);\r\n }).finally(() => {\r\n setLoading({ isLoading: false, loadingTxt: loadingTxtConfig.Initiating });\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const handleSetStartStep = (stepToSet) => {\r\n setStartStep(stepToSet);\r\n\r\n if (stepToSet === IMPORT_STEP.connect && autoConnect) {\r\n connect();\r\n }\r\n };\r\n\r\n const onPreviousClick = () => {\r\n if (step === 0) {\r\n return;\r\n }\r\n const newStep = step - 1;\r\n setStep(newStep);\r\n };\r\n\r\n const onCancelClick = () => {\r\n logger.logTrace('FacebookImportDialog|CancelButton|clicked');\r\n onDismiss();\r\n };\r\n\r\n const onReConnectFB = () => {\r\n facebookLogout(() => {\r\n setStep(IMPORT_STEP.connect);\r\n handleSetStartStep(IMPORT_STEP.connect);\r\n }, logger, fbAppId, handleFacebookSDKError);\r\n };\r\n\r\n useEffect(() => {\r\n facebookInit(fbAppId, logger, handleFacebookSDKError)\r\n .catch((error) => {\r\n logger.logTrace(`facebookInit error: ${JSON.stringify(error)}`);\r\n });\r\n }, [fbAppId, logger, handleFacebookSDKError]);\r\n\r\n useEffect(() => {\r\n smartPageService.getFacebookPageList(siteAuthInfo, [], hostSystemScenario).then((data) => {\r\n if (_.isEmpty(data)) {\r\n setStep(IMPORT_STEP.connect);\r\n handleSetStartStep(IMPORT_STEP.connect);\r\n return;\r\n }\r\n setFbSites(data);\r\n setStep(IMPORT_STEP.pageList);\r\n handleSetStartStep(IMPORT_STEP.pageList);\r\n setSiteAuthInfo({ ...siteAuthInfo, fbUserId: data[0].facebookUserId });\r\n }).catch((err) => {\r\n handleErrors(FB_ERRORS.GetPageListError);\r\n setStep(IMPORT_STEP.connect);\r\n logger.logTrace('FacebookImportDialog|GetPageListError', err);\r\n onGetPageListFailed();\r\n });\r\n }, []);\r\n\r\n const dialogSteps = [\r\n {\r\n title: i18n.getString(_TL_('Connect with Facebook')),\r\n subtitle: i18n.getString(_TL_('Please connect to your Facebook account or select your connected profile you would like to import your facebook page from.')),\r\n content: (\r\n \r\n ),\r\n },\r\n {\r\n title: i18n.getString(_TL_('Import from Facebook')),\r\n content: (\r\n ),\r\n }];\r\n\r\n const onRenderFooterContent = () => {\r\n const nextBtnText = step === IMPORT_STEP.pageList ? i18n.getString(_TL_('Import')) : i18n.getString(_TL_('Next'));\r\n\r\n return (\r\n
\r\n \r\n {\r\n (step === startStep || autoConnect) ?\r\n :\r\n \r\n }\r\n
\r\n );\r\n };\r\n\r\n useEffect(() => logger.logTrace('FacebookImportDialog|shown'), [logger]);\r\n\r\n return step === -1 ? null : (\r\n \r\n \r\n
\r\n
\r\n {dialogSteps[step].subtitle}\r\n
\r\n {dialogSteps[step].content}\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nUnStyledSmartPageFacebookImportDialogInternal.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n classes: PropTypes.shape({\r\n itemContainer: PropTypes.string,\r\n }).isRequired,\r\n updateFBInfo: PropTypes.func.isRequired,\r\n dataFilter: PropTypes.arrayOf(PropTypes.string),\r\n onDismiss: PropTypes.func,\r\n setSiteAuthInfo: PropTypes.func,\r\n siteAuthInfo: PropTypes.shape({\r\n fbToken: PropTypes.string,\r\n fbUserId: PropTypes.string,\r\n }),\r\n showWarningMessage: PropTypes.func,\r\n autoConnect: PropTypes.bool,\r\n onInitFailed: PropTypes.func,\r\n onGetPageListFailed: PropTypes.func,\r\n};\r\n\r\nUnStyledSmartPageFacebookImportDialogInternal.defaultProps = {\r\n dataFilter: [],\r\n onDismiss: _.noop,\r\n showWarningMessage: _.noop,\r\n onInitFailed: _.noop,\r\n onGetPageListFailed: _.noop,\r\n autoConnect: false,\r\n setSiteAuthInfo: _.noop,\r\n siteAuthInfo: { fbUserId: '', fbToken: '' },\r\n};\r\n\r\nexport const SmartPageFacebookImportDialogInternal = withDefaultStyles(\r\n withI18nConsumer(UnStyledSmartPageFacebookImportDialogInternal),\r\n getStyles\r\n);\r\n","export const facebookPageInfoFilter = {\r\n all: ['Basic', 'Posts', 'Ratings', 'Photos', 'CallToActions'],\r\n basic: ['Basic'],\r\n posts: ['Basic', 'Posts'],\r\n ratings: ['Basic', 'Ratings'],\r\n photos: ['Basic', 'Photos'],\r\n callToActions: ['Basic', 'CallToActions'],\r\n postsPhotos: ['Basic', 'Posts', 'Photos'],\r\n};\r\n","import {\r\n generateSectionWithComponent,\r\n componentsConfig,\r\n DATA_SOURCE_KEY_MAPPING,\r\n COMPONENT_TYPE_MAPPING,\r\n DATA_SOURCE_TO_COMPONENT_TYPE_MAPPING,\r\n getUniqueFacebookPhotos,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\nimport Promise from 'bluebird';\r\nimport _ from 'underscore';\r\n\r\nexport const addDefaultComponentsForFBScenario = (fbDataSource, pilots = {}) => {\r\n const {\r\n isSmartPageImageTextSuggestionEnabled,\r\n isSmartPageBusinessHourSectionEnabled,\r\n } = pilots;\r\n let newComponents = [];\r\n const dataSource = { ...fbDataSource };\r\n\r\n const dataSourceForAddDefaultComponent =\r\n [\r\n DATA_SOURCE_KEY_MAPPING.Photos,\r\n DATA_SOURCE_KEY_MAPPING.Posts,\r\n DATA_SOURCE_KEY_MAPPING.Reviews,\r\n ];\r\n\r\n if (isSmartPageImageTextSuggestionEnabled) {\r\n // In this pilot, FB desc is moved to BusinessSummary\r\n dataSourceForAddDefaultComponent.push(DATA_SOURCE_KEY_MAPPING.BusinessSummary);\r\n } else {\r\n // Originally we create about us section from FB description\r\n dataSourceForAddDefaultComponent.push(DATA_SOURCE_KEY_MAPPING.BusinessDescription);\r\n }\r\n\r\n if (isSmartPageBusinessHourSectionEnabled) {\r\n dataSourceForAddDefaultComponent.push(DATA_SOURCE_KEY_MAPPING.BusinessHours);\r\n }\r\n\r\n _.each(dataSourceForAddDefaultComponent, (dataType) => {\r\n if (!_.isEmpty(dataSource[dataType])) {\r\n const componentType = DATA_SOURCE_TO_COMPONENT_TYPE_MAPPING[dataType];\r\n const newSection =\r\n generateSectionWithComponent({\r\n componentType,\r\n sectionIndex: componentsConfig[componentType].order,\r\n });\r\n newComponents = newComponents.concat(newSection);\r\n }\r\n });\r\n\r\n return newComponents;\r\n};\r\n\r\nexport const addConfigForComponents = (components, dataSource, pilots = {}) => {\r\n const {\r\n isSmartPageImageTextSuggestionEnabled,\r\n isSmartPageBusinessHourSectionEnabled,\r\n } = pilots;\r\n const newComponents = [...components];\r\n\r\n _.each(newComponents, (component) => {\r\n if (component.type === COMPONENT_TYPE_MAPPING.CoverImage) {\r\n const coverImage = dataSource[DATA_SOURCE_KEY_MAPPING.CoverImage] || {};\r\n _.extend(component, {\r\n imageId: coverImage.Id,\r\n imageWidth: coverImage.Width,\r\n imageHeight: coverImage.Height,\r\n // Currently ExternalSrc could only set by image suggestion\r\n externalSrc: coverImage.ExternalSrc,\r\n });\r\n }\r\n if (component.type === COMPONENT_TYPE_MAPPING.Gallery) {\r\n _.extend(component, { photos: dataSource[DATA_SOURCE_KEY_MAPPING.Photos] });\r\n }\r\n if (component.type === COMPONENT_TYPE_MAPPING.Update) {\r\n _.extend(component, { updates: dataSource[DATA_SOURCE_KEY_MAPPING.Posts] });\r\n }\r\n if (component.type === COMPONENT_TYPE_MAPPING.Review) {\r\n _.extend(component, { reviews: dataSource[DATA_SOURCE_KEY_MAPPING.Reviews] });\r\n }\r\n if (component.type === COMPONENT_TYPE_MAPPING.Summary) {\r\n _.extend(component, {\r\n businessSummary: isSmartPageImageTextSuggestionEnabled ?\r\n dataSource[DATA_SOURCE_KEY_MAPPING.BusinessSummary]\r\n : dataSource[DATA_SOURCE_KEY_MAPPING.BusinessDescription],\r\n });\r\n }\r\n if (\r\n component.type === COMPONENT_TYPE_MAPPING.BusinessHours\r\n && isSmartPageBusinessHourSectionEnabled\r\n ) {\r\n _.extend(component, { businessHours: dataSource[DATA_SOURCE_KEY_MAPPING.BusinessHours] });\r\n }\r\n });\r\n\r\n return newComponents;\r\n};\r\n\r\nconst getImageUrls = (imageService, imageIds) => imageService.batchGet(imageIds);\r\n\r\nconst transformPosts = (originUpdates, imagesInfo) => {\r\n let imageIndex = 0;\r\n const updates = [];\r\n\r\n _.map(originUpdates, (originalUpdate) => {\r\n const update = {};\r\n update.id = originalUpdate.Id;\r\n update.message = originalUpdate.Message;\r\n update.createdTime = originalUpdate.CreatedTime;\r\n\r\n if (imageIndex < imagesInfo.length && originalUpdate.FullPicture) {\r\n update.imageId = imagesInfo[imageIndex].IdString;\r\n update.photo = imagesInfo[imageIndex].ImageUrl;\r\n imageIndex += 1;\r\n }\r\n\r\n updates.push(update);\r\n });\r\n\r\n return updates;\r\n};\r\n\r\nconst transformReviews = (originReviews, imagesInfo, businessName) => {\r\n let imageIndex = 0;\r\n const reviews = [];\r\n\r\n _.map(originReviews, (originReview) => {\r\n const review = {};\r\n review.reviewText = originReview.ReviewText;\r\n review.recommendationType = originReview.RecommendationType;\r\n review.createdTime = originReview.CreatedTime;\r\n review.businessName = businessName;\r\n\r\n if (originReview.Reviewer) {\r\n review.id = `${originReview.CreatedTime}-${originReview.Reviewer.Id}`;\r\n review.reviewer = {\r\n name: originReview.Reviewer.Name,\r\n imageId: '',\r\n picture: '',\r\n };\r\n\r\n if (imageIndex < imagesInfo.length\r\n && originReview.Reviewer.Picture\r\n && originReview.Reviewer.Picture.Url\r\n && imagesInfo[imageIndex].IdString\r\n ) {\r\n review.reviewer.imageId = imagesInfo[imageIndex].IdString;\r\n review.reviewer.picture = imagesInfo[imageIndex].ImageUrl;\r\n imageIndex += 1;\r\n }\r\n }\r\n\r\n reviews.push(review);\r\n });\r\n\r\n return reviews;\r\n};\r\n\r\nexport const batchTransformImagesInComponent =\r\n (imageService, images, handleErrors) =>\r\n imageService.bulkUpsert(images, handleErrors)\r\n .then((results) => {\r\n const imageIds = _.compact(results.map(res => res.imageId)); // filter out errored ones\r\n return getImageUrls(imageService, imageIds);\r\n });\r\n\r\nexport const batchTransformImagesInFBInfo = (dataSource, imageService, handleErrors) => {\r\n const MAX_GALLERY_NUM = 4;\r\n const MAX_UPDATES_NUM = 3;\r\n const MAX_REVIEWS_NUM = 3;\r\n const newDataSource = { ...dataSource };\r\n\r\n const originCoverImagePromise = dataSource[DATA_SOURCE_KEY_MAPPING.CoverImage] ?\r\n batchTransformImagesInComponent(\r\n imageService,\r\n [dataSource[DATA_SOURCE_KEY_MAPPING.CoverImage]],\r\n handleErrors\r\n ) : [];\r\n\r\n // TODO need to confirm with Tang about this attr name\r\n const originLogoImagePromise = dataSource.profilePicture ?\r\n batchTransformImagesInComponent(imageService, [dataSource.profilePicture], handleErrors) : [];\r\n\r\n const originalImages = getUniqueFacebookPhotos(dataSource[DATA_SOURCE_KEY_MAPPING.Photos]);\r\n let originGalleryImagesUrls = [];\r\n _.each(originalImages, (item) => {\r\n originGalleryImagesUrls.push(item.Images[0].Url);\r\n });\r\n\r\n if (originGalleryImagesUrls.length > MAX_GALLERY_NUM) {\r\n originGalleryImagesUrls = originGalleryImagesUrls.slice(0, MAX_GALLERY_NUM);\r\n }\r\n\r\n const originGalleryImagesUrlsPromise = _.isEmpty(originGalleryImagesUrls) ? [] :\r\n batchTransformImagesInComponent(imageService, originGalleryImagesUrls, handleErrors);\r\n\r\n let originUpdates = dataSource[DATA_SOURCE_KEY_MAPPING.Posts];\r\n if (originUpdates.length > MAX_UPDATES_NUM) {\r\n originUpdates = originUpdates.slice(0, MAX_UPDATES_NUM);\r\n }\r\n\r\n let originUpdatesImagesUrls = [];\r\n _.each(originUpdates, (item) => {\r\n originUpdatesImagesUrls.push(item.FullPicture);\r\n });\r\n originUpdatesImagesUrls = _.compact(originUpdatesImagesUrls);\r\n\r\n const originUpdatesImagesUrlsPromise = _.isEmpty(originUpdatesImagesUrls) ? [] :\r\n batchTransformImagesInComponent(imageService, originUpdatesImagesUrls, handleErrors);\r\n\r\n\r\n let originReviews = dataSource[DATA_SOURCE_KEY_MAPPING.Reviews];\r\n if (originReviews.length > MAX_REVIEWS_NUM) {\r\n originReviews = originReviews.slice(0, MAX_REVIEWS_NUM);\r\n }\r\n\r\n let originReviewsImagesUrls = [];\r\n _.each(originReviews, (item) => {\r\n if (item.Reviewer && item.Reviewer.Picture) {\r\n originReviewsImagesUrls.push(item.Reviewer.Picture.Url);\r\n }\r\n });\r\n originReviewsImagesUrls = _.compact(originReviewsImagesUrls);\r\n\r\n const originReviewsImagesUrlsPromise = _.isEmpty(originReviewsImagesUrls) ? [] :\r\n batchTransformImagesInComponent(imageService, originReviewsImagesUrls, handleErrors);\r\n\r\n return Promise\r\n .all([\r\n originCoverImagePromise,\r\n originLogoImagePromise,\r\n originGalleryImagesUrlsPromise,\r\n originUpdatesImagesUrlsPromise,\r\n originReviewsImagesUrlsPromise,\r\n ])\r\n .spread((coverImages, logoImages, galleryImages, updatesImages, reviewsImages) => {\r\n newDataSource[DATA_SOURCE_KEY_MAPPING.CoverImage] =\r\n _.first(coverImages) && ({\r\n Id: _.first(coverImages).IdString,\r\n Height: _.first(coverImages).Height,\r\n Width: _.first(coverImages).Width,\r\n });\r\n newDataSource[DATA_SOURCE_KEY_MAPPING.LogoImageId] =\r\n _.first(logoImages) && _.first(logoImages).IdString;\r\n newDataSource[DATA_SOURCE_KEY_MAPPING.Photos] =\r\n _.compact(_.map(\r\n galleryImages,\r\n ({ IdString }, index) => IdString && ({\r\n imageId: IdString,\r\n // keep consistent with logic in smart-component-gallery\r\n fbImageUrl: originalImages[index].Picture,\r\n })\r\n ));\r\n newDataSource[DATA_SOURCE_KEY_MAPPING.Posts] = transformPosts(originUpdates, updatesImages);\r\n newDataSource[DATA_SOURCE_KEY_MAPPING.Reviews] =\r\n transformReviews(\r\n originReviews,\r\n reviewsImages,\r\n dataSource[DATA_SOURCE_KEY_MAPPING.BusinessName]\r\n );\r\n const images = _.compact(_.union(\r\n coverImages,\r\n logoImages,\r\n galleryImages,\r\n updatesImages,\r\n reviewsImages\r\n ));\r\n return { fbDataSource: newDataSource, images };\r\n });\r\n};\r\n\r\nexport const isFacebookImportSupported = siteConfig =>\r\n siteConfig.smartPageDataContext &&\r\n siteConfig.smartPageDataContext.UserId &&\r\n siteConfig.smartPageDataContext.PageId;\r\n\r\nexport const importFromFacebook =\r\n (siteConfig, smartPageService, dataFilter, hostSystemScenario) => {\r\n if (isFacebookImportSupported(siteConfig)) {\r\n return smartPageService\r\n .getFacebookPage(\r\n siteConfig.smartPageDataContext.PageId,\r\n { fbUserId: siteConfig.smartPageDataContext.UserId },\r\n dataFilter,\r\n hostSystemScenario\r\n );\r\n }\r\n return Promise.reject(new Error('NO_FB_AUTH'));\r\n };\r\n","import { some } from 'underscore';\r\n\r\nexport const hasFBOAuthError = (error) => {\r\n if (!error || !error.errors || error.errors.length === 0) {\r\n return false;\r\n }\r\n\r\n return some(error.errors, err => err && err.Code === 'SmartPageGetFbPageOAuthError');\r\n};\r\n","export const Environment = {\r\n PROD: 'PROD',\r\n BETAPROD: 'BETAPROD',\r\n TIP: 'TIP',\r\n SI: 'SI',\r\n BETASI: 'BETASI',\r\n CI: 'CI',\r\n};\r\n\r\n// domains with 'ui.' are for main bundle\r\n// domains without 'ui.' are for signup bundle\r\nexport const Domains = {\r\n PROD: {\r\n UI: {\r\n ADS: 'ui.ads.microsoft.com',\r\n BINGADS: 'ui.bingads.microsoft.com',\r\n BETA: {\r\n ADS: 'ui.beta.ads.microsoft.com',\r\n BINGADS: 'ui.beta.bingads.microsoft.com',\r\n },\r\n TIP: {\r\n ADS: 'ui.tip.ads.microsoft.com',\r\n BINGADS: 'ui.tip.bingads.microsoft.com',\r\n },\r\n },\r\n ADS: 'ads.microsoft.com',\r\n BINGADS: 'bingads.microsoft.com',\r\n BETA: {\r\n ADS: 'beta.ads.microsoft.com',\r\n BINGADS: 'beta.bingads.microsoft.com',\r\n },\r\n TIP: {\r\n ADS: 'tip.ads.microsoft.com',\r\n BINGADS: 'tip.bingads.microsoft.com',\r\n },\r\n },\r\n TEST: {\r\n UI: {\r\n ADSINT: 'ui.ads-int.microsoft.com',\r\n SI_PROXY: 'app1.ui.ads-int.microsoft.com:12000',\r\n SI: 'ui.si.bingads.microsoft.com',\r\n BETA: {\r\n ADSINT: 'ui.beta.ads-int.microsoft.com',\r\n SI: 'ui.beta.si.bingads.microsoft.com',\r\n },\r\n },\r\n ADSINT: 'ads-int.microsoft.com',\r\n SI_PROXY: 'app1.ads-int.microsoft.com:12000',\r\n SI: 'si.bingads.microsoft.com',\r\n BETA: {\r\n ADSINT: 'beta.ads-int.microsoft.com',\r\n SI: 'beta.si.bingads.microsoft.com',\r\n },\r\n LOCAL: 'localhost:3000',\r\n },\r\n};\r\n\r\n/**\r\n * Determines what environment the site is running in, based on the domain.\r\n * @param {string} domain - Current domain.\r\n * @returns {string} - Environment the site is running in.\r\n */\r\nexport function getEnvironment(domain) {\r\n const prodBingAdsPattern = /^(app1\\.)?(ui\\.)?bingads\\.microsoft\\.com$/;\r\n const prodMicrosoftAdsPattern = /^(app1\\.)?(ui\\.)?ads\\.microsoft\\.com$/;\r\n if (domain.match(prodMicrosoftAdsPattern) || domain.match(prodBingAdsPattern)) {\r\n return Environment.PROD;\r\n }\r\n\r\n const betaprodBingAdsPattern = /^(app1\\.)?(ui\\.)?beta\\.bingads\\.microsoft\\.com$/;\r\n const betaprodMicrosoftAdsPattern = /^(app1\\.)?(ui\\.)?beta\\.ads\\.microsoft\\.com$/;\r\n if (domain.match(betaprodMicrosoftAdsPattern) || domain.match(betaprodBingAdsPattern)) {\r\n return Environment.BETAPROD;\r\n }\r\n\r\n const tipBingAdsPattern = /^(app1\\.)?(ui\\.)?tip\\.bingads\\.microsoft\\.com$/;\r\n const tipMicrosoftAdsPattern = /^(app1\\.)?(ui\\.)?tip\\.?ads\\.microsoft\\.com$/;\r\n if (domain.match(tipBingAdsPattern) || domain.match(tipMicrosoftAdsPattern)) {\r\n return Environment.TIP;\r\n }\r\n\r\n const siBingAdsPattern = /^(app1\\.)?(ui\\.)?si\\.bingads\\.microsoft\\.com$/;\r\n const siMicrosoftAdsPattern = /^(app1\\.)?(ui\\.)?ads-int\\.microsoft\\.com$/;\r\n if (domain.match(siMicrosoftAdsPattern) || domain.match(siBingAdsPattern)) {\r\n return Environment.SI;\r\n }\r\n\r\n const betasiBingAdsPattern = /^(app1\\.)?(ui\\.)?beta\\.si\\.bingads\\.microsoft\\.com$/;\r\n const betasiMicrosoftAdsPattern = /^(app1\\.)?(ui\\.)?beta\\.ads-int\\.microsoft\\.com$/;\r\n if (domain.match(betasiMicrosoftAdsPattern) || domain.match(betasiBingAdsPattern)) {\r\n return Environment.BETASI;\r\n }\r\n\r\n return Environment.CI;\r\n}\r\n\r\n/**\r\n * Checks if domain is Prod or TIP domain.\r\n * @param {string} domain - Current domain.\r\n * @returns {bool} - True if Prod or TIP.\r\n */\r\nexport function isProdEnvironment(domain) {\r\n const env = getEnvironment(domain);\r\n return env === Environment.PROD || env === Environment.BETAPROD || env === Environment.TIP;\r\n}\r\n\r\n/**\r\n * Checks if domain is an internal environment like SI or CI or local.\r\n * @param {string} domain - Current domain.\r\n * @returns {bool} - True if not Prod or TIP.\r\n */\r\nexport function isInternalEnvironment(domain) {\r\n return !isProdEnvironment(domain);\r\n}\r\n","import { Environment, getEnvironment } from './get-environment';\r\n\r\n// app ids taken from https://developers.facebook.com\r\nexport const FACEBOOK_APP_ID_FOR_SMART = {\r\n ProdApp: 2255636031317660,\r\n TestApp: 647456452727479,\r\n 'TestApp-CI': 855695624786266,\r\n};\r\n\r\n// app ids for expert account\r\nexport const FACEBOOK_APP_ID_FOR_EXPERT = {\r\n ProdApp: 647456452727479,\r\n TestApp: 768575197290072,\r\n 'TestApp-CI': 768575197290072,\r\n};\r\n\r\n/**\r\n * Gets the app id to use with the Facebook API.\r\n * Each app is restricted to requests from a specific domain name.\r\n * @param {string} domain - Current domain.\r\n * @param {boolean} isExpertAccount - Get different app ids by isExpertAccount flag.\r\n * @returns {Number} App id.\r\n */\r\nexport function getFacebookAppId(domain, isExpertAccount = false) {\r\n const environment = getEnvironment(domain);\r\n\r\n const FACEBOOK_APP_ID = isExpertAccount ? FACEBOOK_APP_ID_FOR_EXPERT : FACEBOOK_APP_ID_FOR_SMART;\r\n\r\n switch (environment) {\r\n case Environment.PROD:\r\n case Environment.BETAPROD:\r\n case Environment.TIP:\r\n return FACEBOOK_APP_ID.ProdApp;\r\n case Environment.SI:\r\n case Environment.BETASI:\r\n return FACEBOOK_APP_ID.TestApp;\r\n default:\r\n return FACEBOOK_APP_ID['TestApp-CI'];\r\n }\r\n}\r\n","import { getSmartPageUrlSuffix } from '@bingads-webui-campaign/smart-page-url-suffix-provider';\r\n\r\nconst SmartPageUrlSuffix = getSmartPageUrlSuffix(document.domain);\r\n\r\nexport const getSmartPageUrl = (subdomain = '', siteSuffix = '') => {\r\n if (siteSuffix) {\r\n return `https://${subdomain}${SmartPageUrlSuffix}/${siteSuffix}`;\r\n }\r\n\r\n return `https://${subdomain}${SmartPageUrlSuffix}`;\r\n};\r\n\r\nexport const getCustomDomain = domainDetail => (domainDetail && domainDetail.CustomDomain) || '';\r\n\r\nexport const addHttps = domain => `https://${domain}`;\r\n\r\nexport const getSmartPageUrlOrCustomDomain = ({\r\n subdomain = '',\r\n siteSuffix = '',\r\n domainDetail = {},\r\n isSmartPageCustomDomainEnabled = false,\r\n} = {}) => {\r\n const spUrl = getSmartPageUrl(subdomain, siteSuffix);\r\n const customDomain = getCustomDomain(domainDetail);\r\n const customUrl = customDomain && addHttps(customDomain);\r\n\r\n return isSmartPageCustomDomainEnabled ? (customUrl || spUrl) : spUrl;\r\n};\r\n","import _ from 'underscore';\r\nimport queryString from 'query-string';\r\nimport { Environment, getEnvironment } from './get-environment';\r\n\r\nconst SMART_PAGE_ENV_MAPPING = {\r\n '.biz.site': Environment.PROD,\r\n '.beta.smartpage.microsoft.com': Environment.BETAPROD,\r\n '.si.smartpage.microsoft.com': Environment.SI,\r\n '.ci.smartpage.microsoft.com': Environment.CI,\r\n '.betasi.smartpage.microsoft.com': Environment.BETASI,\r\n};\r\n\r\nconst ENV_LANDING_PAGE_DOMAIN_MAPPING = {\r\n [Environment.PROD]: 'ui.ads.microsoft.com',\r\n [Environment.BETAPROD]: 'ui.beta.ads.microsoft.com',\r\n [Environment.SI]: 'ui.ads-int.microsoft.com',\r\n [Environment.BETASI]: 'ui.beta.ads-int.microsoft.com',\r\n [Environment.CI]: 'ccui.devdev.bingads.microsoft.com',\r\n [Environment.TIP]: 'ui.tip.ads.microsoft.com',\r\n};\r\n\r\nexport const getSmartPageEnviroment = (domain) => {\r\n let enviroment = null;\r\n const keys = _.keys(SMART_PAGE_ENV_MAPPING);\r\n\r\n for (let i = 0; i < keys.length; i += 1) {\r\n const key = keys[i];\r\n\r\n if (domain.indexOf(key) >= 0) {\r\n enviroment = SMART_PAGE_ENV_MAPPING[key];\r\n break;\r\n }\r\n }\r\n\r\n return enviroment;\r\n};\r\n\r\nexport const getLandingPageUrl = (domain, queries = {}) => {\r\n const env = getSmartPageEnviroment(domain) || getEnvironment(domain);\r\n const landingPageDomain = ENV_LANDING_PAGE_DOMAIN_MAPPING[env];\r\n const landingPagePath = '/campaign/smartpage';\r\n\r\n const appendedQueries = queryString.stringify(queries, {\r\n skipNull: true,\r\n skipEmptyString: true,\r\n });\r\n const formattedQueries = appendedQueries ? `?${appendedQueries}` : '';\r\n\r\n return `//${landingPageDomain}${landingPagePath}${formattedQueries}`;\r\n};\r\n","const reAndroid = /Android|webOS/i;\r\nconst reIOS = /iPad|iPhone|iPod|Opera Mini/i;\r\n\r\nconst ua = navigator.userAgent || navigator.vendor || window.opera;\r\n\r\nexport const isAndroid = (userAgent = ua) => reAndroid.test(userAgent);\r\nexport const isIOS = (userAgent = ua) => reIOS.test(userAgent);\r\nexport const isMobile = (userAgent = ua) => isAndroid(userAgent) || isIOS(userAgent);\r\n","import _ from 'underscore';\r\n\r\nimport {\r\n componentsConfig,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const SmartPageTemplate = {\r\n Default: 'Default',\r\n Professional: 'Professional',\r\n};\r\n\r\nconst requiredComponentList = _.filter(componentsConfig, item => (item.required));\r\n\r\nexport const TemplateComponentListMapping = {\r\n [SmartPageTemplate.Default]: requiredComponentList,\r\n\r\n [SmartPageTemplate.Professional]: _.uniq([\r\n ...requiredComponentList,\r\n componentsConfig.businessHours,\r\n componentsConfig.callToAction,\r\n componentsConfig.professionalService,\r\n componentsConfig.review,\r\n componentsConfig.summary,\r\n ], config => config.type),\r\n};\r\n","import { getDefaultSiteTemplate } from './site-templates/default-template';\r\n\r\nexport const TemplateService = ({ i18n }) => {\r\n const service = {};\r\n const defaultSiteTemplate = getDefaultSiteTemplate(i18n);\r\n\r\n service.getTemplates = () => [defaultSiteTemplate];\r\n\r\n service.defaultTemplate = () => defaultSiteTemplate;\r\n\r\n return service;\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport {\r\n generateId,\r\n generateSectionWithComponent,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { TemplateComponentListMapping, SmartPageTemplate } from '../consts';\r\n\r\nexport const getDefaultSiteTemplate = () => {\r\n const siteStructureTemplate = {\r\n dataSource: {},\r\n pages: [{\r\n id: generateId('pge'),\r\n components: [],\r\n }],\r\n theme: { themeId: 'theme_gray' },\r\n websiteSourceData: {},\r\n };\r\n\r\n _.each(TemplateComponentListMapping[SmartPageTemplate.Default], (item) => {\r\n siteStructureTemplate.pages[0].components.push(...generateSectionWithComponent({\r\n componentType: item.type,\r\n sectionIndex: item.order,\r\n }));\r\n });\r\n\r\n return siteStructureTemplate;\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport {\r\n getUsedOptionalComponentTypes,\r\n insertNewComponents,\r\n componentsConfig,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\nimport { applyBookAppointmentDefaultConfig, SmartActionButtonTypes } from '@bingads-webui-campaign-react/smart-component-action-button';\r\n\r\nimport { SmartPageTemplate, TemplateComponentListMapping } from '../consts';\r\n\r\n/**\r\n* Only add components, and not handle removing components if the template is different\r\n* @param {Array} components Current component configs.\r\n* @param {Array} suggestions List of suggestion template\r\n* @param {Object} pilots pilots values\r\n* @returns {Array} New components\r\n*/\r\nexport const applyTemplateSuggestion = (components, suggestions, pilots) => {\r\n const addedOptionalCompTypes = getUsedOptionalComponentTypes(components);\r\n // Apply Suggestion\r\n let templateCompList = [];\r\n // Apply book appointment CTA when true and apply get quotes when false\r\n const hasProfessionalTemplate = suggestions.includes(SmartPageTemplate.Professional);\r\n\r\n // 1. Get all the component mapping from suggested template\r\n _.each(suggestions, (sug) => {\r\n const componentList = TemplateComponentListMapping[sug] || [];\r\n templateCompList.push(...componentList);\r\n });\r\n\r\n // 2. Filter out required components and uniq\r\n templateCompList = _.chain(templateCompList)\r\n .filter(config => !config.required)\r\n .uniq(config => config.type)\r\n .value();\r\n\r\n // 3. Add components which aren't presented yet in current config\r\n const templateCompListToAdd = _.filter(\r\n templateCompList,\r\n config => !addedOptionalCompTypes.includes(config.type)\r\n );\r\n\r\n const componentsAfterAdd = insertNewComponents(\r\n components,\r\n _.map(templateCompListToAdd, c => c.type)\r\n );\r\n\r\n // 4. Do some special treatment\r\n // Here we overwrite CTA to booking when using professional template\r\n // CTA is required, so the index will always > -1\r\n const ctaConfigIndex = _.findIndex(\r\n componentsAfterAdd,\r\n c => c.type === componentsConfig.callToAction.type\r\n );\r\n\r\n if (\r\n hasProfessionalTemplate\r\n && componentsAfterAdd[ctaConfigIndex].actionType !== SmartActionButtonTypes.BookAppointment.name\r\n ) {\r\n applyBookAppointmentDefaultConfig(componentsAfterAdd[ctaConfigIndex], pilots);\r\n }\r\n\r\n return componentsAfterAdd;\r\n};\r\n\r\n/**\r\n * Mutate the original object and apply template suggestion to it\r\n * @param {Object} siteConfig siteConfig which will be modified\r\n * @param {Object} pilots pilot object map\r\n * @param {Function} getTemplateSuggestions helper to get template suggestions\r\n * @param {Object} logger logger object for metrics\r\n * @return {Promise} Promise result for chaining\r\n */\r\nexport const templateSuggestionProxy = (siteConfig, pilots, getTemplateSuggestions, logger) => {\r\n const { isSmartPageTemplateSuggestionEnabled } = pilots;\r\n\r\n if (!isSmartPageTemplateSuggestionEnabled) {\r\n return siteConfig;\r\n }\r\n\r\n const {\r\n dataSource: { businessCategories = [] },\r\n pages,\r\n } = siteConfig;\r\n\r\n logger.logTrace('Getting template suggestion');\r\n\r\n return getTemplateSuggestions(businessCategories)\r\n .then((suggestions) => {\r\n const { components } = pages[0];\r\n pages[0].components = applyTemplateSuggestion(components, suggestions, pilots);\r\n\r\n const hasProfessionalTemplate = suggestions.includes(SmartPageTemplate.Professional);\r\n const { siteContextInfo = {} } = siteConfig;\r\n\r\n if (\r\n hasProfessionalTemplate\r\n && _.isUndefined(siteContextInfo.shouldShowProfessionalTemplateGuidance)\r\n ) {\r\n // eslint-disable-next-line no-param-reassign\r\n siteConfig.siteContextInfo = {\r\n ...siteConfig.siteContextInfo,\r\n shouldShowProfessionalTemplateGuidance: true,\r\n };\r\n }\r\n\r\n // Config is modified via reference\r\n return siteConfig;\r\n })\r\n .catch((err) => {\r\n logger.logError('Error while getting template suggestion', err);\r\n\r\n return siteConfig;\r\n })\r\n .finally(() => logger.logTrace('Finished template suggestion'));\r\n};\r\n","import {\r\n isString,\r\n isArray,\r\n findIndex,\r\n isEmpty,\r\n} from 'underscore';\r\n\r\nimport {\r\n SmartPageStatus,\r\n SmartPageErrorMap,\r\n} from '@bingads-webui-campaign-react/smart-page-data-service';\r\nimport {\r\n getSmartPageUrlSuffix\r\n} from '@bingads-webui-campaign/smart-page-url-suffix-provider';\r\nimport {\r\n getCustomDomain,\r\n} from '@bingads-webui-campaign-react/smart-page-util';\r\n\r\nexport {\r\n getSmartPageUrl, getSmartPageUrlOrCustomDomain,\r\n} from '@bingads-webui-campaign-react/smart-page-util';\r\n\r\nexport const SmartPageUrlSuffix = getSmartPageUrlSuffix(document.domain);\r\n\r\nexport const isSmartPageUrl = website => (\r\n website && website.endsWith(SmartPageUrlSuffix)\r\n);\r\n\r\nconst getHostFromUrl = (url) => {\r\n const regex = /(https?:\\/\\/)?([^/?#]+)/i;\r\n\r\n const newUrl = url || '';\r\n const result = newUrl.match(regex);\r\n let host = '';\r\n\r\n if (result && result[2]) {\r\n [, , host] = result;\r\n }\r\n\r\n return host;\r\n};\r\n\r\nexport const isUsingSmartPageUrlOrCustomDomain = ({\r\n url,\r\n subdomain,\r\n domainDetail,\r\n}) => {\r\n const host = getHostFromUrl(url);\r\n const customDomainHost = getHostFromUrl(getCustomDomain(domainDetail));\r\n return host === `${subdomain}${SmartPageUrlSuffix}` || host === customDomainHost;\r\n};\r\n\r\nexport const isUsingSmartPageCustomDomain = domainDetail => !!(domainDetail && domainDetail.CustomDomain);\r\n\r\nexport const hasSmartPageAssociation = (smartPageData, campaignId) => (\r\n isString(campaignId)\r\n && smartPageData\r\n && isArray(smartPageData.associations)\r\n && findIndex(smartPageData.associations, { EntityId: campaignId }) !== -1\r\n);\r\n\r\nexport const onSmartPageError = (error, showWarningMessage) => {\r\n if (error && error.body && !isEmpty(error.body.value)) {\r\n const message = SmartPageErrorMap[error.body.value[0].Code] || SmartPageErrorMap.GeneralError;\r\n showWarningMessage(message);\r\n } else {\r\n showWarningMessage(_TL_('An error has occurred. Please try again later.'));\r\n }\r\n};\r\n\r\nexport const isSmartPageOnline = smartPageStatus => (\r\n smartPageStatus === SmartPageStatus.Published\r\n || smartPageStatus === SmartPageStatus.PendingPublish\r\n || smartPageStatus === SmartPageStatus.UnpublishedChanges\r\n);\r\n\r\nexport const isSmartPageCustomDomainDnsNotVerified = domainDetail => !!(\r\n domainDetail\r\n && domainDetail.CustomDomain\r\n && domainDetail.DNSRecordVerificationStatus !== 'Succeeded'\r\n);\r\n","import { useContext, useMemo } from 'react';\r\nimport { getConfig } from '@bingads-webui-campaign/odata-config';\r\nimport { ServerContext } from '@bingads-webui-campaign-react/server-context';\r\n\r\nimport { SmartPageUrlSuffix } from './smart-page-helpers';\r\n\r\nconst odataConfig = getConfig();\r\n\r\nexport function useSmartPageServiceContext() {\r\n const serverContext = useContext(ServerContext);\r\n\r\n const {\r\n CampaignAPIPath, // this value only exists in CCUI ServerContext\r\n } = serverContext;\r\n\r\n const path = CampaignAPIPath || odataConfig.odataPath;\r\n\r\n return useMemo(() => ({\r\n CurrentUser: serverContext.CurrentUser,\r\n CurrentAccount: serverContext.CurrentAccount,\r\n CurrentCustomer: serverContext.CurrentCustomer,\r\n CurrentLocale: serverContext.CurrentLocale,\r\n Permissions: serverContext.Permissions,\r\n CCUIPilots: serverContext.CCUIPilots,\r\n DynamicPermissions: serverContext.DynamicPermissions,\r\n CampaignAPIPath: path,\r\n ServicesEndpoints: serverContext.ServicesEndpoints,\r\n Token: serverContext.Token,\r\n PageTrackingId: serverContext.PageTrackingId,\r\n SmartPageUrlSuffix,\r\n Urls: serverContext.Urls,\r\n Omniture: serverContext.Omniture,\r\n }), [serverContext, path]);\r\n}\r\n","import React, { useMemo, useContext } 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 { hostSystemScenario } from '@bingads-webui-campaign-react/smart-component-util';\r\nimport {\r\n domChildren as domChildrenProps,\r\n serverContext as serverContextProps,\r\n} from '@bingads-webui-campaign-react/props-mca';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\nimport {\r\n SmartPageService,\r\n ImageService,\r\n} from '@bingads-webui-campaign-react/smart-page-data-service';\r\nimport { TemplateService } from '@bingads-webui-campaign-react/smart-page-template';\r\nimport { getFacebookAppId } from '@bingads-webui-campaign-react/smart-page-util';\r\nimport { useIsM365PremiumUser } from '@bingads-webui-campaign-react/up-data';\r\nimport { useSmartPageServiceContext } from '@bingads-webui-campaign-react/smart-page-data';\r\n\r\nexport const DataServiceContext = React.createContext({\r\n CurrentUser: {},\r\n CurrentAccount: {},\r\n CurrentCustomer: {},\r\n CurrentLocale: '',\r\n smartPageService: {},\r\n imageService: {},\r\n templateService: {},\r\n customerContext: {},\r\n accountContext: {},\r\n campaignContext: {},\r\n tagContext: {},\r\n navigationContext: {},\r\n Permissions: {},\r\n CCUIPilots: {},\r\n DynamicPermissions: {},\r\n Urls: {},\r\n Omniture: {},\r\n PageTrackingId: '',\r\n});\r\n\r\nexport const DataServiceContextProvider = (props) => {\r\n const {\r\n serverContext,\r\n i18n,\r\n // extendProps,\r\n overrideProps,\r\n } = props;\r\n\r\n const isM365PremiumUser = useIsM365PremiumUser();\r\n\r\n const fbAppId = getFacebookAppId(document.domain);\r\n const fbHostSystemScenario = hostSystemScenario.DMC;\r\n\r\n const permissions = useMemo(() => ({\r\n ...serverContext.Permissions,\r\n IsM365PremiumUser: isM365PremiumUser,\r\n }), [isM365PremiumUser, serverContext.Permissions]);\r\n\r\n const dataServiceContext = useMemo(() => ({\r\n CurrentUser: serverContext.CurrentUser,\r\n CurrentAccount: serverContext.CurrentAccount,\r\n CurrentCustomer: serverContext.CurrentCustomer,\r\n CurrentLocale: serverContext.CurrentLocale,\r\n Permissions: permissions,\r\n CCUIPilots: serverContext.CCUIPilots,\r\n DynamicPermissions: serverContext.DynamicPermissions,\r\n smartPageService: SmartPageService({ serverContext }),\r\n imageService: ImageService({ serverContext, i18n }),\r\n templateService: TemplateService({ i18n }),\r\n hostSystemScenario: fbHostSystemScenario,\r\n tagContext: serverContext.tagContext,\r\n customerContext: serverContext.customerContext,\r\n accountContext: serverContext.accountContext,\r\n campaignContext: serverContext.campaignContext,\r\n navigationContext: serverContext.navigationContext,\r\n fbAppId,\r\n Urls: serverContext.Urls,\r\n Omniture: serverContext.Omniture,\r\n PageTrackingId: serverContext.PageTrackingId,\r\n ...overrideProps,\r\n }), [fbAppId, i18n, overrideProps, permissions, serverContext, fbHostSystemScenario]);\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nDataServiceContextProvider.propTypes = {\r\n serverContext: serverContextProps.isRequired,\r\n children: domChildrenProps.isRequired,\r\n i18n: PropTypes.shape({}),\r\n extendProps: PropTypes.shape({}),\r\n overrideProps: PropTypes.shape({}),\r\n};\r\n\r\nDataServiceContextProvider.defaultProps = {\r\n extendProps: {},\r\n overrideProps: {},\r\n i18n: {\r\n getString: key => key,\r\n },\r\n};\r\n\r\n/**\r\n * Second option for injecting DataService Context for Component\r\n * @param {Component} WrappedComponent Wrapped Component\r\n * @returns {Component} Component with DataServiceContext\r\n */\r\nexport const withDataServiceContext = (WrappedComponent) => {\r\n const HOC = (props) => {\r\n const i18n = useContext(I18nContext);\r\n const serverContext = useSmartPageServiceContext();\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n HOC.displayName = `withDataServiceContext(${getDisplayName(WrappedComponent)})`;\r\n\r\n hoistNonReactStatics(HOC, WrappedComponent);\r\n\r\n return HOC;\r\n};\r\n","import React, { useContext } from 'react';\r\nimport { ResponsiveMode } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const defaultClientContext = {\r\n isMobile: false,\r\n responsiveMode: ResponsiveMode.LargeDesktop,\r\n isRuntime: false,\r\n};\r\n\r\nexport const ClientContext = React.createContext(defaultClientContext);\r\n\r\nexport const useClientContext = () => useContext(ClientContext);\r\n","import _ from 'underscore';\r\nimport React, { useContext } from 'react';\r\n\r\nexport const InstrumentationServiceContext = React.createContext({\r\n logError: _.noop,\r\n logTrace: _.noop,\r\n logMetrics: _.noop,\r\n instrumentation: {},\r\n});\r\n\r\nexport const useInstrumentationServiceContext = () => {\r\n const context = useContext(InstrumentationServiceContext);\r\n return context;\r\n};\r\n","export const defaultSchema = {\r\n scenario: [{\r\n name: 'defaultScenario',\r\n value: 'Smart Page Default Scenario',\r\n activity: [{\r\n name: 'logError',\r\n value: 'Smart Page Custom Error',\r\n }, {\r\n name: 'logTrace',\r\n value: 'Smart Page Custom Trace',\r\n }, {\r\n name: 'logMetrics',\r\n value: 'Smart Page Metrics',\r\n }],\r\n }],\r\n};\r\n\r\nexport const globalErrorSchema = {\r\n scenario: [{\r\n name: 'appReactGlobalError',\r\n value: 'Log application global react error',\r\n activity: [{\r\n name: 'logError',\r\n value: 'Log Error Info',\r\n }],\r\n }],\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport { GlobalErrorView } from '@bingads-webui-react/app-global-error-view';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n// import { useApplicationName } from '@bingads-webui-campaign-react/mca-core';\r\n\r\nconst isIE11 = (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > -1);\r\n\r\nfunction getHelpContentHref(i18nLocale) {\r\n const splits = i18nLocale.split('-');\r\n let localeCode = splits[0] || 'en';\r\n\r\n if (localeCode === 'pt') {\r\n localeCode = 'pt-BR';\r\n }\r\n\r\n return `https://help.ads.microsoft.com/#apex/ads/${localeCode}/52033/0`;\r\n}\r\n\r\nexport const DefaultGlobalErrorView = () => {\r\n const i18n = useContext(I18nContext);\r\n // const appName = useApplicationName();\r\n const title = i18n.getString(isIE11 ? _TL_('The site is incompatible with your browser') : _TL_('Well, that\\'s unexpected'));\r\n const description = useMemo(() => {\r\n const descriptions = i18n.getString(_TL_('Please find the list of supported browsers on {0}')).split('{0}');\r\n\r\n return (isIE11 ? [\r\n () => (\r\n

\r\n {descriptions[0]}\r\n {i18n.getString(_TL_('this page'))}\r\n {descriptions[1]}\r\n

\r\n ),\r\n ]\r\n : [\r\n i18n.getString(_TL_(\"Smart Page isn't available right now, but everything should be back to normal very soon.\")),\r\n i18n.getString(_TL_(\"Don't worry about your ads - this doesn't impact them.\")),\r\n () => {i18n.getString(_TL_('Refresh Page'))},\r\n ]);\r\n }, [i18n]);\r\n\r\n const errorViewProps = {\r\n className: 'error-page',\r\n title,\r\n description,\r\n };\r\n return ;\r\n};\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport { isInternalUrl } from '@bingads-webui/url-util';\r\nimport { AjaxStub, AjaxEventHandler, ErrorStub } from '@bingads-webui/instrumentation-stubs';\r\nimport { isTestEnvironment } from '@bingads-webui-campaign/global-app-init';\r\nimport {\r\n getInstrumentation as getInstrumentationInstance,\r\n InstrumentationSchema\r\n} from '@bingads-webui-campaign/instrumentation-setup';\r\nimport {\r\n OdataErrorMapper,\r\n CampaignApiErrorMapper,\r\n UrlErrorMapper,\r\n odataErrorCodes,\r\n campaignApiErrorCodes,\r\n invalidDomains,\r\n} from '@bingads-webui-campaign/instrumentation';\r\n\r\nimport { createErrorMessage } from '@bingads-webui-campaign/error-utilities';\r\n\r\nimport { defaultSchema, globalErrorSchema } from './instrumentation-schema';\r\nimport { DefaultGlobalErrorView } from './global-error-view';\r\n\r\nconst errorMappers = {\r\n odataErrorMapper: new OdataErrorMapper(odataErrorCodes),\r\n campaignApiErrorMapper: new CampaignApiErrorMapper(campaignApiErrorCodes),\r\n urlErrorMapper: new UrlErrorMapper(invalidDomains),\r\n};\r\n\r\nconst userErrorCodes = [\r\n 'LOCATIONNOTEXIST',\r\n 'LOCATIONNOTSUPPORTED',\r\n 'SMARTPAGEINVALIDSUBDOMAIN',\r\n 'SMARTPAGESUBDOMAINISNOTAVAILABLE',\r\n 'SMARTPAGECONCURRENTUPDATINGISNOTALLOWED',\r\n 'SMARTPAGEURLISREJECTEDBYEDITORIAL',\r\n 'SMARTPAGEINVALIDSTATUS',\r\n];\r\n\r\nconst formattedUserErrorCodes = _.chain(userErrorCodes)\r\n .map(errorCode => errorCode.trim().toUpperCase())\r\n .value();\r\n\r\nconst formatNameValue = (name, value) => {\r\n if (_.isEmpty(value)) {\r\n return `${name}`;\r\n } else if (_.isObject(value)) {\r\n return `${name}|${JSON.stringify(value)}|NetworkIsOnline:${window.navigator.onLine}`;\r\n }\r\n return `${name}|${value}`;\r\n};\r\n\r\nfunction stub(instrumentation, serverContext) {\r\n const stubOptions = {\r\n pageTrackingId: serverContext && serverContext.PageTrackingId,\r\n lcid: serverContext && serverContext.CurrentUser && serverContext.CurrentUser.Locale,\r\n };\r\n\r\n const shouldAddHeaders = ajaxContext => isInternalUrl(ajaxContext.url);\r\n const eventHandler = new AjaxEventHandler({\r\n errorMappers,\r\n shouldAddHeaders,\r\n });\r\n\r\n const ajaxStub = new AjaxStub({\r\n stubOptions,\r\n eventHandler,\r\n instrumentation,\r\n });\r\n\r\n const errorStub = new ErrorStub({\r\n instrumentation,\r\n });\r\n\r\n ajaxStub.init();\r\n errorStub.init();\r\n}\r\n\r\nexport const getInstrumentation = ({ serverContext, isProdRuntime }) => {\r\n const {\r\n CurrentCustomer,\r\n CurrentAccount,\r\n CurrentUser,\r\n } = serverContext;\r\n\r\n const userContext = {\r\n CurrentCustomer: CurrentCustomer || {},\r\n CurrentAccount: CurrentAccount || {},\r\n CurrentUser: CurrentUser || {},\r\n };\r\n\r\n return getInstrumentationInstance({\r\n pageTrackingId: serverContext.PageTrackingId,\r\n errorMappers,\r\n isInDevelopmentMode: isTestEnvironment(document.domain) && !isProdRuntime,\r\n userContext,\r\n applicationName: {\r\n systemName: 'campaign',\r\n subSystemName: 'smartpage',\r\n },\r\n serverContext: {\r\n ...serverContext,\r\n ...userContext,\r\n },\r\n objectsToStub: [],\r\n });\r\n};\r\n\r\nconst isUserErrorCodes = (errorResponseJson) => {\r\n if (_.isEmpty(errorResponseJson) || !_.isObject(errorResponseJson) ||\r\n _.isEmpty(errorResponseJson.errors) || !_.isArray(errorResponseJson.errors)) {\r\n return false;\r\n }\r\n const errorCodesInResponse = _.chain(errorResponseJson.errors)\r\n .pluck('Code')\r\n .compact()\r\n .map(code => code.trim().toUpperCase())\r\n .uniq()\r\n .value();\r\n\r\n if (_.isEmpty(errorCodesInResponse)) {\r\n return false;\r\n }\r\n\r\n for (let index = 0; index < errorCodesInResponse.length; index += 1) {\r\n if (!_.contains(formattedUserErrorCodes, errorCodesInResponse[index])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n};\r\n\r\nconst isIgnorableError = (errorResponseJson) => {\r\n if (_.isEmpty(errorResponseJson) || !_.isObject(errorResponseJson)) {\r\n return false;\r\n }\r\n\r\n return errorResponseJson.readyState === 0;\r\n};\r\n\r\nexport const getInstrumentationService = ({ instrumentation, serverContext, scenario = 'defaultScenario' }) => {\r\n instrumentation.addScenario({\r\n scenario: [\r\n ...defaultSchema.scenario,\r\n ...InstrumentationSchema.scenario,\r\n ],\r\n });\r\n\r\n const defaultScenario = instrumentation[scenario].create();\r\n const logError = defaultScenario.logError.create();\r\n const logTrace = defaultScenario.logTrace.create();\r\n const logMetrics = defaultScenario.logMetrics.create();\r\n\r\n stub(instrumentation, serverContext);\r\n\r\n return {\r\n instrumentation,\r\n logError: (name, value = '') => {\r\n const isUserError = isUserErrorCodes(value);\r\n const isIgnorable = isIgnorableError(value);\r\n\r\n if (!isUserError && !isIgnorable) {\r\n logError.error(formatNameValue(name, value));\r\n }\r\n },\r\n logTrace: (name, value = '') => {\r\n logTrace.trace(formatNameValue(name, value));\r\n },\r\n logMetrics: (name, value = '') => {\r\n logMetrics.trace(formatNameValue(name, value));\r\n },\r\n };\r\n};\r\n\r\nexport const getGlobalErrorOptions = ({ instrumentation }) => ({\r\n logError: ({ error, info }) => {\r\n if (instrumentation) {\r\n instrumentation.addScenario(globalErrorSchema);\r\n const appReactGlobalError = instrumentation.appReactGlobalError.create();\r\n const logError = appReactGlobalError.logError.create();\r\n logError.error(createErrorMessage(error));\r\n logError.error(info.componentStack);\r\n }\r\n },\r\n renderErrorView: () => ,\r\n});\r\n","import { isEqual, compact } from 'underscore';\r\n\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport {\r\n filterImageIdsToRemove,\r\n getUpdatedPages,\r\n getUpdateImages,\r\n getComponentByType,\r\n COMPONENT_TYPE_MAPPING,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const siteConfigReducer = (state, action) => {\r\n const newState = { ...state };\r\n\r\n switch (action.type) {\r\n case 'UPDATE_DATASOURCE_BY_NAME': {\r\n const { name, value } = action.payload;\r\n\r\n newState.dataSource = {\r\n ...state.dataSource,\r\n [name]: value,\r\n };\r\n break;\r\n }\r\n case 'UPDATE_WEBSITESOURCEDATA_BY_NAME': {\r\n const { name, value } = action.payload;\r\n\r\n newState.websiteSourceData = {\r\n ...state.websiteSourceData,\r\n [name]: value,\r\n };\r\n break;\r\n }\r\n case 'UPDATE_SITE_CONFIG': {\r\n const {\r\n dataSource,\r\n pages,\r\n theme,\r\n images,\r\n snapshots,\r\n status,\r\n smartPageDataContext,\r\n subDomain,\r\n siteContextInfo,\r\n orderedComponentsInPages,\r\n websiteSourceData,\r\n migrationContext,\r\n forceUpdate,\r\n associations,\r\n } = action.payload;\r\n if (!isEqual(newState.dataSource, dataSource)) {\r\n newState.dataSource = cloneDeep(dataSource);\r\n }\r\n if (!isEqual(newState.pages, pages) || forceUpdate) {\r\n newState.pages = cloneDeep(pages);\r\n }\r\n if (!isEqual(newState.theme, theme)) {\r\n newState.theme = cloneDeep(theme);\r\n }\r\n if (!isEqual(newState.images, images)) {\r\n newState.images = compact(cloneDeep(images));\r\n }\r\n if (!isEqual(newState.snapshots, snapshots)) {\r\n newState.snapshots = cloneDeep(snapshots);\r\n }\r\n if (!isEqual(newState.status, status)) {\r\n newState.status = status;\r\n }\r\n if (!isEqual(newState.smartPageDataContext, smartPageDataContext)) {\r\n newState.smartPageDataContext = cloneDeep(smartPageDataContext);\r\n }\r\n if (!isEqual(newState.subDomain, subDomain)) {\r\n newState.subDomain = subDomain;\r\n }\r\n if (!isEqual(newState.siteContextInfo, siteContextInfo)) {\r\n newState.siteContextInfo = siteContextInfo;\r\n }\r\n if (!isEqual(newState.orderedComponentsInPages, orderedComponentsInPages)) {\r\n newState.orderedComponentsInPages = orderedComponentsInPages;\r\n }\r\n if (!isEqual(newState.websiteSourceData, websiteSourceData)) {\r\n newState.websiteSourceData = cloneDeep(websiteSourceData);\r\n }\r\n if (!isEqual(newState.migrationContext, migrationContext)) {\r\n newState.migrationContext = cloneDeep(migrationContext);\r\n }\r\n if (!isEqual(newState.associations, associations)) {\r\n newState.associations = cloneDeep(associations);\r\n }\r\n\r\n break;\r\n }\r\n case 'UPDATE_PAGE': {\r\n const {\r\n page,\r\n pageIndex,\r\n } = action.payload;\r\n const newPage = cloneDeep(page);\r\n const newPages = cloneDeep(newState.pages);\r\n newPages[pageIndex] = newPage;\r\n newState.pages = newPages;\r\n break;\r\n }\r\n case 'UPDATE_ORDERED_COMPONENTS': {\r\n newState.orderedComponentsInPages = [...action.payload];\r\n break;\r\n }\r\n case 'UPDATE_COMPONENT_BY_ID': {\r\n newState.pages = getUpdatedPages(state.pages, action.payload);\r\n break;\r\n }\r\n case 'UPDATE_SITE_CONFIG_BY_TYPE': {\r\n const { type, value } = action.payload;\r\n\r\n const config = getComponentByType(state, type);\r\n const updatedConfig = {\r\n ...config,\r\n ...value,\r\n };\r\n newState.pages = getUpdatedPages(state.pages, updatedConfig);\r\n break;\r\n }\r\n case 'UPDATE_COVER_IMAGE': {\r\n const coverImageConfig = getComponentByType(state, COMPONENT_TYPE_MAPPING.CoverImage);\r\n const updatedConfig = {\r\n ...coverImageConfig,\r\n ...action.payload,\r\n };\r\n\r\n if (!isEqual(updatedConfig, coverImageConfig)) {\r\n newState.pages = getUpdatedPages(state.pages, updatedConfig);\r\n }\r\n break;\r\n }\r\n case 'UPDATE_TAG': {\r\n const { type, id } = action.payload;\r\n\r\n newState.uetTagId = id;\r\n newState.isMTagMigrated = type === 'UET';\r\n\r\n break;\r\n }\r\n case 'UPDATE_IMAGES': {\r\n const { imageIdsToRemove, imagesToAdd } = action.payload;\r\n const finalImageIdsToRemove = filterImageIdsToRemove(newState, imageIdsToRemove);\r\n newState.images = getUpdateImages(\r\n state.images,\r\n state.snapshots.images,\r\n compact(finalImageIdsToRemove),\r\n compact(imagesToAdd)\r\n );\r\n break;\r\n }\r\n case 'UPDATE_LOCAL_IMAGE_URL': {\r\n newState.localImageUrl = action.payload;\r\n break;\r\n }\r\n case 'DELETE_COMPONENT': {\r\n const {\r\n components,\r\n orderedComponents,\r\n websiteSourceData,\r\n pageIndex,\r\n } = action.payload;\r\n const pages = [...newState.pages];\r\n pages[pageIndex].components = [...components];\r\n newState.pages = pages;\r\n newState.orderedComponentsInPages = [...orderedComponents];\r\n newState.websiteSourceData = { ...websiteSourceData };\r\n break;\r\n }\r\n case 'ADD_COMPONENT': {\r\n const { components, orderedComponents, pageIndex } = action.payload;\r\n const pages = [...newState.pages];\r\n pages[pageIndex].components = [...components];\r\n newState.pages = pages;\r\n newState.orderedComponentsInPages[pageIndex] = [...orderedComponents];\r\n break;\r\n }\r\n case 'UPDATE_SITE_STATUS': {\r\n newState.status = action.payload;\r\n break;\r\n }\r\n case 'UPDATE_SITE_CONTEXT_INFO': {\r\n newState.siteContextInfo = {\r\n ...state.siteContextInfo,\r\n ...action.payload,\r\n };\r\n break;\r\n }\r\n case 'UPDATE_WSD_MIGRATION_STATUS': {\r\n newState.migrationContext = {\r\n ...state.migrationContext,\r\n ...action.payload,\r\n };\r\n break;\r\n }\r\n default:\r\n throw new Error();\r\n }\r\n\r\n return newState;\r\n};\r\n","import React, { useMemo, useContext } from 'react';\r\nimport { debounce } from 'underscore';\r\n\r\nimport {\r\n WEBSITE_SOURCE_DATA_KEY_MAPPING,\r\n getWebsiteSourceDataByKey,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\nimport { useContextLocale } from '@bingads-webui-campaign-react/smart-page-data-service';\r\nimport { useClientContext } from './client-context';\r\n\r\nexport const SiteConfigContext = React.createContext({\r\n siteConfig: null,\r\n dispatchSiteConfig: () => { },\r\n});\r\n\r\nexport const useSiteConfig = () => {\r\n const contextValue = useContext(SiteConfigContext);\r\n return contextValue;\r\n};\r\n\r\nexport const useDebouncedDispatchSiteConfig = (wait = 10) => {\r\n const { dispatchSiteConfig } = useSiteConfig();\r\n const debounced = useMemo(() => debounce(dispatchSiteConfig, wait), [dispatchSiteConfig, wait]);\r\n\r\n return debounced;\r\n};\r\n\r\nexport const SavedSiteConfigContext = React.createContext({\r\n savedSiteConfig: null,\r\n updateSavedSiteConfig: () => { },\r\n});\r\n\r\nexport const useSavedSiteConfig = () => {\r\n const contextValue = useContext(SavedSiteConfigContext);\r\n return contextValue;\r\n};\r\n\r\nexport const useSiteConfigLocale = () => {\r\n const { siteConfig } = useSiteConfig();\r\n\r\n return getWebsiteSourceDataByKey(siteConfig, WEBSITE_SOURCE_DATA_KEY_MAPPING.Localization);\r\n};\r\n\r\nexport const useCurrentLocale = () => {\r\n const { isRuntime } = useClientContext();\r\n\r\n const siteConfigLocale = useSiteConfigLocale();\r\n const contextLocale = useContextLocale();\r\n\r\n // In runtime page we need to read locale from WSD first, otherwise we read from browser\r\n if (isRuntime) {\r\n return siteConfigLocale || contextLocale;\r\n }\r\n\r\n return contextLocale || siteConfigLocale;\r\n};\r\n","import React, { useContext, useMemo } from 'react';\r\nimport _ from 'underscore';\r\n\r\nexport const EditorStatusContext = React.createContext([{}, _.noop]);\r\n\r\nexport const PreviewMode = {\r\n Desktop: 'Desktop',\r\n Mobile: 'Mobile',\r\n};\r\n\r\nexport const EditorView = {\r\n Components: 'Components',\r\n Settings: 'Settings',\r\n Style: 'Style/Brand',\r\n};\r\n\r\nexport const useEditorStatusContext = () => {\r\n const contextValue = useContext(EditorStatusContext);\r\n return contextValue;\r\n};\r\n\r\nexport const useIsComponentSelected = (type) => {\r\n const context = useContext(EditorStatusContext);\r\n\r\n const isSelected = useMemo(\r\n () => {\r\n if (!context) {\r\n return false;\r\n }\r\n const [editorStatus] = context;\r\n return editorStatus.editingComponentType === type;\r\n },\r\n [context, type]\r\n );\r\n\r\n return isSelected;\r\n};\r\n\r\n","export const editorStatusLoadingWrapperForPromise = (dispatch) => {\r\n dispatch({\r\n type: 'SET_LOADING',\r\n payload: true,\r\n });\r\n\r\n return () => {\r\n dispatch({\r\n type: 'SET_LOADING',\r\n payload: false,\r\n });\r\n };\r\n};\r\n\r\nexport const DEFER_EDITOR_JOB = {\r\n SAVE: 'save',\r\n PUBLISH: 'publish',\r\n NONE: 'none',\r\n RUNNING: 'running',\r\n};\r\n\r\nexport const editorStatusReducer = (state, action) => {\r\n switch (action.type) {\r\n case 'EDIT_COMPONENT_TYPE': {\r\n const {\r\n selectedComponentType,\r\n editingComponentType,\r\n editingComponentId,\r\n editingComponentProperty,\r\n isPreviewSelecting,\r\n } = action.payload;\r\n\r\n return {\r\n ...state,\r\n selectedComponentType: selectedComponentType || editingComponentType,\r\n editingComponentType,\r\n editingComponentId,\r\n editingComponentProperty,\r\n isPreviewSelecting,\r\n skipSaving: null,\r\n };\r\n }\r\n case 'CANCEL_COMPONENT_EDIT': {\r\n const { skipSaving } = action.payload || {};\r\n\r\n return {\r\n ...state,\r\n selectedComponentType: null,\r\n editingComponentType: null,\r\n editingComponentProperty: null,\r\n editingComponentId: null,\r\n isPreviewSelecting: null,\r\n skipSaving,\r\n };\r\n }\r\n case 'SET_VIEW':\r\n return {\r\n ...state,\r\n view: action.payload,\r\n };\r\n case 'SET_LOADING':\r\n return {\r\n ...state,\r\n loading: action.payload,\r\n };\r\n case 'SET_FLOATING_BANNER':\r\n return {\r\n ...state,\r\n floatingBanner: action.payload,\r\n };\r\n case 'CONFIRMING_PUBLISH':\r\n return {\r\n ...state,\r\n isConfirming: true,\r\n showResultModalDialog: true,\r\n };\r\n case 'BEGIN_PUBLISH':\r\n return {\r\n ...state,\r\n isPublishing: true,\r\n failedToPublish: false,\r\n showResultModalDialog: true,\r\n isConfirming: false,\r\n };\r\n case 'END_PUBLISH': {\r\n const newState = {\r\n ...state,\r\n isPublishing: false,\r\n isPublished: true,\r\n showResultModalDialog: action.payload.showResultModalDialog,\r\n subDomain: action.payload.subDomain,\r\n siteSuffix: action.payload.siteSuffix,\r\n };\r\n\r\n if (!action.payload.showResultModalDialog) {\r\n newState.isConfirming = false;\r\n }\r\n\r\n return newState;\r\n }\r\n case 'SWITCH_PREVIEW_MODE':\r\n return {\r\n ...state,\r\n previewMode: action.payload,\r\n };\r\n case 'HIDE_PUBLISH_DIALOG':\r\n return {\r\n ...state,\r\n showResultModalDialog: false,\r\n isConfirming: false,\r\n };\r\n case 'FAILED_TO_PUBLISH':\r\n return {\r\n ...state,\r\n failedToPublish: true,\r\n isPublishing: false,\r\n isPublished: false,\r\n isConfirming: false,\r\n };\r\n case 'BEGIN_REVERT':\r\n return {\r\n ...state,\r\n isReverting: true,\r\n };\r\n case 'END_REVERT':\r\n return {\r\n ...state,\r\n isReverting: false,\r\n };\r\n case 'SET_ON_EXIT_COMPONENT_EDITING_EFFECT':\r\n return {\r\n ...state,\r\n onBeforeExitEditing: action.payload || (() => Promise.resolve(null)),\r\n };\r\n case 'RESET_ON_EXIT_COMPONENT_EDITING_EFFECT':\r\n return {\r\n ...state,\r\n onBeforeExitEditing: () => Promise.resolve(null),\r\n };\r\n case 'TRIGGER_DEFER_SAVE':\r\n return {\r\n ...state,\r\n deferEditorJob: DEFER_EDITOR_JOB.SAVE,\r\n deferCallback: (action.payload && action.payload.callback) || (() => Promise.resolve(null)),\r\n deferParameters: (action.payload && action.payload.parameters) || {},\r\n };\r\n case 'TRIGGER_DEFER_PUBLISH':\r\n return {\r\n ...state,\r\n deferEditorJob: DEFER_EDITOR_JOB.PUBLISH,\r\n deferCallback: action.payload || (() => Promise.resolve(null)),\r\n };\r\n case 'RUNNING_DEFER_JOB':\r\n return {\r\n ...state,\r\n deferEditorJob: DEFER_EDITOR_JOB.RUNNING,\r\n deferCallback: () => Promise.resolve(null),\r\n };\r\n case 'RESET_DEFER_JOB':\r\n return {\r\n ...state,\r\n deferEditorJob: DEFER_EDITOR_JOB.NONE,\r\n deferCallback: () => Promise.resolve(null),\r\n deferParameters: {},\r\n };\r\n case 'SET_COMPONENTS_VALIDATION':\r\n return {\r\n ...state,\r\n componentsValidation: action.payload,\r\n };\r\n case 'FORCE_EDITOR_UPDATE':\r\n return {\r\n ...state,\r\n forceEditorUpdate: true,\r\n };\r\n case 'RESET_FORCE_EDITOR_UPDATE':\r\n return {\r\n ...state,\r\n forceEditorUpdate: false,\r\n };\r\n case 'SHOW_FEEDBACK_PANEL':\r\n return {\r\n ...state,\r\n showFeedbackPanel: true,\r\n };\r\n case 'HIDE_FEEDBACK_PANEL':\r\n return {\r\n ...state,\r\n showFeedbackPanel: false,\r\n };\r\n // Used as a central state store to keep editor level data\r\n // which could be shared in different component editors\r\n case 'PATCH_BUFFER_STATE':\r\n return {\r\n ...state,\r\n buffer: {\r\n ...state.buffer,\r\n ...action.payload,\r\n },\r\n };\r\n case 'SHOW_MOBILE_ERROR_MASK':\r\n return {\r\n ...state,\r\n isHideMobileErrorMask: false,\r\n };\r\n case 'BEGIN_SAVE':\r\n return {\r\n ...state,\r\n isSaving: true,\r\n };\r\n case 'END_SAVE':\r\n return {\r\n ...state,\r\n isSaving: false,\r\n };\r\n default: throw new Error(`Unsuported action type: ${action.type}`);\r\n }\r\n};\r\n","import React, { useContext } from 'react';\r\n\r\nexport const CountryContext = React.createContext();\r\n\r\nexport const useCountryContext = () => useContext(CountryContext);\r\n","/* eslint-disable no-param-reassign */\r\nimport React, {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useState,\r\n} from 'react';\r\nimport { objectOf, any, node, shape, func } from 'prop-types';\r\nimport { debounce } from 'underscore';\r\nimport { PreferenceService } from '@bingads-webui/preference-service';\r\nimport defaultCreater from './preference-default';\r\n\r\nconst scope = 'SmartPage';\r\nconst preferenceContext = createContext();\r\nconst handleRealKey = key => `${scope}.${key}`;\r\nexport const PreferenceContextProvider = ({\r\n i18n,\r\n serverContext,\r\n children,\r\n}) => {\r\n const initState = useMemo(\r\n () =>\r\n Object.entries(defaultCreater(i18n, serverContext)).reduce(\r\n (acc, [name, preferenceDefaultValue]) => {\r\n const preferenceName = handleRealKey(name);\r\n const backEndValue = PreferenceService.findByNameAtUserLevel(preferenceName);\r\n acc[preferenceName] =\r\n backEndValue && backEndValue.Data !== undefined\r\n ? backEndValue.Data\r\n : preferenceDefaultValue;\r\n return acc;\r\n },\r\n {}\r\n ),\r\n [i18n, serverContext]\r\n );\r\n const value = useState(initState);\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nPreferenceContextProvider.propTypes = {\r\n serverContext: objectOf(any).isRequired,\r\n children: node.isRequired,\r\n i18n: shape({\r\n getString: func.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nconst savePreferenceAtBackEnd = debounce((key, value) => {\r\n PreferenceService.setAtUserLevel({\r\n Name: key,\r\n Data: value,\r\n });\r\n}, 300);\r\n\r\nexport const usePreference = (name) => {\r\n const preferenceName = handleRealKey(name);\r\n const [allPreferenceState, setAllPreferenceState] = useContext(preferenceContext);\r\n if (!Object.keys(allPreferenceState).includes(preferenceName)) {\r\n throw new Error(`Smart page preference key not define: ${preferenceName}`);\r\n }\r\n const curPreference = allPreferenceState[preferenceName];\r\n const updatePreference = useCallback(\r\n (value) => {\r\n setAllPreferenceState(s => ({\r\n ...s,\r\n [preferenceName]: value,\r\n }));\r\n savePreferenceAtBackEnd(preferenceName, value);\r\n },\r\n [preferenceName, setAllPreferenceState]\r\n );\r\n return [curPreference, updatePreference];\r\n};\r\n","import { useContext } from 'react';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nexport const useI18n = () => useContext(I18nContext);\r\n","import React, { useContext } from 'react';\r\n\r\nimport {\r\n INTEGRATE_ENV_TYPE,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const IntegrationContext = React.createContext(INTEGRATE_ENV_TYPE.STANDALONE);\r\n\r\nexport const useIntegrationContext = () => useContext(IntegrationContext);\r\n\r\nexport const useIsHookedInWizard = () => {\r\n const env = useIntegrationContext();\r\n return env ===\r\n INTEGRATE_ENV_TYPE.UP_WIZARD\r\n || env === INTEGRATE_ENV_TYPE.SUB_ADS_WIZARD\r\n || env === INTEGRATE_ENV_TYPE.SUB_ADS_WIZARD2\r\n || env === INTEGRATE_ENV_TYPE.STREAMLINED_WIZARD\r\n || env === INTEGRATE_ENV_TYPE.PMAX_LITE_WIZARD;\r\n};\r\n\r\nexport const useIsSubAdsIntegration = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.SUB_ADS_WIZARD || env === INTEGRATE_ENV_TYPE.SUB_ADS_WIZARD2;\r\n};\r\n\r\nexport const useIsSubAds2Integration = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.SUB_ADS_WIZARD2;\r\n};\r\n\r\nexport const useIsUpIntegration = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.UP_WIZARD;\r\n};\r\n\r\nexport const useIsSmartPageStandalone = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.STANDALONE;\r\n};\r\n\r\nexport const useIsStreamlinedIntegration = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.STREAMLINED_WIZARD;\r\n};\r\n\r\nexport const useIsPmaxLiteIntegration = () => {\r\n const env = useIntegrationContext();\r\n return env === INTEGRATE_ENV_TYPE.PMAX_LITE_WIZARD;\r\n};\r\n","/* eslint-disable max-len */\r\n/**\r\n * @description Custom hooks for getting pilot easily.\r\n * If DataServiceContext cannot be gotten, use \"getPilotValue\" instead which needs to pass in\r\n * serverContext explicitly.\r\n *\r\n * Note: Define pilot name in \"PILOTS\"!\r\n */\r\n\r\nimport { useMemo, useContext } from 'react';\r\nimport { getPilotValue, PILOTS } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { DataServiceContext } from '../server-context';\r\nimport { useIsSmartPageStandalone, useIsUpIntegration } from '../integration-context';\r\n\r\nexport function usePilotsValue(key) {\r\n const serverContext = useContext(DataServiceContext);\r\n const isPilotEnabled = useMemo(\r\n () => (key ? getPilotValue(serverContext, key) : false),\r\n [key, serverContext]\r\n );\r\n\r\n return isPilotEnabled;\r\n}\r\n\r\n// SubAds phase one\r\nexport const useIsSubscriptionAdsEnabled = () => {\r\n const signup = usePilotsValue(PILOTS.isSubscriptionSignupEnabled);\r\n const postSignup = usePilotsValue(PILOTS.isUnifiedProductSubscriptionEnabled);\r\n\r\n return signup || postSignup;\r\n};\r\n\r\n\r\nexport const useIsESCMsanPilotEnabled = () => usePilotsValue(PILOTS.isESCMsanEnabled);\r\nexport const useIsBusinessHourSectionEnabled = () => usePilotsValue(PILOTS.isSmartPageBusinessHourSectionEnabled);\r\nexport const useIsSmartPageImageTextSuggestionEnabled = () => usePilotsValue(PILOTS.isSmartPageImageTextSuggestionEnabled);\r\nexport const useIsSmartPageM365StockImageEnabled = () => usePilotsValue(PILOTS.isSmartPageM365StockImageEnabled);\r\nexport const useIsSmartPageM365StockImageGalleryEnabled = () => usePilotsValue(PILOTS.isSmartPageM365StockImageGalleryEnabled);\r\nexport const useIsSmartPageVideoSectionEnabled = () => usePilotsValue(PILOTS.isSmartPageVideoSectionEnabled);\r\nexport const useIsSmartPageMapEnabled = () => usePilotsValue(PILOTS.isSmartPageMapEnabled);\r\nexport const useIsSmartPageCustomizedUpdateEnabled = () => usePilotsValue(PILOTS.isSmartPageCustomizedUpdateEnabled);\r\nexport const useIsSmartPageM365BannerEnabled = () => usePilotsValue(PILOTS.isSmartPageM365BannerEnabled);\r\nexport const useIsSmartPageDarkModeEnabled = () => usePilotsValue(PILOTS.isSmartPageDarkModeEnabled);\r\nexport const useIsSmartPageProfessionalServicesEnabled = () => usePilotsValue(PILOTS.isSmartPageProfessionalServicesEnabled);\r\nexport const useIsSmartPageBookAppointmentEnabled = () => usePilotsValue(PILOTS.isSmartPageBookAppointmentEnabled);\r\nexport const useIsSmartPageEditorNavigationImprovementEnabled = () => usePilotsValue(PILOTS.isSmartPageEditorNavigationImprovementEnabled);\r\nexport const useIsSmartPageTemplateSuggestionEnabled = () => usePilotsValue(PILOTS.isSmartPageTemplateSuggestionEnabled);\r\nexport const useIsSmartPageImprovedReviewsEnabled = () => usePilotsValue(PILOTS.isSmartPageImprovedReviewsEnabled);\r\nexport const useIsSmartPageSectionReorderingEnabled = () => usePilotsValue(PILOTS.isSmartPageSectionReorderingEnabled);\r\nexport const useIsSmartPageEditorItemsReorderingEnabled = () => usePilotsValue(PILOTS.isSmartPageEditorItemsReorderingEnabled);\r\nexport const useIsSmartPagePreviewItemsReorderingEnabled = () => usePilotsValue(PILOTS.isSmartPagePreviewItemsReorderingEnabled);\r\nexport const useIsSmartPagePrivacyPolicyEnabled = () => usePilotsValue(PILOTS.isSmartPagePrivacyPolicyEnabled);\r\nexport const useIsSmartPageCustomDomainPreflightEnabled = () => usePilotsValue(PILOTS.isSmartPageCustomDomainPreflightEnabled);\r\nexport const useIsSmartPageCustomDomainPreflightPostSignupEnabled = () => usePilotsValue(PILOTS.isSmartPageCustomDomainPreflightPostSignupEnabled);\r\nexport const useIsSmartPageRuntimePageLocalizationEnabled = () => usePilotsValue(PILOTS.isSmartPageRuntimePageLocalizationEnabled);\r\nexport const useIsSmartPageRuntimePageWcpConsentEnabled = () => usePilotsValue(PILOTS.isSmartPageRuntimePageWcpConsentEnabled);\r\nexport const useIsSmartPageAttributesToWSDMigrationEnabled = () => usePilotsValue(PILOTS.isSmartPageAttributesToWSDMigrationEnabled);\r\n\r\n// UI pilot, this pilot will never turn on in any environment, only for appending it in url for testing\r\nconst useIsSmartPageM365PremiumFeatureEnabled = () => usePilotsValue(PILOTS.isSmartPageM365PremiumFeatureEnabled);\r\n// Account level pilot, not UI feature pilot, this value comes from an api call\r\nconst useIsM365PremiumUser = () => usePilotsValue(PILOTS.isM365PremiumUser);\r\n\r\n// Only use this hook to control your UI feature, so it could control by the real MT flag\r\n// or by manually appending queryString to enable the pilot in UI\r\nexport const useIsM365Premium = () => {\r\n const isM365PremiumUser = useIsM365PremiumUser();\r\n const isSmartPageM365PremiumFeatureEnabled = useIsSmartPageM365PremiumFeatureEnabled();\r\n\r\n return isM365PremiumUser || isSmartPageM365PremiumFeatureEnabled;\r\n};\r\n\r\nexport const useIsSmartPageCustomDomainEnabled = () => {\r\n const isSmartPageStandalone = useIsSmartPageStandalone();\r\n const isUpIntegration = useIsUpIntegration();\r\n const isSmartPageCustomDomainEnabled = usePilotsValue(PILOTS.isSmartPageCustomDomainEnabled);\r\n const isSmartPageCustomDomainPreflightEnabled = useIsSmartPageCustomDomainPreflightEnabled();\r\n const isSmartPageCustomDomainPreflightPostSignupEnabled = useIsSmartPageCustomDomainPreflightPostSignupEnabled();\r\n\r\n // Since isSmartPageCustomDomainPreflightEnabled is defined as AB testing pilot, which only available in signup\r\n // so to make M365 available in post signup, we need to split the env\r\n return (isUpIntegration && isSmartPageCustomDomainPreflightEnabled && isSmartPageCustomDomainEnabled)\r\n || (isSmartPageStandalone && isSmartPageCustomDomainPreflightPostSignupEnabled && isSmartPageCustomDomainEnabled);\r\n};\r\n\r\nexport const useAllPilots = () => {\r\n const serverContext = useContext(DataServiceContext);\r\n const isM365Premium = useIsM365Premium();\r\n\r\n const allPilots = useMemo(() => {\r\n const pilots = {};\r\n\r\n Object.keys(PILOTS).forEach((key) => {\r\n pilots[key] = key ? getPilotValue(serverContext, key) : false;\r\n });\r\n\r\n return pilots;\r\n }, [serverContext]);\r\n\r\n const finalPilots = useMemo(() => ({\r\n ...allPilots,\r\n isM365Premium,\r\n }), [allPilots, isM365Premium]);\r\n\r\n return finalPilots;\r\n};\r\n","import { useContext } from 'react';\r\nimport _ from 'underscore';\r\n\r\nimport { DataServiceContext } from '../server-context';\r\n\r\nexport const useIsInternalUser = () => {\r\n const serverContext = useContext(DataServiceContext);\r\n if (serverContext.CurrentUser && !_.isUndefined(serverContext.CurrentUser.IsInternal)) {\r\n return serverContext.CurrentUser.IsInternal;\r\n }\r\n return false;\r\n};\r\n\r\n// Blocked = 28, Pending = 29, Draft = 30, Active = 31, Inactive = 32, Deleted = 33, Pause = 42\r\nexport const useIsDraftOrPendingAccount = () => {\r\n const serverContext = useContext(DataServiceContext);\r\n if (serverContext.CurrentAccount && !_.isUndefined(serverContext.CurrentAccount.Status)) {\r\n return serverContext.CurrentAccount.Status === 29 || serverContext.CurrentAccount.Status === 30;\r\n }\r\n return false;\r\n};\r\n","import { useContext, useMemo } from 'react';\r\n\r\nimport {\r\n useCustomerLevelVariables,\r\n useAccountLevelVariables,\r\n usePostponeReadVariables,\r\n} from '@bingads-webui-campaign-react/basic-context-utils';\r\nimport {\r\n useAccount,\r\n useCustomer,\r\n useUser,\r\n} from '@bingads-webui/overreact-cc';\r\nimport { usePromisify } from '@bingads-webui-react/overreact';\r\nimport { promiseLogWrapper } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { InstrumentationServiceContext } from '../instrumentation-context';\r\n\r\nexport const useUserAccountCustomer = ({ postponeRead, componentName = 'SmartPageApp' }) => {\r\n const logger = useContext(InstrumentationServiceContext);\r\n const accountLevelVariables = useAccountLevelVariables();\r\n const customerLevelVariables = useCustomerLevelVariables();\r\n const postponeReadConfig = usePostponeReadVariables();\r\n\r\n const [{ data: user }, { update: updateUserOR, read: readUserOR }] =\r\n useUser(customerLevelVariables, postponeRead && postponeReadConfig);\r\n const [{ data: account }, { update: updateAccountOR, read: readAccountOR }] =\r\n useAccount(accountLevelVariables, postponeRead && postponeReadConfig);\r\n const [{ data: customer }, { update: updateCustomerOR, read: readCustomerOR }] =\r\n useCustomer(customerLevelVariables, postponeRead && postponeReadConfig);\r\n\r\n const [\r\n updateUser,\r\n updateAccount,\r\n updateCustomer,\r\n readUser,\r\n readAccount,\r\n readCustomer,\r\n ] = usePromisify([\r\n updateUserOR,\r\n updateAccountOR,\r\n updateCustomerOR,\r\n readUserOR,\r\n readAccountOR,\r\n readCustomerOR,\r\n ]);\r\n\r\n const updateUserWithLog = useMemo(() => promiseLogWrapper(updateUser, logger, 'updateUser', componentName), [componentName, logger, updateUser]);\r\n const updateAccountWithLog = useMemo(() => promiseLogWrapper(updateAccount, logger, 'updateAccount', componentName), [componentName, logger, updateAccount]);\r\n const updateCustomerWithLog = useMemo(() => promiseLogWrapper(updateCustomer, logger, 'updateCustomer', componentName), [componentName, logger, updateCustomer]);\r\n const readUserWithLog = useMemo(() => promiseLogWrapper(readUser, logger, 'readUser', componentName), [componentName, logger, readUser]);\r\n const readAccountWithLog = useMemo(() => promiseLogWrapper(readAccount, logger, 'readAccount', componentName), [componentName, logger, readAccount]);\r\n const readCustomerWithLog = useMemo(() => promiseLogWrapper(readCustomer, logger, 'readCustomer', componentName), [componentName, logger, readCustomer]);\r\n\r\n return {\r\n user,\r\n account,\r\n customer,\r\n\r\n updateUser,\r\n updateAccount,\r\n updateCustomer,\r\n readUser,\r\n readAccount,\r\n readCustomer,\r\n\r\n updateUserWithLog,\r\n updateAccountWithLog,\r\n updateCustomerWithLog,\r\n readUserWithLog,\r\n readAccountWithLog,\r\n readCustomerWithLog,\r\n };\r\n};\r\n","import { useMediaQuery } from '@bingads-webui-campaign-react/common-hooks';\r\n\r\nimport { useIsHookedInWizard } from '../integration-context';\r\n\r\nexport const useMobileSupportEnabled = () => {\r\n const { isMobile } = useMediaQuery();\r\n const isHookedInWizard = useIsHookedInWizard();\r\n\r\n return isMobile && isHookedInWizard;\r\n};\r\n","import React, { useContext } from 'react';\r\n\r\nexport const ComponentLoadingStatus = {\r\n LOADED: 'Loaded',\r\n NOT_LOADED: 'Not loaded',\r\n UNSET: 'Unset', // We don't care about the value\r\n LOADING: 'Loading',\r\n};\r\n\r\nconst defaultElementStatus = {\r\n status: ComponentLoadingStatus.NOT_LOADED,\r\n reason: null,\r\n};\r\n\r\n// Signal to know whether core elements are finished rendering\r\nexport const PreviewPageContext = React.createContext({\r\n elementsLoadingStatus: {\r\n coverImage: defaultElementStatus,\r\n description: defaultElementStatus,\r\n },\r\n updateElementsLoadingStatus: () => { },\r\n});\r\n\r\nexport const usePreviewPageContext = () => useContext(PreviewPageContext);\r\n","import React, { useContext } from 'react';\r\n\r\nexport const AppInsightsContext = React.createContext({});\r\n\r\nexport const useAppInsightsContext = () => {\r\n const context = useContext(AppInsightsContext);\r\n return context;\r\n};\r\n","import React, { useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { GlobalErrorView } from '@bingads-webui-react/app-global-error-view';\r\nimport { I18nContext } from '@bingads-webui-react/i18n-context';\r\n\r\nexport const DefaultErrorView = ({ errorViewMode }) => {\r\n const i18n = useContext(I18nContext);\r\n\r\n if (errorViewMode === 'componentMode') {\r\n return null;\r\n }\r\n\r\n const title = i18n.getString(_TL_('Well, that\\'s unexpected'));\r\n const description = [\r\n i18n.getString(_TL_(\"This website isn't available right now, but everything should be back to normal very soon.\")),\r\n () => {i18n.getString(_TL_('Refresh Page'))},\r\n ];\r\n\r\n const errorViewProps = {\r\n className: 'campaign-ui-error-page',\r\n title,\r\n description,\r\n };\r\n return ;\r\n};\r\n\r\nDefaultErrorView.propTypes = {\r\n errorViewMode: PropTypes.string,\r\n};\r\n\r\nDefaultErrorView.defaultProps = {\r\n errorViewMode: 'componentMode',\r\n};\r\n","import _ from 'underscore';\r\nimport React, { useContext } from 'react';\r\nimport { InstrumentationServiceContext } from '@bingads-webui-campaign-react/smart-page-context';\r\nimport { DefaultErrorView } from './default-error-view';\r\n\r\nfunction createErrorMessage(error, { componentStack = '' }) {\r\n if (_.isString(error)) {\r\n return `${error} ${componentStack}`;\r\n }\r\n if (_.isObject(error)) {\r\n const errorStack = error.stack ? error.stack : '';\r\n return `${error.message} ${componentStack} ${errorStack}`.trim();\r\n }\r\n // If some other object, log it as is\r\n try {\r\n return error.toString();\r\n } catch (e) {\r\n return 'Error could not be serialized';\r\n }\r\n}\r\n\r\nconst getErrorView = errorViewMode => () => ;\r\n\r\nexport const getErrorOptions = ({ logger, errorViewMode }) => {\r\n if (!logger) {\r\n return {\r\n logError: _.loop,\r\n renderErrorView: getErrorView(errorViewMode),\r\n };\r\n }\r\n return ({\r\n logError: ({ error, info }) => {\r\n logger.logError(createErrorMessage(error, info));\r\n },\r\n renderErrorView: getErrorView(errorViewMode),\r\n });\r\n};\r\n\r\nexport const withErrorOptions = (Component, errorViewMode) => {\r\n const Wrapper = React.memo((props) => {\r\n const logger = useContext(InstrumentationServiceContext);\r\n\r\n return (\r\n \r\n );\r\n });\r\n\r\n return Wrapper;\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { GlobalErrorBoundary } from '@bingads-webui-react/global-error-boundary';\r\nimport { withErrorOptions } from './with-error-boundary-options';\r\n\r\nexport const withErrorView = (WrappedComponent, errorViewMode) => {\r\n const ErrorView = ({ errorOptions, ...props }) => (\r\n \r\n \r\n \r\n );\r\n\r\n ErrorView.propTypes = {\r\n errorOptions: PropTypes.shape({\r\n logError: PropTypes.func.isRequired,\r\n }).isRequired,\r\n };\r\n\r\n return withErrorOptions(ErrorView, errorViewMode);\r\n};\r\n","import './src/index';\r\n\r\n","import { SmartActionButton } from '@bingads-webui-campaign-react/smart-component-action-button';\r\nimport { SmartCoverImage } from '@bingads-webui-campaign-react/smart-component-cover-image';\r\nimport { SmartHeader } from '@bingads-webui-campaign-react/smart-component-header';\r\nimport { SmartFooter } from '@bingads-webui-campaign-react/smart-component-footer';\r\nimport { SmartIntroduction } from '@bingads-webui-campaign-react/smart-component-introduction';\r\nimport { SmartGallery } from '@bingads-webui-campaign-react/smart-component-gallery';\r\nimport { SmartContact } from '@bingads-webui-campaign-react/smart-component-contact';\r\nimport { SmartBusinessHours } from '@bingads-webui-campaign-react/smart-component-business-hours';\r\nimport { SmartUpdate } from '@bingads-webui-campaign-react/smart-component-update';\r\nimport { SmartSummary } from '@bingads-webui-campaign-react/smart-component-summary';\r\nimport { SmartSocialLinks } from '@bingads-webui-campaign-react/smart-component-social-links';\r\nimport { SmartReview } from '@bingads-webui-campaign-react/smart-component-review';\r\nimport { SmartVideo } from '@bingads-webui-campaign-react/smart-component-video';\r\nimport { SmartProfessionalService } from '@bingads-webui-campaign-react/smart-component-professional-service';\r\nimport { componentsConfig } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const runtimeComponentsMapping = {\r\n [componentsConfig.header.type]: SmartHeader,\r\n [componentsConfig.footer.type]: SmartFooter,\r\n [componentsConfig.introduction.type]: SmartIntroduction,\r\n [componentsConfig.coverImage.type]: SmartCoverImage,\r\n [componentsConfig.callToAction.type]: SmartActionButton,\r\n [componentsConfig.gallery.type]: SmartGallery,\r\n [componentsConfig.contact.type]: SmartContact,\r\n [componentsConfig.businessHours.type]: SmartBusinessHours,\r\n [componentsConfig.update.type]: SmartUpdate,\r\n [componentsConfig.summary.type]: SmartSummary,\r\n [componentsConfig.professionalService.type]: SmartProfessionalService,\r\n [componentsConfig.video.type]: SmartVideo,\r\n [componentsConfig.socialLinks.type]: SmartSocialLinks,\r\n [componentsConfig.review.type]: SmartReview,\r\n};\r\n","import _ from 'underscore';\r\nimport { cloneDeep } from '@bingads-webui-universal/primitive-utilities';\r\nimport { removeDisabledComponents } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\n/**\r\n * Convert flat view of grid structure to nested view\r\n * @param { object } flatTree its components are flat array.\r\n * @param { object } enabledComponentsConfig available components config.\r\n * Sample: { components: [{}, {}...] }\r\n * @returns { object } root a nested tree structure\r\n * Sample: {\r\n * id: '*',\r\n * children: [{\r\n * id: '**',\r\n * children: [{\r\n * id: '***',\r\n * children: [{}, {}...]\r\n * }]\r\n * }]\r\n * }\r\n */\r\nexport const buildNestedTree = ({ components, ...rest }, enabledComponentsConfig) => {\r\n // Remove disabled components so that orderedComponents doesn't include those.\r\n const allComponents = removeDisabledComponents(cloneDeep(components), enabledComponentsConfig);\r\n const root = {\r\n ...rest,\r\n children: [],\r\n };\r\n const idMapping = _.reduce(allComponents, (memo, component, index) => ({\r\n ...memo,\r\n [component.id]: index,\r\n }), {});\r\n\r\n _.each(allComponents, (component) => {\r\n const { parentId, order } = component;\r\n\r\n if (parentId) {\r\n // for groups, components\r\n const parentSection = allComponents[idMapping[parentId]];\r\n\r\n parentSection.children = parentSection.children || [];\r\n parentSection.children[order] = component;\r\n } else {\r\n // for sections\r\n root.children[order] = component;\r\n }\r\n });\r\n\r\n return root;\r\n};\r\n","import 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\n\r\nexport const SmartSection = ({ children }) => (\r\n
{children}
\r\n);\r\n\r\nSmartSection.propTypes = {\r\n children: PropTypes.oneOfType([\r\n PropTypes.element,\r\n PropTypes.string,\r\n PropTypes.arrayOf(PropTypes.element),\r\n ]).isRequired,\r\n};\r\n\r\nconst UnStyledSmartGroup = ({\r\n children,\r\n colStart,\r\n colSpan,\r\n classes,\r\n totalNodesWithSameLevel,\r\n}) => {\r\n const defaultBreakpoint = 'xl'; // config will take effect when media width larger than 1024px\r\n const breakpointsClasses = {\r\n [`ms-${defaultBreakpoint}Offset${colStart}`]: colStart,\r\n [`ms-${defaultBreakpoint}${colSpan}`]: colSpan,\r\n 'ms-sm12': !colSpan && totalNodesWithSameLevel === 1,\r\n };\r\n\r\n return (\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n );\r\n};\r\n\r\nUnStyledSmartGroup.propTypes = {\r\n children: PropTypes.oneOfType([\r\n PropTypes.element,\r\n PropTypes.string,\r\n PropTypes.arrayOf(PropTypes.element),\r\n ]).isRequired,\r\n classes: PropTypes.shape({\r\n itemContainer: PropTypes.string,\r\n }).isRequired,\r\n colStart: PropTypes.number,\r\n colSpan: PropTypes.number,\r\n totalNodesWithSameLevel: PropTypes.number.isRequired,\r\n};\r\n\r\nUnStyledSmartGroup.defaultProps = {\r\n colStart: undefined,\r\n colSpan: undefined,\r\n};\r\n\r\nexport const SmartGroup = withDefaultStyles(UnStyledSmartGroup, (_, { palette = {} }) => ({\r\n itemContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n background: palette.primaryBackground,\r\n '& .component-title': {\r\n color: palette.primaryText,\r\n },\r\n },\r\n customBreakPoint: {\r\n minHeight: 0,\r\n },\r\n}));\r\n\r\nexport const SmartPage = ({ children }) => (\r\n
\r\n {children}\r\n
\r\n);\r\n\r\nSmartPage.propTypes = {\r\n children: PropTypes.oneOfType([\r\n PropTypes.element,\r\n PropTypes.string,\r\n PropTypes.arrayOf(PropTypes.element),\r\n ]).isRequired,\r\n};\r\n\r\nexport const layoutComponentsMapping = {\r\n page: SmartPage,\r\n section: SmartSection,\r\n group: SmartGroup,\r\n};\r\n","import React from 'react';\r\nimport { layoutComponentsMapping } from './fluent-grid-layout-components';\r\n\r\nexport const Factory = ({\r\n children,\r\n node,\r\n rootId,\r\n dynamicComponentRender,\r\n}) => {\r\n let nodeComponent = null;\r\n const {\r\n type, children: childNodes, ...rest\r\n } = node;\r\n\r\n if (layoutComponentsMapping[type]) {\r\n const LayoutComponent = layoutComponentsMapping[type];\r\n nodeComponent = {children};\r\n } else {\r\n nodeComponent = dynamicComponentRender({ type, rootId, ...rest });\r\n }\r\n return nodeComponent;\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Factory } from './node-factory';\r\n\r\nconst nodeShape = {\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n};\r\n\r\nnodeShape.children = PropTypes.arrayOf(PropTypes.shape(nodeShape));\r\n\r\nexport const NodeRender = ({\r\n rootId,\r\n node,\r\n dynamicComponentRender,\r\n}) => {\r\n const {\r\n children: childNodes,\r\n } = node;\r\n\r\n return (\r\n \r\n {\r\n childNodes && childNodes.map(childNode => NodeRender({\r\n node: { ...childNode, totalNodesWithSameLevel: childNodes.length },\r\n dynamicComponentRender,\r\n rootId,\r\n }))\r\n }\r\n \r\n );\r\n};\r\n\r\nNodeRender.propTypes = {\r\n node: PropTypes.shape({\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n children: PropTypes.arrayOf(PropTypes.shape(nodeShape)),\r\n }).isRequired,\r\n rootId: PropTypes.string.isRequired,\r\n dynamicComponentRender: PropTypes.func.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const DynamicComponentRender = ({\r\n config: {\r\n type,\r\n id,\r\n ...restConfigs\r\n },\r\n componentsMapping,\r\n}) => {\r\n const ItemComponent = componentsMapping[type];\r\n\r\n if (!ItemComponent) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nDynamicComponentRender.propTypes = {\r\n config: PropTypes.shape({\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n }).isRequired,\r\n componentsMapping: PropTypes.objectOf(PropTypes.elementType).isRequired,\r\n};\r\n","import React, { useEffect, useRef, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { noop, map } from 'underscore';\r\nimport { componentsConfig } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { buildNestedTree } from './util/build-tree';\r\nimport { runtimeComponentsMapping } from './loader/runtime-smart-components-loader';\r\nimport { FluentGridLayout } from './layout/fluent-grid-layout';\r\nimport { DynamicComponentRender } from './dynamic-component-render';\r\n\r\n// currently we only have one\r\nconst searchLayout = () => FluentGridLayout;\r\nconst PageLayout = searchLayout();\r\n\r\nconst emptyWSD = {};\r\n\r\nexport const SiteBuilderInternal = ({\r\n pages,\r\n websiteSourceData,\r\n onRenderCompleted,\r\n componentsMapping,\r\n className,\r\n enabledComponentsConfig,\r\n}) => {\r\n const orderedComponentsInPages = useRef([]);\r\n\r\n useEffect(() => {\r\n // when pages change, we should pass new orderedComponentsInPages out\r\n onRenderCompleted({\r\n orderedComponentsInPages: orderedComponentsInPages.current,\r\n });\r\n }, [onRenderCompleted, pages, websiteSourceData]);\r\n\r\n const components = useMemo(() => {\r\n orderedComponentsInPages.current = [];\r\n\r\n return map(pages, (page, index) => {\r\n const tree = buildNestedTree(page, enabledComponentsConfig);\r\n tree.type = 'page';\r\n\r\n return (\r\n {\r\n const newComponentsInPage = [...(orderedComponentsInPages.current[index] || [])];\r\n newComponentsInPage.push({\r\n type: componentConfig.type,\r\n id: componentConfig.id,\r\n });\r\n orderedComponentsInPages.current[index] = newComponentsInPage;\r\n\r\n return (\r\n \r\n );\r\n }}\r\n />\r\n );\r\n });\r\n }, [pages, enabledComponentsConfig, componentsMapping]);\r\n\r\n return (\r\n
\r\n {components}\r\n
\r\n );\r\n};\r\n\r\nSiteBuilderInternal.propTypes = {\r\n pages: PropTypes.arrayOf(PropTypes.any).isRequired,\r\n websiteSourceData: PropTypes.shape({}),\r\n componentsMapping: PropTypes.objectOf(PropTypes.elementType),\r\n onRenderCompleted: PropTypes.func,\r\n className: PropTypes.string,\r\n enabledComponentsConfig: PropTypes.objectOf(PropTypes.object),\r\n};\r\n\r\nSiteBuilderInternal.defaultProps = {\r\n websiteSourceData: emptyWSD,\r\n onRenderCompleted: noop,\r\n componentsMapping: runtimeComponentsMapping,\r\n className: '',\r\n enabledComponentsConfig: componentsConfig,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { NodeRender } from './node-render';\r\nimport './fluent-grid.scss';\r\n\r\nexport const FluentGridLayout = ({\r\n page,\r\n dynamicComponentRender,\r\n}) => (\r\n \r\n);\r\n\r\nFluentGridLayout.propTypes = {\r\n page: PropTypes.shape({\r\n children: PropTypes.arrayOf(PropTypes.shape({\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n children: PropTypes.array,\r\n })).isRequired,\r\n }).isRequired,\r\n dynamicComponentRender: PropTypes.func.isRequired,\r\n};\r\n","export const getStyles = () => ({\r\n container: {\r\n minWidth: 320,\r\n maxWidth: 1366,\r\n boxSizing: 'border-box',\r\n margin: '0 auto',\r\n fontFamily: '\"Segoe UI\", \"Segoe UI Web (West European)\", -apple-system, BlinkMacSystemFont, Roboto, \"Helvetica Neue\", sans-serif',\r\n },\r\n largeDesktopContainer: {\r\n boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)',\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n alignContent: 'center',\r\n },\r\n});\r\n","import React, { useContext, useCallback, useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport {\r\n DataServiceContext,\r\n SiteConfigContext,\r\n useClientContext,\r\n useEditorStatusContext\r\n} from '@bingads-webui-campaign-react/smart-page-context';\r\nimport { withErrorView } from '@bingads-webui-campaign-react/smart-page-error-boundary';\r\nimport { useDefaultStyles } from '@bingads-webui-react/with-default-styles';\r\nimport {\r\n ResponsiveMode,\r\n getEnabledComponentsConfig,\r\n navigateToEditingComponent,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { SiteBuilderInternal } from './site-builder-internal';\r\nimport { getStyles } from './styles';\r\n\r\nexport const SiteBuilder = withErrorView((props) => {\r\n const serverContext = useContext(DataServiceContext);\r\n const { siteConfig, dispatchSiteConfig } = useContext(SiteConfigContext);\r\n const { responsiveMode } = useClientContext();\r\n\r\n const [{ editingComponentType, editingComponentId } = {}] = useEditorStatusContext() || [];\r\n\r\n const onRenderCompleted = useCallback(({\r\n orderedComponentsInPages,\r\n }) => {\r\n dispatchSiteConfig({\r\n type: 'UPDATE_ORDERED_COMPONENTS',\r\n payload: orderedComponentsInPages,\r\n });\r\n\r\n if (editingComponentType && editingComponentId) {\r\n // If we run navigateToEditingComponent function immediately,\r\n // the scroll element's offsetHeight we get is lower than its real height.\r\n // this caused the element can't be scrolled to the center.\r\n // use setTimeout to let the element can be scrolled to the center.\r\n setTimeout(() => {\r\n navigateToEditingComponent(editingComponentId, editingComponentType, siteConfig);\r\n }, 0);\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [dispatchSiteConfig, editingComponentId, editingComponentType]);\r\n\r\n const classes = useDefaultStyles(getStyles);\r\n const enabledComponentsConfig =\r\n useMemo(() => getEnabledComponentsConfig(serverContext), [serverContext]);\r\n\r\n const siteBuilderInternal = useMemo(() => (\r\n \r\n ), [\r\n classes, enabledComponentsConfig, onRenderCompleted,\r\n props.componentsMapping, responsiveMode, siteConfig.pages, siteConfig.websiteSourceData,\r\n ]);\r\n\r\n return siteBuilderInternal;\r\n}, 'pageMode');\r\n","import React, { useReducer, useMemo, useContext } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SiteBuilder } from '@bingads-webui-campaign-react/smart-page-site-builder';\r\nimport {\r\n SiteConfigContext,\r\n siteConfigReducer,\r\n ClientContext,\r\n InstrumentationServiceContext,\r\n useIsSmartPageDarkModeEnabled,\r\n useIsM365Premium,\r\n useIsSmartPageRuntimePageWcpConsentEnabled,\r\n} from '@bingads-webui-campaign-react/smart-page-context';\r\nimport { ThemeProvider } from 'react-jss';\r\nimport { SmartBanner } from '@bingads-webui-campaign-react/smart-component-banner';\r\nimport {\r\n getCurrentTheme,\r\n useResponsiveMode,\r\n getThemeConfigFromWSD,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { useWcpConsent } from './use-wcp-consent';\r\n\r\nexport const SmartPageRuntime = ({\r\n siteInfo,\r\n isRuntime,\r\n}) => {\r\n const isM365Premium = useIsM365Premium();\r\n const isSmartPageDarkModeEnabled = useIsSmartPageDarkModeEnabled();\r\n const isDarkModeEnabled = isM365Premium && isSmartPageDarkModeEnabled;\r\n const isSmartPageRuntimePageWcpConsentEnabled = useIsSmartPageRuntimePageWcpConsentEnabled();\r\n const [siteConfig, dispatchSiteConfig] = useReducer(siteConfigReducer, siteInfo);\r\n\r\n const componentRef = React.useRef();\r\n const { isMobile, responsiveMode } = useResponsiveMode(componentRef.current);\r\n\r\n const logger = useContext(InstrumentationServiceContext);\r\n\r\n const clientContext = {\r\n isMobile,\r\n responsiveMode,\r\n isRuntime,\r\n };\r\n\r\n const locale = siteConfig.websiteSourceData && siteConfig.websiteSourceData.Localization;\r\n useWcpConsent(isSmartPageRuntimePageWcpConsentEnabled, locale, logger, isRuntime);\r\n\r\n const theme = useMemo(() => getCurrentTheme({\r\n themeConfig: isDarkModeEnabled && getThemeConfigFromWSD(siteConfig.websiteSourceData),\r\n isMobile,\r\n }), [isDarkModeEnabled, isMobile, siteConfig.websiteSourceData]);\r\n\r\n let background = '#edebe9';\r\n if (theme && theme.core && theme.core.palette) {\r\n const { core: { palette: { outerBackground } } } = theme;\r\n if (outerBackground) {\r\n background = outerBackground;\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nSmartPageRuntime.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n siteInfo: PropTypes.object.isRequired,\r\n isRuntime: PropTypes.bool,\r\n};\r\n\r\nSmartPageRuntime.defaultProps = {\r\n isRuntime: false,\r\n};\r\n","import { useEffect } from 'react';\r\n\r\nimport { loadScriptAsynchronously } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport {\r\n clarityScript,\r\n mTagScript,\r\n uetTagScript,\r\n analyticsUetTagScript,\r\n activityWatcherScript,\r\n} from './tracking-scripts';\r\n\r\nexport const useWcpConsent = (isSmartPageRuntimePageWcpConsentEnabled, lang, logger, isRuntime) => {\r\n useEffect(() => {\r\n if (!isRuntime) {\r\n return;\r\n }\r\n\r\n const locale = lang || document.documentElement.lang || navigator.language || 'en-us';\r\n const insertScripts = (consent) => {\r\n const { Analytics, Advertising } = consent;\r\n\r\n if (Analytics) {\r\n if (Advertising) {\r\n loadScriptAsynchronously({ id: 'clarity-script', inlineCode: clarityScript, logger });\r\n }\r\n\r\n loadScriptAsynchronously({ id: 'sp-analytics-uettag-script', inlineCode: analyticsUetTagScript, logger });\r\n loadScriptAsynchronously({ id: 'activity-script', inlineCode: activityWatcherScript, logger });\r\n }\r\n\r\n if (Advertising) {\r\n loadScriptAsynchronously({ id: 'mtag-script', inlineCode: mTagScript, logger });\r\n loadScriptAsynchronously({ id: 'uettag-script', inlineCode: uetTagScript, logger });\r\n }\r\n };\r\n const onConsentChanged = (consent) => {\r\n insertScripts(consent);\r\n };\r\n\r\n if (isSmartPageRuntimePageWcpConsentEnabled) {\r\n // WCP Consent API: https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/wcp/privacy/wcp-cookie-consent-api?\r\n window.WcpConsent && window.WcpConsent.init(locale, 'consent-banner', (err, _siteConsent) => { // eslint-disable-line no-unused-expressions\r\n if (!err) {\r\n window.siteConsent = _siteConsent;\r\n\r\n const consent = _siteConsent.getConsent();\r\n insertScripts(consent);\r\n }\r\n }, onConsentChanged, window.WcpConsent.themes.light);\r\n } else {\r\n insertScripts({ Analytics: true, Advertising: true });\r\n }\r\n }, []);\r\n};\r\n","export const clarityScript = `(function(c,l,a,r,i,t,y){\r\n c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};\r\n t=l.createElement(r);t.async=1;t.src=\"https://www.clarity.ms/tag/\"+i;\r\n y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);\r\n})(window, document, \"clarity\", \"script\", ClarityId);`;\r\n\r\nexport const mTagScript = `(function(d,s,i){\r\n if(!i)return;\r\n var f,j;\r\n f=d.getElementsByTagName(s)[0];\r\n j=d.createElement(s);\r\n j.async=true;\r\n j.src='https://mtag.microsoft.com/tags/'+i+'.js';\r\n j.referrerPolicy='no-referrer-when-downgrade';\r\n f.parentNode.insertBefore(j,f);\r\n})(document,'script', MTagId || (!config.IsMTagMigrated ? config.UetTagId : undefined));`;\r\n\r\n// UET tag script for conversion tracking\r\nexport const uetTagScript = '(function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:UetTagId||(config.IsMTagMigrated?config.UetTagId:undefined)};o.q=w[u],w[u]=new UET(o),w[u].push(\"pageLoad\")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!==\"loaded\"&&s!==\"complete\"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,\"script\",\"//bat.bing.com/bat.js\",\"uetq\");';\r\n\r\n// UET tag script for smart page analytics tracking\r\nexport const analyticsUetTagScript = '(function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:config.AnalyticsTagId};o.q=w[u],w[u]=new UET(o),w[u].push(\"pageLoad\")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!==\"loaded\"&&s!==\"complete\"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,\"script\",\"//bat.bing.com/bat.js\",\"uetq_sp\");';\r\n\r\nexport const activityWatcherScript = `(function activityWatcher() {\r\n var sendDataInterval = 10 * 1000;\r\n var activeTimeout = 60 * 1000;\r\n var lastActiveTime = Date.now();\r\n setInterval(function checnAndSend() {\r\n if (Date.now() - lastActiveTime < activeTimeout) {\r\n window.uetq_sp = window.uetq_sp || [];\r\n window.uetq_sp.push('event', 'Alive', {\r\n event_label: Date.now(),\r\n });\r\n }\r\n }, sendDataInterval);\r\n function activity() {\r\n lastActiveTime = Date.now();\r\n }\r\n [\r\n 'mousedown',\r\n 'mousemove',\r\n 'keydown',\r\n 'scroll',\r\n 'touchstart',\r\n ].forEach(function handleActivity(eventName) {\r\n document.addEventListener(eventName, activity, true);\r\n });\r\n}());`;\r\n","export const getCommonOdataOptions = ({ serverContext }) => {\r\n const {\r\n CurrentCustomer: currentCustomer,\r\n CurrentAccount: currentAccount,\r\n ServicesEndpoints: { CampaignAPI: host },\r\n CampaignAPIPath: path,\r\n Token: token,\r\n Urls: { SignOutUrl = null } = {},\r\n } = serverContext;\r\n\r\n return {\r\n cid: currentCustomer ? currentCustomer.Id : '',\r\n aid: currentAccount ? currentAccount.Id : '',\r\n host,\r\n path,\r\n token,\r\n SignOutUrl,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { http, odata } from '@bingads-webui/http-util';\r\n\r\nexport const signOutOnTokenExpire = (e, signOutUrl) => {\r\n if (e && e.status === 401) {\r\n window.location.href = signOutUrl;\r\n }\r\n};\r\n\r\nexport const wrapOptionsOfODataMethods = (options = {}) =>\r\n _.defaults({\r\n error: (xhr, textStatus, errorThrown) => {\r\n if (xhr && xhr.status === 401 && options.SignOutUrl) {\r\n window.location.href = options.SignOutUrl;\r\n }\r\n if (options.error) {\r\n options.error(xhr, textStatus, errorThrown);\r\n }\r\n },\r\n }, options);\r\n\r\nexport const addOptionsToODataMethod = methodName =>\r\n (...args) => {\r\n const [url, options, cb] = http.signature(args);\r\n\r\n return odata[methodName](url, wrapOptionsOfODataMethods(options), cb);\r\n };\r\n\r\nexport const wrappedOdata = _.defaults({\r\n get: addOptionsToODataMethod('get'),\r\n post: addOptionsToODataMethod('post'),\r\n put: addOptionsToODataMethod('put'),\r\n patch: addOptionsToODataMethod('patch'),\r\n delete: addOptionsToODataMethod('delete'),\r\n}, odata);\r\n","import _ from 'underscore';\r\nimport { generateGuid } from '@bingads-webui-universal/primitive-utilities';\r\nimport {\r\n DATA_SOURCE_KEY_MAPPING,\r\n getDataSourceByKeys,\r\n getAttributesFromSiteConfig,\r\n getAttributesFromSnapshot,\r\n createWebsiteSourceData,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const SmartPageAction = {\r\n None: 'None',\r\n EnableCampaigns: 'EnableCampaigns',\r\n PauseCampaigns: 'PauseCampaigns',\r\n UpsertLeadTracking: 'UpsertLeadTracking',\r\n};\r\n\r\nexport const SmartPageStatus = {\r\n Published: 'Published',\r\n Offline: 'Offline',\r\n Deleted: 'Deleted',\r\n Draft: 'Draft',\r\n PendingPublish: 'PendingPublish',\r\n UnpublishedChanges: 'UnpublishedChanges',\r\n};\r\n\r\nexport const isSmartPagePublished = (smartpageData) => {\r\n if (_.isEmpty(smartpageData) || _.isEmpty(smartpageData.status)) {\r\n return false;\r\n }\r\n\r\n return smartpageData.status === SmartPageStatus.Published\r\n || smartpageData.status === SmartPageStatus.PendingPublish\r\n || smartpageData.status === SmartPageStatus.UnpublishedChanges;\r\n};\r\n\r\nexport const siteConfigToModel = (siteConfig, action = SmartPageAction.None, serverContext) => {\r\n const attrs = getAttributesFromSiteConfig(siteConfig);\r\n const snapshotAttrs = getAttributesFromSnapshot(siteConfig.snapshots);\r\n\r\n const [\r\n businessName,\r\n businessDescription,\r\n businessCategories,\r\n ] = getDataSourceByKeys(siteConfig, [\r\n DATA_SOURCE_KEY_MAPPING.BusinessName,\r\n DATA_SOURCE_KEY_MAPPING.BusinessDescription,\r\n DATA_SOURCE_KEY_MAPPING.BusinessCategories,\r\n ]);\r\n const subDomain = siteConfig.subDomain || generateGuid();\r\n const descriptionFromCategory = businessCategories && businessCategories.join(', ');\r\n const description = businessDescription || descriptionFromCategory || '';\r\n\r\n const {\r\n uetTagId,\r\n isMTagMigrated,\r\n status,\r\n images,\r\n smartPageDataContext,\r\n migrationContext,\r\n } = siteConfig;\r\n\r\n const model = {\r\n '@odata.type': '#Model.SmartPage',\r\n Name: businessName,\r\n Description: description,\r\n SubDomain: subDomain,\r\n SiteSuffix: '',\r\n UetTagId: uetTagId,\r\n IsMTagMigrated: isMTagMigrated,\r\n Attributes: attrs,\r\n Snapshots: snapshotAttrs,\r\n Status: status || SmartPageStatus.Draft,\r\n ImageIds: _.uniq(_.pluck(images, 'IdString')),\r\n SmartPageDataContext: smartPageDataContext,\r\n Action: action,\r\n WebsiteSourceData: createWebsiteSourceData(siteConfig, serverContext),\r\n WSDMigrationContext: migrationContext,\r\n };\r\n\r\n return model;\r\n};\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { http } from '@bingads-webui/http-util';\r\nimport { getSmartPageUrlSuffix } from '@bingads-webui-campaign/smart-page-url-suffix-provider';\r\nimport {\r\n modelToSiteConfig,\r\n facebookPageToSiteConfig,\r\n} from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nimport { getCommonOdataOptions } from './odata-options';\r\nimport { wrappedOdata as odata } from './odata-wrapper';\r\nimport { SmartPageAction, SmartPageStatus, siteConfigToModel } from './service-utils';\r\n\r\nexport const SmartPageService = ({\r\n serverContext,\r\n}) => {\r\n const service = {};\r\n const {\r\n cid,\r\n aid,\r\n host,\r\n path,\r\n token,\r\n SignOutUrl,\r\n } = getCommonOdataOptions({ serverContext });\r\n\r\n const initOption = {\r\n cid,\r\n aid,\r\n host,\r\n path,\r\n token,\r\n SignOutUrl,\r\n };\r\n if (SmartPageService.service && _.isEqual(SmartPageService.initOption, initOption)) {\r\n return SmartPageService.service;\r\n }\r\n SmartPageService.initOption = initOption;\r\n\r\n const baseUrl = `Customers(${cid})/Accounts(${aid})/SmartPages`;\r\n const defaultQuery = {\r\n $top: 20,\r\n $skip: 0,\r\n $count: true,\r\n };\r\n const pollRetryTimespan = 3000;\r\n const maxRetry = 20;\r\n\r\n const oDataOption = {\r\n contentType: 'application/json',\r\n host,\r\n path,\r\n oDataToken: token,\r\n SignOutUrl,\r\n };\r\n\r\n const getUrlWithId = id => `${baseUrl}('${id}')`;\r\n\r\n const pollCompletion = (id, retry, resolve, reject) => {\r\n if (retry <= 0) {\r\n reject('Publish pollCompletion timeout');\r\n return;\r\n }\r\n\r\n service.get(id)\r\n .then((data) => {\r\n if (data.status === 'Published') {\r\n // Upon successful publish, insert a call to ui server to force update cached\r\n // page version on subdomain, otherwise user would still see smart page content\r\n // before publishing. Best effort, do not check return on updateversion\r\n // do not interrupt the publish flow on updateversion failure\r\n // No response body in this request\r\n http.get(`https://${data.subDomain}${getSmartPageUrlSuffix(document.domain)}/updateversion`, { dataType: 'text' });\r\n\r\n resolve(data);\r\n } else {\r\n setTimeout(() => pollCompletion(id, retry - 1, resolve, reject), pollRetryTimespan);\r\n }\r\n }).catch(e => reject(e));\r\n };\r\n\r\n service.getAll = (customQuery) => {\r\n const query = _.extend({}, defaultQuery, customQuery);\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: baseUrl,\r\n data: query,\r\n }\r\n );\r\n\r\n return odata.get(options)\r\n .then(res => _.map(res.value, item => modelToSiteConfig(item, serverContext)));\r\n };\r\n\r\n service.get = (id, customQuery) => {\r\n const query = _.extend({}, customQuery);\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: getUrlWithId(id),\r\n data: query,\r\n }\r\n );\r\n\r\n return odata.get(options)\r\n .then(res => modelToSiteConfig(res, serverContext));\r\n };\r\n\r\n service.create = (siteConfig) => {\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: baseUrl,\r\n data: siteConfigToModel(siteConfig, SmartPageAction.None, serverContext),\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then(res => ({ Id: res.value }));\r\n };\r\n\r\n service.update = (id, siteConfig, action = SmartPageAction.None) => {\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: getUrlWithId(id),\r\n data: siteConfigToModel(siteConfig, action, serverContext),\r\n }\r\n );\r\n\r\n return odata.patch(options)\r\n .then(res => modelToSiteConfig(res, serverContext));\r\n };\r\n\r\n service.delete = (id) => {\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: getUrlWithId(id),\r\n }\r\n );\r\n\r\n return odata.delete(options);\r\n };\r\n\r\n service.publish = (id, action = SmartPageAction.None) => {\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: getUrlWithId(id),\r\n data: {\r\n '@odata.type': '#Model.SmartPage',\r\n Status: SmartPageStatus.Published,\r\n Action: action,\r\n },\r\n }\r\n );\r\n\r\n return odata.patch(options)\r\n .then(() => ({ Id: id }));\r\n };\r\n\r\n service.pollStatus = id => new Promise((resolve, reject) => {\r\n pollCompletion(id, maxRetry, resolve, reject);\r\n });\r\n\r\n service.getFacebookPage = (fbPageId, fbAuthInfo, dataFilter, scenario) => {\r\n const url = `${baseUrl}/Default.GetFbPage`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n fbPageAuthorizationData: {\r\n PageId: fbPageId,\r\n UserId: fbAuthInfo.fbUserId,\r\n Scenario: scenario,\r\n Content: dataFilter || [],\r\n },\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then(res => facebookPageToSiteConfig(res));\r\n };\r\n\r\n\r\n service.getFacebookPageList = (fbAuthInfo, dataFilter, scenario) => {\r\n const url = `${baseUrl}/Default.GetFbUserPages`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n fbPageAuthorizationData: {\r\n UserToken: fbAuthInfo.fbToken,\r\n UserId: fbAuthInfo.fbUserId,\r\n Scenario: scenario,\r\n Content: dataFilter || [],\r\n },\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then(res => _.chain(res.value)\r\n .sortBy(pageInfo => pageInfo.Name)\r\n .map(pageInfo => facebookPageToSiteConfig(pageInfo))\r\n .value());\r\n };\r\n\r\n service.isSubdomainAvailable = (subdomain) => {\r\n const url = `${baseUrl}/Default.IsSubdomainAvailable(subdomain='${subdomain}')`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n }\r\n );\r\n\r\n return odata.get(options).then(res => res.value);\r\n };\r\n\r\n service.getBusinessCategorySuggestions = ({ searchQueries, locale = 'en-us' }) => {\r\n const url = `${baseUrl}/GetCategorySuggestions`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n searchQueries,\r\n locale,\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => res.value);\r\n };\r\n\r\n service.associateEntities = (id, entityIds, associatedEntityStatus) => {\r\n const url = `${getUrlWithId(id)}/Associate`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n EntityIds: entityIds,\r\n AssociationType: 'DMCCampaign',\r\n ...(\r\n !_.isEmpty(associatedEntityStatus)\r\n ? { AssociatedEntityStatus: associatedEntityStatus }\r\n : {}\r\n ),\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => res.value);\r\n };\r\n\r\n service.disassociateEntities = (id, entityIds) => {\r\n const url = `${getUrlWithId(id)}/Disassociate`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n EntityIds: entityIds,\r\n AssociationType: 'DMCCampaign',\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => res.value);\r\n };\r\n\r\n service.getAssociationsByEntityIds = (entityIds) => {\r\n const url = `${baseUrl}/GetAssociations`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n EntityIds: entityIds,\r\n AssociationType: 'DMCCampaign',\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then(res => res.value);\r\n };\r\n\r\n service.getSmartPageMetrics = (id, startDate, endDate) => {\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: `${getUrlWithId(id)}/SmartPageMetrics`,\r\n data: {\r\n startDate,\r\n endDate,\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => _.first(res.value) || {});\r\n };\r\n\r\n const campaignOption = {\r\n ...oDataOption,\r\n path: '/Mca/V1',\r\n };\r\n\r\n const accountOption = {\r\n ...campaignOption,\r\n };\r\n\r\n const campaignBaseUrl = `Customers(${cid})/Accounts(${aid})/Campaigns`;\r\n const accountBaseUrl = `Customers(${cid})/Accounts(${aid})`;\r\n\r\n const campaignBaseUrlWithId = id => `${campaignBaseUrl}('${id}')`;\r\n\r\n const attachCampaignParams = (url, params) => {\r\n const paramStr = Object.entries(params).map(([key, value]) => [`$${key}=${Array.isArray(value) ? value.join(',') : value}`]).join('&');\r\n if (url.includes('?')) {\r\n return `${url}&${paramStr}`;\r\n }\r\n return `${url}?${paramStr}`;\r\n };\r\n\r\n service.getCampaign = id =>\r\n odata.get({\r\n ...campaignOption,\r\n url: attachCampaignParams(campaignBaseUrlWithId(id), {\r\n expand: [\r\n 'Ads',\r\n 'Targets',\r\n 'Keywords',\r\n 'SocialProfiles',\r\n ],\r\n }),\r\n });\r\n\r\n service.patchCampaign = (id, data) =>\r\n odata.patch({\r\n ...campaignOption,\r\n url: campaignBaseUrlWithId(id),\r\n data,\r\n });\r\n\r\n service.getCampaigns = () =>\r\n odata.get({\r\n ...campaignOption,\r\n url: campaignBaseUrl,\r\n }).then(value => (Array.isArray(value && value.value) ? value.value : []));\r\n\r\n service.getBudgetSuggestion = (id, data) =>\r\n odata.post({\r\n ...campaignOption,\r\n url: `${campaignBaseUrlWithId(id)}/Default.GetUPBudgetSuggestions`,\r\n data,\r\n });\r\n\r\n service.getSocialProfileIds = () =>\r\n odata.get({\r\n ...campaignOption,\r\n url: attachCampaignParams(`${accountBaseUrl}/SocialProfiles?useCache=true`, {\r\n filter: ['Facebook', 'Instagram', 'LinkedIn', 'Twitter'].map(type => `ChannelType eq Enum.ChannelType'${type}'`).join(' or '),\r\n }),\r\n }).then(res => _.map(res.value, profile => profile.Id));\r\n\r\n service.getActivitesCount = ({\r\n activityTypes,\r\n endDate,\r\n lastCheckPoint,\r\n profileIds,\r\n startDate,\r\n }) =>\r\n odata.post({\r\n ...campaignOption,\r\n url: `${accountBaseUrl}/Default.GetActivitiesCount?$count=true`,\r\n data: {\r\n activityTypes,\r\n endDate,\r\n lastCheckPoint,\r\n profileIds,\r\n startDate,\r\n },\r\n }).then(res => _.first(res.value) || 0);\r\n\r\n service.getAdsPerformanceMetrics = data =>\r\n odata.post({\r\n ...accountOption,\r\n url: `${accountBaseUrl}/Default.McaAdsPerformanceMetrics`,\r\n data,\r\n });\r\n\r\n service.getCategorySuggestions = data =>\r\n odata.post({\r\n ...accountOption,\r\n url: `${accountBaseUrl}/Default.GetCategorySuggestions`,\r\n data,\r\n }).then(res => res.value);\r\n\r\n service.getContentSuggestions = (businessName, keywords, resultOption, imageSource, locale) => {\r\n const url = `${baseUrl}/Default.ContentSuggestions`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n businessName,\r\n keywords,\r\n entity: resultOption,\r\n imageSource,\r\n locale,\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then(res => _.first(res.value) || {});\r\n };\r\n\r\n service.getTemplateSuggestions = (categories) => {\r\n const url = `${baseUrl}/Default.TemplateSuggestions`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: { categories },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => res.value);\r\n };\r\n\r\n service.getExistingBookings = (id) => {\r\n const url = `${getUrlWithId(id)}/GetSmartPageBookings`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n }\r\n );\r\n\r\n return odata.get(options).then((res) => {\r\n if (_.isArray(res.value)) {\r\n return res.value.map(item => ({\r\n id: item.Id,\r\n emailAddress: item.EmailAddress,\r\n name: item.Name,\r\n phoneNumber: item.PhoneNumber,\r\n sequence: item.Sequence,\r\n status: item.Status,\r\n time: item.Time,\r\n timeInMinutes: item.TimeInMinutes,\r\n message: item.Message,\r\n service: item.Service,\r\n userTimeZoneOffset: item.UserTimeZoneOffset,\r\n }));\r\n }\r\n\r\n return [];\r\n });\r\n };\r\n\r\n service.upsertSmartPageBookings = ({\r\n manageAppointmentLink,\r\n customerEmailAddress,\r\n bookingDetail,\r\n smartPageId,\r\n businessName,\r\n customerTimeZoneOffset,\r\n userLocale,\r\n }) => {\r\n const url = `${getUrlWithId(smartPageId)}/UpsertSmartPageBookings`;\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n Bookings: [{\r\n Id: bookingDetail.id,\r\n Name: bookingDetail.name,\r\n PhoneNumber: bookingDetail.phoneNumber,\r\n EmailAddress: bookingDetail.emailAddress,\r\n Sequence: bookingDetail.sequence,\r\n Status: bookingDetail.status,\r\n Time: bookingDetail.time,\r\n TimeInMinutes: bookingDetail.timeInMinutes,\r\n Message: bookingDetail.message,\r\n Service: bookingDetail.service,\r\n UserTimeZoneOffset: bookingDetail.userTimeZoneOffset,\r\n }],\r\n SPEmailAddress: customerEmailAddress,\r\n ManageAppointmentLink: manageAppointmentLink,\r\n BusinessName: businessName,\r\n SPTimeZoneOffset: customerTimeZoneOffset,\r\n UserLocale: userLocale,\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options).then(res => res.value);\r\n };\r\n\r\n service.updateDomain = ({\r\n subdomain,\r\n customDomain,\r\n isAutoUpdateDNS,\r\n userId,\r\n userToken,\r\n smartPageId,\r\n ignoreUpdateInterval,\r\n }) => {\r\n const url = `${getUrlWithId(smartPageId)}/UpdateDomain`;\r\n\r\n const data = subdomain\r\n ? {\r\n Subdomain: subdomain,\r\n IgnoreUpdateInterval: ignoreUpdateInterval,\r\n }\r\n : {\r\n CustomDomain: customDomain,\r\n IsAutoUpdateDNSRecords: isAutoUpdateDNS,\r\n M365AuthorizationData: {\r\n UserId: userId,\r\n UserToken: userToken,\r\n },\r\n IgnoreUpdateInterval: ignoreUpdateInterval,\r\n };\r\n\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data,\r\n }\r\n );\r\n\r\n return odata.post(options);\r\n };\r\n\r\n service.getM365Domains = (userId, userToken) => {\r\n const url = `${baseUrl}/Default.GetM365Domains`;\r\n\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n M365AuthorizationData: {\r\n UserId: userId,\r\n UserToken: userToken,\r\n },\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then((res) => {\r\n if (_.isArray(res.value)) {\r\n return res.value.map(domain => ({\r\n domainName: domain.DomainName,\r\n domainType: domain.DomainType,\r\n dnsProviderName: domain.DnsProviderName,\r\n }));\r\n }\r\n\r\n return [];\r\n });\r\n };\r\n\r\n // Mark this campaign for MT to go live later via offline task when custom domain is available\r\n service.saveCampaignToGoLiveLater = (campaignId, smartPageId) => {\r\n const url = `${getUrlWithId(smartPageId)}/Default.SignupCampaignGoLive`;\r\n\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: {\r\n SignupCampaignIds: [campaignId],\r\n },\r\n }\r\n );\r\n\r\n return odata.post(options);\r\n };\r\n\r\n SmartPageService.service = service;\r\n\r\n return service;\r\n};\r\n","import _ from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { ImageODataService } from '@bingads-webui/image-odata-service';\r\nimport { getCommonOdataOptions } from './odata-options';\r\nimport { signOutOnTokenExpire, wrappedOdata as odata } from './odata-wrapper';\r\nimport { serializeCSV, parse } from './bulkify';\r\n\r\nexport const ImageService = ({\r\n serverContext,\r\n}) => {\r\n const service = {};\r\n const {\r\n cid,\r\n aid,\r\n host,\r\n path,\r\n token,\r\n SignOutUrl,\r\n } = getCommonOdataOptions({ serverContext });\r\n\r\n const odataService = new ImageODataService({\r\n cid,\r\n aid,\r\n host,\r\n path,\r\n token,\r\n });\r\n\r\n const baseUrl = `Customers(${cid})/Accounts(${aid})`;\r\n const oDataOption = {\r\n contentType: 'application/json',\r\n host,\r\n path,\r\n oDataToken: token,\r\n SignOutUrl,\r\n };\r\n\r\n service.get = (id) => {\r\n if (id) {\r\n return odataService.getImage(id)\r\n .then(({\r\n Id, IdString, Url, Width, Height,\r\n }) => (\r\n {\r\n // align with images field in smart page odata model\r\n Id,\r\n IdString,\r\n ImageUrl: Url,\r\n\r\n // for below, need save under component config\r\n Width,\r\n Height,\r\n }\r\n )).catch((e) => {\r\n signOutOnTokenExpire(e, SignOutUrl);\r\n throw e;\r\n });\r\n }\r\n return Promise.resolve({});\r\n };\r\n\r\n service.batchGet = (ids) => {\r\n if (!_.isEmpty(ids)) {\r\n return Promise.all(_.map(ids, imageId =>\r\n service.get(imageId)\r\n .catch((e) => {\r\n signOutOnTokenExpire(e, SignOutUrl);\r\n throw e;\r\n })));\r\n }\r\n return Promise.resolve([]);\r\n };\r\n\r\n service.upload = (imageData) => {\r\n let processedImageData = imageData;\r\n\r\n const base64 = 'base64,';\r\n const base64Index = imageData.indexOf(base64);\r\n\r\n processedImageData = base64Index > -1\r\n ? imageData.substr(base64Index + base64.length)\r\n : imageData;\r\n\r\n const body = {\r\n Data: processedImageData,\r\n Type: 'GenericImage',\r\n };\r\n\r\n return odataService.postImage(body)\r\n .then(result => ({ imageId: result.value }))\r\n .catch((e) => {\r\n signOutOnTokenExpire(e, SignOutUrl);\r\n throw e;\r\n });\r\n };\r\n\r\n\r\n service.bulkUpsert = (imageUrls, handleErrors) => {\r\n if (_.isEmpty(imageUrls)) {\r\n return Promise.resolve([]);\r\n }\r\n\r\n const csvRows = serializeCSV(imageUrls, aid);\r\n\r\n const url = `${baseUrl}/Default.BulkUpsert`;\r\n\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: { CsvRows: csvRows },\r\n }\r\n );\r\n\r\n return odata.post(options)\r\n .then((res) => {\r\n if (_.isEmpty(res)) {\r\n return [];\r\n }\r\n const imageInfo = parse(res);\r\n if (!_.isEmpty(imageInfo.errors) && handleErrors) {\r\n handleErrors(imageInfo.errors);\r\n }\r\n return imageInfo.results;\r\n });\r\n };\r\n\r\n return service;\r\n};\r\n","import _ from 'underscore';\r\n\r\nconst serializecsvRow = (imageUrl, aid) => `Image,Active,GenericImage,,,${aid},${imageUrl}`;\r\n\r\nexport const serializeCSV = (imageUrls, aid) => {\r\n if (_.isEmpty(imageUrls)) {\r\n return [];\r\n }\r\n\r\n const csvHeader = 'Type,Status,Sub Type,Id, Name,Parent Id,Url';\r\n const csvFormat = 'Format Version,,,,6,,';\r\n const csvRows = _.map(imageUrls, imageUrl => serializecsvRow(imageUrl, aid));\r\n const csv = _.flatten([csvHeader, csvFormat, csvRows]);\r\n\r\n return csv;\r\n};\r\n\r\n\r\nexport const parse = (csvData) => {\r\n const results = [];\r\n const errors = [];\r\n\r\n const headers = csvData[0];\r\n\r\n // first line is header, second line is format version. needs to be skipped.\r\n const data = csvData.slice(2);\r\n\r\n let errorColIndex = -1;\r\n let imageIdColIndex = -1;\r\n let uploadUrlColIndex = -1;\r\n\r\n _.each(headers, (col, index) => {\r\n if (col === 'Id') {\r\n imageIdColIndex = index;\r\n } else if (col === 'Error') {\r\n errorColIndex = index;\r\n } else if (col === 'Url') {\r\n uploadUrlColIndex = index;\r\n }\r\n });\r\n\r\n _.each(data, (row) => {\r\n if (errorColIndex !== -1 && row[errorColIndex]) {\r\n errors.push(row[errorColIndex]);\r\n } else {\r\n // Will push undefined imageId if that image is not uploaded correctly\r\n // the upload url will always defined\r\n results.push({\r\n imageId: row[imageIdColIndex],\r\n uploadUrl: row[uploadUrlColIndex],\r\n });\r\n }\r\n });\r\n\r\n return {\r\n results,\r\n errors,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { wrappedOdata as odata } from './odata-wrapper';\r\n\r\nexport const MailService = ({\r\n location,\r\n customerName,\r\n customerEmail,\r\n signOutUrl,\r\n}) => {\r\n const service = {};\r\n const url = `${location.protocol}//${location.host}/sendemail`;\r\n\r\n const oDataOption = {\r\n contentType: 'application/json',\r\n SignOutUrl: signOutUrl,\r\n };\r\n\r\n service.sendMail = ({\r\n mailType,\r\n userName,\r\n userMail,\r\n userPhone,\r\n message,\r\n userLocale,\r\n }) => {\r\n const body = {\r\n MailType: mailType,\r\n SmartPage: location.host,\r\n CustomerName: customerName,\r\n CustomerEmail: customerEmail,\r\n UserName: userName,\r\n UserEmail: userMail,\r\n UserPhone: userPhone,\r\n UserMessage: message,\r\n UserLocale: userLocale,\r\n };\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url,\r\n data: body,\r\n // No response body in this request\r\n dataType: 'text',\r\n }\r\n );\r\n\r\n return odata.post(options);\r\n };\r\n\r\n return service;\r\n};\r\n","import { getODataErrors } from '@bingads-webui-campaign/api-errors';\r\n\r\nexport const generalErrorMessage = _TL_(\"We've encountered an error and could not finish this task. Please try again or contact support.\");\r\nconst getDomainsOAuthErrorMessage = _TL_('We weren\\'t able to retrieve your purchased domains. Please sign in to your M365 for Business account again.');\r\n\r\nexport const SmartPageErrorMap = {\r\n // smart page specific error code mapping, should looks like\r\n // errorCode: _TL_('error message')),\r\n GeneralError: generalErrorMessage,\r\n TimeOut: _TL_('Operation time out. Come back later to edit your website.'),\r\n SmartPageInvalidStatusForAdd: _TL_('Smart page site has invalid status for adding.'),\r\n SmartPageSubdomainIsNotAvailable: _TL_('This URL is already in use. Please choose a different one.'),\r\n SmartPageLimitExceeded: generalErrorMessage,\r\n SmartPageSiteSuffixAlreadyExists: generalErrorMessage,\r\n SmartPageMissingSiteSuffix: generalErrorMessage,\r\n SmartPageListIsNullOrEmpty: generalErrorMessage,\r\n SmartPageInvalidSiteSuffix: generalErrorMessage,\r\n SmartPageIsNull: generalErrorMessage,\r\n SmartPageInvalidStatus: _TL_('Smart page site has invalid status. Please refresh your page and try again.'),\r\n SmartPageInvalidSubdomain: _TL_('Smart page site has invalid subdomain.'),\r\n CustomerNotInPilotForSmartPage: _TL_('This customer is not in pilot for smart page.'),\r\n SmartPageGetFbPageUserError: _TL_('We cannot get Facebook page for this user.'),\r\n SmartPageGetFbPageApiError: _TL_('We cannot get Facebook page for this user.'),\r\n SmartPageIdIsInvalid: generalErrorMessage,\r\n SmartPageConcurrentUpdatingIsNotAllowed: _TL_('Concurrent updating is not allowed.'),\r\n SmartPageIncompleteInfoProvided: generalErrorMessage,\r\n SmartPageTableStorageError: _TL_('Storage error.'),\r\n SmartPageAssociationListIsNullOrEmpty: generalErrorMessage,\r\n SmartPageAssociationInvalidStatus: generalErrorMessage,\r\n DuplicateSmartPageAssociation: generalErrorMessage,\r\n SmartPageAssociationInvalidType: generalErrorMessage,\r\n SmartPageSubdomainExceedsMaxLength: _TL_('Subdomain exceeds max length.'),\r\n SmartPageFbImportParamMissing: generalErrorMessage,\r\n SmartPageFbImportNoTokenFoundInKeyVault: _TL_('We cannot get Facebook page for this user.'),\r\n SmartPageSubdomainChangeIsNotAllowed: generalErrorMessage,\r\n SmartPageUrlIsRejectedByEditorial: _TL_('Subdomain is rejected by Editorial.'),\r\n SmartPageCustomDomainIsNotAvailable: _TL_('This custom domain is already in use with another Smart Page.'),\r\n SmartPagePreviousCustomDomainIsNotFreedUp: _TL_('It looks like you recently updated your Smart Pages URL. Please wait at least 24 hours before changing your URL again.'),\r\n SmartPagePreviousSubdomainIsNotFreedUp: _TL_('It looks like you recently updated your Smart Pages URL. Please wait at least 24 hours before changing your URL again.'),\r\n SmartPageUpdateDomainWithin24HoursNotAllow: _TL_('You updated your Smart Pages URL less than 24 hours ago. Please wait at least 24 hours before making further changes.'),\r\n SmartPageM365TokenIsNullInKeyVault: getDomainsOAuthErrorMessage,\r\n SmartPageInvalidM365TokenInKeyVault: getDomainsOAuthErrorMessage,\r\n SmartPageM365OAuthError: getDomainsOAuthErrorMessage,\r\n SmartPageM365AdminApiError: generalErrorMessage,\r\n};\r\n\r\nexport const SmartPageNoLoggingError = {\r\n SmartPageInvalidSubdomain: true,\r\n SmartPageConcurrentUpdatingIsNotAllowed: true,\r\n SmartPageUrlIsRejectedByEditorial: true,\r\n SmartPageInvalidStatus: true,\r\n};\r\n\r\nexport const getErrorMessage = (response, i18n) => {\r\n const generalMessage = i18n.getString(generalErrorMessage);\r\n let isUserError = false;\r\n\r\n if (!response || !response.errors || response.errors.length < 1) {\r\n return {\r\n message: generalMessage,\r\n isUserError,\r\n };\r\n }\r\n\r\n // check smart page specific error map first\r\n const code = response.errors[0].Code;\r\n const message = i18n.getString(SmartPageErrorMap[code]);\r\n if (message) {\r\n if (SmartPageNoLoggingError[code]) {\r\n isUserError = true;\r\n }\r\n return {\r\n message,\r\n isUserError,\r\n };\r\n }\r\n\r\n // look up campaign odata error mapping\r\n const errors = getODataErrors(response.errors, i18n);\r\n if (errors && errors[0] && errors[0].message) {\r\n return {\r\n message: errors[0].message,\r\n isUserError,\r\n };\r\n }\r\n\r\n // fallback to general error message\r\n return {\r\n message: generalMessage,\r\n isUserError,\r\n };\r\n};\r\n","import { useContext } from 'react';\r\nimport { DataServiceContext } from '@bingads-webui-campaign-react/smart-page-context';\r\nimport { getContextLocale } from '@bingads-webui-campaign-react/smart-component-util';\r\n\r\nexport const useContextLocale = () => {\r\n const serverContext = useContext(DataServiceContext);\r\n const locale = getContextLocale(serverContext);\r\n\r\n return locale;\r\n};\r\n","import { Promise } from 'bluebird';\r\nimport { useState, useCallback, useContext, useMemo, useEffect, useRef } from 'react';\r\nimport _ from 'underscore';\r\n\r\nimport {\r\n DataServiceContext,\r\n InstrumentationServiceContext,\r\n useIsSmartPageImageTextSuggestionEnabled,\r\n useIsSmartPageM365StockImageEnabled,\r\n useIsSmartPageM365StockImageGalleryEnabled,\r\n useIsM365Premium,\r\n} from '@bingads-webui-campaign-react/smart-page-context';\r\n\r\nimport { useContextLocale } from './use-context-locale';\r\n\r\nconst DEBOUNCE_WAIT_IN_MS = 600;\r\n\r\nexport const ContentSuggestionOption = {\r\n None: '0',\r\n ImageOnly: '1',\r\n TextOnly: '2',\r\n Both: '3',\r\n};\r\n\r\nexport const ContentSuggestionSource = {\r\n None: '0',\r\n TemplateAdsOnly: '1',\r\n M365: '2',\r\n Both: '3',\r\n};\r\n\r\n/**\r\n * Gets a list of image or text suggestion\r\n * @param {string[]} businessName - business name\r\n * @param {string[]} keywords - search keywords\r\n * @param {string} resultOption - the control option of whether return image or text\r\n * resultOption : 0 => none, 1 => image only, 2 => text only, 3 => both\r\n * @param {boolean} initWithLoading - make the initial state loading,\r\n * so we don't need to wait for the first debounce get trigger\r\n * @returns {Object} - content suggestions.\r\n */\r\nexport function useContentSuggestions(businessName = '', keywords = [], resultOption = ContentSuggestionOption.None, initWithLoading = false) {\r\n const [suggestions, setSuggestions] = useState({ imageSuggestions: null, textSuggestion: null });\r\n const [error, setError] = useState(null);\r\n const [isLoading, setIsLoading] = useState(initWithLoading);\r\n const { imageSuggestions, textSuggestion } = suggestions;\r\n\r\n const previousSearchOptions = useRef(null);\r\n\r\n const { smartPageService } = useContext(DataServiceContext);\r\n const logger = useContext(InstrumentationServiceContext);\r\n\r\n const isSmartPageImageTextSuggestionEnabled = useIsSmartPageImageTextSuggestionEnabled();\r\n const isSmartPageM365StockImageEnabled = useIsSmartPageM365StockImageEnabled();\r\n const isSmartPageM365StockImageGalleryEnabled = useIsSmartPageM365StockImageGalleryEnabled();\r\n const isM365Premium = useIsM365Premium();\r\n\r\n const imageSource = isM365Premium ?\r\n ContentSuggestionSource.Both : ContentSuggestionSource.TemplateAdsOnly;\r\n\r\n const locale = useContextLocale();\r\n\r\n const getContentSuggestions = useCallback((cbBusinessName, cbKeywords, cbResultOption) => {\r\n if (!isSmartPageImageTextSuggestionEnabled\r\n && !isSmartPageM365StockImageEnabled\r\n && !isSmartPageM365StockImageGalleryEnabled) {\r\n return Promise.resolve();\r\n }\r\n\r\n const finalBusinessName = cbBusinessName || businessName;\r\n const finalKeywords = cbKeywords || keywords;\r\n const finalResultOption = cbResultOption || resultOption;\r\n\r\n previousSearchOptions.current = {\r\n businessName: finalBusinessName,\r\n keywords: finalKeywords,\r\n option: finalResultOption,\r\n };\r\n\r\n if (\r\n (finalBusinessName || finalKeywords.length > 0) &&\r\n finalResultOption !== ContentSuggestionOption.None\r\n ) {\r\n setIsLoading(true);\r\n return smartPageService.getContentSuggestions(\r\n finalBusinessName,\r\n finalKeywords,\r\n finalResultOption,\r\n imageSource,\r\n locale\r\n )\r\n .then((res) => {\r\n const newTextSuggestion = res.Text || '';\r\n const newImageSuggestions = res.Images || [];\r\n\r\n setSuggestions({\r\n imageSuggestions: newImageSuggestions,\r\n textSuggestion: newTextSuggestion,\r\n });\r\n\r\n logger.logTrace(`Successfully get suggestions for business name: ${finalBusinessName}, keywords: ${finalKeywords}, option: ${finalResultOption}, source: ${imageSource}, text suggestion count: ${newTextSuggestion ? 1 : 0}, image suggestion count: ${newImageSuggestions.length}`);\r\n return res;\r\n })\r\n .catch((err) => {\r\n setError(err);\r\n logger.logError('Error while getting suggestions', err);\r\n\r\n throw err;\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }\r\n\r\n setSuggestions({\r\n imageSuggestions: null,\r\n textSuggestion: null,\r\n });\r\n\r\n return Promise.resolve();\r\n }, [\r\n keywords,\r\n resultOption,\r\n smartPageService,\r\n logger,\r\n isSmartPageImageTextSuggestionEnabled,\r\n isSmartPageM365StockImageEnabled,\r\n businessName,\r\n isSmartPageM365StockImageGalleryEnabled,\r\n imageSource,\r\n locale,\r\n ]);\r\n\r\n const debouncedGetContentSuggestions = useMemo(\r\n () => _.debounce(getContentSuggestions, DEBOUNCE_WAIT_IN_MS),\r\n [getContentSuggestions]\r\n );\r\n\r\n useEffect(() => {\r\n const shouldGetSuggestion = !previousSearchOptions.current\r\n || previousSearchOptions.current.businessName !== businessName\r\n || previousSearchOptions.current.keywords.toString() !== keywords.toString()\r\n || previousSearchOptions.current.option !== resultOption;\r\n\r\n if (shouldGetSuggestion) {\r\n if (\r\n (_.isEmpty(businessName) && _.isEmpty(keywords))\r\n || resultOption === ContentSuggestionOption.None\r\n ) {\r\n setSuggestions({\r\n imageSuggestions: null,\r\n textSuggestion: null,\r\n });\r\n\r\n previousSearchOptions.current = {\r\n businessName,\r\n keywords,\r\n option: resultOption,\r\n };\r\n } else {\r\n debouncedGetContentSuggestions();\r\n }\r\n }\r\n\r\n return () => debouncedGetContentSuggestions.cancel();\r\n }, [\r\n businessName,\r\n debouncedGetContentSuggestions,\r\n keywords,\r\n resultOption,\r\n ]);\r\n\r\n return {\r\n imageSuggestions,\r\n textSuggestion,\r\n error,\r\n isLoading,\r\n getContentSuggestions,\r\n };\r\n}\r\n","import _ from 'underscore';\r\nimport { wrappedOdata as odata } from './odata-wrapper';\r\n\r\nexport const BookingService = () => {\r\n const service = {};\r\n const baseUrl = `${window.location.protocol}//${window.location.host}`;\r\n\r\n const oDataOption = {\r\n contentType: 'application/json',\r\n };\r\n\r\n service.createBooking = ({\r\n smartPageId,\r\n customerEmailAddress,\r\n manageAppointmentLink,\r\n bookingDetails,\r\n businessName,\r\n customerTimeZoneOffset,\r\n userLocale,\r\n }) => {\r\n const body = {\r\n SmartPageId: smartPageId,\r\n SPEmailAddress: customerEmailAddress,\r\n ManageAppointmentLink: manageAppointmentLink,\r\n BookingDetails: bookingDetails,\r\n BusinessName: businessName,\r\n SPTimeZoneOffset: customerTimeZoneOffset,\r\n UserLocale: userLocale,\r\n };\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: `${baseUrl}/newbooking`,\r\n data: body,\r\n dataType: 'text',\r\n }\r\n );\r\n\r\n return odata.post(options);\r\n };\r\n\r\n service.getExistingBookings = ({\r\n smartPageId,\r\n }) => {\r\n const body = {\r\n SmartPageId: smartPageId,\r\n };\r\n const options = _.extend(\r\n {},\r\n oDataOption,\r\n {\r\n url: `${baseUrl}/existingbookings`,\r\n data: body,\r\n }\r\n );\r\n\r\n return odata.post(options);\r\n };\r\n\r\n return service;\r\n};\r\n","import { useCallback, useMemo, useState } from 'react';\r\n\r\nimport { BookingService } from '../booking-service';\r\n\r\nconst errorCodeMapping = {\r\n SlotNotAvailable: _TL_('Booking Time is already reserved, try another time slot.'),\r\n};\r\n\r\nexport const useBookingService = ({\r\n logger,\r\n}) => {\r\n const bookingService = useMemo(() => BookingService(), []);\r\n\r\n const [isCreatingBooking, setIsCreatingBooking] = useState(false);\r\n const [isGetExistingBookings, setIsGetExistingBookings] = useState(false);\r\n\r\n const [getBookingError, setGetBookingError] = useState('');\r\n const [createBookingError, setCreateBookingError] = useState('');\r\n\r\n const [existingBookings, setExistingBookings] = useState([]);\r\n\r\n // Action: create a booking\r\n const createBooking = useCallback((props) => {\r\n setIsCreatingBooking(true);\r\n\r\n return bookingService.createBooking(props).then(res => res)\r\n .catch((error) => {\r\n const errorCode = error && error.body && error.body.errorCode;\r\n const errorMessage = errorCodeMapping[errorCode] || _TL_('Request failed, please try later.');\r\n setCreateBookingError(errorMessage);\r\n\r\n logger.logError('Create booking failed', errorMessage);\r\n throw errorMessage;\r\n }).finally(() => {\r\n setIsCreatingBooking(false);\r\n });\r\n }, [bookingService, logger]);\r\n\r\n // Action: get existing booking list\r\n const getExistingBooking = useCallback((props) => {\r\n setIsGetExistingBookings(true);\r\n\r\n return bookingService.getExistingBookings(props).then((res) => {\r\n setExistingBookings(res);\r\n\r\n return res;\r\n }).catch((error) => {\r\n const errorCode = error && error.body && error.body.errorCode;\r\n const errorMessage = errorCodeMapping[errorCode] || _TL_('Request failed, please try later.');\r\n setGetBookingError(errorMessage);\r\n\r\n logger.logError('Get existing bookings failed', errorMessage);\r\n throw errorMessage;\r\n }).finally(() => {\r\n setIsGetExistingBookings(false);\r\n });\r\n }, [bookingService, logger]);\r\n\r\n return {\r\n // create\r\n createBooking,\r\n isCreatingBooking,\r\n createBookingError,\r\n // get\r\n existingBookings,\r\n getExistingBooking,\r\n isGetExistingBookings,\r\n getBookingError,\r\n };\r\n};\r\n","const getEventsStyles = disableEvents => ({\r\n pointerEvents: disableEvents ? 'none' : 'auto',\r\n});\r\n\r\nexport const getSmartPageDefaultSiteTheme = (palette, disableEvents = false, isMobile = false) => {\r\n const eventsStyles = getEventsStyles(disableEvents);\r\n const defaultPageMarginLeft = isMobile ? 0 : 32;\r\n const defaultPageMarginRight = isMobile ? 0 : 32;\r\n\r\n return {\r\n components: {\r\n sectionTitle: {\r\n fontSize: 28,\r\n lineHeight: '40px',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n margin: '0 0 28px 0',\r\n color: palette.primaryText,\r\n },\r\n section: {\r\n padding: '24px 0',\r\n marginLeft: defaultPageMarginLeft,\r\n marginRight: defaultPageMarginRight,\r\n },\r\n navLink: {\r\n color: palette.primaryText,\r\n ...eventsStyles,\r\n },\r\n defaultButton: {\r\n color: palette.secondaryText,\r\n background: 'transparent',\r\n border: `1px solid ${palette.secondaryText}`,\r\n width: '100%',\r\n height: 40,\r\n boxSizing: 'border-box',\r\n padding: '8px 16px',\r\n ...eventsStyles,\r\n '&:hover, &:focus': {\r\n color: palette.secondaryText,\r\n },\r\n },\r\n primaryButton: {\r\n color: palette.buttonText,\r\n background: palette.buttonBackground,\r\n border: `1px solid ${palette.buttonBackground}`,\r\n width: '100%',\r\n height: 40,\r\n boxSizing: 'border-box',\r\n padding: '8px 16px',\r\n ...eventsStyles,\r\n '&:hover, &:focus': {\r\n color: palette.buttonText,\r\n },\r\n },\r\n fixedMobileFooter: {\r\n height: 80,\r\n },\r\n link: {\r\n ...eventsStyles,\r\n },\r\n truncate: {\r\n width: '100%',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n },\r\n core: {\r\n palette,\r\n effects: {\r\n elevation: `0px -2px 10px 2px ${palette.elevation}`,\r\n },\r\n },\r\n };\r\n};\r\n"],"sourceRoot":""}