{"version":3,"sources":["../../../node_modules/@bingads-webui-campaign-react/smart-page-site-theme/src/default-theme.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/components/facebook-import-dialog-step-fb-connect.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/components/facebook-import-dialog-step-fb-import.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/util/facebook-import-util.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/facebook-import-dialog-internal.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/util/facebook-page-info-filter-config.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/util/facebook-import-data-helper.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-facebook-import-dialog/src/util/facebook-error-helper.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/odata-options.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/odata-wrapper.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/service-utils.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/smart-page-service.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/image-service.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/bulkify.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/email-service.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/error-mapping.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/hooks/use-context-locale.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/hooks/use-content-suggestions.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/booking-service.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data-service/src/hooks/use-booking-services.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-error-boundary/src/default-error-view.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-error-boundary/src/with-error-boundary-options.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-error-boundary/src/with-error-view.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-util/src/get-environment.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-util/src/get-facebook-app-id.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-util/src/get-smart-page-url.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-util/src/get-landing-page-url.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-util/src/get-device.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-template/src/consts.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-template/src/template-service.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-template/src/site-templates/default-template.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-template/src/helper/apply-template-suggestion.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data/src/smart-page-helpers.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-data/src/use-smart-page-service-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/server-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/client-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/instrumentation-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/instrumentation-schema.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/global-error-view.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/instrumentation.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/site-config-reducer.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/site-config-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/editor-status-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/editor-status-reducer.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/country-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/preference.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/i18n-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/integration-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/hooks/use-pilot.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/hooks/use-server-context-property.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/hooks/use-user-account-customer.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/hooks/use-mobile-content.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/preview-page-context.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-context/src/appinsights-context.js","../../../node_modules/@bingads-webui-campaign-react/unified-ad-preview-library-util/src/constants.js","../../../node_modules/@bingads-webui-campaign-react/unified-ad-preview-library-util/src/utils.js","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/attorney.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/consultant.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/car_dealer.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/design_agency.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/estate_appraiser.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/family_doctor.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-images/food.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/attorney.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/consultant.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/car_dealer.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/design_agency.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/estate_appraiser.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/family_doctor.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/mobile-local-images/food.jpg","../../../node_modules/@bingads-webui-campaign-react/static-local-image-selector/src/local-image-loader.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/loader/runtime-smart-components-loader.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/util/build-tree.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/layout/fluent-grid-layout-components.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/layout/node-factory.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/layout/node-render.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/dynamic-component-render.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/site-builder-internal.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/layout/fluent-grid-layout.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/styles.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-site-builder/src/site-builder-wrapper.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-runtime-component/src/smart-page-runtime.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-runtime-component/src/use-wcp-consent.js","../../../node_modules/@bingads-webui-campaign-react/smart-page-runtime-component/src/tracking-scripts.js"],"names":["getSmartPageDefaultSiteTheme","palette","disableEvents","arguments","length","undefined","isMobile","eventsStyles","pointerEvents","getEventsStyles","defaultPageMarginLeft","defaultPageMarginRight","components","sectionTitle","fontSize","lineHeight","display","justifyContent","margin","color","primaryText","section","padding","marginLeft","marginRight","navLink","_objectSpread","defaultButton","secondaryText","background","border","concat","width","height","boxSizing","&:hover, &:focus","primaryButton","buttonText","buttonBackground","fixedMobileFooter","link","truncate","whiteSpace","overflow","textOverflow","core","effects","elevation","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","textAlign","marginBottom","boxShadow","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","calloutProps","directionalHintFixed","fbReconnect","fbReconnectLink","fbImportDesc","defaultProps","noop","FacebookImportDialogStepFBImport","cursor","fbSdkUrl","pollForFacebookJsSdk","maxAttempts","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","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","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","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","getCommonOdataOptions","serverContext","currentCustomer","CurrentCustomer","currentAccount","CurrentAccount","host","ServicesEndpoints","CampaignAPI","path","CampaignAPIPath","token","Token","_serverContext$Urls","Urls","_serverContext$Urls2$","SignOutUrl","cid","Id","aid","signOutOnTokenExpire","signOutUrl","location","addOptionsToODataMethod","methodName","_len","args","Array","_key","_http$signature","http","signature","_http$signature2","url","cb","odata","defaults","xhr","textStatus","errorThrown","wrapOptionsOfODataMethods","wrappedOdata","get","post","put","patch","delete","SmartPageAction","SmartPageStatus","Published","Offline","Deleted","Draft","PendingPublish","UnpublishedChanges","siteConfigToModel","action","attrs","getAttributesFromSiteConfig","snapshotAttrs","getAttributesFromSnapshot","snapshots","_getDataSourceByKeys","getDataSourceByKeys","DATA_SOURCE_KEY_MAPPING","BusinessName","BusinessDescription","BusinessCategories","_getDataSourceByKeys2","businessDescription","businessCategories","subDomain","generateGuid","descriptionFromCategory","join","description","uetTagId","isMTagMigrated","migrationContext","@odata.type","Name","Description","SubDomain","SiteSuffix","UetTagId","IsMTagMigrated","Attributes","Snapshots","Status","ImageIds","uniq","pluck","SmartPageDataContext","Action","WebsiteSourceData","createWebsiteSourceData","WSDMigrationContext","SmartPageService","service","_getCommonOdataOption","initOption","isEqual","baseUrl","defaultQuery","$top","$skip","$count","oDataOption","contentType","oDataToken","getUrlWithId","pollCompletion","retry","getSmartPageUrlSuffix","dataType","setTimeout","getAll","customQuery","query","extend","value","modelToSiteConfig","create","update","publish","pollStatus","fbPageId","fbAuthInfo","scenario","fbPageAuthorizationData","Scenario","Content","facebookPageToSiteConfig","UserToken","chain","sortBy","pageInfo","isSubdomainAvailable","subdomain","getBusinessCategorySuggestions","_ref2","searchQueries","_ref2$locale","locale","associateEntities","entityIds","associatedEntityStatus","EntityIds","AssociationType","AssociatedEntityStatus","disassociateEntities","getAssociationsByEntityIds","getSmartPageMetrics","startDate","endDate","first","campaignOption","accountOption","campaignBaseUrl","accountBaseUrl","campaignBaseUrlWithId","attachCampaignParams","params","paramStr","Object","entries","_ref3","_ref4","isArray","includes","getCampaign","expand","patchCampaign","getCampaigns","getBudgetSuggestion","getSocialProfileIds","filter","type","profile","getActivitesCount","_ref5","activityTypes","lastCheckPoint","profileIds","getAdsPerformanceMetrics","getCategorySuggestions","getContentSuggestions","keywords","resultOption","imageSource","entity","getTemplateSuggestions","categories","getExistingBookings","emailAddress","EmailAddress","name","phoneNumber","PhoneNumber","sequence","Sequence","time","Time","timeInMinutes","TimeInMinutes","message","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","CustomDomain","IsAutoUpdateDNSRecords","M365AuthorizationData","getM365Domains","domainName","DomainName","domainType","DomainType","dnsProviderName","DnsProviderName","saveCampaignToGoLiveLater","campaignId","SignupCampaignIds","ImageService","odataService","ImageODataService","getImage","IdString","ImageUrl","Url","Width","Height","ids","upload","imageData","base64Index","indexOf","body","Data","substr","Type","postImage","result","imageUrls","csvRows","imageUrl","serializecsvRow","flatten","serializeCSV","CsvRows","imageInfo","csvData","headers","slice","errorColIndex","imageIdColIndex","uploadUrlColIndex","col","index","row","push","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","useContextLocale","getContextLocale","DEBOUNCE_WAIT_IN_MS","ContentSuggestionOption","None","ImageOnly","TextOnly","Both","ContentSuggestionSource","TemplateAdsOnly","M365","useContentSuggestions","initWithLoading","imageSuggestions","textSuggestion","suggestions","setSuggestions","setError","setIsLoading","previousSearchOptions","useRef","isSmartPageImageTextSuggestionEnabled","useIsSmartPageImageTextSuggestionEnabled","isSmartPageM365StockImageEnabled","useIsSmartPageM365StockImageEnabled","isSmartPageM365StockImageGalleryEnabled","useIsSmartPageM365StockImageGalleryEnabled","useIsM365Premium","cbBusinessName","cbKeywords","cbResultOption","finalBusinessName","finalKeywords","finalResultOption","current","option","newTextSuggestion","Text","newImageSuggestions","Images","logError","debouncedGetContentSuggestions","useMemo","toString","cancel","errorCodeMapping","SlotNotAvailable","useBookingService","bookingService","createBooking","SmartPageId","BookingDetails","bookingDetails","BookingService","isCreatingBooking","setIsCreatingBooking","isGetExistingBookings","setIsGetExistingBookings","getBookingError","setGetBookingError","createBookingError","setCreateBookingError","existingBookings","setExistingBookings","props","errorCode","errorMessage","getExistingBooking","DefaultErrorView","errorViewMode","I18nContext","errorViewProps","GlobalErrorView","getErrorView","getErrorOptions","info","_ref$componentStack","componentStack","isString","isObject","errorStack","stack","trim","createErrorMessage","renderErrorView","loop","withErrorView","WrappedComponent","Component","memo","assign","errorOptions","withErrorOptions","_objectWithoutProperties","_excluded","GlobalErrorBoundary","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","getSmartPageUrl","siteSuffix","getCustomDomain","domainDetail","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","getSmartPageEnviroment","landingPageDomain","appendedQueries","queryString","skipNull","skipEmptyString","formattedQueries","reAndroid","reIOS","ua","navigator","userAgent","vendor","opera","isAndroid","test","isIOS","SmartPageTemplate","requiredComponentList","componentsConfig","required","TemplateComponentListMapping","_toConsumableArray","businessHours","callToAction","professionalService","review","summary","config","TemplateService","defaultSiteTemplate","siteStructureTemplate","dataSource","pages","generateId","theme","themeId","websiteSourceData","_siteStructureTemplat","apply","generateSectionWithComponent","componentType","sectionIndex","order","getDefaultSiteTemplate","getTemplates","defaultTemplate","getConfig","createContext","CurrentUser","CurrentLocale","templateService","customerContext","accountContext","campaignContext","tagContext","navigationContext","Permissions","CCUIPilots","DynamicPermissions","Omniture","PageTrackingId","DataServiceContextProvider","overrideProps","isM365PremiumUser","useIsM365PremiumUser","fbHostSystemScenario","DMC","permissions","IsM365PremiumUser","dataServiceContext","Provider","children","extendProps","defaultClientContext","responsiveMode","ResponsiveMode","LargeDesktop","isRuntime","ClientContext","useClientContext","logMetrics","instrumentation","useInstrumentationServiceContext","defaultSchema","activity","appVersion","errorMappers","odataErrorMapper","OdataErrorMapper","odataErrorCodes","campaignApiErrorMapper","CampaignApiErrorMapper","campaignApiErrorCodes","urlErrorMapper","UrlErrorMapper","invalidDomains","formattedUserErrorCodes","toUpperCase","formatNameValue","onLine","getInstrumentation","isProdRuntime","userContext","getInstrumentationInstance","pageTrackingId","isInDevelopmentMode","isTestEnvironment","applicationName","systemName","subSystemName","objectsToStub","getInstrumentationService","_ref2$scenario","addScenario","InstrumentationSchema","defaultScenario","stubOptions","lcid","Locale","eventHandler","AjaxEventHandler","shouldAddHeaders","ajaxContext","isInternalUrl","ajaxStub","AjaxStub","errorStub","ErrorStub","stub","errorResponseJson","isUserError","errorCodesInResponse","code","contains","isUserErrorCodes","isIgnorable","readyState","trace","siteConfigReducer","state","newState","_action$payload","payload","_action$payload2","_action$payload3","siteContextInfo","orderedComponentsInPages","forceUpdate","associations","cloneDeep","_action$payload4","page","pageIndex","newPage","newPages","getUpdatedPages","_action$payload5","updatedConfig","getComponentByType","coverImageConfig","COMPONENT_TYPE_MAPPING","CoverImage","_action$payload6","_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","EditorStatusContext","PreviewMode","Desktop","Mobile","useEditorStatusContext","useIsComponentSelected","context","editingComponentType","editorStatusLoadingWrapperForPromise","dispatch","CountryContext","useCountryContext","PreferenceService","setAtUserLevel","useI18n","IntegrationContext","INTEGRATE_ENV_TYPE","STANDALONE","useIntegrationContext","useIsPmaxLiteIntegration","PMAX_LITE_WIZARD","usePilotsValue","getPilotValue","useIsBusinessHourSectionEnabled","PILOTS","isSmartPageBusinessHourSectionEnabled","useIsSmartPageVideoSectionEnabled","isSmartPageVideoSectionEnabled","useIsSmartPageMapEnabled","isSmartPageMapEnabled","useIsSmartPageCustomizedUpdateEnabled","isSmartPageCustomizedUpdateEnabled","useIsSmartPageM365BannerEnabled","isSmartPageM365BannerEnabled","useIsSmartPageDarkModeEnabled","isSmartPageDarkModeEnabled","useIsSmartPageBookAppointmentEnabled","isSmartPageBookAppointmentEnabled","useIsSmartPageTemplateSuggestionEnabled","isSmartPageTemplateSuggestionEnabled","useIsSmartPageImprovedReviewsEnabled","isSmartPageImprovedReviewsEnabled","useIsSmartPagePrivacyPolicyEnabled","isSmartPagePrivacyPolicyEnabled","useIsSmartPageRuntimePageWcpConsentEnabled","isSmartPageRuntimePageWcpConsentEnabled","isSmartPageM365PremiumFeatureEnabled","useAllPilots","isM365Premium","allPilots","pilots","forEach","useIsDraftOrPendingAccount","useUserAccountCustomer","postponeRead","_ref$componentName","componentName","accountLevelVariables","useAccountLevelVariables","customerLevelVariables","useCustomerLevelVariables","postponeReadConfig","usePostponeReadVariables","_useUser","useUser","_useUser2","user","_useUser2$","updateUserOR","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","updateElementsLoadingStatus","usePreviewPageContext","AppInsightsContext","UAPImageExpansionType","WhitePadding","Outpainting","SingleColorPadding","UAPCroppingType","ManualCrop","CenterCrop","SmartCrop","Unknown","getExpandedImageUrl","imageExpansionType","paddingColor","expandedImageWidth","expandedImageHeight","hasQuery","srcWithQuery","queryParams","idx","setROIInfo","roiInfo","ROIInfoObj","ImageExpansionType","ThumbnailWidth","PaddingImageWidth","ThumbnailHeight","PaddingImageHeight","PaddingColor","expandedImageCropSettings","ImageCropSetting","aspectRatio","cs","cropSetting","AspectRatio","CropSetting","SourceHeight","sourceHeight","SourceWidth","sourceWidth","SourceX","sourceX","SourceY","sourceY","croppingType","originalImageCropSettings","OriginalImageCropSetting","CroppingType","expandedImageUrl","attorney","__webpack_require__","p","consultant","car_dealer","design_agency","estate_appraiser","family_doctor","food","mobile_local_images_attorney","mobile_local_images_consultant","mobile_local_images_car_dealer","mobile_local_images_design_agency","mobile_local_images_estate_appraiser","mobile_local_images_family_doctor","mobile_local_images_food","LocalImageNames","localImageSrcs","carDealer","designAgency","estateAppraiser","familyDoctor","mobile_attorney","mobileAttorney","mobile_consultant","mobileConsultant","mobile_car_dealer","mobileCarDealer","mobile_design_agency","mobileDesignAgency","mobile_estate_appraiser","mobileEstateAppraiser","mobile_family_doctor","mobileFamilyDoctor","mobile_food","mobileFood","DefaultLocalImageName","loadLocalImage","imageName","split","prefix","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","dir","group","_ref3$palette","flexDirection","primaryBackground","& .component-title","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","tree","allComponents","removeDisabledComponents","root","idMapping","reduce","component","parentId","parentSection","buildNestedTree","componentConfig","newComponentsInPage","getStyles","container","minWidth","maxWidth","largeDesktopContainer","alignContent","SiteBuilder","_ref2$","_ref2$2","editingComponentId","navigateToEditingComponent","useDefaultStyles","getEnabledComponentsConfig","SmartPageRuntime","siteInfo","isDarkModeEnabled","_useReducer","useReducer","_useReducer2","componentRef","_useResponsiveMode","useResponsiveMode","clientContext","lang","documentElement","language","insertScripts","consent","Analytics","Advertising","inlineCode","WcpConsent","_siteConsent","siteConsent","getConsent","themes","light","useWcpConsent","getCurrentTheme","themeConfig","getThemeConfigFromWSD","outerBackground","ref","ThemeProvider","SmartBanner"],"mappings":"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","file":"static/js/application.initial~688e87f9.cb2bf5e9.chunk.js","sourcesContent":["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","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 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","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","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","export const UAPImageExpansionType = {\r\n None: 'None',\r\n WhitePadding: 'WhitePadding',\r\n // Blur: 'Blur',\r\n Outpainting: 'Outpainting',\r\n SingleColorPadding: 'SingleColorPadding',\r\n};\r\n\r\nexport const UAPCroppingType = {\r\n ManualCrop: 'ManualCrop', // 1\r\n CenterCrop: 'CenterCrop', // 2\r\n SmartCrop: 'SmartCrop', // 3\r\n Unknown: 'Unknown', // 4\r\n};\r\n","import _ from 'underscore';\r\nimport { UAPImageExpansionType, UAPCroppingType } from './constants';\r\n\r\nexport const getExpandedImageUrl = (imageExpansionType, src, paddingColor, expandedImageWidth, expandedImageHeight) => {\r\n if (!imageExpansionType || imageExpansionType === UAPImageExpansionType.None) {\r\n // no expanded image\r\n return null;\r\n }\r\n\r\n const hasQuery = !_.isEmpty(src) && src.indexOf('?') > 0;\r\n const srcWithQuery = hasQuery ? src : `${src}?`;\r\n let queryParams = '';\r\n if (imageExpansionType === UAPImageExpansionType.Outpainting) {\r\n queryParams = hasQuery ? '&ustim=1' : 'ustim=1';\r\n } else if (imageExpansionType === UAPImageExpansionType.WhitePadding\r\n || imageExpansionType === UAPImageExpansionType.SingleColorPadding\r\n ) {\r\n queryParams = `${hasQuery ? '&' : ''}w=${expandedImageWidth}&h=${expandedImageHeight}`;\r\n if (paddingColor) {\r\n const idx = paddingColor.indexOf('#');\r\n queryParams += `&pcl=${paddingColor.slice(idx + 1)}`;\r\n }\r\n }\r\n\r\n return `${srcWithQuery}${queryParams}`;\r\n};\r\n\r\nexport const setROIInfo = (roiInfo, imageUrl) => {\r\n if (!roiInfo || !imageUrl) {\r\n return {};\r\n }\r\n try {\r\n const ROIInfoObj = JSON.parse(roiInfo);\r\n const imageExpansionType = ROIInfoObj.ImageExpansionType;\r\n const expandedImageWidth = imageExpansionType === UAPImageExpansionType.Outpainting ? ROIInfoObj.ThumbnailWidth : ROIInfoObj.PaddingImageWidth;\r\n const expandedImageHeight = imageExpansionType === UAPImageExpansionType.Outpainting ? ROIInfoObj.ThumbnailHeight : ROIInfoObj.PaddingImageHeight;\r\n const paddingColor = ROIInfoObj.PaddingColor;\r\n const expandedImageCropSettings = ROIInfoObj.ImageCropSetting ? _.map(ROIInfoObj.ImageCropSetting, ({ aspectRatio, cropSetting: cs }) => ({\r\n AspectRatio: aspectRatio,\r\n CropSetting: {\r\n SourceHeight: cs.sourceHeight, SourceWidth: cs.sourceWidth, SourceX: cs.sourceX, SourceY: cs.sourceY,\r\n },\r\n })) : null;\r\n const croppingType = imageExpansionType === UAPImageExpansionType.Outpainting ? UAPCroppingType.CenterCrop : UAPCroppingType.SmartCrop;\r\n const originalImageCropSettings = ROIInfoObj.OriginalImageCropSetting ? _.map(ROIInfoObj.OriginalImageCropSetting, ({ aspectRatio, cropSetting: cs }) => ({\r\n AspectRatio: aspectRatio,\r\n CropSetting: {\r\n SourceHeight: cs.sourceHeight, SourceWidth: cs.sourceWidth, SourceX: cs.sourceX, SourceY: cs.sourceY, CroppingType: croppingType,\r\n },\r\n })) : null;\r\n const expandedImageUrl = getExpandedImageUrl(imageExpansionType, imageUrl, paddingColor, expandedImageWidth, expandedImageHeight);\r\n\r\n return {\r\n expandedImageWidth,\r\n expandedImageHeight,\r\n expandedImageCropSettings,\r\n originalImageCropSettings,\r\n expandedImageUrl,\r\n imageExpansionType,\r\n paddingColor,\r\n };\r\n } catch (e) {\r\n return {};\r\n }\r\n};\r\n","export default __webpack_public_path__ + \"static/media/attorney.32d1290f.jpg\";","export default __webpack_public_path__ + \"static/media/consultant.5f77d4bd.jpg\";","export default __webpack_public_path__ + \"static/media/car_dealer.a1e5f85b.jpg\";","export default __webpack_public_path__ + \"static/media/design_agency.21a8f9b6.jpg\";","export default __webpack_public_path__ + \"static/media/estate_appraiser.6ac3be47.jpg\";","export default __webpack_public_path__ + \"static/media/family_doctor.3e8c67c9.jpg\";","export default __webpack_public_path__ + \"static/media/food.4577a22c.jpg\";","export default __webpack_public_path__ + \"static/media/attorney.44b352bc.jpg\";","export default __webpack_public_path__ + \"static/media/consultant.4365afd1.jpg\";","export default __webpack_public_path__ + \"static/media/car_dealer.0d46c32c.jpg\";","export default __webpack_public_path__ + \"static/media/design_agency.f547f9d9.jpg\";","export default __webpack_public_path__ + \"static/media/estate_appraiser.d60f5b3e.jpg\";","export default __webpack_public_path__ + \"static/media/family_doctor.b674f904.jpg\";","export default __webpack_public_path__ + \"static/media/food.6b8d4ff8.jpg\";","import { Promise } from 'bluebird';\r\n\r\nimport attorney from './local-images/attorney.jpg';\r\nimport consultant from './local-images/consultant.jpg';\r\nimport carDealer from './local-images/car_dealer.jpg';\r\nimport designAgency from './local-images/design_agency.jpg';\r\nimport estateAppraiser from './local-images/estate_appraiser.jpg';\r\nimport familyDoctor from './local-images/family_doctor.jpg';\r\nimport food from './local-images/food.jpg';\r\n\r\nimport mobileAttorney from './mobile-local-images/attorney.jpg';\r\nimport mobileConsultant from './mobile-local-images/consultant.jpg';\r\nimport mobileCarDealer from './mobile-local-images/car_dealer.jpg';\r\nimport mobileDesignAgency from './mobile-local-images/design_agency.jpg';\r\nimport mobileEstateAppraiser from './mobile-local-images/estate_appraiser.jpg';\r\nimport mobileFamilyDoctor from './mobile-local-images/family_doctor.jpg';\r\nimport mobileFood from './mobile-local-images/food.jpg';\r\n\r\nexport const LocalImageNames = [\r\n 'consultant.jpg',\r\n 'attorney.jpg',\r\n 'car_dealer.jpg',\r\n 'design_agency.jpg',\r\n 'estate_appraiser.jpg',\r\n 'family_doctor.jpg',\r\n 'food.jpg',\r\n];\r\n\r\nconst localImageSrcs = {\r\n attorney,\r\n consultant,\r\n car_dealer: carDealer,\r\n design_agency: designAgency,\r\n estate_appraiser: estateAppraiser,\r\n family_doctor: familyDoctor,\r\n food,\r\n\r\n mobile_attorney: mobileAttorney,\r\n mobile_consultant: mobileConsultant,\r\n mobile_car_dealer: mobileCarDealer,\r\n mobile_design_agency: mobileDesignAgency,\r\n mobile_estate_appraiser: mobileEstateAppraiser,\r\n mobile_family_doctor: mobileFamilyDoctor,\r\n mobile_food: mobileFood,\r\n};\r\n\r\nexport const DefaultLocalImageName = LocalImageNames[0];\r\n\r\nexport const loadLocalImage = (imageName, isMobile = false) => {\r\n const name = imageName.split('.')[0];\r\n\r\n const prefix = isMobile ? 'mobile_' : '';\r\n return Promise.resolve(localImageSrcs[`${prefix}${name}`]);\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"],"sourceRoot":""}