{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///D:/a/_work/1/s/libs/core-contracts/src/appError-contracts/Severity.ts","webpack:///D:/a/_work/1/s/libs/sapphire-feed-bridge/src/SapphireCore.ts","webpack:///D:/a/_work/1/s/node_modules/@msnews/ssr-server/dist/interop/RequestData.js","webpack:///D:/a/_work/1/s/libs/isomorphic-util/src/SSRInteropContractHelpers.ts","webpack:///D:/a/_work/1/s/libs/isomorphic-util/src/SSRInteropContract.ts","webpack:///D:/a/_work/1/s/libs/core/src/request/RequestContext.ts","webpack:///D:/a/_work/1/s/libs/oneservice-content/src/OneServiceContentHelpers.ts","webpack:///D:/a/_work/1/s/libs/core/src/telemetry-base/TelemetryBase.ts","webpack:///D:/a/_work/1/s/libs/url-util/src/windows.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/AppError/AppErrors.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/logging/LiteLogger.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/logging/Util.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/HostPage.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux-contracts/src/constants/ConnectorConstants.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/server-cache/ServerCacheMock.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/GetDataConnector.ts","webpack:///D:/a/_work/1/s/libs/page-lifecycle-helpers/src/PageVisibilityActionHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/utils/UrlHelper.ts","webpack:///D:/a/_work/1/s/libs/page-lifecycle-helpers/src/PageInvalidationReasons.ts","webpack:///./src/integration/PrimeTelemetry.ts","webpack:///./src/integration/PrimeTrackExtensionComplete.ts","webpack:///./src/integration/PrimeElementTrackingDecorator.ts","webpack:///./src/integration/PrimeTrack.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/AppTypes.ts","webpack:///D:/a/_work/1/s/libs/telemetry-contracts/src/telemetry-contracts/TelemetryEnums.ts","webpack:///D:/a/_work/1/s/libs/sapphire-feed-bridge/src/SapphireUtilities.ts","webpack:///D:/a/_work/1/s/libs/auth/src/GetSignInState.ts","webpack:///D:/a/_work/1/s/libs/auth/src/AadAuthHelper.ts","webpack:///D:/a/_work/1/s/libs/sapphire-feed-bridge/src/SapphireBridge.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/utilities/BreakpointManager.ts","webpack:///D:/a/_work/1/s/libs/auth/src/AuthConstants.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/ActionHandler.ts","webpack:///D:/a/_work/1/s/libs/render-cache/src/Constants.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/SingletonResetManager.ts","webpack:///D:/a/_work/1/s/libs/telemetry-core/src/tracking/TelemetryObject.ts","webpack:///./src/integration/MediatorEventNames.ts","webpack:///./src/integration/PrimeMediator.ts","webpack:///D:/a/_work/1/s/libs/config-data-types/src/PlatformType.ts","webpack:///D:/a/_work/1/s/libs/wpo-common/src/WpoHelper.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/AppEnvironment.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/Flights.ts","webpack:///D:/a/_work/1/s/libs/experimentation-helpers/src/GetPeregrineFlights.ts","webpack:///D:/a/_work/1/s/libs/core-contracts/src/resolver-contracts/ConfigFetchError.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/constants/PerfMarkerConstants.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/diagnostic-utils/PerfMarkerHelper.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/utilities/Constants.ts","webpack:///D:/a/_work/1/s/libs/mock-config/src/MockManager.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/utilities/Utilities.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/BlobFetcher.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientConfigIndexService.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientConfigService.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientManifestService.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientConfigMerger.ts","webpack:///D:/a/_work/1/s/libs/config-data-types/src/BrowserVersionOperator.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/TargetScopeMatcher.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientSingleConfigResolver.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/client-fallback-resolver/ClientResolver.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/indexedDb/IndexedDb.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/AppErrorHelper.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/ConfigCache.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/ConfigService.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/resolver/client-resolver/ConfigResolver.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/getRootConfigRef.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/Resolver.ts","webpack:///./src/integration/SubnavTabId.ts","webpack:///D:/a/_work/1/s/libs/oneservice/src/UrlUtility.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/UrlUtility.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/SocialData.actions.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.actions.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.inspector.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/AppErrorLogger.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.connector.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.reducer.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/enums.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/SocialTelemetryUtils.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/Social.bridge.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/themeHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/AccessibilityHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/mouseHandlers.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/ResponsiveClassManager.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/contentIdKey.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/urlHelper.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/getFlight.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/isValidURL.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/icons.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/styleHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/emojiIcons.tsx","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/social-bar-panel/SocialBarPanel.telemetry.ts","webpack:///D:/a/_work/1/s/components/social-popover/src/SocialPopover.tsx","webpack:///D:/a/_work/1/s/components/social-popover/src/SocialPopover.styles.ts","webpack:///D:/a/_work/1/s/components/social-popover/src/index.ts","webpack:///D:/a/_work/1/s/components/social-mini-reaction-breakdown/src/SocialMiniReactionBreakdown.tsx","webpack:///D:/a/_work/1/s/components/social-mini-reaction-breakdown/src/SocialMiniReactionBreakdown.styles.ts","webpack:///D:/a/_work/1/s/components/social-mini-reaction-breakdown/src/index.ts","webpack:///D:/a/_work/1/s/components/social-most-reactions/src/SocialMostReactions.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/commonJssConstants.ts","webpack:///D:/a/_work/1/s/components/social-most-reactions/src/index.ts","webpack:///D:/a/_work/1/s/components/social-most-reactions/src/SocialMostReactions.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/reaction-menu/ReactionMenu.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/reaction-menu/ReactionMenu.tsx","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/social-bar-panel/SocialBarPanel.tsx","webpack:///D:/a/_work/1/s/experiences/social-bar/src/content-social-bar/ContentSocialBar.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/content-social-bar/ContentSocialBar.tsx","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.errors.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/Common.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/social-bar-panel/SocialBarPanel.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/index.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/SocialBar.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/common/reaction-menu/ReactionMenu.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/content-social-bar/ContentSocialBar.styles.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/themes/superapp/CommonSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-bar/src/content-social-bar/themes/superapp/ContentSocialBarSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.actions.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.inspector.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.connector.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.reducer.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/Comment.telemetry.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/images.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/avatarFallback.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/sort-box/SortBox.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/sort-box/SortBox.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/openProfilePage.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/openEditProfilePage.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-box/CommentBox.telemetry.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/openGuidelinePage.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/disabled-message/DisabledMessage.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/profile-educator/ProfileEducator.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-box/CommentBox.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/delete-menu/DeleteMenu.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/delete-menu/DeleteMenu.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-panel/ReactionPanel.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-menu/ReactionMenu.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-menu/ReactionMenu.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-panel/ReactionPanel.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/report-menu/ReportMenu.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/report-menu/ReportMenu.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/reply-list/ReplyList.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/follow-button/FollowButton.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/follow-button/FollowButton.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/user-card/UserCard.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/user-card/UserCard.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-item/CommentItem.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-item/CommentItem.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/getAgoText.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-list/CommentList.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-list/CommentList.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/typing-users/TypingUsers.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/content-panel/ContentPanel.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/content-panel/ContentPanel.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/Comment.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/utils/videoEventListener.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.errors.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.tsx","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/disabled-message/DisabledMessage.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/follow-button/FollowButton.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/profile-educator/ProfileEducator.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/index.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/SocialComment.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/Comment.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/content-panel/ContentPanel.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-box/CommentBox.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-list/CommentList.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/comment-item/CommentItem.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/reply-list/ReplyList.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/user-card/UserCard.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-menu/ReactionMenu.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/reaction-panel/ReactionPanel.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/report-menu/ReportMenu.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/sort-box/SortBox.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/delete-menu/DeleteMenu.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/typing-users/TypingUsers.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/comment/themes/superapp/CommentSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/follow-button/themes/superapp/FollowButtonSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social-comment/src/common/report-menu/themes/superapp/ReportMenuSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.actions.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.inspector.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.connector.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.reducer.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/fileHelpers.ts","webpack:///D:/a/_work/1/s/experiences/social/src/copyright-form/CopyrightForm.tsx","webpack:///D:/a/_work/1/s/libs/subscription-sdk-wrapper/src/API.ts","webpack:///D:/a/_work/1/s/experiences/social/src/utils/subscriptionHelpers.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/gradient-overlay/GradientOverlay.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/gradient-overlay/GradientOverlay.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/socialMedia.ts","webpack:///D:/a/_work/1/s/experiences/social/src/multi-login-page/MultiLoginPage.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/multi-login-page/MultiLoginPage.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/openArticlePage.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/notification/NotificationCard.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/notification/NotificationCard.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/common/notification/NotificationTray.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/onboarding-page/OnboardingPage.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/onboarding-page/OnboardingPage.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/onboarding-page/OnboardingThirdPartyPage.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/onboarding-page/OnboardingUnderagePage.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/profile/profile-manage-data-page/ProfileManagaDataPage.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/profile/profile-manage-data-page/ProfileManageDataPage.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/publisher-subscribe-follow-button/PublisherSubscribeFollowButton.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/publisher-subscribe-follow-button/PublisherSubscribeFollowButton.tsx","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/shouldUseMoreFromPublisherFollowApi.ts","webpack:///D:/a/_work/1/s/experiences/social/src/reaction-breakdown/ReactionBreakdown.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/follow-button/FollowButton.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/follow-button/FollowButton.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/reaction-breakdown/ReactionBreakdownListItem.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/reaction-breakdown/ReactionBreakdown.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/common/report-menu/ReportMenu.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/report-menu/ReportMenu.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/main/main.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/popup/Popup.telemetry.ts","webpack:///D:/a/_work/1/s/experiences/social/src/popup/Popup.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/Social.errors.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.tsx","webpack:///D:/a/_work/1/s/experiences/social/src/copyright-form/CopyrightForm.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/follow-button/FollowButton.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/multi-login-page/MultiLoginPage.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/popup/Popup.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/reaction-breakdown/ReactionBreakdown.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/index.ts","webpack:///D:/a/_work/1/s/experiences/social/src/Social.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/report-menu/ReportMenu.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/notification/NotificationCard.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/notification/NotificationTray.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/profile/profile-manage-data-page/ProfileManageDataPage.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/onboarding-page/OnboardingPage.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/gradient-overlay/GradientOverlay.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/publisher-subscribe-follow-button/PublisherSubscribeFollowButton.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/follow-button/themes/superapp/FollowButtonSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/reaction-breakdown/themes/superapp/ReactionBreakdownSuperApp.styles.ts","webpack:///D:/a/_work/1/s/experiences/social/src/common/report-menu/themes/superapp/ReportMenuSuperApp.styles.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/SocialData.bridge.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/fetchScripts.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/webSockets.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/AppErrorLogger.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/parseState.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/enums.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/contentIdKey.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/SocialData.connector.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/utils/themeHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-data-connector/src/SocialData.reducer.ts","webpack:///./src/social/Social.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/logging/ErrorHelper.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/logging/ExceptionLogging.ts","webpack:///D:/a/_work/1/s/libs/core/src/bundles/Bundles.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/utils/FetchScripts.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/utils/ApiErrors.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/utils/AppErrorLogger.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/service/SocialService.ts","webpack:///D:/a/_work/1/s/libs/social-interaction-helpers/src/utils/EventHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-interaction-helpers/src/utils/BridgeHelpers.ts","webpack:///D:/a/_work/1/s/libs/social-interaction-helpers/src/TouchSlideHandlers.ts","webpack:///D:/a/_work/1/s/libs/page-lifecycle-helpers/src/PageLifecycleConstants.ts","webpack:///D:/a/_work/1/s/libs/core/src/services/ExponentialBackoffRetry.ts","webpack:///D:/a/_work/1/s/libs/oneservice/src/ServiceRequest.ts","webpack:///D:/a/_work/1/s/libs/social-utils/src/utils/ObserverHelper.ts","webpack:///D:/a/_work/1/s/libs/isomorphic-util/src/requestData.ts","webpack:///D:/a/_work/1/s/libs/core/src/constants/Constants.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/Parsing.ts","webpack:///D:/a/_work/1/s/libs/telemetry-contracts/src/telemetry-statics/Telemetry.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/LocalStorageInline.ts","webpack:///D:/a/_work/1/s/libs/render-cache/src/Helper.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/PageTypes.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/SignedInStatus.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/logging/Logger.ts","webpack:///D:/a/_work/1/s/libs/page-error-handling/src/Utilities.ts","webpack:///D:/a/_work/1/s/libs/page-error-handling/src/PageSettings.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/CookieInlineUtility.ts","webpack:///D:/a/_work/1/s/libs/page-error-handling/src/ErrorLogger.ts","webpack:///D:/a/_work/1/s/libs/experiences-dynamic-reducer/src/reducers/DynamicReducer.ts","webpack:///D:/a/_work/1/s/libs/experiences-page-base/src/pages/PageHelper.ts","webpack:///D:/a/_work/1/s/libs/experiences-page-base/src/pages/PageBase.ts","webpack:///D:/a/_work/1/s/libs/core/src/webstorage/LocalStorage.ts","webpack:///D:/a/_work/1/s/libs/core/src/webstorage/WebStorage.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/SameSiteValues.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/CookieUtility.ts","webpack:///D:/a/_work/1/s/libs/isomorphic-util/src/DOMHelpersCore.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/Enterprise.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/utilities/ColumnWidths.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/Utility.ts","webpack:///D:/a/_work/1/s/libs/config-resolver/src/utilities/ResolverAppErrors.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfTimeline.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/BrowserTypes.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/StoredHeadData.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/HeadData.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PageTimings.ts","webpack:///D:/a/_work/1/s/libs/auth/src/AuthHelperWindowsWidget.ts","webpack:///D:/a/_work/1/s/libs/core/src/types/WindowsApiInterfaces.ts","webpack:///D:/a/_work/1/s/libs/oneservice/src/OneServiceUtility.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/WindowsWidget.ts","webpack:///D:/a/_work/1/s/libs/core-contracts/src/appError-contracts/ErrorBehavior.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/MilestoneData.actions.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-model/ExperienceLoadingState.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfMarkerConstants.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/WebWorkerUtility.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/ConnectorNamespaces.ts","webpack:///D:/a/_work/1/s/libs/core/src/public-path/index.ts","webpack:///./src/publicPath.ts","webpack:///./src/integration/RequireAsync.ts","webpack:///D:/a/_work/1/s/libs/experiences-shared-state/src/ExperiencesSharedState.actions.ts","webpack:///./src/integration/SubnavTabName.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/ActionDispatchHelper.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/ActionSenderBase.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/ActionSender.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/GlobalActionSender.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/reducers/ActionMap.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/schema/enums.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/actions/CommonActions.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/ExperienceState.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/ChildExperiencesDeferRenderType.ts","webpack:///D:/a/_work/1/s/libs/page-lifecycle-helpers/src/PageRevealTracker.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfTimelineImpl.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/ExperienceDiagnostics.ts","webpack:///D:/a/_work/1/s/libs/experiences-connector/src/experience-loader/ExperienceLoader.ts","webpack:///D:/a/_work/1/s/libs/experiences-connector/src/connectors/ComponentConnector.ts","webpack:///D:/a/_work/1/s/libs/experiences-connector/src/connectors/ComponentConnector.constants.ts","webpack:///D:/a/_work/1/s/libs/telemetry-core/src/react/ComponentTracker.tsx","webpack:///D:/a/_work/1/s/libs/experiences-connector/src/connectors/ExperiencePerfTimeline.tsx","webpack:///D:/a/_work/1/s/libs/core/src/app/Environment.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/ScreenWidth.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/utilities/FastBreakpointManager.ts","webpack:///D:/a/_work/1/s/libs/core-contracts/src/resolver-contracts/ConfigOrigin.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-management/MilestoneTrackerHelper.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/IndexedDb.ts","webpack:///D:/a/_work/1/s/libs/service-worker-window/src/swCacheHelper/ServiceWorkerCacheHelper.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/AuthCookieNames.ts","webpack:///D:/a/_work/1/s/libs/render-cache/src/PersistRenderCache.ts","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/src/server-cache/ServerCache.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/AbortableFetch.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/ExperienceIds.ts","webpack:///D:/a/_work/1/s/libs/experiences-redux/src/connectors/DataConnector.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-model/ExperienceDeferralHandlerSignature.ts","webpack:///D:/a/_work/1/s/libs/experiences-dynamic-reducer/src/reducers/DataConnectorTracker.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-model/ExperienceMilestoneEventTypes.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/ExperienceCompositionTypes.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/composition/ChildrenTypes.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/TelemetryHelper.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfMarkerWait.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-model/ExperienceDeferralEventTypes.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/data-management/ExperienceDeferralDependencyTrackerState.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/MilestoneData.Helper.ts","webpack:///D:/a/_work/1/s/libs/milestone-data/src/MilestoneData.constants.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfTracker.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/base/BaseExperience.tsx","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/ChildExperienceValidator.ts","webpack:///D:/a/_work/1/s/libs/config-validator/src/ConfigProcessor.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/UrlSearchParamsHelper.ts","webpack:///./src/integration/Constants.ts","webpack:///./src/integration/Mediator.ts","webpack:///./src/integration/SubnavTabHelper.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/mapper/SocialServiceMapper.ts","webpack:///D:/a/_work/1/s/libs/cookie-consent-common/src/CookieConsentCommonConstants.ts","webpack:///D:/a/_work/1/s/libs/cookie-consent-common/src/OneTrustCookieCategoryMapping.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/utilities/Cookies.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/ZIndex.ts","webpack:///D:/a/_work/1/s/libs/telemetry-core/src/tracking/TelemetryContractCoverter.ts","webpack:///D:/a/_work/1/s/libs/web-worker/src/wwCommon/Constants.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/Constants.ts","webpack:///D:/a/_work/1/s/libs/sapphire-feed-bridge/src/SapphireUserConfig.ts","webpack:///D:/a/_work/1/s/libs/experiences-dynamic-reducer/src/reducers/DataConnectorInjector.ts","webpack:///D:/a/_work/1/s/libs/core/src/utilities/PageUtility.ts","webpack:///D:/a/_work/1/s/libs/experiences-constants/src/CookieConsent.ts","webpack:///D:/a/_work/1/s/libs/page-lifecycle-helpers/src/PrerenderActionHelpers.ts","webpack:///D:/a/_work/1/s/libs/isomorphic-util/src/DOMHelpers.ts","webpack:///./src/integration/PrimeTrackInfo.ts","webpack:///D:/a/_work/1/s/libs/diagnostics/src/performance/PerfMarker.ts","webpack:///D:/a/_work/1/s/libs/core/src/config/configs/ChildExperienceConfigInfo.ts","webpack:///D:/a/_work/1/s/libs/publishers-service-client/src/Publisher.ts","webpack:///D:/a/_work/1/s/libs/publishers-service-client/src/publishersServiceClient.ts","webpack:///D:/a/_work/1/s/libs/experiences-base/src/design-system/DesignSystemDefaults.ts","webpack:///D:/a/_work/1/s/libs/core/src/app/Market.ts","webpack:///D:/a/_work/1/s/libs/telemetry-contracts/src/telemetry-contracts/TelemetryConstants.ts","webpack:///D:/a/_work/1/s/libs/social-data-service/src/schema/SocialBarData.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","569","exports","module","l","e","Promise","resolve","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","oe","err","console","error","jsonpArray","window","oldJsonpFunction","slice","Severity","gJobListeners","gObservers","isSapphire","isAndroid","sapphireWebViewBridge","send","isIOS","webkit","messageHandlers","postMessage","gAppId","undefined","postJobDataToWebView","scenario","log","jobId","replace","Math","random","toString","msgObj","id","jsonMsg","JSON","stringify","invoke","method","callback","subscribeCallback","listen","handler","handlerId","unlisten","RequestData","spec","qspPrefix","this","memo","objectFromSpecification","values","requestDataValue","clientValue","keys","reduce","pv","cv","assign","qsp","ver","join","forEach","qp","startsWith","verParam","split","current","newValue","parse","ex","params","URLSearchParams","recurse","obj","prefix","k","currentPrefix","append","sort","getURLSearchParams","breakpoints","DefaultSize2ColumnWidth","DefaultSize3ColumnWidth","DefaultSize4ColumnWidth","SSRContract","innerWidth","innerHeight","outerWidth","breakpoint","locationHash","location","hash","locationHref","href","locationHost","host","locationHostName","hostname","locationOrigin","origin","locationPathName","pathname","locationProtocol","protocol","locationSearch","search","screenTop","screenY","canUseCssGrid","CSS","supports","devicePixelRatio","language","document","documentElement","lang","direction","dir","requestId","requestData","loadQueryParams","RequestId","app","ActivityId","getContextData","dataGetter","dataName","throwException","Error","cacheBypassQueryStringParamName","cacheBypassValue","parseInt","updateCacheBypassValue","Date","now","HostPage","topDomain","purgeCacheAsync","river","UpdateMyFeed","payload","getCurrentCacheBypassValue","includeCacheBypassIfNeeded","url","searchParams","set","TelemetryBase","trackAppErrorEvent","sendSinglePageViewBeacon","trackPartialImpression","trackEvent","setTrackingAttrs","isWindowsScenario","currentUrl","URL","isMatch","toLowerCase","substr","severity","Alert","pb","build","updateAppErrorsPropertyBag","newPbInfo","getAppErrorsPropertyBag","NoAlert","OneServiceCardProviderResponseEmpty","source","OneServiceCardProviderEmptyMyFeed","OneServiceCardProviderResponseWasNullOrErroneous","OneServiceCardProviderErrorFetchingOneServiceResponse","HighImpact","OneServiceCardProviderInvalidJsonInOneServiceResponse","OneServiceCardProviderInvalidFeedListInOneServiceResponse","OneServiceCardProviderRiverConfigurationIssue","OneServiceCardProviderQueryInterestContentFetchError","OneServiceCardProviderStaticContentLoaded","ContentPreviewAppErrors","ErrorWhileFetchingContentPreviewContent","InvalidResponseFromContentPreviewFetch","InvalidResponseFromContentPreviewResponseJson","ErrorWhileInitializingAsyncContentPreviewContent","InvalidOrMissingContentId","MissingDataForExternalContent","MissingPartnerLink","ErrorWhileFetchingWindowsShellContentPreviewContent","RiverSourceFile","RiverAppErrors","UnknownMetadataReceivedFromRiverCardProvider","RiverContentProviderFetchException","SkipPositionedCardsFallbackStrategyFailed","InvalidConfig","MissingExperienceTypeMap","ChildLoadError","InitialDataLoadError","DuplicateInstanceIdWarning","FullHeightFallbackStrategyFailed","UserInitiatedPageRefreshErrors","Default","SportsCardError","SportsLeaguePdpFetchError","SportsLeaguePdpInvalidResponse","SportsPlayersPdpFetchError","SportsPlayersPdpInvalidResponse","SportsTeamsPdpFetchError","SportsTeamsPdpInvalidResponse","SportsCardConfigFetchError","SportsCardGetFavoriteTeamDataError","SportsCardGetPlayerBioError","SportsCardGetLeaguesGamesArrayError","SportsCardGetPdpDataFailure","SportsCardGetLeagueSeasonYearDataFailure","SportsCardGetLocalizedTeamNameDataFailure","SportsCardGetTeamDataFailure","SportsCardGetLeagueDataFailure","MoneyCardError","MoneyQuoteSummaryGetError","MoneyQuoteSummariesGetError","MoneyPdpDataGetErrorFromService","MoneyPdpInvalidResponseFromService","MoneyQuoteSummaryGetErrorFromService","MoneyQuoteSummaryInvalidResponseFromService","TrendingNewsErrors","DataFetchError","BackupDataFetchError","GridSectionAppErrors","GridSectionCardGenerationError","MeControlAppErrors","SSOFailedError","MeControlLoadFailedError","PageClickTrackerErrors","InvalidResponse","FetchFailure","CoachmarkAppErrors","GeneralError","NotPlaceable","NotFoundComponent","CoachmarkDataConnectorUndefined","InvalidCTAType","CTATypeNotDefined","ConfigDataUndefined","FailedToFetchConfigData","ExceptionFetchingConfigData","EventNotDefined","CoachmarkStateNotDefined","CoachmarkDataAppErrors","InvalidCoachmarkMessage","IrisDataConnectorUndefined","ErrorFoundForSurface","TelemetryInfoUndefined","EventTypeUndefined","IrisActionUndefined","SpotlightPreviewAppErrors","ErrorWhileFetchingSpotlightPreviewCardInfo","NoServiceContextMetadata","SpotlightErrors","UnknownError","ContentFetchError","PartnerFetchFail","CardActionErrors","CardActionBaseExperienceError","CardActionPostActionError","CardActionDeleteActionError","CardActionGetActionError","CardActionBadRequestReportingToOcv","CardActionExceptionReportingToOcv","CookieRelatedErrors","SharedStateConnectorNull","CookieNotCategorized","OverlayErrors","LoadExperienceError","ViewsCommonAppErrors","InvalidIntraArticleDataError","InvalidDocumentContentError","ViewsPaddleDataLoadError","ViewsErrorPage","ProviderMapperError","InvalidContentId","ContentActionsToolbarAppErrors","ContentActionsSharingToolbarLoadError","ContentActionsArticleDatafetchError","ContentActionsBaseExperienceError","ContentActionsGetDocumentDataError","ContentActionsGetContentStatusActionError","ContentActionsDeleteActionError","ContentActionsPostActionError","ContentActionsExperienceLoadError","ContentActionsFlipToolbarError","ContentActionsContentStatusFetchError","ContentActionsContentPreviewFetchError","ContentSharingToolbarAppErrors","ContentSharingToolbarInitializationError","ContentSharingToolbarSaveForLaterServiceError","ContentProviderAppErrors","InvalidSourceIdError","ProviderDetailsFetchError","ProviderFeedFetchError","InvalidLayoutTemplate","ViewsGalleryAppErrors","InvalidGalleryIdError","GalleryDataLoadError","GalleryImagesLoadError","VideoListAppErrors","VideoListDataLoadError","ViewsArticleAppErrors","InvalidArticleIdError","ArticleDataLoadError","IntraArticleComponentLoadError","InlineGalleryInvokeError","InterestsSearchAppErrors","ErrorResponseFromOneService","ErrorResponseFromOneServiceIsInvalid","InvalidUrlFoundForElement","SelectedItemNotFoundInSuggestions","SelectedItemIsInvalid","InterestsAppErrors","InterestsRetrieveTopicsError","InterestsRetrieveFollowedTopicsError","InterestsRetrieveMutedPublishersError","InterestsUnMutePublisherError","InterestsFollowTopicError","InterestsUnfollowTopicError","InterestsTopicStateUndefined","InterestsShouldHaveRendered","InterestsRetrieveTopicError","InterestsRetrieveSavedStoriesError","InterestsSavedStoriesInvalidConfigError","InterestsSavedStoriesChildLoadError","InterestsSavedStoriesInvalidJsonError","InterestsSavedStoriesInvalidListError","InterestsRetrieveRecommendedTopicsError","UndefinedTopicDataConnector","InterestsRetrieveReadStoriesError","InterestsReadStoriesInvalidConfigError","InterestsReadStoriesChildLoadError","InterestsReadStoriesInvalidJsonError","InterestsReadStoriesInvalidListError","FailedRestoringDefaultTopicsError","TopicsFailedIndexedDBConnection","TopicsFailedGettingIndexedDB","TopicsFailedUpdatingIndexedDB","TopicsFailedCheckingLimitedFeed","ComponentConnector","ComponentConnectorAppErrors","DuplicateChildInstanceFound","BundleLoadError","ChildConfigInfoListNull","ListStartPositionInvalid","ChildDelayLoadError","ExperienceDependencyTimeout","LoadDataConnectorConfigFailed","LoadDataConnectorFailed","ChildWithInvalidExperience","ExperienceLoaderAppErrors","InsufficientLoadArgs","ConnectComponentFailureError","LoadComponentFailureError","SearchError","MissingFormCode","RecommendedSearchErrors","ResponseParsingFailed","InvalidJsonResponse","ServiceCallFailed","RenderFailed","Timeout","PollsCardAppErrors","Critical","PollsListFetchError","PollDataFetchError","PollsCardInvalidPoll","PollsCardInvalidQuizPoll","PollsCardVoteError","PollsCardMapStateToPropsError","PollsUnknownError","PollsResultPercentageError","PollAutoCuratedErrors","PollAutoCuratedContentError","PollAutoCuratedInvalid","PollAutoCuratedResultsFetchError","PollAutoCuratedResultsTransformError","MonetizationAppErrors","PlacementManagerLoadError","ArrangementPositionLoadError","GetCMSContentError","GetSAMRTBResponseError","MediaNetEOABError","InvalidPromoModuleConfig","CookieSyncDownloadExternalScriptError","CookieSyncMissingExternalScriptUrl","CookieSyncTimeout","CookieSyncPartnerScriptError","CookieSyncPixelPartnerDownloadError","CMSOrBackfillNativeAdLoadError","PlacementPositionMismatchingError","MissingRequiredPropertyPlacementManagerConfig","NativeAdTargetScopeError","RiverVideoAdPartnerError","JsTrackerPartnerScriptLoadError","ViglinkError","MissingTopicId","TopicIdNotFound","GetSAMRTBResponseErrorNoAlert","DisplayAdsOathLoadError","DisplayAdsApnLoadError","DisplayAdsApnEmptyProvider","DisplayAdsAdsDetectionNotInit","DisplayAdsMoatLoadError","DisplayAdsNoAdObjects","DisplayAdsProviderIdEncode","DisplayAdsJacLoadError","DisplayAdsInvalidSizeError","DisplayAdsInvalidParameterError","TaboolaRiverAppErrors","TaboolaRiverFetchError","PlayNativeAdVideoError","CoreLibAppErrors","DeprecatedCompositionLayoutUsed","InvalidColumnInGridConfig","ErrorLoadingBundle","GenericJSException","LocalStorageDoesntExist","SessionStorageDoesntExist","ReactRenderException","userImpacting","NetworkConnectionStatus","ResolverAppErrors","IndexedDbWriteFailed","IndexedDbReadFailed","CrsFetchError","ReceivedConfigFromCdnAsCrsFetchFailed","GetConfigException","IndexedDbBulkReadFailed","IndexedDbFailedToRemoveCachedConfig","IndexedDbFailedToClearAllCachedConfigs","RenderCachePurgedDueToChangesInConfig","FailedToPurgeRenderCache","RefreshConfigCacheFailed","IndexedDbInitFailed","DifferentCbid","PrgFlightLsWriteError","PrgFlightLsReadError","ResolverErrorConfigsDownloadedByCdn","CachedConfigsForDifferentFlight","ConfigCrsFetchNon200Response","ConfigCdnFetchNon200Response","GitConfigsInvalidConfigRef","GitConfigsInvalidConfigResolver","BingCardsAppErrors","Fallback","BingCardGetHotelAnswersError","BingCardGetHotelErrorFromService","BingCardGetAnswersError","BingCardInvalidEntityType","BingCardErrorOut","BingAnswersAppErrors","FailedToLoadData","NoCardsContentType","NoCardsRelated","BingShoppingLifestyleCardError","LifestyleShopCardServiceFetchError","LifestyleShopCardServiceFetchInvalidResponse","LifestyleShopCardServiceEmptyResponse","LifestyleShopCardServiceInvalidResponse","LifestyleShopCardCdnServiceFetchError","LifestyleShopCardCdnServiceFetchInvalidResponse","LifestyleShopCardCdnServiceInvalidResponse","LifestyleShopAutosuggestServiceFetchError","LifestyleShopAutosuggestServiceFetchInvalidResponse","LifestyleShopAutosuggestServiceEmptyResponse","LifestyleShopAutosuggestServiceInvalidResponse","LifestyleShopAutosuggestInvalidSuggestionUrl","BingMiniShoppingServiceClientSourceFile","BingMiniShoppingError","BingMiniShoppingServiceFetchError","BingMiniShoppingServiceEmptyResponse","BingMiniShoppingServiceInvalidResponse","BingMiniShoppingServiceInsufficientDealsItems","BingMiniShoppingServiceInsufficientActiveDealsItems","BingMiniShoppingServiceInsufficientTrendingItems","BingMiniShoppingServiceInsufficientTrendingCategories","BingShoppingMeStripeServiceFetchError","BingShoppingMeStripeServiceEmptyResponse","BingShoppingMeStripeServiceInvalidResponse","BingShoppingMeStripeServiceMissingRequiredFields","ShoppingCarouselEntitiesDataServiceFetchError","ShoppingCarouselEntitiesDataServiceEmptyResponse","ShoppingCarouselEntitiesDataServiceInvalidResponse","ShoppingCarouselEntitiesDataServiceInsufficientItems","ShoppingCarouselGenericError","ShoppingCarouselRenderError","ShoppingContentCardServiceFetchError","ShoppingContentCardServiceEmptyResponse","ShoppingContentServiceInvalidData","ShoppingContentServiceInsufficientActiveItems","ShoppingContentServiceMissingFields","NotificationBellErrors","JsonParseError","NewsItemDataFetchError","MalformedNewsItemResponseError","SettingFetchError","SettingUpdateError","CountInconsistent","ElectionResultMapConnectorErrors","ElectionResultMapInspectorErrors","EmptyResultSummaryError","ElectionResultMapErrors","FetchAndUpdateElectionDataError","ElectionDelegateCounterErrors","TopicByNameFetchFailed","RecommendedTopicsErrors","TopicsDataConnectorFailed","InvalidTopicClick","WebWorkerErrors","FileNotFound","RuntimeError","MessageTimeout","HandledError","WindowsShellInvalidShellContentResponse","WindowsShellInvalidContentResponse","WindowsShellEmptyShellContentResponse","WindowsShellFailedToGetContentOnRetry","WindowsShellAskingToFetchNewContentForRetry","ExceptionCallingAuthenticatorApi","SSRAppErrors","UntrackedClick","FragmentFetchFailed","DidUseBrowserCacheAPIError","DidUseBrowserCachePolyfillResponseHeaderInvalid","ServerCacheFetchFailed","ConnectorMapInvalid","FetchSSRPageFailed","FetchSSRPageFailedFromInvalidWindowInnerWidth","ServerCacheRefreshFailed","WebEntryFailed","SsrResolverReturnedNullConfig","AppError_InvalidQParams_35001","AppError_ArcResponseNotOk_35003","AppError_ArcResponseUnparsable_35004","AppError_UnknownIrisErrorFound_35006","AppError_TimeoutIrisErrorFound_35007","AppError_TemplateIrisErrorFound_35008","AppError_ClientErrorIrisErrorFound_35009","AppError_DSourceIrisErrorFound_35010","AppError_ActionResponseFailure_35013","AppError_UncaughtErrorDetected_35014","AppError_UnconvertableCreative_35015","AppError_InvalidResponseFormat_35016","AppError_UnparsableSingleResponseJSON_35018","AppError_MissingQueryParams_35019","AppError_MissingContext_35020","AppError_UndefinedRequestParams_35022","AppError_UndefinedAppEnvironment_35023","AppError_MissingAppEnvironmentProperty_35024","AppError_ArcCallFailure_35025","AppError_ArcCallFailureIrisUpdate_35026","SubscriberNotFound","CreativeCountNegativeOrZero","MissingIrisParameterForConditionalBanner","SubscriberNotFoundInIrisPlacementDictionary","FailedToReadNurturingAcceptedFlag","ExceptionRequestingSurfaceInfo","MissingIrisParameterForBackgroundImages","SurfaceCollectionContextMissingParams","IrisPersistChromiumAPIsNotAvailable","IrisGetChromiumAPIsNotAvailable","IrisChromiumAPIsFailure","EdgeChromiumAPIsNotAvailable","AcquireAccessTokenFailed","AcquireAccessTokenHandledFailure","RenderCacheErrors","JssStyleMismatchWarning","JssStyleCriticalMismatchError","PreloadReportingMessages","TtvrMissing","TfprMissing","TtvrSearchBoxMissing","TtfSearchBoxMissing","PrerenderRevalidateException","PushNotificationsLibErrors","FetchKeyError","SubscribeUnsubscribeError","ContentTruncationErrors","OverTruncationError","EmptyFeedWithFeedId","EmptySearchedFeedWithFeedId","EmptySearchedFeedWithFeedQuery","EmptyKidsModeFeed","UnauthorizedFeedResponse","CardViewFeedDataMapperInvalidData","TabRiverRequestEmptyResponse","TabsRequestEmptyResponse","FallingBackToSkipStrategy","FallingBackToFullHeightStrategy","RiverContentProviderFetchNextPageException","InvalidEmptyRiverContent","GridSectionCardRenderFailure","BreakpointOutOfBoundWarning","FinanceAutoSuggestFetchError","FinanceAutoSuggestStatusError","FinanceAutoSuggestInvalidResponseBody","FinanceMostActiveQuotesFetchError","FinanceMostActiveQuotesStatusError","FinanceMostActiveQuotesInvalidResponseBody","FinanceWatchListFetchFailed","FinanceChartFetchError","FinanceChartStatusError","FinanceChartInvalidResponseBody","FinanceQuoteSummaryFetchError","FinanceQuoteSummaryStatusError","FinanceQuoteSummaryInvalidResponseBody","FinanceExchangeFetchError","FinanceExchangeStatusError","FinanceExchangeInvalidResponseBody","FinanceIndicesFetchError","FinanceIndicesStatusError","FinanceIndicesInvalidResponseBody","FinanceEquitiesFetchError","FinanceEquitiesStatusError","FinanceEquitiesInvalidResponseBody","FinanceEquityFinancialsFetchError","FinanceEquityFinancialsStatusError","FinanceEquityFinancialsInvalidResponseBody","FinanceGetAllCurrenciesFetchError","FinanceGetAllCurrenciesStatusError","FinanceGetAllCurrenciesInvalidResponseBody","FinanceGetMicrosoftIdFetchError","FinanceGetMicrosoftIdStatusError","FinanceGetMicrosoftIdInvalidResponseBody","FinanceGetMorningStarIdFetchError","FinanceGetMorningStarIdStatusError","FinanceGetMorningStarIdInvalidResponseBody","FinancePDPUserSettingsWriteFailed","FinanceWatchlistDataVisuallyUnavailable","FinanceQuotesDataVisuallyUnavailable","FinanceChartsDataVisuallyUnavailable","FinanceMoversDataVisuallyUnavailable","FinanceExchangesDataVisuallyUnavailable","FinanceIndicesDataVisuallyUnavailable","FinanceEquitiesDataVisuallyUnavailable","FinanceEquityFinancialsDataVisuallyUnavailable","FinanceCurrenciesDataVisuallyUnavailable","FinanceFundsDataVisuallyUnavailable","FinanceGetMicrosoftIdDataVisuallyUnavailable","FinanceGetMorningStarIdDataVisuallyUnavailable","FinanceEventsDataVisuallyUnavailable","FinanceListsDataVisuallyUnavailable","FinanceCreatePortfolioFailed","FinanceCreateTransactionFailed","FinanceAddToWatchlistFailed","FinanceSortWatchlistFailed","FinanceDeleteFromWatchlistFailed","FinancePortfolioListFetchError","FinancePortfolioDataFetchError","FinanceDeletePortfolioError","FinanceUpdatePortfolioError","FinanceDeleteTransactionError","FinanceUpdateTransactionError","FinanceAddToPortfolioError","FinanceDeleteFromPortfolioError","FinanceSortPortfolioError","FinanceEventsFetchError","FinanceEventsStatusError","FinanceEventsInvalidResponseBody","FinanceListsFetchError","FinanceListsStatusError","FinanceListsInvalidResponseBody","FinanceWatchlistFetchWarning","SocialNoModuleName","SocialExperienceReducerIncorrectArgumentError","SocialDataConnectorNotFound","SocialAPIRequestErrorUnknown","SocialAPIRequestErrorContents","SocialAPIRequestErrorComments","SocialAPIRequestErrorUsers","SocialExperienceRenderErrorReactionBreakdown","SocialExperienceRenderErrorMultilineLogin","SocialExperienceRenderErrorNotificationTray","SocialExperienceRenderErrorOnboarding","SocialExperienceRenderErrorOnbardingThirdParty","SocialExperienceRenderErrorUnknownComponent","SocialExperienceRenderErrorCopyrightForm","SocialExperienceRenderErrorFollowButton","SocialExperienceRenderErrorGradientOverlay","SocialExperienceRenderErrorMain","SocialExperienceRenderErrorNotificationCard","SocialExperienceRenderErrorOnboardingUnderagePage","SocialExperienceRenderErrorPopup","SocialExperienceRenderErrorProfileManageDataPage","SocialExperienceRenderErrorPublisherSubscribeFollowButton","SocialExperienceRenderErrorReactionBreakdownListItem","SocialExperienceRenderErrorReportMenu","SocialExperiencePublisherIsFollowedFetchError","SocialExperiencePublisherFollowUnfollowError","UnknownBulkLoadGraphActionType","WindowsCardProviderResponseWasNullOrErroneous","WindowsCardProviderErrorFetchingData","CommonHeaderNavigationFailed","CommonHeaderInvalidConfig","CommonHeaderMissingFormCode","CommonHeaderRenderError","CommonHeaderInvalidUrl","NtpSettingsPrivateNotAvailable","NtpSetPrefFailureToWrite","NtpGetPrefFailureToRead","PreferenceSettingApiNotAvailable","PreferenceSettingKeyNotAvailable","PreferenceSettingDidNotSave","PreferenceKeyMissingUnexpectedly","targetActionCTA","SetDefaultBrowserException","SetDefaultBrowserNotAvailable","AppPinningPrivateException","DesktopWidgetPrivateNotAvailable","WebWidgetLaunchApiNotAvailable","WebWidgetEnableAutoStartApiNotAvailable","FailedToLaunchAndDefaultWebWidget","SocialBarExperienceRenderErrorContentSocialBar","SocialBarExperienceRenderErrorReactionMenu","SocialBarExperienceRenderErrorSocialBarPanel","SocialBarExperienceRenderErrorUnknownComponent","SocialCommentExperienceRenderErrorComment","SocialCommentExperienceRenderErrorCommentBox","SocialCommentExperienceRenderErrorCommentItem","SocialCommentExperienceRenderErrorCommentList","SocialCommentExperienceRenderErrorContentPanel","SocialCommentExperienceRenderErrorDeleteMenu","SocialCommentExperienceRenderErrorDisabledMessage","SocialCommentExperienceRenderErrorFollowButton","SocialCommentExperienceRenderErrorProfileEducator","SocialCommentExperienceRenderErrorReactionMenu","SocialCommentExperienceRenderErrorReactionPanel","SocialCommentExperienceRenderErrorReplyList","SocialCommentExperienceRenderErrorReportMenu","SocialCommentExperienceRenderErrorSortBox","SocialCommentExperienceRenderErrorTypingUsers","SocialCommentExperienceRenderErrorUserCard","SocialCommentExperienceRenderErrorUnknownComponent","LiteLogger","isDebugEnabled","1","true","global","webpackRequire","isDebug","tags","message","info","getMessage","getQueryParameterByName","nameRegEx","queryNameValueMatches","RegExp","exec","queryValue","decodeURIComponent","getHostPageFromUrl","pathnameSegments","topDomainName","match","originalUrl","categoryKey","verticalKey","hostName","indexOffset","hostPage","subcategoryKey","ConnectorConstants","connectorStateKey","renderAction","dataConnectorMergeInitAction","MockLRUCache","cacheMap","Map","maxAge","dataConnectorLoadPromiseMap","getDataConnector","namespace","getInstance","rootReducer","tryGetDataConnector","connector","loadDataConnector","configInfo","experienceType","promise","reject","configId","configPromise","getConfig","modulePromise","loadExperience","promiseResults","all","config","properties","ExperienceConnector","ExperienceReducer","experienceConnector","store","getCurrentState","loadDataConnectorFailed","hasExperiencePersistentDataUpdated","expType","IsPrerender","visibilityState","storedExperiences","getObject","timeStamp","isNaN","setObject","performance","timing","navigationStart","trackExpWithPersistentDataUpdate","trackPageInvalidation","invalidationReason","setItem","time","getParameter","defaultValue","vars","substring","pair","getHashParameter","getQueryParameter","generateQueryStringByKeyVals","keyVals","map","encodeURIComponent","getExternalURL","externalURL","market","hasSectionIndicator","queryParams","x","val","queryString","indexOf","segments","PageInvalidationReasons","trackingResolved","trackingObject","elementTrackingDecorator","trackExtCompleted","trackEventBuffer","trackImpressionBuffer","trackAppErrorEventBuffer","elementTrackingDecoratorBuffer","trackingPromiseCalled","setTrackingForSingleElement","elementTree","parentElement","options","disableImpressionUpdate","sendTrackingCall","event","element","destination","headline","sendPartialPageRequest","elem","visibilityCheck","mechanism","topLevelContainerType","sendTrackAppErrorEvent","appError","errId","errSource","errMsg","processPendingTrackingCall","then","eventObj","decorator","handleTelemetryCall","action","behavior","handlePartialPageImpressionCall","viewType","handleAppErrorEventCall","handleSetTrackingAttrs","getTrack","AppType","CardStyleMode","TelemetryType","Undefined","Header","Footer","TopNavBar","NavBar","DropDown","Section","Carousel","Module","SearchBox","InputBox","ActionButton","Interaction","Headline","Entity","Topic","Provider","NewStories","AutoSuggest","Tile","TrendingNews","AllCoverage","Report","MsccCookieComplianceBanner","CookieWallCookieComplianceBanner","FRE","VideoPlayer","ContentCard","SubmitForm","TelemetryContentType","StructuredData","AppStore","CmsPromotions","MicrosoftWebStore","XboxStore","OfficeStore","PartnerLinks","SponsoredContent","Spotlight","ExternalLink","SearchPromo","Feed","Article","Gallery","Video","Audio","Settings","DisplayAd","OfficeDocument","App","SearchResult","VideoAd","Comment","Profile","Coachmark","TrendingSearch","AutoSuggestSearch","SearchHistory","TextSearch","TopSites","SearchLink","ImageSearch","VoiceSearch","Toast","Greeting","Image","Banner","Waffle","Notification","QnaTopic","QnaContent","TelemetryActionType","Click","Hover","Submit","View","RightClick","Wheel","KeyPress","HorizontalSwipe","TelemetryBehaviorType","Navigate","ContextMenu","Pin","Unpin","Rearrange","Remove","Add","Open","Follow","Unfollow","More","Close","Share","Like","Dislike","Unlike","Undislike","Mute","Unmute","Cancel","Launch","Install","Manage","Show","MuteCancel","Save","Hide","Unhide","Customize","Suspend","Clear","SignIn","SignOut","UndoSave","TurnOn","TurnOff","Forward","Response","ZoomIn","ZoomOut","Sort","Love","Surprised","Thinking","Sad","Angry","UndoRemove","Rename","Complete","Play","Pause","Seek","Volume","ClosedCaptions","Fullscreen","Restore","Replay","getOneServiceHeaders","headers","userConfig","muid","accessToken","accountType","SignInStateResolver","signInStateIsValid","isUserSignedIn","headDataSignInStatus","UserIsSignedIn","dataConnector","SharedState","signedIn","NotSignedIn","SignedIn","getUserSignInState","waitForSignInState","authAccessTokenMap","AuthTokenSuccessData","isPageViewReady","aadTokenQsKey","aadTokenQsVal","TokenFetchSecondaryErrors","InternalAuthError","useEnterpriseCompliance","sharedStateConnector","useEnterpriseDomain","waitForPageReadyAsync","eventHandler","removeEventListener","addEventListener","getAadData","clientId","scopeOrResource","friendlyName","allowInteraction","appEnvironment","accountInfo","resolveAccountInfo","IsCnDomain","cnError","errorInfo","internal_error_code","CnDomain","status","otherError","fireAuthTelemetry","unavailableError","AuthApiUnavailable","fireAppError","account_id","account_type","tenant_id","UNSUPPORTED_SOVEREIGNTY","sovereigntyError","UnsupportedSovereignty","tokenAcquireParameters","client_id","scope_or_resource","totalMarkerName","startMarkerName","endMarkerName","pageTimings","startPerfMarker","endPerfMarker","totalPerfMarker","startTime","round","chrome","authPrivate","acquireAccessTokenWithUserInteraction","acquireAccessTokenSilently","acquireResult","endTime","is_success","success","authInfoObject","error_info","authPrivateApi","resource","secondary_error","kTokenFetchUserInteractionRequired","kInteractionRequired","mfaRequired","token","access_token","isSuccess","isValid","is_token_valid","AccountInfoPromise","isGccModUser","region_scope","GCC_MODERATE","customMessage","sendAppErrorEvent","tenantId","authInfo","logData","sendAuthEvent","navigate","navigateAsync","navigateSync","getHttpAsync","getHttp","postHttpAsync","postHttp","deleteHttpAsync","deleteHttp","logEventAsync","logEvent","logErrorAsync","logError","getDeviceInfoAsync","getDeviceInfo","getLocationInfoAsync","getLocationInfo","getUserInfoAsync","getUserInfo","requestSnackBarAsync","requestSnackBar","subscribe","unsubscribe","sendBroadcastAsync","sendBroadcast","requestCustomAsync","requestCustom","ColumnArrangement","minViewportWidthOverrides","updateColumnArrangementsForFiveCol","fiveColSupported","columnArrangements","colFiveArrangementDefinition","ColumnArrangementDefinition","c5","columnArrangementMap","arrangement","contentSizePx","isFirstBreakpoint","widthOverride","contentBufferPx","c1","c2","c3","c4","columnArrangementDefinition","minViewportWidthPx","getBreakpointsFromColumnArrangements","getMediaQuery","minArrangement","maxArrangement","queries","minWidthPx","maxArrangementDefinition","maxArrangementIndex","getMediaQueryFor","columnArrangement","getMediaQuerySelector","mediaQuery","getMediaQuerySelectorFor","defaultOneServiceOcid","ActionHandler","actionPayload","actionMap","endsWith","type","actionMaps","actionPayloadType","String","target","defaultExpirationTimeMs","defaultForceExpirationTimeMs","expirationPrefix","forceTimestampPrefix","jssMapSuffix","keysPrefix","normalizedUrlConfigkey","storagePrefix","riverRcClassName","resetCallbacks","registerResetCallback","TelemetryObject","contract","parent","isRoot","attr","compress","savedChildObject","option","render","getMetadata","MediatorEventNames","ContentActionsUpdated","FeedFollowed","ForcePageReload","FollowedTopicsUpdated","MediatedCoachMark","TabNavigation","TabNavigateTo","TopicAction","Msn360","CardActionInit","CardActionPost","InterestsRenderComplete","RenderXFeed","ShowPivotById","ResumeInfopaneAutoRotate","SocialActionsUpdated","getMediator","PlatformType","getWpoFlights","wpoData","treatments","filter","item","AppEnvironment","_serviceUrl","_configServiceOverride","_serviceDomainOverride","initializeAppEnvironment","addWpoFlights","activityId","ClientSettings","aid","environmentConfigUrl","process","env","WEBPACK_DEV_SERVER","searchParam","contentServiceUrlBase","currentRequestTargetScope","currentMarket","enableFiveColLayout","environment","staticDomain","appType","authCookieName","useOneServiceAuthEndpoints","useOneServiceAnonAuthEndpoints","useAuthFetch","accountInfoPromise","resolvedAccountInfo","buildVersion","clarityEnabled","isWinAADUser","rootTelemetryId","trackInfo","getUserMuid","userId","oneServiceApiKey","showMnsCreatorDashboard","currentContentLinkHost","isCnDomain","serviceUrlBase","feedServiceUrlBase","enterpriseServiceDomainUrl","CurrentRequestTargetScope","audienceMode","Enterprise","ResolvedAccountInfo","AAD","isFrePage","disableCachingConfigs","queryParamOverride","toLocaleLowerCase","enableConfigService","EnableCMSPPEConfigs","isMultiConfigRetrievalEnabled","disableContentPreviewCache","sendFeedCallActivityIdInHeader","disableContentCacheIDBRead","configServiceBaseUrl","featureFlags","configRootUrl","cacheBustingIdentifier","isGitConfigs","countryCode","latitude","longitude","configCacheProperties","configOrigins","feature","Production","loc","IsGitConfigs","EnableConfigService","serviceUrl","configServiceOverride","serviceDomainOverride","_instance","environmentFromHeadData","clientSettings","tryReformatGuid","Locale","apps_locale","geo_country","geo_lat","geo_long","pcsInfo","setAccountInfoPromise","apptype","getAuthCookieName","disableActivityIdInHeader","Edge","Hub","cbid","pcsVersion","propertyBagPcsVersion","v","bundleInfo","alias","configsHash","locConfigsHash","buildAlias","bundleHash","configHash","locHash","configIndexDocId","rootElement","envQSOverwrite","prod","servicesEndpoints","pcsProvidedDomainUrl","feedService","domain","serviceDomainUrl","enterpriseFeedService","crsVersion","crs","crsDomain","getAttribute","Number","trackPageProd","trackPageTypeVal","sitePage","page_product","page_type","createContentLinkHost","setTargetScope","useGitConfigs","addHubWindowsFlight","setConfigOrigin","MMX","IsMmxWwwContentRequest","mmxExperimentContentHost","useMultiConfigsRetrieval","baseUrl","getConfigServiceBaseUrl","includes","getOneServiceApiKey","apiKey","WindowsShell","SharedWidgets","NewsAndInterests","WindowsNewsPlus","muidCookie","relativePath","renderWidgets","urlQuery","param","flights","pageExperiments","Windows","pagetype","Anon","AppAnon","FirstParty","MicrosoftNews","Views","Weather","Finance","HomePage","EdgeChromium","Office","getPrimaryAccountInfo","ZHCN","guid","matches","Kids","getEnterpriseOverride","Adult","browser","deviceFormFactor","locale","ocid","os","platform","Web","pageType","stringHasData","CurrentFlights","model","FeatureFlags","wpoEnabled","WPOModel","getWpoModel","flightsCached","currentPageExperiments","concat","getAppEnvironment","resetInstance","appTypeExpectedFlightMap","SuperApp","Traffic","getPeregrineFlights","cleanedUpFlights","lowercaseItem","trim","shouldUseGitConfigs","version","expectedGitFlight","prgFlights","containsGitConfigsFlight","ConfigFetchError","isNetworkFailure","super","_perfMarkers","_pageTimings","_perfTimeline","addPerfMarker","newMarker","endMeasure","startMeasure","timeTaken","ConfigCachingConstants","idbStoreName","idbName","configStalenessDuration","serverLruConfigCacheMax","idbInitPromiseNameKey","idbReadPromiseNameKey","idbWritePromiseNameKey","mockManager","_mocksEnabled","_mockConfigDictionary","createMockDictionary","itemParams","getAll","test","mockConfigDictionary","_","mockParam","mockFrom","mockWith","buildNumberRegex","getCacheKeyFromConfigRef","configRef","instanceSrc","sharedNs","getConfigRefFromKey","sharedPrefix","getChildConfigRefs","resolvedConfig","configRefSet","Set","addConfigRefFromObject","indicies","add","getConfigReferencePath","configReference","isLocalizationConfig","instance","sendAppError","appErrorCallback","useLocalConfigs","configType","isFeatureConfigType","isLocalOrigin","configOrigin","ConfigOrigin","Local","getLocalDevPrefix","hasMockReplacement","mockReplacement","mocksEnabled","prependConfigType","fetchAsync","memoize","relativeUrl","fetchUrl","fetch","response","ok","json","statusText","catch","failedConfigIndexFetches","fetchAndParseConfigIndex","args","hashedFileName","isLocalConfigs","failedConfigFetches","fetchAndParseConfig","configFileName","manifestsMap","manifestType","has","manifestBlobResult","isEmpty","configIndexKey","getFromManifest","configKey","cacheKey","manifest","fileHashes","configMergeCustomizer","srcValue","objValue","isArray","BrowserVersionOperator","targetScopeMatched","configTargetScope","pageTargetScope","audienceModeMatched","browserType","pcsBrowserVersion","configBrowserVersion","pcsIntBrowserVersion","operator","Equals","GreaterThan","LessThan","NotEquals","OneOf","browserTypeMatched","deviceTypeMatched","domainMatched","experimentId","experimentMatched","targetLocale","currentLocale","stringsEqualCaseInsensitive","script","marketMatched","configStringValue","pageStringValue","lowerCasePageStringValue","equals","notEquals","contains","oneOf","stringTargetScopeTypeMatched","ocidMatched","osMatched","pcsPageType","configPageType","exact","toUpperCase","pcsPageTypeSegments","index","pageTypeMatched","platformMatched","lhs","rhs","localeCompare","sensitivity","resolverEnvironment","configServiceParameters","targetScope","clientManifestService","clientConfigIndexService","clientConfigService","entity","featureEntityReference","localizationEntityReference","buildNumber","tryGetBuildNumber","itemSpalink","find","getTime","text","getBuildNumberAsync","featureManifestTask","fetchAndParseManifest","localizationManifestTask","featureIndexHashedFileName","getConfigIndexHashedFileName","localizationIndexHashedFileName","featureConfigIndexTask","localizationConfigIndexTask","indexResults","results","featureIndex","localizationIndex","featureConfigPaths","configs","localizationConfigPaths","configTasks","fetchMathingConfigs","count","mergeWith","mergeConfigs","configPaths","configPath","src","getConfigHashedFileName","allNullFetches","configNullFetches","getFailedConfigFetches","configIndexNullFetches","getFailedConfigIndexFetches","_buildNumber","mergedConfigMap","clientSingleConfigResolver","getFullTree","getConfigRecursive","getFailedFetches","nullFetchUrl","BlobFetchReturnedNull","mergedConfig","resolveConfigAsync","unresolvedConfigRefs","size","RecursiveGetFailed","idb","indexedDB","IDBObjectStore","idbPromise","req","withIdbStore","storeCallback","isGetAllAllowed","returnArray","openCursor","onsuccess","cursor","continue","put","delete","clear","idbVersion","dbName","preInitializedIdbPromise","storeName","openreq","open","onerror","onupgradeneeded","createObjectStore","operationName","db","transaction","oncomplete","onabort","objectStore","createError","baseError","enableIdbCaching","enableConfigCaching","useConfigCaching","stalenessCheckTimestamp","indexedDbMap","readConfigsFromIdb","_readConfigsFromIdb","initializeIdb","indexedDb","configMap","experienceConfig","storageTimestamp","configRefCacheKey","writeConfigMapToIdb","idbConfigOpenPromise","initializeIndexedDb","indexedDbInitialized","logMessage","indexedDbKey","generateIdbKey","cachedConfigs","cacheSource","idbConfigLookup","idbConfigReadPromise","cachedConfig","isConfigStale","loggerCallback","configPromiseMap","_shouldTryFallbackResolver","_hadNetworkError","configServiceParams","shouldUseConfigService","setConfigServiceParams","maxDepth","containsDevOnlyQueryParameters","getConfigTreeFromCrs","timer","timeoutInMs","timeoutPromise","setTimeout","isWebWorker","isThisWebWorkerThread","crsFetchPromise","downloadFromCrs","crsResponse","clearTimeout","race","generateCrsUrl","msedgeRef","errorMessage","isWebWorkerPresent","fetchNetworkResponse","statusCode","sharedNsQsp","configServiceRelativeUrl","fallbackResolverCalled","crsInitComplete","configService","configsEqual","lastBundleHash","lastConfigHash","lastLocHash","isConfigBundleLocHashSameAsLastPage","configCache","clientResolver","hadNetworkError","tryGetConfigSync","isLoggerCallbackAvailable","localConfigs","sendPerfMarker","initiateConfigService","fromMemoryConfig","networkReadPromise","shouldTryFallbackResolver","cdnConfig","crsConfig","cacheReadPromise","crsConfigMap","getConfigMap","updateCache","clientResolverConfigMap","initialize","perfMarkerCallback","currentTargetScope","Environment","promiseMap","refreshServerCachePromiseMap","localOverrideMap","_initializeIndexedDb","populateConfigMapFromIndexedDbAsync","_populateConfigMapFromIndexedDbAsync","peregrineFlightsKey","initializeCaching","cdnConfigBaseUrl","ConfigRootUrl","EnvironmentConfigUrl","ConfigServiceBaseUrl","resolverErrors","configTimings","useWebWorkerToCache","enableCMSPPEConfigs","useIndexedDb","enableIndexedDbInMainResolver","DisableCachingConfigs","isCachingAllowed","supported","useServerCache","ServerCache","setTargetScopeAndConfigServiceParams","currentTargetScopeOverride","peregrineFlights","scopeWithPeregrineFlights","useConfigService","IsMultiConfigRetrievalEnabled","CacheBustingIdentifier","getConfigRetrievalMaxDepth","_cbid","storageKey","generateKey","perfTimeline","_idbConfigOpenPromise","_idbConfigReadPromise","_idbConfigLookup","getConfigCacheProperties","BuildVersion","UrlUtility","getParamsObj","logObjectsCallback","logObjects","ConfigOrigins","configResolver","customizer","configIndex","experienceRef","overrideConfig","Utility","isString","cache","overrideEnv","overrideKey","typeVersion","_name","cmsHref","appConfig","rootExperience","startGetConfig","configIdStr","localOverride","addConfigTiming","configEndMeasure","gitConfigFromMemory","gitConfig","crsHadNetworkError","getCacheKey","configFromMemory","existingPromise","processed","configSource","hasCacheError","isHeadConfig","cachedOnServer","serializedConfig","configFromServerCache","cacheFetchDuration","isServerCacheConfigStale","updateServerCache","serverCacheGetConfig","isCached","detailedMessage","Telemetry","getConfigFromNetwork","networkConfig","readPromises","configFromMemoryAfterRace","sendRefreshError","mergedConfigsMap","removeCmsPathFromRelativeUrl","downloadFile","rootConfigIndexId","crsMergedConfig","configIndexHref","addConfigToConfigMap","downloadMergeConfig","multiConfigs","relatedConfigIndexHref","refreshPromise","refreshConfigServerCache","areConfigsEqual","removeSubstringKeys","experienceIndex","resolveConfigIndex","configObjects","downloadExperienceConfig","mergeConfig","baseConfigUrl","hrefs","promiseArray","isCrsFetch","crsMaxDepth","segment","wwResponse","fetched","refreshConfigResponse","purgeRenderCacheUponConfigChanges","writeConfigCacheProperties","liveCbId","liveCbid","writeCbidInLocalStorage","pcsCbid","highestCbid","clearConfigCache","clearObjects","getAllConfigTimingsOverride","allConfigsCacheDuration","allConfigsNetworkDuration","configTiming","networkFetchDuration","IsDebug","configFetchTimings","getItem","startBulkConfig","populateConfigMapFromCachedConfigs","unusableCount","flightsFromStorage","ConfigCacheProperties","prgFlightsSameAsLocalStorage","configHashes","getConfigsCacheLocalStorageKey","cbidKey","resolver","getRootConfig","getConfigTimings","getResolverErrors","refreshConfigCache","removeCachedConfig","getUseConfigService","overrideCurrentRequestTargetScope","overrideCurrentRequestEnvironment","clearInternalState","getConfigServiceParameters","setConfigTimingsObject","SubnavTabId","feedServiceUrl","getServiceUrl","initializationLogs","initializeServiceRequest","EnterpriseServiceUrlBase","ServiceUrlBase","getFeedServiceUrl","initializeFeedServiceRequest","FeedServiceUrlBase","getServiceUrlForSubpath","subPath","getFeedServiceUrlForSubpath","authEnabled","UserId","primeForbiddenCharacters","getParamsFromUrl","decodeComponents","getParams","decodeURIComponentWithPlusSign","queryArray","ndx","parts","queryKey","newParam","existingParam","entry","encodeURIComponentForPrime","uriComponent","getParamsWithItems","queryItems","findIndex","hrefParamsObj","paramsObj","paramArray","keyValuePair","isValidUrl","validateScheme","keyValueArrayToQueryString","kv","isKeyValuePair","joinSubpathToURL","trimmedEndSlashFromHref","trimmedStartSlashFromSubpath","updateSearchParam","appendSearchParam","fallback","getAbsoluteUrl","partialUrl","SocialDataActions","setTheme","ActionMap","updateMe","updateNotifications","updateActivities","deleteActivities","updateActivityStatus","setContent","updateContent","updateContentRating","insertComments","resetSpecificCommentId","updateCommentRating","incrementReplyCount","insertComment","updateUser","updateUserFollowers","updateUserFollowing","updateUserComments","deleteUserComment","setReactionBreakdown","setGradientOverlayData","setPublisherSubscribeFollowButtonData","setPopup","addTyper","updateTypers","recordSignalRHub","updateResponsiveClass","deleteMyData","updateActivityAppeal","mapCmsIdToContentId","resetError","SocialBarActions","setComponent","setSocialData","SocialBarInspector","inspect","state","theme","styleOverrides","CurrentMarket","props","localizedStrings","jssStyleSheet","missingChildren","appErrorLogger","onAppError","socialDataConnectorConfig","dataConnectors","screenWidth","ScreenWidth","Any","children","ConnectorNamespaces","SocialData","instanceId","parentNamespace","reducer","requestContext","connectorProps","setOnAppError","onComponentConnect","context","PageBase","socialDataConnector","registerObservers","updateSocialBarState","registerObserver","getSocialDataConnector","getActionSender","inspectorResult","childComponentInstanceList","connectorFunctions","getSocialBarConnectorFunctionsWithStateBindings","telemetryTags","mainTelemetryObject","telemetryObject","newState","handleAction","socialData","enums","selectPpeParameter","externalUrls","api","ppeApi","guidelinePage","guidelinePageEmbed","profilePage","channelPage","privacySettings","profileSettings","feedbackForm","moderationEmail","newPost","userStateType","existingUser","anonymous","newUser","userNameStatusType","normal","notAllow","inReview","unknown","userAvatarStatusType","userAgeGroup","under18","above18","activityType","follow","reply","reaction","badge","moderation","commentDeleteAlert","profileBannedAlert","profileErrorAlert","moderationErrorType","takedown","ban","notAllowName","notAllowPicture","approveUserAppeal","rejectUserAppeal","approveProfilePicAppeal","rejectProfilePicAppeal","approveCommentAppeal","rejectCommentAppeal","visibleStatusType","Normal","DeletedByUser","DeletedByAI","DeletedByHI","InReview","visibleStatusMap","commentReportMap","Spam","Profanity","Abuse","RiskyLowAuthority","Copyright","ChildRelated","Violent","Danger","PublicThreats","Illegal","Terrorism","Privacy","Inappropriate","OffTopic","userNameReportMap","userPictureReportMap","Nudity","NonConsensualIntimateImagery","reactionOrder","profileReportItemMap","UserName","ProfilePicture","profilePageEmptyStates","NoUser","NotSocialUser","reactionIconMap","like","love","thinking","surprised","sad","angry","reactions","responsiveLevels","L0","L1","L2","MobilePopup","articleOneBlock","newCommentErrorCodeMap","400","403","500","bodyTooLong","other","0","4","6","7","8","9","10","11","12","20","21","22","23","24","25","26","27","28","29","30","31","32","2","3","5","13","14","15","16","17","18","commentsStatusType","zero","minimal","expanded","notDetermined","default","disabledComponents","superappBase","windowsBase","superappEmbed","modalComponents","superappFullpage","profileVisitedLocalStorageKey","handlers","primeHandlers","telemetryEvent","dispatchDedupe","eventName","handleEvent","addOrUpdateTmplProperty","handleUpdateTemplValueCallback","updateTemplValue","customClickHandler","customImpressionHandler","subTypes","eventType","UpperTelemetryType","ContentView","sendPeregrine","sendContentViewEvent","content","isNavigate","primeEventType","originalEvent","destinationUrl","setAttribute","sendActionEvent","renderHybrid","elementTelemetryObject","isVisible","refCallback","isArticlePage","isGalleryPage","isVideoPage","category","vertical","customTelemetryTags","hl","ct","b","convertToHybridTags","finalAttributes","ref","elementRef","findDOMNode","defaults","telemetryTagsObject","addOrUpdateTelemetryObject","parentTelemetryObject","telemetryContract","dynamicContentObject","existingObject","uniqueTelemetryContract","addOrUpdateChild","dispatchTelemetryEvent","telemetryAttributes","dispatchDedupedTelemetryEvent","genericTelemetryClickDispatcher","TelemetryEventNames","genericAction","getHeadlineByReactionType","reactionType","isUndo","getPageContentType","GalleryFullScreen","ArticleFullScreen","Action","genericLoaded","genericHover","TelemetryEventMap","Partial","sendPrime","ReactionToBehaviorTypeMap","dispatchBridgeEvent","bridgeEventName","dispatchEvent","CustomEvent","detail","handleBridgeEvent","customEvent","ReactNativeWebView","BridgeEventNames","signInClicked","saveCachedMyReaction","commentsClicked","openDeepLink","requestBrowser","increaseBackStack","openPopup","closePopup","hasThemeBase","targetTheme","isComponentDisabled","component","AccessibilityHelpers","attachAccessibilityListeners","node","Array","from","getElementsByClassName","addTabIndex","getElementsByTagName","style","addAccessibilityOutlines","simulateMouseClick","targetNode","triggerMouseEvent","clickEvent","createEvent","initEvent","ele","hasAttribute","keyCode","preventDefault","stopPropagation","shouldHaveOutline","focusKeys","createElement","head","isTrusted","innerText","mouseHandlers","querySelector","preventSelection","body","removeNoSelect","once","stopPropagationAndPreventDefault","queryLevels","query","matchMedia","className","client","onChange","listeners","isInitialized","listenMediaQueries","queryLevel","addListener","checkMediaQueryLevel","classNames","responsiveClass","fn","selectContentId","contentIds","cmsId","contentIdKey","contentId","valueList","getFlight","flightId","isValidURL","pageURL","contentURL","whitelist","blacklist","considerURL","whitelistArray","fds","blacklistArray","flag","xmlns","viewBox","fill","plus","thumbs_up","fillRule","clipRule","chevron_down","chevron_up","ellipsis2","trash","shield","tick","close2","exclamation","exclamation_round","check","fillOpacity","maskUnits","y","width","height","mask","clipPath","opacity","typing_animation","cx","cy","attributeName","dur","repeatCount","begin","chevron_left","publisherTabPremium","check_circled","getReactionColorClass","maskPaths","likeMaskImage","loveMaskImage","circleMaskImage","likeMaskImageRTL","loveMaskImageRTL","circleMaskImageRTL","getEmojiStylesByWidth","styles","SocialReactions","getEmojiMask","maskName","renderEmojiByType","socialBarPanelTelemetryContracts","reactionsParent","likeButton","reactionsCount","commentsButton","socialBarPanelTelemetryActionDispatchers","likeButtonClick","commentsButtonClick","likeButtonHover","isHovered","delayCompleted","containerRef","createRef","contentRef","onClickOutside","onLeaveTrigger","escFunction","hoverTriggeredPopover","hide","isHover","shouldMove","disableAutoPosition","onHide","disablePopoverHideHandlers","movePopover","triggerRef","hoverDelay","timeoutId","setState","clickedIsNotTrigger","marginTop","marginBottom","popoverRect","firstChild","getBoundingClientRect","leftDiff","left","rightDiff","right","clientWidth","topDiff","top","botDiff","bottom","clientHeight","translateY","translateX","transform","classList","onMoved","visible","managedClasses","hideOnMobile","hasFocusLock","shouldHideMobile","innerContent","popoverContainer","onClick","onClickInside","onMouseLeave","focusLockStyle","Fragment","display","position","background","miniReactionBreakdownPopover","miniReactionBreakdownContainer","counts","padding","transition","margin","color","maskClassMap","isHoverHandlersAttached","miniReactionBreakdownVisible","isHoverMiniReactionBreakdown","containerClassName","hideLabel","customLabel","reactionCounts","onReactionsClick","hasSeperatorBefore","hasSeperatorAfter","isSuperApp","totalReactionCount","mostReactionKeys","$sum","$count","$0","$1","$","seperatorV","ProfileReactionsLbl","mostReactionsContainer","setReference","el","role","onBlur","setReactionsCountRef","attachHoverHandlers","fontFamily","border","highContrastButton","selectedBackground","selectedText","overflow","likeMask","loveMask","circleMask","reactionMenuTelemetryContracts","container","emojis","reactionMenuTelemetryActionDispatchers","emojiClick","Component","triggerHoverHandler","triggerTouchStartHandler","triggerClickHandler","touchSlideHandler","onSlideStart","touchEnabled","onShow","onSlideEnd","onLongpress","onLongpressEnd","onTouchEnd","onEmojiFocus","onEmojiBlur","remove","registerHandlers","triggerElements","nextProps","dispose","unregisterHandlers","generateOrUpdateTelemetryObjects","reactionMenuPopover","reactionMenuContainer","telemetryObjects","reactionClickHandler","currentTarget","onReaction","lastHiddenTime","setupTriggerAtTouchStart","triggerRefs","setReactionMenuContainer","removeAttribute","rating","reactionMenuVisible","isHoverSocialBarPanel","focusBackRef","reactionMenuTriggerRefs","which","button","currentRating","onCommentsClick","replyLabel","showCommentsButton","reactionMenuClassName","label","reactionsDisabled","socialBarPanelContainer","reactionHandler","onReactionMenuHide","onReactionMenuShow","onLikeBtnClick","EmojiLabellike","activeReactionButton","AriaLabelsOpenReactionPanel","AriaLabelsOpenReplies","onReplyClick","CommentReplyBtn","reactionsParentTelemetryObject","contentSocialBarTelemetryContracts","reactionBreakdown","loaded","socialBarConnector","onSocialBarComponentConnected","disableSuperAppBodyScrollbar","prevProps","markTtvr","users","commentStatus","totalCommentCount","friendRatings","commentWhiteListSegments","commentBlackListSegments","reactionAllowListSegments","reactionBlockListSegments","isReactionsEnabled","reactionCountsVisible","offsetWidth","friendNames","primaryName","Format","SocialBarNamesAndMoreTxt","names","contentSocialBarContainer","contentSocialBarSuperAppContainer","contentReactionPopoversSuperAppContainer","SocialBarCommentsPlural","SocialBarCommentsSingular","commentsClickHandler","popupConnector","cornerPosition","sendContentReaction","contents","RenderErrors","UnknownComponent","BaseExperience","handledProps","checkAndLogReducerError","setupTelemetry","setPrimeHandlers","setupBridge","teardownBridge","requestAnimationFrame","markTimeToVisuallyReady","SocialService","setDomain","setupResponsiveClass","preventSelectionInSuperapp","componentRegex","componentNameResult","componentStack","componentName","reduxResult","isRedux","isPopup","stack","socialProps","propsToPass","unhandledProps","preparePropsToPass","mainContainer","mainSuperAppContainer","mainInSuperappModal","setWindow","styleConnector","defaultProps","experienceName","ExperienceIds","socialBar","CommonStyles","to","font","ToolingInfo","reactComponent","animation","ZIndex","Dialog","ReactionMenuStyles","contentReactionCounts","SocialBarPanelStyles","experienceConfigSchema","defaultMockState","mockState","mockConfig","inspector","SocialCommentActions","SocialCommentInspector","commentDisplayType","specificCommentId","updateSocialCommentState","getSocialCommentConnectorFunctionsWithStateBindings","componentConnector","commentTelemetryContracts","compactStartConversationButton","compactJoinConversationButton","overlayAddCommentButton","overlayStartConversationButton","overlayJoinConversationButton","mobileFloaterButton","overlayComments","sourcePath","activityImages","trophy","commenter","logoImages","facebook","google","microsoft","microsoftText","msNews","placeholderImages","avatar","peopleAvatar","notSocialAvatar","onboardingImages","avatarFallback","contentImageFallback","sortBoxTelemetryContracts","sortItem","sortBoxTelemetryActionDispatchers","genericClicked","listVisible","sortMenuTriggerRef","sortMenuListItemRef","sortItems","getElementById","focus","prev","previousElementSibling","lastElementChild","next","nextElementSibling","firstElementChild","selectedSortType","sortTypes","dontShowLabel","sortBoxContainer","onMouseDown","onLinkClick","CommentSortByTxt","sortBoxPopover","changeSortHandler","onKeyDown","handleKeyDown","openProfilePage","attributes","fullScreen","openEditProfilePage","commentBoxTelemetryContracts","postViolationAI","postHumanReview","sendReply","sendComment","signIn","profileLink","editProfileLink","commentBoxTelemetryActionDispatchers","genericClick","openGuidelinePage","showGuidelines","hideIcon","disabledMessageContainer","title","DisabledMessagesGuidelines","DisabledMessagesInfo","mc","profileEducatorPopover","profileEducator","profileEducatorHeader","profileEducatorMessage","profileEducatorCloseButton","_isMounted","showActions","lastTypedTime","lastBroadcastTypingTime","newCommentVisibleStatus","newCommentErrorMessage","remainingCharsCount","maxCharsLimit","disabledHasClicked","disabled","focused","commentBoxFocusRoot","profileEducatorVisible","shouldRenderProfileEducator","commentBoxRef","signInRef","handleChange","charsCount","broadcastAsTyping","me","isSocialUser","keepCursorInBox","innerHTML","comment","submitCommentAndUpdateState","errorCode","getErrorMessageFromCodes","errorSubCodes","visibleStatus","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","capture","commentBoxType","placeCaretAtEnd","onCommentBoxInitialized","isDisabled","handleSignInClick","clipboardData","getData","execCommand","getRangeAt","insertNode","createTextNode","code","subCodes","maxSubCode","max","isFirstCommenter","isExpired","CommentBoxPlaceholderExpired","CommentBoxPlaceholderAnonymousUser","CommentBoxPlaceholderNewUser","isBanned","CommentBoxPlaceholderBannedUser","nameStatus","CommentBoxPlaceholderNameNotAllow","CommentBoxPlaceholderFirstComment","CommentBoxPlaceholderMsg","CommentBoxPlaceholderReply","NameNotAllowTip","avatarStatus","AvatarNotAllowTip","NameInReviewTip","AvatarInReviewTip","UserBannedTip","AvatarAltText","parentType","parentUser","commentId","avatarUrl","placeholderText","getPlaceholderText","meHasInReviewInfo","meHasNotAllowInfo","isDeleted","isInReview","hasDeniedMessage","userAvatarLink","traceId","bannedViewSelfProfileLink","commentForm","alt","AriaLabelsProfilePicture","onError","contentEditable","listenKeyEvents","placeholder","suppressContentEditableWarning","AriaLabelsCommentBox","commentBoxClickHandler","onPaste","commentBoxPasteHandler","onFocus","handleFocus","onMouseEnter","AriaLabelsDiscardComment","AriaLabelsSendComment","submitComment","CommentBoxButtonSignIn","CommentBoxButtonChangeName","CommentBoxButtonEditProfile","CommentBoxButtonViewProfile","CommentBoxCharsRemaining","CommentBoxCharsLimitReached","NewPostDeniedMsg","NewPostInReviewMsg","deleteMenuTelemetryContracts","yesButton","cancelButton","deleteMenu","deleteMenuTelemetryActionDispatchers","onConfirmDelete","deleteMenuContainer","DeleteMenuDeleteComment","AriaLabelsOpenDeleteCommentMenu","yesHandler","DeleteMenuDeleteCommentConfirm","cancelHandler","DeleteMenuDeleteCommentCancel","reactionPanelTelemetryContracts","socialbarParent","reactionPanelTelemetryActionDispatchers","isHoverReactionPanel","reactionPanelContainer","onMouseMove","onTouchStart","onTouchMove","socialbarParentTelemetryObject","reportMenuTelemetryContracts","reportItem","reportMenu","reportMenuTelemetryActionDispatchers","reportItemClick","usersConnector","fetchMe","reportItems","renderInPopover","renderDefault","renderMobile","reportMenuPopover","AriaLabelsOpenReportCommentMenu","reportMenuContainer","renderReportItems","reportMenuSuperAppContainer","CommentReportText","reportHandler","reportType","reportValue","disableBridge","onReport","reportComment","skip","replies","$i","addedOffline","showMoreReplies","commentConnector","warn","rootParentCommentId","parentId","hideReplyBox","contentDisabled","replyCount","repliesHasPrevious","repliesHasMore","commentItemType","user","moreReplyCount","specificCommentMode","replyListContainer","showReplyBox","loadPreviousComments","SpecificCommentModeSeePreviousRepliesTxt","sortType","loadMoreComments","SpecificCommentModeSeeMoreRepliesTxt","showReplies","SeeMoreRepliesTxt","SeeMoreRepliesPluralTxt","followButtonTelemetryContracts","followButton","followButtonTelemetryActionDispatchers","isFollow","fetchUser","fetchIsUserFollowed","isFollowing","isPrivateProfile","isSelf","isAnonymous","FollowButtonWrapperComponent","FollowButtonTitle","followButtonContainer","followButtonSuperAppContainer","toggleFollow","FollowButtonFollowingText","FollowButtonFollowText","followUser","userCardTelemetryContracts","userCardProfileLink","userCardTelemetryActionDispatchers","hasMouseEnter","userCardAvatarLink","userCardNameLink","postsCount","followersCount","likesCount","userCardPopover","userCardContainer","onMouseOver","mouseEnterHandler","avatarLinkActionHandler","nameLinkActionHandler","UserCardPosts","UserCardLikes","ProfileFollowersLbl","commentItemTelemetryContracts","commentItem","deletedCommentItem","reportedCommentItem","reportButton","deleteButton","guidelinesLink","commentItemTelemetryActionDispatchers","reportMenuVisible","deleteMenuVisible","selectedReportType","userCardVisible","userCardUserId","nowDeleted","messageTruncated","isHoverUserCard","shouldFooterRenderTwoLines","mentionUserCardVisible","messageRef","mentionUser","scrollIntoView","block","checkMessageTruncated","checkContainerWidth","scrollHeight","isMobile","sendCommentReaction","reset","deleteComment","createDatetime","isHidden","mentionUserId","isBlury","isReply","showAvatar","reactionAllowed","isSpecificComment","commentItemContract","userNameLink","mentionUserLink","deletedMessage","commentBody","showMentionUserCard","dangerouslySetInnerHTML","__html","reportedCommentItemTelemetryObject","VisibleStatusInReview","CommentDeletedMsg","CommentItemDeletedUserName","showUserCard","dateTimeStr","monthNames","shortMonthStr","date","nowTs","seconds","floor","toLocaleString","month","getMonth","getDate","getFullYear","getAgoText","CommentItemSeeMore","CommentReactionDisabledMsg","renderReactionsCount","renderReactionPanel","showDeleteMenu","CommentDeleteText","deleteCommentHandler","commentItemDeleteMenuPopover","showReportMenu","replyList","userAvatar","commentItemContainer","commentItemOverlayContainer","commentItemFooterTwoLines","tabIndex","dist","renderReactionPanelParams","replyButtonClickHandler","showSeperator","commentListTelemetryContracts","mainItem","showMoreClicked","comments","showMoreComments","onSortTypeChanged","isExpanded","renderFull","renderMinimal","commentListContent","list","renderCommentItem","moreCommentCount","moreCount","renderCommentSortList","commentListHeader","getSortedComments","hasPrevious","SpecificCommentModeSeePreviousCommentsTxt","hasMore","SpecificCommentModeSeeMoreCommentsTxt","SeeMoreCommentsTxt","SeeMoreCommentsPluralTxt","SeeMoreCommentsBtn","commentItemProps","skipRender","Rating","Time","listenForTypers","setInterval","clearInterval","typingUpdates","noText","myId","displayedTypers","numTypers","typingUsersContainer","TypingUsersImages","TypingUsersText","images","typer","TypingUserImage","displayedTyper","profileImageUrl","user1","typingUserName","YouTypingUserInfo","SingleTypingUserInfo","user2","DoubleTypingUserInfo","user3","TripleTypingUserInfo","PeopleTypingUserInfo","numberOfUsers","UserPlaceHolder","contentPanelTelemetryContracts","renderFullState","renderZeroState","renderMinimalState","contentPanelContainer","contentPanelZeroStateContainer","conversationTitle","typingUserProps","contentPanelMinimalStateContainer","isCommentOverlay","contentPanelOverlayContainer","ContentPanelCommentsTxt","ReferToGuidelinesMsgBefore","ShowGuidelinesLink","ReferToGuidelinesMsgAfter","commentContainerRef","minimalContainerRef","componentEndIndicatorRef","minimalContainerObserver","IntersectionObserver","commentContainerIntersectionHandler","threshold","overlayContainerRef","overlayObserver","commentsLoaded","displayState","isOverlayActive","isCompactFloatButtonVisible","isEntireComponentScrolled","buttonVisibilityTurnedOn","componentIsInView","isHeaderInView","showOverlayCommentsHandler","hideOverlayHandler","commentToBeFetchedCount","onCommentComponentConnect","setTemplValue","isComponentExpanded","toggleSocialCommentState","trackScrolling","prepareData","watchSocialBar","setTmplFor","expandComponent","setFloatingButtonVisibility","isDefault","isOverlay","jumpToCommentsSection","isContainerLoaded","observe","unobserve","renderParams","commmentView","renderOverlay","renderDefaultOrCompact","isInZeroState","displayNotInitialized","activeElement","isCompactFloatMode","buttonName","CommentStartConversation","CommentJoinConversation","commentContainer","commentSuperAppContainer","commentMinimalContainer","commentZeroStateContainer","compactCommentsClickHandler","renderContentDisabledSection","renderContentPanel","renderCommentList","renderDefaultCTAButton","renderOverlayCTAButton","buttonFadeInContainer","buttonFadeOutContainer","contentThumbnailUrl","thumbnail","commentOverlayContainer","commentOverlayActiveContainer","isComponentScrolledDown","ContentCommentsDisabledMsg","isZeroState","buttonText","showCommentsFloatButton","showCompactCommentsHandler","shouldRenderCTAButton","isMobileOrArticleOneBlock","isExistingUser","hasComment","showAddCommentMessage","showProfilePicture","commentsCountLabel","buttonMessage","CommentAddComment","ShowCommentsButtonType","beforeContent","afterContent","onPlayCallback","vids","querySelectorAll","lastClickTime","registerVideoPlayStarted","addCommentsHashToUrl","scrollCommentContainerIntoView","focusToCommentBox","currentHref","history","pushState","replaceState","removeCommentsFromHashUrl","entries","intersectionRatio","commentBox","showButton","preventScroll","isCommentContainerExist","turnOn","isInViewHandler","headerElement","rect","isInView","socialComment","DisabledMessageStyles","FollowButtonStyles","shadow","outline","CommentStyles","ContentPanelStyles","markSize","float","CommentBoxStyles","commentListContentBlury","CommentListStyles","commentVPadding","CommentItemStyles","ReplyListStyles","UserCardStyles","ReactionPanelStyles","ReportMenuStyles","SortBoxStyles","DeleteMenuMenuStyles","TypingUsersStyles","ProfileEducatorStyles","SocialActions","SocialInspector","moduleName","updateSocialState","gradientOverlayDataPromise","gradientOverlayData","publisherSubscribeFollowButtonDataPromise","publisherSubscribeFollowButtonData","getSocialConnectorFunctionsWithStateBindings","popup","manageHistory","initial","onpopstate","setHistoryComponent","getExtension","fileName","pop","AcceptedAttachmentTypes","FileUploadState","FileUploadFailureReason","step2DefaultState","contactInfo","firstName","lastName","email","details","authorizedExample","description","files","formIsValid","validationErrors","firstNameError","lastNameError","emailError","emailSyntaxError","authorizedError","descriptionError","step","fileUploadAction","defaultInvalidMessage","CopyrightFormRequiredField","getErrorValue","field","calculatedErrors","CopyrightFormEmailValidation","hasError","some","fileKey","uploadState","fileId","uploadFailureReason","prevState","fileState","eventTarget","selectedFiles","getFileKey","file","lastModified","updateFileState","waiting","fileExtension","isFileAlreadyHandled","uploadedFileCount","f","uploaded","failed","uploading","uploadCopyrightFile","format","handleValidation","intellectualPropertyReportParams","reportMessage","intellectualPropertyDetails","FirstName","LastName","EmailAddress","AuthorizedExample","AttachedFiles","reportItemType","reportUser","fieldName","step0","step1","copyrightFormContainer","CopyrightFormCheckTxt","CopyrightFormCheckSubTxt","CopyrightFormContentIssueTitle","CopyrightFormUserIDTitle","CopyrightFormCommentIDTitle","renderButtonField","DeleteDataCancel","CopyrightFormYesContinueButton","fileCount","waitingOrUploadingFileCount","acceptedAttachmentTypes","CopyrightFormMainTxt","CopyrightFormMainSubTxt","CopyrightFormContactInfoTitle","renderInputField","CopyrightFormContactInfoFirstName","CopyrightFormContactInfoLastName","CopyrightFormContactInfoEmail","CopyrightFormDetailsTitle","CopyrightFormAuthorizedExample","CopyrightFormAuthorizedExampleSubTxt","CopyrightFormDescription","CopyrightFormDescriptionSubTxt","rows","CopyrightFormAttachments","CopyrightFormAttachmentsSubTxt","multiple","accept","fileSelectHandler","onDrop","CopyrightFormUploadFileButton","click","CopyrightFormFileWaiting","CopyrightFormFileUploading","CopyrightFormFileUploaded","CopyrightFormFileUploadFailed","getFileUploadStateString","failureReason","CopyrightFormFileSizeFailure","CopyrightFormFileFormatFailure","CopyrightFormFileCountFailure","CopyrightFormFileOtherFailure","getFileUploadFailureString","removeFile","CopyrightFormNoFileChosen","CopyrightFormAttachmentsInfoTxt","CopyrightFormResetButton","submitForm","CopyrightFormSubmitButton","inputName","inputValue","handleContactInfoOnChange","btnName","onClick1","btnName1","newFiles","subscriptionContainerId","sdkLoadedResolver","sdkLoaded","initializeSubscriptionSdk","sdkScript","onload","callSdkFunction","init","getSdkEnv","getRequestId","ActivityIdLowerCaseNoHypens","int","int1","intpr","intpef","getSdkUrl","defer","appendChild","subscriptionContainer","ProductType","MsnProductType","EnvList","SubscriptionStatus","functionName","func","xpaySubscription","tileContainerId","ensureRequiredParams","INT","PROD","hasPremiumSubscription","publisherId","getSubscriptionsForPublisher","authToken","subscriptionType","gradientOverlayTelemetryContracts","readFullContentButton","overlayVisible","checkSubscription","subscriptionChecked","subscriptionProductType","Premium","activateComponent","publisherProfileId","hasSubscription","renderCreateSubscriptionPanel","renderCreateSubscription","publisherName","publisherLogoUrl","productType","userProfilePageUrl","userProfileImageUrl","primaryAvatar","onSuccess","reload","gradientOverlayContainer","onButtonClick","overlayButton","OverlayGradientSubscribeText","defaultIds","msaLogin","replyUrl","isSignup","redirectLink","msaLoginWindow","listenMSALoginWindow","close","multiLoginPageTelemetryContracts","main","loginMicrosoft","loginGoogle","loginFacebook","multiLoginPageTelemetryActionDispatchers","loginType","fbClientId","FB","login","authResponse","fields","scope","appId","fbAsyncInit","cookie","fjs","js","parentNode","insertBefore","facebookLogin","googleClientId","loginAndGetPassword","auth2","getEmailFromActiveSession","currentUser","getBasicProfile","getEmail","googleInit","gapi","load","googleLogin","containerTelemetryObject","renderLoginImage","image","multiLoginPageContainer","MultiLoginTitle","loginWith","MultiLoginMicrosoft","MultiLoginGoogle","MultiLoginFacebook","MultiLoginFooterTxt","MultiLoginFooterTerms","MultiLoginFooterPrivacy","openArticlePage","idAndMarket","link","notificationCardTelemetryContracts","closeButton","commentLink","achievement","achievementLink","deletedMessageLink","AchievementTitles","Member","AchievementTitlesMember","Commenter","AchievementTitlesCommenter","Networker","AchievementTitlesNetworker","ConversationStarter","AchievementTitlesConversationStarter","AchievementMessages","AchievementMessagesMember","AchievementMessagesCommenter","AchievementMessagesNetworker","AchievementMessagesConversationStarter","notification","sendContentView","markActivityAsRead","NotificationFollowMessage","userLink","badgeType","NotificationReplyMessage","messageLink","NotificationYourComment","NotificationReactionMessage","isImageClickable","isAchievement","generateTelemetryObjects","notificationImg","AriaLabelsAchievementTrophy","getImageFromNotification","notificationCardContainer","AriaLabelsCloseNotification","closeHandler","getTitleFromNotification","getMessageFromNotification","getContainerTelemetryContract","getMessageLinkTelemetryContract","notificationType","isLoaded","fetchNotifications","fetchNotificationsJobId","alignment","notifications","isLeftAligned","notificationTrayContainer","notificationTrayContainerRightAligned","notificationTrayContainerLeftAligned","AriaLabelsNotificationTray","onboardingPageTelemetryContracts","onboardingPage","onboardingThirdPartyPage","onboardingThirdPartyPageSignIn","onboardingThirdPartyPageCreateAccount","step1Continue","step1EditProfile","step2ThanksPage","step2LetsGo","maxRetryCount","retryCount","createUserInProgress","fetchAndVerifyMeTimerId","fetchAndVerifyMe","createUserErrorMessage","createUser","getCreateUserErrorMessage","OnboardingErrorUnknownMsg","OnboardingErrorNotSignInMsg","OnboardingErrorNotAllowMsg","OnboardingErrorNoNameMsg","OnboardingFailChildMsg","refreshPage","ageGroup","isChild","onboardingStep2TelemetryObject","onboardingUnderagePageContainer","OnboardingUnderageTitle","OnboardingUnderageMsg","OnboardingCloseWindow","hasNotAllowInfo","hasInReviewInfo","isNoName","EditButtonWrapperComponent","onboardingPageContainer","OnboardingTitle","OnboardingSubTitle","OnboardingSuccessMsg","OnboardingReviewImageMsg","OnboardingReviewNameMsg","OnboardingFailImageMsg","OnboardingFailNameMsg","editProfileHandler","OnboardingEditProfile","continueOnboardingHandler","OnboardingContinue","OnboardingOK","OnboardingProceedingText","OnboardingProceedingGuidelines","OnboardingProceedingTermsOfService","OnboardingProceedingPrivacyAndCookies","thanksJoiningTitle","onboardingWelcomePageStep2Container","OnboardingThanksJoiningSubTitle","letsGoHandler","ImgAltsMicrosoftLogo","OnboardingThirdPartyTitle","OnboardingThirdPartySubTitle","signInThirdPartyMsaHandler","OnboardingThirdPartySignIn","createNewMicrosoftAccountHandler","OnboardingThirdPartyCreate","profileManageDataPageTelemetryContracts","clearData","clearDataConfirmation","step0CancelBtn","step0RemoveDataBtn","step1YesRemoveDataBtn","step1CancelDataBtn","DataType","deletingData","activity","stateKey","profileConnector","activityChecked","commentsChecked","reactionsChecked","followChecked","uncheckedOptions","profileManageDataPageContainer","ProfileManageDataDeleteProfileTxt","ProfileManageDataDeleteProfileSubTxt","toggleCheckState","ProfileManageDataDeleteMyActivityTitle","ProfileManageDataDeleteMyActivityTxt","ProfileManageDataDeleteMyCommentsTitle","ProfileManageDataDeleteMyCommentsTxt","ProfileManageDataDeleteMyReactionsTitle","ProfileManageDataDeleteMyReactionsTxt","ProfileManageDataDeleteMyFollowersTitle","ProfileManageDataDeleteMyFollowersTxt","DeleteDataFromCommunity","cancelClickHandler","removeDataClickHandler","DeleteDataRemoveData","DeleteDataConfirmationQuestion","ProfileManageDataDeleteDataMsg","DeleteDataDeleteProfileCancel","submitClearData","DeleteDataDeleteConfirm","publisherSubscribeFollowButtonTelemetryContracts","publisherSubscribeFollowButton","publisherSubscribeFollowingButton","publisherSubscribeSubscribedButton","viewProfileLink","SubscribeButtonStateEnum","buttonConfig","icon","managedClassName","Following","Subscribed","PublisherProfilePageSubscribed","selfRef","isSubscribed","checkSubscriptionAndFollowStatus","alignSelf","subscriptionAndFollowChecked","shouldUseMoreFromPublisherFollowApi","publisherSubscribeFollowButtonConnector","initializePublisherServiceClient","updateFollowStatusFromMoreFromApi","titleWebComponent","publisher","shadowRoot","containerRect","publisherRect","titleWebComponentRect","ltr","containerEnd","publisherEnd","marginRight","marginLeft","currentState","getButtonConfig","publisherPageUrl","isBusinessInsider","publisherSubscribeFollowButtonContainer","renderTelemetryTag","publisherSubscribeFollowButtonViewProfileLink","PublisherSubscribeFollowButtonViewProfileText","redirectToPublisherProfile","unfollowPublisher","followPublisher","getPublisherIsFollowing","isFollowingFetched","reactionBreakdownTelemetryContracts","commentReactionBreakdown","contentReactionBreakdown","tab","reactionBreakdownListItemTelemetryContracts","userNameAndProfilePic","reactionBreakdownTelemetryActionDispatchers","onFollow","rateValue","userName","profilePicture","followClickHandler","activeTab","reactionBreakdownConnector","onReactionBreakdownComponentConnected","onReactionBreakdownComponentDisconnected","tabName","sendTabClickedTelemetry","items","meId","attachUserDataToItem","userState","breakdownWithTabs","itemOfSelf","selfId","a","tabs","otherCount","reactionStrings","ReactionBreakDownOneOtherLoves","ReactionBreakDownSomeOthersLove","ReactionBreakDownOneOtherLikes","ReactionBreakDownSomeOthersLike","ReactionBreakDownOneOtherIsSurprised","ReactionBreakDownSomeOthersAreSurprised","ReactionBreakDownOneOtherIsAngry","ReactionBreakDownSomeOthersAreAngry","ReactionBreakDownOneOtherIsSad","ReactionBreakDownSomeOthersAreSad","ReactionBreakDownOneOtherIsThinking","ReactionBreakDownSomeOthersAreThinking","isContentModerated","activeTabItems","prepareActiveTabItems","moreCounts","capitalize","OtherReactionsItem","getOtherReactionsString","reactionBreakdownContainer","reactionBreakdownSuperAppContainer","ReactionBreakDownTitle","AriaLabelsAllReactions","showTab","ReactionBreakDownTabText","t0","t1","usedProps","PureComponent","moduleTelemetryContract","isRenderedInSuperappModal","isComponentInModal","notificationPosition","componentToRender","switchToComponent","popupTelemetryContracts","closeBtn","popupTelemetryActionDispatchers","popupProps","hideOverlay","hideButtons","contentType","overlayContainer","AriaLabelsPopup","AriaLabelsClosePopupDialogue","closeClickHandler","social","MultiLoginPageStyles","PopupStyles","scrollGradientStyle","NotificationCardStyles","NotificationTrayStyles","screen","ReactionBreakdownStyles","ProfileManageDataPageStyles","OnboardingPageStyles","GradientOverlayStyles","CopyrightFormStyles","publisherSubscribeFollowButtonInactive","publisherSubscribeFollowButtonActive","PublisherSubscribeFollowButtonStyles","fetchScript","hubName","onNewMessage","fetching","signalRHub","signalR","getSignalRConnectionInfo","accessKey","endpoint","accessTokenFactory","connection","HubConnectionBuilder","withUrl","configureLogging","LogLevel","Information","on","signalRConnection","stop","start","hub","commentExists","commentList","TechnicalAttack","Trademark","DataConnector","appealComment","appealMe","appealMyPicture","fetchActivities","activities","onProfilePageComponentConnected","fetchUserFollowers","fetchUserFollowings","fetchUserComments","setProfilePrivate","contentInfo","getAndUpdateContent","notCreated","loadSpecificComment","loadAllComments","getCommentById","commentsBefore","getCommentsByAnchorCommentId","orderBy","commentsAfter","reverse","parentAndItsAround","updateCommentRatings","commentAndItsAround","topCommentsToFetchCount","skippedCommentsCount","getCommentsByContentId","anchorCommentId","loadPrevious","parentCommentId","asc","prepending","lastCommentId","loadCommentsUsingAnchorComment","firstCommentId","getCommentsByParentId","getRating","commentParentId","commentMentionReplyId","handleUserLoginFromState","responseComment","postComment","broadcastCommentNotification","resetRating","rate","saveReactionInSuperAppLocalStorage","localContent","getLocalContent","getContentById","getContent","force","isFetched","isFetching","getUserById","isFollowingFetching","getUserIsFollowed","followers","newMe","following","followingCount","unfollowUser","cachedMyReaction","getFriendRatings","ratings","processRatings","userRecord","links","SocialServiceMapper","convertUser","subType","myAnonReaction","sourceId","getFollowersByUserId","getFollowingsByUserId","getCommentsByUserId","getUserActivities","getUserNotifications","updateReduxStore","updateUserActivityStatus","verify","getRatingBreakdown","newItems","newItem","getUserProfile","isPrivate","updateUserSettings","handleSignalRMessage","lastTypingTime","newComment","createdBy","commentContentId","parentComment","expirationTime","typingUsers","expireTime","isUpdateTypersChanged","broadcastTypingNotification","relativeClass","commentSummary","totalCount","subCommentSummaries","reactionSummary","subReactionSummaries","followSummary","subFollowSummaries","appealActivity","argument","publisherServiceClient","publisherUserAction","getUserPublisherStatus","makeErrorIfUndefined","read","updateNotificationStatus","appealSent","page","prepend","updateCounts","updateTypersIfNeeded","userSkeleton","oldUserState","markCommentAsDeleted","mapAllComments","insertReplies","existingNotifications","newNotifications","notificationList","newNotification","keyA","datetime","keyB","existingActivities","newActivities","activityList","isSeen","mapFunc","mapCommentAndReplies","$comment","Boolean","commentCount","mapAllContents","getDisplayedTypers","typingUserIds","newContents","currentId","newTypingUsers","newComments","existingReplies","newReplies","replyIds","distinctReplies","roots","apps","experienceConfigSocial","experienceConfigSocialBar","experienceConfigSocialComment","RootTelemetryId","TrackInfo","gradientOverlayEnabled","publisherSubscribeFollowButtonEnabled","getPageType","typeAndId","createContainers","pageConfig","newContainer","exp","separator","addSocialBarIntoVideo","addSocialBarIntoArticle","addOverlayCommentContainer","addGradientOverlayContainer","buttonContainer","header","publisherLogo","nextSibling","addPublisherSubscribeFollowButtonContainer","popupContainer","addSocialPopupContainer","renderSocialBar","root","designSystem","parentTelemetry","dataset","socialId","socialMarket","connectComponent","socialExperience","renderRootElement","renderSocialComment","lowerCaseHref","renderSocial","socialModule","renderToContainers","RequestContext","isDarkModeSupported","newStyle","darkModeQuery","backgroundColor","rtl","createPromise","contentUrl","provider","profileId","logo","resetPageBaseInstance","verticalkey","categorykey","findRoots","setupContainers","removeOldContainers","placeHolders","sticky","fixed","gradientOverlay","spaTest","placeholders","removeChild","Mediator","registerSocialActionsUpdatedEvent","stringifyError","tryIncludeErrorStack","logException","errorObj","pageGlobalPb","DynamicBundles","dynamicBundles","bundle","registerExperience","es6Import","hasExperienceRegistered","fetchBlobClient","res","rej","AzureStorage","ApiErrors","ItemTypes","saveLocalContentReaction","localStorageSave","removeItem","myReactionIds","ids","getXPayToken","isPpeEnabled","tokenStorageKey","tokenExpirationStorageKey","storedToken","tokenExpires","valueOf","getXPayTokenInfo","expiresIn","sendAuthHeader","newDomain","endpoints","profile","DELETE","GET","premium","$top","$skip","$orderby","POST","convertUserList","notUserAvatar","postBody","notUseAvatar","PUT","targetId","urlPart","ReportType","ReportMessage","IntellectualPropertyDetails","onlynotification","convertUserActivities","cmsid","isURL","convertContent","convertComment","commentsCDN","commentsObj","convertCommentList","anchorId","ContentId","Body","mentionReply","sasTokenInfo","blobUri","accountUrl","blobService","Blob","createBlobServiceWithSas","sasString","createBlockBlobFromBrowserFile","blobName","forceRate","convertRatingToRateValue","friends","others","convertReactionsResponseToReactionBreakdownData","prepareHubString","requestArgs","authHeader","xhr","cachedResponses","retry","fetchRetry","clearCache","scn","wrapodata","msaAccessToken","fdhead","fetchOptions","credentials","fetchCachedResponse","onRequestError","clone","resourceForUrl","testDomain","systags","setBodyUserSelect","getPointerCoordinatesByEvent","coords","evt","touch","touches","changedTouches","clientX","clientY","isPointerOnElement","pointerCoords","sendBridgeEvent","unlockTouch","callbacks","longPressTimeout","reopenTimeout","slideDisabled","longpressDisabled","listenLongpress","hasLongpressed","isInterrupted","stopLongpress","listenSlideStart","initiateSlide","triggerElement","listenSliding","touchEndHandler","unregisterTriggerEventHandlers","registerTriggerEventHandlers","setupTrigger","enoughTimePassedSinceLastTouchEnd","blur","onTriggerClick","releaseTouchEvents","lastMoveTimeStamp","touchMoveHandler","cancelable","trackingPeriod","onSlide","passive","isHandled","lastTouchEndTime","reactioMenuCallbacks","emojiSelector","reactionMenuSlideHandler","containerElement","virtualTray","hMargin","emojiElementSelector","touchFocusedEmojiElement","reactionMenuRect","yRange","xRange","virtualWidthPerEmoji","matchingEmojiIndex","min","emojiToFocus","expPersistentDataChangeTrackerKey","prerenderedPageReload","prerenderedPageAge","forceReloadFlagName","loggingService","maxRetries","baseRetryDelayInMs","maxRetryDelayInMs","factor","minOffsetInMs","maxOffsetInMs","loggedExceptionManager","LoggedExceptionManager","logInvalidParams","defaultMaxRetries","defaultBaseRetryDelayInMs","maxAllowedRetryDelayInMs","defaultFactor","defaultMinOffsetInMs","defaultMaxOffsetInMs","infoCallback","minTimeout","maxTimeout","serviceCall","requestInfo","tryRequest","maxAllowedRetries","fatal","currentRetry","timeoutServiceRequest","fractionDigit","offset","parseFloat","toFixed","half","plusOrMinus","delayWithOffset","pow","warnCallback","errorCallback","instrumentationService","exponentialBackoffRetry","sendRequest","request","activityName","getInstrumentationService","activityLoggingService","createActivity","OneServiceUtility","serviceRequestOnComplete","getExponentialBackoffRetry","executeRequest","endActivity","activityService","ActivityLoggingService","addAppender","BrowserConsoleAppender","Activity","InstrumentationService","getLoggingService","loadPolyfills","polyfills","IntersectionObserverEntry","loadObserver","observer","referer","resetRequestData","getRequestData","ariaLabelAttribute","rootElementId","htmlElementIds","html","applicationCacheConstants","manifestAttributeName","pagesRefreshData","pagetypeSettings","telemetryId","trackPageProduct","trackPageType","minimumHostPagePathSegments","anonCookieName","appAnonCookieExistsCookieName","childCookieName","nurturingAcceptedStateKey","EnterpriseToConsumerOverrideKey","oneServiceHeaders","authorization","entAuthorization","rpsToken","oneServiceQueryStringKeys","complexInfoPaneEnabled","delta","disableTypeSerialization","infopaneCount","feedLayoutRequestType","parentContentId","parentTitle","queryQ","queryType","qScope","responseSchema","select","session","signInCookieName","timeOut","wrapOData","infoPaneItemCount","newsTop","newsSkip","collectionIds","AriaRoles","DeviceOrientation","CoreLocalStorageKeys","pageVersions","SelectedPivotStorageId","tryParseJson","jsonString","tryParseInt","tryStringifyJson","jsonObj","getLocalStorageInline","localStorage","renderCacheObject","windowAvailable","batchCSS","batchCss","jss","scrapeDom","includeNewsFeed","rivers","outerHTML","getStateFromRenderCache","renderCache","storage","renderCacheKeys","renderCacheStoredKeys","renderCacheKeyOfNormalizedKeys","keyn","expn","frcn","jssn","cacheExpirationTimestamp","parsedCacheExpirationTimestamp","renderCacheStorage","dom","batch_css","getRenderCache","initialState","reduxStoreStringifyReviver","getNormalizedLocationHref","configParamsList","normalizeKeyParamsList","normalizeUrlQsp","getNormalizeKeyParamsList","normalizedParams","setNormalizeKeyParamsList","dataType","PageType","AudienceModeType","SignedInStatus","AccountType","AadAccountType","logger","isAppCache","applicationCache","currentFlights","cookieMapInline","loggingEndpoint","getPageSettings","settingsJson","getCookieInline","cookiePairs","cookieKeyValue","normalizedName","Product","mmx","edge","edgeChromium","hybrid","microsoftNews","office","appErrorId","propertyBag","settingsObject","flightIds","clientInfo","storedHeadData","storedHeadDataString","responseClientSettings","responseFlights","pageGenTime","getCurrentFlights","uploadTime","isProd","cors","apikey","w","anoncknm","getLoggingParameters","iKey","iKeyIndex","getIKeyValue","pageProduct","getCookieConsentRequired","baseData","baseType","product","flight","mkt","extSchema","getLoggingPayload","formatParams","navigator","sendBeacon","_connectorMap","_globalConnectors","_allConnectors","_getDataConnectorPendingPromises","pendingPromise","resolveCallback","rejectCallback","stateChanged","connectorKey","typeIsString","statePropertyKey","connectorState","experienceFullNamespace","dataConnectorName","initializeExperience","isGlobal","merge","connectorReducerResult","computeNextStateForConnector","reportStateChange","fullNamespace","dispatch","connectorPreviousState","nextStateForConnector","subReduce","connectorStateChanged","previousState","reducedState","designSystemMap","designSystemIndexMap","createGenerateClassName","dsKey","dsName","dsIndex","rulesMap","rule","sheet","enhancer","middlewares","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","trace","traceLimit","_rootReducer","needsHydrate","hasPreHydrateState","_store","connectors","onApplicationStart","connectedTopLevelElement","hostElement","bypassJSS","isSSR","updateJssManagerInstance","startMark","hydrate","endMark","widgetElement","jssInstance","plugins","getLocalStorage","safeLocalStorage","parsedObj","matchingKeys","SameSiteValues","getCookie","cookieString","getMuidCookie","setRequireFunctionalCookie","expiryDays","path","secure","sameSiteValue","expiryDate","builder","setTime","toUTCString","Lax","None","canUseDOM","RegionScope","AccessTokenStatus","oneServiceScope","oneServiceFriendlyName","eNtpChromiumVersion","Size1ColumnWidth","Size2ColumnWidth","Size3ColumnWidth","Size4ColumnWidth","Size5ColumnWidth","GutterSize","isNotNullOrUndefined","isDefined","potentialKeyValuePair","isKey","isValue","isNonNullObject","isNotNull","isNullOrWhiteSpace","toNumber","arrayHasData","constructor","objectToString","firstRun","attribute","removeHyphens","input","updateResolverAppErrorsPropertyBag","errorBehavior","CrsFetchTimeout","FallbackResolverAppErrors","createPerfTimeline","ctor","timelineName","addPerfMarks","addPageTimings","async","tryGetPerfTimelineFuncRef","setTryGetPerfTimelineFunc","tryGetPerfTimeline","BrowserType","getStoredHeadDataKey","clientData","initializeHeadData","marketDir","userIsSignedIn","isPreload","isPrerender","isAppcache","isBlendedEnterprise","isMmxWwwContentRequest","isServiceWorkerCache","lastKnownAppVersion","ssoComplete","aadState","headData","initializeFromData","newRidNeeded","lastUsedActivityIdBacking","htmlElement","headElement","initializeFromDom","serviceWorker","controller","initializeFromStorage","initializeLastUsedActivityId","clientSettingsLocaleExists","setQueryItemProvidedValues","headDataJs","headJs","anonckname","signedin","logDocumentVisibility","setIsBlendedEnterprise","setIsMmxWwwContentRequest","getStoredActivityIdKey","storedActivityIdJson","ts","storedHeadDataJson","getStoredHeadData","headDataResponse","setStoredHeadData","setFlights","dataClientSettings","calculateForwardableParams","pageTypeFromSettings","storedVersions","currentDomVersion","logPrefix","currentPageStoredHeadData","populateFromApiResponse","domQueryParams","queryparams","currentPageVersion","lowerCaseParams","availableParams","paramValue","forwardablequeryparams","lastUsedAid","lastUsedActivityId","currentAid","pageGenTimestamp","parseISO","flightString","IsBlendedEnterprise","cmsItem","setCurrentFlightsTestOverride","getHeadData","_secondaryPageTimings","getPageTimings","incrementCounter","counterName","existingCount","getWindowsWidgetMuid","widgetInstance","authenticatorApi","tryGetApi","getProperty","windowsMuid","getOneServiceParamsWithoutAuth","ocidSpecifier","addPageInfoToOcid","flightData","overwriteFlightData","useEntCompliance","OneServiceApiKey","getOneServiceOCID","runningExperiments","bingImageResizerFlight","aadData","Cookie","refererString","Referer","authenticationTicketType","signedInCookieNameHeader","userLocationHeader","serviceRequest","callbackMethod","getOneServiceNonDynamicParamsWithoutAuth","getOneServiceParamsWithAuth","AuthCookieName","getWinWidgetOneServiceHeaders","useAadHeaders","isAadUser","widgetTokenPromise","apiVersion","getToken","getWindowsWidgetToken","setMuidCookie","getOneServiceFeedCallHeaders","SendFeedCallActivityIdInHeader","getLocationParams","customizedLatitude","customizedLongitude","Latitude","Longitude","getBaseRequestData","getCommonParams","addBingImageExP","getCommonParams2","urlContainsOcidParam","searchString","UrlSearchParamsHelper","removeOcidFromUrl","charAt","removeOcidFromRiverCardProviderResponse","cardMetadata","card","cardContent","subItems","subItem","removeOcidFromWindowsOneServiceResponse","cards","subCards","subCard","subSubCard","ErrorBehavior","MilestoneDataActionsImpl","updateHydrationComplete","updateRiverHydrationComplete","updateAboveTheFoldVisuallyReady","updateBelowTheFoldTransitionStart","updateExperienceLoadDeferralState","updateExperienceCurrentState","updateExperiencePublicState","updateExperienceRenderDeferralState","updateInitTiming","updatePageComplete","updatePageRevealStart","updatePageRevealComplete","updateRenderTiming","updateVisuallyReadyTiming","updateStartLoadingTiming","updateDomCompleteTiming","updateMilestonePlugins","unregisterObservers","MilestoneDataActions","ExperienceLoadingState","timeToVisuallyReady","timeToVideoStart","pageRevealStartMarker","messages","logAppError","standbyMessages","getFromWebWorker","defaultResponse","endGetFromWebWorker","standbyMessageData","promiseTimeout","timeOutPromise","webWorkerPromise","webWorker","sendToWebWorker","subscribeWebWorkerNotification","override","_isWebWorkerPresent","onmessage","pendingMessage","webWorkerMessages","cnProdAssets","ENV","spalinkItem","spalinkValues","spalinkDir","initializeHybridPublicPath","requireAsync","defaultModule","require","ExperiencesSharedStateActions","signedInStatus","cookieConsentStatus","oneTrustActiveCookieCategories","useHistory","updateLocation","SubnavTabName","Interests","MyFeed","XFeed","getActionPayload","experienceInstanceId","dispatchAction","observers","actionEndMeasure","getDispatchResult","filterConnector","dispatchConnector","renderActionPayload","connectorInstance","indexToRemove","existObserver","copyrightReportForm","CommonActions","renderExperience","dataConnectorMergeInit","ExperienceState","ChildExperiencesDeferRenderType","staleCallbacks","KeyCounter","timelineCount","getCount","perfTimelineInstances","getInstanceKey","getInstanceKeyCore","configIndexId","parentStore","experienceComponent","$experienceType","gitConfigInfo","cmsConfigInfo","earlyLoadBundlePromises","fullConfig","ConfigProcessor","getChildrenDataConnectorConfigInfos","childConfig","earlyLoadBundles","getChildrenExperienceConfigInfos","isDataConnector","linesRunUntilFailure","uniqueId","configResult","instrumentPromise","loaderPromises","bundlePromise","newExperienceName","oldInstanceKey","rename","newInstanceKey","renamePerfTimeline","bundleModule","initMeasureEnd","updateExperienceLoadedMilestone","experienceNamespace","getExperienceNamespace","experienceParentNamespace","experienceStore","configHref","loadConnector","milestoneDataConnector","experienceConfigInfo","instanceIdOverride","ConfiglessConnectors","BingImageData","TelemetryData","TopSitesLayoutData","PageClickTrackerData","OfficeSharedData","pivotContentV2","childMap","telemetryContext","$experienceGroup","$connectedComponent","$componentInstance","$renderIfOffline","$isStale","$maxWaitToBatchRenderChildExperiences","$milestoneDataConnector","onExperienceMilestoneTimingUpdate","milestoneType","ExperienceMilestoneEventTypes","domComplete","updateTiming","initialized","rendered","visuallyReady","startLoading","staleRevalidationComplete","experienceGroup","experienceInstance","revalidateIfNeeded","isStale","revalidateExperienceStaleState","selectComponentState","namespaceArray","configNamespace","processConfig","setupForPageReveal","childComponentList","componentInstance","ownProps","stateProps","dispatchProps","mnsDashBoardProps","ShowMnsCreatorDashboard","componentToConnect","onLine","onAppErrorCallback","connectMeasureEnd","WrappedComponent","lastRenderEndMeasure","instrumentPerf","mapStateToProps","instrumentFunc","mapDispatchToProps","mergeProps","connectedComponent","pure","experienceInfoList","mergeStartPosition","additionalChildExperiences","ordinalBlockForCurrentColumn","getOrdinalObjectForCurrentBreakpoint","mergeEndPos","childArrangementMetadata","childExpArrangement","positionProps","experienceArrangement","startPosition","insertAt","experienceInfo","childExperienceConfigInfo","initialProps","$connectorProps","experienceTelemetry","loadDataConnectors","injectedDataConnector","injectedDataConnectors","registerInjection","onLoadChildExperiences","newProps","loadChildrenExperiences","childConnectorProps","childExpsToLoadImmediately","reRenderCallback","readyExperienceToRender","child","promiseDependency","startProcessingChildExperience","childConnector","getChildExperienceConnector","addConnectorToChildMap","Failed","childExperienceType","childExperienceInstanceId","staleCallback","mockStalenessConfig","stalenessInfo","isStaleCheckRequired","thresholdMinutes","staleThreshold","loader","getConnectedExperience","getChildExperienceConnectorProps","getNewComponentInstance","milestoneDependencyToLoadChildExp","shouldResolve","addTimeout","deferralType","CustomEventBasedDeferral","Unknown","resolveDependency","loadAndRenderExperience","childExpInfo","delayLoaded","milestoneDependencyToRenderChildExp","ReadyToRender","childExperiencesRenderType","batch","reRenderExperience","dependency","pending","moneyCard","weatherCard","topSitesEdgeNext","backgroundImageEdgeNext","searchBoxEdgeNext","headerEdgeNext","getEnvironmentFromString","FastBreakpointManager","callbackMap","refreshBreakpoints","indexToStandardConverter","currentBreakpoint","defaultBreakpoint","_fastBreakpointManager","managerCallback","fastBreakpointManager","recreate","trackingExperiences","shouldTrackExperience","shouldTrack","IndexedDb","searchObj","endOpen","endOperation","serviceWorkerEnabled","serviceWorkerCacheHelper","cacheNameToPurge","isServiceWorkerActive","cacheNamesToDelete","caches","cacheName","purgeEntryInCache","cacheStorage","cacheEntriesToDelete","cacheEntry","serviceWorkerController","getIsServiceWorkerEnabled","setIsServiceWorkerEnabled","enabled","ServiceWorkerCacheName","AuthCookieExistsCookieName","jssGeneratedClassesMap","jssCaptureCompleted","removeRenderCache","captureJssGeneratedClasses","renderCacheEnabled","serverCache","del","itemCount","httpAgent","httpsAgent","FetchAbortToken","AbortController","abort","signal","abortableFetch","timeoutMs","abortToken","timeout","agent","agentFunc","_parsedURL","setAbortSignal","requestStart","finally","serverFetchInfo","timeElapsed","errorName","errorType","_fullNamespace","selectState","_subspace","addSubReducerForConnector","_configHref","getState","globalConnectors","globalConnector","namespaceParts","connectorType","DeferralEventType","initializeDataConnectorTracker","reportDataConnectorStateChange","ExperienceCompositionTypes","ChildrenTypes","tryAddOrderedTelemetryChild","getOcid","pageMetadata","getPageMetadata","appendOcid","lowerCaseUrl","PerfMarkersGroup","remainingMarkers","remainingSecondaryMarkers","remainingTtvrMarkers","remainingTtprMarkers","ttvrMarkers","ttvrPromise","resolveTtvrCallback","perfMarkerResolveCallback","secondaryPerfMarkerResolveCallback","resolveTtvsCallback","ttprMarkerPromise","resolveTtprCallback","primaryMarkers","secondaryMarkers","markTtf","markTimeNA","setMark","markTtvrRaf","markTtprRaf","startMarker","getSinglePerfMarkStartTimeByName","waitForTtprMarkers","setSecondaryPerfMarkerTime","markerName","existingMarker","getEntriesByName","singleMark","getSecondaryMarkers","markerFullName","getTtvrMarkers","getMarkers","getMarkersWithType","waitForTtvr","getTtfMarkers","markPageTTVR","markerPrefix","includeTTVRWithRefreshDelay","maxValue","refreshDelay","perfMarks","CustomDeferralEventTypes","ExperienceDeferralEventTypes","experienceDeferralDependencyMap","isExperienceDependencyResolved","experienceDependency","deferralEventType","dependents","getMilestoneDataConnector","MilestoneData","getDefaultExperienceInstance","milestones","perExperienceMilestones","experience","perInstanceMilestones","getExperienceLoadDelegate","deferralEventReady","loadAfter","aboveTheFoldVisuallyReady","isAboveTheFoldVisuallyReady","belowTheFoldTransitionStart","isBelowTheFoldTransitionStarted","hydrationComplete","isHydrationComplete","getDeferralLoadEventReadyState","shouldLoad","getDeferralEventMetadata","waitForAboveTheFoldVisuallyReadyAsync","requestPageRevealStartedAsync","pageReveal","isPageRevealStarted","requestPageRevealCompletedAsync","isPageRevealCompleted","getExperienceRenderDelegate","renderAfter","getDeferralRenderEventReadyState","shouldRender","deferralInfo","StandardEventBasedDeferral","createExperienceStateUpdate","createTimingUpdate","PerfTracker","InitialCommonExperienceProps","customField","visuallyReadyTracker","initializedTracker","domCompleteTracker","isStaleRevalidated","startInitializeMilestone","startVisuallyReadyMilestone","startDomCompleteMilestone","incrementExpCount","endDomCompleteMilestone","snapshot","completeStaleRevalidation","needsHydrateLogString","endInitializeMilestone","shouldMarkTelemetryTtvr","aliasName","endVisuallyReadyMilestone","setStart","updateStartTiming","updateEndTiming","markTimeToRevalidateStaleState","shouldMarkPageReveal","tracker","getStart","getEnd","setEnd","renderCounterPrefix","ClarityEnabled","functionalonly_cookie_experience","ValidatorSectionName","apptypeValidator","expValidatorMap","getAllValidators","expConfig","childExpValidatorMap","expMap","originalConfig","tempConfig","validatorName","childExpValidator","validator","validationArgs","expConfigMap","cloneDeep","filterConfig","riverGridChildren","childElems","validatorConfigInfo","validatorConfigExperienceType","childExp","baseExperienceConfig","childrenConfigInfo","dataConnectorForCurrentScreenType","screenTypeObjList","currentColumnArrangement","getMetadataByScreenWidth","OneColumn","TwoColumn","ThreeColumn","FourColumn","FiveColumn","getCompositionIdOverride","composition","compositionOverrides","compositionOverrideResolver","horizontalStack","layout","grid","column","childType","peregrineExperience","row","columns","itemType","customExperience","customConfig","sectionName","removeFromRiverGridChildren","parseQueryString","keyValuePairs","PrimeIntegrationConstants","getActiveTabValue","activeTabValue","navigation","tabNameToTabId","registerForTabChangeEvent","shouldCallCallbackImmediately","sendActiveTabToCallback","_perfMarker","tabIdToTabName","sub","registerContentActionsUpdatedEvent","registerCardActionEnableEvent","initData","registerCardActionPostEvent","postData","registerForFollowButtonClickEvent","followButtonData","topicId","isFollowed","registerForInterestsRenderCompleteEvent","publishEventForPrime","pub","renderUserActionErrorCoachmark","refElement","hideCoachMark","coachMarkId","TabsHelper","tabId","contentData","userData","userListData","commentData","owner","foundUser","foundContent","ownerId","createdTime","commentListData","reactionsResponse","reactionDetails","reactionBreakdownData","ratingData","userActivitiesData","convertUserActivity","baseActivity","createdDateTime","contentLink","reactionLink","targetReactionCounts","targetType","convertSubReactionSummariesToReactionCounts","targetBody","moderationRecordLink","myReaction","topComments","localStorageGet","sampleComments","randomIndex","getSubReactionCounts","myLocalReaction","getLocalContentReaction","totalCommentsCount","username","profileUrl","commentUrl","OneTrustCookieCategory","OneTrustCookieCategoryMapping","C0001","C0002","C0003","C0004","functionalCookies","setCookie","cookieCategory","cookieName","cookieCategoryOverride","currentSharedState","consentStatus","consentProvider","cookieConsentProvider","isSetAllowed","CookieConsent","OneTrustBanner","activeCategories","activeCategory","cookieCategorized","remainingCategories","remainingCategory","isCookieInOneTrustActiveCategory","activeCookieCategories","MSCCBanner","CookieWall","NotRequired","lowerCaseCookieName","isCookieInFunctionalCategory","isSetCookiePermitted","mapper","customHandled","ext","TelemetryContractCoverter","outputObj","mappedValue","WebWorkerMessageId","ExperienceTypes","DHP","NTP","WindowsHP","NewsBar","RiverConfigType","MessageType","MY_REACTIONIDS","MY_REACTION_PREFIX","userInformation","getUserConfig","getAccessToken","isSignedIn","refresh","accessTokenInfo","exception","logErrorMessage","succeed","dataConnectorToExperienceKeyMap","createStatePropertyKey","dataConnectorInjector","experienceSet","appState","experienceStatePropertyKey","initialDataConnectorState","dataConnectorNamespace","newDataConnectorState","experienceKeys","experienceKey","experiencePreviousState","PageUtility","isDhpPage","isNtpPage","EnableFiveColLayout","CookieConsentStatus","CookieConsentProvider","isPrerenderVisible","getCurrentPerformanceTimeStamp","canMatchMedia","maxWidthValues","minWidthValues","minWidth","maxWidth","Infinity","minBreakpoint","maxBreakpoint","getLocationHref","getLocationHostname","getLocationHost","getLocationOrigin","getLocationSearch","getCookieString","getDocumentElementById","elementId","getDocumentElementsByTagName","tagName","getIndexedDB","getInnerHeight","getCssGridSupport","createScriptTag","loadAsync","crossOrigin","scriptElement","NONCE_ID","nonce","getTrackInfo","PerfMarker","endMarkSuffix","measureStartEnd","mark","clearMarks","getPromise","perfMarkers","perfEntries","getEntriesByType","perfMarkerDetail","PerfMarkerDetail","processPerfEntry","measure","perfMarker","duration","perfEntry","firstStartTime","getExperienceType","evalGitOrCmsExperienceInfo","gitId","getConfigId","gitRef","cmsRef","getConfigHref","getConfigIdString","getConfigRefString","processGitConfigInfo","processCMSConfigInfo","processCMSConfigHref","PublisherActions","fetchImpl","followedPublishersEndpoint","publishersServiceEndpoint","actionsServiceEndpoint","userPublisherMutedActionsResponse","getUserActions","publisherMutedActionsMap","publisherDetailsResponse","getPublisherDetails","actionDate","requestParams","getRequestInit","appendQs","publishersResponse","actionType","commonParams","rawResponse","publisherIds","getSapphireQueryParams","features","requestInit","updateBypassValue","skipToJson","sapphireRequest","networkRequest","metadata","blackHexColor","whiteHexColor","DarkModeBackgroundColor","ImageBackgroundColorOffset","isDarkMode","media","Market","TelemetryAttrName","TelemetryContentViewType"],"mappings":"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EAEAC,GAIfvhD,EAAKgiD,MAAQC,EAIZjiD,EAAK2hD,QACNG,EAAWK,eAAeniD,GAG9B,MAAMoiD,EAAehjI,YAAYpqB,MACjC,IAAImzH,EACAhwE,EAAa,EAEjB,OAAO3N,MAAM/0C,EAAKuqG,GACbh9E,KAAMynB,IACH0N,EAAa1N,EAASpb,OACfob,IAEVI,MAAMh+C,IAEH,GADAs7H,EAAWt7H,EACM,eAAbA,EAAItB,KACJ,MAAM,IAAImJ,MAAM,aAAae,+BAAiCosJ,SAElE,MAAM,IAAIntJ,MAAM7H,KAEnBw1J,QAAQ,KACL,IAAK,cAAa,CACd,MAAMC,EAAkB,CACpBV,eAAgB,CACZnsJ,IAAKA,EACL0iD,WAAYA,EACZoqG,aAAcnjI,YAAYpqB,MAAQotJ,GAAcvuB,QAAQ,GACxDuE,QAASypB,EAAUhuB,QAAQ,GAC3B77E,aAAcmwE,GAAYA,EAAShtG,QACnCqnI,UAAWr6B,GAAYA,EAAS58H,KAChC2tF,UAAWivC,GAAYA,EAASztC,KAChC+nE,UAAWt6B,GAAYA,EAAStxF,OAGxC,IAAOkmB,WAAWulG,GAGlBP,GACAnqG,aAAamqG,U,iCCzJ7B,IAAY9wE,EAPZ,kCAOA,SAAYA,GACR,sBACA,4BACA,wBACA,0CACA,gDACA,4CACA,oDACA,wCACA,gCACA,0BACA,4BACA,kCACA,0BACA,kCACA,8BACA,wDACA,8CACA,sCACA,gCACA,wCACA,0BACA,oBACA,8BACA,8BACA,kCACA,0BACA,8BACA,8BACA,wBACA,4BACA,wBACA,4BACA,4CACA,oBACA,sBACA,8BACA,gDACA,wCACA,4CACA,kCACA,oCACA,kCACA,gDACA,gDACA,0BACA,8BACA,0BACA,8BACA,wCACA,wCACA,wBACA,4BACA,4CACA,gDACA,oDACA,gCACA,0BACA,8BACA,gEACA,sCACA,0BACA,8BACA,sBACA,kCACA,kDACA,oDACA,4CACA,wCACA,4CACA,wBACA,0CACA,0DACA,oDACA,4CACA,sCACA,wCACA,0BACA,0CACA,sCACA,4BACA,4DACA,oCACA,8BACA,kDACA,sCACA,0BACA,8BACA,0BACA,8BACA,sCACA,kCACA,sDACA,kCACA,0BACA,kCACA,sCACA,8BACA,8BACA,wCACA,wDACA,4CACA,sDACA,oDACA,4CACA,oDACA,8BACA,gDACA,4CACA,8CACA,kDACA,wCACA,4CACA,oCACA,0CACA,0CACA,8CACA,4DACA,wDACA,0CACA,oDACA,8CACA,wDACA,wDACA,4DACA,8CACA,sDACA,sDACA,0DACA,8CACA,kDACA,sCACA,4CACA,sCACA,0CACA,wCACA,wCACA,4CACA,4BACA,sCACA,wCACA,kCACA,8CACA,0CACA,gCACA,sBACA,4CACA,gDACA,kBACA,4BACA,sCACA,sBACA,wBACA,wCACA,oCACA,0CACA,4BACA,4BACA,4BACA,kCACA,kCACA,8BACA,8CACA,wBACA,wCACA,4CACA,sCACA,8BACA,oBACA,sCACA,kCACA,wBACA,sBACA,0BACA,oBACA,wCACA,4CACA,gCACA,wCACA,sCACA,sBACA,oBACA,4CACA,oCACA,wBACA,gCACA,oCACA,0BACA,kCACA,wBACA,4BACA,sCACA,sBACA,4BACA,sCACA,0CACA,kBACA,oCACA,0CACA,8CACA,kDACA,kCACA,wBACA,oBACA,4CACA,gCACA,oCACA,4BACA,gCACA,8CACA,wBACA,8BACA,kCACA,wBACA,4BACA,wCACA,wBACA,4BACA,8DACA,oCACA,wCACA,oCACA,oCACA,sDACA,4BACA,wCACA,8CACA,YACA,4BACA,4BACA,oCACA,gDACA,4BACA,oCACA,oDACA,wCACA,kDACA,0CACA,sDACA,8BACA,4BACA,gCACA,4CACA,0CACA,oCACA,wCACA,4CACA,8CACA,wCACA,oEACA,wDACA,4DACA,sCACA,0CACA,wCACA,4CACA,4CACA,wBACA,kCACA,wCACA,gBACA,sCACA,oCACA,gCACA,wCACA,4CACA,4BACA,4CACA,wCACA,gDACA,oDACA,wDACA,kCACA,wCACA,0CACA,8BACA,4CACA,gCACA,kDACA,sDACA,8CACA,oCACA,4BACA,8CACA,4CACA,sCACA,0CACA,4CACA,8BACA,8BACA,4CACA,wCACA,4CACA,sBACA,8BACA,wBACA,wBACA,kBACA,wBACA,4BACA,gCACA,gCACA,0BACA,8BACA,wCACA,wBACA,sCACA,0BACA,8BACA,wBACA,8BACA,kBACA,0BACA,0BACA,4BACA,gCACA,kCACA,0CACA,kCACA,sDACA,8BACA,wBACA,4BACA,gCACA,sBACA,gBACA,oBACA,sCACA,sBACA,0BACA,wBACA,sBACA,kCACA,8BACA,sCACA,0CACA,4BACA,gCACA,0BACA,4BACA,8BACA,4BACA,gCACA,0BACA,sDACA,0CACA,oCACA,wBACA,4BACA,8BACA,wBACA,8BACA,0CACA,8BACA,gCACA,8BACA,4BACA,gCACA,sBACA,gBACA,gCACA,gCACA,4BACA,gCACA,oCACA,4BACA,gDACA,0BACA,kCACA,oCACA,4BACA,gCACA,oCACA,8BACA,sCACA,sCACA,oCACA,wCACA,oBACA,4BACA,0DACA,wCACA,0BACA,gBACA,oBAhYJ,CAAYA,MAAa,M,iCCPzB,wFAaA,YAA+B,KASxB,MAAMopC,EAyET,YACoBn9F,EACAwtC,EACAttC,EACAutC,EAChB8pF,EACOt2H,EACAysC,EACSq1E,GAAoB,GAPpB,KAAA/iH,YACA,KAAAwtC,kBACA,KAAAttC,cACA,KAAAutC,UAET,KAAAxsC,SACA,KAAAysC,iBACS,KAAAq1E,WAGhBxwI,KAAKizJ,oBAA6C,IAApBh4F,GAAuD,KAApBA,EAA0BA,EAAkB,IAAMxtC,EAAYA,EAG/HztB,KAAKkzJ,YAAclzJ,KAAKkzJ,YAAYp2J,KAAKkD,MACzCA,KAAKmzJ,UAAY,YAASnzJ,KAAKkzJ,YAAalzJ,KAAKytB,UAAhC,CAA2Cu3H,GAG5DhlJ,KAAKi3C,cAAgBj3C,KAAK+2I,mBAAmBtpH,GAE7CE,EAAYylI,0BAAgDpzJ,MAjEhE,YACI,OAAOA,KAAKmzJ,UAQhB,oBACI,OAAOnzJ,KAAKizJ,eAMhB,mBACI,OAAOjzJ,KAAKi3C,cAMhB,iBACI,OAAOj3C,KAAKqzJ,YAKhB,eAAsBvwJ,GAClB9C,KAAKqzJ,YAAcvwJ,EA4ChB,kBAGH,MAGMstI,EAHuBpwI,KAAK+uB,MAAMukI,WAGJ,IAAmBtmI,mBAKvD,IAAKhtB,KAAKwwI,SAAU,CAEhB,MAAM+iB,EAAmBvzJ,KAAK2tB,YAAY4lI,mBAGV,IAA5BA,EAAiBz5J,QAIjBy5J,EAAiBzyJ,QAAQ0yJ,IACrB,YAAKpjB,EAAgBojB,EAAgB/lI,UAAW+lI,EAAgBxkI,qBAI5E,OAAOohH,EAUJ,sBAMC,YAAYt2E,GAChB,OAAQA,EAAM95D,KAAKytB,WAMf,mBAAmBA,GAEvB,MAAMgmI,EAAiBhmI,EAAUvsB,MAAM,MAChCwyJ,GAAiBD,EAGlBz4F,EAAay4F,EAAeA,EAAe35J,OAAS,GAG1D,OAAO,YAAmB45J,EAAe14F,M,iCC1KjD,IAAY24F,EAXZ,kCAWA,SAAYA,GAIR,+DAKA,2DATJ,CAAYA,MAAiB,M,gCCX7B,oEAMA,MAAMvE,EAA6E,GACnF,IAAI5hI,EAMG,SAASomI,EAA+BhmI,GAC3CJ,EAAmBI,EAkChB,SAASimI,EAA+BvjB,EAA2Bh0E,GACtE,MAAMijE,EAA0C6vB,EAAY9e,GAC5D,GAAI/Q,GAAajjE,EACb,IAAK,MAAM/8D,KAAYggI,EACnBhgI,EAAS+8D,K,iCC/CrB,IAAYgsF,EALZ,kCAKA,SAAYA,GAKR,iCAKA,qBAKA,iCAMA,2BAKA,6DAKA,qCAKA,mCApCJ,CAAYA,MAA6B,M,iCCHzC,IAAYwL,EAFZ,kCAEA,SAAYA,GACR,cACA,oCACA,kBACA,gCACA,sCALJ,CAAYA,MAA0B,M,iCCGtC,IAAYC,EALZ,kCAKA,SAAYA,GAIR,gCAIA,kBAKA,oBAKA,4CAKA,0BAKA,kDA5BJ,CAAYA,MAAa,M,iCCLzB,2HAaO,SAASC,EAA4B1rH,EAA6BykH,GACrE,GAAIzkH,EAAQ,CACR,MAAMigC,EAAoB,CACtBnhC,KAAM,IAAcvS,OACpB/4B,KAAMixJ,EACNrmF,QAAS,IAGb,OAAOp+B,EAAOqgC,iBAAiBJ,GAGnC,OAAO,KAOJ,SAAS0rF,IACZ,IAAK,IACD,OAGJ,MAAMC,EAAe,IAAUC,kBAE/B,OAAKD,GAAiBA,EAAa7rH,UAAa6rH,EAAa7rH,SAAS0pF,KAI/DmiC,EAAa7rH,SAAS0pF,KAAKh9E,UAJlC,EAYG,SAASq/G,EAAWpuJ,GACvB,MAAM+uC,EAAOk/G,IACPI,EAAeruJ,EAAIa,cACzB,IAAKkuC,IAA2C,GAAnCs/G,EAAa/iI,QAAQ,YAAsD,GAAnC+iI,EAAa/iI,QAAQ,UACtE,OAAOtrB,EAEX,MAAMo8B,GAA8B,GAArBp8B,EAAIsrB,QAAQ,KAAc,IAAM,IAC/C,MAAO,GAAGtrB,IAAMo8B,SAAavR,mBAAmBkkB,O,iCCzDpD,kPAsBYu/G,EAtBZ,uCA2BA,IAAIC,EACAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EAGAC,EAEAC,EAGAC,EAEAC,EACAC,GAvBJ,SAAYZ,GACR,oBACA,wBAFJ,CAAYA,MAAgB,KA0B5B,IAAIa,EAAsC,IAAI9nI,IAG1C+nI,EAAwC,IAAI/nI,IAiBzC,SAASgoI,EAAQv5J,EAAO,GAAIw5J,GAAa,EAAOplI,GACnD,GAAI,cAEA,OAAOqlI,EAlBG,OAkBgBz5J,EAAMw5J,EADhCplI,EAAOA,GAAQ1yB,OAAOmyB,YAAYpqB,OAYnC,SAASo4E,EAAS7hF,EAAO,GAAIw5J,GAAa,EAAOplI,GACpD,GAAI,cAEA,OAAOqlI,EA/BI,QA+BgBz5J,EAAMw5J,EADjCplI,EAAOA,GAAQ1yB,OAAOmyB,YAAYpqB,OAYnC,SAASiwJ,EAAY15J,EAAO,GAAIw5J,GAAa,EAAOplI,GACnD,gBACAA,EAAOA,GAAQ1yB,OAAOmyB,YAAYpqB,MAClC/H,OAAOuiF,sBAAsB,KACzBl4B,WAAW,KACP81B,EAAS7hF,EAAMw5J,EAAYplI,IAC5B,MAWR,SAASulI,EAAY35J,EAAO,IAC/B0B,OAAOuiF,sBAAsB,KACzBl4B,WAAW,KACP,MAAM6tG,EAAcC,EAAiC,KAC/CzlI,GAAwB,IAAjBwlI,GACN,EACD/lI,YAAYpqB,MAAQmwJ,EAE1BH,EAjEO,QAiEaz5J,GAAM,EAAOo0B,IAClC,KAGF+kI,GAmUF,WAGH,IAAK,cACD,OAAO,KAGX,GAAIA,EACA,OAAOA,EAGXA,EAAoB,IAAIx5J,QAA4BC,IAChDw5J,EAAsBx5J,IA7UtBk6J,GAqCD,SAASC,EAA2BC,EAAoB5lI,GAE3D,GAAIklI,EAAiBj5J,IAAI25J,GACrB,OAGJ,MAAMC,EAAiBpmI,YAAYqmI,kBAAoBrmI,YAAYqmI,iBAAiBF,GAChExiC,QAAQyiC,GAAkBA,EAAej8J,QAWzDs7J,EAAiBlvJ,IAAI4vJ,EAAYj3J,KAAKsiC,MAAM40H,EAAe,GAAG70H,aAR9D,IAAW+0H,WAAWH,GAElB,4BAAkB5lI,GAClBklI,EAAiBlvJ,IAAI4vJ,GAAa,GAElCV,EAAiBlvJ,IAAI4vJ,EAAYj3J,KAAKsiC,MAAMjR,KAOhDskI,GAA6BA,EAA0BrwG,OAAO2xG,IAAkD,IAAnCtB,EAA0BrxG,MAAc4xG,GACrHA,EAAmCmB,KAW3C,SAASX,EAAQ5zJ,EAAgB7F,EAAcw5J,EAAqBplI,GAChE,IAAMp0B,IAAQA,EAAKhC,OACf,OAGJ,IAAM6H,IAAUA,EAAO7H,OACnB,OAGJ,MAAMq8J,EAAiBx0J,EAAS7F,EAGhC,GAAIq5J,EAAeh5J,IAAIg6J,GACnB,OAGJ,MAAMJ,EAAiBpmI,YAAYqmI,kBAAoBrmI,YAAYqmI,iBAAiBG,GAChE7iC,QAAQyiC,GAAkBA,EAAej8J,QAWzDq7J,EAAejvJ,IAAIiwJ,EAAgBt3J,KAAKsiC,MAAM40H,EAAe,GAAG70H,aARhE,IAAW+0H,WAAWE,GAElBb,EACAH,EAAejvJ,IAAIiwJ,GAAiB,GAEpChB,EAAejvJ,IAAIiwJ,EAAgBt3J,KAAKsiC,MAAMjR,KAOlDukI,GAAwBA,EAAqBtwG,OAAOgyG,IAAiD,IAA9B1B,EAAqBtxG,MAAc0xG,GAC1GA,EAAoBuB,KAIpB7B,GAAoBA,EAAiBpwG,OAAOgyG,IAA6C,IAA1B5B,EAAiBpxG,MAAc2xG,GAC9FA,EAA0BuB,KArLf,UAyLX10J,GAAyBqzJ,GACzBA,EAmWGsB,EA7hBQ,QA6hBuB,MA5hBvB,UA6LX30J,GACG+yJ,GACAA,EAAqBvwG,OAAOgyG,IACE,IAA9BzB,EAAqBvxG,MAAc+xG,GACtCA,EAAoBmB,KAyHrB,SAASE,IAGZ,OAAK,cAKD3B,IAIAH,GAAsD,IAA9BA,EAAqBtxG,KACtC1nD,QAAQC,QAAQ06J,MAI3BxB,EAAc,IAAIn5J,QAA4BC,IAC1Cm5J,EAAsBn5J,IAGnBk5J,IAjBI,KA+GR,SAASyB,IAKZ,MAFmC,IAFfD,OACDI,KA0BhB,SAASN,IACZ,MAAMv7J,EAA6B,GAMnC,OAJAy6J,EAAiBt0J,QAAQ,CAACvE,EAAeM,KACrClC,EAAOP,KAAK,CAACyC,EAAKN,MAGf5B,EAwDX,SAAS67J,IACL,OAAOF,EA5gBO,QAqhBlB,SAASF,EAAeK,GAAe,GACnC,OAAOH,EArhBQ,QAqhBuBG,EAAe,IAAsB,KAAMA,GAmBrF,SAASH,EAAmBI,EAAsBZ,EAAqBa,GACnE,MAAMh8J,EAA6B,GACnC,IAAIi8J,EAAW,EAkBf,GAjBAzB,EAAer0J,QAAQ,CAACvE,EAAeM,KAC/BA,EAAImE,WAAW01J,KACf/7J,EAAOP,KAAK,CAACyC,EAAKN,IAGdA,EAAQq6J,KAAc/5J,EAAImE,WAAW,SAAW2zJ,EAAY54G,IAAIl/C,MAChE+5J,EAAWr6J,MAMnBu5J,GACAn7J,EAAOP,KAAK,CAAC07J,EAAYc,IAIzBD,GAA+Bb,IAAe,IAAqB,CACnE,MACMe,EADc,cACmC,cAAK,EAC5Dl8J,EAAOP,KAAK,CAAC,wBAAyBw8J,EAAWC,IAGrD,OAAOl8J,EAgCJ,SAASg7J,EAAiCG,GAC7C,MAAMgB,EAAYt5J,OAAOmyB,YAAYqmI,iBAAiBF,GACtD,OAAIgB,GAAaA,EAAU,IAAMA,EAAU,GAAG51H,UACnC41H,EAAU,GAAG51H,WAGhB,I,0TCvpBA61H,EAYAC,E,SAZZ,SAAYD,GAKR,iEALJ,CAAYA,MAAwB,KAYpC,SAAYC,GAIR,oCAIA,uBAIA,2BAIA,kCAIA,sCAIA,8DAIA,iEAIA,6CAhCJ,CAAYA,MAA4B,KAsCiB,IAAI3pI,IAAI,CAC7D,CAACwzH,EAAA,EAAuBvjE,OAAQ05E,EAA6B15E,QAC7D,CAACujE,EAAA,EAAuB6H,SAAUsO,EAA6BtO,UAC/D,CAAC7H,EAAA,EAAuB0H,YAAayO,EAA6BzO,aAClE,CAAC1H,EAAA,EAAuB8H,cAAeqO,EAA6BrO,iB,yDCpCjE,IAAIsO,EAAqE,IAAI5pI,IAgB7E,SAAS6pI,EAA+BC,EAA8BC,GAEzE,MAAMC,EAAaJ,EAAgC96J,IAAIg7J,GACvD,OAAQE,GACDA,EAAWz0C,cAAgBw0C,EAdtC,YAAsB,KAClBH,EAAkC,IAAI5pI,MCZnC,SAASiqI,IACZ,OAAO97F,EAAA,EAAS9tC,cAAcC,YAAYE,UACtCitC,EAAA,EAAoBy8F,eAQrB,SAASC,EACZxpI,GAEA,MAAMH,EAAYypI,IAElB,IAAKzpI,EACD,OAGJ,MAAM4pI,EAAa5pI,EAAUmB,kBAAkB0oI,wBACzCC,EAAaF,GAAcA,EAAWt7J,IAAI6xB,GAChD,IAAI4rB,EAMJ,OAJI+9G,IACA/9G,EAAW+9G,EAAWC,sBAAsBz7J,ICvCd,YD0C3By9C,EAQJ,SAASi+G,EACZ7pI,GAGA,MAAM4rB,EAA6C49G,EAA6BxpI,GAGhF,IAAK4rB,GAmKT,SAAwCA,GAEpC,IAAIk+G,EAEJ,OAAQl+G,EAASm+G,UAAU1xF,WACvB,KAAK2wF,EAA6BgB,0BAC9BF,EAAqBG,IACrB,MAEJ,KAAKjB,EAA6BkB,4BAC9BJ,EAAqBK,IACrB,MAEJ,KAAKnB,EAA6BoB,kBAC9BN,EAAqBO,IACrB,MAEJ,QACIP,EAAqBZ,EAA+Bt9G,EAASm+G,UAAU/pI,eAAgB4rB,EAASm+G,UAAU1xF,WAGlH,OAAOyxF,EAxLUQ,CAA+B1+G,GAC5C,OAAO,KAGX,GAAIA,EAAS2+G,YAAc3+G,EAASm+G,UAAW,CAG3C,MAAO,CAAEjK,aADiB0K,EAAyB5+G,EAASm+G,WAClBnK,cAAeh0G,EAAS2+G,YAGtE,OAAO,KAUJ,SAASE,IAGZ,OAF+BnB,IAM3BW,IACOx8J,QAAQC,UAGZ,IAAID,QAAQC,IACf,IAAqBkkJ,gCAAgChkF,iBAAmB30B,IACpEvrC,QATGD,QAAQC,UAqBhB,SAASg9J,IACZ,MAAMzR,EAAyBqQ,IAE/B,OAAK,IAASloI,aAAgB63H,EA2LlC,WACI,MAAMp5H,EAAYypI,IAElB,IAAKzpI,EACD,OAAO,EAGX,MAAM,WAAE8qI,GAAe9qI,EAAUmB,kBACjC,OAAOskG,QACHqlC,ICxSwB,IDySrBA,EAAWz3H,WAjMd03H,GACOn9J,QAAQC,UAGZ,IAAID,QAAQC,IACf,IAAqB0kJ,sBAAsBxkF,iBAAmB30B,IAC1DvrC,QATGD,QAAQC,UAqBhB,SAASm9J,IACZ,MAAM5R,EAAyBqQ,IAE/B,OAAK,IAASloI,aAAgB63H,EAmLlC,WACI,MAAMp5H,EAAYypI,IAElB,IAAKzpI,EACD,OAAO,EAGX,MAAM,WAAE8qI,GAAe9qI,EAAUmB,kBACjC,OAAOskG,QACHqlC,ICzTwB,ID0TrBA,EAAWl3H,SAzLdq3H,GACOr9J,QAAQC,UAGZ,IAAID,QAAQC,IACf,IAAqB2kJ,yBAAyBzkF,iBAAmB30B,IAC7DvrC,QATGD,QAAQC,UAuChB,SAASq9J,EACZ/qI,GAGA,MAAM4rB,EAA6C49G,EAA6BxpI,GAGhF,IAAK4rB,GAuET,SAA0CA,GAEtC,IAAIk+G,EAEJ,OAAQl+G,EAASo/G,YAAY3yF,WACzB,KAAK2wF,EAA6BgB,0BAC9BF,EAAqBG,IACrB,MAEJ,KAAKjB,EAA6BkB,4BAC9BJ,EAAqBK,IACrB,MAEJ,KAAKnB,EAA6BoB,kBAC9BN,EAAqBO,IACrB,MAEJ,QACIP,EAAqBZ,EAA+Bt9G,EAASm+G,UAAU/pI,eAAgB4rB,EAASo/G,YAAY3yF,WAGpH,OAAOyxF,EA5FUmB,CAAiCr/G,GAC9C,OAAO,KAGX,GAAIA,EAASs/G,cAAgBt/G,EAASo/G,YAAa,CAG/C,MAAO,CAAElL,aADiB0K,EAAyB5+G,EAASo/G,aAClBpL,cAAeh0G,EAASs/G,cAGtE,OAAO,KAwFX,SAASjB,IACL,MAAMpqI,EAAYypI,IAElB,IAAKzpI,EACD,OAAO,EAGX,MAAM,0BAAEmqI,GAA8BnqI,EAAUmB,kBAChD,OAAOskG,QACH0kC,ICvRwB,IDwRrBA,EAA0Bv2H,SAyCrC,SAAS02H,IACL,MAAMtqI,EAAYypI,IAElB,QAAKzpI,GAIEA,EAAUmB,kBAAkBkpI,4BAQvC,SAASM,EAAyBW,GAC9B,OAAOA,EAAa9yF,aAAa0wF,EAC3B,IAAkBhJ,yBAClB,IAAkBqL,2BAM5B,SAASf,IACL,MAAMxqI,EAAYypI,IAElB,QAAKzpI,GAIEA,EAAUmB,kBAAkBopI,kBAgChC,SAASiB,EACZrrI,EACA40F,EACAkmC,EACAC,GAGA,MAAO,CACH/6H,iBACA40F,eACAkmC,kBACAC,sBAYD,SAASuQ,EACZtrI,EACA86H,EACAC,EACA7nH,EACAO,GAGA,MAAO,CACHzT,iBACA86H,kBACAC,qBACA7nH,YACAO,a,wIEzaD,MAAM83H,EAAb,cAGY,KAAA93H,SAAW,EAGX,KAAAP,WAAa,EAKd,cACH,IAAIvmC,GAAU,EAKd,OAJwB,IAApBqF,KAAKkhC,YAAsC,IAAlBlhC,KAAKyhC,UAC9B9mC,EAASqF,KAAKyhC,QAAUzhC,KAAKkhC,WAG1BvmC,EAMJ,SACH,OAAOqF,KAAKyhC,QAMT,WACH,OAAOzhC,KAAKkhC,UAMT,SACHlhC,KAAKyhC,QAAU9R,YAAYpqB,MAMxB,WACHvF,KAAKkhC,UAAYvR,YAAYpqB,O,qCC1BrC,MAAMu7B,EAAc,cAqDP04H,EAA+B,CACxCj4E,oBAAgBhjF,EAChBk7J,iBAAal7J,EACb48D,oBAAgB58D,EAChB6pJ,uCAAmC7pJ,EACnC0qJ,aAAS1qJ,GAON,MAAM,UAAgC,IAoBzC,YAAY27D,EAAwDqB,GAChEzkB,MAAMojB,GAnBA,KAAAw/F,qBAAoC,IAAIH,EAKxC,KAAAI,mBAAkC,IAAIJ,EAGtC,KAAAK,mBAAkC,IAAIL,EAGxC,KAAAM,oBAAqB,EAUzB75J,KAAK85J,2BACL95J,KAAK+5J,8BACL/5J,KAAKg6J,4BAGLh6J,KAAKi6J,kBAAkB,IAMpB,oBAEHj6J,KAAKk6J,0BAaF,mBACHx8E,EACA6sB,EACA4vD,GAIAn6J,KAAKk6J,0BAGLl6J,KAAKo6J,4BAQF,SACH,GAAI,cAAa,CACb,MAAMC,EAAgC,GAAK78J,OAAO40I,aAClD,IAAO1zI,IAAI,aAAcsB,KAAKk6D,MAAgCqnB,iCAAiC84E,KAInGr6J,KAAKs6J,yBACLt6J,KAAKg6J,4BAGLh6J,KAAKi6J,kBAAkB,UASpB,wBAAwBM,EAAkCrqI,EAAesqI,GACxED,IACYh8J,MAAR2xB,IACAA,EAAO1yB,OAAOmyB,YAAYpqB,OAE9B,YAASvF,KAAKk6D,MAAMqnB,gBAAgB,EAAOrxD,GACvCsqI,GACA,YAASA,GAAW,EAAOtqI,IAInClwB,KAAKy6J,4BAOF,qBAAqBD,GACxB,MAAMh+J,EAAIgB,OAAOmyB,YAAYpqB,MAC7B,YAASvF,KAAKk6D,MAAgCqnB,gBAAgB,EAAO/kF,GACjEg+J,GACA,YAAQA,GAAW,EAAOh+J,GAOxB,oBACN,GAAI,IAAestJ,wBAAyB,CAKxC,MAJiC,CAC7B,mBAAoB9pJ,KAAKk6D,MAAM,oBAC/B,uBAAwBl6D,KAAKk6D,MAAM,yBAIvC,OAAO,KAKL,2BACNl6D,KAAK25J,mBAAmBe,WACxB16J,KAAK26J,kBAAkB36J,KAAK25J,mBAAoBrR,EAAA,EAA8BG,aAIxE,yBACNzoJ,KAAK46J,gBAAgB56J,KAAK25J,mBAAoBrR,EAAA,EAA8BG,aAItE,8BACNzoJ,KAAK26J,kBAAkB36J,KAAK05J,qBAAsBpR,EAAA,EAA8BK,eAI1E,4BACN,MAAM,QAAEM,GAAYjpJ,KAAKk6D,MACzB,GAAI+uF,IAAYjpJ,KAAK65J,mBAAoB,CACrC75J,KAAK65J,oBAAqB,EAC1B75J,KAAK66J,iCAEL,MAAM,kCAAEzS,GAAsCpoJ,KAAKk6D,MAC/CkuF,GACAA,EAAkCE,EAAA,EAA8BO,4BAMlE,4BACN7oJ,KAAK46J,gBAAgB56J,KAAK05J,qBAAsBpR,EAAA,EAA8BK,eAIxE,4BACN3oJ,KAAK26J,kBAAkB36J,KAAK45J,mBAAoBtR,EAAA,EAA8BC,aAIxE,0BACNvoJ,KAAK46J,gBAAgB56J,KAAK45J,mBAAoBtR,EAAA,EAA8BC,aAOxE,+BAA+BuS,GAAuB,GACtDA,GACA,YAAY96J,KAAKk6D,MAAMqnB,gBASvB,kBAAkBw5E,EAAsB10F,GAE5C00F,EAAQL,WAER,MAAM,kCAAEtS,GAAsCpoJ,KAAKk6D,MAC/CkuF,GACAA,EAAkC/hF,EAAW00F,EAAQC,YASrD,gBAAgBD,EAAsB10F,GAE1C,IAA0B,IAAtB00F,EAAQE,SACR,OAGJF,EAAQG,SAER,MAAM,kCAAE9S,GAAsCpoJ,KAAKk6D,MAC/CkuF,GACAA,EAAkC/hF,OAAW9nE,EAAWw8J,EAAQE,UAU9D,kBAAkBvE,GAGxB,IAAK51H,GAAeA,EAAkB,KAClC,OAGJ,YAAiB,OAAO41H,UAExB,MAAMyE,EAAuBn7J,KAAK61I,YAAuDslB,oBACrFA,GACA,YAAiB,OAAOA,IAAsBzE,UAQ5C,eAGN,OAAI,IAAe0E,gBAAmB,IAAS39H,gBAAmB,IAASoN,eAAewwH,iCAKnF,GAJI,CACH,qBAAqB,M,uEClTzBC,E,oCAAZ,SAAYA,GAIR,wCAJJ,CAAYA,MAAoB,K,uCCKzB,MAAM,EAmBF,4BAA4BC,GAC/Bv7J,KAAKw7J,gBAAkBD,EAAiBE,mBAUrC,qBAAqBC,EAAsCjuI,GAC9D,IAAKztB,KAAKw7J,iBAAmBx7J,KAAKw7J,gBAAgBr4G,KAAO,IAAMu4G,IAAcA,EAAUC,qBACnF,OAAOD,EAGX,MAAME,EAA6DF,EAAUC,qBAC7E,IAAIE,EAA4C,KAC5CC,EAAwC,KAE5C,IAAK,MAAMC,KAAiBH,EAAQ,CAChC,MAAMI,EAAoBJ,EAAOG,GACjC,GAAI/7J,KAAKw7J,gBAAgBz/G,IAAIggH,GAAgB,CACvB/7J,KAAKw7J,gBAAgBr/J,IAAI4/J,EACpBE,CAAUD,EAAkBE,kBAG5B,OAAfJ,IAEAA,EAAa97J,KAAKm8J,aAAahgK,IAAIsxB,IAAciuI,GAI9B,OAAnBG,IACAA,EAAiB,OAAAO,EAAA,GAAUN,IAG/BJ,EAAY17J,KAAKq8J,aAAaL,EAAmBF,KAa7D,OARID,EACA77J,KAAKm8J,aAAaj2J,IAAIunB,EAAWouI,GACX,OAAfC,GAAuB97J,KAAKm8J,aAAapgH,IAAItuB,KAGpDiuI,EAAY17J,KAAKm8J,aAAahgK,IAAIsxB,IAG/BiuI,EAUH,mCAAmCM,EAA6CN,GAGpF,MAAMY,EAAoBZ,EAAUY,kBAkBpC,OAjBIA,GACAA,EAAkBx7J,QAAQ2xB,IACtB,MAAM8pI,EAAa9pI,EAAQooC,SAC3B,GAAI0hG,EAAY,CACZ,MAAMC,EAAsBR,EAAkBvQ,0BACxCgR,EAAgC,YAAkBD,GACxD/pI,EAAQooC,SAAW0hG,EAAWnyH,OAAQsyH,IAClC,MAAM3uI,EAAa2uI,EAASjR,0BAC5B,OAAQ19H,IACAyuI,GACDA,EAAoBxhG,aAAejtC,EAAWitC,YAC9CyhG,IAAkC,YAAkB1uI,QAMpE2tI,EASJ,2CAA2CiB,GAC9C,MAAMC,EAAkD,GAExD,GAAID,GAAwBA,EAAqBliG,gBAAkBkiG,EAAqBliG,eAAe3gE,OAAS,EAAG,CAC/G,MAAM+iK,EAAoC,EAAgB7R,qCAAgE2R,EAAqBliG,gBAE3IoiG,GAAqCA,EAAkChiG,UAAYgiG,EAAkChiG,SAAS/gE,OAAS,GACvI+iK,EAAkChiG,SAAS/5D,QAAQ+sB,IAC/C+uI,EAAmBxiK,KAAKyzB,KAKpC,OAAO+uI,EAUJ,gCAAmCliG,EAA0BoiG,GAShE,OAPIA,EAAkBv8G,KAAK7+C,GACnBA,EAAIg5D,cAAgBA,IAErBoiG,EAAkBv8G,KAAK7+C,GACtBA,EAAIg5D,cAAgBC,EAAA,EAAYC,KAYrC,4CAA+CkiG,GAClD,OAAQ,cAAwBC,0BAC5B,KAAK,IAAkBn3H,GACnB,OAAO,EAAgBo3H,yBAAyBriG,EAAA,EAAYsiG,UAAWH,GAE3E,KAAK,IAAkBj3H,GACnB,OAAO,EAAgBm3H,yBAAyBriG,EAAA,EAAYuiG,UAAWJ,GAE3E,KAAK,IAAkBh3H,GACnB,OAAO,EAAgBk3H,yBAAyBriG,EAAA,EAAYwiG,YAAaL,GAE7E,KAAK,IAAkB/2H,GACnB,OAAO,EAAgBi3H,yBAAyBriG,EAAA,EAAYyiG,WAAYN,GAE5E,KAAK,IAAkBz3H,GACnB,OAAO,EAAgB23H,yBAAyBriG,EAAA,EAAY0iG,WAAYP,GAE5E,QACI,OAAO,EAAgBE,yBAAyBriG,EAAA,EAAYC,IAAKkiG,IAYtE,mCAAmCH,EAAiDvhG,GACvF,MAAM,yBAAEkiG,GAA6BliG,GAAkB,IACjD,YAAEmiG,EAAW,qBAAEC,GAAyBb,EAC9C,OAAOa,GAAwB,qBAAWF,IAA6BE,EAAqBF,MAA+BC,EAUxH,wCAAwCZ,EAAiDvhG,GAC5F,MAAMwhG,EAAkD,GAGxD,GAAID,GAAwBA,EAAqBY,YAAa,CAE1D,MAAMA,EAAc,EAAgBE,4BAA4Bd,EAAsBvhG,GAEtF,OAAQmiG,EAAYn2H,MAChB,KAAK0sH,EAAA,EAA2B4J,gBAChC,KAAK5J,EAAA,EAA2B6J,OAGPJ,EAGRxrC,KAAKl3D,SAAS/5D,QAAQ88J,SAGTr/J,IAAlBq/J,EAAK/iG,UAKT+iG,EAAK/iG,SAAS/5D,QAAS+8J,IAGnB,IAAKA,EAAOhjG,SACR,OAKJ,MAAM,UAAEijG,GAAcD,EAAOhjG,SACxBijG,EAEMA,IAAc/J,EAAA,EAAcgK,qBACnCnB,EAAmBxiK,KAAMyjK,EAAOhjG,SAAgC2xF,OAFhEoQ,EAAmBxiK,KAAKyjK,EAAOhjG,cAM3C,MAGJ,KAAKi5F,EAAA,EAA2B8J,KAGVL,EAAsCK,KAAK7vD,KACpDjtG,QAAQk9J,SAGOz/J,IAAhBy/J,EAAIC,SAKRD,EAAIC,QAAQn9J,QAAS+8J,IAEjB,MAAM,SAAEK,GAAaL,EAAOxzH,KACxB6zH,GAAYA,IAAanK,EAAA,EAAcgK,qBACvCnB,EAAmBxiK,KAAKyjK,EAAOxzH,KAAKmiH,WAIhD,MAGJ,KAAKsH,EAAA,EAA2BqK,iBAAkB,CAC9C,MAAMC,EAAeb,EACrBX,EAAmBxiK,KAAKgkK,EAAazG,YAErC,QAQZ,OAAOiF,EAWH,oBAAoBZ,EAA6CN,GACrE,OAAIM,GAA8D,iBAAlCA,EAAkBqC,aAA4BrC,EAAkBqC,YAAYx3J,gBAAkBy0J,EAAqBgB,kBAAkBz1J,cAC1J7G,KAAKs+J,4BAA4BtC,EAAmBN,GAGxDA,EAIJ,2BACH17J,KAAKw7J,gBAAgBp3G,QAIlB,wBACHpkD,KAAKm8J,aAAa/3G,SArSf,EAAAo3G,gBAAmE,IAAInuI,IAMvE,EAAA8uI,aAAuD,IAAI9uI,K,iCC9CtE,kCAMO,MAAMqxH,EAIT,YAAYh7I,GAFJ,KAAAuC,aAA4ClM,OAAO6C,OAAO,MAG9DoD,KAAKu+J,iBAAiB76J,GAQnB,IAAI5H,EAAcS,GAKrB,OAJIA,UACAyD,KAAKiG,aAAanK,GAAQS,GAGvByD,KAOJ,IAAIlE,GACP,OAAOkE,KAAKiG,aAAanK,GAOtB,OAAOA,UACHkE,KAAKiG,aAAanK,GAMtB,WACH,MAAMwE,EAAOvG,OAAOuG,KAAKN,KAAKiG,cAE9B,OAAK3F,EAAKxG,OAIHwG,EAAKyB,OAAO6uB,IAAK/zB,GACb,GAAGA,KAAOmD,KAAKiG,aAAapJ,MACpCgE,KAAK,KALG,GASP,iBAAiBwwB,GAChBA,IAIyB,MAA1BA,EAAYutH,OAAO,KACnBvtH,EAAcA,EAAYf,UAAU,IAGxCe,EAAYnwB,MAAM,KAAKJ,QAAS09J,IAC5B,MAAMjxF,EAAQixF,EAAct9J,MAAM,KAE5BpF,EAAOyxE,EAAM,GAEdvtE,KAAK7D,IAAIL,KACVkE,KAAKiG,aAAanK,GAAQyxE,EAAM,U,uFCrEzC,MAAMkxF,EAQmB,mC,ICJf,E,oCAAjB,SAAiBpmC,GAmJb,SAAgBqmC,IACZ,IAAIC,EAAiB,GAMrB,OAJInhK,OAAOohK,YAAqD,iBAAhCphK,OAAOohK,WAAWv6C,YAC9Cs6C,EAAiBnhK,OAAOohK,WAAWv6C,UAAUx9G,eAG1C,IAAWg4J,eAAeF,GAjJf,EAAAG,0BAAtB,SAAgDv/J,EAAmCw/J,GAAgC,G,mDAC/G,IAGI,SAASC,EAAwB1lK,GAC7B,IAAI+qH,EAAyBq6C,IAGzBr6C,IAAc9vD,EAAA,EAAY+/E,MAAQh7I,GAAQA,EAAKsqH,MAC/CS,EAAY/qH,EAAKsqH,KAGjBpmH,OAAOyhK,aACPzhK,OAAOyhK,YAAY,kBAAoB,IAAWC,eAAe76C,IAAY,GAGjF9kH,EAAS8kH,UAdU,eAiBd86C,IAAIr2H,EAAA,EAAmBM,cAAe41H,GAC3CD,GACAC,EAAwB,MAE9B,SACE,IAAOj7H,SAAS,2CAWF,EAAAq7H,mCAAtB,SAAyD7/J,G,mDACrD,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBC,sBAAuBxpC,GACzD,SACE,IAAOwkC,SAAS,2CAWF,EAAAs7H,8BAAtB,SAAoD9/J,G,mDAChD,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBU,eAAiB81H,IAC7C//J,EAAS+/J,KAEf,SACE,IAAOv7H,SAAS,2CAWF,EAAAw7H,4BAAtB,SAAkDhgK,G,mDAC9C,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBW,eAAiB+1H,IAC7CjgK,EAASigK,KAEf,SACE,IAAOz7H,SAAS,2CAWF,EAAA07H,kCAAtB,SAAwDlgK,G,mDACpD,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBQ,aAAa,SAAUo2H,GAC/CA,GAAoBA,EAAiBC,SACrCpgK,EAASmgK,EAAiBC,QAASD,EAAiBE,eAG9D,SACE,IAAO77H,SAAS,2CAUF,EAAA87H,wCAAtB,SAA8DtgK,G,mDAC1D,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBY,yBAAyB,WACrDnqC,OAEN,SACE,IAAOwkC,SAAS,2CAWF,EAAAu0F,kCAAtB,SAAwD/4H,G,mDACpD,WAC2B,eACd4/J,IAAIr2H,EAAA,EAAmBgB,qBAAsBvqC,GACxD,SACE,IAAOwkC,SAAS,2CASR,EAAA26H,kBAAiB,EAkBX,EAAAoB,qBAAtB,SAA2CttI,EAAel5B,G,mDACtD,WAC2B,eACdymK,IAAIvtI,EAAOl5B,GACtB,SACE,IAAOyqC,SAAS,mEAUF,EAAAi8H,+BAAtB,SACIzkH,EAA0D,I,mDAE1DA,EAAO,OAAH,QACA0kH,gBAAY1hK,EACZ2hK,eAAe,GACZ3kH,UAGgB,eACdwkH,IACLj3H,EAAA,EAAmBK,kBACnB,CACIg3H,YAAa1B,EACbwB,WAAY1kH,EAAK0kH,WACjBC,cAAe3kH,EAAK2kH,oBAnMpC,CAAiB,MAAQ,M,iCCRzB,sCAQiBE,EARjB,mBAQA,SAAiBA,GAQG,EAAAlB,eAAhB,SAA+BmB,GAC3B,OAAQA,GACJ,KAAK,IAAYld,UACb,OAAO,IAAcA,UAEzB,KAAK,IAAYC,OACb,OAAO,IAAcA,OAEzB,KAAK,IAAYC,MACb,OAAO,IAAcA,MAEzB,QACI,MAAO,KAWH,EAAAwb,eAAhB,SAA+Bp6C,GAC3B,OAAQA,GAEJ,KAAK,IAAc2+B,OACf,OAAO,IAAYA,OAEvB,KAAK,IAAcC,MACf,OAAO,IAAYA,MAEvB,KAAK,IAAcF,UACf,OAAO,IAAYA,UAEvB,QACI,OAAO,IAAY7O,OA5CnC,CAAiB8rB,MAAU,M,iCCT3B,0FAQO,MAAMpxC,EACF,sBAAsBsxC,GACzB,MAAM/oF,EAAiB,GAUvB,OATA,IAAMrW,cAActwC,IAAI/zB,IAChByjK,IACIA,EAAYpvC,gBACZ35C,EAAe16E,IAAQyjK,EAAYpvC,gBAAgBC,qBAAqB5wE,KAAKpvB,GAAKA,EAAEiW,KAAKvgC,eAAiBhK,IAAQ,CAAEm0H,WAAY,IAAKA,WAErIz5C,EAAe16E,GAAO,KAI1ByjK,EACE,6BAEFplE,SAAU,CACNrJ,KAAM,EACN5c,IAAK,EACL2mB,UAAW,EACXH,KAAM,KAEP6kE,GACA,CACCxiF,kBAAmBwiF,EAAYvvC,eAAiBuvC,EAAYvvC,eAAeC,WAAa,EACxFz5C,mBAXR,KAeD,mBAAmBgpF,GACtB,GAAKA,EAIE,CACH,IAAIzmG,EAEAA,EADAymG,EAASn3E,aACD,IAAM7rB,cAAcC,aACrB+iG,EAASthK,KAAOshK,EAASthK,GAAG+B,WAAW,MACtC,IAAMu8D,cAAcG,QAEpB,IAAMH,cAAcE,UAGhC,IAAImuB,EAAqB20E,EAAS30E,YAAc,IAAMjuB,mBAAmBC,OAKzE,OAJI9D,GAAS,IAAMyD,cAAcG,SAAoC,MAAxB6iG,EAAS/hF,aAAuD,KAAhC+hF,EAAS/hF,YAAYloC,SAC9Fs1C,EAAa,IAAMjuB,mBAAmBE,UAGnC,OAAP,wBACO0iG,GACA,CACCzkK,KAAMykK,EAAS/hF,YACfmO,UAAW4zE,EAASnlC,eAAiBmlC,EAASntD,mBAC1C70G,EACAgiK,EAASntD,cACbje,WAAYorE,EAASrvC,gBAAkBqvC,EAASrvC,gBAAgBF,WAAa,EAC7E/7B,WAAYsrE,EAASxvC,eAAiBwvC,EAASxvC,eAAeC,WAAa,EAC3E97B,gBAAiBqrE,EAASnvC,eAAiBmvC,EAASnvC,cAAcC,mBAAmB9wE,KAAKpvB,GAAe,YAAVA,EAAEiW,OAAuB,CAAE4pF,WAAY,IAAKA,WAC3IxC,gBAAiB+xC,EAASnvC,eAAiBmvC,EAASnvC,cAAcC,mBAAmB9wE,KAAKpvB,GAAe,UAAVA,EAAEiW,OAAqB,CAAE4pF,WAAY,IAAKA,WACzIr+C,eAAiB4tF,EAASrvC,iBAAmBqvC,EAASrvC,gBAAgBF,YAAe,EACrFxyD,MAAO,YACP1E,MAAOA,EACPoyB,aAAcq0E,EAASr0E,cAAgB,IAAMluB,qBAAqBJ,OAClEguB,aACAmwB,SAAUwkD,EAASxkD,UAAY,IAAM99C,aAAaE,UAlC1D,MAAO,CACHrE,MAAO,IAAMyD,cAAcE,WAsChC,uBAAuB+iG,GAC1B,OAAKA,EAGE,CACH3uE,KAAM2uE,EAAa3uE,KACnB5c,IAAKurF,EAAavrF,IAClBinB,QAASskE,EAAatkE,QACtBN,UAAW4kE,EAAaxvC,YAAcwvC,EAAavrF,IAAMurF,EAAa3uE,MACtEm/B,WAAYwvC,EAAaxvC,WACzBv1B,KAAM+kE,EAAa77C,MAAM/zF,IAAIyZ,GAAQrqC,KAAKivH,YAAY5kF,EAAK0kF,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MAAgBiD,MAAQ,QAR9F,KAYR,sBAAsBo2H,GACzB,IAAKA,EACD,OAAO,KAGX,IAAIC,EAAQ,KACRh6F,EAAU,KACd,GAAI+5F,EAAY1xC,MAAO,CACnB,MAAM4xC,EAAYF,EAAY1xC,MAAMxuE,KAAM02D,GAAsB,QAAbA,EAAK7vE,MAAkB6vE,EAAK5sE,KAAKprC,IAAMwhK,EAAYnwC,WACtGowC,EAAQC,EAAY3xC,EAAoBC,YAAY0xC,EAAUt2H,MAAQ,KAEtE,MAAMu2H,EAAeH,EAAY1xC,MAAMxuE,KAAM02D,GAAsB,WAAbA,EAAK7vE,MAC3Ds/B,EAAUk6F,EAAe5xC,EAAoB+M,eAAe6kC,EAAav2H,MAAQ,KAGrF,MAAMstD,EAAW8oE,EAAY72E,eAAiB,IAAMpqB,kBAAkBC,OAChEwtB,EAAawzE,EAAY72E,eAAiB,IAAMpqB,kBAAkBK,SAClEmtB,EAAY,CAAC,IAAMxtB,kBAAkBG,YAAa,IAAMH,kBAAkBI,YAAa,IAAMJ,kBAAkBE,eAAe/sB,SAAS8tH,EAAY72E,eAEnJ4S,EAAavP,EACb1V,EAAiB,GASvB,OARA,IAAMrW,cAActwC,IAAI/zB,IAChB4jK,EAAYvvC,gBACZ35C,EAAe16E,IAAQ4jK,EAAYvvC,gBAAgBC,qBAAqB5wE,KAAKpvB,GAAKA,EAAEiW,KAAKvgC,eAAiBhK,IAAQ,CAAEm0H,WAAY,IAAKA,WAErIz5C,EAAe16E,GAAO,IAIvB,OAAP,wBACO4jK,GACA,CACCI,QAASJ,EAAYnwC,UACrB7vE,KAAMggH,EAAYvzF,KAAKtuE,QAAQ,kBAAmB,QAClD84F,eAAgB+oE,EAAYK,YAC5BvpF,iBACAqb,KAAM8tE,EACNh6F,QAASA,EACTixB,SAAUA,EACV1K,WAAYA,EACZD,UAAWA,EACXwP,WAAYA,EACZ1K,QAAS,GACTU,WAAYiuE,EAAY1vC,eAAiB0vC,EAAY1vC,eAAeC,WAAa,IAItF,0BAA0B+vC,GAC7B,OAAKA,EAGE,CACHljF,cAAe,KACfgU,KAAMkvE,EAAgBlvE,KACtB5c,IAAK8rF,EAAgB9rF,IACrBinB,QAAS6kE,EAAgB7kE,QACzBF,YAAa+kE,EAAgB/kE,YAC7B2wB,IAAKo0C,EAAgBp0C,IACrB/wB,UAAWmlE,EAAgB/vC,YAAc+vC,EAAgB9rF,IAAM,EAAI8rF,EAAgBlvE,KAAO,EAAI,GAC9Fm/B,WAAY+vC,EAAgB/vC,WAC5Bv1B,KAAMslE,EAAgBp8C,MAAM/zF,IAAKyZ,GAAS2kF,EAAoBgN,eAAe3xF,KAXtE,KAcR,uDAAuD22H,GAC1D,IAAKA,EACD,OAAO,KAGX,MAAMC,EAAkBD,EAAkBr8C,MAC1C,IAAIuM,EACJ,IACIA,EAAkB8vC,EAAkBjyC,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MAA+B,WAAVjW,EAAEiW,MAAmBiD,KAAK6mF,gBAAgBC,qBACvH,MAAO31H,GACL01H,EAAkB,KAEtB,MAAMgwC,EAAwB,CAAE3pF,eAAgB,CAAE9oD,IAAK,GAAKk2F,MAAO,CAAEl2F,IAAK,KAwB1E,OAvBA,IAAMyyC,cAActwC,IAAI/zB,IACpBqkK,EAAsB3pF,eAAe16E,GAAO,EAC5CqkK,EAAsBv8C,MAAM9nH,GAAO,KAGnCq0H,GACAA,EAAgBtgG,IAAIO,IAChB+vI,EAAsB3pF,eAAepmD,EAAEiW,KAAKvgC,eAAiBsqB,EAAE6/F,WAC/DkwC,EAAsB3pF,eAAe9oD,KAAO0C,EAAE6/F,aAIlDiwC,GACAA,EAAgBrwI,IAAIO,IAChB,MAAM8yF,EAAY9yF,EAAE+9F,QAAQroH,cACtB+rF,EAAOzhE,EAAE49F,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MAAkBjW,EAAE49F,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MAAgBiD,KAAO,CAAEyvB,MAAO,IAAMyD,cAAcE,UAAW+gB,YAAa,OACnJoU,EAAK4wB,oBAAqB,EAC1B5wB,EAAKmB,cAAgB5iE,EAAE49F,MAAMxuE,KAAKpvB,GAAe,UAAVA,EAAEiW,MACzC85H,EAAsBv8C,MAAMxzF,EAAE+9F,QAAQroH,eAAezM,KAAK,CAAEw4F,KAAMA,EAAMqxB,cACxEi9C,EAAsBv8C,MAAMl2F,IAAIr0B,KAAK,CAAEw4F,KAAMA,EAAMqxB,gBAIpDi9C,EAEJ,gCAAgCC,GAC/BA,GAAcA,EAAWx8C,QACzBw8C,EAAaA,EAAWx8C,MAAM,IAGlC,OADcw8C,GAAcA,EAAWjyC,QAAWiyC,EAAWjyC,QAAQroH,cAAgB,KAGlF,6BAA6Bu6J,GAChC,OAAKA,EAGE,CACHvvE,KAAMuvE,EAAmBvvE,KACzB5c,IAAKmsF,EAAmBnsF,IACxBinB,QAASklE,EAAmBllE,QAC5BN,UAAWwlE,EAAmBpwC,YAAcowC,EAAmBnsF,IAAM,EAAImsF,EAAmBvvE,KAAO,EAAI,GACvGm/B,WAAYowC,EAAmBpwC,WAC/Bv1B,KAAM2lE,EAAmBz8C,MAAM/zF,IAAImuF,GAAY/+G,KAAKqhK,oBAAoBtiD,KARjE,KAWR,2BAA2BA,GAC9B,IAAKA,EACD,OAAO,KAGX,MAAMuiD,EAAe,CACjBriK,GAAI8/G,EAAS9/G,GACbmoC,KAAM23E,EAAS33E,KACfyrF,SAAU9T,EAASwiD,gBACnBruC,OAAQnU,EAAS6S,KACjBtZ,aAAcyG,EAASzG,cAE3B,OAAQyG,EAAS33E,MACb,KAAK,IAAMg3B,aAAaC,OAAQ,CAC5B,MAAMq6C,EAAWqG,EAASgQ,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MAC5C,OAAO,OAAP,wBACOk6H,GAAY,CACf1uE,KAAM5yF,KAAKivH,YAAYvW,GAAYA,EAASruE,QAGpD,KAAK,IAAM+zB,aAAaI,MAAO,CAC3B,MAAM84C,EAAkByH,EAASgQ,MAAMxuE,KAAKpvB,GAAe,eAAVA,EAAEiW,MACnD,OAAO,OAAP,wBACOk6H,GAAY,CACf3oD,UAAWrB,GAAmBA,EAAgBjtE,KAAK6kF,UAG3D,KAAK,IAAM9wD,aAAaE,MAAO,CAC3B,MAAMo6C,EAAWqG,EAASgQ,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MACtCo6H,EAAcziD,EAASgQ,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MACzCgwE,EAAc2H,EAASgQ,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MAC/C,OAAO,OAAP,wBACOk6H,GAAY,CACf1uE,KAAM5yF,KAAKivH,YAAYvW,GAAYA,EAASruE,MAC5C7C,OAAQ,CACJxhC,IAAKw7J,GAAeA,EAAYn3H,KAAKrkC,IACrCknE,KAAMkqC,GAAeA,EAAY/sE,KAAK6iC,KAAKtuE,QAAQ,kBAAmB,QACtE2qF,QAAS6tB,GAAep3G,KAAKg8H,eAAe5kB,EAAY/sE,SAIpE,KAAK,IAAM+zB,aAAaG,SAAU,CAC9B,MAAMm6C,EAAWqG,EAASgQ,MAAMxuE,KAAKpvB,GAAe,QAAVA,EAAEiW,MACtCo6H,EAAcziD,EAASgQ,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MACzCgwE,EAAc2H,EAASgQ,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MACzCq6H,EAAe1iD,EAASgQ,MAAMxuE,KAAKpvB,GAAe,YAAVA,EAAEiW,MAE1Cs6H,EAAuBD,GAAgD,WAAhCA,EAAap3H,KAAKs3H,WAC3D3hK,KAAK4hK,4CAA4CxqD,GAAeA,EAAY/sE,KAAK6mF,iBAAmB9Z,EAAY/sE,KAAK6mF,gBAAgBC,sBACrInxH,KAAK4hK,4CAA4CJ,GAAeA,EAAYn3H,KAAK6mF,iBAAmBswC,EAAYn3H,KAAK6mF,gBAAgBC,sBAEnI0wC,EAAaJ,GAAgD,WAAhCA,EAAap3H,KAAKs3H,WACjDvqD,GAAeA,EAAY/sE,KAAK6iC,KAChCs0F,GAAeA,EAAYn3H,KAAKk9C,MAEpC,OAAO,OAAP,wBACO+5E,GAAY,CACf1uE,KAAM5yF,KAAKivH,YAAYvW,GAAYA,EAASruE,MAC5C7C,OAAQ,CACJxhC,IAAKw7J,GAAeA,EAAYn3H,KAAKrkC,IACrCuxE,eAAgBmqF,EAChBx0F,KAAM20F,EAAWjjK,QAAQ,kBAAmB,QAC5C2qF,QAAS6tB,GAAep3G,KAAKg8H,eAAe5kB,EAAY/sE,SAIpE,KAAK,IAAM+zB,aAAaK,WAAY,CAChC,MAAM24C,EAAc2H,EAASgQ,MAAMxuE,KAAKpvB,GAAe,WAAVA,EAAEiW,MACzC06H,EAAuB/iD,EAASgQ,MAAMxuE,KAAKpvB,GAAe,oBAAVA,EAAEiW,MAClDy3B,EAAsBijG,GAAwBA,EAAqBz3H,KAAK6kF,QAC9E,IAAIxjG,EACJ,OAAQmzC,GACJ,KAAK,IAAMA,oBAAoBC,SAC3BpzC,EAAU,kEAAmE,MACjF,KAAK,IAAMmzC,oBAAoBE,IAC3BrzC,EAAU,0DAA2D,MACzE,KAAK,IAAMmzC,oBAAoBG,aAC3BtzC,EAAU,gDAAiD,MAC/D,KAAK,IAAMmzC,oBAAoBI,gBAC3BvzC,EAAU,mDAAoD,MAClE,KAAK,IAAMmzC,oBAAoBK,kBAC3BxzC,EAAU,+HAAgI,MAC9I,KAAK,IAAMmzC,oBAAoBS,qBAC3B5zC,EAAU,mIAAoI,MAClJ,KAAK,IAAMmzC,oBAAoBO,wBAC3B1zC,EAAU,yJAA0J,MACxK,KAAK,IAAMmzC,oBAAoBM,iBAC3BzzC,EAAU,yGAA0G,MACxH,KAAK,IAAMmzC,oBAAoBU,oBAC3B7zC,EAAU,6GAA8G,MAC5H,KAAK,IAAMmzC,oBAAoBQ,uBAC3B3zC,EAAU,mHAAoH,MAClI,QACIA,EAAU,GAElB,OAAO,OAAP,wBACO41I,GAAY,CACfziG,oBAAqBA,EACrBnzC,QAASA,EACT8b,OAAQ4vE,GAAe,CACnBn4G,GAAIm4G,EAAY/sE,KAAKprC,GACrBiuE,KAAMkqC,EAAY/sE,KAAK6iC,SAMvC,OAAOo0F,EAEH,mDAAmDnwC,GACvD,IAAKA,EAAwB,OAAO,KACpC,MAAM55C,EAAiB,CAAE9oD,IAAK,GAO9B,OANA,IAAMyyC,cAActwC,IAAI/zB,IACpB06E,EAAe16E,GAAO,IAE1Bs0H,EAAqBvgG,IAAIO,IACrBomD,EAAepmD,EAAEiW,KAAKvgC,eAAiBsqB,EAAE6/F,aAELz5C,EAErC,sCAAsCt4E,EAAY8iK,EAAoB7wC,EAAkCH,EAAgCixC,EAA2BC,GAGtK,MAAMp/J,EAAe,cACrB,GAAIA,GAAgBA,EAAayuB,QAAQ,kBAAoB,EAAG,CAC5D,IAEIy/F,EAAiB,CAAEC,WAAY,EAAGC,oBAAqB,KADvDC,EAAkB,CAAEF,WAAY,EAAGG,qBAAsB,KAEzCH,WAAanyH,KAAKw6F,MAAsB,IAAhBx6F,KAAKC,UAC7CiyH,EAAeC,WAAanyH,KAAKw6F,MAAsB,IAAhBx6F,KAAKC,UACtB,CAAC,QAAS,OAAQ,OAAQ,MAAO,YAAa,YAAYiD,KAAK,IAAM,GAAMlD,KAAKC,UAAUpB,MAAM,EAAGmB,KAAKw6F,MAAsB,EAAhBx6F,KAAKC,WAC3HgC,QAAQsmC,GAAQ8pF,EAAgBC,qBAAqB/2H,KAAK,CAAE42H,WAAYnyH,KAAKw6F,MAAsB,GAAhBx6F,KAAKC,UAAgBsoC,KAAMA,KAC9H,UAKF,GAAI2pF,EAAeC,WAAa,EAC5B,IACI,MAAMkxC,EAAiB,CACnB,CAAEjjK,GAAI,wCACN,CAAEA,GAAI,wCACN,CAAEA,GAAI,wCACN,CAAEA,GAAI,wCACN,CAAEA,GAAI,yCAEJkjK,EAActjK,KAAKw6F,MAAsB,EAAhBx6F,KAAKC,UACpCkjK,EAAcE,EAAexkK,MAAMykK,EAAaA,EAAY,GAC9D,WAMV,MAAMhxC,EAA4DD,GAAmBA,EAAgBC,qBAAuBD,EAAgBC,qBAAuB,GAE7JixC,EAAwBj5F,IAC1B,GAAIoC,MAAM5uB,QAAQw0E,GAAuB,CACrC,MAAMx2H,EAASw2H,EAAqB/mF,OAAO7tC,GAASA,EAAM6qC,OAAU+hC,GACpE,OAAOxuE,GAAWA,EAAOb,OAAS,EAAKa,EAAO,GAAGq2H,WAAa,IAIhEz5C,EAAiB,CACnBxV,MAAOqgG,EAAqB,IAAgBrgG,OAC5CL,KAAM0gG,EAAqB,IAAgB1gG,MAC3CC,KAAMygG,EAAqB,IAAgBzgG,MAC3CG,IAAKsgG,EAAqB,IAAgBtgG,KAC1CD,UAAWugG,EAAqB,IAAgBvgG,WAChDD,SAAUwgG,EAAqB,IAAgBxgG,WAG7CygG,GAAmBN,GAAc/yC,EAAoBszC,wBAAwBrjK,EAAIgjK,GAMvF,OALII,GAEA9qF,EADAwqF,EAAaM,KAIV,CACHN,aACA9iK,KACAsjK,mBAAoBxxC,GAAkBA,EAAeC,WACrDz5C,iBACAyqF,eAID,+BAA+B/iK,EAAYgjK,GAC9C,OAAIA,EACOA,EAAgBhjK,GAGvB,cAAkB8sD,WAAa,cAAkBkH,QAAQ,GAAG,MAAqBh0D,KAC1E,cAAkBg0D,QAAQ,GAAG,MAAqBh0D,KAGtD,KAGJ,sCAAuCsqF,EAAkB6tC,EAAoBpmG,GAChF,OAAQu4D,GAAYA,EAAQqJ,KACxB,CACI5hE,OAAQA,EACRwxI,SAAUj5E,EAAQqJ,KAAKpU,YACvBmO,UAAWpD,EAAQqJ,KAAKwoC,eAAiB7xC,EAAQqJ,KAAKwgB,mBAAiB70G,EAAYgrF,EAAQqJ,KAAKwgB,cAChGqvD,WAAY,YAAe,GAAG,IAAM9lG,aAAaK,cAAcusB,EAAQqJ,KAAK3zF,KAAM+xB,GAClF0xI,WAAY,YAAetrC,EAAYpmG,EAAQu4D,EAAQtqF,IACvDq5F,YAAa/O,EAAQ9oC,KACrB+xC,WAAYjJ,EAAQiJ,WACpBjb,eAAgBgS,EAAQhS,eACxBmgB,eAAgBnO,EAAQmO,gBAVG,Q,wFCpX3C,IAAYirE,GAAZ,SAAYA,GAER,gBAGA,gBAGA,gBAGA,gBAXJ,CAAYA,MAAsB,KAiB3B,MCrDMC,EAAoF,CAC7F,CAACD,EAAuBE,OAAQ,CAC5B,MACA,SACA,YACA,UACA,UACA,MACA,KACA,OACA,MACA,gBACA,gBACA,eACA,aACA,OACA,WACA,WACA,KACA,UACA,MACA,SACA,YACA,SACA,MACA,KACA,UACA,UACA,QACA,SACA,OACA,SACA,kBACA,KACA,aACA,UACA,MACA,eACA,kBACA,QACA,cACA,UACA,SACA,UACA,MACA,OACA,mBACA,KACA,aACA,MACA,yCACA,WACA,SACA,WACA,MACA,YACA,YACA,OACA,QACA,aACA,gBACA,UACA,OACA,QACA,QACA,OACA,QACA,wBACA,iBACA,aACA,WACA,OACA,wBACA,wBACA,4BACA,+BACA,MACA,iBACA,eACA,iBACA,MACA,SACA,gBACA,gBACA,eACA,MACA,YACA,QACA,aACA,UACA,UACA,uBACA,UACA,OACA,QACA,2BACA,kBACA,QACA,UACA,oBACA,yBACA,6BACA,gCACA,2BACA,iCACA,8BACA,uBACA,8BACA,yBACA,4BACA,SACA,eACA,WAEJ,CAACF,EAAuBG,OAAQ,CAC5B,SACA,gBACA,QACA,eACA,aACA,aACA,aAEJ,CAACH,EAAuBI,OAAQ,CAC5B,sBAEJ,CAACJ,EAAuBK,OAAQ,I,oCCpHpC,MAAMC,EAAoB,CACtB,OACA,WACA,KACA,MACA,UACA,QACA,SACA,SACA,MACA,WACA,QACA,OACA,iBACA,MACA,aAgBG,SAASC,EAAUpnK,EAAcS,EAAes3I,EAAqB1iG,EAAiB2iG,EAAeC,EAAkBovB,EAAyCnvB,GACnK,QAAIH,EAAa,IAcrB,SAA8BuvB,EAAoBC,GAE9C,MAAM5kI,EAAwD+8B,EAAA,EAAS9tC,cAAcC,YAAYE,UAAUitC,EAAA,EAAoBn9B,aAE/H,IAAKc,EAED,OADAsxB,EAAA,EAAUjtB,kBAAkB,OAAD,wBAAM,KAAoBl1B,0BAAwB,CAAE8d,QAAS,mCACjF,EAGX,MAAM43I,EAAqB7kI,EAAqBzP,kBAC1Cu0I,EAAqCD,EAAmBxgB,oBACxD0gB,EAAyCF,EAAmBG,sBAElE,IAAIC,GAAe,EACnB,OAAQF,GACJ,KAAKG,EAAA,EAAsBC,eAEvBF,EAyBZ,SAA0CN,EAAoBS,EAAiDR,GAE3G,GAAIA,GAGA,GAAIQ,EAAiBlxH,SAAS0wH,GAC1B,OAAO,OAKX,IAAK,MAAMS,KAAkBD,EAAkB,CAG3C,GAFwBjB,EAA8BkB,GAElCnxH,SAASywH,GACzB,OAAO,EAMnB,IAAIW,GAAoB,EACxB,MAAMC,EAAsBjqK,OAAOuG,KAAKsiK,GAA+Bx4H,OAAOo9B,IAAaq8F,EAAiBlxH,SAASgwH,EAAuBn7F,KAG5I,IAAK,MAAMy8F,KAAqBD,EAAqB,CAGjD,GAFwBpB,EAA8BqB,GAElCtxH,SAASywH,GAAa,CACtCW,GAAoB,EACpB,OAIHA,GACDh0G,EAAA,EAAUjtB,kBAAkB,OAAD,wBACpB,KAAoBj1B,sBAAoB,CAC3C6d,QAAS,kCAAkC03I,oDAInD,OAAO,EAlEgBc,CAAiCd,EAAYE,EAAmBa,uBAAwBd,GACvG,MAEJ,KAAKM,EAAA,EAAsBS,WAC3B,KAAKT,EAAA,EAAsBU,WAEvBX,EAoEZ,SAAsCN,EAAoBG,GACtD,GAAIA,IAAkBI,EAAA,EAAoBW,YACtC,OAAO,EAGX,MAAMC,EAAsBnB,EAAWv8J,cACvC,GAAIo8J,EAAkB3xI,QAAQizI,IAAwB,EAClD,OAAO,EAGX,OAAO,EA9EgBC,CAA6BpB,EAAYG,GACxD,MAEJ,QACIG,EAAeH,IAAkBI,EAAA,EAAoBW,YAK7D,OAAOZ,EA9CgBe,CAAqB3oK,EAAMqnK,MAIlD,YAA2BrnK,EAAMS,EAAOs3I,EAAY1iG,EAAQ2iG,EAAMC,EAAQC,IACnE,K,iCCtBX,IAAYhyD,EA7BZ,kCA6BA,SAAYA,GAER,kCAGA,yBAGA,yBAGA,2BAGA,mBAGA,qBAGA,uBAGA,yBAGA,sBAGA,wBA7BJ,CAAYA,MAAM,M,gCC7BlB,sDAKA,MAAM0iF,EAAS,CACX3nK,EAAG,OACHP,EAAG,OACH0oH,EAAG,SACHr9C,EAAG,WACH88F,cAAe,gBACf9oK,EAAG,yBACH,OAAQ,sBACR,SAAU,iBACV,MAAO,aACP,MAAO,iBACP,MAAO,mBACP,MAAO,eACP,OAAQ,gBACR,MAAO,mBACP,MAAO,mBACP,OAAQ,sBACR,OAAQ,sBACR,OAAQ,oBACR,MAAO,gBACP,OAAQ,kBACR,SAAU,uBACV,SAAU,6BACV,SAAU,4BACV,SAAU,4BACV,UAAW,mCACX,QAAS,uBACT,MAAO,UACP,MAAO,YACP,MAAO,YACP+oK,IAAK,OAGF,MAAMC,EACF,gBAAgBnjK,GACnB,MAAMojK,EAAiB,GACjBxkK,EAAOvG,OAAOuG,KAAKokK,GACzB,IAAK,IAAI9qK,EAAI,EAAGA,EAAI0G,EAAKxG,OAAQF,IAAK,CAClC,MAAMiD,EAAMyD,EAAK1G,GACXmrK,EAAc,YAAIrjK,EAAKgjK,EAAO7nK,SAEhB0B,IAAhBwmK,IACAD,EAAUjoK,GAAOkoK,GAKzB,MAAMA,EAAc,YAAIrjK,EAAK,oBAK7B,OAJIqjK,IACAD,EAAU,QAAUC,GAGjBD,EAGJ,kBAAkBpjK,GACrB,IAAKA,EACD,OAGJ,MAAMojK,EAAiB,GACjBxkK,EAAOvG,OAAOuG,KAAKokK,GACzB,IAAK,IAAI9qK,EAAI,EAAGA,EAAI0G,EAAKxG,OAAQF,IAAK,CAClC,MAAMiD,EAAMyD,EAAK1G,GACXmrK,EAAc,YAAIrjK,EAAK7E,QAET0B,IAAhBwmK,GACA,YAAID,EAAWJ,EAAO7nK,GAAMkoK,GAQpC,OAJIrjK,EAAI,SACJ,YAAIojK,EAAW,mBAAoBpjK,EAAI,SAGpCojK,K,gCC7Ef,IAAY5wI,EAmBA+3G,EAKAD,EAUAg5B,EArCZ,kCAGA,SAAY9wI,GACR,iBACA,mBACA,mCACA,+BACA,qCACA,uBACA,iBACA,yBACA,qBACA,2BACA,0BACA,4BACA,oCACA,4CACA,0CAfJ,CAAYA,MAAO,KAmBnB,SAAY+3G,GACR,0BADJ,CAAYA,MAAgB,KAK5B,SAAYD,GACR,iBACA,iBACA,iBACA,6BACA,yBACA,yBANJ,CAAYA,MAAQ,KAUpB,SAAYg5B,GACR,gCACA,kBACA,wBACA,8BACA,kCACA,4CACA,sCACA,wBACA,0BACA,sBACA,wBACA,gCACA,oCACA,oCACA,4BACA,0CACA,4CACA,sBACA,0CACA,kCACA,8CACA,8BACA,sCACA,0BACA,4BACA,wBACA,kCACA,8CACA,0CA7BJ,CAAYA,MAAkB,KA8G9B,IAAYC,GAAZ,SAAYA,GACR,kCACA,gBACA,0CACA,0BACA,sCACA,sCACA,4BACA,gCACA,4BACA,4BACA,4CACA,oDAZJ,CAAYA,MAAe,KAgBtBj5B,EAAS35F,IACT25F,EAASk5B,IACTl5B,EAASm5B,IAITn5B,EAAS35F,IACT25F,EAASk5B,IACTl5B,EAASm5B,IACTn5B,EAASo5B,UACTp5B,EAASq5B,QAOd,IAAYC,EAuCAC,GAvCZ,SAAYD,GACR,kBACA,8BAFJ,CAAYA,MAAe,KAuC3B,SAAYC,GACR,cACA,oBACA,8BAHJ,CAAYA,MAAW,M,iCC3NvB,oEAEO,MAAMC,EAAiB,gBACjBC,EAAqB,c,iCCHlC,wFAMA,IAAIC,EASAzoI,EA6CG,SAAS0oI,IACZ,OAAO1oI,EAOJ,SAAe2oI,EAAe7wD,G,mDACjC,GAAI2wD,EAAgBG,YAA8C,QAAhCH,EAAgBtoI,YAAuB,CACrE,MAAMziC,QAAe,YAAiB,CAClCmrK,SAAS,EACT1oI,YAAa,QAGjB,IACI,MAAM2oI,EAAkB5mK,KAAKkC,MAAM1G,GAEnC,GAAIorK,EAAgB5oI,aAAe4oI,EAAgB5oI,YAAYrjC,OAAS,EACpE,MAAO,UAAUisK,EAAgB5oI,YAEvC,MAAO6oI,GACLC,EAAgBD,EAAW,wEAInC,GAAIN,EAAgBG,YAA8C,QAAhCH,EAAgBtoI,YAAuB,CACrE,MAAMziC,QAAe,YAAiB,CAClCmrK,SAAS,EACT1oI,YAAa,MACbgK,KAAM,cACN2tE,MAAOA,IAGX,IACI,MAAMgxD,EAAkB5mK,KAAKkC,MAAM1G,GAEnC,GAAIorK,EAAgBG,QAChB,OAAOH,EAAgB5oI,YAE7B,MAAO6oI,GACLC,EAAgBD,EAAW,wEAInC,OAAO,QA+CX,SAASC,EAAgB3oK,EAAculC,GACnC,YAAc,CACVuE,KAAM,UACNtrC,KAAM,uBACNwB,MAAOulC,EACPvpC,KAAM,CACFgE,MAAOA,EACPulC,cAAeA,O,gCC/J3B,+DAWA,MAAMsjI,EAA4D,IAAI94I,IAsEtE,SAAS+4I,EAAuBv1B,GAC5B,OAAOA,EAAgB,IAAM,IAAmB7jH,kBAI7C,MAAMq5I,EAAwB,CACjCra,kBArEJ,SACI3b,EACAC,GACA,IAAIg2B,EAA6BH,EAAgChqK,IAAIm0I,GAChEg2B,IACDA,EAAgB,IAAIjtH,IACpB8sH,EAAgCjgK,IAAIoqI,EAAmBg2B,IAG3DA,EAAc9sH,IAAI4sH,EAAuB/1B,KA6DzCE,qBApDJ,SACIg2B,EACAl2B,EACAC,GAIA,MAAMk2B,EAA6BJ,EAAuB/1B,GACpDU,EAAyB,YAAIw1B,EAAUC,OAA4BjoK,GAGnEkoK,EAA4B,YAAIF,EAAUH,EAAuB91B,QAAoB/xI,GAGrFyyI,EAAwB,OAAH,wBAAQD,GAAsB,CAAE,CAACT,GAAoBm2B,IAChF,YAAIF,EAAUC,EAA4Bx1B,IAsC1CJ,kBA7BJ,SACI21B,EACAG,EACAC,GAEA,MAAMC,EAA8BT,EAAgChqK,IAAIuqK,GACxE,GAAIE,EACA,IAAK,MAAMC,KAAiBD,EAAgB,CACxC,MAAME,EAA+B,YAAIP,EAAUM,OAAetoK,GAE9DuoK,GACA,YAAIP,EAAUM,EAAe,OAAF,wBAAOC,GAAuB,CAAE,CAACJ,GAAyBC,S,gCCvErG,sCAUiBI,EAVjB,wBAUA,SAAiBA,GAKG,EAAAC,UAAhB,WACI,OAAO,IAASn8H,eAAe6I,WAAa,IAASwxH,KAMzC,EAAA+B,UAAhB,WACI,OAAO,IAASp8H,eAAe6I,WAAa,IAASyxH,KAMzC,EAAAlgI,iBAAhB,WAoBI,OAAO,IAAeiiI,qBAvC9B,CAAiBH,MAAW,M,iCCV5B,oEAUA,IAAYI,EAkBAC,GAlBZ,SAAYD,GAIR,yBAIA,2BAIA,iCAZJ,CAAYA,MAAmB,KAkB/B,SAAYC,GAIR,oBAIA,0BAIA,4BAIA,cAhBJ,CAAYA,MAAqB,M,8JCC1B,SAASC,IACZ,SAAI,IAASj4I,aAA4C,YAA7BlrB,SAASmrB,iBA+ClC,SAASi4I,IACZ,OAAOzoK,KAAKsiC,MAAMxR,YAAYC,OAAOC,gBAAkBF,YAAYpqB,S,+BC9EvE,6dAaO,SAASgiK,EAAch6F,EAAe9qE,GACzC,GAAI,cACA,OAAOjF,OAAOgwE,WAAWD,GAAO/4B,QAGpC,QAAmBj2C,IAAfkE,EACA,MAAMwC,MAAM,0DAGhB,MAAMuiK,EAAiB,qBAAqBv7I,KAAKshD,GAC3Ck6F,EAAiB,qBAAqBx7I,KAAKshD,GAE3Cm6F,EAAWD,GAAkBA,EAAe3tK,OAAS2tK,EAAe,GAAK,EACzEE,EAAWH,GAAkBA,EAAe1tK,OAAS0tK,EAAe,GAAKI,IAEzEC,EAAgB,YAAmBziK,SAASsiK,EAAS3oK,YAAa,IAAkBkD,aACpF6lK,EAAgBH,IAAaC,IAC/B,IAAkB3lK,YAAYnI,OAAS,EAAI,YAAmBsL,SAASuiK,EAAS5oK,YAAa,IAAkBkD,aAEnH,OAAOQ,GAAcolK,GAAiBplK,GAAcqlK,EAMjD,SAASC,IACZ,OAAO,cAAcvqK,OAAOmF,SAASG,KAAO,cAAiBkD,IAAIlD,KAM9D,SAASklK,IACZ,OAAO,cAAcxqK,OAAOmF,SAASO,SAAW,cAAiB8C,IAAI9C,SAMlE,SAAS+kK,IACZ,OAAO,cAAczqK,OAAOmF,SAASK,KAAO,cAAiBgD,IAAIhD,KAM9D,SAASklK,IACZ,OAAO,cAAc1qK,OAAOmF,SAASS,OAAS,cAAiB4C,IAAI5C,OAMhE,SAAS+kK,IACZ,OAAO,cAAc3qK,OAAOmF,SAASe,OAAS,cAAiBsC,IAAItC,OA2BhE,SAAS0kK,IACZ,OAAO,cAAc5qK,OAAO0G,SAASgxG,OAAS,cAAiBA,OAM5D,SAASmzD,EAAuBC,GACnC,IAAK,cACD,MAAM,IAAIrjK,MAAM,kGAGpB,OAAOzH,OAAO0G,SAASghF,eAAeojF,GAMnC,SAASC,EAA6BC,GACzC,IAAK,cACD,MAAM,IAAIvjK,MAAM,wGAGpB,OAAOzH,OAAO0G,SAASynE,qBAAqB68F,GAOzC,SAASC,IACZ,OAAO,cAAcjrK,OAAO8lD,UAAY,KAOrC,SAASolH,IACZ,OAAO,cAAclrK,OAAO+E,YAAc,cAAiBA,YAaxD,SAASomK,IACZ,SAAU,cAAenrK,OAAOsG,KAAOtG,OAAOsG,IAAIC,UAAYD,IAAIC,SAAS,UAAW,QAAW,cAAiBF,eAwB/G,SAAS+kK,EAAgB3mH,EAAyBhjD,EAAgB4pK,GAAY,EAAMC,EAAc,aACrG,IAAK,cACD,MAAM,IAAI7jK,MAAM,2FAGpB,MAAM8jK,EAAmC7kK,SAASyoE,cAAc,UAgBhE,OAfI1tE,IACA8pK,EAAc9pK,GAAKA,GAEvB8pK,EAAc3hI,KAAO,kBACjB6a,IACA8mH,EAAc9mH,IAAMA,EACpB8mH,EAAcnyB,MAAQiyB,EACtBE,EAAcD,YAAcA,GAG5BtrK,QAAUA,OAAOwrK,WAEjBD,EAAcE,MAAQzrK,OAAOwrK,UAG1BD,I,iCChMX,8CAWO,MAAMG,EAA8B,IAChC,YAAqC,c,gCCZhD,qDAUA,MAAMC,EAaF,cALiB,KAAAC,cAAwB,OAMf,oBAAX5rK,QACPwC,KAAKuqD,WAAW/sD,OAAOmyB,aAQxB,qBAKH,OAJKw5I,EAAWvvH,WACZuvH,EAAWvvH,SAAW,IAAIuvH,GAGvBA,EAAWvvH,SAOf,WAAWjqB,GACd3vB,KAAK2vB,YAAcA,EAOhB,UAAU7zB,GACbkE,KAAKi2J,WAAWn6J,EAjDA,UAwDb,QAAQA,GACXkE,KAAKi2J,WAAWn6J,EAAOkE,KAAKopK,eAC5BppK,KAAKqpK,gBAAgBvtK,GAOlB,WAAWA,GACd,MAAM6zB,EAAc3vB,KAAK2vB,YACrBA,GAAeA,EAAY25I,MAC3B35I,EAAY25I,KAAKxtK,GAQlB,UAAUA,GACb,MAAM6zB,EAAc3vB,KAAK2vB,YACrBA,GAAeA,EAAY45I,YAC3B55I,EAAY45I,WAAWztK,GAUlB,eAAkBA,EAAc0tK,G,mDACzCxpK,KAAK8yI,UAAUh3I,GACf,MAAMnB,QAAe6uK,IAErB,OADAxpK,KAAKgzI,QAAQl3I,GACNnB,KAQJ,kBAAkB4mF,GAErB,IAAKvhF,KAAK2vB,YACN,OAGJ,MAAM85I,EAAmD,GAGnDC,EAAc1pK,KAAK2vB,YAAYg6I,iBAAiB,QACtD,IAAKD,EACD,OAAOD,EAIX,IAAK,IAAI7vK,EAAI,EAAGA,EAAI8vK,EAAY5vK,OAAQF,IAAK,CAGzC,IAAIk8J,EAAqB4T,EAAY9vK,GAAGkC,KACxC,IAAKg6J,GAA0C,MAA5B4T,EAAY9vK,GAAGsnC,UAC9B,SAOJ,GAHA40H,EAAaA,EAAWl3J,QAAQ,iBAAkB,KAG7Ck3J,EAAW90J,WAAWugF,GACvB,SAGJ,MAAMqoF,EAAmBH,EAAY3T,IAAe,IAAI+T,EAAiB/T,GACzE8T,EAAiBE,iBAAiBJ,EAAY9vK,IAC1CgwK,EAAiBrnI,UACjBknI,EAAY3T,GAAc8T,GAIlC,OAAOH,EAOH,gBAAgB3tK,GACpB,MAAM6zB,EAAc3vB,KAAK2vB,YACzB,GAAIA,GAAeA,EAAYo6I,QAC3B,IACIp6I,EAAYo6I,QACRjuK,EACAA,EAxJI,SAyJJA,EAAOkE,KAAKopK,eAElB,MAAO9nK,GAIL,IAAOyiC,SAAS,mDAAmDjoC,cAAiBwF,OAM7F,MAAM0oK,EAAab,EAAWz7I,cAYrC,MAAMm8I,EAaF,YAAY/T,GALL,KAAAmU,SAAW,EAMdjqK,KAAK81J,WAAaA,EAOtB,cACI,OAAyB,MAAlB91J,KAAKkhC,UAMT,iBAAiBgpI,GAGhBA,EAAUpuK,KAAKqrC,SAhNH,WAmNPnnC,KAAKmqK,iBACNnqK,KAAKmqK,eAAiBD,EAAUhpI,WAIpClhC,KAAKkhC,UAAYgpI,EAAUhpI,WAEF,MAAlBlhC,KAAKkhC,YAKZlhC,KAAKiqK,UAAYC,EAAUhpI,UAAYlhC,KAAKkhC,UAG5ClhC,KAAKkhC,UAAY,S,gCCvO7B,mNAyDO,SAASkpI,EAAkBr8I,GAC9B,OAAOs8I,EACHt8I,EACAu8I,GAASA,EAAMzxH,UAAU7qB,eACzBugD,GAASA,EAAMvgD,eACf,MAWD,SAASu8I,EAAYx8I,GACxB,OAAOs8I,EACHt8I,EACAy8I,GAAUA,EAAO3xH,UACjB4xH,GAAUA,EAAO3nK,KACjBsrD,GAAWA,GAWZ,SAASs8G,EAAc38I,GAC1B,OAAOs8I,EACHt8I,EACA,KACA08I,GAAUA,EAAO3nK,KACjBsrD,GAAWA,GA2BZ,SAASu8G,EAAkB58I,EAAgDo5H,GAC9E,OAAOkjB,EACHt8I,EACAo3H,GAAiB,GAAGylB,EAAmBzlB,EAActsG,cAAcsuG,GAAsBhC,EAAcnqF,YAAc,KACrHoqF,GAAiB,GAAGA,EAAcp3H,kBAAkBo3H,EAActiJ,QAAQqkJ,GAAsB/B,EAAcpqF,YAAc,KAC5H5M,GAAW,GAAGA,KAAW+4F,GAAsB,MAShD,SAASyjB,EAAmB/xH,GAC/B,MAAO,GAAGA,EAAU7qB,kBAAkB6qB,EAAUC,eAAeD,EAAUE,UAAY,KAgClF,SAASsxH,EACZt8I,EACA88I,EACAC,EACAC,EACA36I,GAOA,QAJqB7xB,IAAjB6xB,IACAA,EAAe,MAGD,MAAdrC,EAAoB,CAGpB,GAA0B,iBAAfA,EACP,OAAOg9I,GAAwBA,EAAqBh9I,IAAeqC,EAIvE,MAAMo6I,EAAUz8I,EAChB,GAAIy8I,EAAO3xH,UACP,OAAOgyH,GAAwBA,EAAqBL,IAAWp6I,EAInE,MAAMq6I,EAAS18I,EACf,GAAI+8I,EACA,OAAOA,EAAqBL,IAAWr6I,EAI/C,OAAOA,I,iCChLX,IAAY46I,E,oEAAZ,SAAYA,GACR,cACA,cAFJ,CAAYA,MAAgB,K,4HCRrB,MAAM,EA2BT,YAA2BC,EAAwBhvB,GAA6B,GAArD,KAAAgvB,YAAwB,KAAAhvB,oBAvB3C,KAAAivB,2BAA6B,sCAK7B,KAAAC,0BAA4B,gBAK5B,KAAAC,uBAAyB,gBAKzB,KAAAr2H,KAAO,QAgBF,yB,mDACT,MAAMs2H,QAA0CrrK,KAAKsrK,eAAeN,EAAiBzwI,MAErF,IAAK8wI,IACAA,EAAkC9uK,MACnC,OAAO,KAIX,IAAK8uK,EAAkC9uK,MAAMzC,OACzC,MAAO,GAGX,MAEMyxK,EAF4BF,EAAkC9uK,MAETgE,OAAO,CAACqwB,EAAK+C,KAAa/C,EAAI+C,EAAO2nG,UAAY3nG,EAAe/C,GAAQ,IAE7H46I,QAAiCxrK,KAAKyrK,oBAAoB1xK,OAAOuG,KAAKirK,IAE5E,IAAKC,IACAA,EAAyBjvK,QACzBivK,EAAyBjvK,MAAMzC,OAChC,OAAO,KAcX,OAXyB0xK,EAAyBjvK,MAEdq0B,IAAIu5C,IACpC,MAAMuhG,EAAa,CAAEnK,gBAAiBgK,EAAyBphG,EAAOlrE,IAAIsiK,iBAE1E,OAAO,+BACAp3F,GACAuhG,QAaF,0BAA0B9pH,EAAQ,K,mDAC3C,MAAM+pH,QAAmC3rK,KAAK4rK,iBAExCr+F,EAAuC,UADavtE,KAAKq+I,kBAG3D,CACIxhJ,IAAK,IAA0Bo4E,IAC/B14E,MAAO,GAAGqlD,IAIZ/S,EAAa,YAAwB7uC,KAAKkrK,4BAChDlrK,KAAK6rK,SAASt+F,EAAO1+B,GAEhB,eACD,YAA2BA,GAI/B,MAAMi9H,QAA2B9rK,KAAK6kI,YAAY14G,mBAAmB0iB,EAAW/rC,MAAO6oK,EAAe,yBACtG,OAAOG,aAAkB,EAAlBA,EAAoBvvK,SAWlB,oBAAoB++H,EAAkBywC,EAA8BzsK,G,mDAC7E,IAAKg8H,IAAaywC,EACd,OAAO,KAGX,MAAMJ,QAAsB3rK,KAAK4rK,iBACjCD,EAAcrsK,OAASA,EACvB,IAAI0sK,QAAoDhsK,KAAKq+I,kBAE9C,SAAX/+I,EACAqsK,EAAcz+F,KAAO/tE,KAAKC,UAAU,CAChC2sK,aACAzwC,WACAqmC,WAAY,mBAEE,WAAXriK,IACP0sK,EAAe,IACRA,EACH,CACInvK,IAAK,IAA0ButC,OAC/B7tC,MAAO,kBAAkBwvK,uBAAgCzwC,QAKrE,MAAMzsF,EAAa,YAAwB7uC,KAAKorK,wBAChDprK,KAAK6rK,SAASG,EAAcn9H,GAE5B,MAAMo9H,QAAoBjsK,KAAK6kI,YAAY14G,mBAAmB0iB,EAAW/rC,MAAO6oK,EAAe,oBAAoBI,GAAc,GAAM,GACvI,GAAIE,EAAYrsI,QAAU,IAAK,CAC3B,MAAMvM,EAAS,+CAA+C44I,EAAYrsI,0BAA0BmsI,gBAAyBzwC,IAC7H,MAAM,IAAIr2H,MAAMouB,GAEpB,OAAO44I,KAUE,uBAAuB3wC,EAAkBywC,G,yDAClD,MAAMJ,QAAsB3rK,KAAK4rK,iBACjCD,EAAcrsK,OAAS,MAEvB,MAAMiC,EAAS,UACFvB,KAAKq+I,kBACd,CACIxhJ,IAAK,IAA0ButC,OAC/B7tC,MAAO,kBAAkBwvK,uBAAgCzwC,OAI3DzsF,EAAa,YAAwB7uC,KAAKorK,wBAChDprK,KAAK6rK,SAAStqK,EAAQstC,GAEjB,eACD,YAA2BA,GAG/B,MAAMmM,QAAiBh7C,KAAK6kI,YAAY14G,mBAAmB0iB,EAAW/rC,MAAO6oK,EAAe,0BAA0BI,GACtH,SAAuB,QAAd,EAAA/wH,EAASz+C,aAAK,eAAEzC,WAQf,eAAeiyK,EAA8BnqH,EAAQ,K,mDAE/D,MAAM+pH,QAAsB3rK,KAAK4rK,iBAG3Br+F,EAAuC,UAFavtE,KAAKq+I,kBAI3D,CACIxhJ,IAAK,IAA0ButC,OAC/B7tC,MAAO,kBAAkBwvK,2BAE7B,CACIlvK,IAAK,IAA0Bo4E,IAC/B14E,MAAO,GAAGqlD,IAIZ/S,EAAa,YAAwB7uC,KAAKorK,wBAOhD,OANAprK,KAAK6rK,SAASt+F,EAAO1+B,GAEhB,eACD,YAA2BA,SAGlB7uC,KAAK6kI,YAAY14G,mBAAmB0iB,EAAW/rC,MAAO6oK,EAAe,kBAAkBI,MAQ1F,oBAAoBG,G,mDAE9B,MAAMP,QAAsB3rK,KAAK4rK,iBAE3B/8H,EAAa,YAAwB7uC,KAAKmrK,2BAI1C59F,EAAuC,IAFO43D,EAAA,EAAkB4W,+BAA+B,KAAM/7I,KAAK+0C,KAAM/0C,KAAKi8I,mBAIvH,CACIp/I,IAAK,IAA0B+8H,IAC/Br9H,MAAO2vK,EAAarrK,KAAK,OAMjC,OAFAb,KAAK6rK,SAASt+F,EAAO1+B,SAER7uC,KAAK6kI,YAAY14G,mBAAmB0iB,EAAW/rC,MAAO6oK,EAAe,0BAOxE,kB,mDACV,GAAI,cACA,OAAO3rK,KAAKmsK,yBAGhB,aADsCnsK,KAAKu9B,kBAEvC4nG,EAAA,EAAkBgY,4BAA4B,IAAe9nF,OAAQr1D,KAAK+0C,KAAM/0C,KAAKi8I,mBACrF9W,EAAA,EAAkB4W,+BAA+B,IAAe1mF,OAAQr1D,KAAK+0C,KAAM/0C,KAAKi8I,sBAMxF,yBAEJ,MAAM/qH,EAAci0G,EAAA,EAAkB+X,yCAAyCl9I,KAAK+0C,KAAM/0C,KAAKi8I,mBAGzFh/G,EAAa,cAuBnB,OAtBIA,IACA/L,EAAY92B,KAAK,CACbyC,IAAK,IAA0Bm0B,OAC/Bz0B,MAAO0gC,EAAWjM,SAEtBE,EAAY92B,KAAK,CACbyC,IAAK,IAA0BohI,OAC/B1hI,MAAO0gC,EAAWmvI,WAEtBl7I,EAAY92B,KAAK,CACbyC,IAAK,IAA0B+tC,WAC/BruC,MAAO0gC,EAAW2N,aAGlB3N,EAAWmR,UAAYnR,EAAWoR,WAClCnd,EAAY92B,KAAK,CACbyC,IAAK,IAA0B8F,SAC/BpG,MAAO,GAAG0gC,EAAWmR,YAAYnR,EAAWoR,eAKjDnd,EAQG,eAAem7I,EAA2B,M,mDAapD,OAZmB,MAAfA,IACAA,EAAc,CACV/sK,OAAQ,eAINU,KAAKu9B,oBACX8uI,EAAYluC,YAAc,WAG9BkuC,EAAYrvI,QAAU,oBAAqB,oBAA+BmoG,EAAA,EAAkBpoG,uBAErFsvI,KAMG,iB,mDAEV,MAAMh1B,EAAiB,cAAc55G,eACrC,QAAuBl/B,IAAnB84I,EACA,OAAOA,EAKX,aAD8B,iBACHnL,EAAA,EAAepuG,YAWhC,YAAY93B,EAAa2lK,EAA4B5mC,EAAsBunC,EAA6BC,G,mDAClH,OAAO,oBACKvsK,KAAKwsK,gBAAgBrgJ,mBAAmBnmB,GAAM2lK,SAC9C3rK,KAAKysK,eAAetgJ,mBAAmBnmB,GAAM2lK,EAAe5mC,EAAcunC,EAAmBC,MAQ/F,gBAAgBvmK,EAAa2lK,G,mDACvC,MAAMe,EAAgB,CAClB1mK,IAAKA,EACLg3B,QAAS2uI,EAAc3uI,QACvBkwC,KAAMy+F,EAAcz+F,KACpB44F,SAAS,GAGb,IAAI9qH,EAEJ,OAAQ2wH,EAAcrsK,QAClB,IAAK,OACD07C,QAAiB,YAAc0xH,GAC/B,MACJ,IAAK,SACD1xH,QAAiB,YAAgB0xH,GACjC,MACJ,QACI1xH,QAAiB,YAAa0xH,GAItC,OAAOvtK,KAAKkC,MAAM25C,GAAY,SAWpB,eAAeh1C,EAAa2lK,EAA4B5mC,EAAsBunC,EAA6BC,G,mDACrH,OACI,WADG,CAEC,IAAY,4CACR,MAAMvxH,QAA2Bh7C,KAAKirK,UAAUjlK,EAAK2lK,GACrD,IAAK3wH,EAASC,GACV,MAAMh2C,MAAM+1C,EAASG,YAKzB,OAHImxH,GACA,cAEGC,EAAavxH,EAAWA,EAASE,UAE5C6pF,MAUJ,SAASx3D,EAAsC1+B,GACnD0+B,EAAMzsE,QAASyvB,IACPA,EAAKh0B,OACLsyC,EAAW5oC,aAAaC,IAAIqqB,EAAK1zB,IAAK0zB,EAAKh0B,Y,iCC7Z3D,gMAaO,MAAMowK,EAAgB,UAMhBC,EAAgB,UAKhBC,EAAkC,YAAe,IAAMF,EAArB,CAAoC,KAetEG,GAVwC,YAAqB,IAAMH,EAA3B,CAA0C,KAUrD,IAKM,YAA0B,IAAMC,EAAhC,CAA+C,KAMxF,SAASG,IACZ,IAAKvvK,OAAOgwE,WACR,OAGJ,MAAMw/F,EAAQxvK,OAAOgwE,WAAW,gCAChC,OAAKw/F,IAIDA,EAAMx4H,aAJV,I,gCCtDJ,IAAYy4H,EAFZ,kCAEA,SAAYA,GACR,aACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,aACA,eACA,eACA,eACA,eAbJ,CAAYA,MAAM,M,gCCFlB,oEAGO,MAAMC,EAAoB,SAWjC,IAAYC,GAAZ,SAAYA,GACR,cACA,0BACA,cACA,oBACA,kBACA,kBACA,gBACA,YACA,cATJ,CAAYA,MAAwB,M,iCCkBpC,IAAY/6F,EAhCZ,kCAgCA,SAAYA,GACR,cACA,cACA,wBACA,sBACA,YACA,gBANJ,CAAYA,MAAe","file":"social.acdc28fcc2614815ff15.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t569: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".\" + undefined[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// The chunk loading function for additional chunks\n \t// Since all referenced chunks are already included\n \t// in this file, this function is empty here.\n \t__webpack_require__.e = function requireEnsure() {\n \t\treturn Promise.resolve();\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/bundles/v1/hybrid/buildNumber/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([1712,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * This will decide whether to create Alert for this app error or no alert. This can generate IcM ticket.\r\n * Alerts ones are tracked at http://aka.ms/AppErrors\r\n * NoAlerts will have separate tab just next to Errors aka Warnings. IcM ticket won't be generated when NoAlert is set.\r\n */\r\nexport enum Severity {\r\n /**\r\n * This is app error with default severity\r\n */\r\n Alert,\r\n\r\n /**\r\n * This is app warning\r\n */\r\n NoAlert,\r\n\r\n /**\r\n * This app error has high user impact\r\n */\r\n HighImpact,\r\n\r\n /**\r\n * This is fatal app error\r\n */\r\n Critical\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Base64 } from \"js-base64\";\r\nimport { SapphireBridgeCallBackFunction } from \"./SapphireTypes\";\r\n\r\ndeclare global {\r\n interface Window {\r\n webkit?: any,\r\n sapphireWebViewBridge?: any\r\n }\r\n}\r\n\r\nconst gJobListeners = {};\r\nconst gObservers = {};\r\n\r\nfunction uuid(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, c => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n\r\nfunction onDataReady(jobId: string, result: string) {\r\n const decoded = Base64.decode(result);\r\n\r\n if (gJobListeners[jobId] && gJobListeners[jobId].length > 0) {\r\n gJobListeners[jobId].forEach((callback: SapphireBridgeCallBackFunction) => {\r\n callback(decoded);\r\n });\r\n\r\n gJobListeners[jobId] = undefined;\r\n }\r\n\r\n if (gObservers[jobId] && gObservers[jobId].length > 0) {\r\n gObservers[jobId].forEach((callback: SapphireBridgeCallBackFunction) => {\r\n callback(decoded);\r\n });\r\n }\r\n}\r\n\r\nfunction subscribeCallback(jobId: string, callback: SapphireBridgeCallBackFunction) {\r\n if (gJobListeners[jobId]) {\r\n gJobListeners[jobId].push(callback);\r\n } else {\r\n gJobListeners[jobId] = [callback];\r\n }\r\n}\r\n\r\nfunction subscribeObserver(jobId: string, callback: SapphireBridgeCallBackFunction) {\r\n if (gObservers[jobId]) {\r\n gObservers[jobId].push(callback);\r\n } else {\r\n gObservers[jobId] = [callback];\r\n }\r\n}\r\n\r\nfunction unSubscribeObserver(jobId: string) {\r\n gObservers[jobId] = undefined;\r\n}\r\n\r\n/**\r\n * Determine if sapphire bridge exists or not.\r\n */\r\nfunction isSapphire() {\r\n // TODO: use optional chaining after moved to typescript 3.7\r\n // const isAndroid = window.sapphireWebViewBridge?.send;\r\n // const isIOS = window.webkit?.messageHandlers?.send?.postMessage;\r\n const isAndroid = window.sapphireWebViewBridge && window.sapphireWebViewBridge.send;\r\n const isIOS = window.webkit\r\n && window.webkit.messageHandlers\r\n && window.webkit.messageHandlers.send\r\n && window.webkit.messageHandlers.send.postMessage;\r\n return isAndroid || isIOS;\r\n}\r\n\r\nlet gInited = false;\r\n\r\n/**\r\n * Initialize sapphire bridge.\r\n * You have to invoke this method before any bridge call.\r\n */\r\nfunction initSapphire() {\r\n if (!gInited && isSapphire()) {\r\n if (!window.sapphireWebViewBridge) { // iOS will not have sapphireWebViewBridge object\r\n window.sapphireWebViewBridge = {};\r\n }\r\n window.sapphireWebViewBridge.$onDataReady = onDataReady;\r\n gInited = true;\r\n }\r\n}\r\n\r\nlet gAppId = undefined;\r\n/**\r\n * Set default app id for this bridge instance.\r\n * In future, every bridge call should has a valid app id, otherwise this call will be dropped.\r\n * @param appId\r\n */\r\nfunction setDefaultAppId(appId: string) {\r\n gAppId = appId;\r\n}\r\n\r\n/**\r\n * Post job data to super app.\r\n * @param scenario scenario name.\r\n * @param data parameters for this scenario.\r\n * @returns job id.\r\n */\r\nfunction postJobDataToWebView(scenario: string, data: any): string {\r\n console.log(scenario, data);\r\n const jobId = uuid();\r\n const msgObj = {\r\n scenario: scenario,\r\n data: {\r\n data: data\r\n },\r\n id: jobId\r\n };\r\n if (gAppId && !msgObj.data.data[\"appId\"]) {\r\n msgObj.data.data[\"appId\"] = gAppId;\r\n }\r\n\r\n const jsonMsg = JSON.stringify(msgObj);\r\n // TODO: use optional chaining after moved to typescript 3.7\r\n // window.webkit?.messageHandlers?.send?.postMessage(jsonMsg);\r\n // window.sapphireWebViewBridge?.send(jsonMsg);\r\n if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.send) {\r\n window.webkit.messageHandlers.send.postMessage(jsonMsg);\r\n }\r\n if (window.sapphireWebViewBridge && window.sapphireWebViewBridge.send) {\r\n window.sapphireWebViewBridge.send(jsonMsg);\r\n }\r\n return jobId;\r\n}\r\n\r\nfunction invoke(method: string, data: any, callback?: SapphireBridgeCallBackFunction) {\r\n const jobId = postJobDataToWebView(method, data);\r\n if (callback) {\r\n subscribeCallback(jobId, callback);\r\n }\r\n}\r\n\r\nfunction listen(data: any, handler: SapphireBridgeCallBackFunction): string {\r\n const handlerId = postJobDataToWebView(\"subscribe\", data);\r\n subscribeObserver(handlerId, handler);\r\n return handlerId;\r\n}\r\n\r\nfunction unlisten(handlerId: string, data: any, callback?: SapphireBridgeCallBackFunction) {\r\n invoke(\"unSubscribe\", data, (result) => {\r\n callback && callback(result);\r\n });\r\n unSubscribeObserver(handlerId);\r\n}\r\n\r\nexport {\r\n isSapphire,\r\n initSapphire,\r\n setDefaultAppId,\r\n invoke,\r\n listen,\r\n unlisten\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Default query param prefix used if none specified\r\n */\r\nexport const DefaultQueryParamPrefix = \"rd\";\r\n/**\r\n * Generates a plain JavaScript object with the client values.\r\n * @param values The values to convert.\r\n */\r\nfunction objectFromSpecification(values) {\r\n const requestDataValue = values;\r\n if (requestDataValue.clientValue !== undefined) {\r\n // If it's a IRequestDataValueSpecification, return the actual getter\r\n return requestDataValue.clientValue;\r\n }\r\n // Otherwise recurse for each key until we find a plain value type\r\n return Object\r\n .keys(values)\r\n .reduce((pv, cv) => (Object.assign(Object.assign({}, pv), { [cv]: objectFromSpecification(values[cv]) })), {});\r\n}\r\n/**\r\n * Allows you to pass data about a request between client and server.\r\n * This interface can be used isomorphically.\r\n *\r\n * The \"spec\" contains \"getters\" to receive the data when called client side.\r\n * To operate server-side you must first serialize the client-side data and pass it via\r\n * query string parameters to the server. You then \"load\" the query string parameters using\r\n * \"loadQueryParams\". Once loaded you can request the data server-side with the same\r\n * interface as the client.\r\n *\r\n * NOTE: The use of URLSearchParams makes this not IE11 compatible without polyfill.\r\n *\r\n * @example\r\n * interface IRequestContext extends IRequestDataObject {\r\n * window: {\r\n * innerWidth: IRequestDataValue\r\n * }\r\n * }\r\n *\r\n * // On client and server\r\n * const rd = new RequestData(\r\n * {\r\n * window: {\r\n * innerWidth: {\r\n * clientValue: window.innerWidth\r\n * }\r\n * }\r\n * });\r\n *\r\n * // Client-side\r\n * const innerWidth = rd.data.window.innerWidth();\r\n *\r\n * const serialized = rd.getSerializedData();\r\n * // Make-call to server\r\n * fetch(`https://assets.msn.com/render?${serialized}`);\r\n *\r\n * // Server-side (in default module)\r\n * requestData.loadQueryParams(req.query)\r\n * const innerWidth = rd.data.window.innerWidth();\r\n */\r\nexport class RequestData {\r\n /**\r\n * @param spec Spec contains serialization metadata as well as client and server value getters\r\n * @param qspPrefix Prefix to append to serialized query string parameters\r\n */\r\n constructor(spec, qspPrefix) {\r\n this.spec = spec;\r\n this.qspPrefix = qspPrefix || DefaultQueryParamPrefix;\r\n }\r\n get verParam() {\r\n return `${this.qspPrefix}.ver`;\r\n }\r\n /**\r\n * Will return memoized values in the same structure as IRequestDataSpecification,\r\n * or the data loaded into\r\n */\r\n get data() {\r\n if (this.memo === undefined) {\r\n // Assume we're client-side if we haven't memoized query string params\r\n this.memo = objectFromSpecification(this.spec.spec);\r\n }\r\n return this.memo;\r\n }\r\n /**\r\n * Loads all query string parameters prefixed with qspPrefix into request data.\r\n * @param qsp The query string params to parse. It is safe to pass in the entire query--not just data prefixed by qspPrefix.\r\n */\r\n loadQueryParams(qsp) {\r\n if (this.memo !== undefined) {\r\n throw \"overwriting existing query string parameters.\";\r\n }\r\n const ver = qsp.get([this.qspPrefix, \"ver\"].join(\".\"));\r\n if (ver !== this.spec.ver) {\r\n throw `unmatched spec version: expected \"${this.spec.ver}\" but got ${ver}.`;\r\n }\r\n this.memo = {};\r\n // Load each query string parameter one at a time\r\n qsp.forEach((value, qp) => {\r\n if (!qp.startsWith(this.qspPrefix)) {\r\n // We don't belong in this set (we don't have the right prefix)--ignore.\r\n return;\r\n }\r\n if (qp === this.verParam) {\r\n // Skip version\r\n return;\r\n }\r\n // Split key by dots and remove prefix\r\n const split = qp.split(\".\").slice(1);\r\n let current = this.memo;\r\n split.forEach((key, i) => {\r\n let newValue = {}; // assume object unless last in list\r\n if (i === split.length - 1) {\r\n try {\r\n newValue = () => JSON.parse(value);\r\n }\r\n catch (ex) {\r\n // Reset memo to undefined and re-throw\r\n this.memo = undefined;\r\n throw ex;\r\n }\r\n }\r\n if (!Object.prototype.hasOwnProperty.call(current, key)) {\r\n current[key] = newValue;\r\n }\r\n if (typeof newValue === \"object\") {\r\n // Already exists--don't overwrite\r\n current = current[key];\r\n return;\r\n }\r\n });\r\n });\r\n }\r\n /**\r\n * Gets the stored values serialized as strings\r\n */\r\n getURLSearchParams() {\r\n const params = new URLSearchParams();\r\n /**\r\n * recurse traverses the data object to build dotted prefixes.\r\n * e.g.\r\n * { a: { b: { c: 5 } } } becomes a.b.c=5\r\n */\r\n const recurse = (obj, prefix) => {\r\n Object.keys(obj).forEach(k => {\r\n const current = obj[k];\r\n const currentPrefix = [...prefix, k];\r\n if (typeof current === \"object\") {\r\n recurse(current, currentPrefix);\r\n return;\r\n }\r\n // This will put explicit quotes (%22) around strings in the query, which is intentional\r\n // so JSON.parse is able to determine the correct type for the value.\r\n params.append(currentPrefix.join(\".\"), JSON.stringify(current()));\r\n });\r\n };\r\n recurse(this.data, [this.qspPrefix]);\r\n params.sort();\r\n // Version is always at the end\r\n params.append(this.verParam, this.spec.ver);\r\n return params;\r\n }\r\n /**\r\n * Sort the search params and serialize them to string.\r\n */\r\n getSerializedData() {\r\n return this.getURLSearchParams().toString();\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// These values should match those found in experiences-base/ColumnWidths.ts\r\nconst DefaultSize2ColumnWidth = 624;\r\nconst DefaultSize3ColumnWidth = 948;\r\nconst DefaultSize4ColumnWidth = 1272;\r\n\r\nconst contentBuffer = 32;\r\n\r\n// The breakpoints to determine the breakpoint from\r\nexport const breakpoints: number[] = [\r\n 0,\r\n DefaultSize2ColumnWidth + contentBuffer,\r\n DefaultSize3ColumnWidth + contentBuffer,\r\n DefaultSize4ColumnWidth + contentBuffer\r\n];","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { breakpoints } from \"./SSRInteropContractHelpers\";\r\nimport { identifyBreakpoint } from \"@microsoft/fast-layouts-react\";\r\n\r\n/**\r\n * The param-name prefix used when serializing params onto the query string.\r\n */\r\nexport const SSRRequestDataPrefix = \"rd\";\r\n\r\n/**\r\n * Defines the \"interop\" contract between client and server-side renderer.\r\n * All of these values will be serialized into request parameters to be passed\r\n * on the HTTP request to the SSR server.\r\n */\r\nexport const SSRContract = {\r\n ver: \"0.1.0\",\r\n spec: {\r\n // IWindow\r\n innerWidth: {\r\n clientValue: () => window.innerWidth\r\n },\r\n innerHeight: {\r\n clientValue: () => window.innerHeight\r\n },\r\n outerWidth: {\r\n clientValue: () => window.outerWidth\r\n },\r\n breakpoint: {\r\n clientValue: () => identifyBreakpoint(window.innerWidth, breakpoints)\r\n },\r\n locationHash: {\r\n clientValue: () => window.location.hash\r\n },\r\n locationHref: {\r\n clientValue: () => window.location.href\r\n },\r\n locationHost: {\r\n clientValue: () => window.location.host\r\n },\r\n locationHostName: {\r\n clientValue: () => window.location.hostname\r\n },\r\n locationOrigin: {\r\n clientValue: () => window.location.origin\r\n },\r\n locationPathName: {\r\n clientValue: () => window.location.pathname\r\n },\r\n locationProtocol: {\r\n clientValue: () => window.location.protocol\r\n },\r\n locationSearch: {\r\n clientValue: () => window.location.search\r\n },\r\n screenTop: {\r\n clientValue: () => window.screenTop\r\n },\r\n screenY: {\r\n clientValue: () => window.screenY\r\n },\r\n // IBrowser\r\n canUseCssGrid: {\r\n clientValue: () => ((window.CSS && window.CSS.supports && CSS.supports(\"display\", \"grid\")) || false)\r\n },\r\n // IDevice\r\n devicePixelRatio: {\r\n clientValue: () => window.devicePixelRatio\r\n },\r\n // ILocale\r\n language: {\r\n clientValue: () => document.documentElement.lang\r\n },\r\n direction: {\r\n clientValue: () => document.documentElement.dir\r\n }\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppEnvironment, appEnvironment } from \"../app/AppEnvironment\";\r\nimport { IRequestContext, IRequestData } from \"./IRequestContext\";\r\nimport { IRequestDataInteropValue, IRequestDataSpecification, RequestData } from \"@msnews/ssr-server\";\r\nimport { SSRContract, SSRRequestDataPrefix } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * Defines the parameters used to create a request contract.\r\n * Destructured from an object due to the combinations of parameters that are valid.\r\n */\r\nexport interface IRequestContextContract {\r\n /**\r\n * URL Search params that contain request data (client-side values sent to the server).\r\n * Only required when called server-side\r\n */\r\n params?: URLSearchParams;\r\n\r\n /**\r\n * The prefix to use to pull query params related to request data.\r\n */\r\n qspPrefix?: string;\r\n\r\n /**\r\n * The specification defining what request data should be passed between client and server.\r\n */\r\n spec?: IRequestDataSpecification;\r\n}\r\n\r\n/**\r\n * Used to propagate client-only data (like window.innerWidth) and singletons (like AppEnvironment)\r\n * in a non-global way to assist in making all libs/components/experiences isomorphic.\r\n */\r\nexport class RequestContext implements IRequestContext {\r\n private requestData: RequestData;\r\n private RequestId: string;\r\n\r\n /**\r\n * Create a new request context.\r\n *\r\n * If spec or qspPrefix is not provided it will use the defaults specified in \"@msnews/isomorphic-util\"\r\n *\r\n * @param IRequestContextContract parameters used to initialize the request context\r\n */\r\n constructor({ params, qspPrefix, spec }: IRequestContextContract = {}, requestId?: string) {\r\n this.requestData = new RequestData(spec || SSRContract, qspPrefix || SSRRequestDataPrefix);\r\n if (params) {\r\n this.requestData.loadQueryParams(params);\r\n }\r\n if (requestId) {\r\n this.RequestId = requestId;\r\n }\r\n }\r\n\r\n /**\r\n * The request ID is used to distinguish requests server-side.\r\n * This method passes through the app environment ActivityId\r\n */\r\n public get requestId(): string {\r\n return this.RequestId || this.app.ActivityId;\r\n }\r\n\r\n /**\r\n * The current app environment.\r\n */\r\n public get app(): AppEnvironment {\r\n // TODO: Remove global reference and add to the constructor parameters.\r\n // The constructor should create a new app environment or accept an optional override.\r\n return appEnvironment;\r\n }\r\n\r\n /**\r\n * The current request data. i.e. client-side data that is passed\r\n * between client and server.\r\n */\r\n public get data(): IRequestData {\r\n return this.requestData.data;\r\n }\r\n}\r\n\r\n/**\r\n * Get clientValue from data getter.\r\n * @param dataGetter the data getter to get client-side value from spec\r\n * @param dataName the data name\r\n * @param throwException If true, throws an exception\r\n */\r\nexport function getContextData(dataGetter: any, dataName: string, throwException = true) {\r\n if ((typeof(dataGetter) === \"function\")) {\r\n const value = dataGetter();\r\n if (value || value === 0) {\r\n return value;\r\n }\r\n }\r\n if (throwException) {\r\n throw new Error(\"Expected \" + dataName + \" to return value. Possible invalid RequestContext spec used or the spec doesn't contain this data.\");\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get current URL from request context. in browser, it has the same value with window.location.href\r\n * @param context the request context\r\n */\r\nexport function safeGetLocationHref(context: IRequestContext): string {\r\n return getContextData(context.data.locationHref, \"locationHref\", false);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ServiceWorkerCacheName, serviceWorkerCacheHelper } from \"@msnews/service-worker-window\";\r\nimport { appEnvironment, sendToWebWorker, getCookie } from \"@msnews/core\";\r\n\r\nimport { WebWorkerMessageId } from \"@msnews/web-worker\";\r\nimport { setCookie } from \"@msnews/experiences-base\";\r\n\r\n// Store the 'cbypass' cookie for 10 mins (the HTTP cache header is set for only 5 mins, but we are storing the cookie for a longer duration to avoid any browser quirks)\r\nconst cookieExpiryTimeDays = 10 / (24 * 60);\r\n\r\n// Common query string name to use when needing to bypass the http cache\r\nexport const cacheBypassQueryStringParamName = \"cbypass\";\r\n\r\nlet cacheBypassValue: number = parseInt(getCookie(cacheBypassQueryStringParamName)) || 0;\r\n\r\n/**\r\n * Helper that fires the OneServiceContentActions.updateCacheBypassValue action\r\n */\r\nexport async function updateCacheBypassValue(): Promise {\r\n cacheBypassValue = Date.now();\r\n setCookie(cacheBypassQueryStringParamName, cacheBypassValue.toString(), cookieExpiryTimeDays, appEnvironment.HostPage.topDomain, \"/\");\r\n\r\n // purge SW River Cache, need to wait for the purge to complete before we tell WW to fetch river content\r\n // or we risk it using the currently cached content\r\n await serviceWorkerCacheHelper.purgeCacheAsync(ServiceWorkerCacheName.river);\r\n\r\n // In the case that webworker is setup to preload the my feed\r\n // we need to tell it to update every time something triggers the update action.\r\n // This is so that webworker pulls in the updated feed so it is ready by when the user switches over\r\n sendToWebWorker({ id: WebWorkerMessageId.UpdateMyFeed, payload: cacheBypassValue });\r\n}\r\n\r\n/**\r\n * Helper that fires the OneServiceContentActions.updateCacheBypassValue action\r\n */\r\nexport async function updateCacheBypassValueWithoutWorker(): Promise {\r\n cacheBypassValue = Date.now();\r\n setCookie(cacheBypassQueryStringParamName, cacheBypassValue.toString(), cookieExpiryTimeDays, appEnvironment.HostPage.topDomain, \"/\");\r\n\r\n // purge SW River Cache, need to wait for the purge to complete before we refresh page or update content\r\n // or we risk it using the currently cached content\r\n await serviceWorkerCacheHelper.purgeCacheAsync(ServiceWorkerCacheName.river);\r\n}\r\n\r\n/**\r\n * Helper that gets the current bypass cache value\r\n * @returns value of cache bypass to use\r\n */\r\nexport function getCurrentCacheBypassValue(): number {\r\n return cacheBypassValue;\r\n}\r\n\r\n/**\r\n * Helper that takes an URL and adds cache bypass value if one is found\r\n */\r\nexport function includeCacheBypassIfNeeded(url: URL): void {\r\n if (cacheBypassValue > 0) {\r\n url.searchParams.set(cacheBypassQueryStringParamName, cacheBypassValue.toString());\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * This is a global tracking object which is used to avoid\r\n * the need to have hard dependencies to a telemetry package.\r\n * Think of this as an interface which is overrided at runtime\r\n * by each app-type.\r\n */\r\n\r\ninterface TelemetryBase {\r\n trackAppErrorEvent(error: AppError): void;\r\n sendSinglePageViewBeacon(beaconId: string): void;\r\n trackPartialImpression(element?: any, viewType?: any, visibilityCheck?: boolean, mechanism?: string, topLevelContainerType?: string): void;\r\n trackEvent(element: HTMLElement,\r\n action?: string,\r\n behavior?: number,\r\n event?: any,\r\n destination?: any,\r\n headline?: string,\r\n module?: string,\r\n index?: string,\r\n campaign?: string,\r\n contentAction?: number): void;\r\n setTrackingAttrs(elementTree: HTMLElement, parentElement?: HTMLElement, options?: any, disableImpressionUpdate?: boolean): void;\r\n}\r\n\r\nexport const TelemetryBase: TelemetryBase = {\r\n trackAppErrorEvent: (): void => undefined,\r\n sendSinglePageViewBeacon: (): void => undefined,\r\n trackPartialImpression: (): void => undefined,\r\n trackEvent: (): void => undefined,\r\n setTrackingAttrs: null\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * lower-case of 'ocid'\r\n */\r\nexport const QUERY_KEY_OCID = \"ocid\";\r\nconst WINDOWS_HEADER_PREFIX = \"win\";\r\n\r\nexport function isWindowsScenario(currentUrl: URL | string): boolean {\r\n if (typeof currentUrl === \"string\") {\r\n try {\r\n currentUrl = new URL(currentUrl);\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!currentUrl) {\r\n return false;\r\n }\r\n\r\n let isMatch = false;\r\n\r\n if (currentUrl) {\r\n currentUrl.searchParams.forEach(function (value, key) {\r\n if (!isMatch && key.toLowerCase() === QUERY_KEY_OCID &&\r\n !!value && value.toLowerCase().substr(0, 3) === WINDOWS_HEADER_PREFIX) {\r\n isMatch = true;\r\n }\r\n });\r\n }\r\n\r\n return isMatch;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, AppErrorPropertyBag, ErrorBehavior, Severity } from \"@msnews/core-contracts\";\r\n\r\n/**\r\n * This file contains the list of errors to log to the server for each feature.\r\n * We are centralizing errors here to make sure we do not have any dupes\\conflicts.\r\n * The idea is that each feature would have their own range of values.\r\n *\r\n * IMPORTANT: Please do not add strings to this file. Please map messages to send in your\r\n * code.\r\n */\r\n\r\n/**\r\n * All app errors are set to create IcM ticket by default unless specified in individual error code otherwise.\r\n */\r\nconst severity = Severity.Alert;\r\n\r\n/**\r\n * Build number is only passed in from updateAppErrorsPropertyBag at page initialization\r\n */\r\nconst pb: AppErrorPropertyBag = {\r\n build: \"\"\r\n};\r\n\r\n/**\r\n * Append or update property bag properties. At page level intialization, this should be called to update the build number.\r\n * Since all app error objects has reference to this base property bag, calling this method will in fact update for all app errors.\r\n * @param newPbInfo Additional information needed for app error property bag\r\n */\r\nexport function updateAppErrorsPropertyBag(newPbInfo: Partial): void {\r\n Object.assign(pb, newPbInfo);\r\n}\r\n\r\n/**\r\n * Getter for current base app error property bag.\r\n */\r\nexport function getAppErrorsPropertyBag(): AppErrorPropertyBag {\r\n return pb;\r\n}\r\n\r\nconst pageTsFileName = \"page.ts\";\r\n\r\n/**\r\n * Error during app initialization for Edge page experience.\r\n * Need to mimic the prime one since telemetry cooking logic looks for this\r\n */\r\nconst establishSignInSource = \"EstablishSignInStateHelpers.ts\";\r\nexport const EstablishSignedInState: AppError = {\r\n id: 1405,\r\n source: establishSignInSource,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents a ServiceUI related error */\r\nexport const ServiceUiError: AppError = {\r\n id: 5100,\r\n source: \"ServiceUiComm.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents a Top Sites related error */\r\nexport const TopSitesError: AppError = {\r\n id: 8010,\r\n source: \"TopSites.tsx\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents a Top Sites error when there are zero rendered top sites */\r\nexport const ZeroTopSitesError: AppError = {\r\n id: 8011,\r\n source: \"TopSites.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Curated sites list is empty */\r\nexport const CuratedSitesEmpty: AppError = {\r\n id: 8012,\r\n source: \"TopSites.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nconst TopSitesEdgeConnectorFileName = \"TopSitesEdge.connector.tsx\";\r\nconst TopSitesEdgeStorageFileName = \"TopSitesStorage.ts\";\r\n\r\nexport const TopSitesEdgeAppErrors = {\r\n ZeroTopSitesError: {\r\n id: 8013,\r\n source: TopSitesEdgeConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n CuratedSitesEmpty: {\r\n id: 8014,\r\n source: TopSitesEdgeStorageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ComponentMountFailed: {\r\n id: 8015,\r\n source: TopSitesEdgeConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorFetchingRichTopSitesDataCollectionFromCms: {\r\n id: 8016,\r\n source: TopSitesEdgeStorageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst TopSitesEdgeNextConnectorFileName = \"TopSitesEdgeNext.connector.tsx\";\r\n\r\nexport const TopSitesEdgeNextAppErrors = {\r\n\r\n /** The React component failed to mount */\r\n ComponentMountFailed: {\r\n id: 8020,\r\n source: TopSitesEdgeNextConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Represents a Top Sites error when there are zero rendered top sites */\r\n ZeroTopSitesError: {\r\n id: 8021,\r\n source: TopSitesEdgeNextConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const TopSiteDialogAppErrors = {\r\n /** The React component failed to mount */\r\n TopSitesDialogFailedToMount: {\r\n id: 8025,\r\n source: \"TopSitesDialog.tsx\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst OneServiceCardProviderFileName = \"OneServiceCardProvider.ts\";\r\n\r\nexport const OneServiceCardProviderResponseEmpty: AppError = {\r\n id: 8029,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderEmptyMyFeed: AppError = {\r\n id: 8030,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderResponseWasNullOrErroneous: AppError = {\r\n id: 8031,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderErrorFetchingOneServiceResponse: AppError = {\r\n id: 8032,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderInvalidJsonInOneServiceResponse: AppError = {\r\n id: 8033,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderInvalidFeedListInOneServiceResponse: AppError = {\r\n id: 8034,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderRiverConfigurationIssue: AppError = {\r\n id: 8035,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to load views river content based on current vertical/category. */\r\nexport const OneServiceCardProviderQueryInterestContentFetchError: AppError = {\r\n id: 8036,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServiceCardProviderStaticContentLoaded: AppError = {\r\n id: 8037,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst OneServiceDailyBriefApi = \"dailyBriefServiceClient.ts\";\r\n\r\nexport const DailyBriefServiceClientAppErrors = {\r\n OneServiceResponseWasNullOrErroneous: {\r\n id: 8038,\r\n source: OneServiceDailyBriefApi,\r\n severity,\r\n pb\r\n },\r\n\r\n OneServiceArticleListWasNullOrErroneous: {\r\n id: 8039,\r\n source: OneServiceDailyBriefApi,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ContentPreviewSourceFile = \"ContentPreview.connector.ts\";\r\nconst ContentPreviewDataSourceFile = \"ContentPreviewData.ts\";\r\nconst ExternalContentMapperHelperFile = \"ExternalContentMapperHelper.ts\";\r\n\r\nexport const ContentPreviewAppErrors = {\r\n\r\n ErrorWhileFetchingContentPreviewContent: {\r\n id: 8041,\r\n source: ContentPreviewDataSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n InvalidResponseFromContentPreviewFetch: {\r\n id: 8042,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidResponseFromContentPreviewResponseJson: {\r\n id: 8043,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorWhileInitializingAsyncContentPreviewContent: {\r\n id: 8044,\r\n source: ContentPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidOrMissingContentId: {\r\n id: 8045,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n MissingDataForExternalContent: {\r\n id: 8046,\r\n source: ExternalContentMapperHelperFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n MissingPartnerLink: {\r\n id: 8047,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorWhileFetchingWindowsShellContentPreviewContent: {\r\n id: 8048,\r\n source: ContentPreviewDataSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst RiverSourceFile = \"River.connector.ts\";\r\n\r\nexport const RiverAppErrors = {\r\n UnknownMetadataReceivedFromRiverCardProvider: {\r\n id: 8051,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n RiverContentProviderFetchException: {\r\n id: 8052,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n SkipPositionedCardsFallbackStrategyFailed: {\r\n id: 8053,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidConfig: {\r\n id: 8054,\r\n source: RiverSourceFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n MissingExperienceTypeMap: {\r\n id: 8055,\r\n source: RiverSourceFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n ChildLoadError: {\r\n id: 8056,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InitialDataLoadError: {\r\n id: 8057,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Warning for when the ordinal children we get from config contains a duplicate instance id. */\r\n DuplicateInstanceIdWarning: {\r\n id: 8058,\r\n source: RiverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const FullHeightFallbackStrategyFailed: AppError = {\r\n id: 8059,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst UserInitiatedPageRefreshSourceFile = \"UserInitiatedPageRefresh.ts\";\r\nexport const UserInitiatedPageRefreshErrors = {\r\n Default: {\r\n id: 8060,\r\n source: UserInitiatedPageRefreshSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PivotContentSourceFile = \"PivotContent.connector.ts\";\r\nexport const PivotContentErrors = {\r\n LoadFailure: {\r\n id: 8070,\r\n source: PivotContentSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PivotContentV2SourceFile = \"PivotContentV2.connector.ts\";\r\nexport const PivotContentV2Errors = {\r\n LoadFailure: {\r\n id: 8071,\r\n source: PivotContentV2SourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PivotContentRenderFailure: AppError = {\r\n id: 8072,\r\n source: \"PivotContent.tsx\",\r\n severity,\r\n pb\r\n};\r\n\r\nconst PivotsNavSourceFile = \"PivotsNav.connector.ts\";\r\nexport const PivotsNavErrors = {\r\n TopicDataConnectorUnavailable: {\r\n id: 8075,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataConnectorUnavailable: {\r\n id: 8076,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n DynamicPivotsHelperLoaderFailed: {\r\n id: 8077,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n LayoutPreferenceDataConnectorUnavailable: {\r\n id: 8078,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PivotsNavV2SourceFile = \"PivotsNavV2.connector.ts\";\r\nexport const PivotsNavV2Errors = {\r\n PivotHoverLoadFailure: {\r\n id: 8079,\r\n source: PivotsNavV2SourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Smart list is empty */\r\nexport const SmartListEmpty: AppError = {\r\n id: 8080,\r\n source: \"SmartList.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents BingWebSSO related App errors */\r\nconst BingWebSSOSourceFile = \"BingWebSSO.tsx\";\r\nexport const BingWebSSOAppErrors = {\r\n /** Failed to render bing websso iframe */\r\n BingWebSSORenderFailed: {\r\n id: 8090,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** User signed-in to MSA on page but bing SSO returned authentication failed response */\r\n BingWebSSOSignInFailed: {\r\n id: 8091,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Bing SSO process did not complete withing required time */\r\n BingWebSSOTimeout: {\r\n id: 8092,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WeatherDataConnectorSourceFile = \"WeatherData.connector.ts\";\r\nconst MultiLocationWeatherServiceSourceFile = \"MultiLocationWeatherService.ts\";\r\nconst WeatherCardConnectorSourceFile = \"WeatherCard.connector.ts\";\r\nconst WeatherPdpClientSourceFile = \"WeatherPdpClient.ts\";\r\nconst WeatherOverviewApiClientSourceFile = \"WeatherOverviewApiClient.ts\";\r\nconst WeatherMapRadarSourceFile = \"RadarLayer.ts\";\r\nconst WeatherMapWeatherLayersSourceFile = \"WeatherLayers.ts\";\r\nconst WeatherMapPrecipitationSourceFile = \"PrecipitationLayer.ts\";\r\nconst WeatherMapGenericSevereLayerSourceFile = \"GenericSevereLayer.tsx\";\r\nconst WeatherMapHeatmapRenderLayerSourceFile = \"HeatmapRender.ts\";\r\nconst WeatherMapBingJsonLabelLayerSourceFile = \"BingJsonLabelLayer.ts\";\r\nconst WeatherMapBingOneCanvasTileLayerSourceFile = \"OneCanvasTileLayer.ts\";\r\nconst WeatherOverviewConnectorSourceFile = \"WeatherOverview.connector.ts\";\r\n\r\n/** Failed to fetch weather summary */\r\nexport const WeatherSummaryFetchError: AppError = {\r\n id: 8100,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.HighImpact,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** No valid Location set from User */\r\nexport const WeatherLocationEmpty: AppError = {\r\n id: 8101,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Not able to read from PDP */\r\nexport const WeatherPDPReadFailed: AppError = {\r\n id: 8102,\r\n source: WeatherPdpClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Not able to write home location to PDP */\r\nexport const WeatherPDPHomeLocationWriteFailed: AppError = {\r\n id: 8103,\r\n source: WeatherPdpClientSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Not able to write display Unit to PDP */\r\nexport const WeatherPDPDisplayUnitWriteFailed: AppError = {\r\n id: 8104,\r\n source: WeatherPdpClientSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Not able to localize Location */\r\nexport const WeatherLocalizeLocationFailed: AppError = {\r\n id: 8105,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nexport const WeatherCardAppErrors = {\r\n /** Failed to fetch local news */\r\n WeatherLocalNewsFetchError: {\r\n id: 8106,\r\n source: WeatherCardConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** No valid Location set from User */\r\n WeatherLocationEmpty: {\r\n id: 8108,\r\n source: WeatherCardConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n }\r\n};\r\n\r\n/** Failed to fetch autosuggest for locations */\r\nexport const WeatherAutoSuggestFetchError: AppError = {\r\n id: 8109,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** for more error about Weather, use 295XX */\r\n\r\nconst SportsPdpServiceClientSourceFile = \"SportsPdpServiceClient.ts\";\r\nconst SportsDataMapperFile = \"libs/feed-layout/.../SportsCardDataMapper.ts\";\r\nexport const SportsCardError = {\r\n /** Failed to fetch league sports pdp */\r\n SportsLeaguePdpFetchError: {\r\n id: 8110,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch league sports pdp */\r\n SportsLeaguePdpInvalidResponse: {\r\n id: 8111,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch players sports pdp */\r\n SportsPlayersPdpFetchError: {\r\n id: 8112,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch players sports pdp */\r\n SportsPlayersPdpInvalidResponse: {\r\n id: 8113,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch teams sports pdp */\r\n SportsTeamsPdpFetchError: {\r\n id: 8114,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch teams sports pdp */\r\n SportsTeamsPdpInvalidResponse: {\r\n id: 8115,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get sports card config */\r\n SportsCardConfigFetchError: {\r\n id: 8116,\r\n source: \"SportsCardConfigReader.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get Team Data */\r\n SportsCardGetFavoriteTeamDataError: {\r\n id: 8117,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get Team Data */\r\n SportsCardGetPlayerBioError: {\r\n id: 8118,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeaguesGamesArrayError: {\r\n id: 8119,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetPdpDataFailure: {\r\n id: 8120,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeagueSeasonYearDataFailure: {\r\n id: 8121,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLocalizedTeamNameDataFailure: {\r\n id: 8122,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetTeamDataFailure: {\r\n id: 8123,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeagueDataFailure: {\r\n id: 8124,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const SportsCardDataMapperError: AppError = {\r\n id: 8125,\r\n source: SportsDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MoneyCardConnectorFile = \"MoneyCard.connector.ts\";\r\nconst MoneyPdpServiceClientFile = \"MoneyPdpServiceClient.ts\";\r\nconst MoneyDataMapperFile = \"libs/feed-layout/.../MoneyCardDataMapper.ts\";\r\nexport const MoneyCardError = {\r\n /** Failed to get quote summary for user */\r\n MoneyQuoteSummaryGetError: {\r\n id: 8130,\r\n source: MoneyCardConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summaries */\r\n MoneyQuoteSummariesGetError: {\r\n id: 8131,\r\n source: MoneyCardConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get pdp data */\r\n MoneyPdpDataGetErrorFromService: {\r\n id: 8132,\r\n source: MoneyPdpServiceClientFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get pdp data because of invalid response */\r\n MoneyPdpInvalidResponseFromService: {\r\n id: 8133,\r\n source: MoneyPdpServiceClientFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summary response for user from service client */\r\n MoneyQuoteSummaryGetErrorFromService: {\r\n id: 8134,\r\n source: MoneyPdpServiceClientFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summary response for user from service client because of invalid response */\r\n MoneyQuoteSummaryInvalidResponseFromService: {\r\n id: 8135,\r\n source: MoneyPdpServiceClientFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Failed to parse data from WPO API */\r\nexport const MoneyDataMapperError: AppError = {\r\n id: 8136,\r\n source: MoneyDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst TrendingNewsConnectorFile = \"TrendingNews.connector.ts\";\r\nexport const TrendingNewsErrors = {\r\n /** Failed to fetch the trending news stories */\r\n DataFetchError: {\r\n id: 8140,\r\n source: TrendingNewsConnectorFile,\r\n severity,\r\n pb\r\n },\r\n /** Failed to fetch the backup data for trending news stories */\r\n BackupDataFetchError: {\r\n id: 8141,\r\n source: TrendingNewsConnectorFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ComplexContentPreviewSourceFile = \"ComplexContentPreview.connector.ts\";\r\nexport const ComplexContentPreviewErrors = {\r\n InitError: {\r\n id: 8150,\r\n source: ComplexContentPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n LoadError: {\r\n id: 8151,\r\n source: ComplexContentPreviewSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n ContentError: {\r\n id: 8152,\r\n source: ComplexContentPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n ContentCountError: {\r\n id: 8153,\r\n source: ComplexContentPreviewSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const GridSectionAppErrors = {\r\n /** Unable to generate river section cards */\r\n GridSectionCardGenerationError: {\r\n id: 8160,\r\n source: \"GridSection.tsx\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MmxEntryPointFileName = \"MMXPage.connector.ts\";\r\n\r\nexport const MmxEntryPointAppErrors = {\r\n /**\r\n * MMX river is not able to load Error Page.\r\n */\r\n MmxErrorPage: {\r\n id: 8170,\r\n source: MmxEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on MMX page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 8171,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Warning that MMX server side rendering is skipped and client side rendering is triggered\r\n * due to either server error or slow server response.\r\n */\r\n MMXSSRSkip: {\r\n id: 8172,\r\n source: MmxEntryPointFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Errors related to Background image\r\n * More errors can be found on 386XX\r\n */\r\nconst irisImageHotspotsProviderFile = \"IrisImageHotspotsProvider.ts\";\r\nconst irisMuseumCardFile = \"IrisMuseumCard.tsx\";\r\nconst irisHotspotCtaFile = \"Hotspot.cta.ts\";\r\nconst bingImageProvider = \"BingImageOfTheDayProvider.ts\";\r\nconst freImageProvider = \"FREBackgroundProvider.ts\";\r\n\r\n/** The Bing Image of the Day failed to load properly */\r\nexport const BingIOTDFailedToLoad: AppError = {\r\n id: 8180,\r\n source: bingImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/** The FRE image method has not been implemented */\r\nexport const FREImageMethodNotImplemented: AppError = {\r\n id: 8181,\r\n source: freImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Iris call from museum card failed */\r\nexport const ImageMuseumIrisDataFetchFailed: AppError = {\r\n id: 8182,\r\n source: irisMuseumCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Hotspots data found for the off page navigation failed inspection. */\r\nexport const InvalidOffPageNavCTA: AppError = {\r\n id: 8183,\r\n source: irisHotspotCtaFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Hotspots cta type or metadata not defined */\r\nexport const CTATypeOrMetdataNotDefined: AppError = {\r\n id: 8184,\r\n source: irisHotspotCtaFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Event not defined */\r\nexport const EventNotDefined: AppError = {\r\n id: 8185,\r\n source: irisHotspotCtaFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Hotspot call to action state not defined */\r\nexport const HotspotCtaStateNotDefined: AppError = {\r\n id: 8186,\r\n source: irisHotspotCtaFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Iris data connector not defined */\r\nexport const ImageIrisDataConnectorUndefined: AppError = {\r\n id: 8187,\r\n source: irisImageHotspotsProviderFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Iris data connector not defined on Museum card */\r\nexport const ImageIrisDataConnectorUndefinedMuseumCard: AppError = {\r\n id: 8188,\r\n source: irisMuseumCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Iris data call failed */\r\nexport const ImageIrisDataFetchFailed: AppError = {\r\n id: 8189,\r\n source: irisImageHotspotsProviderFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SettingsDialogAppErrors = {\r\n /** Failed to get the saved layout preferences */\r\n ReadPreferencesFailed: {\r\n id: 8190,\r\n source: \"SettingsDialogEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch the ConfigData object from the client API */\r\n FetchNtpConfigDataFailed: {\r\n id: 8191,\r\n source: \"SettingsDialogEdgeNextBase.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n ChromiumClientEmbededsearchAPIError: {\r\n id: 8192,\r\n source: \"SettingsDialogEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MsnSettingMenuConnectorFileName = \"MsnSettingMenuConnector.connector.ts\";\r\n\r\nexport const MsnSettingsMenuAppErrors = {\r\n /** Failed to get feedback dialog connector */\r\n FailedToGetFeedbackDialogConnector: {\r\n id: 8193,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8194,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** The Msn settings menu failed to load valid config settings */\r\n MsnSettingsMenuFailedToFetchConfig: {\r\n id: 8195,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const EdgePageSettingsAppErrors = {\r\n ServiceUiError: {\r\n id: 8196,\r\n source: \"EdgeSettingsProvider.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n InlineServiceUiError: {\r\n id: 8197,\r\n source: \"inline-head.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ShowFeedConnectorFileName = \"ShowFeed.connector.ts\";\r\n\r\nexport const ShowFeedAppErrors = {\r\n ExpectedDataMissing: {\r\n id: 8198,\r\n source: ShowFeedConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n MissingPageSettings: {\r\n id: 8199,\r\n source: ShowFeedConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst InfopaneSourceFile = \"Infopane.connector.ts\";\r\nexport const InfopaneErrors = {\r\n InitializeError: {\r\n id: 8201,\r\n source: InfopaneSourceFile,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n id: 8202,\r\n source: InfopaneSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const FeedbackLinkAppErrors = {\r\n /** The Feedback link failed to load valid config settings */\r\n FeedbackLinkFailedToFetchConfig: {\r\n id: 8210,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback dialog connector */\r\n FailedToGetFeedbackDialogConnector: {\r\n id: 8211,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8212,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst FeedbackServiceClientSourceFile = \"FeedbackServiceClient.ts\";\r\nexport const FeedbackDialogAppErrors = {\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8213,\r\n source: \"FeedbackDialog.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Request is not valid, it has no content, or the manifest is not formatted correctly */\r\n BadRequestReportingFeedback: {\r\n id: 8214,\r\n source: FeedbackServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n /** Exception thrown when reporting feedback to OCV */\r\n ExceptionReportingFeedback: {\r\n id: 8215,\r\n source: FeedbackServiceClientSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WindowsShellSettingFeedbackFileName = \"HeaderWindowsShell.connector.ts\";\r\n\r\n/** The Setting Feedback menu failed to load valid config settings */\r\nexport const WindowsShellSettingFeedbackMenuFailedToFetchConfig: AppError = {\r\n id: 8216,\r\n source: WindowsShellSettingFeedbackFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** The Setting Feedback menu Failed to get feedback dialog connector */\r\nexport const WindowsShellSettingFeedbackMenuFailedToGetFeedbackDialogConnector: AppError = {\r\n id: 8217,\r\n source: WindowsShellSettingFeedbackFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** The Setting Feedback menu Failed to get feedback data connector */\r\nexport const WindowsShellSettingFeedbackMenuFailedToGetFeedbackDataConnector: AppError = {\r\n id: 8218,\r\n source: WindowsShellSettingFeedbackFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst OneFooterConnectorFileName = \"OneFooter.connector.ts\";\r\nexport const OneFooterErrors = {\r\n InvalidConfig: {\r\n id: 8220,\r\n source: OneFooterConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8221,\r\n source: OneFooterConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PoweredByLegendAppErrors = {\r\n /** The PoweredBy legend failed to load expected config settings */\r\n PoweredByLegendInvalidConfig: {\r\n id: 8230,\r\n source: \"PoweredByLegend.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst EdgeHeaderConnectorFileName = \"EdgeHeader.connector.ts\";\r\n\r\nexport const EdgeHeaderAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8240,\r\n source: EdgeHeaderConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MicrosoftNewsPageConnectorFileName = \"MicrosoftNewsPage.connector.ts\";\r\n\r\nexport const MicrosoftNewsPageAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8241,\r\n source: MicrosoftNewsPageConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WindowsPageConnectorFileName = \"WindowsPage.connector.ts\";\r\n\r\nexport const WindowsPageAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8242,\r\n source: WindowsPageConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst TabbedInfopaneSourceFile = \"TabbedInfopane.connector.ts\";\r\nexport const TabbedInfopaneErrors = {\r\n InitializeError: {\r\n id: 8250,\r\n source: TabbedInfopaneSourceFile,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n id: 8251,\r\n source: TabbedInfopaneSourceFile,\r\n severity,\r\n pb\r\n },\r\n ChildLoadError: {\r\n id: 8252,\r\n source: TabbedInfopaneSourceFile,\r\n severity,\r\n pb\r\n },\r\n /** Problems with the second oneservice call that gathers the rest of the tabs*/\r\n SubTabFailure: {\r\n id: 8253,\r\n source: TabbedInfopaneSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const MeControlAppErrors = {\r\n /** The SSO call failed to return valid SSO sign-in information. */\r\n SSOFailedError: {\r\n id: 8260,\r\n source: \"MeControl.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** The Me Control failed to load */\r\n MeControlLoadFailedError: {\r\n id: 8261,\r\n source: \"MeControl.tsx\",\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\nconst TabbedInfopaneTabPreviewSourceFile = \"TabbedInfopaneTabPreview.connector.ts\";\r\nexport const TabbedInfopaneTabPreviewErrors = {\r\n InitError: {\r\n id: 8270,\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n id: 8271,\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n LoadError: {\r\n id: 8272,\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const HeaderNavigationLogoAppErrors = {\r\n MegaMenuDataError: {\r\n id: 8280,\r\n source: \"HeaderNavigationLogoConnector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst pageClicksTrackerFileName = \"pageClicksTracker.ts\";\r\nexport const PageClickTrackerErrors = {\r\n InvalidResponse: {\r\n id: 8290,\r\n severity: Severity.NoAlert,\r\n source: pageClicksTrackerFileName,\r\n pb\r\n },\r\n FetchFailure: {\r\n id: 8291,\r\n severity: Severity.NoAlert,\r\n source: pageClicksTrackerFileName,\r\n pb\r\n }\r\n};\r\n\r\nconst TargetingSystemSourceFile = \"TargetingSystem.ts\";\r\nexport const TargetingSystemAppErrors = {\r\n GeneralError: {\r\n id: 8310,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n TopLevelDataMissing: {\r\n id: 8311,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n TrackingDataUPSMissing: {\r\n id: 8312,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n AppEnvironmentValuesMissing: {\r\n id: 8313,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n CallingOneServiceFailed: {\r\n id: 8314,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n CallingUPSServiceFailed: {\r\n id: 8315,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CoachmarkSourceFile = \"Coachmark.connector.ts\";\r\nconst CoachmarkTSX = \"Coachmark.tsx\";\r\nconst CoachmarkCTA = \"Coachmark.cta.ts\";\r\nexport const CoachmarkAppErrors = {\r\n GeneralError: {\r\n id: 8320,\r\n source: CoachmarkTSX,\r\n severity,\r\n pb\r\n },\r\n NotPlaceable: {\r\n id: 8321,\r\n source: CoachmarkTSX,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n NotFoundComponent: {\r\n id: 8322,\r\n source: CoachmarkTSX,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n CoachmarkDataConnectorUndefined: {\r\n id: 8323,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n },\r\n InvalidCTAType: {\r\n id: 8324,\r\n source: CoachmarkCTA,\r\n severity,\r\n pb\r\n },\r\n CTATypeNotDefined: {\r\n id: 8325,\r\n source: CoachmarkCTA,\r\n severity,\r\n pb\r\n },\r\n ConfigDataUndefined: {\r\n id: 8326,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n },\r\n FailedToFetchConfigData: {\r\n id: 8327,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n },\r\n ExceptionFetchingConfigData: {\r\n id: 8328,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n },\r\n EventNotDefined: {\r\n id: 8329,\r\n source: CoachmarkCTA,\r\n severity,\r\n pb\r\n },\r\n CoachmarkStateNotDefined: {\r\n id: 8330,\r\n source: CoachmarkCTA,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CoachmarkDataConnectorSourceFile = \"CoachmarkData.connector.ts\";\r\nconst CoachmarkPayloadSourceFile = \"CoachmarkPayload.ts\";\r\nconst IrisHandlerSourceFile = \"IrisHandler.ts\";\r\nexport const CoachmarkDataAppErrors = {\r\n InvalidCoachmarkMessage: {\r\n id: 8331,\r\n source: CoachmarkPayloadSourceFile,\r\n severity,\r\n pb\r\n },\r\n IrisDataConnectorUndefined: {\r\n id: 8332,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n ErrorFoundForSurface: {\r\n id: 8334,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n TelemetryInfoUndefined: {\r\n id: 8335,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n EventTypeUndefined: {\r\n id: 8336,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n IrisActionUndefined: {\r\n id: 8337,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst AppTraceFile = \"AppTrace\";\r\nexport const AppTraceErrors = {\r\n /** Error for when app trace upload fails */\r\n UploadError: {\r\n id: 8350,\r\n source: AppTraceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ConditionalBannerPayloadSourceFile = \"ConditionalBannerPayload.ts\";\r\nconst ConditionalBannerIrisHandlerSourceFile = \"ConditionalBannerIrisHandler.ts\";\r\n\r\nexport const ConditionalBannerInvalidConditionalBannerMessage: AppError = {\r\n id: 8363,\r\n source: ConditionalBannerPayloadSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerIrisDataConnectorUndefined: AppError = {\r\n id: 8364,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerNoSurfaceFoundForCampaign: AppError = {\r\n id: 8365,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerErrorFoundForSurface: AppError = {\r\n id: 8366,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerTelemetryInfoUndefined: AppError = {\r\n id: 8367,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerEventTypeUndefined: AppError = {\r\n id: 8368,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConditionalBannerIrisActionUndefined: AppError = {\r\n id: 8369,\r\n source: ConditionalBannerIrisHandlerSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst SpotlightPreviewSourceFile = \"SpotlightPreview.connector.ts\";\r\n\r\nexport const SpotlightPreviewAppErrors = {\r\n ErrorWhileFetchingSpotlightPreviewCardInfo: {\r\n id: 8401,\r\n source: SpotlightPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n NoServiceContextMetadata: {\r\n id: 8402,\r\n source: SpotlightPreviewSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SpotlightSourceFile = \"Spotlight.connector.ts\";\r\nexport const SpotlightErrors = {\r\n UnknownError: {\r\n id: 8500,\r\n source: SpotlightSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n ContentFetchError: {\r\n id: 8501,\r\n source: SpotlightSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n PartnerFetchFail: {\r\n id: 8502,\r\n source: \"PartnerService.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const CommentsErrors: { [key: string]: AppError } = {\r\n NoPost: {\r\n id: 8510,\r\n source: \"Comments.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CardActionServiceClientSourceFile = \"CardActionServiceClient.ts\";\r\nexport const CardActionErrors = {\r\n /** Error catch in base CardAction experience container */\r\n CardActionBaseExperienceError: {\r\n id: 8600,\r\n source: \"CardAction.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Post action failed (Like/Dislike) */\r\n CardActionPostActionError: {\r\n id: 8601,\r\n source: \"CarActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Delete action failed (Unlike/Undislike) */\r\n CardActionDeleteActionError: {\r\n id: 8602,\r\n source: \"CardActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Get action failed (GetPublisherDetails) */\r\n CardActionGetActionError: {\r\n id: 8603,\r\n source: \"CardActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Request is not valid, it has no content, or the manifest is not formatted correctly */\r\n CardActionBadRequestReportingToOcv: {\r\n id: 8604,\r\n source: CardActionServiceClientSourceFile, // This error is used in both CardAction and CardActionV2 components\r\n severity,\r\n pb\r\n },\r\n /** Exception thrown when reporting to OCV */\r\n CardActionExceptionReportingToOcv: {\r\n id: 8605,\r\n source: CardActionServiceClientSourceFile, // This error is used in both CardAction and CardActionV2 components\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ContentRelatedSourceFile = \"ContentRelated.connector.ts\";\r\nexport const ContentRelatedErrors = {\r\n /**\r\n * Missing source Id error\r\n */\r\n MissingSourceIdError: {\r\n id: 8700,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Invalid sourceIdError\r\n */\r\n InvalidSourceIdError: {\r\n id: 8701,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Related contents feed fetch error\r\n */\r\n ContentRelatedFeedFetchError: {\r\n id: 8702,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CookieConsentBannerHelper = \"MsccCookieConsentHelper.ts\";\r\nexport const CookieConsentBannerHelperErrors = {\r\n FailedToParseStaticsUrls: {\r\n id: 8810,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n ScriptsNotFound: {\r\n id: 8811,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n StyleSheetsNotFound: {\r\n id: 8812,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n FailedToMountScript: {\r\n id: 8813,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n FailedToMountStyleSheet: {\r\n id: 8814,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents IFrame related errors */\r\nconst IFrameSourceFile = \"IFrame.tsx\";\r\nexport const IFrameErrors = {\r\n /** Message received by event listener not from expected origin */\r\n IFrameUnallowedOriginMessage: {\r\n id: 8820,\r\n source: IFrameSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const RightRailCarouselAppErrors = {\r\n NoChildrenExperienceFoundError: {\r\n id: 8830,\r\n source: \"RightRailCarousel.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst Cookies = \"Cookies.ts\";\r\nexport const CookieRelatedErrors = {\r\n SharedStateConnectorNull: {\r\n id: 8840,\r\n source: Cookies,\r\n severity,\r\n pb\r\n },\r\n\r\n CookieNotCategorized: {\r\n id: 8841,\r\n source: Cookies,\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\nexport const BreakingNewsErrors = {\r\n /** Error fetching Breaking News content */\r\n ContentFetchError: {\r\n id: 8901,\r\n source: \"BreakingNews.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Error fetching Blowout content */\r\n BlowoutDocumentFetchError: {\r\n id: 8902,\r\n source: \"BreakingNews.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BlowoutErrors = {\r\n /** Error fetching Blowout content */\r\n ContentFetchError: {\r\n id: 8921,\r\n source: \"Blowout.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const OverlayErrors: { [name: string]: AppError } = {\r\n /** Error loading experience */\r\n LoadExperienceError: {\r\n id: 8941,\r\n source: \"Overlay.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const ViewsCommonAppErrors = {\r\n /** Invalid intra article component metadata passed. */\r\n InvalidIntraArticleDataError: {\r\n id: 9001,\r\n source: \"IntraArticleHelper.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch from data api. */\r\n DataFetchError: {\r\n id: 9002,\r\n source: \"ViewsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid content markup encountered. */\r\n InvalidDocumentContentError: {\r\n id: 9003,\r\n source: \"ViewsUtility.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load views paddle data from data api. */\r\n ViewsPaddleDataLoadError: {\r\n id: 9004,\r\n source: \"ViewsPaddle.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error during app initialization for views page experience. */\r\n ViewsErrorPage: {\r\n id: 9005,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error during mapping provider data for views content header experience */\r\n ProviderMapperError: {\r\n id: 9006,\r\n source: \"ViewContentHeader.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidContentId: {\r\n id: 9007,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const LegacySharingToolbarAppErrors = {\r\n /** Failed to invoke legacy sharing toolbar. */\r\n LegacySharingToolbarInvokeError: {\r\n id: 9100,\r\n source: \"SharingHelper.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load sharing toolbar. */\r\n SharingToolbarLoadError: {\r\n id: 9101,\r\n source: \"LegacySharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid source content id passed in. */\r\n InvalidContentIdError: {\r\n id: 9102,\r\n source: \"LegacySharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents ContentActionsToolbar experience related errors */\r\nconst ContentActionsToolbarConnectorSourceFile = \"ContentActionToolbar.connector.ts\";\r\nconst ContentActionsToolbarSourceFile = \"ContentActionToolbar.tsx\";\r\nconst ContentActionsToolbarServiceClientSourceFile = \"ContentActionToolbarServiceClient.tsx\";\r\nexport const ContentActionsToolbarAppErrors = {\r\n /** Failed to load sharing toolbar - 9120 */\r\n ContentActionsSharingToolbarLoadError: {\r\n id: 9120,\r\n source: ContentActionsToolbarConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Error fetching article data - 9121 */\r\n ContentActionsArticleDatafetchError: {\r\n id: 9121,\r\n source: ContentActionsToolbarConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Base Experience error - 9122 */\r\n ContentActionsBaseExperienceError: {\r\n id: 9122,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Get content views action failed (getContentViewsRequest) - 9123 */\r\n ContentActionsGetDocumentDataError: {\r\n id: 9123,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Get content status action failed (getContentStatusRequest) - 9124 */\r\n ContentActionsGetContentStatusActionError: {\r\n id: 9124,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Delete action failed (Unlike/Undislike) - 9125 */\r\n ContentActionsDeleteActionError: {\r\n id: 9125,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Post action failed (Like/Dislike) - 9126 */\r\n ContentActionsPostActionError: {\r\n id: 9126,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Prime hybrid error loading the experience - 9127 */\r\n ContentActionsExperienceLoadError: {\r\n id: 9127,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Missing vert/horiz placeholder to flip toolbar - 9128 */\r\n ContentActionsFlipToolbarError: {\r\n id: 9128,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Failed fetching contentStatus - 9129 */\r\n ContentActionsContentStatusFetchError: {\r\n id: 9129,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Failed fetching contentPreview - 9130 */\r\n ContentActionsContentPreviewFetchError: {\r\n id: 9130,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const ContentSharingToolbarAppErrors = {\r\n ContentSharingToolbarInitializationError: {\r\n id: 9150,\r\n source: \"ContentSharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const ContentSharingToolbarSaveForLaterServiceError: AppError = {\r\n id: 9151,\r\n source: \"SaveForLaterServiceClient.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ContentProviderAppErrors = {\r\n /** Invalid source article/gallery id passed in. */\r\n InvalidSourceIdError: {\r\n id: 9200,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch provider details. */\r\n ProviderDetailsFetchError: {\r\n id: 9201,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch provider feed. */\r\n ProviderFeedFetchError: {\r\n id: 9202,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid layout template passed in. */\r\n InvalidLayoutTemplate: {\r\n id: 9203,\r\n source: \"ContentProvider.templates.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** ApplicationCache related messages */\r\nconst refreshHeadDataFile = \"Appcache/RefreshHeadDataAppCache.ts\";\r\nconst edgeAppCacheHelperFile = \"Appcache/EdgeApplicationCacheHelper.ts\";\r\nconst refreshHeadDataAppCacheFile = \"page-error-handling/AppCacheErrorHandler.ts\";\r\n\r\nexport const ApplicationCacheMessages = {\r\n FailedToFetchHeadData: {\r\n id: 9310,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n CatastrophicFailedToFetchHeadData: {\r\n id: 9311,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n StaleActivityIdEncountered: {\r\n id: 9312,\r\n source: refreshHeadDataFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * The current DOM that is in AppCache doesn't match what should be getting served\r\n * to the user due to the existence of the ntps cookie that defines what the locale should be.\r\n * In this case, we must bypass AppCache to get the proper DOM from PCS.\r\n */\r\n LocaleMismatch: {\r\n id: 9313,\r\n source: edgeAppCacheHelperFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Our checks determining we need to bypass appcache for the user are failing\r\n * to detect that the appcache refresh has succeeded. We've tried, for the current page view, to\r\n * bypass without any success.\r\n */\r\n RapidAppcacheForcedRefreshes: {\r\n id: 9314,\r\n source: edgeAppCacheHelperFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n ApplicationCacheAPIErrorEvent: {\r\n id: 9317,\r\n source: refreshHeadDataAppCacheFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n ApplicationCacheAPIObsoleteEvent: {\r\n id: 9318,\r\n source: refreshHeadDataAppCacheFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst MsRewardsConnectorSourceFile = \"MsRewards.connector.ts\";\r\nexport const MsRewardsAppErrors = {\r\n RewardsDataConnectorUndefined: {\r\n id: 9400,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n CategoryKeyOrAppTypeUndefined: {\r\n id: 9401,\r\n source: MsRewardsConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n FailedToFetchCoachmarkUXConfig: {\r\n id: 9402,\r\n source: MsRewardsConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n ConfigDataUndefined: {\r\n id: 9403,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n FailedToFetchConfigData: {\r\n id: 9404,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ExceptionFetchingConfigData: {\r\n id: 9405,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ChromiumPageSettingsDataConnectorUndefined: {\r\n id: 9406,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n PageSettingsStateUndefined: {\r\n id: 9407,\r\n source: MsRewardsConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst RewardsDataConnectorSourceFile = \"RewardsData.connector.ts\";\r\nconst RewardsPayloadSourceFile = \"RewardsPayload.ts\";\r\nconst RewardsServiceClientSourceFile = \"RewardsServiceClient.ts\";\r\nexport const RewardsDataAppErrors = {\r\n IrisDataConnectorUndefined: {\r\n id: 9421,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n CoachmarkDataConnectorUndefined: {\r\n id: 9424,\r\n source: RewardsDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ErrorFetchingUserProfile: {\r\n id: 9425,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ExceptionFetchingUserProfile: {\r\n id: 9426,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ExceptionReportingRewardActivity: {\r\n id: 9427,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BadRequestReportingRewardActivity: {\r\n id: 9428,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n OfferIdNotDefined: {\r\n id: 9429,\r\n source: RewardsDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ActionNameNotDefined: {\r\n id: 9430,\r\n source: RewardsDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n InvalidParameters: {\r\n id: 9431,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n UnknownErrorsReportingRewardActivity: {\r\n id: 9432,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n UnknownErrorOccurred: {\r\n id: 9433,\r\n source: RewardsServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n MaxRetryReachedForUpdatingRewardsPoints: {\r\n id: 9434,\r\n source: RewardsDataConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst TrendingNewsCardConnectorFile = \"mobile-feed/trending-news/TrendingNews.connector.ts\";\r\n/** Failed to fetch the trending news card in mobile feed */\r\nexport const TrendingNewsDataFetchError: AppError = {\r\n id: 9501,\r\n source: TrendingNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to parse JSON data for trending news in mobile feed */\r\nexport const TrendingNewsDataParseError: AppError = {\r\n id: 9502,\r\n source: TrendingNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Received null or empty response for trending news in mobile feed */\r\nexport const TrendingNewsEmptyResponseDataError: AppError = {\r\n id: 9503,\r\n source: TrendingNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingServiceClientSourceFile = \"mobile-feed/shopping-connector/ShoppingServiceClient.ts\";\r\nconst ShoppingWpoDataMapperFile = \"libs/feed-layout/.../ShoppingCarouselCardDataMapper.ts\";\r\n/** Received null or empty response for ShoppingServiceClient */\r\nexport const ShoppingTrendingProductDataError: AppError = {\r\n id: 9504,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingMetaDataError: AppError = {\r\n id: 9505,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingRecentPriceDropsDataError: AppError = {\r\n id: 9506,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingRecommendedForYouProductsDataError: AppError = {\r\n id: 9507,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingRecommendedForYouProductDealsDataError: AppError = {\r\n id: 9508,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingMomentInTimeDataError: AppError = {\r\n id: 9509,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingForYouDataError: AppError = {\r\n id: 9510,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingPopularProductDealDataError: AppError = {\r\n id: 9511,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingMerchantDealDataError: AppError = {\r\n id: 9512,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingMerchantCatDealDataEnUsError: AppError = {\r\n id: 9513,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingMerchantCatDealDataEnGbError: AppError = {\r\n id: 9514,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingTrendingCatDataError: AppError = {\r\n id: 9515,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingTrendingCatProductsDataError: AppError = {\r\n id: 9516,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingTrendingCatDealsDataError: AppError = {\r\n id: 9517,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingTrendingDealsDataError: AppError = {\r\n id: 9518,\r\n source: ShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingTrendingDataMapperError: AppError = {\r\n id: 9519,\r\n source: ShoppingWpoDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst LocalNewsCardConnectorFile = \"LocalNews.connector.ts\";\r\n/** Failed to fetch the local news card in mobile feed*/\r\nexport const LocalNewsDataFetchError: AppError = {\r\n id: 9601,\r\n source: LocalNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to parse JSON data for local news in mobile feed */\r\nexport const LocalNewsDataParseError: AppError = {\r\n id: 9602,\r\n source: LocalNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Received null or empty response for local news in mobile feed */\r\nexport const LocalNewsEmptyResponseDataError: AppError = {\r\n id: 9603,\r\n source: LocalNewsCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedConnectorFile = \"mobile-feed/MobileFeed.connector.ts\";\r\n/** Failed to prefetch data for mobile feed in super app */\r\nexport const MobileFeedPrefetchError: AppError = {\r\n id: 9701,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched data for mobile feed in super app */\r\nexport const MobileFeedPrefetchParseError: AppError = {\r\n id: 9702,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Sesion id not found on next page url in oneservice response */\r\nexport const MobileFeedSessionIdNotFound: AppError = {\r\n id: 9703,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch mobile feed data from bridge get http method. */\r\nexport const MobileFeedBridgeGetHttpError: AppError = {\r\n id: 9704,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON parse mobile feed data from bridge get http method. */\r\nexport const MobileFeedBridgeGetHttpParseError: AppError = {\r\n id: 9705,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Timeout in fetching mobile feed data from bridge get http method */\r\nexport const MobileFeedBridgeGetHttpTimeout: AppError = {\r\n id: 9706,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch mobile feed data from network get http method. */\r\nexport const MobileFeedNetworkGetHttpError: AppError = {\r\n id: 9707,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON parse mobile feed data from bridge get http method. */\r\nexport const MobileFeedNetworkGetHttpParseError: AppError = {\r\n id: 9708,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Recieved empty data from Oneservice network call. */\r\nexport const MobileFeedNetworkEmptyData: AppError = {\r\n id: 9709,\r\n source: MobileFeedConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedShoppingFile = \"mobile-feed/shopping-connector/ShoppingServiceClient.ts\";\r\n/** Failed to prefetch data for mobile feed shopping in super app */\r\nexport const MobileFeedShoppingPrefetchError: AppError = {\r\n id: 9711,\r\n source: MobileFeedShoppingFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched data for mobile feed shopping in super app */\r\nexport const MobileFeedShoppingPrefetchParseError: AppError = {\r\n id: 9712,\r\n source: MobileFeedShoppingFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedFinanceGlanceCardFile = \"mobile-feed/glance-stripe/FinanceGlanceCard.connector.ts\";\r\n/** Failed to prefetch data for mobile feed fiance glance card in super app */\r\nexport const MobileFeedFinanceGlanceCardPrefetchError: AppError = {\r\n id: 9721,\r\n source: MobileFeedFinanceGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched data for mobile feed finance glance card in super app */\r\nexport const MobileFeedFinanceGlanceCardPrefetchParseError: AppError = {\r\n id: 9722,\r\n source: MobileFeedFinanceGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedEsportsGlanceCardFile = \"mobile-feed/glance-stripe/EsportsGlanceCard.connector.ts\";\r\n/** Failed to prefetch data for mobile feed Esports glance card in super app */\r\nexport const MobileFeedEsportsGlanceCardPrefetchError: AppError = {\r\n id: 9731,\r\n source: MobileFeedEsportsGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched data for mobile feed Esports glance card in super app */\r\nexport const MobileFeedEsportsGlanceCardPrefetchParseError: AppError = {\r\n id: 9732,\r\n source: MobileFeedEsportsGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst SuperAppHomepageFile = \"app-types/superapp/Homepage.ts\";\r\nconst SuperAppPersonalizeFile = \"app-types/superapp/Personalize.ts\";\r\n/** Failed to prefetch mobile feed config in super app */\r\nexport const MobileFeedConfigPrefetchError: AppError = {\r\n id: 9741,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched config for mobile feed in super app */\r\nexport const MobileFeedConfigPrefetchParseError: AppError = {\r\n id: 9742,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch mobile feed config in super app */\r\nexport const MobileFeedConfigFetchError: AppError = {\r\n id: 9743,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase fetched config for mobile feed in super app */\r\nexport const MobileFeedConfigFetchParseError: AppError = {\r\n id: 9744,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to generate config url in super app homepage */\r\nexport const MobileFeedConfigGetUrlError: AppError = {\r\n id: 9745,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch InterestV3 config in super app */\r\nexport const InterestV3ConfigFetchError: AppError = {\r\n id: 9746,\r\n source: SuperAppPersonalizeFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch InterestV3 config in super app */\r\nexport const InterestV3ConfigGetUrlError: AppError = {\r\n id: 9747,\r\n source: SuperAppPersonalizeFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to parse super app homepage user config object from local storage */\r\nexport const localStorageUserConfigObjectParseError: AppError = {\r\n id: 9748,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to write super app homepage user config object in to local storage */\r\nexport const localStorageUserConfigObjectWriteError: AppError = {\r\n id: 9749,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Timeout in fetching config for mobile feed in super app */\r\nexport const MobileFeedConfigFetchTimeoutError: AppError = {\r\n id: 9750,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch mobile feed config via network in super app */\r\nexport const MobileFeedConfigNetworkFetchError: AppError = {\r\n id: 9751,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase mobile feed config fetched via network in super app */\r\nexport const MobileFeedConfigNetworkFetchParseError: AppError = {\r\n id: 9752,\r\n source: SuperAppHomepageFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedActionMenuHelperFile = \"ActionMenuHelper.ts\";\r\n/** OneService call failed for action menu Actions type */\r\nexport const MobileFeedActionMenuServiceCallFailedError: AppError = {\r\n id: 9760,\r\n source: MobileFeedActionMenuHelperFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Action menu Sapphire bridge api returned with error response */\r\nexport const MobileFeedActionMenuServiceCallParsedError: AppError = {\r\n id: 9761,\r\n source: MobileFeedActionMenuHelperFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Action menu Sapphire bridge api returned with error response */\r\nexport const MobileFeedActionMenuBridgeCallFailedError: AppError = {\r\n id: 9762,\r\n source: MobileFeedActionMenuHelperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst TopicCarouselConnectorFile = \"TopicCarousel.connector.ts\";\r\n/** Failed to fetch the topic carousel in mobile feed*/\r\nexport const TopicCarouselDataFetchError: AppError = {\r\n id: 9801,\r\n source: TopicCarouselConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Received null or empty response for topic carousel in mobile feed */\r\nexport const TopicCarouselEmptyResponseDataError: AppError = {\r\n id: 9802,\r\n source: TopicCarouselConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to parse content url */\r\nexport const FailedToParseContentUrl: AppError = {\r\n id: 9851,\r\n source: \"mobile-feed/src/helpers/common.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Screen width in SA is zero */\r\nexport const ZeroScreenWidth: AppError = {\r\n id: 9861,\r\n source: \"mobile-feed/src/helpers/DisplayHelper.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nconst MobileFeedRewardsGlanceCardFile = \"mobile-feed/src/glance-stripe/rewards/RewardsGlanceCard.connector.ts\";\r\n/** Failed to prefetch data for mobile feed rewards glance card in super app */\r\nexport const MobileFeedRewardsGlanceCardPrefetchError: AppError = {\r\n id: 9871,\r\n source: MobileFeedRewardsGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to JSON prase prefetched data for mobile feed finance glance card in super app */\r\nexport const MobileFeedRewardsGlanceCardPrefetchParseError: AppError = {\r\n id: 9872,\r\n source: MobileFeedRewardsGlanceCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst VideoCarouselConnectorFile = \"mobile-feed/video-carousel/VideoCarousel.connector.ts\";\r\n/** Failed to parse video data in mobile feed */\r\nexport const VideoCarouselDataParseError: AppError = {\r\n id: 9901,\r\n source: VideoCarouselConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Received null or empty response for video carousel in mobile feed */\r\nexport const VideoCarouselEmptyResponseDataError: AppError = {\r\n id: 9902,\r\n source: VideoCarouselConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch the video carousel card in mobile feed */\r\nexport const VideoCarouselDataFetchError: AppError = {\r\n id: 9903,\r\n source: VideoCarouselConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ViewsGallerySourceFile = \"ViewsGallery.connector.ts\";\r\nexport const ViewsGalleryAppErrors = {\r\n /** Invalid gallery id passed. */\r\n InvalidGalleryIdError: {\r\n id: 10001,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load gallery data. */\r\n GalleryDataLoadError: {\r\n id: 10010,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load images. */\r\n GalleryImagesLoadError: {\r\n id: 10020,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SlideShowConnectorFile = \"SlideShow.connector.ts\";\r\nconst SlideShowCarouselFile = \"SlideShowCarousel.tsx\";\r\nconst SlideShowGalleryFile = \"Gallery.tsx\";\r\nexport const SlideShowAppErrors = {\r\n /** Invalid slideshow id passed. */\r\n InvalidSlideShowIdError: {\r\n id: 10100,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load slideshow data. */\r\n SlideShowDataLoadError: {\r\n id: 10110,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load images. */\r\n SlideShowImagesLoadError: {\r\n id: 10120,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to ads refresh. */\r\n SlideShowAdsRefreshError: {\r\n id: 10130,\r\n source: SlideShowCarouselFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load image. */\r\n SlideShowImageLoadFailed: {\r\n id: 10135,\r\n source: SlideShowCarouselFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to generate Prime Fullscreen Link */\r\n SlideShowFullScreenPrimeError: {\r\n id: 10136,\r\n source: SlideShowGalleryFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const VideoListAppErrors = {\r\n /** Failed to load the video list data. */\r\n VideoListDataLoadError: {\r\n id: 11001,\r\n source: \"VideoList.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst VideoContentSourceFile = \"VideoContent.connector.ts\";\r\nexport const VideoContentAppErrors = {\r\n /** Failed to load the video content data. */\r\n InvalidResponseFromVideoContentResponseJson: {\r\n id: 11101,\r\n source: VideoContentSourceFile,\r\n severity\r\n },\r\n /** Failed to fetch the video content data from server. */\r\n ErrorWhileFetchingContentPreviewContent: {\r\n id: 11102,\r\n source: VideoContentSourceFile,\r\n severity\r\n }\r\n};\r\n\r\nconst VideoContentDownScriptFile = \"AdsHelper.ts\";\r\n/** Failed to download external script file for content video player */\r\nexport const DownloadScriptError: AppError = {\r\n id: 11103,\r\n source: VideoContentDownScriptFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ViewsArticleSourceFile = \"ViewsArticle.connector.ts\";\r\nexport const ViewsArticleAppErrors = {\r\n /** Invalid article id passed. */\r\n InvalidArticleIdError: {\r\n id: 12001,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load article data. */\r\n ArticleDataLoadError: {\r\n id: 12002,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load intra-article component. */\r\n IntraArticleComponentLoadError: {\r\n id: 12003,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to invoke inline gallery experience. */\r\n InlineGalleryInvokeError: {\r\n id: 12004,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Set of errors in Article Page.\r\n */\r\nconst ArticleParserFileName = \"ArticleParser.ts\";\r\nconst ArticleVideoParserFileName = \"VideoParser.ts\";\r\nexport const ArticleInvalidContentError: AppError = {\r\n id: 12100,\r\n source: ArticleParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ArticleInvalidVideoIdError: AppError = {\r\n id: 12101,\r\n source: ArticleParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ArticleInvalidSlideshowIdError: AppError = {\r\n id: 12102,\r\n source: ArticleParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ArticleInvalidVideoContentError: AppError = {\r\n id: 12103,\r\n source: ArticleVideoParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ArticleCopyrightTruncateError: AppError = {\r\n id: 12104,\r\n source: ArticleParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ArticleCreateElementError: AppError = {\r\n id: 12105,\r\n source: ArticleParserFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const InterestsSearchAppErrors = {\r\n /** Received non 200 from OneService */\r\n ErrorResponseFromOneService: {\r\n id: 13000,\r\n source: \"InterestsSearchServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Received a response from 200 but didn't have expected structure */\r\n ErrorResponseFromOneServiceIsInvalid: {\r\n id: 13001,\r\n source: \"InterestsSearchServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n InvalidUrlFoundForElement: {\r\n id: 13002,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n SelectedItemNotFoundInSuggestions: {\r\n id: 13003,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n SelectedItemIsInvalid: {\r\n id: 13004,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst InterestsConnectorFileName = \"Interests.connector.ts\";\r\nconst SettingsConnectorManagerFileName = \"Setting.connector.manager.ts\";\r\nconst TopicDataConnectorFileName = \"TopicData.connector.ts\";\r\nconst TopicCacheFileName = \"TopicCache.ts\";\r\nconst XfeedConnectorFileName = \"Xfeed.connector.ts\";\r\nexport const InterestsAppErrors = {\r\n /** We could not retrieve the list of Topics from OneService */\r\n InterestsRetrieveTopicsError: {\r\n id: 13100,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Followed Topics from OneService */\r\n InterestsRetrieveFollowedTopicsError: {\r\n id: 13101,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Muted Publishers from OneService */\r\n InterestsRetrieveMutedPublishersError: {\r\n id: 13102,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not UnMute a Muted Publisher */\r\n InterestsUnMutePublisherError: {\r\n id: 13103,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not follow a new interests topic */\r\n InterestsFollowTopicError: {\r\n id: 13104,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not unfollow an interests topic */\r\n InterestsUnfollowTopicError: {\r\n id: 13105,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** TopicState should not be undefined */\r\n InterestsTopicStateUndefined: {\r\n id: 13106,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Topics should have rendered */\r\n InterestsShouldHaveRendered: {\r\n id: 13107,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Could not retrieve a specific topic */\r\n InterestsRetrieveTopicError: {\r\n id: 13108,\r\n source: XfeedConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Saved Stories from OneService */\r\n InterestsRetrieveSavedStoriesError: {\r\n id: 13109,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Saved stories config is invalid */\r\n InterestsSavedStoriesInvalidConfigError: {\r\n id: 13110,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not load saved stories children */\r\n InterestsSavedStoriesChildLoadError: {\r\n id: 13111,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for saved stories had invalid json */\r\n InterestsSavedStoriesInvalidJsonError: {\r\n id: 13112,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for saved stories had invalid list of response */\r\n InterestsSavedStoriesInvalidListError: {\r\n id: 13113,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Recommended Topics from OneService */\r\n InterestsRetrieveRecommendedTopicsError: {\r\n id: 13114,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Topic Data Connector is not defined */\r\n UndefinedTopicDataConnector: {\r\n id: 13115,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Read Stories from OneService */\r\n InterestsRetrieveReadStoriesError: {\r\n id: 13116,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Read stories config is invalid */\r\n InterestsReadStoriesInvalidConfigError: {\r\n id: 13117,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not load Read stories children */\r\n InterestsReadStoriesChildLoadError: {\r\n id: 13118,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for Read stories had invalid json */\r\n InterestsReadStoriesInvalidJsonError: {\r\n id: 13119,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for Read stories had invalid list of response */\r\n InterestsReadStoriesInvalidListError: {\r\n id: 13120,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService failed resetting user default set of interests */\r\n FailedRestoringDefaultTopicsError: {\r\n id: 13121,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed opening topics IndexedDB connection */\r\n TopicsFailedIndexedDBConnection: {\r\n id: 13122,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed getting topics indexedDB */\r\n TopicsFailedGettingIndexedDB: {\r\n id: 13123,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed updating topics indexedDB */\r\n TopicsFailedUpdatingIndexedDB: {\r\n id: 13124,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Failed updating segment card user settings to one service */\r\nexport const FailedUpdatingUserSegmentCardsPreferences: AppError = {\r\n id: 13125,\r\n source: SettingsConnectorManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed while checking if topic has limited data in feed */\r\nexport const TopicsFailedCheckingLimitedFeed: AppError = {\r\n id: 13126,\r\n source: TopicDataConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** We could not retrieve the user's list of Followed Publishers from OneService */\r\nexport const InterestsRetrieveFollowedPublishersError: AppError = {\r\n id: 13127,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Could not follow a publisher */\r\nexport const PublisherFollowTopicError: AppError = {\r\n id: 13128,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Could not unfollow a publisher */\r\nexport const PublisherUnfollowTopicError: AppError = {\r\n id: 13129,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** We could not retrieve the user's list of Work Topics from OneService */\r\nexport const InterestsRetrieveWorkTopicsError: AppError = {\r\n id: 13130,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ComponentConnector = \"ComponentConnector.ts\";\r\n\r\n/** {ComponentConnector} base app errors */\r\nexport const ComponentConnectorAppErrors = {\r\n\r\n /** Duplicate child experience instance found */\r\n DuplicateChildInstanceFound: {\r\n id: 14000,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load bundle */\r\n BundleLoadError: {\r\n id: 14001,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n },\r\n\r\n /** ChildConfigInfoList is null */\r\n ChildConfigInfoListNull: {\r\n id: 14002,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Merge List start position must be greater than 0 */\r\n ListStartPositionInvalid: {\r\n id: 14003,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to delay load child bundle */\r\n ChildDelayLoadError: {\r\n id: 14004,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Milestone dependency failed to resolve and timeout triggered */\r\n ExperienceDependencyTimeout: {\r\n id: 14005,\r\n source: ComponentConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** Data connector loading failed */\r\nexport const LoadDataConnectorConfigFailed: AppError = {\r\n id: 14006,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Data connector loading failed */\r\nexport const LoadDataConnectorFailed: AppError = {\r\n id: 14007,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Attempted to load child with invalid experience */\r\nexport const ChildWithInvalidExperience: AppError = {\r\n id: 14008,\r\n source: ComponentConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** App errors for {ExperienceLoader} */\r\nexport const ExperienceLoaderAppErrors = {\r\n /** Logged when neither the config type nor config HREF was provided to the loader */\r\n InsufficientLoadArgs: {\r\n id: 14100,\r\n source: \"ExperienceLoader.ts\",\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\n/** Logged when ConnectComponent call in getConnectedExperience fails */\r\nexport const ConnectComponentFailureError: AppError = {\r\n id: 14101,\r\n source: \"ExperienceLoader.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Logged when loadComponent fails */\r\nexport const LoadComponentFailureError: AppError = {\r\n id: 14102,\r\n source: \"ExperienceLoader.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents SearchHistoryCommon related App errors */\r\nconst SearchHistoryCommonSourceFile = \"SearchHistoryCommon.tsx\";\r\nexport const SearchHistoryCommonAppErrors = {\r\n /** Failed to parse search history response */\r\n ResponseParsingFailed: {\r\n id: 15000,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history service call failed */\r\n ServiceCallFailed: {\r\n id: 15001,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to render search history */\r\n RenderFailed: {\r\n id: 15002,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api response not received within configured time */\r\n Timeout: {\r\n id: 15003,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api call unauthorized */\r\n Unauthorized: {\r\n id: 15004,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api call forbidden */\r\n Forbidden: {\r\n id: 15005,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api not able to find recent search associated with this request */\r\n NotFound: {\r\n id: 15006,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api response not received within configured time but wait for searchHistoryFetchPromise to be completed */\r\n TimeoutDetail: {\r\n id: 15007,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents search history edgenext failed to render */\r\nexport const SearchHistoryEdgenextRenderFailed: AppError = {\r\n id: 15008,\r\n source: \"SearchHistoryEdgenext.tsx\",\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\nconst SearchHistoryEdgeNextSourceFile = \"SearchHistoryEdgenext.connector.ts\";\r\n/** Represents failed to retrieve account type */\r\nexport const FailedToRetrieveAccountType: AppError = {\r\n id: 15009,\r\n source: SearchHistoryEdgeNextSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents failed to retrieve account info */\r\nexport const FailedToRetrieveAccountInfo: AppError = {\r\n id: 15010,\r\n source: SearchHistoryEdgeNextSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents failed to get access token */\r\nexport const FailedToGetAccessToken: AppError = {\r\n id: 15011,\r\n source: SearchHistoryEdgeNextSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nconst SearchHistoryServiceSourceFile = \"SearchHistoryService.ts\";\r\nexport const SearchHistoryResponseParsingFailed: AppError = {\r\n id: 15020,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history service call failed */\r\nexport const SearchHistoryServiceCallFailed: AppError = {\r\n id: 15021,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to render search history */\r\nexport const SearchHistoryRenderFailed: AppError = {\r\n id: 15022,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history api response not received within configured time */\r\nexport const SearchHistoryTimeout: AppError = {\r\n id: 15023,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history api call unauthorized */\r\nexport const SearchHistoryUnauthorized: AppError = {\r\n id: 15024,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history api call forbidden */\r\nexport const SearchHistoryForbidden: AppError = {\r\n id: 15025,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history api not able to find recent search associated with this request */\r\nexport const SearchHistoryNotFound: AppError = {\r\n id: 15026,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Search history api response not received within configured time but wait for searchHistoryFetchPromise to be completed */\r\nexport const SearchHistoryTimeoutDetail: AppError = {\r\n id: 15027,\r\n source: SearchHistoryServiceSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst SearchHistoryEdgeNextWCSourceFile = \"SearchHistoryEdgeNextWC.ts\";\r\n/** Represents failed to retrieve account type */\r\nexport const SearchHistoryFailedToRetrieveAccountType: AppError = {\r\n id: 15029,\r\n source: SearchHistoryEdgeNextWCSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents failed to retrieve account info */\r\nexport const SearchHistoryFailedToRetrieveAccountInfo: AppError = {\r\n id: 15030,\r\n source: SearchHistoryEdgeNextWCSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents failed to get acces s token */\r\nexport const SearchHistoryFailedToGetAccessToken: AppError = {\r\n id: 15031,\r\n source: SearchHistoryEdgeNextWCSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents a Search related error */\r\nexport const SearchError: AppError = {\r\n id: 15100,\r\n source: \"SearchBox.tsx\",\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\n/** Represents missing form code/parameters related App errors */\r\nexport const MissingFormCode: AppError = {\r\n id: 15101,\r\n source: \"SearchBoxCommon.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents RecommendedSearch related App errors */\r\nconst RecommendedSearchSourceFile = \"RecommendedSearchDataService.ts\";\r\nexport const RecommendedSearchErrors = {\r\n /** Warning for failed to parse recommended search response */\r\n ResponseParsingFailed: {\r\n id: 15200,\r\n source: RecommendedSearchSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** warning for recommended search service returned invalid Json response */\r\n InvalidJsonResponse: {\r\n id: 15201,\r\n source: RecommendedSearchSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Warning for recommended search service call failed */\r\n ServiceCallFailed: {\r\n id: 15202,\r\n source: RecommendedSearchSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Failed to render recommended searches */\r\n RenderFailed: {\r\n id: 15203,\r\n source: RecommendedSearchSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Warning for recommended search api response not received within configured time */\r\n Timeout: {\r\n id: 15204,\r\n source: RecommendedSearchSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** recommended search back fill failed to fetch content from CMS */\r\n ContentFetchError: {\r\n id: 15205,\r\n source: RecommendedSearchSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents recommende search below search box rendered failed to render */\r\nexport const RecommendedSearchBelowSearchBoxRenderFailed: AppError = {\r\n id: 15211,\r\n source: \"RecommendedSearchBelowSearchBox.tsx\",\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Represents Trending Now related app errors */\r\nconst TrendingNowSourceFile = \"TrendingNow.connector.ts\";\r\nexport const TrendingNowErrors = {\r\n /** Failed to fetch Trending now content from CMS */\r\n ContentFetchError: {\r\n id: 15250,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch child experience config */\r\n FailedToFetchConfig: {\r\n id: 15251,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load child experience */\r\n FailedToLoadChildExperience: {\r\n id: 15252,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** OCID not set for canvas */\r\n OCIDNotSetWarning: {\r\n id: 15253,\r\n source: \"TrendingNowServiceClient.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Failed to fetch Trending now content from URL */\r\n ContentURLFetchError: {\r\n id: 15254,\r\n source: \"SearchBoxEdgeNextWC.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst RelatedSearchesCardConnectorFile = \"RelatedSearchesCard.connector.ts\";\r\nexport const RelatedSearchesNoSearchTerm: AppError = {\r\n id: 15260,\r\n source: RelatedSearchesCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const RelatedSearchesServiceCallError: AppError = {\r\n id: 15261,\r\n source: RelatedSearchesCardConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const RelatedSearchesResponseEmpty: AppError = {\r\n id: 15262,\r\n source: RelatedSearchesCardConnectorFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents Voice Search related app errors */\r\nexport const VoiceSearchErrors = {\r\n /** Failed to render Voice Search */\r\n RenderFailed: {\r\n id: 15300,\r\n source: \"VoiceSearch.tsx\",\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n },\r\n\r\n /** Represents SearchBoxCommon Voice Search not configured App errors */\r\n SearchBoxCommonVoiceSearchError: {\r\n id: 15301,\r\n source: \"SearchBoxCommon.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Represents SearchBoxEdgeNext Voice Search not configured App errors */\r\n SearchBoxEdgeNextVoiceSearchError: {\r\n id: 15302,\r\n source: \"SearchBoxEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Represents Voice Search communication App errors */\r\n CommunicationsError: {\r\n id: 15303,\r\n source: \"VoiceSearch.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Image Search related app errors */\r\nconst ImageSearchConnectorFile = \"ImageSearch.connector.ts\";\r\n/** Failed to render Image Search */\r\nexport const ImageSearchRenderFailed: AppError = {\r\n id: 15400,\r\n source: \"ImageSearch.tsx\",\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Represents SearchBoxCommon Image Search not configured App errors */\r\nexport const SearchBoxCommonImageSearchError: AppError = {\r\n id: 15401,\r\n source: \"SearchBoxCommon.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents SearchBoxEdgeNext Image Search not configured App errors */\r\nexport const SearchBoxEdgeNextImageSearchError: AppError = {\r\n id: 15402,\r\n source: \"SearchBoxEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Image Search communication App errors */\r\nexport const ImageSearchCommunicationsError: AppError = {\r\n id: 15403,\r\n source: ImageSearchConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst PollsCardConnectorSourceFile = \"PollsCard.connector.ts\";\r\nconst PollsCardSchemaTransformerFile = \"PollsCard.SchemaTransformer.ts\";\r\nexport const PollsCardAppErrors = {\r\n /**\r\n * Failed to fetch polls list\r\n */\r\n PollsListFetchError: {\r\n id: 18000,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to fetch poll data\r\n */\r\n PollDataFetchError: {\r\n id: 18001,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * No data{questions} for poll\r\n */\r\n PollsCardInvalidPoll: {\r\n id: 18002,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Invalid Poll Quiz\r\n */\r\n PollsCardInvalidQuizPoll: {\r\n id: 18003,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsVoteError\r\n */\r\n PollsCardVoteError: {\r\n id: 18004,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsMapStateToPropsError\r\n */\r\n PollsCardMapStateToPropsError: {\r\n id: 18005,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsUnknownError\r\n */\r\n PollsUnknownError: {\r\n id: 18006,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Poll Result Percentage Error\r\n */\r\n PollsResultPercentageError: {\r\n id: 18007,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PollAutoCuratedErrors = {\r\n /**\r\n * Poll Auto curate content error\r\n */\r\n PollAutoCuratedContentError: {\r\n id: 18008,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Poll Auto curate content error\r\n */\r\n PollAutoCuratedInvalid: {\r\n id: 18009,\r\n source: PollsCardSchemaTransformerFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Poll Auto curate content error\r\n */\r\n PollAutoCuratedResultsFetchError: {\r\n id: 18010,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n PollAutoCuratedResultsTransformError: {\r\n id: 18011,\r\n source: PollsCardSchemaTransformerFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PollsCardWCSourceFile = \"PollsCardWC.ts\";\r\nconst PollsCardWCServiceFile = \"PollsCardWCService.ts\";\r\nconst PollsCardWCSchemaTransformerFile = \"SchemaTransformer.tsx\";\r\nexport const PollsCardWCAppErrors = {\r\n /**\r\n * Failed to fetch polls wc list\r\n */\r\n PollsWCDataInitError: {\r\n id: 18100,\r\n source: PollsCardWCSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to fetch polls wc list\r\n */\r\n PollsWCListFetchError: {\r\n id: 18101,\r\n source: PollsCardWCServiceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to fetch poll wc data\r\n */\r\n PollsWCDataFetchError: {\r\n id: 18102,\r\n source: PollsCardWCServiceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * No data{questions} for poll wc\r\n */\r\n PollsWCCardInvalidPoll: {\r\n id: 18103,\r\n source: PollsCardWCSchemaTransformerFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Invalid poll wc Quiz\r\n */\r\n PollsWCCardInvalidQuizPoll: {\r\n id: 18104,\r\n source: PollsCardWCSchemaTransformerFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc vote error\r\n */\r\n PollsWCCardVoteError: {\r\n id: 18105,\r\n source: PollsCardWCServiceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc failed obtaining user cookie\r\n */\r\n PollsWCGetCookieFailed: {\r\n id: 18106,\r\n source: PollsCardWCSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc result percentage error\r\n */\r\n PollsWCResultPercentageError: {\r\n id: 18107,\r\n source: PollsCardWCSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc Auto curate content error\r\n */\r\n PollsWCAutoCuratedContentError: {\r\n id: 18108,\r\n source: PollsCardWCServiceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc auto curate content error\r\n */\r\n PollsWCAutoCuratedInvalid: {\r\n id: 18109,\r\n source: PollsCardWCSchemaTransformerFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Polls wc auto curate content error\r\n */\r\n PollsWCAutoCuratedResultsFetchError: {\r\n id: 18110,\r\n source: PollsCardWCServiceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n PollsWCAutoCuratedResultsTransformError: {\r\n id: 18111,\r\n source: PollsCardWCSchemaTransformerFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst EdgeChromiumPageConnectorFileName = \"EdgeChromiumPage.connector.ts\";\r\nexport const EdgeNextAppErrors = {\r\n /**\r\n * Error during a critical error on the EdgeNext page. This can be during initialization or a react rendering error.\r\n */\r\n EdgeNextErrorPage: {\r\n id: 19000,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error fetching the APP_ANON cookie on EdgeNext page load */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 19001,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on bundle syntax errors.\r\n */\r\n EdgeNextLocalNTPPageShownSyntaxErrors: {\r\n id: 19002,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on bundle failures.\r\n */\r\n EdgeNextLocalNTPPageShownBundleFailureErrors: {\r\n id: 19003,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n EdgeNextLocalNTPPageShownPageExceptionError: {\r\n id: 19004,\r\n source: pageTsFileName,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n EdgeNextLocalNTPPageShownJSSMismatchExceptionError: {\r\n id: 19005,\r\n source: pageTsFileName,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n },\r\n\r\n /**\r\n * When the page is redirected to the local NTP page due to an unavoidable network failure.\r\n */\r\n EdgeNextLocalNtpDueToNetwork: {\r\n id: 19006,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n EdgeNextPageReloadedPageExceptionError: {\r\n id: 19010,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n EdgeNextPageReloadedJSSMismatchExceptionError: {\r\n id: 19011,\r\n source: \"PersistRenderCache.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Errors when form code is missing for Edge Chromium Page.\r\n */\r\n EdgeChromiumPageMissingFormCode: {\r\n id: 19012,\r\n source: EdgeChromiumPageConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * When the is reloaded due to an unavoidable network failure.\r\n */\r\n EdgeNextPageReloadedDueToNetwork: {\r\n id: 19013,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * When the page fails to render due to an unavoidable network failure.\r\n */\r\n EdgeNextPageRenderFailedDueToNetwork: {\r\n id: 19014,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst AdRefreshSourceFile = \"AdsRefresh.ts\";\r\nconst ApnWrapperSourceFile = \"AppnexusWrapper.ts\";\r\nconst DisplayAdsAdsDetectionSourceFile = \"AdsDetection.ts\";\r\nconst DisplayAdsConnectorSourceFile = \"DisplayAds.connector.ts\";\r\nconst DisplayAdsManagerConnectorSourceFile = \"DisplayAdsManager.connector.ts\";\r\nconst NativeAdConnectorSourceFile = \"NativeAd.connector.ts\";\r\nconst OathWrapperSourceFile = \"OathAdsWrapper.ts\";\r\nconst JacWrapperSourceFile = \"JacAdsWrapper.ts\";\r\nconst PlacementManagerConnectorSourceFile = \"PlacementManager.connector.ts\";\r\nconst PlacementManagerCookieSyncSourceFile = \"PlacementManagerCookieSync.ts\";\r\nconst PlacementManagerCMSServiceSourceFile = \"PlacementManagerCMSService.ts\";\r\nconst NativeAdClientConnectorSourceFile = \"NativeAdClient.connector.ts\";\r\nconst PartnerScriptLoaderFile = \"PartnerScriptLoader.ts\";\r\nconst NativeAdBeaconSourceFile = \"Beacon.ts\";\r\n\r\nexport const MonetizationAppErrors = {\r\n /** Failed to load Placement Manager. */\r\n PlacementManagerLoadError: {\r\n id: 20000,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load arrangement position on native ad experience. */\r\n ArrangementPositionLoadError: {\r\n id: 20001,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get CMS Content. */\r\n GetCMSContentError: {\r\n id: 20002,\r\n source: PlacementManagerCMSServiceSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get SAM RTB Response. */\r\n GetSAMRTBResponseError: {\r\n id: 20003,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load MediaNet End Of Article Block. */\r\n MediaNetEOABError: {\r\n id: 20005,\r\n source: \"medianetNativeAdOnArticle.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid promo module config */\r\n InvalidPromoModuleConfig: {\r\n id: 20006,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to download cookie sync external script. */\r\n CookieSyncDownloadExternalScriptError: {\r\n id: 20007,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing cookie sync external script. */\r\n CookieSyncMissingExternalScriptUrl: {\r\n id: 20008,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie sync timeout. */\r\n CookieSyncTimeout: {\r\n id: 20009,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie sync partner script error */\r\n CookieSyncPartnerScriptError: {\r\n id: 20010,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie pixel sync partner download error */\r\n CookieSyncPixelPartnerDownloadError: {\r\n id: 20011,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load cms or backfill native ad. */\r\n CMSOrBackfillNativeAdLoadError: {\r\n id: 20012,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load cms or backfill native ad. */\r\n PlacementPositionMismatchingError: {\r\n id: 20013,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing required property on placement manager config */\r\n MissingRequiredPropertyPlacementManagerConfig: {\r\n id: 20014,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing page type target scope. */\r\n NativeAdTargetScopeError: {\r\n id: 20016,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** River video ad partner error. */\r\n RiverVideoAdPartnerError: {\r\n id: 20017,\r\n source: PartnerScriptLoaderFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** JsTracker ad partner script load error. */\r\n JsTrackerPartnerScriptLoadError: {\r\n id: 20018,\r\n source: NativeAdBeaconSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Viglink load error. */\r\n ViglinkError: {\r\n id: 20019,\r\n source: PartnerScriptLoaderFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing topic id for stripe native ad */\r\n MissingTopicId: {\r\n id: 20020,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Topic id not found for stripe native ad */\r\n TopicIdNotFound: {\r\n id: 20021,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get SAM RTB Response. This App error doesn't trigger alert */\r\n GetSAMRTBResponseErrorNoAlert: {\r\n id: 20022,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load Oath JS */\r\n DisplayAdsOathLoadError: {\r\n id: 20050,\r\n source: OathWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load AppNexus JS */\r\n DisplayAdsApnLoadError: {\r\n id: 20051,\r\n source: ApnWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** AppNexus Provider was empty */\r\n DisplayAdsApnEmptyProvider: {\r\n id: 20052,\r\n source: ApnWrapperSourceFile,\r\n severity: Severity.Alert\r\n },\r\n\r\n /** Ads Detection no initialized properly Provider was empty */\r\n DisplayAdsAdsDetectionNotInit: {\r\n id: 20053,\r\n source: DisplayAdsAdsDetectionSourceFile,\r\n severity: Severity.Alert,\r\n pb\r\n },\r\n\r\n /** Failed to load Moat JS */\r\n DisplayAdsMoatLoadError: {\r\n id: 20054,\r\n source: DisplayAdsManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Display ad objects were not available for refresh */\r\n DisplayAdsNoAdObjects: {\r\n id: 20055,\r\n source: AdRefreshSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** There was a problem in encoding CMS provider ID from base 62 to 32 */\r\n DisplayAdsProviderIdEncode: {\r\n id: 20056,\r\n source: DisplayAdsConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load Jac JS */\r\n DisplayAdsJacLoadError: {\r\n id: 20057,\r\n source: JacWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Display Ad size is not valid */\r\n DisplayAdsInvalidSizeError: {\r\n id: 20058,\r\n source: JacWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** parameter for rendering ads is invalid */\r\n DisplayAdsInvalidParameterError: {\r\n id: 20059,\r\n source: JacWrapperSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const TaboolaRiverAppErrors = {\r\n /** Failed to fetch taboola river data. */\r\n TaboolaRiverFetchError: {\r\n id: 20100,\r\n source: \"TaboolaRiver.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst NativeAdServiceFile = \"NativeAdService.ts\";\r\nconst CMSAdServiceFile = \"CMSAdService.ts\";\r\nconst SAMAdServiceFile = \"SAMAdService.ts\";\r\nconst NativeAdVideoMapperFile = \"VideoPropsMapper.ts\";\r\n\r\n/** Failed to get valid Response from AdService library */\r\nexport const GetNativeAdRequestError: AppError = {\r\n id: 20150,\r\n source: NativeAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid Response from AdService library */\r\nexport const GetNativeAdResponseError: AppError = {\r\n id: 20151,\r\n source: NativeAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid CMS Response from AdService library */\r\nexport const GetCMSAdResponseError: AppError = {\r\n id: 20152,\r\n source: CMSAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid SAM Response from AdService library */\r\nexport const GetSAMRTBResponseErrorNoAlert: AppError = {\r\n id: 20153,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid SAM Response from AdService library */\r\nexport const GetSAMRTBRequestError: AppError = {\r\n id: 20154,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid SAM Response from AdService library */\r\nexport const GetSAMRTBResponseError: AppError = {\r\n id: 20155,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid SAM Response from AdService library */\r\nexport const GetSAMRTBResponseParseError: AppError = {\r\n id: 20156,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get valid SAM Response from AdService library */\r\nexport const GetSAMRTBResponseException: AppError = {\r\n id: 20157,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to backfill invalid SAM placement which will result in empty card */\r\nexport const BackfillSAMRTBResponseError: AppError = {\r\n id: 20158,\r\n source: SAMAdServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to play nativead video */\r\nexport const PlayNativeAdVideoError: AppError = {\r\n id: 20159,\r\n source: NativeAdVideoMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst NativeAdFeedCardFile = \"NativeAdFeedCard.connector.ts\";\r\nconst NativeAdGlanceCardFile = \"NativeAdGlanceCard.connector.ts\";\r\n\r\n/** Failed to get valid Response from AdService library in SuperApp Feed card*/\r\nexport const GetNativeAdFeedCardError: AppError = {\r\n id: 20160,\r\n source: NativeAdFeedCardFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Failed to get valid Response from AdService library in SuperApp Glance card*/\r\nexport const GetNativeAdGlanceCardError: AppError = {\r\n id: 20161,\r\n source: NativeAdGlanceCardFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nconst PCSPageHTMLFile = \"PCS-Page.cshtml\";\r\nexport const CoreLibAppErrors = {\r\n /** Deprecated composition layout config in use */\r\n DeprecatedCompositionLayoutUsed: {\r\n id: 20200,\r\n source: \"LayoutBase.inspector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Deprecated composition layout config in use */\r\n InvalidColumnInGridConfig: {\r\n id: 20201,\r\n source: \"GridBase.inspector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during loading of page bundles.\r\n */\r\n ErrorLoadingBundle: {\r\n id: 20202,\r\n source: PCSPageHTMLFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n /**\r\n * Generic JS exceptions.\r\n */\r\n GenericJSException: {\r\n id: 20203,\r\n source: PCSPageHTMLFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Missing localStorage exception\r\n */\r\n LocalStorageDoesntExist: {\r\n id: 20204,\r\n source: \"WebStorage.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Missing sessionStorage exception\r\n */\r\n SessionStorageDoesntExist: {\r\n id: 20205,\r\n source: \"WebStorage.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Exception thrown during rendering in React, with no additional handling specified.\r\n * This means React has unmounted your DOM tree and you'll be getting a blank page.\r\n */\r\n ReactRenderException: {\r\n id: 20206,\r\n source: PCSPageHTMLFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n },\r\n\r\n /** App Error to log network connection status */\r\n NetworkConnectionStatus: {\r\n id: 20207,\r\n source: \"NetworkCheck.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Authenticatedfetch related App errors */\r\nconst AuthenticatedFetchSourceFile = \"AuthenticatedFetch.ts\";\r\nexport const AuthenticatedFetchErrors = {\r\n ErrorCodeReceived: {\r\n id: 20302,\r\n source: AuthenticatedFetchSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n CallFailed: {\r\n id: 20303,\r\n source: AuthenticatedFetchSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n EmptyJsonResponse: {\r\n id: 20304,\r\n source: AuthenticatedFetchSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst resolverSourceFile = \"resolver.ts\";\r\nexport const ResolverAppErrors = {\r\n /**\r\n * IndexedDb write failed in resolver.\r\n */\r\n IndexedDbWriteFailed: {\r\n id: 22010,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb read failed in resolver.\r\n */\r\n IndexedDbReadFailed: {\r\n id: 22011,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver fetch errors.\r\n */\r\n CrsFetchError: {\r\n id: 22012,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver was enabled but we still went to Assets to getConfig and merge configs at client (classic resolver).\r\n */\r\n ReceivedConfigFromCdnAsCrsFetchFailed: {\r\n id: 22013,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Exception In GetConfig function.\r\n */\r\n GetConfigException: {\r\n id: 22014,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n },\r\n\r\n /**\r\n * IndexedDb bulk read failed in resolver.\r\n */\r\n IndexedDbBulkReadFailed: {\r\n id: 22015,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to remove cached config\r\n */\r\n IndexedDbFailedToRemoveCachedConfig: {\r\n id: 22016,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to clear all configs\r\n */\r\n IndexedDbFailedToClearAllCachedConfigs: {\r\n id: 22017,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache is purged due to changes in config\r\n */\r\n RenderCachePurgedDueToChangesInConfig: {\r\n id: 22018,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache failed purge even though config changes were detected.\r\n */\r\n FailedToPurgeRenderCache: {\r\n id: 22019,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to refresh config cache\r\n */\r\n RefreshConfigCacheFailed: {\r\n id: 22020,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to initialize indexedDb\r\n */\r\n IndexedDbInitFailed: {\r\n id: 22021,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Different cache busting identifier\r\n */\r\n DifferentCbid: {\r\n id: 22022,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error writing prg flights to localStorage\r\n */\r\n PrgFlightLsWriteError: {\r\n id: 22023,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error reading prg flights to localStorage\r\n */\r\n PrgFlightLsReadError: {\r\n id: 22024,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Configs served from CDN after CRS fetch failed\r\n */\r\nexport const ResolverErrorConfigsDownloadedByCdn: AppError = {\r\n id: 22025,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Cached configs are for different flight\r\n */\r\nexport const CachedConfigsForDifferentFlight: AppError = {\r\n id: 22026,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * CRS sent non-200 response\r\n */\r\nexport const ConfigCrsFetchNon200Response: AppError = {\r\n id: 22027,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Cdn config fetch received non-200 response\r\n */\r\nexport const ConfigCdnFetchNon200Response: AppError = {\r\n id: 22028,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Invalid config ref received to resolve configs when Git configs is enabled\r\n */\r\nexport const GitConfigsInvalidConfigRef: AppError = {\r\n id: 22029,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/**\r\n * Invalid configResolver object for Git configs flight\r\n */\r\nexport const GitConfigsInvalidConfigResolver: AppError = {\r\n id: 22030,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/**\r\n * Config Service Resolver timeout.\r\n */\r\nexport const CrsFetchTimeout: AppError = {\r\n id: 22031,\r\n source: resolverSourceFile,\r\n severity,\r\n pb: {\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n\r\n/** Starts from 22050 */\r\nexport const FallbackResolverAppErrors = {\r\n /**\r\n * getConfigRecursive function try catch failed.\r\n */\r\n RecursiveGetFailed: {\r\n id: 22050,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * BlobFetcher fetch failed for configs or config index.\r\n */\r\n BlobFetchReturnedNull: {\r\n id: 22051,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const HubAppErrors = {\r\n /**\r\n * Error during app initialization for hub page experience.\r\n */\r\n HubErrorPage: {\r\n id: 22100,\r\n source: \"web.page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Warning that hub server side rendering is skipped and client side rendering is triggered\r\n * due to either server error or slow server response.\r\n */\r\n HubSSRSkip: {\r\n id: 22110,\r\n source: \"web.page.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst EdgePageFileName = \"Edge/web.page.ts\";\r\n\r\n/** Edge App Type errors. */\r\nexport const EdgeAppErrors = {\r\n ErrorFetchingChildCookie: {\r\n id: 23000,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for Edge page experience.\r\n */\r\n EdgeErrorPage: {\r\n id: 23001,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on Edge page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 23002,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during set flight instrumentation data\r\n */\r\n ErrorSetFlightInstrumentation: {\r\n id: 23003,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Warning that edge server side rendering is skipped and client side rendering is triggered\r\n * due to either server error or slow server response.\r\n */\r\n EdgeSSRSkip: {\r\n id: 23004,\r\n source: EdgePageFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const BingCardsAppErrors = {\r\n BingCardGetHotelAnswersError: {\r\n id: 24001,\r\n source: \"BingCardsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardGetHotelErrorFromService: {\r\n id: 24002,\r\n source: \"BingCardsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardGetAnswersError: {\r\n id: 24003,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardInvalidEntityType: {\r\n id: 24004,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardErrorOut: {\r\n id: 24005,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BingAnswersAppErrors = {\r\n UnknownError: {\r\n id: 24101,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n FailedToLoadData: {\r\n id: 24102,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n NoCardsContentType: {\r\n id: 24103,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n NoCardsRelated: {\r\n id: 24104,\r\n source: \"BingAnswers.connector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst BingShoppingShopCardServiceClientSourceFile = \"bing-shopping/ShopCardServiceClient.ts\";\r\nconst BingShoppingShopCardWpoDataMapperFile = \"libs/feed-layout/.../ShoppingCardDataMapper.ts\";\r\n\r\nexport const BingShoppingShopCardError = {\r\n ShopCardServiceFetchError: {\r\n id: 24200,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceFetchInvalidResponse: {\r\n id: 24201,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceEmptyPersonalizedResponse: {\r\n id: 24202,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceInvalidPersonalizedResponse: {\r\n id: 24203,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceEmptyTrendingResponse: {\r\n id: 24204,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceInvalidTrendingResponse: {\r\n id: 24205,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const ShopCardWpoDataMapperError: AppError = {\r\n id: 24206,\r\n source: BingShoppingShopCardWpoDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst BingShoppingLifestyleCardServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCardServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleCardCdnServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCardCdnServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleAutosuggestServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleAutosuggestServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleConnectorSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCard.connector.ts\";\r\nexport const BingShoppingLifestyleCardError = {\r\n // Lifestyle Shopcard service Errors\r\n LifestyleShopCardServiceFetchError: {\r\n id: 24300,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceFetchInvalidResponse: {\r\n id: 24301,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceEmptyResponse: {\r\n id: 24302,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceInvalidResponse: {\r\n id: 24303,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n // Lifestyle Shopcard Cdn service Errors\r\n LifestyleShopCardCdnServiceFetchError: {\r\n id: 24304,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardCdnServiceFetchInvalidResponse: {\r\n id: 24305,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardCdnServiceInvalidResponse: {\r\n id: 24306,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n // Lifestyle Autosuggest service Errors\r\n LifestyleShopAutosuggestServiceFetchError: {\r\n id: 24310,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceFetchInvalidResponse: {\r\n id: 24311,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceEmptyResponse: {\r\n id: 24312,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceInvalidResponse: {\r\n id: 24313,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestInvalidSuggestionUrl: {\r\n id: 24314,\r\n source: BingShoppingLifestyleConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ShoppingSmartListServiceClientSourceFile =\r\n \"shopping-smart-list/ShoppingSmartListServiceClient.ts\";\r\n\r\nconst ShoppingSmartListConnectorSourceFile =\r\n \"shopping-smart-list/ShoppingSmartList.connector.ts\";\r\n\r\nexport const ShoppingSmartListError = {\r\n ShoppingSmartListServiceEmptyResponse: {\r\n id: 24400,\r\n source: ShoppingSmartListServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShoppingSmartListServiceFetchError: {\r\n id: 24401,\r\n source: ShoppingSmartListServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShoppingSmartListServiceInvalidResponse: {\r\n id: 24402,\r\n source: ShoppingSmartListServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShoppingSmartListServiceMissingRequiredFields: {\r\n id: 24403,\r\n source: ShoppingSmartListServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShoppingSmartListChromiumApiConfigDataFetchFailure: {\r\n id: 24404,\r\n source: ShoppingSmartListConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst BingMiniShoppingServiceClientSourceFile =\r\n \"bing-mini-shopping/BingMiniShoppingServiceClient.ts\";\r\n\r\nexport const BingMiniShoppingError = {\r\n // Bing-MiniShopping service Errors\r\n BingMiniShoppingServiceFetchError: {\r\n id: 24500,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceEmptyResponse: {\r\n id: 24501,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceInvalidResponse: {\r\n id: 24502,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceInsufficientDealsItems: {\r\n id: 24503,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceInsufficientActiveDealsItems: {\r\n id: 24504,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceInsufficientTrendingItems: {\r\n id: 24505,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n BingMiniShoppingServiceInsufficientTrendingCategories: {\r\n id: 24506,\r\n source: BingMiniShoppingServiceClientSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst BingShoppingMeStripeServiceClientSourceFile =\r\n \"bing-shopping-mestripe/BingShoppingMeStripeServiceClient.ts\";\r\n\r\nexport const BingShoppingMeStripeServiceFetchError: AppError = {\r\n id: 24510,\r\n source: BingShoppingMeStripeServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingShoppingMeStripeServiceEmptyResponse: AppError = {\r\n id: 24511,\r\n source: BingShoppingMeStripeServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingShoppingMeStripeServiceInvalidResponse: AppError = {\r\n id: 24512,\r\n source: BingShoppingMeStripeServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingShoppingMeStripeServiceMissingRequiredFields: AppError = {\r\n id: 24513,\r\n source: BingShoppingMeStripeServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingCarouselServiceClientSourceFile =\r\n \"shopping-carousel/ShoppingCarouselServiceClient.ts\";\r\n\r\nexport const ShoppingCarouselEntitiesDataServiceFetchError: AppError = {\r\n id: 24520,\r\n source: ShoppingCarouselServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingCarouselEntitiesDataServiceEmptyResponse: AppError = {\r\n id: 24521,\r\n source: ShoppingCarouselServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingCarouselEntitiesDataServiceInvalidResponse: AppError = {\r\n id: 24522,\r\n source: ShoppingCarouselServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingCarouselEntitiesDataServiceInsufficientItems: AppError = {\r\n id: 24523,\r\n source: ShoppingCarouselServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingCarouselConnectorSourceFile =\r\n \"shopping-carousel/ShoppingCarousel.connector.ts\";\r\n\r\nexport const ShoppingCarouselGenericError: AppError = {\r\n id: 24524,\r\n source: ShoppingCarouselConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingCarouselSourceFile =\r\n \"shopping-carousel/ShoppingCarousel.tsx\";\r\n\r\nexport const ShoppingCarouselRenderError: AppError = {\r\n id: 24525,\r\n source: ShoppingCarouselSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingCarouselMapperSourceFile =\r\n \"shopping-carousel/ShoppingCarouselCardDataMapper.ts\";\r\n\r\nexport const ShoppingCarouselCardMapperError: AppError = {\r\n id: 24526,\r\n source: ShoppingCarouselMapperSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ShoppingContentCardServiceClientSourceFile =\r\n \"ShoppingContentCard.serviceClient.ts\";\r\n\r\nexport const ShoppingContentCardServiceFetchError: AppError = {\r\n id: 24530,\r\n source: ShoppingContentCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingContentCardServiceEmptyResponse: AppError = {\r\n id: 24531,\r\n source: ShoppingContentCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingContentServiceInvalidData: AppError = {\r\n id: 24532,\r\n source: ShoppingContentCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingContentServiceInsufficientActiveItems: AppError = {\r\n id: 24533,\r\n source: ShoppingContentCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ShoppingContentServiceMissingFields: AppError = {\r\n id: 24534,\r\n source: ShoppingContentCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SelectCarouselCardDataMapperError: AppError = {\r\n id: 24601,\r\n source: \"select-carousel/select-carousel-card/SelectCarouselCardDataMapper.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nconst RecommendedSearchCarouselMapperSourceFile =\r\n \"RecommendedSearchCarouselDataMapper.ts\";\r\nexport const RecommendedSearchCarouselMapperError: AppError = {\r\n id: 24700,\r\n source: RecommendedSearchCarouselMapperSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error in page.ts of Shopping app type.\r\n */\r\nexport const ShoppingErrorPage: AppError = {\r\n id: 24900,\r\n source: \"Shopping/page.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const PageSettingsDataConnectorAppErrors = {\r\n PageSettingsGetInitialState: {\r\n id: 26001,\r\n source: \"PageSettingsData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MicrosoftNewsEntryPointFileName = \"MicrosoftNews.connector.ts\";\r\nexport const MicrosoftNewsEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for MicrosoftNews page experience.\r\n */\r\n MicrosoftNewsErrorPage: {\r\n id: 27000,\r\n source: MicrosoftNewsEntryPointFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const NavigationDataConnectorAppErrors = {\r\n /**\r\n * Error while trying to fetch the Navigation Items\r\n */\r\n NavigationDataGetNavigationItems: {\r\n id: 28000,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbInitializationFailed: {\r\n id: 28001,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbWriteFailed: {\r\n id: 28002,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbBulkReadFailed: {\r\n id: 28003,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const CategoryDataConnectorAppErrors = {\r\n /**\r\n * Error while to get the category details\r\n */\r\n CategoryDataGetCategoryDetail: {\r\n id: 28100,\r\n source: \"CategoryData.connector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbInitializationFailed: {\r\n id: 28101,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbWriteFailed: {\r\n id: 28102,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbBulkReadFailed: {\r\n id: 28103,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst OneSericeUtility = \"OneSericeFetch.ts\";\r\n/* App errors related to centralized OneService fetch call */\r\nexport const FetchResponseNullOrError: AppError = {\r\n id: 28210,\r\n source: OneSericeUtility,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const NonAuthFetchResponseNullOrError: AppError = {\r\n id: 28211,\r\n source: OneSericeUtility,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const AuthFetchResponseNullOrError: AppError = {\r\n id: 28212,\r\n source: OneSericeUtility,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * App reporting messages related to Stripe Experience\r\n */\r\nexport const StripeAppErrors = {\r\n InvalidConfig: {\r\n id: 28300,\r\n source: \"Stripe.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const NotificationBellErrors = {\r\n /** Failed to fetch the notification bell data content */\r\n DataFetchError: {\r\n id: 28400,\r\n source: \"NotificationBell.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n JsonParseError: {\r\n id: 28401,\r\n source: \"LocalStorageSettings.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n NewsItemDataFetchError: {\r\n id: 28402,\r\n source: \"NotificationBellServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n MalformedNewsItemResponseError: {\r\n id: 28403,\r\n source: \"NotificationBellServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SettingFetchError: {\r\n id: 28404,\r\n source: \"InterestsWC.ts\",\r\n severity,\r\n pb\r\n },\r\n SettingUpdateError: {\r\n id: 28405,\r\n source: \"InterestsWC.ts\",\r\n severity,\r\n pb\r\n },\r\n CountInconsistent: {\r\n id: 28406,\r\n source: \"NotificationBellWC.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Layout Preference Data Connector related App errors */\r\nconst LayoutPreferenceDataSourceFile = \"LayoutPreferenceData.connector.ts\";\r\nexport const LayoutPreferenceDataErrors = {\r\n /** Failed to retrieve Layout Preference Data */\r\n LayoutPreferenceDataGetFailed: {\r\n id: 28500,\r\n source: LayoutPreferenceDataSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * App reporting messages related to StripeView Experience\r\n */\r\nexport const StripeViewAppErrors = {\r\n InvalidConfig: {\r\n id: 28600,\r\n source: \"StripeView.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n ChildLoadError: {\r\n id: 28601,\r\n source: \"StripeView.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Line Chart Connector related app errors */\r\nconst SentimentLineChartSourceFile = \"SentimentLineChart.connector.ts\";\r\nexport const SentimentLineChartErrors = {\r\n ContentFetchError: {\r\n id: 28700,\r\n source: SentimentLineChartSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Result Card Connector related app errors */\r\nconst SentimentResultCardSourceFile = \"SentimentResultCard.connector.ts\";\r\nexport const SentimentResultCardErrors = {\r\n ContentFetchError: {\r\n id: 28710,\r\n source: SentimentResultCardSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Map Connector related app errors */\r\nconst SentimentMapSourceFile = \"SentimentMap.connector.ts\";\r\nexport const SentimentMapErrors = {\r\n ContentFetchError: {\r\n id: 28720,\r\n source: SentimentMapSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Election Results Card Connector related app errors */\r\nconst ElectionResultsCardFile = \"ElectionResultsCard.connector.ts\";\r\nexport const ElectionResultsCardErrors = {\r\n ContentFetchError: {\r\n id: 28730,\r\n source: ElectionResultsCardFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Bar chart Connector related app errors */\r\nconst SentimentBarChartSourceFile = \"SentimentBarChart.connector.ts\";\r\nexport const SentimentBarChartErrors = {\r\n ContentFetchError: {\r\n id: 28740,\r\n source: SentimentBarChartSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Elction Result Map connector App errors */\r\nconst ElectionResultMapConnectorSourceFile = \"ElectionResultMap.connector.ts\";\r\nexport const ElectionResultMapConnectorErrors = {\r\n UnknownError: {\r\n id: 28750,\r\n source: ElectionResultMapConnectorSourceFile,\r\n severity\r\n },\r\n\r\n ContentFetchError: {\r\n id: 28751,\r\n source: ElectionResultMapConnectorSourceFile,\r\n severity\r\n }\r\n};\r\n\r\n/** Elction Result Map Inspector App errors */\r\nconst ElectionResultMapInspectorSourceFile = \"ElectionResultMap.inspector.ts\";\r\nexport const ElectionResultMapInspectorErrors = {\r\n EmptyResultSummaryError: {\r\n id: 28752,\r\n source: ElectionResultMapInspectorSourceFile,\r\n severity\r\n }\r\n};\r\n/** Elction Result Map App errors */\r\nconst ElectionResultMapSourceFile = \"ElectionResultMap.tsx\";\r\nexport const ElectionResultMapErrors = {\r\n FetchAndUpdateElectionDataError: {\r\n id: 28753,\r\n source: ElectionResultMapSourceFile,\r\n severity\r\n }\r\n};\r\n\r\n/** Election Editor's Note App errors */\r\nexport const ElectionEditorsNoteErrors = {\r\n\r\n ContentFetchError: {\r\n id: 28760,\r\n source: \"ElectionEditorsNote.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Election Delegate Counter related app errors */\r\nexport const ElectionDelegateCounterErrors = {\r\n ContentFetchError: {\r\n id: 28770,\r\n source: \"ElectionDelegateCounter.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents fetch failure for Feed visualizer experience */\r\nexport const FeedVisualizerFetchFailed: AppError = {\r\n id: 28780,\r\n source: \"FeedVisualizer.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Topics hub - failed to fetch topic by name\r\n */\r\nexport const TopicByNameFetchFailed: AppError = {\r\n id: 28790,\r\n source: \"TopicsHub.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * App reporting messages related to Partner Widget Experience\r\n */\r\nexport const PartnerWidgetAppErrors = {\r\n /** default breakpoint settings missing */\r\n DefaultBreakpointSettingsMissing: {\r\n id: 28801,\r\n source: \"PartnerWidget.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** non whitelisted source url */\r\n NonWhitelistedSourceUrl: {\r\n id: 28802,\r\n source: \"PartnerWidget.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents RecommendedSearch related App errors */\r\nconst RecommendedTopicsSourceFile = \"RecommendedTopics.connector.ts\";\r\nexport const RecommendedTopicsErrors = {\r\n /** Failed to connect to the Topics Data Connector */\r\n TopicsDataConnectorFailed: {\r\n id: 28901,\r\n source: RecommendedTopicsSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Topic Clicked was null */\r\n InvalidTopicClick: {\r\n id: 28902,\r\n source: RecommendedTopicsSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst webWorkerSource = \"Web worker\";\r\nconst webWorkerUtility = \"WebWorkerUtility.ts\";\r\nexport const WebWorkerErrors = {\r\n /** Web worker script load error (404 response) */\r\n FileNotFound: {\r\n id: 29000,\r\n source: webWorkerUtility,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Web worker runtime error, fired by web worker on unhandled exceptions */\r\n RuntimeError: {\r\n id: 29001,\r\n source: webWorkerSource,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Web worker message timeout */\r\n MessageTimeout: {\r\n id: 29002,\r\n source: webWorkerUtility,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Web worker handled errors. These are the errors received as messages from web worker */\r\n HandledError: {\r\n id: 29003,\r\n source: webWorkerSource,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PageTimingsSource = \"entry-point-shared-utils/src/PageTimings.ts\";\r\n/**\r\n * Indicates that for some reason the page never received all the perf markers it was waiting for\r\n * resulting in the timeout logic kicking in.\r\n */\r\nexport const WaitForAllPerfMarkersTimeoutInvoked: AppError = {\r\n id: 29100,\r\n source: PageTimingsSource,\r\n severity: Severity.Alert,\r\n pb\r\n};\r\n\r\n/**\r\n * Indicates that for some reason the page never received all the secondary perf markers\r\n * it was waiting for, resulting in the timeout logic kicking in.\r\n */\r\nexport const WaitForAllSecondaryPerfMarkersTimeoutInvoked: AppError = {\r\n id: 29101,\r\n source: PageTimingsSource,\r\n severity: Severity.Alert,\r\n pb\r\n};\r\n\r\nconst PageLoadTimeSource = \"entry-point-shared-utils/src/TrackPageLoadTime.ts\";\r\n/**\r\n * Indicates that for some reason the page load time is not able to be sent out.\r\n */\r\nexport const PageLoadTimeError: AppError = {\r\n id: 29102,\r\n source: PageLoadTimeSource,\r\n severity: Severity.Alert,\r\n pb\r\n};\r\n\r\nconst FirstPartyEntryPointFileName = \"FirstParty.connector.ts\";\r\nexport const FirstPartyEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for FirstParty page experience.\r\n */\r\n FirstPartyErrorPage: {\r\n id: 29200,\r\n source: FirstPartyEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n /** Error during initial SSO call, either the call failed of the user was not signed in */\r\n SSOFailedError: {\r\n id: 29250,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst HomePageEntryPointFileName = \"HomePage.connector.ts\";\r\nexport const HomePageEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for Home page experience.\r\n */\r\n HomePageErrorPage: {\r\n id: 29300,\r\n source: HomePageEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n /** Error during initial SSO call, either the call failed of the user was not signed in */\r\n SSOFailedError: {\r\n id: 29301,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WindowsEntryPointFileName = \"Windows.connector.ts\";\r\n\r\nexport const WindowsEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for Windows page experience.\r\n */\r\n WindowsErrorPage: {\r\n id: 29400,\r\n source: WindowsEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n WindowsPageShownPageExceptionError: {\r\n id: 29401,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n WindowsPageReloadedPageExceptionError: {\r\n id: 29402,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on Windows page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 29403,\r\n source: pageTsFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WeatherAppEntrySourceFile = \"Weather.connector.ts\";\r\nconst WeatherLocationSearchSourceFile = \"WeatherLocationSearch.connector.ts\";\r\nconst WeatherMapSourceFile = \"WeatherMap.connector.ts\";\r\nconst WeatherMapHelperClient = \"WeatherMapHelperClient.ts\";\r\nconst WeatherInfoCardConnectorSourceFile = \"WeatherInfoCard.connector.ts\";\r\nconst WeatherWpoApiDataMapperFile = \"libs/feed-layout/.../WeatherCardDataMapper\";\r\n\r\n/** Error during 'weather' app initialization. */\r\nexport const WeatherEntryPointAppError: AppError = {\r\n id: 29500,\r\n source: WeatherAppEntrySourceFile,\r\n severity: Severity.HighImpact,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Fetch no data when search for locations from msn api */\r\nexport const WeatherLocationSearchNullError: AppError = {\r\n id: 29501,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception to fetch search for locations from msn api */\r\nexport const WeatherLocationSearchFetchError: AppError = {\r\n id: 29502,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Warnings when weather fail on bot traffic. These failures should not trigger alert */\r\nexport const WeatherGoogleBotError: AppError = {\r\n id: 29503,\r\n source: WeatherOverviewApiClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Warnings when weather location search is invalid */\r\nexport const WeatherLocationSearchInvalidSuggestionIdError: AppError = {\r\n id: 29504,\r\n source: WeatherLocationSearchSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when fail to fetch hurricane data */\r\nexport const WeatherMapHurricaneApiError: AppError = {\r\n id: 29505,\r\n source: WeatherMapSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when Hurricane schema broken */\r\nexport const WeatherMapHurricaneSchemaError: AppError = {\r\n id: 29506,\r\n source: WeatherMapSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when write user weather settings to pdp */\r\nexport const WeatherPDPUserSettingsWriteFailed: AppError = {\r\n id: 29507,\r\n source: WeatherPdpClientSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when OneService response is incorrect */\r\nexport const WeatherCardOneServiceDataError: AppError = {\r\n id: 29508,\r\n source: WeatherInfoCardConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when weather card is in invalid state */\r\nexport const WeatherCardInvalidStateError: AppError = {\r\n id: 29509,\r\n source: WeatherCardConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch weather tile version */\r\nexport const WeatherTileVersionApiError: AppError = {\r\n id: 29510,\r\n source: WeatherMapHelperClient,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when schema not match when fetch weather tile version */\r\nexport const WeatherTileVersionApiSchemaError: AppError = {\r\n id: 29511,\r\n source: WeatherMapHelperClient,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when save home fail for non-sign-in user with HttpOnly cookie */\r\nexport const WeatherServerCookieSaveError: AppError = {\r\n id: 29512,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch Bing map tile data */\r\nexport const WeatherMapBingTileLayerApiError: AppError = {\r\n id: 29513,\r\n source: WeatherMapWeatherLayersSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch radar tile data */\r\nexport const WeatherMapRadarApiError: AppError = {\r\n id: 29514,\r\n source: WeatherMapRadarSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch Precipitation tile data */\r\nexport const WeatherMapPrecipitationApiError: AppError = {\r\n id: 29515,\r\n source: WeatherMapPrecipitationSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch GenericSevere tile data */\r\nexport const WeatherMapGenericSevereApiError: AppError = {\r\n id: 29516,\r\n source: WeatherMapGenericSevereLayerSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch Heatmap tile data */\r\nexport const WeatherMapHeatmapApiError: AppError = {\r\n id: 29517,\r\n source: WeatherMapHeatmapRenderLayerSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch animation tile data */\r\nexport const WeatherMapWindAnimationApiError: AppError = {\r\n id: 29518,\r\n source: WeatherMapWeatherLayersSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch animation tile data */\r\nexport const WeatherMapBorderApiError: AppError = {\r\n id: 29519,\r\n source: WeatherMapWeatherLayersSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch Bing json label tile data */\r\nexport const WeatherMapJsonLabelApiError: AppError = {\r\n id: 29520,\r\n source: WeatherMapBingJsonLabelLayerSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fail to fetch OneCanvasTileLayer tile data */\r\nexport const WeatherMapOneCanvasTileLayerApiError: AppError = {\r\n id: 29521,\r\n source: WeatherMapBingOneCanvasTileLayerSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when fetch current weather failed */\r\nexport const WeatherFetchCurrentWeatherError: AppError = {\r\n id: 29522,\r\n source: MultiLocationWeatherServiceSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Exception when weather data mapper error */\r\nexport const WeatherWpoApiDataMapperError: AppError = {\r\n id: 29523,\r\n source: WeatherWpoApiDataMapperFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nexport const WeatherSSRSkip: AppError = {\r\n id: 29524,\r\n source: \"web.page.ts\",\r\n severity,\r\n pb: {\r\n // set userImpact to false (same for other SSR errors) as we will fallback to CSR in this case and user will not notice any difference in experience (page may load slower)\r\n // We do want alert enabled for these errors as there can be systematic issues on these errors\r\n userImpacting: false,\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n\r\nexport const WeatherSSRException: AppError = {\r\n id: 29525,\r\n source: \"node.index.ts\",\r\n severity,\r\n pb: {\r\n userImpacting: false,\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n\r\n/** Failed to fetch weather data for Summary card in O365 feed */\r\nexport const SummaryCardWeatherDataConnector: AppError = {\r\n id: 29526,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nexport const WeatherOverviewDataIncomplete: AppError = {\r\n id: 29527,\r\n source: WeatherOverviewConnectorSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nconst WeatherCardWCSourceFile = \"WeatherCardWC.ts\";\r\n/** Failed to get weather data connector for win dashboard weather widget */\r\nexport const WeatherCardWCDataConnector: AppError = {\r\n id: 29580,\r\n source: WeatherCardWCSourceFile,\r\n severity: Severity.HighImpact,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n/** Failed to get weather widget instance from win dashboard */\r\nexport const WeatherCardWCWidgetNull: AppError = {\r\n id: 29581,\r\n source: WeatherCardWCSourceFile,\r\n severity,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nconst WindowsShellPage = \"windows-shell/page.ts\";\r\n\r\n/**\r\n * Windows Shell Page Error fetching the APP_ANON cookie\r\n */\r\nexport const WindowsShellPageErrorFetchingAppAnonCookie: AppError = {\r\n id: 29600,\r\n source: WindowsShellPage,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Windows Shell Page level exception was thrown\r\n */\r\nexport const WindowsShellPageError: AppError = {\r\n\r\n id: 29601,\r\n source: WindowsShellPage,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nconst WindowsShellCardProvider = \"WindowsShellCardProvider.ts\";\r\n/**\r\n * Content that was retrieved from shell was invalid\r\n */\r\nexport const WindowsShellInvalidShellContentResponse: AppError = {\r\n id: 29602,\r\n source: WindowsShellCardProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Content format was invalid\r\n */\r\nexport const WindowsShellInvalidContentResponse: AppError = {\r\n id: 29603,\r\n source: WindowsShellCardProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Content was valid JSON but was missing items\r\n */\r\nexport const WindowsShellEmptyShellContentResponse: AppError = {\r\n id: 29604,\r\n source: WindowsShellCardProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Received empty content after asking client to update the Oneservice content\r\n */\r\nexport const WindowsShellFailedToGetContentOnRetry: AppError = {\r\n id: 29605,\r\n source: WindowsShellCardProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking how often we need to ask client to retry getting new Oneservice content\r\n */\r\nexport const WindowsShellAskingToFetchNewContentForRetry: AppError = {\r\n id: 29606,\r\n source: WindowsShellCardProvider,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nconst WindowsShellConnector = \"WindowsShellConnector.connector.ts\";\r\n\r\nexport const WindowsShellEmptyHeaderResponse: AppError = {\r\n id: 29700,\r\n source: WindowsShellConnector,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WindowsShellInvalidFeedResponse: AppError = {\r\n id: 29701,\r\n source: WindowsShellConnector,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WindowsShellFailedVersionResponse: AppError = {\r\n id: 29702,\r\n source: WindowsShellConnector,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WindowsShellInvalidTreatmentInfo: AppError = {\r\n id: 29703,\r\n source: WindowsShellConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const WindowsShellNoSessionIdProvided: AppError = {\r\n id: 29704,\r\n source: WindowsShellConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nconst WindowsNewsAndInterestsPage = \"windows-newsandinterests/page.ts\";\r\nconst WindowsNewsAndInterestsConnector = \"WindowsNewsAndInterestsConnector.connector.ts\";\r\n\r\nexport const WindowsNewsAndInterestsPageError: AppError = {\r\n\r\n id: 29800,\r\n source: WindowsNewsAndInterestsPage,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WindowsNewsAndInterestsPageErrorFetchingAppAnonCookie: AppError = {\r\n id: 29801,\r\n source: WindowsNewsAndInterestsPage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Invalid Dashboard load data */\r\nexport const InvalidDashboardData: AppError = {\r\n id: 29802,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception fetching dashboard data from host api */\r\nexport const ExceptionFetchingDashboardData: AppError = {\r\n id: 29803,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception fetching user account info from host api */\r\nexport const ExceptionFetchingAccountInfo: AppError = {\r\n id: 29804,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception fetching auth token from host api */\r\nexport const ExceptionFetchingAuthToken: AppError = {\r\n id: 29805,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception loading host api */\r\nexport const ExceptionLoadingHostApi: AppError = {\r\n id: 29806,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception subscribing dashboard events */\r\nexport const ExceptionSubscribingDashboardEvents: AppError = {\r\n id: 29807,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception subscribing dashboard events */\r\nexport const NotifyFeedDisplayReadyEventFailed: AppError = {\r\n id: 29808,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const UnknownTelemetryOcid: AppError = {\r\n id: 29809,\r\n source: WindowsNewsAndInterestsConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nconst WindowsNewsPlusPage = \"windows-newsplus/page.ts\";\r\nconst AuthHelperWindowsWidget = \"AuthHelperWindowsWidget.ts\";\r\n\r\nexport const WindowsNewsPlusPageError: AppError = {\r\n id: 29900,\r\n source: WindowsNewsPlusPage,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ExceptionCallingAuthenticatorApi: AppError = {\r\n id: 29901,\r\n source: AuthHelperWindowsWidget,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Auth related app messages (errors|warnings) */\r\nexport const AuthenticationAppMessages = {\r\n AuthRefreshBlockedError: {\r\n id: 33000,\r\n source: \"\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 33001,\r\n source: \"\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for migration consent\r\n */\r\n EstablishMigrationConsent: {\r\n id: 33010,\r\n source: \"EstablishMigrationConsent.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n MigrationConsentServiceClient: {\r\n id: 33011,\r\n source: \"MigrationConsentServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n // This is a duplicate of 1405 and will be logged in addition to it.\r\n // This is to maintain backwards compatibility while allowing us to alert on this\r\n // from EdgeNext\r\n EstablishSignedInState: {\r\n id: 33012,\r\n source: establishSignInSource,\r\n severity,\r\n pb\r\n },\r\n\r\n // Auth private property is not available in edge chromium browser\r\n EdgeChromiumAuthPropertyNotAvailable: {\r\n id: 33013,\r\n source: pageTsFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n // The browser has reported that a user is signed in, but the request to fetch the user token has failed\r\n // This will usually result in a sign in state mismatch, which will cause a single page refresh for the user\r\n // If the user cannot get the token on the refreshed page they will no longer see signed in personalization\r\n EdgeChromiumTokenAccessFailure: {\r\n id: 33014,\r\n source: \"EstablishEdgeChromiumSignedInState.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Server side rendering error */\r\nexport const RenderServerError: AppError = {\r\n id: 34000,\r\n source: \"service-render-app.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * SSR Inline script errors\r\n */\r\nexport const SSRAppErrors = {\r\n /**\r\n * Warning that user clicked on the page before hydration and telemetry is initialized.\r\n */\r\n UntrackedClick: {\r\n id: 34001,\r\n source: \"\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Warning that SSR fragment fetch failed\r\n */\r\n FragmentFetchFailed: {\r\n id: 34002,\r\n source: \"SSRInline.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that the Performance API was not available.\r\n */\r\n DidUseBrowserCacheAPIError: {\r\n id: 34003,\r\n source: \"SSRInline.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that the expected response header was not available.\r\n */\r\n DidUseBrowserCachePolyfillResponseHeaderInvalid: {\r\n id: 34004,\r\n source: \"SSRInline.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that when SSR failed to getConfig.\r\n */\r\n ServerCacheFetchFailed: {\r\n id: 34005,\r\n source: \"Resolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that when connectorMap is invalid.\r\n */\r\n ConnectorMapInvalid: {\r\n id: 34006,\r\n source: \"Resolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that SSR inline script failed.\r\n */\r\n FetchSSRPageFailed: {\r\n id: 34007,\r\n source: \"inline-head.ts\",\r\n severity: Severity.Alert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that no window.innerWidth was reported.\r\n * Devices on mobile may report a window.innerWidth of 0 or undefined until the window.onLoad page completes.\r\n * This error is thrown when window.innerWidth is still 0 or undefined when onload has completed.\r\n * We expect this error to never throw.\r\n */\r\n FetchSSRPageFailedFromInvalidWindowInnerWidth: {\r\n id: 34008,\r\n source: \"inline-head.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error that when Server Cache config refresh failed\r\n */\r\n ServerCacheRefreshFailed: {\r\n id: 34009,\r\n source: \"Resolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for page experience.\r\n */\r\n WebEntryFailed: {\r\n id: 34010,\r\n source: \"webEntry.ts\",\r\n severity: Severity.Alert,\r\n pb\r\n },\r\n\r\n /**\r\n * SSR config resolver returned null config\r\n */\r\n SsrResolverReturnedNullConfig: {\r\n id: 34011,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\nconst irisArcCallerFileName = \"Iris.arcCaller.ts\";\r\nconst irisArcParserFileName = \"Iris.arcParser.ts\";\r\nconst irisMasterFileName = \"Iris.master.ts\";\r\n\r\n/** The query parameters presented to the arc caller were found to be invalid. */\r\nexport const AppError_InvalidQParams_35001: AppError = {\r\n id: 35001,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ArcCallFailed_35002: AppError = {\r\n id: 35002,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ArcResponseNotOk_35003: AppError = {\r\n id: 35003,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nexport const AppError_ArcResponseUnparsable_35004: AppError = {\r\n id: 35004,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_UnknownIrisErrorFound_35006: AppError = {\r\n id: 35006,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_TimeoutIrisErrorFound_35007: AppError = {\r\n id: 35007,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_TemplateIrisErrorFound_35008: AppError = {\r\n id: 35008,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ClientErrorIrisErrorFound_35009: AppError = {\r\n id: 35009,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_DSourceIrisErrorFound_35010: AppError = {\r\n id: 35010,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ActionCallFailure_35011: AppError = {\r\n id: 35011,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ActionFetchFailure_35012: AppError = {\r\n id: 35012,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_ActionResponseFailure_35013: AppError = {\r\n id: 35013,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nexport const AppError_UncaughtErrorDetected_35014: AppError = {\r\n id: 35014,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_UnconvertableCreative_35015: AppError = {\r\n id: 35015,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_InvalidResponseFormat_35016: AppError = {\r\n id: 35016,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_UnparsableSingleResponseJSON_35018: AppError = {\r\n id: 35018,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_MissingQueryParams_35019: AppError = {\r\n id: 35019,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_MissingContext_35020: AppError = {\r\n id: 35020,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_MissingAppEnvironment_35021: AppError = {\r\n id: 35021,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_UndefinedRequestParams_35022: AppError = {\r\n id: 35022,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nexport const AppError_UndefinedAppEnvironment_35023: AppError = {\r\n id: 35023,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\nexport const AppError_MissingAppEnvironmentProperty_35024: AppError = {\r\n id: 35024,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nexport const AppError_ArcCallFailure_35025: AppError = {\r\n id: 35025,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nexport const AppError_ArcCallFailureIrisUpdate_35026: AppError = {\r\n id: 35026,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Iris data connector related App errors */\r\nconst IrisDataConnectorSourceFile = \"IrisData.connector.ts\";\r\nconst SubscriberValidatorSourceFile = \"SubscriberValidator.ts\";\r\nconst IrisPersistentStorageUtilityFile = \"IrisPersistentStorageUtility.ts\";\r\nconst IrisPersistentStorage = \"IrisPersistentStorage.ts\";\r\n\r\nexport const SubscriberNotFound: AppError = {\r\n id: 35117,\r\n source: SubscriberValidatorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CreativeCountNegativeOrZero: AppError = {\r\n id: 35118,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const MissingIrisParameterForConditionalBanner: AppError = {\r\n id: 35119,\r\n source: SubscriberValidatorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const ErrorFoundForSurface: AppError = {\r\n id: 35120,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SubscriberNotFoundInIrisPlacementDictionary: AppError = {\r\n id: 35121,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConfigDataUndefined: AppError = {\r\n id: 35122,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const FailedToFetchConfigData: AppError = {\r\n id: 35123,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ExceptionFetchingConfigData: AppError = {\r\n id: 35124,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const FailedToReadNurturingAcceptedFlag: AppError = {\r\n id: 35125,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error when Iris fails to return Hotspots Data to the client. Previous #8181 */\r\nexport const FailedHotSpotsDataDelivery: AppError = {\r\n id: 35126,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Hotspots data that was returned failed to validate. Previous #8182 */\r\nexport const IncompleteHotSpotsContract: AppError = {\r\n id: 35127,\r\n source: IrisPersistentStorageUtilityFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception making iris call from data connector */\r\nexport const ExceptionRequestingSurfaceInfo: AppError = {\r\n id: 35128,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error missing iris parameters for iris call to background images surface */\r\nexport const MissingIrisParameterForBackgroundImages: AppError = {\r\n id: 35129,\r\n source: SubscriberValidatorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Error missing params in surface collection when reading data from iris response */\r\nexport const SurfaceCollectionContextMissingParams: AppError = {\r\n id: 35130,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Chromium API not available to persist data */\r\nexport const IrisPersistChromiumAPIsNotAvailable: AppError = {\r\n id: 35131,\r\n source: IrisPersistentStorage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Chromium API not available to get data */\r\nexport const IrisGetChromiumAPIsNotAvailable: AppError = {\r\n id: 35132,\r\n source: IrisPersistentStorage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Chromium API failure */\r\nexport const IrisChromiumAPIsFailure: AppError = {\r\n id: 35133,\r\n source: IrisPersistentStorage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents AccessTokens related App errors */\r\nconst AccessTokensSourceFile = \"AadAuthHelper.ts\";\r\nconst PivotContentErrorPlaceholderFile = \"AadErrorPlaceholder.tsx\";\r\nexport const EdgeChromiumAPIsNotAvailable: AppError = {\r\n id: 35200,\r\n source: AccessTokensSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const AcquireAccessTokenFailed: AppError = {\r\n id: 35201,\r\n source: AccessTokensSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const AcquireAccessTokenFailedForPivotContent: AppError = {\r\n id: 35202,\r\n source: PivotContentErrorPlaceholderFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const AcquireAccessTokenHandledFailure: AppError = {\r\n id: 35203,\r\n source: AccessTokensSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const AcquireAccessTokenHandledFailureForPivotContent: AppError = {\r\n id: 35204,\r\n source: PivotContentErrorPlaceholderFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents Render Cache errors*/\r\nconst PersistRenderCacheFile = \"PersistRenderCache.ts\";\r\nexport const RenderCacheErrors = {\r\n JssStyleMismatchWarning: {\r\n id: 35300,\r\n source: PersistRenderCacheFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n JssStyleCriticalMismatchError: {\r\n id: 35301,\r\n source: PersistRenderCacheFile,\r\n severity: Severity.Alert,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents OcvFeedbackData related App errors */\r\nconst OcvFeedbackDataSourceFile = \"OcvFeedbackData.ts\";\r\nexport const OcvFeedbackDataUndefinedDataNotAvailable: AppError = {\r\n id: 35401,\r\n source: OcvFeedbackDataSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const OcvFeedbackDataAddElementFailure: AppError = {\r\n id: 35402,\r\n source: OcvFeedbackDataSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const PivotHoverErrors = {\r\n /** Failed to fetch feed summary data for the Pivot Hover list. */\r\n FeedSummaryFetchError: {\r\n id: 35500,\r\n source: \"FeedSummaryFetcher.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PreloadActionHelpers = \"PreloadActionHelpers.ts\";\r\nexport const PreloadReportingMessages = {\r\n TtvrMissing: {\r\n id: 35600,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TfprMissing: {\r\n id: 35601,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TtvrSearchBoxMissing: {\r\n id: 35602,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TtfSearchBoxMissing: {\r\n id: 35603,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst PrerenderPageTimingHelper = \"PrerenderPageTimingHelper.ts\";\r\nexport const PrerenderTtvrMissing: AppError = {\r\n id: 35604,\r\n source: PrerenderPageTimingHelper,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const PrerenderTtprMissing: AppError = {\r\n id: 35605,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const PrerenderTtvrSearchBoxMissing: AppError = {\r\n id: 35606,\r\n source: PrerenderPageTimingHelper,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const PrerenderTtfSearchBoxMissing: AppError = {\r\n id: 35607,\r\n source: PrerenderPageTimingHelper,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const PrerenderRevalidateException: AppError = {\r\n id: 35608,\r\n source: \"PageRevealStaleStracker.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const GetTabTimingsReturnedFalse: AppError = {\r\n id: 35609,\r\n source: PrerenderPageTimingHelper,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const GetTabTimingsReturnedInvalidTimings: AppError = {\r\n id: 35610,\r\n source: PrerenderPageTimingHelper,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents push notifications lib App errors */\r\nconst PushNotificationsLibFile = \"PushNotifications.ts\";\r\nexport const PushNotificationsLibErrors = {\r\n FetchKeyError: {\r\n id: 35700,\r\n source: PushNotificationsLibFile,\r\n severity,\r\n pb\r\n },\r\n SubscribeUnsubscribeError: {\r\n id: 35701,\r\n source: PushNotificationsLibFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents content truncation lib App errors */\r\nconst ContentTruncationSourceFile = \"ContentTruncation.ts\";\r\nexport const ContentTruncationErrors = {\r\n OverTruncationError: {\r\n id: 35800,\r\n source: ContentTruncationSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SuperAppEntryPointFileName = \"SuperAppPage.connector.ts\";\r\n\r\nexport const SuperAppEntryPointAppErrors = {\r\n /**\r\n * Super app page is not able to load Error Page.\r\n */\r\n SuperAppErrorPage: {\r\n id: 35901,\r\n source: SuperAppEntryPointFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Error fetching feed with location in Local News experience */\r\nconst LocalNewsFileName = \"LocalNews.connector.ts\";\r\nexport const LocalNewsInterestByLocationFetchFailed: AppError = {\r\n id: 36001,\r\n source: LocalNewsFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** 361XX represent office related errors */\r\nconst GenerateShareUiFile = \"GenerateShareUi.tsx\";\r\nconst OfficeShareUiFile = \"OfficeShareUi.tsx\";\r\nconst OfficeFallbackHandlerFileName = \"OfficeFallbackHandler.ts\";\r\nconst EnterpriseWaffleFile = \"EnterpriseWaffle.connector.ts\";\r\nconst OfficeDocumentsTableConnectorFile = \"OfficeDocumentsTable.connector.ts\";\r\nconst OfficeDocumentsTableMruUtilitiesFile = \"mru-plusplus.utility.ts\";\r\nconst OfficeSharePointSitesTableConnectorFile = \"SharePointSitesTable.connector.ts\";\r\nconst OfficeDocumentsTableDiscoverFile = \"DiscoverDocumentProvider.ts\";\r\nconst RecommendedDocumentsConnectorFile = \"RecommendedDocuments.connector.ts\";\r\nconst ShellNewTabDataFileName = \"ShellNewTabData.connector.ts\";\r\nconst OfficeDocumentProviderFile = \"OfficeDocumentProvider.ts\";\r\n\r\nexport const OfficeFallbackHandlerAppErrors = {\r\n /**\r\n * Tracking errors where we ended up reloading the office content on jss mismatch exception.\r\n */\r\n OfficeContentReloadedJSSMismatchExceptionError: {\r\n id: 36101,\r\n source: OfficeFallbackHandlerFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Error for failure to generate office share ui\r\n */\r\nexport const OfficeGenerateShareUiError: AppError = {\r\n id: 36105,\r\n source: GenerateShareUiFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error for failure inside office share ui\r\n */\r\nexport const OfficeShareUiError: AppError = {\r\n id: 36106,\r\n source: OfficeShareUiFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error for Enterprise Waffle not able to retrieve app links from ShellNewTabData\r\n */\r\nexport const EnterpriseWaffleAppError: AppError = {\r\n id: 36107,\r\n source: EnterpriseWaffleFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error for failed call to Shell NTP API for Enterprise waffle and company logo\r\n */\r\nexport const ShellNewTabDataAPIError: AppError = {\r\n id: 36108,\r\n source: ShellNewTabDataFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when Office Documents Table type is not provided\r\n */\r\nexport const OfficeDocumentsTableInvalidTypeError: AppError = {\r\n id: 36110,\r\n source: OfficeDocumentsTableConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when Office Documents Table fails to fetch documents\r\n */\r\nexport const OfficeDocumentsTableDocumentFetchFailedError: AppError = {\r\n id: 36111,\r\n source: OfficeDocumentsTableConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when Office Documents Table fails to fetch documents\r\n */\r\nexport const OfficeDocumentsTableLinkFetchFailedError: AppError = {\r\n id: 36112,\r\n source: OfficeDocumentsTableConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when Office Documents Table fails to update document properties\r\n */\r\nexport const OfficeDocumentsTableUpdateDocumentPropertiesFailed: AppError = {\r\n id: 36113,\r\n source: OfficeDocumentsTableMruUtilitiesFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n* Tracking errors when Office Documents Table fails to fetch activity data\r\n*/\r\nexport const OfficeDocumentsTableFetchActivitiesFailed: AppError = {\r\n id: 36114,\r\n source: OfficeDocumentsTableDiscoverFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n* Tracking errors when Office Documents Table fails to fetch sharepoint data\r\n*/\r\nexport const OfficeDocumentsTableFetchSharepointFailed: AppError = {\r\n id: 36115,\r\n source: OfficeDocumentsTableDiscoverFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n* Tracking errors when Office Documents Table fails to generate document item\r\n*/\r\nexport const OfficeDocumentsTableGenerateDocumentItemError: AppError = {\r\n id: 36116,\r\n source: OfficeDocumentProviderFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when Office Share Point Table fails to fetch sites\r\n */\r\nexport const OfficeSharepointSitesTableFetchFailedError: AppError = {\r\n id: 36120,\r\n source: OfficeSharePointSitesTableConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when failed to get Recommended Documents\r\n */\r\nexport const RecommendedDocumentsFetchFailedError: AppError = {\r\n id: 36130,\r\n source: RecommendedDocumentsConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Tracking errors when failed to fetch preview image for recommended documents\r\n */\r\nexport const RecommendedDocumentsImageFetchFailedError: AppError = {\r\n id: 36131,\r\n source: RecommendedDocumentsConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents autos experiences App errors */\r\nconst AutosExperienceConnectorFile = \"AutosCard.connector.ts\";\r\nconst AutosExperienceServiceClientFile = \"AutosServiceClient.ts\";\r\n\r\n/**\r\n * Error while fetching research make models\r\n */\r\nexport const FetchResearchMakeModelDocumentError: AppError = {\r\n id: 36200,\r\n source: AutosExperienceServiceClientFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while fetching Film Strip Document Error\r\n */\r\nexport const FetchFilmStripDocumentError: AppError = {\r\n id: 36201,\r\n source: AutosExperienceServiceClientFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while fetching lead classified cms documents\r\n */\r\nexport const FetchClassifiedLeadCMSDocumentsError: AppError = {\r\n id: 36202,\r\n source: AutosExperienceServiceClientFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while fetching lead classified make models\r\n */\r\nexport const FetchLeadClassifiedMakeModelDocumentError: AppError = {\r\n id: 36203,\r\n source: AutosExperienceServiceClientFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Error for incorrect tab configuration\r\n */\r\nexport const TabsIncorrectConfiguration: AppError = {\r\n id: 36204,\r\n source: AutosExperienceConnectorFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Whole Page Optimization(WPO) App errors */\r\n\r\nconst WpoServiceFileName = \"WpoServiceClient.ts\";\r\nconst WpoMapFeedDataFileName = \"DesktopFeedEdgeNext.connector.ts\";\r\nconst WpoCardTypeUndefinedFileName = \"WpoCardFeedDataMapper.ts\";\r\n/**\r\n * Error reading local storage with wpo service call response.\r\n */\r\nexport const WpoFailedToReadFromLocalStorage: AppError = {\r\n id: 36300,\r\n source: WpoServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * WPO service call failure.\r\n */\r\nexport const WpoServiceCallFailure: AppError = {\r\n id: 36301,\r\n source: WpoServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error updating local storage with wpo service call response.\r\n */\r\nexport const WpoFailedToStoreToLocalStorage: AppError = {\r\n id: 36302,\r\n source: WpoServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Whole Page Optimization(WPO) App errors in SuperApp */\r\nconst WpoServiceHelperFileName = \"WPOServiceHelper.ts\";\r\n\r\n/**\r\n * WPO service call failure for glance cards in SA.\r\n */\r\nexport const WpoGlanceServiceCallFailure: AppError = {\r\n id: 36303,\r\n source: WpoServiceHelperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * WPO service call no content respose for glance cards in SA.\r\n */\r\nexport const WpoGlanceServiceCallNoContent: AppError = {\r\n id: 36304,\r\n source: WpoServiceHelperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * WPO service call failure for feed modules in SA.\r\n */\r\nexport const WpoFeedServiceCallFailure: AppError = {\r\n id: 36305,\r\n source: WpoServiceHelperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * WPO service call no content respose for feed modules in SA.\r\n */\r\nexport const WpoFeedServiceCallNoContent: AppError = {\r\n id: 36306,\r\n source: WpoServiceHelperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error updating local storage with wpo service call response in SuperApp.\r\n */\r\nexport const WpoFailedToStoreToSALocalStorage: AppError = {\r\n id: 36307,\r\n source: WpoServiceHelperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Data Mapper error when WPO map feed data for card.\r\n */\r\nexport const WpoServiceFeedDataMapperError: AppError = {\r\n id: 36308,\r\n source: WpoMapFeedDataFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Card type Undefined Error when WPO return card data.\r\n */\r\nexport const WpoServiceCardTypeUndefinedError: AppError = {\r\n id: 36309,\r\n source: WpoCardTypeUndefinedFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Received non 20* response for WPO treatments call\r\n */\r\nexport const WpoTreatmentsNon20XResponse: AppError = {\r\n id: 36310,\r\n source: WpoServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * WPO Treatments call timed out because it did not complete before the specified threshold.\r\n */\r\nexport const WpoTreatmentsRequestTimeout: AppError = {\r\n id: 36311,\r\n source: WpoServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** MarketSelector App errors */\r\nconst MarketSelectorFileName = \"marketSetting/index.ts\";\r\n\r\n/**\r\n * Error when load current market setting when initialize market selector\r\n */\r\nexport const MarketSelectorFailedToReadCurrentMarket: AppError = {\r\n id: 36401,\r\n source: MarketSelectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FlyoutCard App errors */\r\nconst FlyoutCardFileName = \"FlyoutCard.connector.ts\";\r\n\r\n/**\r\n * Error when fetching feed in FlyoutCard experience\r\n */\r\nexport const FlyoutCardFailedToLoadOneServiceData: AppError = {\r\n id: 36410,\r\n source: FlyoutCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** The Microsoft logo component inside of the HeaderEdgeNext experience */\r\nconst MicrosoftLogo = \"MicrosoftLogo.tsx\";\r\n\r\n/** Represents a Microsoft Logo related error */\r\nexport const MicrosoftLogoErrors: AppError = {\r\n id: 36420,\r\n source: MicrosoftLogo,\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\n/**\r\n * Clarity Script App Errors\r\n */\r\nconst ClarityScriptLoaderFile = \"ScriptLoader.ts\";\r\n\r\n/**\r\n * Error loading clarity script.\r\n */\r\nexport const LoadScriptError: AppError = {\r\n id: 36500,\r\n source: ClarityScriptLoaderFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error starting clarity script.\r\n */\r\nexport const ScriptStartError: AppError = {\r\n id: 36501,\r\n source: ClarityScriptLoaderFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** 366XX are River OneService App Errors */\r\nexport const EmptyFeedWithFeedId: AppError = {\r\n id: 36600,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const EmptySearchedFeedWithFeedId: AppError = {\r\n id: 36601,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const EmptySearchedFeedWithFeedQuery: AppError = {\r\n id: 36602,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const EmptyKidsModeFeed: AppError = {\r\n id: 36603,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const UnauthorizedFeedResponse: AppError = {\r\n id: 36604,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CardViewFeedDataMapperInvalidData: AppError = {\r\n id: 36605,\r\n source: \"OneServiceFeedDataMapper.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TabRiverRequestEmptyResponse: AppError = {\r\n id: 36606,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TabsRequestEmptyResponse: AppError = {\r\n id: 36607,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** 367XX are River App Errors */\r\nexport const FallingBackToSkipStrategy: AppError = {\r\n id: 36700,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const FallingBackToFullHeightStrategy: AppError = {\r\n id: 36701,\r\n source: RiverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const RiverContentProviderFetchNextPageException: AppError = {\r\n id: 36702,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const InvalidEmptyRiverContent: AppError = {\r\n id: 36703,\r\n source: RiverSourceFile,\r\n severity: Severity.HighImpact,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nexport const GridSectionCardRenderFailure: AppError = {\r\n id: 36704,\r\n source: \"GridSection.tsx\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BreakpointOutOfBoundWarning: AppError = {\r\n id: 36705,\r\n source: \"FastBreakpointManager.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/** Represents OutlookEmailPreview related App errors */\r\nconst OutlookEmailPreviewDataSourceFile = \"OutlookEmailPreviewDataHelper.ts\";\r\n\r\nexport const OutlookEmailPreviewEmailFetchError: AppError = {\r\n id: 36800,\r\n source: OutlookEmailPreviewDataSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OutlookEmailPreviewUnreadEmailCountFetchError: AppError = {\r\n id: 36801,\r\n source: OutlookEmailPreviewDataSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst OutlookEmailPreviewAuthSourceFile = \"OutlookEmailPreviewAuthHelper.ts\";\r\nexport const OutlookEmailPreviewAccessTokenFetchError: AppError = {\r\n id: 36802,\r\n source: OutlookEmailPreviewAuthSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst FinancePageFilename = \"Finance.connector.ts\";\r\nconst FinanceUserServiceImplFile = \"FinanceUserServiceImpl.ts\";\r\nconst FinanceServiceImplFile = \"FinanceServiceImpl.ts\";\r\nconst FinancePrimeServiceImplFile = \"FinancePrimeServiceImpl.ts\";\r\nconst FinanceAutoSuggestServiceImplFile = \"AutoSuggestServiceImpl\";\r\n\r\n/**\r\n * Error when initializing Finance page experience.\r\n */\r\nexport const FinanceEntryPointAppErrors: AppError = {\r\n id: 36900,\r\n source: FinancePageFilename,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get autosuggest because of unsuccessful fetch */\r\nexport const FinanceAutoSuggestFetchError: AppError = {\r\n id: 36901,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get autosuggest because the http code is not 20x */\r\nexport const FinanceAutoSuggestStatusError: AppError = {\r\n id: 36902,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get autosuggest because the response body is not valid */\r\nexport const FinanceAutoSuggestInvalidResponseBody: AppError = {\r\n id: 36903,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MostActiveQuotes because unsuccess fetch */\r\nexport const FinanceMostActiveQuotesFetchError: AppError = {\r\n id: 36904,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MostActiveQuotes because the http code is not 20x */\r\nexport const FinanceMostActiveQuotesStatusError: AppError = {\r\n id: 36905,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MostActiveQuotes because the response body is not valid */\r\nexport const FinanceMostActiveQuotesInvalidResponseBody: AppError = {\r\n id: 36906,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when fetch watchlist */\r\nexport const FinanceWatchListFetchFailed: AppError = {\r\n id: 36907,\r\n source: FinanceUserServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Chart because unsuccess fetch */\r\nexport const FinanceChartFetchError: AppError = {\r\n id: 36908,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Chart because the http code is not 20x */\r\nexport const FinanceChartStatusError: AppError = {\r\n id: 36909,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Chart because the response body is not valid */\r\nexport const FinanceChartInvalidResponseBody: AppError = {\r\n id: 36910,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get QuoteSummary because unsuccess fetch */\r\nexport const FinanceQuoteSummaryFetchError: AppError = {\r\n id: 36911,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get QuoteSummary because the http code is not 20x */\r\nexport const FinanceQuoteSummaryStatusError: AppError = {\r\n id: 36912,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get QuoteSummary because the response body is not valid */\r\nexport const FinanceQuoteSummaryInvalidResponseBody: AppError = {\r\n id: 36913,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Exchange because unsuccess fetch */\r\nexport const FinanceExchangeFetchError: AppError = {\r\n id: 36914,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Exchange because the http code is not 20x */\r\nexport const FinanceExchangeStatusError: AppError = {\r\n id: 36915,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Exchange because the response body is not valid */\r\nexport const FinanceExchangeInvalidResponseBody: AppError = {\r\n id: 36916,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get indices because of unsuccessful fetch */\r\nexport const FinanceIndicesFetchError: AppError = {\r\n id: 36917,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get indices because the http code is not 20x */\r\nexport const FinanceIndicesStatusError: AppError = {\r\n id: 36918,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get indices because the response body is not valid */\r\nexport const FinanceIndicesInvalidResponseBody: AppError = {\r\n id: 36919,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equities because of unsuccessful fetch */\r\nexport const FinanceEquitiesFetchError: AppError = {\r\n id: 36920,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equities because the http code is not 20x */\r\nexport const FinanceEquitiesStatusError: AppError = {\r\n id: 36921,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equities because the response body is not valid */\r\nexport const FinanceEquitiesInvalidResponseBody: AppError = {\r\n id: 36922,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equity financials because of unsuccessful fetch */\r\nexport const FinanceEquityFinancialsFetchError: AppError = {\r\n id: 36923,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equity financials because the http code is not 20x */\r\nexport const FinanceEquityFinancialsStatusError: AppError = {\r\n id: 36924,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get equity financials because the response body is not valid */\r\nexport const FinanceEquityFinancialsInvalidResponseBody: AppError = {\r\n id: 36925,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst MoneyInfoCardConnectorSourceFile = \"MoneyInfoCard.connector.ts\";\r\n\r\n/** Exception when OneService response is incorrect */\r\nexport const MoneyInfoCardOneServiceDataError: AppError = {\r\n id: 36926,\r\n source: MoneyInfoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get all currencies because of unsuccessful fetch */\r\nexport const FinanceGetAllCurrenciesFetchError: AppError = {\r\n id: 36927,\r\n source: FinanceAutoSuggestServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get all currencies because the http code is not 20x */\r\nexport const FinanceGetAllCurrenciesStatusError: AppError = {\r\n id: 36928,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get all currencies because the response body is not valid */\r\nexport const FinanceGetAllCurrenciesInvalidResponseBody: AppError = {\r\n id: 36929,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get microsoft id because of unsuccessful fetch */\r\nexport const FinanceGetMicrosoftIdFetchError: AppError = {\r\n id: 36930,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get microsoft id because the http code is not 20x */\r\nexport const FinanceGetMicrosoftIdStatusError: AppError = {\r\n id: 36931,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get microsoft id because the response body is not valid */\r\nexport const FinanceGetMicrosoftIdInvalidResponseBody: AppError = {\r\n id: 36932,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MorningStar id because of unsuccessful fetch */\r\nexport const FinanceGetMorningStarIdFetchError: AppError = {\r\n id: 36933,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MorningStar id because the http code is not 20x */\r\nexport const FinanceGetMorningStarIdStatusError: AppError = {\r\n id: 36934,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get MorningStar id because the response body is not valid */\r\nexport const FinanceGetMorningStarIdInvalidResponseBody: AppError = {\r\n id: 36935,\r\n source: FinancePrimeServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when write user money settings to pdp */\r\nexport const FinancePDPUserSettingsWriteFailed: AppError = {\r\n id: 36936,\r\n source: FinanceUserServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Funds because unsuccess fetch */\r\nexport const FinanceFundsFetchError: AppError = {\r\n id: 36937,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Funds because the http code is not 20x */\r\nexport const FinanceFundsStatusError: AppError = {\r\n id: 36938,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get Funds because the response body is not valid */\r\nexport const FinanceFundsInvalidResponseBody: AppError = {\r\n id: 36939,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Reserve 3694* ids for errors in TTVR */\r\n/** Failed to get watchlist data before TTVR */\r\nexport const FinanceWatchlistDataVisuallyUnavailable: AppError = {\r\n id: 36940,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get quotes data before TTVR */\r\nexport const FinanceQuotesDataVisuallyUnavailable: AppError = {\r\n id: 36941,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get charts data before TTVR */\r\nexport const FinanceChartsDataVisuallyUnavailable: AppError = {\r\n id: 36942,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get movers data before TTVR */\r\nexport const FinanceMoversDataVisuallyUnavailable: AppError = {\r\n id: 36943,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get exchanges data before TTVR */\r\nexport const FinanceExchangesDataVisuallyUnavailable: AppError = {\r\n id: 36944,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get indices data before TTVR */\r\nexport const FinanceIndicesDataVisuallyUnavailable: AppError = {\r\n id: 36945,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get equities data before TTVR */\r\nexport const FinanceEquitiesDataVisuallyUnavailable: AppError = {\r\n id: 36946,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get equity financials data before TTVR */\r\nexport const FinanceEquityFinancialsDataVisuallyUnavailable: AppError = {\r\n id: 36947,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get currencies data before TTVR */\r\nexport const FinanceCurrenciesDataVisuallyUnavailable: AppError = {\r\n id: 36948,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get funds data before TTVR */\r\nexport const FinanceFundsDataVisuallyUnavailable: AppError = {\r\n id: 36949,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get microsoft id before TTVR */\r\nexport const FinanceGetMicrosoftIdDataVisuallyUnavailable: AppError = {\r\n id: 36950,\r\n source: FinancePrimeServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get morning star id before TTVR */\r\nexport const FinanceGetMorningStarIdDataVisuallyUnavailable: AppError = {\r\n id: 36951,\r\n source: FinancePrimeServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get news data before TTVR */\r\nexport const FinanceNewsDataVisuallyUnavailable: AppError = {\r\n id: 36952,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get events data before TTVR */\r\nexport const FinanceEventsDataVisuallyUnavailable: AppError = {\r\n id: 36953,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get lists data before TTVR */\r\nexport const FinanceListsDataVisuallyUnavailable: AppError = {\r\n id: 36954,\r\n source: FinanceServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to create portfolio */\r\nexport const FinanceCreatePortfolioFailed: AppError = {\r\n id: 36960,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to create transaction */\r\nexport const FinanceCreateTransactionFailed: AppError = {\r\n id: 36961,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to add to watchlist */\r\nexport const FinanceAddToWatchlistFailed: AppError = {\r\n id: 36962,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to sort watchlist */\r\nexport const FinanceSortWatchlistFailed: AppError = {\r\n id: 36963,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to delete from watchlist */\r\nexport const FinanceDeleteFromWatchlistFailed: AppError = {\r\n id: 36964,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get portfolio list. */\r\nexport const FinancePortfolioListFetchError: AppError = {\r\n id: 36965,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get portfolio data. */\r\nexport const FinancePortfolioDataFetchError: AppError = {\r\n id: 36966,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to delete portfolio. */\r\nexport const FinanceDeletePortfolioError: AppError = {\r\n id: 36967,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to update portfolio. */\r\nexport const FinanceUpdatePortfolioError: AppError = {\r\n id: 36968,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to delete transaction. */\r\nexport const FinanceDeleteTransactionError: AppError = {\r\n id: 36969,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to update transaction. */\r\nexport const FinanceUpdateTransactionError: AppError = {\r\n id: 36970,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to add to portfolio. */\r\nexport const FinanceAddToPortfolioError: AppError = {\r\n id: 36971,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to delete from portfolio. */\r\nexport const FinanceDeleteFromPortfolioError: AppError = {\r\n id: 36972,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to sort portfolio. */\r\nexport const FinanceSortPortfolioError: AppError = {\r\n id: 36973,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Failed to get events because of unsuccessful fetch */\r\nexport const FinanceEventsFetchError: AppError = {\r\n id: 36974,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get events because the http code is not 20x */\r\nexport const FinanceEventsStatusError: AppError = {\r\n id: 36975,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get events because the response body is not valid */\r\nexport const FinanceEventsInvalidResponseBody: AppError = {\r\n id: 36976,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get lists because of unsuccessful fetch */\r\nexport const FinanceListsFetchError: AppError = {\r\n id: 36977,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get lists because the http code is not 20x */\r\nexport const FinanceListsStatusError: AppError = {\r\n id: 36978,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to get lists because the response body is not valid */\r\nexport const FinanceListsInvalidResponseBody: AppError = {\r\n id: 36979,\r\n source: FinanceServiceImplFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Warnings on Finance watchlist api. */\r\nexport const FinanceWatchlistFetchWarning: AppError = {\r\n id: 36990,\r\n source: FinanceUserServiceImplFile,\r\n severity: Severity.Alert,\r\n pb: {\r\n userImpacting: false\r\n }\r\n};\r\n\r\n/**\r\n * Error when initializing Social page experience.\r\n */\r\nconst SocialConnectorSourceFile = \"Social.connector.ts\";\r\n\r\nexport const SocialNoModuleName: AppError = {\r\n id: 37000,\r\n source: SocialConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error when Social experience reducer recieves incorrect arguments\r\n */\r\n\r\nconst SocialExperienceReducerFile = \"Social.reducer.ts\";\r\n\r\nexport const SocialExperienceReducerIncorrectArgumentError: AppError = {\r\n id: 37001,\r\n source: SocialExperienceReducerFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error when trying to bind social data connector in social experience.\r\n */\r\nexport const SocialDataConnectorNotFound: AppError = {\r\n id: 37002,\r\n source: SocialExperienceReducerFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors on Social experience http requests\r\n */\r\n\r\nconst SocialAPISourceFile = \"Social.api.ts\";\r\n\r\nexport const SocialAPIRequestErrorUnknown: AppError = {\r\n id: 37020,\r\n source: SocialAPISourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialAPIRequestErrorContents: AppError = {\r\n id: 37021,\r\n source: SocialAPISourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialAPIRequestErrorComments: AppError = {\r\n id: 37022,\r\n source: SocialAPISourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialAPIRequestErrorUsers: AppError = {\r\n id: 37023,\r\n source: SocialAPISourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors on Social experience component renders\r\n */\r\n\r\nconst SocialExperienceFile = \"Social.tsx\";\r\n\r\nexport const SocialExperienceRenderErrorReactionBreakdown: AppError = {\r\n id: 37055,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorMultilineLogin: AppError = {\r\n id: 37058,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorNotificationTray: AppError = {\r\n id: 37059,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorOnboarding: AppError = {\r\n id: 37060,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorOnbardingThirdParty: AppError = {\r\n id: 37061,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorUnknownComponent: AppError = {\r\n id: 37062,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorCopyrightForm: AppError = {\r\n id: 37063,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorFollowButton: AppError = {\r\n id: 37064,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorGradientOverlay: AppError = {\r\n id: 37065,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorMain: AppError = {\r\n id: 37066,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorNotificationCard: AppError = {\r\n id: 37067,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorOnboardingUnderagePage: AppError = {\r\n id: 37068,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorPopup: AppError = {\r\n id: 37069,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorProfileManageDataPage: AppError = {\r\n id: 37070,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorPublisherSubscribeFollowButton: AppError = {\r\n id: 37071,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorReactionBreakdownListItem: AppError = {\r\n id: 37072,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperienceRenderErrorReportMenu: AppError = {\r\n id: 37073,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperiencePublisherIsFollowedFetchError: AppError = {\r\n id: 37074,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialExperiencePublisherFollowUnfollowError: AppError = {\r\n id: 37075,\r\n source: SocialExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst LocationSelectorConnectorFileName = \"LocationSelector.connector.ts\";\r\n/**\r\n * Suggestion Id is out of bounds or it doesn't exist;\r\n */\r\nexport const LocationSelectorInvalidSuggestionId: AppError = {\r\n id: 37100,\r\n source: LocationSelectorConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommunityErrorPage: AppError = {\r\n id: 37200,\r\n source: \"app-types/community/src/page.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * PDP Service library errors - 3730X\r\n */\r\nexport const UnknownBulkLoadGraphActionType: AppError = {\r\n id: 37300,\r\n source: \"PdpServiceClient.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in story-snippet experience.\r\n */\r\nexport const StorySnippetInvalidStoryData: AppError = {\r\n id: 37450,\r\n source: \"StorySnippet.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Erro when Story Snippet experience receives invalid data schema from related content cluster endpoint.\r\n */\r\nexport const StorySnippetInvalidRelatedContentClusterData: AppError = {\r\n id: 37451,\r\n source: \"StorySnippet.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to MyBriefRiverCard\r\n */\r\nconst MyBriefRiverCardFileName = \"MyBriefRiverCard.connector.ts\";\r\nexport const MyBriefRiverCardMissingConfig: AppError = {\r\n id: 37500,\r\n source: MyBriefRiverCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const MyBriefRiverCardEmptyOrNullResponse: AppError = {\r\n id: 37501,\r\n source: MyBriefRiverCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst WindowsCardProviderFileName = \"WindowsCardProvider.ts\";\r\nexport const WindowsCardProviderResponseWasNullOrErroneous: AppError = {\r\n id: 37550,\r\n source: WindowsCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WindowsCardProviderErrorFetchingData: AppError = {\r\n id: 37551,\r\n source: WindowsCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst OneServicePageProviderFileName = \"OneServicePageProvider.ts\";\r\nexport const OneServicePageProviderResponseWasNullOrErroneous: AppError = {\r\n id: 37560,\r\n source: OneServicePageProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServicePageProviderErrorFetchingData: AppError = {\r\n id: 37561,\r\n source: OneServicePageProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const OneServicePageProviderStaticContentLoaded: AppError = {\r\n id: 37562,\r\n source: OneServicePageProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error related to Traffic experiences.\r\n */\r\nconst TrafficPageFileName = \"traffic/page.ts\";\r\nconst TrafficCardConnectorFileName = \"traffic-card/TrafficCard.connector.ts\";\r\nconst TrafficAutoSuggestClientFileName = \"traffic-card/AutoSuggest/DirectionsAutoSuggestClient.ts\";\r\nconst TrafficServiceFileName = \"traffic-lib/TrafficService.ts\";\r\n\r\nexport const TrafficEntryPointAppError: AppError = {\r\n id: 37600,\r\n source: TrafficPageFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrafficIncidentsError: AppError = {\r\n id: 37601,\r\n source: TrafficCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrafficAutoSuggestError: AppError = {\r\n id: 37602,\r\n source: TrafficAutoSuggestClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrafficSettingsSaveError: AppError = {\r\n id: 37603,\r\n source: TrafficCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrafficCardOneServiceJsonError: AppError = {\r\n id: 37604,\r\n source: TrafficCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrafficCardOneServiceUserSettingsSaveError: AppError = {\r\n id: 37605,\r\n source: TrafficServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Represents GmailEmailPreview related App errors\r\n */\r\nconst GmailEmailPreviewDataSourceFile = \"GmailEmailPreview.connector.ts\";\r\nexport const GmailEmailPreviewGoogleAPIError: AppError = {\r\n id: 37700,\r\n source: GmailEmailPreviewDataSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const GmailEmailPreviewGmailAPIError: AppError = {\r\n id: 37701,\r\n source: GmailEmailPreviewDataSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst LocalNewsViewCardConnectorFileName = \"LocalNewsViewCard.connector.ts\";\r\n/**\r\n * Data connector fails to be found or to get the cards from;\r\n */\r\nexport const LocalNewsViewCardDataConnectorAppError: AppError = {\r\n id: 37800,\r\n source: LocalNewsViewCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * LocationFeedData Errors\r\n */\r\nexport const LocationFeedDataConnectorAppError: AppError = {\r\n id: 37900,\r\n source: \"LocationFeed.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Admin Portal\r\n */\r\nconst AdminPortalConnectorFileName = \"AdminPortalData.connector.ts\";\r\nexport const AdminPortalSettingsFetchAppError: AppError = {\r\n id: 38000,\r\n source: AdminPortalConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const AdminPortalShimUiShown: AppError = {\r\n id: 38001,\r\n source: AdminPortalConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Desktop Feed\r\n */\r\nconst DesktopFeedConnectorFileName = \"DesktopFeed.connector.ts\";\r\nexport const DesktopFeedRiverContentFetchFailed: AppError = {\r\n id: 38010,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedUnsupportedCardType: AppError = {\r\n id: 38011,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedFullPageAPIFetchFailed: AppError = {\r\n id: 38012,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedFeedNativeAdServiceFetchFailed: AppError = {\r\n id: 38013,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedFeedInvalidRiverTemplateId: AppError = {\r\n id: 38014,\r\n source: DesktopFeedConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedFeedInvalidEmptyRiver: AppError = {\r\n id: 38015,\r\n source: DesktopFeedConnectorFileName,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\nexport const DesktopFeedInvalidSectionData: AppError = {\r\n id: 38016,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedUnexpectedUpsellCard: AppError = {\r\n id: 38017,\r\n source: DesktopFeedConnectorFileName,\r\n message: \"Upsell card not expected to show up in the river, but it was returned by OneService.\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedTopStoriesMissingStories: AppError = {\r\n id: 38018,\r\n source: DesktopFeedConnectorFileName,\r\n message: \"Top stories card had less than 6 stories in response\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Common Header\r\n */\r\nconst CommonHeaderConnectorFileName = \"CommonHeader.connector.ts\";\r\nconst CommonHeaderTsxFileName = \"CommonHeader.tsx\";\r\nexport const CommonHeaderNavigationFailed: AppError = {\r\n id: 38020,\r\n source: CommonHeaderConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderInvalidConfig: AppError = {\r\n id: 38021,\r\n source: CommonHeaderConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderMissingFormCode: AppError = {\r\n id: 38022,\r\n source: CommonHeaderConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderRenderError: AppError = {\r\n id: 38023,\r\n source: CommonHeaderTsxFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderSSOFailed: AppError = {\r\n id: 38024,\r\n source: CommonHeaderTsxFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderMeControlLoadFailed: AppError = {\r\n id: 38025,\r\n source: CommonHeaderTsxFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CommonHeaderInvalidUrl: AppError = {\r\n id: 38026,\r\n source: CommonHeaderConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Search box WCE\r\n */\r\nconst SearchBoxWCFileName = \"SearchBoxWC.ts\";\r\nexport const SearchBoxWCMissingFormCode: AppError = {\r\n id: 38050,\r\n source: SearchBoxWCFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Search box Custom WCE\r\n */\r\nconst SearchBoxAsApiFileName = \"SearchBoxAsApi.ts\";\r\nexport const SearchBoxAsApiResponseError: AppError = {\r\n id: 38051,\r\n source: SearchBoxAsApiFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in video-card experience.\r\n */\r\nexport const VideoCardInvalidVideoData: AppError = {\r\n id: 38100,\r\n source: \"VideoCard.connector.ts\",\r\n severity,\r\n pb\r\n};\r\nconst VideoCardFileName = \"VideoCard.tsx\";\r\nexport const VideoPlayerYouTubeError: AppError = {\r\n id: 38101,\r\n source: VideoCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const VideoPlayerFacebookError: AppError = {\r\n id: 38102,\r\n source: VideoCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst NewsbarFeedConnectorFileName = \"NewsbarFeed.connector.ts\";\r\nexport const NewsbarFeedNativeAdServiceFetchFailed: AppError = {\r\n id: 38200,\r\n source: NewsbarFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\nexport const NewsbarFeedOneServicePageProviderFetchFailed: AppError = {\r\n id: 38201,\r\n source: NewsbarFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\nexport const NewsbarFeedInvalidLayoutTemplateId: AppError = {\r\n id: 38202,\r\n source: NewsbarFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n/*\r\n * Set of errors in sports-card experience.\r\n */\r\nconst SportsDataServiceFileName = \"SportsDataService.ts\";\r\nexport const SportsDataServiceResponseWasNullOrErroneous: AppError = {\r\n id: 38300,\r\n source: SportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SportsDataServiceFetchFailed: AppError = {\r\n id: 38301,\r\n source: SportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SportsDataServiceUserSettingSaveFailed: AppError = {\r\n id: 38302,\r\n source: SportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when search sports suggestion */\r\nexport const SportsCardSearchSuggestionError: AppError = {\r\n id: 38303,\r\n source: SportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in the sports-matchup-card experience\r\n */\r\n\r\nconst SportsMatchupCardConnectorSourceFile = \"SportsMatchupCard.connector.ts\";\r\n\r\n/** Exception when OneService response is incorrect */\r\nexport const SportsMatchupCardOneServiceDataError: AppError = {\r\n id: 38310,\r\n source: SportsMatchupCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst SportsMatchupCardSourceFile = \"SportsMatchupCard.tsx\";\r\n\r\n/** Exception when OneService response is incorrect */\r\nexport const SportsMatchupCardDataError: AppError = {\r\n id: 38314,\r\n source: SportsMatchupCardSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/*\r\n * Set of errors in sports-card experience.\r\n */\r\nconst SportsDataMapperFileName = \"SportsDataMapper.ts\";\r\nexport const SportsDataMaperCardTitleIsNull: AppError = {\r\n id: 38320,\r\n source: SportsDataMapperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SportsDataMaperCardParseError: AppError = {\r\n id: 38321,\r\n source: SportsDataMapperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SportsDataMaperNullData: AppError = {\r\n id: 38322,\r\n source: SportsDataMapperFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in the sports-card-wc experience\r\n */\r\n\r\nconst SportsCardWCSourceFile = \"SportsCardWC.ts\";\r\n\r\n/** Exception when create indexed db */\r\nexport const SportsCardWCIndexedDbError: AppError = {\r\n id: 38330,\r\n source: SportsCardWCSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when fetch feed response data error */\r\nexport const SportsCardWCFeedDataError: AppError = {\r\n id: 38331,\r\n source: SportsCardWCSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when search sports suggestion */\r\nexport const SportsCardWCSearchSuggestionError: AppError = {\r\n id: 38332,\r\n source: SportsCardWCSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception when widget instance is null */\r\nexport const SportsCardWCWidgetInstError: AppError = {\r\n id: 38333,\r\n source: SportsCardWCSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in ugc app type.\r\n */\r\nexport const UgcErrorPage: AppError = {\r\n id: 38400,\r\n source: \"UGC/page.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const UgcCreatorRenderError: AppError = {\r\n id: 38401,\r\n source: \"UgcCreator.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nexport const UgcCreatorApiError: AppError = {\r\n id: 38402,\r\n source: \"UgcCreator.api.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Modern Right Rail\r\n */\r\nconst ModernRightRailConnectorFileName = \"ModernRightRail.connector.ts\";\r\nconst ContentProviderServiceFileName = \"ContentProvider.services.ts\";\r\nconst TrendingNewsServiceFileName = \"ContentProvider.services.ts\";\r\nconst RecommendingVideosServiceFileName = \"ContentProvider.services.ts\";\r\n\r\n/** Failed to fetch provider details. */\r\nexport const ProviderDetailsFetchError: AppError = {\r\n id: 38500,\r\n source: ContentProviderServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** No content on fetching provider feed. */\r\nexport const ProviderFeedFetchEmpty: AppError = {\r\n id: 38501,\r\n source: ContentProviderServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch trending news card data. */\r\nexport const TrendingNewsFetchError: AppError = {\r\n id: 38502,\r\n source: TrendingNewsServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch trending news card backup data. */\r\nexport const TrendingNewsBackupFetchError: AppError = {\r\n id: 38503,\r\n source: TrendingNewsServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Native Ad fetch failed */\r\nexport const NativeAdFetchFailed: AppError = {\r\n id: 38504,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch recommending videos card data. */\r\nexport const RecommendingVideosFetchError: AppError = {\r\n id: 38505,\r\n source: RecommendingVideosServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to fetch recommending videos card backup data. */\r\nexport const RecommendingVideosBackupFetchError: AppError = {\r\n id: 38506,\r\n source: RecommendingVideosServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Fetched invalid number of items. */\r\nexport const TrendingNewsInvalidItems: AppError = {\r\n id: 38507,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Items are not include media source. */\r\nexport const TrendingNewsNotIncludeMediaItems: AppError = {\r\n id: 38508,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const RecommendedNewsInvalidItems: AppError = {\r\n id: 38509,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Items are not include media source. */\r\nexport const RecommendedNewsNotIncludeMediaItems: AppError = {\r\n id: 38510,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Fetched invalid number of items. */\r\nexport const RecommendingVideosInvalidItems: AppError = {\r\n id: 38511,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Items are not include media source. */\r\nexport const RecommendingVideosNotIncludeMediaItems: AppError = {\r\n id: 38512,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const NativeAdFetchEmpty: AppError = {\r\n id: 38513,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TrendingNewsFetchEmpty: AppError = {\r\n id: 38514,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const NoMoreFromProviderNewsReturned: AppError = {\r\n id: 38515,\r\n source: ModernRightRailConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors for BasePreferenceSettingManager.\r\n */\r\nconst BasePreferenceSettingManagerFileName = \"BasePreferenceSettingManager.ts\";\r\n\r\n/**\r\n * window.chrome.ntpSettingsPrivate API is not available\r\n */\r\nexport const NtpSettingsPrivateNotAvailable: AppError = {\r\n id: 38600,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error with writing to browser with ntpSettingsPrivate.setPref\r\n */\r\nexport const NtpSetPrefFailureToWrite: AppError = {\r\n id: 38601,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error reading ntpSettingsPrivate.getPref\r\n */\r\nexport const NtpGetPrefFailureToRead: AppError = {\r\n id: 38602,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Top level preference setting API is not available\r\n */\r\nexport const PreferenceSettingApiNotAvailable: AppError = {\r\n id: 38603,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Preference key is missing\r\n */\r\nexport const PreferenceSettingKeyNotAvailable: AppError = {\r\n id: 38604,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Preference setting did not save\r\n */\r\nexport const PreferenceSettingDidNotSave: AppError = {\r\n id: 38605,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Preference key is missing when it should not be\r\n */\r\nexport const PreferenceKeyMissingUnexpectedly: AppError = {\r\n id: 38606,\r\n source: BasePreferenceSettingManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Background image\r\n * More errors can be found on 818X\r\n */\r\nconst enterpriseImageProvider = \"EnterpriseImageProvider.ts\";\r\n\r\n/** Failed to fetch provider details. */\r\nexport const CopyrightParseError: AppError = {\r\n id: 38700,\r\n source: bingImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE image invalid index */\r\nexport const FREImageInvalidIndex: AppError = {\r\n id: 38701,\r\n source: bingImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Enterprise image unexpected call */\r\nexport const EnterpriseImageUnexpected: AppError = {\r\n id: 38702,\r\n source: enterpriseImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Enterprise image invalid index */\r\nexport const EnterpriseInvalidIndex: AppError = {\r\n id: 38703,\r\n source: enterpriseImageProvider,\r\n severity,\r\n pb\r\n};\r\n\r\nconst summaryCardConnectorFileName = \"SummaryCard.connector.ts\";\r\n\r\n/** Error fetching weather data */\r\nexport const SummaryCardFetchWeatherData: AppError = {\r\n id: 38800,\r\n source: summaryCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error fetching weather auto suggest data */\r\nexport const SummaryCardFetchAutoSuggestWeatherData: AppError = {\r\n id: 38801,\r\n source: summaryCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error refreshing weather data */\r\nexport const SummaryCardRefreshWeatherData: AppError = {\r\n id: 38802,\r\n source: summaryCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error connecting summary card component */\r\nexport const SummaryCardConnectComponent: AppError = {\r\n id: 38803,\r\n source: summaryCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst todaysEventsCardConnectorFileName = \"TodaysEventsCard.connector.ts\";\r\nconst todaysEventsCardManagerFileName = \"EventManager.ts\";\r\nconst todaysEventsCardTimeHelperName = \"TimeHelper.ts\";\r\nconst calendarCardFileName = \"CalendarCard.ts\";\r\nconst calendarCardManagerFileName = \"EventManager.ts\";\r\nconst calendarCardTimeHelperName = \"TimeHelper.ts\";\r\nconst calendarCardEventItemTemplateName = \"EventItem.template.ts\";\r\n\r\n/** Error fetching today's events */\r\nexport const TodaysEventsCardFetch: AppError = {\r\n id: 38900,\r\n source: todaysEventsCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error determining todays event's conflicts */\r\nexport const TodaysEventsCardManagerConflict: AppError = {\r\n id: 38901,\r\n source: todaysEventsCardManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the Date-fns library */\r\nexport const TodaysEventsCardDateFnsError: AppError = {\r\n id: 38902,\r\n source: todaysEventsCardTimeHelperName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error fetching today's events from API */\r\nexport const CalendarCardFetchFailed: AppError = {\r\n id: 38903,\r\n source: calendarCardManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error determining todays event's conflicts */\r\nexport const CalendarCardManagerConflict: AppError = {\r\n id: 38904,\r\n source: calendarCardManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error determining todays event's conflicts */\r\nexport const CalendarCardProcessEventsResponseFailed: AppError = {\r\n id: 38905,\r\n source: calendarCardManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the Date-fns library */\r\nexport const CalendarCardDateFnsError: AppError = {\r\n id: 38906,\r\n source: calendarCardTimeHelperName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error generating the template for the Event Action Button */\r\nexport const CalendarCardActionButtonError: AppError = {\r\n id: 38907,\r\n source: calendarCardEventItemTemplateName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error generating the time until event label */\r\nexport const CalendarCardTimeUntilEventError: AppError = {\r\n id: 38908,\r\n source: calendarCardEventItemTemplateName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const CalendarCardUnknownError: AppError = {\r\n id: 38909,\r\n source: calendarCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst frequentSitesCardConnectorFileName = \"FrequentSitesCard.connector.ts\";\r\n\r\n// Error Fetching Frequent Sites Data\r\nexport const FrequentSitesCardFetch: AppError = {\r\n id: 39000,\r\n source: frequentSitesCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst recommendedCardConnectorFileName = \"RecommendedCard.connector.ts\";\r\nconst recommendedCardInspectorFileName = \"RecommendedCard.inspector.ts\";\r\nconst recommendedCardFeed = \"RecommendedCardFeed\";\r\nconst recommendedDocumentsServiceClient = \"RecommendedDocumentsServiceClient.ts\";\r\n\r\n// Error Fetching Recommended Card Documents\r\nexport const RecommendedCardConnectorFetchDocuments: AppError = {\r\n id: 39100,\r\n source: recommendedCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const RecommendedCardConnectorFetchImages: AppError = {\r\n id: 39101,\r\n source: recommendedCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error Fetching Recommended Card Preview Image\r\nexport const RecommendedCardConnectorFetchImage: AppError = {\r\n id: 39102,\r\n source: recommendedCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error creating file item props\r\nexport const RecommendedCardInspectorBuildFileItems: AppError = {\r\n id: 39103,\r\n source: recommendedCardInspectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error Fetching Documents from the Recommended Card Feed component\r\nexport const RecommendedCardFeedFetchDocuments: AppError = {\r\n id: 39104,\r\n source: recommendedCardFeed,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error Fetching Preview Image from the Recommended Card Feed component\r\nexport const RecommendedCardFeedFetchImage: AppError = {\r\n id: 39105,\r\n source: recommendedCardFeed,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error switching from the Recommended Card Feed component to Office pivto\r\nexport const RecommendedCardFeedSwitchToOffice: AppError = {\r\n id: 39106,\r\n source: recommendedCardFeed,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error switching from the Recommended Card Feed component to Office pivto\r\nexport const RecommendedCardFeedMissingPivotSwitchConfig: AppError = {\r\n id: 39107,\r\n source: recommendedCardFeed,\r\n severity,\r\n pb\r\n};\r\n\r\n// Error for the Recommended Card to print duration when fetch exceeds the time out\r\nexport const RecommendedCardDocumentsServiceClientTimeOut: AppError = {\r\n id: 39108,\r\n source: recommendedDocumentsServiceClient,\r\n severity,\r\n pb\r\n};\r\n\r\nconst productivityHubContainerConnectorFileName = \"ProductivityHubContainer.connector.ts\";\r\n\r\n/** Error loading child experiences */\r\nexport const ProductivityHubContainerLoadChildren: AppError = {\r\n id: 39200,\r\n source: productivityHubContainerConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst edgeNextLayoutOptimizerFileName = \"EdgeNextLayoutOptimizer.ts\";\r\n\r\n/** Error applying recommended layout */\r\nexport const ApplyingRecommendedLayoutFailed: AppError = {\r\n id: 39300,\r\n source: edgeNextLayoutOptimizerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst wpoLayoutManagerFileName = \"WpoLayoutManager.ts\";\r\n\r\n/** Error applying recommended layout */\r\nexport const TriedToApplyNoAdsPromotionMoreThanOnce: AppError = {\r\n id: 39350,\r\n source: wpoLayoutManagerFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in the bing-video-card experience\r\n */\r\n\r\nconst BingVideoCardConnectorSourceFile = \"BingVideoCard.connector.ts\";\r\nconst BingVideoSlideCardSourceFile = \"SlideCard.tsx\";\r\nconst BingVideoOpalRecoInstrumentationSourceFile = \"OpalRecoInstrumentation.ts\";\r\nconst BingVideoCarouselSourceFile = \"BingVideoCarousel.ts\";\r\nconst BingVideoCarouselDataMapperFile = \"BingVideoCarouselDataMapper.ts\";\r\n\r\n/** Exception when OneService response is incorrect */\r\nexport const BingVideoCardOneServiceDataError: AppError = {\r\n id: 39400,\r\n source: BingVideoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardOneServiceDataTypeError: AppError = {\r\n id: 39401,\r\n source: BingVideoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardOneServiceDataParseError: AppError = {\r\n id: 39402,\r\n source: BingVideoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardDataError: AppError = {\r\n id: 39403,\r\n source: BingVideoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardDataParseError: AppError = {\r\n id: 39404,\r\n source: BingVideoCardConnectorSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardMotionThumbnailError: AppError = {\r\n id: 39405,\r\n source: BingVideoSlideCardSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCardOpalFeedbackError: AppError = {\r\n id: 39406,\r\n source: BingVideoOpalRecoInstrumentationSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCarouselSwitchToWatch: AppError = {\r\n id: 39410,\r\n source: BingVideoCarouselSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const BingVideoCarouselDataMapperError: AppError = {\r\n id: 39420,\r\n source: BingVideoCarouselDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst FreServiceClientFileName = \"FreServiceClient.ts\";\r\nconst ColdStartConnectorFileName = \"ColdStart.connector.ts\";\r\nconst ColdStartFileName = \"ColdStart.tsx\";\r\nconst ColdStartArticlesTemplateFileName = \"Articles.template.tsx\";\r\nconst ColdStartPublishersTemplateFileName = \"Publishers.template.tsx\";\r\nconst ColdStartWCEFileName = \"ColdStartWC.ts\";\r\n\r\n/** Error setting required parameters for FRE client functions */\r\nexport const SettingRequiredParametersFailed: AppError = {\r\n id: 39500,\r\n source: FreServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error getting data for artifacts */\r\nexport const GettingArtifactsDataFailed: AppError = {\r\n id: 39501,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Missing FRE signal */\r\nexport const MissingFRESignal: AppError = {\r\n id: 39502,\r\n source: DesktopFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Empty FRE response */\r\nexport const EmptyFREResponse: AppError = {\r\n id: 39503,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE unsupported template */\r\nexport const FREUnsupportedTemplate: AppError = {\r\n id: 39504,\r\n source: ColdStartFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE missing publisher metadata */\r\nexport const FREMissingPublisherMetadata: AppError = {\r\n id: 39505,\r\n source: ColdStartPublishersTemplateFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE missing article metadata */\r\nexport const FREMissingArticleMetadata: AppError = {\r\n id: 39506,\r\n source: ColdStartArticlesTemplateFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE missing callback url */\r\nexport const FREMissingCallbackUrl: AppError = {\r\n id: 39507,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Failed to go to next stage*/\r\nexport const FailedToGoToNextStage: AppError = {\r\n id: 39508,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** The done Action call failed */\r\nexport const DoneActionFailed: AppError = {\r\n id: 39509,\r\n source: FreServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** An Actions call failed */\r\nexport const FreActionsCallFailed: AppError = {\r\n id: 39510,\r\n source: FreServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Setting the maybe later state failed */\r\nexport const FreMaybeLaterStateFailed: AppError = {\r\n id: 39511,\r\n source: FreServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Cold Start Topics Data Connector not defined */\r\nexport const ColdStartUndefinedTopicDataConnector: AppError = {\r\n id: 39512,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE missing sub cards */\r\nexport const FREMissingSubCards: AppError = {\r\n id: 39513,\r\n source: ColdStartConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Not enough data to render the first page of content */\r\nexport const FreInsufficientFirstPageData: AppError = {\r\n id: 39514,\r\n source: ColdStartWCEFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** FRE returned subcards missing data */\r\nexport const FreSubcardsMissingData: AppError = {\r\n id: 39515,\r\n source: ColdStartWCEFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents HoroscopeAnswerCard related App errors. 396xx: Horoscope Answer Card*/\r\nconst horoscopeAnswerCardDataService = \"HoroscopeAnswerCardDataService.ts\";\r\nconst horoscopeDataMapperFile = \"libs/feed-layout/.../HoroscopeCardDataMapper.ts\";\r\n/** Represents get horoscope info and user signin info error */\r\nexport const HoroscopeAnswerCardGetApiFailed: AppError = {\r\n id: 39600,\r\n source: horoscopeAnswerCardDataService,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents horoscope selection post error */\r\nexport const HoroscopeAnswerCardPostApiFailed: AppError = {\r\n id: 39601,\r\n source: horoscopeAnswerCardDataService,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents horoscope data mapper error */\r\nexport const HoroscopeDataMapperError: AppError = {\r\n id: 39602,\r\n source: horoscopeDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst targetActionCTA = \"TargetAction.cta.ts\";\r\n/**\r\n * SetDefaultBrowser chromium api threw exception\r\n */\r\nexport const SetDefaultBrowserException: AppError = {\r\n id: 39700,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * SetDefaultBrowser chromium api not available\r\n */\r\nexport const SetDefaultBrowserNotAvailable: AppError = {\r\n id: 39701,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error reading ntp private settings preference.\r\n */\r\nexport const AppPinningPrivateException: AppError = {\r\n id: 39702,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * window.chrome.desktopWidgetPrivate API is not available\r\n */\r\nexport const DesktopWidgetPrivateNotAvailable: AppError = {\r\n id: 39703,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error reading ntp private settings preference.\r\n */\r\nexport const WebWidgetLaunchApiNotAvailable: AppError = {\r\n id: 39704,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/*\r\n* Error reading ntp private settings preference.\r\n*/\r\nexport const WebWidgetEnableAutoStartApiNotAvailable: AppError = {\r\n id: 39705,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error reading ntp private settings preference.\r\n */\r\nexport const FailedToLaunchAndDefaultWebWidget: AppError = {\r\n id: 39706,\r\n source: targetActionCTA,\r\n severity,\r\n pb\r\n};\r\n\r\n/** AppErrors for SocialEmbeds */\r\nconst FacebookEmbedFile = \"FacebookEmbed.ts\";\r\nconst InstagramEmbedFile = \"InstagramEmbed.ts\";\r\nconst InfogramEmbedFile = \"InfogramEmbed.ts\";\r\nconst GoogleMapsEmbedFile = \"GoogleMapsEmbed.ts\";\r\nconst TiktokEmbedFile = \"TiktokEmbed.ts\";\r\nconst SpotifyEmbedFile = \"SpotifyEmbed.ts\";\r\nconst FlourishEmbedFile = \"FlourishEmbed.ts\";\r\nconst RedditEmbedFile = \"RedditEmbed.ts\";\r\nconst PinterestEmbedFile = \"PinterestEmbed.ts\";\r\n/** Represents facebook embed validation failed */\r\nexport const FacebookEmbedValidationError: AppError = {\r\n id: 39800,\r\n source: FacebookEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents instagram embed validation failed */\r\nexport const InstagramEmbedValidationError: AppError = {\r\n id: 39810,\r\n source: InstagramEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents infogram embed validation failed */\r\nexport const InfogramEmbedValidationError: AppError = {\r\n id: 39820,\r\n source: InfogramEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents GoogleMaps embed validation failed */\r\nexport const GoogleMapsEmbedValidationError: AppError = {\r\n id: 39830,\r\n source: GoogleMapsEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Tiktok embed validation failed */\r\nexport const TiktokEmbedValidationError: AppError = {\r\n id: 39840,\r\n source: TiktokEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Flourish embed validation failed */\r\nexport const FlourishEmbedValidationError: AppError = {\r\n id: 39850,\r\n source: FlourishEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Spotify embed validation failed */\r\nexport const SpotifyEmbedValidationError: AppError = {\r\n id: 39860,\r\n source: SpotifyEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Reddit embed validation failed */\r\nexport const RedditEmbedValidationError: AppError = {\r\n id: 39870,\r\n source: RedditEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents Pinterest embed validation failed */\r\nexport const PinterestEmbedValidationError: AppError = {\r\n id: 39880,\r\n source: PinterestEmbedFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst onThisDayCardDataService = \"OnThisDayCardDataService.ts\";\r\nconst onThisDayCardDataMapperFile = \"libs/feed-layout/.../OnThisDayCardDataMapper.ts\";\r\n/** Represents get onThisDay info failed */\r\nexport const OnThisDayCardGetApiFailed: AppError = {\r\n id: 39900,\r\n source: onThisDayCardDataService,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents mapper data error */\r\nexport const OnThisDayCardDataMapperError: AppError = {\r\n id: 39901,\r\n source: onThisDayCardDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Telemetry initialization error\r\n */\r\nexport const EventHubPageTelemetryInitializationError: AppError = {\r\n id: 40000,\r\n source: \"EventHubPage.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Apperrors for the ntp consumer waffle\r\n */\r\nconst ConsumerWaffleFile = \"ServiceWaffle.connector.ts\";\r\nexport const ConsumerWaffleError: AppError = {\r\n id: 40100,\r\n source: ConsumerWaffleFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const ConsumerWaffleStringLoadError: AppError = {\r\n id: 40101,\r\n source: ConsumerWaffleFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst portugueseElectionExperienceDataService = \"PortugueseElectionExperienceDataService.ts\";\r\n/** Represents get portugueseElectionExperienceDataService info failed */\r\nexport const PortugueseElectionExperienceGetApiFailed: AppError = {\r\n id: 40201,\r\n source: portugueseElectionExperienceDataService,\r\n severity,\r\n pb\r\n};\r\n\r\nconst WpoCardProviderFileName = \"WpoCardProvider.ts\";\r\n\r\nexport const WpoCardProviderAppErrors = {\r\n WpoResponseServerInternalError: {\r\n id: 40300,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorFetchingWpoResponse: {\r\n id: 40301,\r\n source: WpoCardProviderFileName,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n RiverConfigurationIssue: {\r\n id: 40302,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoGetMuidFailure: {\r\n id: 40303,\r\n source: WpoCardProviderFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n StaticContentLoaded: {\r\n id: 40304,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoFailedAtFirstPage: {\r\n id: 40305,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoResponseUnauthorized: {\r\n id: 40306,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoResponseNotFound: {\r\n id: 40307,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoResponseNoContent: {\r\n id: 40308,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n WpoResponseNullOrUndefined: {\r\n id: 40309,\r\n source: WpoCardProviderFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Errors related to Desktop Feed EdgeNext\r\n */\r\nconst DesktopFeedEdgeNextFileName = \"DesktopFeedEdgeNext.tsx\";\r\nconst DesktopFeedEdgeNextConnectorFileName = \"DesktopFeedEdgeNext.connector.ts\";\r\n\r\nexport const DesktopFeedEdgeNextNativeAdServiceFetchFailed: AppError = {\r\n id: 40401,\r\n source: DesktopFeedEdgeNextConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedEdgeNextRiverContentFetchFailed: AppError = {\r\n id: 40402,\r\n source: DesktopFeedEdgeNextConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedEdgeNextMissingFreSignal: AppError = {\r\n id: 40404,\r\n source: DesktopFeedEdgeNextConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedEdgeNextSwitchToWatch: AppError = {\r\n id: 40405,\r\n source: DesktopFeedEdgeNextFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedEdgeNextUnexpectedUpsellCard: AppError = {\r\n id: 40406,\r\n source: DesktopFeedEdgeNextConnectorFileName,\r\n message: \"Upsell card not expected to show up in the river, but it was returned by OneService.\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** App Errors for Recipes */\r\nconst RecipesPage = \"recipes/page.ts\";\r\n\r\n/**\r\n * Recipes level exception was thrown\r\n */\r\nexport const RecipesPageError: AppError = {\r\n id: 40500,\r\n source: RecipesPage,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Recipes Page Error fetching the APP_ANON cookie\r\n */\r\nexport const RecipesPageErrorFetchingAppAnonCookie: AppError = {\r\n id: 40501,\r\n source: RecipesPage,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const RecipesOneServiceError: AppError = {\r\n id: 40510,\r\n source: RecipesPage,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n/** End App Errors for Recipes */\r\n\r\n/**\r\n * Errors related to Desktop Feed Single Column\r\n */\r\nconst DesktopFeedSingleColumnConnectorFileName = \"DesktopFeedSingleColumn.connector.ts\";\r\nexport const DesktopFeedSingleColumnNativeAdServiceFetchFailed: AppError = {\r\n id: 40601,\r\n source: DesktopFeedSingleColumnConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedSingleColumnRiverContentFetchFailed: AppError = {\r\n id: 40602,\r\n source: DesktopFeedSingleColumnConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const DesktopFeedSingleColumnCmsAdsMatchResponseFailed: AppError = {\r\n id: 40603,\r\n source: DesktopFeedSingleColumnConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst SDCardProviderFileName = \"SDCardProvider.ts\";\r\n\r\nexport const SDCardProviderResponseWasNullOrErroneous: AppError = {\r\n id: 40700,\r\n source: SDCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SDCardProviderErrorFetchingResponse: AppError = {\r\n id: 40701,\r\n source: SDCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SDCardProviderConfigurationIssue: AppError = {\r\n id: 40702,\r\n source: SDCardProviderFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** App Errors for QnA */\r\n\r\n/** Qna level exception was thrown */\r\nconst QnaPage = \"qna/page.ts\";\r\nexport const QnaPageError: AppError = {\r\n\r\n id: 40800,\r\n source: QnaPage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Qna Page Error fetching the APP_ANON cookie */\r\nexport const QnaPageErrorFetchingAppAnonCookie: AppError = {\r\n id: 40801,\r\n source: QnaPage,\r\n severity,\r\n pb\r\n};\r\n\r\n/** OneService API call error */\r\nconst QnaFeedServiceFileName = \"FeedService.ts\";\r\n\r\nexport const QnaFeedOneServiceErrors: AppError = {\r\n id: 40810,\r\n source: QnaFeedServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** ExperienceTrackerQna connector error */\r\nconst QnaExperienceTrackerConnectorFile = \"ExperienceTrackerQna.connector.ts\";\r\n\r\nexport const QnaExperienceTrackerError: AppError = {\r\n id: 40820,\r\n source: QnaExperienceTrackerConnectorFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Social Reactions App errors in SuperApp */\r\nconst SocialReactionsServiceResponseFileName = \"ArticleCardRenderer.tsx\";\r\n\r\n/**\r\n * Error parsing response from OneService call to update Social Reaction count in SuperApp.\r\n */\r\nexport const SocialReactionsServiceResponseDataParse: AppError = {\r\n id: 40900,\r\n source: SocialReactionsServiceResponseFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst ToDoCardConnectorFileName = \"TodoCard.connector.ts\";\r\n\r\n/** Error with the ToDo card API when trying to fetch existing tasks */\r\nexport const ToDoCardAPIFetchTasksFailed: AppError = {\r\n id: 41000,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card API when trying create a new task */\r\nexport const ToDoCardAPICreateTaskFailed: AppError = {\r\n id: 41001,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card API when trying to fetch existing task folders */\r\nexport const ToDoCardAPIRetrieveFoldersFailed: AppError = {\r\n id: 41002,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card API when trying to update the status of a task */\r\nexport const ToDoCardAPIUpdateTaskStatusFailed: AppError = {\r\n id: 41003,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card API when trying to update the importance of a task */\r\nexport const ToDoCardAPIUpdateTaskImportanceFailed: AppError = {\r\n id: 41004,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card when trying to update the completion of a task */\r\nexport const ToDoCardAPICompleteTaskFailed: AppError = {\r\n id: 41005,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card API when trying to update the subject of a task */\r\nexport const ToDoCardAPISubjectChangeFailed: AppError = {\r\n id: 41006,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error with the ToDo card when toggling between task lists */\r\nexport const ToDoCardFailedToToggleList: AppError = {\r\n id: 41007,\r\n source: ToDoCardConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst FinanceMarketCardFile = \"FinanceMarketCard.connector.ts\";\r\nconst FinanceDetailCardFile = \"FinanceDetailsCard.connector.ts\";\r\nconst FinanceWatchlistViewFile = \"WatchlistView.connector.ts\";\r\nconst FinanceNewsCardFile = \"FinanceNewsCard.connector.ts\";\r\nconst FinanceTrendCardFile = \"FinanceTrendCard.connector.ts\";\r\nconst FinanceFeedsFile = \"FinanceFeeds.connector.ts\";\r\n\r\n/**\r\n * 411xx reserved for finance experience errors\r\n*/\r\n\r\n/** Error when finance market card unavailable */\r\nexport const FinanceMarketCardAppError: AppError = {\r\n id: 41100,\r\n source: FinanceMarketCardFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Error when finance detail card unavailable */\r\nexport const FinanceDetailCardAppError: AppError = {\r\n id: 41101,\r\n source: FinanceDetailCardFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Error when finance watchlist view sign status error, this err code is especially used for sign in */\r\nexport const FinanceWatchlistViewAppError: AppError = {\r\n id: 41102,\r\n source: FinanceWatchlistViewFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Error when finance news card unavailable */\r\nexport const FinanceNewsCardAppError: AppError = {\r\n id: 41103,\r\n source: FinanceNewsCardFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Error when finance trend card unavailable */\r\nexport const FinanceTrendCardAppError: AppError = {\r\n id: 41104,\r\n source: FinanceTrendCardFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/** Error when finance feeds unavailable */\r\nexport const FinanceFeedsAppError: AppError = {\r\n id: 41105,\r\n source: FinanceFeedsFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/**\r\n * 412xx reserved for finance experiecne warnings\r\n*/\r\n\r\n/** Warning for finance market card. */\r\nexport const FinanceMarketCardAppWarning: AppError = {\r\n id: 41200,\r\n source: FinanceMarketCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Warning for finance detail card. */\r\nexport const FinanceDetailCardAppWarning: AppError = {\r\n id: 41201,\r\n source: FinanceDetailCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Warning for finance watchlist view */\r\nexport const FinanceWatchlistViewAppWarning: AppError = {\r\n id: 41202,\r\n source: FinanceWatchlistViewFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error when finance news card unavailable */\r\nexport const FinanceNewsCardAppWarning: AppError = {\r\n id: 41203,\r\n source: FinanceNewsCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error when finance trend card unavailable */\r\nexport const FinanceTrendCardAppWarning: AppError = {\r\n id: 41204,\r\n source: FinanceTrendCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error when finance feeds unavailable */\r\nexport const FinanceFeedsAppWarning: AppError = {\r\n id: 41205,\r\n source: FinanceFeedsFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** App Errors for Views FullPage Data Connector */\r\nconst ViewsFullPageConnector = \"ViewsFullPage.connector.ts\";\r\nconst ViewsFullPageServiceClient = \"ViewsFullPageServiceClient.ts\";\r\n\r\n/**\r\n * Error while parsing data\r\n */\r\nexport const ViewsFullPageTransformError: AppError = {\r\n id: 41300,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while fetching data\r\n */\r\nexport const ViewsFullPageFetchError: AppError = {\r\n id: 41301,\r\n source: ViewsFullPageServiceClient,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while retrieveing sections data\r\n */\r\nexport const ViewsFullPageInvalidSection: AppError = {\r\n id: 41302,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * No Content Id present\r\n */\r\nexport const ViewsFullPageUndefinedContentId: AppError = {\r\n id: 41303,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Empty river after fetching river content\r\n */\r\nexport const ViewsFullPageEmptyRiverContent: AppError = {\r\n id: 41304,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * No trending news returned from ViewsFullPageApi\r\n */\r\nexport const ViewsFullPageTrendingNewsEmpty: AppError = {\r\n id: 41305,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * No more from provider returned from ViewsFullPageApi\r\n */\r\nexport const ViewsFullPageMoreFromProviderEmpty: AppError = {\r\n id: 41306,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Error while fetching river content\r\n */\r\nexport const ViewsFullPageRiverFetchError: AppError = {\r\n id: 41307,\r\n source: ViewsFullPageConnector,\r\n severity,\r\n pb\r\n};\r\n\r\nconst IndustryNewsCardFile = \"IndustryNewsCard.ts\";\r\n\r\n/** The Industry News Card failed to fetch industry news articles. */\r\nexport const IndustryNewsCardFailedToFetch: AppError = {\r\n id: 41400,\r\n source: IndustryNewsCardFile,\r\n severity,\r\n pb\r\n};\r\n\r\nconst EnterpriseRightRailFile = \"EnterpriseRightRail.ts\";\r\n\r\n/** The Enterprise Right Rail scroll telemetry failed to fire due to missing element */\r\nexport const EnterpriseRightRailScrollMissingElement: AppError = {\r\n id: 41420,\r\n source: EnterpriseRightRailFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Exception while fetching enterprise right rail data from wpo */\r\nexport const ExceptionFetchingEnterpriseRightRailData: AppError = {\r\n id: 41421,\r\n source: EnterpriseRightRailFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Stripe Feed\r\n */\r\nconst StripeFeedConnectorFileName = \"StripeFeed.connector.ts\";\r\nexport const StripeFeedRiverContentFetchFailed: AppError = {\r\n id: 41501,\r\n source: StripeFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const StripeFeedUnsupportedCardType: AppError = {\r\n id: 41502,\r\n source: StripeFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const StripeFeedWindowsTopStripeContentFetchFailed: AppError = {\r\n id: 41503,\r\n source: StripeFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const StripeFeedNativeAdServiceFetchFailed: AppError = {\r\n id: 41504,\r\n source: StripeFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const StripeFeedInvalidRiverTemplateId: AppError = {\r\n id: 41505,\r\n source: StripeFeedConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const StripeFeedInvalidEmptyRiver: AppError = {\r\n id: 41506,\r\n source: StripeFeedConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst BreakingNewsWCFileName = \"BreakingNewsWC.ts\";\r\nexport const BreakingNewsWCContentFetchFailed: AppError = {\r\n id: 41601,\r\n source: BreakingNewsWCFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst WelcomeGreetingWCFileName = \"WelcomeGreeting.ts\";\r\n/** throw data connctor error when not get the welcome greeting mount */\r\nexport const WelcomeGreetingExperiencedMountError: AppError = {\r\n id: 42601,\r\n source: WelcomeGreetingWCFileName,\r\n severity,\r\n pb\r\n};\r\n/** throw data connctor error when not get the weather data */\r\nexport const WeatherDataConnectorError: AppError = {\r\n id: 42602,\r\n source: WelcomeGreetingWCFileName,\r\n severity,\r\n pb\r\n};\r\n/** throw data connctor error when not get the page chromium data */\r\nexport const PageChromiumDataConnectorError: AppError = {\r\n id: 42603,\r\n source: WelcomeGreetingWCFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error during Service Worker registration. */\r\nconst ServiceWorkerRegistrationFileName = \"ResolveServiceWorker.ts\";\r\nexport const ServiceWorkerRegistrationAppError: AppError = {\r\n id: 43000,\r\n source: ServiceWorkerRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Watch page\r\n */\r\n\r\nconst WatchOpalRecoInstrumentationSourceFile = \"OpalRecoInstrumentation.ts\";\r\nconst WatchConnectorFileName = \"Watch.connector.ts\";\r\nconst WatchPageFileName = \"Watch.tsx\";\r\nexport const WatchRiverContentFetchFailed: AppError = {\r\n id: 43201,\r\n source: WatchConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WatchInvalidEmptyRiver: AppError = {\r\n id: 43202,\r\n source: WatchConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WatchOpalFeedbackError: AppError = {\r\n id: 43203,\r\n source: WatchOpalRecoInstrumentationSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WatchInvalidCurrentCardError: AppError = {\r\n id: 43204,\r\n source: WatchPageFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Related Article Block AppErrors\r\n */\r\nconst RelatedArticleConnectorFileName = \"RelatedArticleBlock.connector.ts\";\r\nexport const RelatedArticleParseError: AppError = {\r\n id: 43300,\r\n source: RelatedArticleConnectorFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * 434xx reserved for tips experiecne errors\r\n*/\r\nconst TipsCardServiceClientFileName = \"TipsCardServiceClient.ts\";\r\nconst TipsCardFileName = \"TipsCard.ts\";\r\nexport const TipsCardGetActionError: AppError = {\r\n id: 43400,\r\n source: TipsCardServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TipsCardResponseWasNullOrErroneous: AppError = {\r\n id: 43401,\r\n source: TipsCardServiceClientFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const TipsCardWCWidgetNull: AppError = {\r\n id: 43402,\r\n source: TipsCardFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nconst BingHealthCardDataMapperFile = \"libs/feed-layout/.../healthCardDataMapper.ts\";\r\n/** Represents mapper data error */\r\nexport const BingHealthCardDataMapperError: AppError = {\r\n id: 43500,\r\n source: BingHealthCardDataMapperFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Set of errors in esports-card experience.\r\n */\r\nconst EsportsDataServiceFileName = \"EsportsCard.ts\";\r\nexport const EsportsDataServiceResponseWasNullOrErroneous: AppError = {\r\n id: 43600,\r\n source: EsportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const EsportsDataServiceFetchFailed: AppError = {\r\n id: 43601,\r\n source: EsportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const EsportsCardFeedDataError: AppError = {\r\n id: 43602,\r\n source: EsportsDataServiceFileName,\r\n severity,\r\n pb\r\n};\r\n\r\n/** Error during WidgetLoader rendering. */\r\nconst WidgetLoaderRegistrationFileName = \"WidgetLoader.ts\";\r\nexport const WidgetLoaderException: AppError = {\r\n id: 43700,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderNoWidgetElementsFoundToRender: AppError = {\r\n id: 43701,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderNoWidgetsFoundInConfig: AppError = {\r\n id: 43702,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderMissingConfigRef: AppError = {\r\n id: 43703,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderWidgetNotFoundInConfig: AppError = {\r\n id: 43704,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderErrorLoadingComponent: AppError = {\r\n id: 43705,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const WidgetLoaderWidgetDisabledInConfig: AppError = {\r\n id: 43706,\r\n source: WidgetLoaderRegistrationFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Shared widget page.ts app error\r\n */\r\nconst SharedWidgetsPage = \"shared-widgets/page.ts\";\r\nexport const SharedWidgetsPageError: AppError = {\r\n id: 43800,\r\n source: SharedWidgetsPage,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SharedWidgetLoadTimeEventError: AppError = {\r\n id: 43801,\r\n source: \"WidgetsLoadTime.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * social-bar experience component render errors\r\n */\r\nconst SocialBarExperienceFile = \"SocialBar.tsx\";\r\n\r\nexport const SocialBarExperienceRenderErrorContentSocialBar: AppError = {\r\n id: 43850,\r\n source: SocialBarExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialBarExperienceRenderErrorReactionMenu: AppError = {\r\n id: 43851,\r\n source: SocialBarExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialBarExperienceRenderErrorSocialBarPanel: AppError = {\r\n id: 43852,\r\n source: SocialBarExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialBarExperienceRenderErrorUnknownComponent: AppError = {\r\n id: 43853,\r\n source: SocialBarExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * social-comment experience component render errors\r\n */\r\nconst SocialCommentExperienceFile = \"SocialComment.tsx\";\r\n\r\nexport const SocialCommentExperienceRenderErrorComment: AppError = {\r\n id: 43900,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorCommentBox: AppError = {\r\n id: 43901,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorCommentItem: AppError = {\r\n id: 43902,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorCommentList: AppError = {\r\n id: 43903,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorContentPanel: AppError = {\r\n id: 43904,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorDeleteMenu: AppError = {\r\n id: 43905,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorDisabledMessage: AppError = {\r\n id: 43906,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorFollowButton: AppError = {\r\n id: 43907,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorProfileEducator: AppError = {\r\n id: 43908,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorReactionMenu: AppError = {\r\n id: 43909,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorReactionPanel: AppError = {\r\n id: 43910,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorReplyList: AppError = {\r\n id: 43911,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorReportMenu: AppError = {\r\n id: 43912,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorSortBox: AppError = {\r\n id: 43913,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorTypingUsers: AppError = {\r\n id: 43914,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorUserCard: AppError = {\r\n id: 43915,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialCommentExperienceRenderErrorUnknownComponent: AppError = {\r\n id: 43916,\r\n source: SocialCommentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * social-profile experience component render errors\r\n */\r\nconst SocialProfileExperienceFile = \"SocialProfile.tsx\";\r\n\r\nexport const SocialProfileExperienceRenderErrorDisabledMessage: AppError = {\r\n id: 43950,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorUserCard: AppError = {\r\n id: 43951,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorDeleteMenu: AppError = {\r\n id: 43952,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorNavbar: AppError = {\r\n id: 43953,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorReportMenu: AppError = {\r\n id: 43954,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorSortBox: AppError = {\r\n id: 43955,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorCommunityGuidelinePage: AppError = {\r\n id: 43956,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorFollowButton: AppError = {\r\n id: 43957,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorMain: AppError = {\r\n id: 43958,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorPopup: AppError = {\r\n id: 43959,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileActivity: AppError = {\r\n id: 43960,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileActivityReadMarker: AppError = {\r\n id: 43961,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileAlertActivity: AppError = {\r\n id: 43962,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileBadgeActivity: AppError = {\r\n id: 43963,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileFollowActivity: AppError = {\r\n id: 43964,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileReactionActivity: AppError = {\r\n id: 43965,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileReplyActivity: AppError = {\r\n id: 43966,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileCommentItem: AppError = {\r\n id: 43967,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileComments: AppError = {\r\n id: 43968,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileFeed: AppError = {\r\n id: 43969,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfilePage: AppError = {\r\n id: 43970,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfilePrivacy: AppError = {\r\n id: 43971,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileReportMenu: AppError = {\r\n id: 43972,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileSubscriptions: AppError = {\r\n id: 43973,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileTabs: AppError = {\r\n id: 43974,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileUsers: AppError = {\r\n id: 43975,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileCard: AppError = {\r\n id: 43976,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileCardUserStats: AppError = {\r\n id: 43977,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorProfileAboutCard: AppError = {\r\n id: 43978,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorDefaultProfileSideBar: AppError = {\r\n id: 43979,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorCreatorProfileSideBar: AppError = {\r\n id: 43980,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorPublisherProfileCard: AppError = {\r\n id: 43981,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorPublisherProfileActionCard: AppError = {\r\n id: 43982,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorPublisherProfileSideBar: AppError = {\r\n id: 43983,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SocialProfileExperienceRenderErrorUnknownComponent: AppError = {\r\n id: 43984,\r\n source: SocialProfileExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Bing Content Service Client Error\r\n */\r\nconst BingContentServiceFile = \"BingContentService.ts\";\r\nexport const BingContentServiceError: AppError = {\r\n id: 44000,\r\n source: BingContentServiceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to Desktop Feed EdgeNext WC\r\n */\r\nconst NativeAdFetcherFile = \"NativeAdFetcher.ts\";\r\nconst RiverFetcherFile = \"RiverFetcher.ts\";\r\n\r\nexport const DesktopFeedEdgeNextWCNativeAdFetchFailed: AppError = {\r\n id: 44101,\r\n source: NativeAdFetcherFile,\r\n severity,\r\n pb\r\n};\r\nexport const DesktopFeedEdgeNextWCRiverFetchContentFailed: AppError = {\r\n id: 44102,\r\n source: RiverFetcherFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to the WebComponentExperience\r\n */\r\nconst WebComponentExperienceFile = \"WebComponentExperience.ts\";\r\nexport const WceInitializationException: AppError = {\r\n id: 44200,\r\n source: WebComponentExperienceFile,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const SubscriptionCallbackExecError: AppError = {\r\n id: 44300,\r\n source: \"libs/windows-shared/utilities/SubscribableMap.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Microsoft Edge Widget Errors\r\n */\r\nconst MicrosoftEdgeWidget = \"microsoft-edge-widget\";\r\nexport const MicrosoftEdgeWidgetBingDataError: AppError = {\r\n id: 44400,\r\n source: MicrosoftEdgeWidget,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const MicrosoftEdgeWidgetNoImageOfTheDay: AppError = {\r\n id: 44401,\r\n source: MicrosoftEdgeWidget,\r\n severity,\r\n pb\r\n};\r\n\r\nexport const MicrosoftEdgeWidgetIndexedDbError: AppError = {\r\n id: 44402,\r\n source: MicrosoftEdgeWidget,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Errors related to the Microsoft Feed Card experience\r\n * Warnings are mainly used when doing retries for Rest API calls\r\n */\r\nconst enum MicrosoftFeedCardErrorSource {\r\n MicrosoftFeedCard = \"MicrosoftFeedCard.ts\",\r\n FastFeedApiClient = \"FeedApiClient.ts\",\r\n FeedPreviewClient = \"FeedPreviewClient.ts\",\r\n PeoplePhotoProvider = \"PeoplePhotoProvider.ts\",\r\n HTTPRequest = \"HTTPRequest.ts\",\r\n ShareDialog = \"ShareDialog.ts\"\r\n}\r\n\r\nexport const MicrosoftFeedCardErrors = {\r\n UnknownError: {\r\n id: 44500,\r\n source: MicrosoftFeedCardErrorSource.MicrosoftFeedCard,\r\n severity,\r\n pb\r\n },\r\n UnknownErrorWarning: {\r\n id: 44501,\r\n source: MicrosoftFeedCardErrorSource.MicrosoftFeedCard,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FetchFeedDataFailed: {\r\n id: 44502,\r\n source: MicrosoftFeedCardErrorSource.FastFeedApiClient,\r\n severity,\r\n pb\r\n },\r\n FetchFeedDataFailedWarning: {\r\n id: 44503,\r\n source: MicrosoftFeedCardErrorSource.FastFeedApiClient,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FetchVideoPreviewFailed: {\r\n id: 44504,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity,\r\n pb\r\n },\r\n FetchVideoPreviewFailedWarning: {\r\n id: 44505,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FetchNewsPreviewFailed: {\r\n id: 44506,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity,\r\n pb\r\n },\r\n FetchNewsPreviewFailedWarning: {\r\n id: 44507,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FetchDocumentPreviewFailed: {\r\n id: 44508,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity,\r\n pb\r\n },\r\n FetchDocumentPreviewFailedWarning: {\r\n id: 44509,\r\n source: MicrosoftFeedCardErrorSource.FeedPreviewClient,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FetchPeoplePhotoFailed: {\r\n id: 44510,\r\n source: MicrosoftFeedCardErrorSource.PeoplePhotoProvider,\r\n severity,\r\n pb\r\n },\r\n FetchPeoplePhotoFailedWarning: {\r\n id: 44511,\r\n source: MicrosoftFeedCardErrorSource.PeoplePhotoProvider,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n ItemRenderingFailed: {\r\n id: 44512,\r\n source: MicrosoftFeedCardErrorSource.MicrosoftFeedCard,\r\n severity,\r\n pb\r\n },\r\n ShareDialogFailed: {\r\n id: 44513,\r\n source: MicrosoftFeedCardErrorSource.ShareDialog,\r\n severity,\r\n pb\r\n },\r\n\r\n AuthenticationFailedWarning: {\r\n id: 44514,\r\n source: MicrosoftFeedCardErrorSource.HTTPRequest,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n FastFeedSetupFailed: {\r\n id: 44515,\r\n source: MicrosoftFeedCardErrorSource.MicrosoftFeedCard,\r\n severity,\r\n pb\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ILoggingService } from \"clientcore-infrastructure-analytics/ILoggingService\";\r\nimport { Logger, logger } from \"./Logger\";\r\nimport { getQueryParameterByName } from \"./Util\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\ndeclare global {\r\n interface Window {\r\n webpackRequire: any;\r\n }\r\n}\r\n\r\ndeclare let __webpack_require__: any;\r\n\r\n/**\r\n * Logger that simply logs to console with minimum dependencies.\r\n * Used for bootstrap/inline script where we don't need any logging nor its dependencies.\r\n */\r\nexport class LiteLogger implements Logger {\r\n\r\n /** Backing field for the isDebug function */\r\n private isDebugEnabled: boolean;\r\n\r\n /**\r\n * The constructor\r\n */\r\n public constructor() {\r\n if (canUseDOM()) {\r\n this.isDebugEnabled = ((getQueryParameterByName(window.location.href, \"debug\") || \"\").toLowerCase() in { 1: 1, true: 1 });\r\n\r\n // On debug mode, make webpack_require available as global function\r\n // so any code in packages could be triggered from console. Handy for debugging.\r\n if (this.isDebugEnabled && !global[\"TEST_ENV\"]) {\r\n window.webpackRequire = __webpack_require__;\r\n }\r\n } else {\r\n this.isDebugEnabled = false; // isDebugEnabled should be set explictly using the setDebug method\r\n }\r\n }\r\n\r\n /**\r\n * Returns the logging service\r\n * @returns {ILoggingService}\r\n */\r\n public getLoggingService(): ILoggingService {\r\n return null;\r\n }\r\n\r\n /**\r\n * Checks whether we're running in debug mode.\r\n * @returns True when either debug=1 or debug=true is present as a query param, otherwise false.\r\n */\r\n public isDebug(): boolean {\r\n return this.isDebugEnabled;\r\n }\r\n\r\n /**\r\n * Override the isDebug setting. Useful when server side rendering.\r\n */\r\n public setDebug(isDebug: boolean): void {\r\n this.isDebugEnabled = isDebug;\r\n }\r\n\r\n /**\r\n * Set the tags to filter logs.\r\n * @param tags Tags to filter logs. If empty, do not filter.\r\n */\r\n public setTags(tags: string[]): void {\r\n // Not supported in console logger at the moment\r\n }\r\n\r\n /**\r\n * Log console message.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Message to log.\r\n * @param tags - Optional tags for specifying log type for filtering logs.\r\n */\r\n public log(message: string, tags?: string[]): void {\r\n if (this.isDebug()) {\r\n console.info(message);\r\n }\r\n }\r\n\r\n /**\r\n * Log error message.\r\n * @param message - Message to log\r\n */\r\n public logError(message: string): void {\r\n console.error(message);\r\n }\r\n\r\n /**\r\n * Lazy log console message. Use this when the message being constructed is complex or expensive so that it's only evaluated if needed.\r\n * Note that the callback is not invoked and the message is not output unless you're in debug mode.\r\n * @param getMessage - The function to call to get message to log\r\n */\r\n public logCallback(getMessage: () => string): void {\r\n if (this.isDebug()) {\r\n console.info(getMessage());\r\n }\r\n }\r\n\r\n /**\r\n * Log the object to the console.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Array of messages to log\r\n */\r\n public logObjects(...message: any[]): void {\r\n if (this.isDebug()) {\r\n console.log(...message);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Utility method to extract query string param in url.\r\n * @param name - Query param name\r\n * @returns Query param value\r\n */\r\nexport function getQueryParameterByName(locationHref: string, name: string): string {\r\n\r\n const nameRegEx = name.replace(/[[\\]]/g, \"\\\\$&\");\r\n const regex: any = new RegExp(\"[?&]\" + nameRegEx + \"(=([^&#]*)|&|#|$)\");\r\n\r\n const queryNameValueMatches: any = regex.exec(locationHref);\r\n if (!queryNameValueMatches) {\r\n return null;\r\n }\r\n\r\n // the second group would contain the value of the param\r\n const queryValue = queryNameValueMatches[2];\r\n\r\n return decodeURIComponent(queryValue.replace(/\\+/g, \" \")) || \"\";\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { minimumHostPagePathSegments } from \"../constants\";\r\n\r\n/**\r\n * The HostPage interface uses words defined by the Prime project for us to locate in what hostpage\r\n * the Feeds project is running.\r\n */\r\nexport interface IHostPage {\r\n originalUrl: string; // ex: https://www.msn.com/spartan/ntp/interests/my?fdhead=gizmodemo\r\n verticalKey: string, // ex: spartan or compass\r\n categoryKey: string, // ex: dhp or ntp\r\n hostName: string, // ex: www.msn.com\r\n topDomain: string, // ex: msn.com or msn.cn\r\n subcategoryKey?: string // ex: interests or discover\r\n}\r\n\r\nexport namespace HostPage {\r\n /**\r\n * This function extracts the hostPage information from the passed in href. This is based on the\r\n * Prime pathname convention of \"/vertical/category/subcategory\". If the passed href does not have at least the\r\n * category, then null is returned instead as this is considered an invalid URL.\r\n * @param {string} href - The URL, which will be used to extract the hostPage\r\n * @returns {IHostPage | null}\r\n */\r\n export function getHostPageFromUrl(href: string): IHostPage | null {\r\n if (!href) { return; }\r\n const url = new URL(href);\r\n\r\n const host = url.hostname;\r\n const pathnameSegments = url.pathname.split(\"/\");\r\n\r\n // for cookie stamping that needs the msn.com or msn.cn path isntead of using the full host value\r\n const topDomainName = (host.match(/[^.]+\\.[^.\\d]+$/) || {})[0] || \"\";\r\n\r\n /**\r\n * The + 1 in the following statement is take into account the empty string \"segment\"\r\n * that would be to the left of the first backslash in a valid path like \"/spartan/ntp\"\r\n */\r\n if (pathnameSegments.length <= minimumHostPagePathSegments) {\r\n return {\r\n originalUrl: href,\r\n categoryKey: null,\r\n verticalKey: null,\r\n hostName: host,\r\n topDomain: topDomainName\r\n }; // When the user url doesn't have atleast two pathsegments the vertical and category keys are null\r\n }\r\n\r\n /**\r\n * Consider path segments that have market in it e.g.\r\n * /en-us/news/other/title/ar-cmsId\r\n * /en-us/video/animals\r\n * /en-us/sports/nfl/scores\r\n */\r\n const isMarketPresent = pathnameSegments[1].length === 5 && pathnameSegments[1].split(\"-\").length === 2;\r\n const indexOffset = isMarketPresent ? 1 : 0;\r\n\r\n const hostPage: IHostPage = {\r\n originalUrl: href,\r\n categoryKey: pathnameSegments[2 + indexOffset],\r\n verticalKey: pathnameSegments[1 + indexOffset],\r\n hostName: host,\r\n topDomain: topDomainName\r\n };\r\n\r\n if (pathnameSegments.length >= minimumHostPagePathSegments) {\r\n hostPage.subcategoryKey = pathnameSegments[3 + indexOffset];\r\n }\r\n return hostPage;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Constants that are used throughout the library\r\n */\r\nexport namespace ConnectorConstants {\r\n /**\r\n * The key within a state JSON document used to store a connectors individual state\r\n */\r\n export const connectorStateKey = \"_@STATE@_\";\r\n\r\n export const renderAction = \"@@connector-view/RENDER\";\r\n\r\n export const dataConnectorMergeInitAction = \"@@data-connector/MERGE-INIT\";\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/// \r\n\r\n/**\r\n * Used to mock the LRU cache in unit test environments.\r\n * Partial is used to highlight this class is a subset of LRUCache and only\r\n * implements the functions we currently use out of this API. If more functions are\r\n * utilized they will need to be implmented here in this class.\r\n */\r\nexport class MockLRUCache implements Partial> {\r\n /** cache */\r\n private cacheMap: Map = new Map();\r\n\r\n /** Check if cache key exists */\r\n public async has(key: string): Promise {\r\n return !!this.cacheMap[key];\r\n }\r\n /** Get cached value by key */\r\n public async get(key: string): Promise {\r\n return this.cacheMap[key];\r\n }\r\n /** Set cached value by key */\r\n public async set(key: string, value: any, maxAge?: number): Promise {\r\n this.cacheMap[key] = value;\r\n return true;\r\n }\r\n /** Delete cached key-value pair */\r\n public async del(key: string): Promise {\r\n delete this.cacheMap[key];\r\n }\r\n /** Get count of total items cached */\r\n public async itemCount(): Promise {\r\n return Object.keys(this.cacheMap).length;\r\n }\r\n /** Reset entire cache */\r\n public async reset(): Promise {\r\n this.cacheMap = new Map();\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigReference } from \"@msnews/config-data-types\";\r\nimport { ChildExperienceConfigInfo, DynamicBundles, getConfigId, getExperienceType, RequestContext, resolver } from \"@msnews/core\";\r\nimport { AppError, LoadDataConnectorFailed, logException } from \"@msnews/diagnostics\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { IDataConnector } from \"@msnews/experiences-redux-contracts\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { reportDataConnectorStateChange } from \"@msnews/experiences-dynamic-reducer\";\r\n\r\nlet dataConnectorLoadPromiseMap: { [experienceType: string]: Promise } = {};\r\n\r\n/**\r\n * Gets a data connector with the given namespace.\r\n * @param namespace The data connector's namespace.\r\n * @returns The data connector.\r\n */\r\nexport async function getDataConnector>(namespace: ConnectorNamespaces): Promise {\r\n return namespace\r\n ? (await PageBase.getInstance().rootReducer.getDataConnector(namespace))\r\n : null;\r\n}\r\n\r\n/**\r\n * Tries to get a data connector with the given namespace.\r\n * @param namespace The data connector's namespace.\r\n * @returns The data connector, or null if it could not be found.\r\n */\r\nexport function tryGetDataConnector>(namespace: ConnectorNamespaces): T {\r\n return PageBase.getInstance().rootReducer.connector(namespace);\r\n}\r\n\r\n/**\r\n * Loads the data connector for the given config reference.\r\n * @param configInfo The config info for the data connector to load.\r\n */\r\nexport async function loadDataConnector(configInfo: ChildExperienceConfigInfo): Promise {\r\n const experienceType = getExperienceType(configInfo);\r\n\r\n // If loadDataConnector was already called, return existing promise.\r\n let promise = dataConnectorLoadPromiseMap[experienceType];\r\n if (promise) {\r\n return promise;\r\n }\r\n\r\n promise = new Promise(async (resolve, reject) => {\r\n try {\r\n const experienceType = getExperienceType(configInfo);\r\n const configId: string | ConfigReference = getConfigId(configInfo);\r\n\r\n // Warm the config and get the module definition in parallel\r\n const configPromise = resolver.getConfig(configId);\r\n const modulePromise = DynamicBundles.loadExperience(experienceType);\r\n const promiseResults = await Promise.all([configPromise, modulePromise]);\r\n\r\n const config = promiseResults[0].properties;\r\n const module = promiseResults[1];\r\n\r\n // Get the Connector/Reducer/Component via naming convention\r\n const ExperienceConnector = module[experienceType + \"Connector\"];\r\n const ExperienceReducer = module[experienceType + \"Reducer\"];\r\n const app = PageBase.getInstance();\r\n\r\n // Data connectors are singletons, so their registered namespace is their experienceType.\r\n // This allows them to be found using their ExperienceIds enum.\r\n const experienceConnector = new ExperienceConnector(\r\n experienceType,\r\n \"\",\r\n app.rootReducer,\r\n new ExperienceReducer(config),\r\n app.store,\r\n config,\r\n new RequestContext()\r\n );\r\n\r\n // Report initial data connector state when loaded.\r\n if (canUseDOM()) {\r\n reportDataConnectorStateChange(experienceType, experienceConnector.getCurrentState());\r\n }\r\n } catch (error) {\r\n const loadDataConnectorFailed: AppError = { ...LoadDataConnectorFailed, source: \"GetDataConnector.ts\" };\r\n logException(error, loadDataConnectorFailed, \"Loading data connector failed.\");\r\n }\r\n\r\n // Resolve the promise irrespective of any exception thrown so that other configured data connectors can still load.\r\n // If an exception is thrown, it will fire an app error.\r\n resolve();\r\n });\r\n\r\n dataConnectorLoadPromiseMap[experienceType] = promise;\r\n return promise;\r\n}\r\n\r\n/**\r\n * Clears out any loaded maps. Use only when testing. Will be tree-shaken away for prod.\r\n */\r\nexport function clearLoadedMapsTest() {\r\n dataConnectorLoadPromiseMap = {};\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { expPersistentDataChangeTrackerKey, forceReloadFlagName } from \"./PageLifecycleConstants\";\r\nimport { headData, getLocalStorage } from \"@msnews/core\";\r\n\r\nimport { PageInvalidationReasons } from \"./PageInvalidationReasons\";\r\nimport { getCurrentPerformanceTimeStamp } from \"./PrerenderActionHelpers\";\r\n\r\n/** Type for storing experiences with persistent data updates */\r\nexport type ExpWithPersistentDataUpdate = { [expType: string]: number };\r\n\r\n/**\r\n * return true if prerendered page is visible else false\r\n * @param expType - experience identifier\r\n */\r\nexport function hasExperiencePersistentDataUpdated(expType: string): boolean {\r\n if (headData.IsPrerender && document.visibilityState === \"visible\") {\r\n const storedExperiences = getLocalStorage().getObject(expPersistentDataChangeTrackerKey) || {};\r\n\r\n const timeStamp = storedExperiences[expType];\r\n if (!isNaN(timeStamp)) {\r\n delete storedExperiences[expType];\r\n getLocalStorage().setObject(expPersistentDataChangeTrackerKey, storedExperiences);\r\n\r\n if (timeStamp > performance.timing.navigationStart) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * update local storage to track experiences with updated persistent data/settings\r\n * @param expType - experience identifier\r\n */\r\nexport function trackExpWithPersistentDataUpdate(expType: string): void {\r\n const storedExperiences = getLocalStorage().getObject(expPersistentDataChangeTrackerKey) || {};\r\n const timeStamp = storedExperiences[expType];\r\n\r\n if (isNaN(timeStamp)) {\r\n storedExperiences[expType] = getCurrentPerformanceTimeStamp();\r\n getLocalStorage().setObject(expPersistentDataChangeTrackerKey, storedExperiences);\r\n }\r\n}\r\n\r\n/**\r\n * Track page invalidation, marks page to be reloaded on reveal.\r\n * @param expType - experience identifier\r\n */\r\nexport function trackPageInvalidation(invalidationReason: PageInvalidationReasons): void {\r\n // Write to local storage, current timestamp and invalidation requested reason\r\n getLocalStorage().setItem(forceReloadFlagName, JSON.stringify({ time: getCurrentPerformanceTimeStamp(), data: invalidationReason }));\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport function getParameter(key, defaultValue = null) {\r\n return getHashParameter(key) || getQueryParameter(key) || defaultValue;\r\n}\r\n\r\nfunction getQueryParameter (key) {\r\n const query = window.location.search.substring(1);\r\n const vars = query.split(\"&\");\r\n for (let i = 0; i < vars.length; i++) {\r\n const pair = vars[i].split(\"=\");\r\n if (pair[0].toLowerCase() == key.toLowerCase()) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n return null;\r\n}\r\nfunction getHashParameter(key) {\r\n const query = window.location.hash.substring(1);\r\n const vars = query.split(\"&\");\r\n for (let i = 0; i < vars.length; i++) {\r\n const pair = vars[i].split(\"=\");\r\n if (pair[0].toLowerCase() == key.toLowerCase()) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function generateQueryStringByKeyVals(keyVals) {\r\n return (keyVals && Object.keys(keyVals).length > 0) ? \"?\" + Object.keys(keyVals).map(function (key) {\r\n return `${key}=${encodeURIComponent(keyVals[key])}`;\r\n }).join(\"&\") : \"\";\r\n}\r\n\r\nexport function getExternalURL(externalURL, market?, hasSectionIndicator?: string) {\r\n const forwardableParameters = [\"fdhead\", \"item\", \"rt\", \"theme\", \"ocid\"];\r\n const queryParams = {};\r\n forwardableParameters.map(x => {\r\n const val = getQueryParameter(x);\r\n if (val) {\r\n queryParams[x] = val;\r\n }\r\n });\r\n const queryString = generateQueryStringByKeyVals(queryParams);\r\n if (market && externalURL.indexOf(\"/en-us/\") > 0) {\r\n externalURL = externalURL.replace(\"/en-us/\", `/${market}/`);\r\n }\r\n const segments = [externalURL];\r\n if (queryString && externalURL.indexOf(\"?\") != -1) {\r\n segments.push(`&${queryString.substring(1)}`);\r\n } else if (queryString) {\r\n segments.push(queryString);\r\n }\r\n segments.push(hasSectionIndicator ? `#comments&commentId=${hasSectionIndicator}` : \"\");\r\n return segments.join(\"\");\r\n}","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Defines the different reasons why the hidden page should be reloaded on reveal\r\n */\r\nexport enum PageInvalidationReasons {\r\n MuidChange = 1,\r\n MarketChange = 2,\r\n InterestsChange = 3,\r\n PivotSwitch = 4\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError } from \"@msnews/diagnostics\";\r\nimport { getElementTrackingDecorator } from \"./PrimeElementTrackingDecorator\";\r\nimport { getTrack } from \"./PrimeTrack\";\r\nimport { getTrackExtCompleteCanary } from \"./PrimeTrackExtensionComplete\";\r\nimport { getTrackInfo } from \"./PrimeTrackInfo\";\r\n\r\ntype trackingEventCall = {event: Event, element: HTMLElement, destination: string, headline: string};\r\ntype trackPartialImpression = {elem?: HTMLElement, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string};\r\ntype trackingDecoratorCall = {elementTree: HTMLElement, parentElement?: HTMLElement, options?: any, disableImpressionUpdate?: boolean};\r\n\r\nlet trackingResolved = false;\r\nlet trackingObject: PrimeGlobal.ITrack = null;\r\nlet elementTrackingDecorator: PrimeGlobal.IElementTrackingDecorator = null;\r\nlet trackExtCompleted: any = null;\r\nlet trackEventBuffer: trackingEventCall[] = [];\r\nlet trackImpressionBuffer: trackPartialImpression[] = [];\r\nlet trackAppErrorEventBuffer: AppError[] = [];\r\nlet elementTrackingDecoratorBuffer: trackingDecoratorCall[] = [];\r\nlet trackingPromiseCalled = false;\r\n\r\n// Following code is to decouple Prime dependency from initial state of experience. Once tracking is ported to Peregrine, it would not be needed.\r\n/**\r\n * Sets the tracking attributes on the given element(s) (e.g. data-m={'i':10, 'o':6, 'p':2} data-id=10)\r\n * If any elements contain 'i', 'i' will not change.\r\n * Ordinal and parent will sync to correct values for each element.\r\n * Will send an impression update for the new elements when called.\r\n * @param {HTMLElement} elementTree The complete element tree to decorate\r\n * @param {HTMLElement} parentElement The parent of the given element(s)\r\n * @param {any} options The settings for this call.\r\n * options.defaults [optional] default attributes for any particular object as a JS TelemetryItem object.\r\n * options.elementOverride [Optional] A callback in the form of (element, trackingAttributes) =&rt;void.\r\n * The callback can be used to alter or change any of the attributes before they are applied onto the element.\r\n * options.visibilityCheck [Optional] Flag indicating whether element visibility checking should be performed or not. By default is true.\r\n * options.selector [Optional] The selector to use for determining elements to instrument.\r\n * @param {boolean} disableImpressionUpdate Send impression update only when it is not disabled, by default it is false\r\n * @HTMLElement\r\n */\r\nfunction setTrackingForSingleElement(elementTree: HTMLElement, parentElement?: HTMLElement, options?: any, disableImpressionUpdate?: boolean): HTMLElement {\r\n return elementTrackingDecorator.setTrackingForSingleElement(elementTree, parentElement, options, disableImpressionUpdate);\r\n}\r\n\r\n// Following code is to decouple Prime dependency from initial state of experience. Once tracking is ported to Peregrine, it would not be needed.\r\n/**\r\n * Send the tracking call\r\n * @param {Event} event event object\r\n * @param {HTMLElement} element form code\r\n * @param {string} destination text\r\n * @param {string} headline text\r\n * @void\r\n */\r\nfunction sendTrackingCall(event: Event, element: HTMLElement, destination: string, headline: string): void {\r\n trackingObject.trackEvent(event, element, destination, headline);\r\n}\r\n\r\n/**\r\n * Makes the partial page request\r\n * @param {HTMLElement} elem object\r\n * @param {boolean} visibilityCheck\r\n * @param {TrackMechanism} mechanism\r\n * @param {string} topLevelContainerType\r\n * @void\r\n */\r\nfunction sendPartialPageRequest(elem?: HTMLElement, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string): void {\r\n trackingObject.trackPartialImpression(elem, visibilityCheck, mechanism, topLevelContainerType);\r\n}\r\n\r\n/**\r\n * Converts the AppError object to the Prime AppError type and make the trackAppErrorEvent call\r\n * @param appError - App error object\r\n */\r\nfunction sendTrackAppErrorEvent(appError: AppError): void {\r\n trackingObject.trackAppErrorEvent({ errId: appError.id, errSource: appError.source, errMsg: appError.message });\r\n}\r\n\r\n/**\r\n * Processes the pending tracking and page impresssion calls for statics.\r\n * Dependencies: getTrack(), getTrackExtCompleteCanary(), getElementTrackingDecorator()\r\n * @void\r\n */\r\nfunction processPendingTrackingCall(): void {\r\n Promise.all([getTrack(), getTrackExtCompleteCanary(), getElementTrackingDecorator()])\r\n .then(modules => {\r\n [trackingObject, trackExtCompleted, elementTrackingDecorator] = modules;\r\n\r\n // at this point we will process any pending requests and resolve tracking\r\n trackingResolved = true;\r\n if (trackEventBuffer.length > 0) {\r\n trackEventBuffer.forEach(eventObj => {\r\n try {\r\n sendTrackingCall(eventObj.event, eventObj.element, eventObj.destination, eventObj.headline);\r\n } catch {\r\n // This catch block is meant to continue to next element in the loop.\r\n // We may remove this in future once Error Boundaries are added.\r\n }\r\n });\r\n\r\n // empty it again after processing\r\n trackEventBuffer = [];\r\n }\r\n\r\n if (trackImpressionBuffer.length > 0) {\r\n trackImpressionBuffer.forEach(eventObj => {\r\n sendPartialPageRequest(eventObj.elem, eventObj.visibilityCheck, eventObj.mechanism, eventObj.topLevelContainerType);\r\n });\r\n\r\n // empty it again after processing\r\n trackImpressionBuffer = [];\r\n }\r\n\r\n if (trackAppErrorEventBuffer.length > 0) {\r\n trackAppErrorEventBuffer.forEach(appError => {\r\n sendTrackAppErrorEvent(appError);\r\n });\r\n\r\n // empty it again after processing\r\n trackAppErrorEventBuffer = [];\r\n }\r\n\r\n if (elementTrackingDecoratorBuffer.length > 0) {\r\n elementTrackingDecoratorBuffer.forEach(decorator => {\r\n const {elementTree, parentElement, options, disableImpressionUpdate} = decorator;\r\n setTrackingForSingleElement(elementTree, parentElement, options, disableImpressionUpdate);\r\n });\r\n\r\n // empty it again after processing\r\n elementTrackingDecoratorBuffer = [];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Callback function to pass to experience. It maintains an internal array to hold track calls until dependencies resolved.\r\n * @param {HTMLElement} element form code\r\n * @param {string} action (Type of action. Necessary to make it compatible with 1DS Telemetry SDK)\r\n * @param {number} behavior (Type of beavior. Necessary to make it compatible with 1DS Telemetry SDK)\r\n * @param {Event} event event object\r\n * @param {string} destination text\r\n * @param {string} headline text\r\n * @void\r\n */\r\nexport function handleTelemetryCall(element: HTMLElement, action?: string, behavior?: number, event?: Event, destination?: string, headline?: string): void {\r\n if (trackingResolved) {\r\n sendTrackingCall(event, element, destination, headline);\r\n } else {\r\n trackEventBuffer.push({ event: event, element: element, destination: destination, headline: headline });\r\n\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Makes the partial page request\r\n * @param {HTMLElement} elem object\r\n * @param {} viewType (Necessary to make it compatible with 1DS Telemetry SDK)\r\n * @param {boolean} visibilityCheck\r\n * @param {TrackMechanism} mechanism\r\n * @param {string} topLevelContainerType\r\n * @void\r\n */\r\nexport function handlePartialPageImpressionCall(elem?: HTMLElement, viewType?, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string): void {\r\n if (trackingResolved) {\r\n sendPartialPageRequest(elem, visibilityCheck, mechanism, topLevelContainerType);\r\n } else {\r\n trackImpressionBuffer.push({ elem: elem, visibilityCheck: visibilityCheck, mechanism: mechanism, topLevelContainerType: topLevelContainerType });\r\n\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Handler to log app errors\r\n * @param appError - App error object\r\n * @void\r\n */\r\nexport function handleAppErrorEventCall(appError: AppError): void {\r\n if (trackingResolved) {\r\n sendTrackAppErrorEvent(appError);\r\n } else {\r\n trackAppErrorEventBuffer.push({ ...appError });\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Decorates prime telemetry tags\r\n * @param decorator - Decorator object\r\n * @void\r\n */\r\nexport function handleSetTrackingAttrs(elementTree: HTMLElement, parentElement?: HTMLElement, options?: any, disableImpressionUpdate?: boolean): void {\r\n if (trackingResolved) {\r\n setTrackingForSingleElement(elementTree, parentElement, options, disableImpressionUpdate);\r\n } else {\r\n elementTrackingDecoratorBuffer.push({ elementTree, parentElement, options, disableImpressionUpdate });\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to wait on track extension complete canary.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves if track extension canary is define, rejects otherwise.\r\n */\r\nexport const getTrackExtCompleteCanary: IGetTrackExtComplete = () => {\r\n return requireAsync(\"c.trackExtComplete\");\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to retrieve the prime track object.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves if the track object could be loaded, rejects otherwise.\r\n */\r\nexport const getElementTrackingDecorator: IGetElementTrackingDecorator = () => {\r\n return requireAsync(\"elementTrackingDecorator\");\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to retrieve the prime track object.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves if the track object could be loaded, rejects otherwise.\r\n */\r\nexport const getTrack: IGetTrack = () => {\r\n return requireAsync(\"track\");\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different app types\r\n * @enum\r\n */\r\nexport enum AppType {\r\n Community = \"community\",\r\n Edge = \"edge\",\r\n EdgeChromium = \"edgeChromium\",\r\n Finance = \"finance\",\r\n FirstParty = \"firstParty\",\r\n HomePage = \"homePage\",\r\n Hub = \"hub\",\r\n MicrosoftNews = \"microsoftNews\",\r\n MMX = \"mmx\",\r\n NewsAndInterests = \"newsAndInterests\",\r\n Office = \"office\",\r\n qna = \"qna\",\r\n Recipes = \"recipes\",\r\n SharedWidgets = \"sharedWidgets\",\r\n SuperApp = \"superApp\",\r\n Shopping = \"shopping\",\r\n Traffic = \"traffic\",\r\n UGC = \"ugc\",\r\n Views = \"views\",\r\n Weather = \"weather\",\r\n Windows = \"windows\",\r\n WindowsNewsPlus = \"windowsNewsPlus\",\r\n WindowsShell = \"windowsShell\",\r\n WindowsNewsBar = \"windowsNewsbar\"\r\n}\r\n\r\n/**\r\n * Card style mode\r\n */\r\nexport enum CardStyleMode {\r\n Default = \"Default\",\r\n WinDashboard = \"WinDashboard\",\r\n Edge = \"Edge\"\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * This file defines the datatypes used in telemetry beacons.\r\n */\r\n\r\n/**\r\n * Telemetry Object Type. (Deprecating. Please use TelemetryContentType and TelemetryBehaviorType instead)\r\n * @enum TelemetryObjectType\r\n */\r\nexport const TelemetryType = {\r\n Undefined: 0,\r\n Header: 1,\r\n Footer: 2,\r\n TopNavBar: 3,\r\n NavBar: 4,\r\n DropDown: 5,\r\n Section: 6,\r\n Carousel: 7,\r\n Module: 8,\r\n SearchBox: 9,\r\n InputBox: 10,\r\n ActionButton: 11,\r\n Interaction: 12,\r\n Headline: 13,\r\n Entity: 15,\r\n Topic: 29,\r\n Provider: 30,\r\n NewStories: 46,\r\n AutoSuggest: 47,\r\n Tile: 49,\r\n TrendingNews: 50,\r\n AllCoverage: 51,\r\n Report: 52,\r\n MsccCookieComplianceBanner: 54,\r\n CookieWallCookieComplianceBanner: 57,\r\n FRE: 60,\r\n VideoPlayer: 61,\r\n ContentCard: 62,\r\n SubmitForm: 63\r\n};\r\n\r\n/**\r\n * Telemetry Content Type used to describe content type that is assocated with an object\r\n * @enum TelemetryContentType\r\n */\r\nexport const TelemetryContentType = {\r\n Undefined: 0,\r\n StructuredData: 1,\r\n AppStore: 2,\r\n CmsPromotions: 3,\r\n MicrosoftWebStore: 4,\r\n XboxStore: 5,\r\n OfficeStore: 6,\r\n PartnerLinks: 7,\r\n SponsoredContent: 8,\r\n Spotlight: 9,\r\n ExternalLink: 10,\r\n SearchPromo: 11,\r\n Feed: 12,\r\n Article: 13,\r\n Gallery: 14,\r\n Video: 15,\r\n Audio: 16,\r\n Settings: 17,\r\n DisplayAd: 18,\r\n OfficeDocument: 19,\r\n App: 20,\r\n SearchResult: 21,\r\n VideoAd: 22,\r\n Map: 23,\r\n Comment: 24,\r\n Profile: 25,\r\n Coachmark: 26,\r\n TrendingSearch: 27,\r\n AutoSuggestSearch: 28,\r\n SearchHistory: 29,\r\n TextSearch: 30,\r\n TopSites: 31,\r\n SearchLink: 32,\r\n ImageSearch: 33,\r\n VoiceSearch: 34,\r\n Toast: 35,\r\n Greeting: 36,\r\n Image: 37,\r\n Banner: 38,\r\n Waffle: 39,\r\n Notification: 40,\r\n QnaTopic: 41,\r\n QnaContent: 42\r\n};\r\n\r\n/**\r\n * Telemetry Action Type\r\n * @enum TelemetryActionType\r\n */\r\nexport const TelemetryActionType = {\r\n Click: \"click\",\r\n Hover: \"mouseenter\",\r\n Submit: \"submit\",\r\n View: \"view\",\r\n RightClick: \"rightclick\",\r\n Wheel: \"wheel\",\r\n KeyPress: \"keypress\",\r\n HorizontalSwipe: \"hswipe\"\r\n};\r\n\r\n/**\r\n * Telemetry Behavior Type\r\n * @enum TelemetryBehaviorType\r\n */\r\nexport const TelemetryBehaviorType = {\r\n Undefined: 0,\r\n Navigate: 1,\r\n ContextMenu: 2,\r\n Pin: 3,\r\n Unpin: 4,\r\n Rearrange: 5,\r\n Remove: 6,\r\n Add: 7,\r\n Open: 8,\r\n View: 9,\r\n Follow: 10,\r\n Unfollow: 11,\r\n More: 12,\r\n Close: 13,\r\n Share: 14,\r\n Like: 15,\r\n Dislike: 16,\r\n Unlike: 17,\r\n Undislike: 18,\r\n Mute: 19,\r\n Unmute: 20,\r\n Cancel: 21,\r\n Launch: 22,\r\n Install: 23,\r\n Manage: 24,\r\n Show: 25,\r\n MuteCancel: 26,\r\n Save: 27,\r\n Hide: 28,\r\n Unhide: 29,\r\n Customize: 30,\r\n Suspend: 31,\r\n Clear: 32,\r\n SignIn: 33,\r\n SignOut: 34,\r\n UndoSave: 35,\r\n TurnOn: 36,\r\n TurnOff: 37,\r\n Forward: 38,\r\n Response: 39,\r\n Report: 40,\r\n ZoomIn: 41,\r\n ZoomOut: 42,\r\n Comment: 43,\r\n Sort: 44,\r\n Love: 45,\r\n Surprised: 46,\r\n Thinking: 47,\r\n Sad: 48,\r\n Angry: 49,\r\n TextSearch: 50,\r\n ImageSearch: 51,\r\n UndoRemove: 52,\r\n Rename: 53,\r\n SearchLink: 54,\r\n VoiceSearch: 55,\r\n Complete: 56,\r\n Play: 57,\r\n Pause: 58,\r\n Seek: 59,\r\n Volume: 60,\r\n ClosedCaptions: 61,\r\n Fullscreen: 62,\r\n Restore: 63,\r\n Replay: 64\r\n};\r\n\r\n/**\r\n * Telemetry Content Source Type\r\n * @enum TelemetryContentSourceType\r\n */\r\nexport const TelemetryContentSourceType = {\r\n Editor: 0,\r\n PersonalizationAlgo: 1,\r\n Bing: 2,\r\n Taboola: 3,\r\n Outbrain: 4,\r\n AutoCuration: 5,\r\n User: 6,\r\n AppNexus: 7,\r\n OtherSponconProvider: 8\r\n};\r\n\r\n/**\r\n * Telemetry Page Configuration\r\n * @enum TelemetryPageConfiguration\r\n */\r\nexport const TelemetryPageConfiguration = {\r\n Empty: 0,\r\n SearchBox: 1,\r\n TopSites: 2,\r\n Suggested: 4,\r\n ContentFeed: 8,\r\n WinFRE: 16,\r\n BingImage: 32,\r\n ContentBelowTheFold: 64,\r\n CustomModeOption: 128,\r\n GreetingEnabled: 256,\r\n HeadingsOnly: 512,\r\n StripeLayout: 1024,\r\n Peek: 2048\r\n};\r\n\r\n/**\r\n * Mouse click number to identify right/left/middle clicks\r\n */\r\nexport const MouseButton = {\r\n LeftClickButton: 0,\r\n MiddleClickButton: 1,\r\n RightClickButton: 2\r\n};\r\n\r\n/**\r\n * Telemetry Page Type\r\n * @type TelemetryTelemetryPageType\r\n */\r\nexport type TelemetryPageType = \"unspecified\" | \"dhp\" | \"ntp\" | \"hp\" | \"verthp\" | \"article\" | \"gallery\" | \"video\" | \"spotlight\" | \"qna-feed\" | \"qnahub\";\r\n\r\n/**\r\n * Telemetry Page Product\r\n * @type TelemetryPageProduct\r\n */\r\nexport type TelemetryPageProduct = \"emmx\" | \"prime\" | \"spartan\" | \"chromeext\" | \"ieext\" | \"anaheim\" | \"amp\" | \"qna\" | \"entnews\" | \"prime_mobile\" | \"msnews\" | \"xbox\" | \"chromentpnews\" | \"windowsshell\" | \"esportshub\" | \"shoppingext\" | \"entwindowsshell\" | \"windowsdash\" | \"launcher\" | \"qnafeed\";\r\n\r\n/**\r\n * Telemetry Service Type\r\n * @type TelemetryServiceType\r\n */\r\nexport type TelemetryServiceType = \"oneservice\";\r\n\r\n/**\r\n * Telemetry audience mode\r\n * @type TelemetryAudienceMode\r\n */\r\nexport type TelemetryAudienceMode = \"enterprise\" | \"consumer\";\r\n\r\n/**\r\n * Log type.\r\n * @type LogType\r\n */\r\nexport type LogType = \"information\" | \"error\" | \"warning\";\r\n\r\n/**\r\n * ANID cookie name.\r\n * @type ANONCookieName\r\n */\r\nexport type ANONCookieName = \"anon\" | \"app_anon\";\r\n\r\n/**\r\n * Feed layout type.\r\n * @type FeedLayout\r\n */\r\nexport type FeedLayout = \"singlecol\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { isSapphire } from \"./SapphireCore\";\r\nimport { navigateAsync, getUserInfoAsync, requestCustomAsync, navigateSync, requestSnackBarAsync, subscribe, unsubscribe, sendBroadcastAsync, logEventAsync } from \"./SapphireBridge\";\r\nimport { getUserConfig, getAccessToken } from \"./SapphireUserConfig\";\r\n\r\nconst partnerId = \"Home\";\r\n\r\n/**\r\n * Facilities the in-app navigation using navigate api\r\n * @param {string} contentId - the content Id\r\n * @param {string} deepLink - the deep link\r\n */\r\nexport function inAppNavigation(contentId: string, deepLink: string, commentId?: string, shouldScrollToComments?: string): void {\r\n const data = {\r\n deeplink: deepLink,\r\n articleId: contentId,\r\n action: \"requestNativePage\"\r\n };\r\n\r\n if (commentId) {\r\n data[\"commentId\"] = commentId;\r\n data[\"shouldScrollToComments\"] = shouldScrollToComments;\r\n }\r\n\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * Facilities the in-app navigation using navigate api for video L2 experiences\r\n * @param {string} contentId - the content Id\r\n * @param {string} deepLink - the deep link\r\n */\r\nexport function inAppNavigationForVideo(contentId: string, deepLink: string, firstCardObject: any): void {\r\n const data: any = {\r\n firstCard: firstCardObject,\r\n deeplink: deepLink,\r\n articleId: contentId,\r\n action: \"requestNativePage\"\r\n };\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * open the action menu\r\n * @param {object} menuItems - the list of action menus\r\n * @param {Function} callback\r\n */\r\nexport function openActionMenu(menuItems: any, callback: Function): void {\r\n const data: any = {\r\n action: \"requestActionMenu\",\r\n items: menuItems\r\n };\r\n navigateSync(data, callback);\r\n}\r\n\r\n/**\r\n * Get the system share panel to share content\r\n * @param {string} - contentToShare\r\n * @param {string} - titleToShare\r\n * @param {string} - imageToShare\r\n */\r\nexport function getSharePanel(contentToShare: string, titleToShare: string = undefined, imageToShare: string = undefined): void {\r\n const data: any = {\r\n action: \"requestShare\",\r\n title: titleToShare,\r\n content: contentToShare,\r\n image: imageToShare\r\n };\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * Ability to add stories in MySaves\r\n * @param {string} title of the content\r\n * @param {string} unique key for the content\r\n * @param {string} url\r\n * @param {number} timestamp in milliseconds\r\n * @param {string} targetId content id\r\n * @param {string} type content type\r\n * @param {string} provider provider name\r\n * @param {string} image content image\r\n * @param {number} imageHeight content image height\r\n * @param {number} imageWidth content image width\r\n * @param {string} icon provider image\r\n * @param {any} firstCardObject first content for video content type\r\n */\r\nexport async function addMySaves(title: string, key: string, url: string, timestamp: number, targetId: string, type: string, provider: string, image: string, imageHeight: number, imageWidth: number, icon: string, firstCardObject: any): Promise {\r\n const metaData: any = {\r\n partner: \"MySaves\",\r\n scenario: \"Add\",\r\n category: \"News\",\r\n data: {\r\n // required params\r\n title: title,\r\n key: key,\r\n newsId: targetId,\r\n // params required to open articles in L2 experiences\r\n type: type,\r\n url: url,\r\n timestamp: timestamp,\r\n image: image,\r\n icon: icon,\r\n imageHeight: imageHeight,\r\n imageWidth: imageWidth,\r\n provider: provider,\r\n // required video param to open video in video feed\r\n firstCard: firstCardObject\r\n }\r\n };\r\n const result = await requestCustomAsync(metaData);\r\n return result;\r\n}\r\n\r\n/**\r\n * Ability to delete stories from MySaves\r\n * @param {string} key\r\n */\r\nexport async function deleteMySaves(key: string) {\r\n const metaData: any = {\r\n partner: \"MySaves\",\r\n scenario: \"Delete\",\r\n category: \"News\",\r\n filters: {\r\n conditions: [{\r\n key: \"key\",\r\n value: key,\r\n operator: \"=\"\r\n }]\r\n }\r\n };\r\n const result = await requestCustomAsync(metaData);\r\n return result;\r\n}\r\n\r\n/**\r\n * Ability to check if an article is saved or not\r\n * @param {string} key\r\n */\r\nexport async function checkMySaves(key: string) {\r\n const metaData: any = {\r\n partner: \"MySaves\",\r\n scenario: \"Get\",\r\n category: \"News\",\r\n filters: {\r\n conditions: [{\r\n key: \"key\",\r\n value: key,\r\n operator: \"=\"\r\n }]\r\n }\r\n };\r\n const result = await requestCustomAsync(metaData);\r\n try {\r\n const value = JSON.parse(result);\r\n return (value?.success === true && !!value.result?.length);\r\n } catch (exception) {\r\n // ignore error, treat it as unsaved.\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Display the toast message\r\n * @param message\r\n * @param action\r\n * @param bgColor\r\n * @param period\r\n * @param textColor\r\n */\r\nexport async function displayToastMessage(message: string, bgColor: string,\r\n textColor: string, actionColor?: string, action = undefined, period = \"long\"): Promise {\r\n const data: any = {\r\n message: message,\r\n action: action,\r\n period: period,\r\n bgColor: bgColor,\r\n textColor: textColor,\r\n actionColor: actionColor\r\n };\r\n const result = await requestSnackBarAsync(data);\r\n return result;\r\n}\r\n\r\n/**\r\n * Facilitates the in-app navigation using navigate api with deep link.\r\n * @param {string} deepLink - deep link to navigate to\r\n * @param {string} action - optional action. Defaults to \"requestNativePage\"\r\n */\r\nexport function inAppNavigationWithDeepLink(deepLink: string, action?: string) {\r\n const data = {\r\n deeplink: deepLink,\r\n action: action || \"requestNativePage\"\r\n };\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * Open mini app via bridge message\r\n * @param targetAppId : mini app id to open\r\n */\r\nexport function openMiniApp(targetAppId: string, pageType?: string): void {\r\n const data: any = {\r\n action: \"requestMiniApp\",\r\n targetAppId: targetAppId,\r\n page: pageType\r\n };\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * Open specific page in mini app via bridge message\r\n * @param targetAppId : mini app id to open\r\n */\r\nexport function requestMiniAppPage(targetAppId: string, pageType?: string): void {\r\n const data: any = {\r\n action: \"requestMiniAppPage\",\r\n targetAppId: targetAppId,\r\n page: pageType\r\n };\r\n navigatePage(data);\r\n}\r\n\r\nasync function navigatePage(data: object): Promise {\r\n const result = await navigateAsync(data);\r\n console.log(result);\r\n}\r\n\r\n/**\r\n * get the sign in data via bridge message\r\n * @param accountType - account type \"MSA\" / \"AAD\" / \"\"\r\n * @param scope - scope for MSA\r\n * @param refresh - refresh access token for MSA\r\n */\r\nexport async function getSignInStatus(accountType = \"\", scope = \"\", refresh = false): Promise {\r\n\r\n const data = {\r\n accountType: accountType,\r\n scope: scope,\r\n refresh: refresh\r\n };\r\n\r\n const signInData = await getUserInfoAsync(data);\r\n\r\n return signInData;\r\n}\r\n\r\n/**\r\n * Calls bridge method to send signal to native app if homepage feed refresh is completed\r\n */\r\nexport function homepageFeedRefreshCompleted(): void {\r\n const metadata: any = {\r\n partner: partnerId,\r\n data: {\r\n method: \"homepageFeedRefreshCompleted\",\r\n params: {}\r\n }\r\n };\r\n\r\n requestCustomAsync(metadata);\r\n}\r\n\r\n/**\r\n * Calls bridge method to open artcle feedback dialog\r\n */\r\nexport function requestArticleFeedback(): void {\r\n const metadata: any = {\r\n partner: partnerId,\r\n data: {\r\n method: \"requestArticleFeedback\",\r\n params: {}\r\n }\r\n };\r\n\r\n requestCustomAsync(metadata);\r\n}\r\n\r\n/**\r\n * Navigate to an URL in the SuperApp with the in app browser\r\n * @param {string} url - url to browse to\r\n */\r\nexport function navigateToUrl(url: string): void {\r\n const data = {\r\n url: url,\r\n action: \"requestBrowser\"\r\n };\r\n navigatePage(data);\r\n}\r\n\r\n/**\r\n * Returns the metadata for getPrefetchData bridge call.\r\n * @param url - The URL\r\n */\r\nexport function getPrefetchDataMetadata(url: string): any {\r\n const metadata: any = {\r\n partner: partnerId,\r\n data: {\r\n method: \"getPrefetchData\",\r\n params: {\r\n url: url\r\n }\r\n }\r\n };\r\n\r\n return metadata;\r\n}\r\n\r\n/**\r\n * Calls bridge method to register URL for prefetching data for.\r\n * @param url - The URL\r\n */\r\nexport function registerPrefetchUrl(url: string): void {\r\n const metadata: any = {\r\n partner: partnerId,\r\n data: {\r\n method: \"addPrefetchUrls\",\r\n params: {\r\n urls: [url]\r\n }\r\n }\r\n };\r\n\r\n requestCustomAsync(metadata);\r\n}\r\n\r\n/**\r\n * Returns metadata for getHttp bridge call.\r\n * @param url - The URL\r\n * @param refresh - When true, getHttp by pass the cache and makes network call, otherwise cache is used when present\r\n */\r\nexport function getHttpMetadata(url: string, refresh = false, headers = null): any {\r\n const metadata: any = {\r\n url: url,\r\n refresh: refresh\r\n };\r\n\r\n if (headers) {\r\n metadata[\"headers\"] = headers;\r\n }\r\n\r\n return metadata;\r\n}\r\n\r\n/**\r\n * Returns headers with MUID and authorization token.\r\n */\r\nexport async function getOneServiceHeaders(): Promise {\r\n const headers = {};\r\n\r\n const userConfig = getUserConfig();\r\n if (userConfig) {\r\n headers[\"MUID\"] = userConfig.muid;\r\n\r\n const accessToken = await getAccessToken(\"service::api.msn.com::MBI_SSL\");\r\n\r\n if (userConfig.accountType === \"MSA\" && accessToken) {\r\n headers[\"UserAuthToken\"] = accessToken;\r\n } else if (userConfig.accountType === \"AAD\" && accessToken) {\r\n headers[\"Authorization\"] = accessToken;\r\n }\r\n }\r\n\r\n return headers;\r\n}\r\n\r\n/**\r\n * Subscribe homepage feed refresh\r\n */\r\nexport function subscribeHomepageFeedRefresh(callback: any) {\r\n subscribe({ key: \"homepageFeedRefresh\" }, callback);\r\n}\r\n\r\n/**\r\n * unsubscribe homepage feed refresh\r\n */\r\nexport function unsubscribeHomepageFeedRefresh() {\r\n unsubscribe(\"homepageFeedRefresh\", {});\r\n}\r\n\r\n/**\r\n * Logs required performance markers in super-app.\r\n *\r\n * @param {string} appPerfName\r\n * @param {boolean} isFinished\r\n */\r\nexport function logPerfMarkers(appPerfName: string, isFinished = false): void {\r\n if (!isSapphire()) {\r\n return;\r\n }\r\n\r\n sendBroadcastAsync({\r\n key: \"StartupPerfNotify\",\r\n intent: {\r\n perfName: \"ScaffoldingStartUp\",\r\n stateName: appPerfName,\r\n ts: (new Date()).getTime(),\r\n isFinish: isFinished\r\n }\r\n });\r\n\r\n logEventAsync({\r\n type: \"Debug\",\r\n name: \"HP_WEBVIEW_SERVER_LOG\",\r\n data: {\r\n stateName: appPerfName,\r\n ts: (new Date()).getTime()\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Logs one service perf\r\n *\r\n * @param {string} name\r\n * @param {number} startTime\r\n * @param {number} endTime\r\n * @param {string} url\r\n */\r\nexport function logOneServicePerf(name: string, startTime: number, endTime: number): void {\r\n const duration = endTime - startTime;\r\n logEventAsync({\r\n type: \"ClientPerf\",\r\n name: name,\r\n data: {\r\n Duration: duration\r\n }\r\n });\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConnectorNamespaces, SignedInStatus } from \"@msnews/experiences-constants\";\r\nimport { ExperiencesSharedStateActions, ExperiencesSharedStateConnector } from \"@msnews/experiences-shared-state\";\r\nimport {\r\n Market,\r\n Utility,\r\n appAnonCookieExistsCookieName,\r\n appEnvironment,\r\n getAppEnvironment,\r\n getCookie,\r\n getFromWebWorker,\r\n getHeadData,\r\n isWebWorkerPresent,\r\n sendToWebWorker,\r\n WebWorkerResponse\r\n} from \"@msnews/core\";\r\n\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { AppAnonCookieResponseCachePayload, WebWorkerMessageId } from \"@msnews/web-worker\";\r\nimport { defaultOneServiceOcid } from \"./AuthConstants\";\r\n\r\n/**\r\n * The resolver to indicate that the signInState has been fetched\r\n */\r\nexport let SignInStateResolver: () => void;\r\n\r\n/**\r\n * A promise that will resolve when the signInState has been fetched\r\n */\r\nconst signInStateIsValid: Promise = new Promise((resolve) => {\r\n SignInStateResolver = resolve;\r\n});\r\n\r\n/**\r\n * Attempt to get the APP_ANON cookie from web worker if present or by manually fetching\r\n * This should be called only once and from the page level, not by individual experiences\r\n * Must be called after the ExperiencesSharedStateConnector has been instantiated\r\n * @param errorHandler the error handler to respond to a failed fetch attempt\r\n * @param previousSignedInStatus (optional) the signedInStatus of the user at the time this function was called\r\n * @param bypassWebWorker (optional) flag indicating that webworker should be bypassed even if present\r\n * @returns the Promise\r\n */\r\nexport function getAppAnonCookie(errorHandler: (e: Error) => void, previousSignedInStatus?: SignedInStatus, bypassWebWorker?: boolean): Promise {\r\n // If we are on the China ntp then do not make this call\r\n if (appEnvironment.CurrentMarket === Market.ZHCN && appEnvironment.HostPage.hostName.includes(\".msn.cn\")) {\r\n return;\r\n }\r\n\r\n // Attempt to fetch the APP_ANON cookie for personalized results\r\n // Get the app anon cookie fetch status from web worker cache.\r\n // When the web worker is not present or for some reason web worker did not fetch the app anon cookie, we continue making our own call.\r\n if (!bypassWebWorker && isWebWorkerPresent) {\r\n return getFromWebWorker({ id: WebWorkerMessageId.AppAnonCookie }).then((wwAppAnonResponse) => {\r\n handleSignInResponse(wwAppAnonResponse, previousSignedInStatus);\r\n });\r\n } else {\r\n return fetchAppAnonCookieAsync().then(() => {\r\n handleSignInResponse(null, previousSignedInStatus);\r\n }).catch((e) => {\r\n handleSignInResponse();\r\n errorHandler(e);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * get user signed in status\r\n */\r\nexport function isUserSignedIn(): boolean {\r\n // for PrimeHybrid\r\n const headDataSignInStatus = getHeadData().UserIsSignedIn;\r\n if (headDataSignInStatus !== undefined && headDataSignInStatus !== null) {\r\n return headDataSignInStatus;\r\n }\r\n\r\n // for Peregine\r\n const dataConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n const signInState: SignedInStatus = dataConnector ? dataConnector.getCurrentState().signedIn : SignedInStatus.NotSignedIn;\r\n return signInState === SignedInStatus.SignedIn;\r\n}\r\n\r\n/**\r\n * Returns the current user sign in state\r\n * This returns the currently known sign-in state and does not wait for the sign in state to be updated\r\n */\r\nexport async function getUserSignInState(): Promise {\r\n const dataConnector: ExperiencesSharedStateConnector = await PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n const signInState: SignedInStatus = dataConnector ? dataConnector.getCurrentState().signedIn : SignedInStatus.NotSignedIn;\r\n return signInState;\r\n}\r\n\r\n/**\r\n * Waits until the user sign in state has been set, then resolves with the current sign in state.\r\n */\r\nexport async function waitForSignInState(): Promise {\r\n await signInStateIsValid;\r\n\r\n const dataConnector: ExperiencesSharedStateConnector = await PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n const signInState: SignedInStatus = dataConnector ? dataConnector.getCurrentState().signedIn : SignedInStatus.NotSignedIn;\r\n return signInState;\r\n}\r\n\r\n/**\r\n * Calls into /spartan/getappanoncookie to set the APP_ANON cookie\r\n * If the APP_ANON and aace cookies do not already exist this will set the APP_ANON and aace cookies\r\n * If the APP_ANON cookie exists but the user is not signed in this will delete the APP_ANON and aace cookies\r\n * This function should typically not be called outside this library unless you are trying to fetch the APP_ANON cookie manually\r\n * @return {Promise} - The aace cookie value, or null if aace is not fetched\r\n */\r\nexport async function fetchAppAnonCookieAsync(): Promise {\r\n\r\n // we await the following fetches but we do not read their return values because the relevant sign-on information is stored in the auth cookies\r\n if (appEnvironment.UseOneServiceAuthEndpoints) {\r\n await fetch(`https://api.msn.com/auth/cookie/appanon?scn=app_anon&apikey=${appEnvironment.OneServiceApiKey}&ocid=${defaultOneServiceOcid}`,\r\n { credentials: \"include\" });\r\n } else {\r\n const hostPage = getAppEnvironment().HostPage;\r\n const hostName = hostPage && hostPage.hostName;\r\n const host = (hostName === \"int1.msn.com\" || hostName === \"int.msn.com\") ? hostName : \"www.msn.com\";\r\n const marketLocale = getHeadData().Locale;\r\n\r\n await fetch(`https://${host}/spartan/${marketLocale}/getappanoncookie`, { credentials: \"include\" });\r\n }\r\n\r\n return getCookie(appAnonCookieExistsCookieName);\r\n}\r\n\r\n/**\r\n * Handle the response to fetching the APP_ANON cookie\r\n * @param wwAppAnonResponse (optional) the response from the Web Worker\r\n * @param previousSignedInStatus (optional) the signedInStatus of the user at the time getAppAnonCookie() was called\r\n */\r\nfunction handleSignInResponse(wwAppAnonResponse?: WebWorkerResponse, previousSignedInStatus?: SignedInStatus): void {\r\n // Resolve the sign in state awaiter.\r\n SignInStateResolver();\r\n\r\n // If \"aace\" cookie exists that implies \"lt\" or \"at\" token was authenticated and user is signedIn, otherwise user is not signedIn\r\n const appAnonCookieExistsValue: string = getCookie(appAnonCookieExistsCookieName);\r\n const signedInStatus: SignedInStatus = (appAnonCookieExistsValue !== null) ? SignedInStatus.SignedIn : SignedInStatus.NotSignedIn;\r\n\r\n // Trigger my feed and Pdp update when user goes from signed out to signed in state\r\n if (isWebWorkerPresent\r\n && wwAppAnonResponse\r\n && wwAppAnonResponse.payload\r\n && !wwAppAnonResponse.payload.appAnonCookieExists\r\n && signedInStatus === SignedInStatus.SignedIn) {\r\n sendToWebWorker({ id: WebWorkerMessageId.UpdateMyFeed });\r\n sendToWebWorker({ id: WebWorkerMessageId.Updatepdp });\r\n sendToWebWorker({ id: WebWorkerMessageId.UpdateMyBriefing });\r\n }\r\n\r\n // Call action to update signedInStatus if the user signedInStatus was updated by the fetch call\r\n const sharedStateConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n const signInState: SignedInStatus = sharedStateConnector.getCurrentState().signedIn;\r\n if (signInState !== signedInStatus) {\r\n ExperiencesSharedStateActions.signedInStatus.getActionSender(sharedStateConnector).send(signedInStatus);\r\n }\r\n\r\n // If the user has signed in or out since the previous impression was fired, fire a new impression event\r\n if (Utility.isDefined(previousSignedInStatus)\r\n && previousSignedInStatus !== signedInStatus) {\r\n Telemetry.addOrUpdateTmplProperty(\"signInUpdate\", \"1\");\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AadData, AccessTokenStatus, AccountInfo, AppEnvironment, RegionScope, getAppEnvironment } from \"@msnews/core\";\r\nimport { AccountType, ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { AcquireAccessTokenFailed, AcquireAccessTokenHandledFailure, AppError, EdgeChromiumAPIsNotAvailable, Severity } from \"@msnews/diagnostics\";\r\n\r\nimport { ExperiencesSharedStateConnector } from \"@msnews/experiences-shared-state\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { getPageTimings } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * chrome\r\n * The chrome API is not defined in Typescript\r\n */\r\ndeclare global {\r\n interface Window { chrome: any; }\r\n}\r\n\r\nconst authAccessTokenMap = {};\r\n\r\nconst AuthTokenSuccessData: AppError = {\r\n id: 35204,\r\n source: \"AadAuthHelper.ts\",\r\n severity: Severity.NoAlert\r\n};\r\n\r\nlet isPageViewReady = false;\r\n\r\n/** The aadToken QS key */\r\nexport const aadTokenQsKey = \"stn\";\r\n\r\n/** The aadToken QS value */\r\nexport const aadTokenQsVal = \"aad\";\r\n\r\n// More information re: specific errors here:\r\n// https://microsoft.visualstudio.com/Edge/_git/chromium.src?path=%2Ftools%2Fmetrics%2Fhistograms%2Fedge_enums.xml&version=GBmaster&line=3770&lineEnd=3770&lineStartColumn=1&lineEndColumn=52&lineStyle=plain\r\nexport enum TokenFetchSecondaryErrors {\r\n /** No Error. */\r\n \"kNoError\" = 0,\r\n /** Token fetch operation requires user interaction */\r\n \"kTokenFetchUserInteractionRequired\" = 13,\r\n /** Authentication is possible, but it requires direct user interaction */\r\n \"kInteractionRequired\" = 24,\r\n /** Sovereignty is not supported in Edge. */\r\n \"kUnsupportedSovereignty\" = 60,\r\n /** Sovereignty detection failed for various reasons. */\r\n \"kSovereigntyDetectionFailed\" = 61\r\n}\r\n\r\nexport enum InternalAuthError {\r\n /** Sovereignty error not handled by auth api */\r\n \"UnsupportedSovereignty\" = 0,\r\n /** Is CN domain */\r\n \"CnDomain\" = 1,\r\n /** Auth api is not available */\r\n \"AuthApiUnavailable\" = 2\r\n}\r\n\r\n/**\r\n * Gets a value to indicate if we are in an enterprise scenario\r\n * eg. whether we should append the AAD Token as part of the call to oneservice endpoints\r\n * The default value is false, so we don't need to wait until the value is explicitly set\r\n */\r\nexport function useEnterpriseCompliance(): boolean {\r\n // Obtain the current value of useEnterpriseCompliance from the ExperiencesSharedState connector\r\n const sharedStateConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n return sharedStateConnector ? sharedStateConnector.getCurrentState().useEnterpriseCompliance : false;\r\n}\r\n\r\n/**\r\n * Gets a value to indicate if we should use enterprise domain\r\n * eg. whether we should use the Falcon domain vs. consumer domain for oneservice requests\r\n * The default value is false, so we don't need to wait until the value is explicitly set\r\n */\r\nexport function useEnterpriseDomain(): boolean {\r\n // Obtain the current value of useEnterpriseDomain from the ExperiencesSharedState connector\r\n const sharedStateConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n return sharedStateConnector ? sharedStateConnector.getCurrentState().useEnterpriseDomain : false;\r\n}\r\n\r\n/**\r\n * Checks if aad token is invalid for user\r\n */\r\nexport function isInvalidAadToken(aadData: AadData): boolean {\r\n return !aadData || !aadData.isSuccess || !aadData.isValid;\r\n}\r\n\r\nexport function waitForPageReadyAsync(): Promise {\r\n if (isPageViewReady) {\r\n return Promise.resolve();\r\n }\r\n return new Promise(resolve => {\r\n const eventHandler = () => {\r\n isPageViewReady = true;\r\n window.removeEventListener(\"TelemetryPageViewNotificationEvent\", eventHandler);\r\n resolve();\r\n };\r\n window.addEventListener(\"TelemetryPageViewNotificationEvent\", eventHandler);\r\n });\r\n}\r\n\r\n/**\r\n * Fetches aad data to be used to call an authenticated API.\r\n * @param clientId The client id of the AAD application requesting access\r\n * @param scopeOrResource The scope or resource to request access for\r\n * @param friendlyName Friendly name for scope\r\n * @param allowInteraction Attempt to fetch the access token using the allowInteraction version of the API instead of the silent version\r\n */\r\nexport async function getAadData(clientId: string, scopeOrResource: string, friendlyName: string, allowInteraction = false): Promise {\r\n const appEnvironment = getAppEnvironment();\r\n const accountInfo = await resolveAccountInfo(appEnvironment);\r\n\r\n // Currently unable to access auth apis from .cn domain due to sovereignty issues\r\n if (appEnvironment.IsCnDomain) {\r\n const cnError = {\r\n errorInfo: {\r\n internal_error_code: InternalAuthError.CnDomain\r\n },\r\n status: AccessTokenStatus.otherError\r\n };\r\n\r\n fireAuthTelemetry(null, cnError, friendlyName, false, \"CN domain unsupported\", AcquireAccessTokenHandledFailure);\r\n\r\n return cnError;\r\n }\r\n\r\n if (!accountInfo) {\r\n const unavailableError = {\r\n errorInfo: {\r\n internal_error_code: InternalAuthError.AuthApiUnavailable\r\n },\r\n status: AccessTokenStatus.otherError\r\n };\r\n\r\n fireAppError(EdgeChromiumAPIsNotAvailable, \"Auth api not available\", `Auth api not available for ${friendlyName}`);\r\n fireAuthTelemetry(null, unavailableError, friendlyName, false, \"Auth api not available\", AcquireAccessTokenHandledFailure);\r\n\r\n return unavailableError;\r\n }\r\n\r\n const { account_id, account_type, tenant_id } = accountInfo;\r\n\r\n // Catches unsupported sovereignties on .com domain (ie. Germany)\r\n if (account_type === AccountType.UNSUPPORTED_SOVEREIGNTY) {\r\n const sovereigntyError = {\r\n errorInfo: {\r\n internal_error_code: InternalAuthError.UnsupportedSovereignty\r\n },\r\n status: AccessTokenStatus.otherError\r\n };\r\n\r\n fireAuthTelemetry(tenant_id, sovereigntyError, friendlyName, false, \"Edge unsupported sovereignty\", AcquireAccessTokenHandledFailure);\r\n return sovereigntyError;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const tokenAcquireParameters = {\r\n account_id: account_id,\r\n account_type: account_type,\r\n client_id: clientId,\r\n scope_or_resource: scopeOrResource\r\n };\r\n\r\n const totalMarkerName = `Auth.AcquireAccessToken.${friendlyName}`;\r\n const startMarkerName = `${totalMarkerName}.Start`;\r\n const endMarkerName = `${totalMarkerName}.End`;\r\n const pageTimings = getPageTimings();\r\n const startPerfMarker = pageTimings[startMarkerName];\r\n const endPerfMarker = pageTimings[endMarkerName];\r\n const totalPerfMarker = pageTimings[totalMarkerName];\r\n const startTime = Math.round(performance.now());\r\n if (!startPerfMarker && !allowInteraction) {\r\n pageTimings[startMarkerName] = startTime;\r\n }\r\n\r\n const tokenAccessApi = allowInteraction ? window.chrome.authPrivate.acquireAccessTokenWithUserInteraction : window.chrome.authPrivate.acquireAccessTokenSilently;\r\n\r\n tokenAccessApi(tokenAcquireParameters, (acquireResult) => {\r\n if (!endPerfMarker && !allowInteraction) {\r\n const endTime = Math.round(performance.now());\r\n pageTimings[endMarkerName] = acquireResult.is_success ? endTime : -1;\r\n if (!totalPerfMarker) {\r\n pageTimings[totalMarkerName] = acquireResult.is_success ? endTime - startTime : -1;\r\n }\r\n }\r\n\r\n let status = AccessTokenStatus.success;\r\n const authInfoObject = {\r\n ...acquireResult.error_info,\r\n authPrivateApi: allowInteraction ? \"acquireAccessTokenWithUserInteraction\" : \"acquireAccessTokenSilently\",\r\n resource: friendlyName\r\n };\r\n\r\n if (!acquireResult.is_success) {\r\n switch (acquireResult.error_info.secondary_error) {\r\n case TokenFetchSecondaryErrors.kTokenFetchUserInteractionRequired:\r\n case TokenFetchSecondaryErrors.kInteractionRequired:\r\n status = AccessTokenStatus.mfaRequired;\r\n fireAppError(AcquireAccessTokenHandledFailure, \"Handled failure to get access token\", JSON.stringify(authInfoObject));\r\n fireAuthTelemetry(tenant_id, authInfoObject, friendlyName, false, \"Handled failure to get access token\", AcquireAccessTokenHandledFailure);\r\n break;\r\n default:\r\n status = AccessTokenStatus.otherError;\r\n fireAppError(AcquireAccessTokenFailed, \"Failed to get access token\", JSON.stringify(authInfoObject));\r\n fireAuthTelemetry(tenant_id, authInfoObject, friendlyName, false, \"Failed to get access token\", AcquireAccessTokenFailed);\r\n }\r\n } else {\r\n waitForPageReadyAsync().then(() => {\r\n if (!authAccessTokenMap[friendlyName]) {\r\n authAccessTokenMap[friendlyName] = true;\r\n fireAuthTelemetry(tenant_id, authInfoObject, friendlyName, true, \"Access token fetch was successful\", AuthTokenSuccessData);\r\n }\r\n });\r\n }\r\n\r\n resolve({\r\n token: acquireResult.access_token,\r\n errorInfo: acquireResult.error_info,\r\n isSuccess: acquireResult.is_success,\r\n isValid: acquireResult.is_token_valid,\r\n status\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Resolve account info promise\r\n * @param appEnvironment App Environment context\r\n */\r\nexport async function resolveAccountInfo(appEnvironment: AppEnvironment): Promise {\r\n if (!appEnvironment.AccountInfoPromise) {\r\n return null;\r\n }\r\n\r\n return await appEnvironment.AccountInfoPromise;\r\n}\r\n\r\n/**\r\n * Reads account info to check if current user is a GCC Mod account\r\n */\r\nexport async function isGccModUser(): Promise {\r\n const appEnvironment = getAppEnvironment();\r\n const accountInfo = await resolveAccountInfo(appEnvironment);\r\n\r\n if (!accountInfo) {\r\n return false;\r\n }\r\n\r\n return accountInfo.region_scope === RegionScope.GCC_MODERATE;\r\n}\r\n\r\n/**\r\n * Fires app error\r\n * @param appError app error info\r\n * @param message message to log\r\n * @param customMessage message to include in property bag\r\n */\r\nexport function fireAppError(appError: AppError, message: string, customMessage: string): void {\r\n Telemetry.sendAppErrorEvent({\r\n ...appError,\r\n message,\r\n pb: {\r\n ...appError.pb,\r\n customMessage: customMessage\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Fires telemetry to auth table\r\n * @param tenantId tenant id\r\n * @param authInfo auth object to log\r\n * @param friendlyName friendly name of api\r\n * @param status auth status\r\n * @param message message to log\r\n * @param logData app \"error\" data\r\n */\r\nexport function fireAuthTelemetry(tenantId: string, authInfo: any, friendlyName: string, status: boolean, message: string, logData: AppError): void {\r\n Telemetry.sendAuthEvent({\r\n id: tenantId,\r\n status,\r\n name: friendlyName,\r\n info: {\r\n ...logData,\r\n message,\r\n pb: {\r\n ...logData.pb,\r\n customMessage: JSON.stringify(authInfo)\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Returns string for X-AnchorMailbox route key\r\n */\r\nexport async function substrateCafeRouteKey(): Promise {\r\n return getAppEnvironment().AccountInfoPromise.then((accountInfo) => {\r\n if (accountInfo && accountInfo.tenant_id) {\r\n if (accountInfo.oid) {\r\n return `Oid:${accountInfo.oid}@${accountInfo.tenant_id}`;\r\n }\r\n return `TID:${accountInfo.tenant_id}`;\r\n }\r\n\r\n return \"\";\r\n });\r\n}\r\n\r\n// invoking this method will ensure that pageView listeners are attached upon module loading\r\nif (canUseDOM()) {\r\n waitForPageReadyAsync();\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { invoke, listen, unlisten } from \"./SapphireCore\";\r\n\r\nimport { SapphireBridgeCallBackFunction } from \"./SapphireTypes\";\r\n\r\n// Method: navigate\r\n// Description: Navigate to another page or feature.\r\nfunction navigate(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"navigate\", data, callback);\r\n}\r\n\r\n/**\r\n * Async Navigate to another page or feature.\r\n * @param data parameters for method \"navigate\".\r\n */\r\nfunction navigateAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n navigate(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Sync Navigate to another page or feature.\r\n * @param data parameters for method \"navigate\".\r\n * @param callback callback with response returned from sapphire.\r\n */\r\nfunction navigateSync(data: Object, callback: any) {\r\n navigate(data, callback);\r\n}\r\n\r\n// Method: requestBrowser\r\n// Description: Navigate to in-app browser.\r\nfunction requestBrowser(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestBrowser\", data, callback);\r\n}\r\n\r\n/**\r\n * Navigate to in-app browser.\r\n * @param data parameters for method \"requestBrowser\".\r\n */\r\nfunction requestBrowserAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestBrowser(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getHttp(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getHttp\", data, callback);\r\n}\r\n\r\n/**\r\n * Send a HTTP Get request.\r\n * @param data parameters for method \"getHttp\".\r\n */\r\nfunction getHttpAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getHttp(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction postHttp(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"postHttp\", data, callback);\r\n}\r\n\r\n/**\r\n * Send a HTTP Post request.\r\n * @param data parameters for method \"postHttp\".\r\n */\r\nfunction postHttpAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n postHttp(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction putHttp(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"putHttp\", data, callback);\r\n}\r\n\r\n/**\r\n * Send a HTTP Put request.\r\n * @param data parameters for method \"putHttp\".\r\n */\r\nfunction putHttpAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n putHttp(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction deleteHttp(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"deleteHttp\", data, callback);\r\n}\r\n\r\n/**\r\n * Send a HTTP Delete request.\r\n * @param data parameters for method \"deleteHttp\".\r\n */\r\nfunction deleteHttpAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n deleteHttp(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction logEvent(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"logEvent\", data, callback);\r\n}\r\n\r\n/**\r\n * Log an event to telemetry manager.\r\n * @param data parameters for method \"logEvent\".\r\n */\r\nfunction logEventAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n logEvent(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction logError(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"logError\", data, callback);\r\n}\r\n\r\n/**\r\n * Log an error to telemetry manager.\r\n * @param data parameters for method \"logError\".\r\n */\r\nfunction logErrorAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n logError(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getDeviceInfo(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getDeviceInfo\", data, callback);\r\n}\r\n\r\n/**\r\n * Request for device information.\r\n * @param data parameters for method \"getDeviceInfo\".\r\n */\r\nfunction getDeviceInfoAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getDeviceInfo(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getBatteryInfo(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getBatteryInfo\", data, callback);\r\n}\r\n\r\n/**\r\n * Get battery information.\r\n * @param data parameters for method \"getBatteryInfo\".\r\n */\r\nfunction getBatteryInfoAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getBatteryInfo(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getLocationInfo(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getLocationInfo\", data, callback);\r\n}\r\n\r\n/**\r\n * Request for system location information.\r\n * @param data parameters for method \"getLocationInfo\".\r\n */\r\nfunction getLocationInfoAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getLocationInfo(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getNetworkInfo(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getNetworkInfo\", data, callback);\r\n}\r\n\r\n/**\r\n * Get network information.\r\n * @param data parameters for method \"getNetworkInfo\".\r\n */\r\nfunction getNetworkInfoAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getNetworkInfo(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getUserInfo(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getUserInfo\", data, callback);\r\n}\r\n\r\n/**\r\n * Request for user sign in related information.\r\n * @param data parameters for method \"getUserInfo\".\r\n */\r\nfunction getUserInfoAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getUserInfo(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction getAppList(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"getAppList\", data, callback);\r\n}\r\n\r\n/**\r\n * Request for mini app list.\r\n * @param data parameters for method \"getAppList\".\r\n */\r\nfunction getAppListAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n getAppList(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestDialog(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestDialog\", data, callback);\r\n}\r\n\r\n/**\r\n * Show a dialog.\r\n * @param data parameters for method \"requestDialog\".\r\n */\r\nfunction requestDialogAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestDialog(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestPermission(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestPermission\", data, callback);\r\n}\r\n\r\n/**\r\n * Request permissions from super app, such as camera, microphone and others.\r\n * @param data parameters for method \"requestPermission\".\r\n */\r\nfunction requestPermissionAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestPermission(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestToast(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestToast\", data, callback);\r\n}\r\n\r\n/**\r\n * Request to display a notice or toast on screen.\r\n * @param data parameters for method \"requestToast\".\r\n */\r\nfunction requestToastAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestToast(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestSnackBar(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestSnackBar\", data, callback);\r\n}\r\n\r\n/**\r\n * Show a snack bar with style.\r\n * @param data parameters for method \"requestSnackBar\".\r\n */\r\nfunction requestSnackBarAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestSnackBar(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestVibration(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestVibration\", data, callback);\r\n}\r\n\r\n/**\r\n * Request device to viberate.\r\n * @param data parameters for method \"requestVibration\".\r\n */\r\nfunction requestVibrationAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestVibration(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestRestart(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestRestart\", data, callback);\r\n}\r\n\r\n/**\r\n * Restart super app.\r\n * @param data parameters for method \"requestRestart\".\r\n */\r\nfunction requestRestartAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestRestart(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestOrientation(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestOrientation\", data, callback);\r\n}\r\n\r\n/**\r\n * Change device\"s orientation.\r\n * @param data parameters for method \"requestOrientation\".\r\n */\r\nfunction requestOrientationAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestOrientation(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Subscribe event handler.\r\n * @param data parameters for register event handler.\r\n * @param handler event handler.\r\n * @returns event handler id.\r\n */\r\nfunction subscribe(data: Object, handler: SapphireBridgeCallBackFunction): string {\r\n return listen(data, handler);\r\n}\r\n\r\n/**\r\n * Unsubscribe event handler.\r\n * @param handlerId event handler id.\r\n * @param data parameters for unregister event handler.\r\n * @param callback callback when unregistered successfully.\r\n */\r\nfunction unsubscribe(handlerId: string, data: Object, callback?: SapphireBridgeCallBackFunction) {\r\n unlisten(handlerId, data, callback);\r\n}\r\n\r\nfunction sendBroadcast(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"sendBroadcast\", data, callback);\r\n}\r\n\r\n/**\r\n * Request to send a broadcast message.\r\n * @param data parameters for method \"sendBroadcast\".\r\n */\r\nfunction sendBroadcastAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n sendBroadcast(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction fetchAds(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"fetchAds\", data, callback);\r\n}\r\n\r\n/**\r\n * Get ads data from super app.\r\n * @param data parameters for method \"fetchAds\".\r\n */\r\nfunction fetchAdsAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n fetchAds(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction requestCustom(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestCustom\", data, callback);\r\n}\r\n\r\n/**\r\n * Request to send data to a custom feature.\r\n * @param data parameters for method \"requestCustom\".\r\n */\r\nfunction requestCustomAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n requestCustom(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction loadData(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"loadData\", data, callback);\r\n}\r\n\r\n/**\r\n * Load data from internal database.\r\n * @param data parameters for method \"loadData\".\r\n */\r\nfunction loadDataAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n loadData(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction saveData(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"saveData\", data, callback);\r\n}\r\n\r\n/**\r\n * Save simple data to internal database.\r\n * @param data parameters for method \"saveData\".\r\n */\r\nfunction saveDataAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n saveData(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nfunction manageData(data: Object, callback: SapphireBridgeCallBackFunction) {\r\n invoke(\"requestShare\", data, callback);\r\n}\r\n\r\n/**\r\n * Manage internal database.\r\n * @param data parameters for method \"manageData\".\r\n */\r\nfunction manageDataAsync(data: Object) {\r\n return new Promise((resolve, reject) => {\r\n manageData(data, (result) => {\r\n resolve(result);\r\n });\r\n });\r\n}\r\n\r\nexport {\r\n /* navigate interfaces */\r\n navigate,\r\n navigateAsync,\r\n navigateSync,\r\n requestBrowser,\r\n requestBrowserAsync,\r\n /* network interfaces */\r\n getHttp,\r\n getHttpAsync,\r\n postHttp,\r\n postHttpAsync,\r\n putHttp,\r\n putHttpAsync,\r\n deleteHttp,\r\n deleteHttpAsync,\r\n /* log interfaces */\r\n logEvent,\r\n logEventAsync,\r\n logError,\r\n logErrorAsync,\r\n /* get interfaces */\r\n getDeviceInfo,\r\n getDeviceInfoAsync,\r\n getBatteryInfo,\r\n getBatteryInfoAsync,\r\n getLocationInfo,\r\n getLocationInfoAsync,\r\n getNetworkInfo,\r\n getNetworkInfoAsync,\r\n getUserInfo,\r\n getUserInfoAsync,\r\n getAppList,\r\n getAppListAsync,\r\n /* request interfaces */\r\n requestDialog,\r\n requestDialogAsync,\r\n requestPermission,\r\n requestPermissionAsync,\r\n requestToast,\r\n requestToastAsync,\r\n requestSnackBar,\r\n requestSnackBarAsync,\r\n requestVibration,\r\n requestVibrationAsync,\r\n requestRestart,\r\n requestRestartAsync,\r\n requestOrientation,\r\n requestOrientationAsync,\r\n /* subscribe interfaces */\r\n subscribe,\r\n unsubscribe,\r\n sendBroadcast,\r\n sendBroadcastAsync,\r\n /* ads interfaces */\r\n fetchAds,\r\n fetchAdsAsync,\r\n /* custom interfaces */\r\n requestCustom,\r\n requestCustomAsync,\r\n /* data interfaces */\r\n loadData,\r\n loadDataAsync,\r\n saveData,\r\n saveDataAsync,\r\n manageData,\r\n manageDataAsync\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Size1ColumnWidth, Size2ColumnWidth, Size3ColumnWidth, Size4ColumnWidth, Size5ColumnWidth } from \"./ColumnWidths\";\r\n\r\nimport { PageUtility } from \"@msnews/core\";\r\nimport { findIndex } from \"lodash-es\";\r\nimport { toPx } from \"@microsoft/fast-jss-utilities\";\r\n\r\n/**\r\n * Describes possible arrangements of columns. For example c3 represents 3 columns.\r\n *\r\n * Each arrangement is valid for a particular range of window widths. For example, for window widths from 996px to 1319px,\r\n * we will use the c3 arrangement, or 3 columns.\r\n *\r\n * Currently each arrangement describes a column count, but in the future, there may be separate 3-column \"large\"\r\n * and 3-column \"small\" arrangements, like on msn.com.\r\n */\r\nexport enum ColumnArrangement {\r\n c1 = \"c1\",\r\n c2 = \"c2\",\r\n c3 = \"c3\",\r\n c4 = \"c4\",\r\n c5 = \"c5\"\r\n}\r\n\r\nlet minViewportWidthOverrides: Map;\r\n\r\n/**\r\n * Override the min viewport widths for the given column arrangements.\r\n * @param overrides The overrides to use for the column arrangements.\r\n */\r\nexport function overrideMinViewportWidths(overrides: Map): void {\r\n minViewportWidthOverrides = overrides;\r\n}\r\n\r\n/**\r\n * Returns the column arrangement\r\n * @param breakpoint The breakpoint we want to map to column arrangement\r\n */\r\nexport function mapBreakpointToColumnArrangement(breakpoint: number): ColumnArrangement {\r\n switch (breakpoint) {\r\n case 0:\r\n return ColumnArrangement.c1;\r\n case 1:\r\n return ColumnArrangement.c2;\r\n case 2:\r\n return ColumnArrangement.c3;\r\n case 3:\r\n return ColumnArrangement.c4;\r\n case 4:\r\n return PageUtility.fiveColSupported() ? ColumnArrangement.c5 : null;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Update ColumnArrangements and columnArrangementMap in case five column layout is supported\r\n */\r\nexport function updateColumnArrangementsForFiveCol(): void {\r\n if (PageUtility.fiveColSupported() && columnArrangements.length === 4) {\r\n const colFiveArrangementDefinition = new ColumnArrangementDefinition(ColumnArrangement.c5, Size5ColumnWidth);\r\n columnArrangements.push(colFiveArrangementDefinition);\r\n columnArrangementMap[ColumnArrangement.c5] = colFiveArrangementDefinition;\r\n }\r\n}\r\n\r\n/**\r\n * Defines the properties of a particular column arrangement.\r\n */\r\nexport class ColumnArrangementDefinition {\r\n /**\r\n * Creates a column arrangement definition.\r\n * @param arrangement The column arrangement being defined.\r\n * @param contentSizePx The size of the content in pixels for this arrangement.\r\n * @param isFirstBreakpoint True if this is the first breakpoint.\r\n */\r\n constructor(public arrangement: ColumnArrangement, public contentSizePx: number, private isFirstBreakpoint?: boolean) { }\r\n\r\n /**\r\n * Gets the minimum required window width to trigger this column arrangement.\r\n */\r\n public get minViewportWidthPx(): number {\r\n if (this.isFirstBreakpoint) {\r\n return 0;\r\n }\r\n\r\n if (minViewportWidthOverrides) {\r\n const widthOverride = minViewportWidthOverrides.get(this.arrangement);\r\n if (widthOverride) {\r\n return widthOverride;\r\n }\r\n }\r\n\r\n return this.contentSizePx + contentBufferPx;\r\n }\r\n}\r\n\r\n/**\r\n * The list of possible column arrangement definitions. Use this to determine what window sizes are\r\n * appropriate for each column arrangement.\r\n */\r\nexport const columnArrangements: ColumnArrangementDefinition[] = [\r\n new ColumnArrangementDefinition(ColumnArrangement.c1, Size1ColumnWidth, true),\r\n new ColumnArrangementDefinition(ColumnArrangement.c2, Size2ColumnWidth),\r\n new ColumnArrangementDefinition(ColumnArrangement.c3, Size3ColumnWidth),\r\n new ColumnArrangementDefinition(ColumnArrangement.c4, Size4ColumnWidth)];\r\n\r\n// Add five column arrangement when supported.\r\n// Note this will not currently work with SSR as no reset functionality is provided and this edits a global constant.\r\nif (PageUtility.fiveColSupported()) {\r\n columnArrangements.push(new ColumnArrangementDefinition(ColumnArrangement.c5, Size5ColumnWidth));\r\n}\r\n\r\n/**\r\n * A map of column arrangements to definitions.\r\n */\r\nconst columnArrangementMap: { [columnArrangement in ColumnArrangement]?: ColumnArrangementDefinition } = {};\r\nfor (const columnArrangementDefinition of columnArrangements) {\r\n columnArrangementMap[columnArrangementDefinition.arrangement] = columnArrangementDefinition;\r\n}\r\n\r\n/**\r\n * The number of pixels to add on top of the content width in order to get the window width required to show it.\r\n * This buffer guarantees space between the content and the edge of the window, and also space for the scrollbar,\r\n * which is also counted when determining breakpoints.\r\n */\r\nconst contentBufferPx = 32;\r\n\r\n/**\r\n * Get list of breakpoints from column arrangements\r\n */\r\nfunction getBreakpointsFromColumnArrangements(): number[] {\r\n const breakpoints: number[] = [0];\r\n\r\n for (let i = 1; i < columnArrangements.length; i++) {\r\n breakpoints.push(columnArrangements[i].minViewportWidthPx);\r\n }\r\n\r\n return breakpoints;\r\n}\r\n\r\n/**\r\n * Breakpoints that are calculated from the column arrangements\r\n */\r\nexport const columnBreakpoints = getBreakpointsFromColumnArrangements();\r\n\r\n/**\r\n * Gets the content width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The width in pixels of the content.\r\n */\r\nexport function contentWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n return columnArrangementMap[columnArrangement].contentSizePx;\r\n}\r\n\r\n/**\r\n * Gets the minimum window width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The minimum width for the window to show this column arrangement.\r\n */\r\nexport function minWindowWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n return columnArrangementMap[columnArrangement].minViewportWidthPx;\r\n}\r\n\r\n/**\r\n * Gets the maximum window width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The maximum width for the window to show this column arrangement. NaN if there is no maximum.\r\n */\r\nexport function maxWindowWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n const arrangementIndex = findIndex(columnArrangements, a => a.arrangement === columnArrangement);\r\n\r\n if (arrangementIndex < columnArrangements.length - 1) {\r\n return columnArrangements[arrangementIndex + 1].minViewportWidthPx - 1;\r\n }\r\n\r\n return NaN;\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the media query string to be used for given min/max column arrangements\r\n * It can be used in conjunction with `window.matchMedia` to target specific page widths, and it is also\r\n * used internally to generate the equivalent css selectors in `getMediaQuerySelector`\r\n * @param minArrangement The min column arrangement to use for the @media query (inclusive)\r\n * @param maxArrangement The max column arrangement to use for the @media query (inclusive)\r\n * @returns the @media query for the specified min/max.\r\n */\r\nexport function getMediaQuery(minArrangement: ColumnArrangement | null, maxArrangement: ColumnArrangement | null): string {\r\n const queries = [];\r\n\r\n if (minArrangement) {\r\n const minArrangementDefinition = columnArrangementMap[minArrangement];\r\n const minWidthPx = minArrangementDefinition.minViewportWidthPx;\r\n\r\n if (minWidthPx > 0) {\r\n queries.push(`(min-width: ${toPx(minWidthPx)})`);\r\n }\r\n }\r\n\r\n if (maxArrangement) {\r\n const maxArrangementDefinition = columnArrangementMap[maxArrangement];\r\n const maxArrangementIndex = columnArrangements.indexOf(maxArrangementDefinition);\r\n\r\n if (maxArrangementIndex < columnArrangements.length - 1) {\r\n queries.push(`(max-width: ${toPx(columnArrangements[maxArrangementIndex + 1].minViewportWidthPx - 1)})`);\r\n }\r\n }\r\n\r\n return queries.join(\" and \");\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the media query string to be used for the given column arrangement\r\n * It can be used in conjunction with `window.matchMedia` to target specific page widths, and it is also\r\n * used internally to generate the equivalent css selectors in `getMediaQuerySelector`\r\n * @param columnArrangement The column arrangement to target\r\n * @returns The media query to target that column arrangement\r\n */\r\nexport function getMediaQueryFor(columnArrangement: ColumnArrangement): string {\r\n return getMediaQuery(columnArrangement, columnArrangement);\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the CSS selector to be used for apply styles for given min/max arrangements\r\n * @param minArrangement The min column arrangement to use for the media query (inclusive)\r\n * @param maxArrangement The max column arrangement to use for the media query (inclusive)\r\n * @returns the css media query selector for the specified min/max.\r\n */\r\nexport function getMediaQuerySelector(minArrangement: ColumnArrangement | null, maxArrangement: ColumnArrangement | null): string {\r\n const mediaQuery = getMediaQuery(minArrangement, maxArrangement);\r\n return mediaQuery ? \"@media \" + mediaQuery : \"\";\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the CSS selector to be used for apply styles for the given column arrangement.\r\n * @param columnArrangement The column arrangement to target\r\n * @returns the css media query selector for the specified column arrangement.\r\n */\r\nexport function getMediaQuerySelectorFor(columnArrangement: ColumnArrangement): string {\r\n return getMediaQuerySelector(columnArrangement, columnArrangement);\r\n}\r\n\r\n/**\r\n * Callback type for subscribing to BreakpointManager breakpoint changed events.\r\n */\r\nexport type BreakpointManagerCallback = (columnArrangement: ColumnArrangement) => void;\r\n\r\n/**\r\n * Breakpoint manager common interface.\r\n */\r\nexport interface BreakpointManager {\r\n /**\r\n * Gets the current column arrangement.\r\n */\r\n currentColumnArrangement: ColumnArrangement;\r\n\r\n /**\r\n * Subscribes for changes\r\n * @param callback The method to call when the column arrangement changes.\r\n */\r\n subscribe(callback: BreakpointManagerCallback): void;\r\n\r\n /**\r\n * Unsubscribe from changes\r\n * @param callback The callback to unregister.\r\n */\r\n unsubscribe(callback: BreakpointManagerCallback): void;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** name of property that indicates whether we've successfully determined if the user has an MSA or not */\r\nexport const hasMsaPropertyName = \"HasMsa\";\r\n\r\n/** name of cookie used to send the WAM-sourced login token to server */\r\nexport const loginTokenCookieName = \"at\";\r\n\r\n/** name of cookie used to send the WAM-sourced login token to server of Bing server */\r\nexport const loginBingTokenCookieName = \"at-bing\";\r\n\r\n/** name of auth token cookie dropped by the browser */\r\nexport const browserAuthTokenCookieName = \"lt\";\r\n\r\n/** key name of storage item used to prevent infinite refresh */\r\nexport const signingInActiveKey = \"sign-in-active\";\r\n\r\n/**\r\n * key name of storage item used to save the timestamp of when the user first navigated to the page\r\n * This is stored across refreshes to provide a more accurate TTVR metric for cases where the user experiences an auto-refresh\r\n */\r\nexport const initialPageNavigationKey = \"initial-page-nav\";\r\n\r\n/** key name of storage item used to prevent infinite refresh in conjunction with above */\r\nexport const signingInPendingKey = \"sign-in-pending\";\r\n\r\n/** key name of storage item used to indicate to telemetry that the page was refreshed due to sign-in activity */\r\nexport const signingInRefreshedPageKey = \"sign-in-refreshed-page\";\r\n\r\n/** key used to store the account ID (when supported) */\r\nexport const msaAuthAccountKey = \"esMsaAuthAccountKey\";\r\n\r\n/** The default OCID to be used in OneService calls */\r\nexport const defaultOneServiceOcid = \"Peregrine\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActionMap, IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { endsWith as _endsWith, some as _some } from \"lodash-es\";\r\n\r\nimport { String as StringOperations } from \"typescript-string-operations\";\r\n\r\n/**\r\n * Class Contains helpers to use inside of a reducer, that is managed by and called from DynamicReducer\r\n * These helpers provide the ability to use a strongly typed callback that matches the parameters of an Action.\r\n * redux-subspace will automatically prepend a namespace to actions so that they are targeted to their specific subspace.\r\n * DynamicReducer already handles ensuring actions reach the correct reducer, so the redux-subspace namespace can be ignored\r\n * @class\r\n */\r\nexport class ActionHandler {\r\n\r\n /**\r\n * local function that either uses the built-in String.prototype.endsWith function, or uses the lodash-es function to polyFill;\r\n * the built-in function is significantly faster than the lodash-es function or other options, so we want to use it when we can;\r\n * the lodash-es function, based on splice, is faster than String.prototype.indexOf, but using RegEx might be faster...\r\n */\r\n private static endsWith: Function = String.prototype.endsWith\r\n ? function (search: string, target: string): boolean { return search.endsWith(target); }\r\n : _endsWith;\r\n\r\n /**\r\n * Method to handle specific actions.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap} The actionMap which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static handleAction(\r\n actionPayload: IActionPayload,\r\n actionMap: IActionMap,\r\n callback: TActionSignature): boolean {\r\n\r\n // actionPayload.type may have a redux-subspace namespace prepended, so check to see if the ending action is what we want\r\n // namespaces are separated from the action type by a \"/\";\r\n // we use that to differentiate where the payload type ends with the mapped type as part of the name, but is not the same action\r\n // e.g. \"Action\" in the action map and \"NameSpace/AnotherAction\" in the payload, both end in \"Action\" but do not match\r\n // we prepend to *both* to cover the case where they are already equal (that is, no namespace is present)\r\n\r\n if (ActionHandler.endsWith(actionPayload.type + \"\", actionMap.type)) {\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Method to handle multiple actions with same signature.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap[]} The collection of actionMaps which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static handleActions(\r\n actionPayload: IActionPayload,\r\n actionMaps: IActionMap[],\r\n callback: TActionSignature): boolean {\r\n\r\n const actionPayloadType = actionPayload.type + \"\";\r\n const actionsMatched = _some(actionMaps, (actionMap) => ActionHandler.endsWith(actionPayloadType, actionMap.type));\r\n\r\n if (actionsMatched) {\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Method to handle specific actions and check typescript type safely.\r\n * It throws error if actionMap.type does not equal the actionPayload.type.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap} The actionMap which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static safeHandleAction(\r\n actionPayload: IActionPayload,\r\n actionMap: IActionMap,\r\n callback: TActionSignature): any {\r\n\r\n if (!ActionHandler.endsWith(actionPayload.type + \"\", actionMap.type)) {\r\n throw \"The action payload does not match the action type.\";\r\n }\r\n\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * locationHref of page\r\n */\r\nexport const locationHref = (typeof (window) !== \"undefined\" ? window.location.href : \"\");\r\n\r\n/**\r\n * Render-cache expiration time in ms\r\n * 86400000 = 24 hours in milliseconds\r\n */\r\nexport const defaultExpirationTimeMs = 86400000;\r\n\r\n/**\r\n * Render-cache force expiration time in ms\r\n * 129600000 = 36 hours in milliseconds\r\n */\r\nexport const defaultForceExpirationTimeMs = 129600000;\r\n\r\n/**\r\n * localStorage key prefix for render cache expiration timestamp\r\n * Stores the sliding window expiration\r\n */\r\nexport const expirationPrefix = \"timestamp_\";\r\n\r\n/**\r\n * Force timestamp prefix for render cache values\r\n * Stores the absolute window expiration\r\n */\r\nexport const forceTimestampPrefix = \"force_timestamp_\";\r\n\r\n/**\r\n * Jss map suffix for render cache values\r\n * Stores the jss class list map\r\n */\r\nexport const jssMapSuffix = \"_jssMap\";\r\n\r\n/**\r\n * Prefix for render cache keys\r\n * Stores the collection of all render cache keys\r\n */\r\nexport const keysPrefix = \"keys_\";\r\n\r\n/**\r\n * Prefix for render cache qsp to remove and normlize the url\r\n */\r\nexport const normalizedUrlConfigkey = \"rcqsp\";\r\n\r\n/**\r\n * localStorage key prefix for render cache object\r\n * Stores the render cache snapshot\r\n */\r\nexport const storagePrefix = \"lastKnown_\";\r\n\r\n/**\r\n * River Render Cache ClassName\r\n */\r\nexport const riverRcClassName = \"river-rc\";\r\n\r\n/**\r\n * localStorage key for JSS Map object\r\n */\r\nexport const jssMapKey = `${storagePrefix}${locationHref}_jssmap`;\r\n\r\n/**\r\n * localStorage key for render cache object\r\n */\r\nexport const renderCacheKey = `${storagePrefix}${locationHref}`;\r\n\r\n/**\r\n * localStorage key for render cache expiration timestamp\r\n */\r\nexport const renderCacheExpirationKey = `${expirationPrefix}${locationHref}`;\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * A callback to reset singleton data. Used for server side rendering.\r\n */\r\nexport type ResetCallback = () => void;\r\n\r\n/**\r\n * Global array of callbacks that are used for resetting singleton data.\r\n */\r\nconst resetCallbacks: ResetCallback[] = [];\r\n\r\n/**\r\n * Adds a callback to the global array of reset callbacks.\r\n * This should only be used to reset singleton data.\r\n * @param callback The function that resets the singleton data.\r\n */\r\nexport function registerResetCallback(callback: ResetCallback): void {\r\n resetCallbacks.push(callback);\r\n}\r\n\r\n/**\r\n * Calls all of the reset functions in resetCallbacks.\r\n * This gets called once on the server side at the beginning of each request.\r\n */\r\nexport function invokeResetCallbacks(): void {\r\n for (const resetCallback of resetCallbacks) {\r\n resetCallback();\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ObjectTelemetryContract, TelemetryAttrName, TelemetryMetadataAttribute, TelemetryObjectBase, TrackingOptions } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { TelemetryContractCoverter } from \"./TelemetryContractCoverter\";\r\n\r\n/**\r\n * Object metadata class which combination of external contract and internal data\r\n * @class TelemetryObject\r\n */\r\nexport class TelemetryObject implements TelemetryObjectBase {\r\n // #region Public properties\r\n /**\r\n * External object contract.\r\n */\r\n public contract: ObjectTelemetryContract;\r\n // #endregion\r\n\r\n constructor(contract: ObjectTelemetryContract, parent?: TelemetryObject, isRoot?: boolean) {\r\n this.contract = contract;\r\n }\r\n\r\n /**\r\n * Render telemetry attribute.\r\n * @param contract Object contract.\r\n * @returns Telemetry attribute.\r\n */\r\n public static render(contract: ObjectTelemetryContract): any {\r\n const attr = TelemetryContractCoverter.compress(contract);\r\n return { [TelemetryAttrName]: JSON.stringify(attr) };\r\n }\r\n\r\n // #region Public functions\r\n /**\r\n * Add a new telemetry object as a child.\r\n * @param contract Object telemetry contract.\r\n * @returns New telemetry object.\r\n */\r\n public addChild(contract: ObjectTelemetryContract): TelemetryObject {\r\n return new TelemetryObject(contract, this);\r\n }\r\n\r\n /**\r\n * Add or update a child telemetry object.\r\n * @param contract Object telemetry contract.\r\n * @param savedChildObject Existing child telemetry object (if exist).\r\n * @returns New telemetry object.\r\n */\r\n public addOrUpdateChild(contract: ObjectTelemetryContract, savedChildObject?: TelemetryObject): TelemetryObject {\r\n if (savedChildObject) {\r\n savedChildObject.contract = contract;\r\n return savedChildObject;\r\n } else {\r\n return new TelemetryObject(contract, this);\r\n }\r\n }\r\n\r\n /**\r\n * Update telemetry contract.\r\n * @param contract Object contract.\r\n */\r\n public updateContract(contract: ObjectTelemetryContract): void {\r\n this.contract = contract;\r\n }\r\n\r\n /**\r\n * Render telemetry attribute.\r\n * @param option Tracking options.\r\n * @returns Telemetry attribute.\r\n */\r\n public render(option?: TrackingOptions): any {\r\n return TelemetryObject.render(this.contract);\r\n }\r\n\r\n /**\r\n * Produces a string version of the telemetry object's metadata\r\n * @returns Stringified json telemetry object\r\n */\r\n public getMetadataTag(): string {\r\n return JSON.stringify(this.getMetadata());\r\n }\r\n\r\n /**\r\n * Produces a string version of the telemetry object's metadata\r\n * @returns Stringified json telemetry object\r\n */\r\n public getMetadata(): TelemetryMetadataAttribute {\r\n return TelemetryContractCoverter.compress(this.contract);\r\n }\r\n // #endregion\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Mediator events\r\n * @export\r\n * @type {object}\r\n */\r\nexport const MediatorEventNames = {\r\n // Event fired when content actions attributes are updated (eg: new video is loaded)\r\n ContentActionsUpdated: \"contentActionsUpdated\",\r\n // Event fired when a feed is successfully followed\r\n FeedFollowed: \"feedFollowed\",\r\n // Event fired when a feed is successfully followed/un-followed to let pre-load\r\n // framework know it needs to refresh the page\r\n ForcePageReload: \"forcePageReload\",\r\n // Event fired when a feed is successfully followed/un-followed\r\n FollowedTopicsUpdated: \"followedTopicsUpdated\",\r\n // Event to fire to show a specific mediated coach mark\r\n MediatedCoachMark: \"mediated_coach_mark\",\r\n // Event fired by Prime when the tab is being changed\r\n TabNavigation: \"tab_navigation\",\r\n // Event that tells Prime feedsNav module to navigate to the specified URL\r\n TabNavigateTo: \"tab_navigate_to\",\r\n // Event fired when a topic is followed/unfollowed so SPA can re-act\r\n TopicAction: \"topic_action\",\r\n // Event fired when a 360 experience is launched\r\n Msn360: \"msn360\",\r\n // Event to fire to show card action menu\r\n CardActionInit: \"cardActionInit\",\r\n // Event to fire to post card action menu\r\n CardActionPost: \"cardActionPostEvent\",\r\n // Event to fire when interests render complete\r\n InterestsRenderComplete: \"interestsRenderCompleteEvent\",\r\n // Event to fire when an Xfeed needs to load\r\n RenderXFeed: \"show_xfeed_content\",\r\n // Event to fire when a pivot needs to load by id\r\n ShowPivotById: \"show_pivot_by_id\",\r\n // Event that tells Prime infopane module to resume the auto-rotation\r\n ResumeInfopaneAutoRotate: \"resumeInfopaneAutoRotate\",\r\n // Event fired when social actions attributes are updated (eg: new video is loaded)\r\n SocialActionsUpdated: \"socialActionsUpdated\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to retrieve the prime mediator object.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves with the mediator if it could be loaded, rejects otherwise.\r\n */\r\nexport const getMediator: IGetMediator = () => {\r\n return requireAsync(\"mediator\");\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Platform type\r\n */\r\nexport enum PlatformType {\r\n App = \"app\",\r\n Web = \"web\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ITargetScope } from \"@msnews/config-data-types\";\r\nimport { WpoModel } from \".\";\r\n\r\n/**\r\n * Get storage cache key used to store WPO service response.\r\n * @param {string} appType - The appType value.\r\n * @param {ITargetScope} targetScope - The current page request target scope.\r\n * @returns string - Cache key string.\r\n */\r\nexport function getWpoStorageCacheKey(appType: string, targetScope: ITargetScope): string {\r\n const { audienceMode = \"\", locale = {}, pageType = \"\" } = targetScope || {};\r\n const { language, market } = locale;\r\n\r\n return `wpo_data_ ${audienceMode}_${language}_${market}_${pageType}_${appType}`;\r\n}\r\n\r\n/**\r\n * Extracts the WPO flight ids from the WPOModel object.\r\n * @param {WpoModel} wpoData - The WPOModel object.\r\n * @returns string[] - Array of WPO recommended flight ids\r\n */\r\nexport function getWpoFlights(wpoData: WpoModel): string[] | null {\r\n if (!wpoData || !wpoData.treatments) {\r\n return null;\r\n }\r\n\r\n return wpoData.treatments.filter(item => item.id).map(item => item.id);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccountType, AppType, AudienceModeType, AuthCookieName, PageType } from \"@msnews/experiences-constants\";\r\nimport { AppErrorPropertyBag, getAppErrorsPropertyBag, getPageTimings, updateAppErrorsPropertyBag } from \"@msnews/diagnostics\";\r\n\r\nimport {\r\n appAnonCookieExistsCookieName,\r\n childCookieName,\r\n rootElementId,\r\n serviceUrl,\r\n telemetryId,\r\n trackPageProduct,\r\n trackPageType,\r\n EnterpriseToConsumerOverrideKey\r\n} from \"../constants\";\r\n\r\nimport { Environment, getEnvironmentFromString } from \"./Environment\";\r\nimport { HostPage, IHostPage } from \"./HostPage\";\r\nimport { WpoModel, getWpoFlights } from \"@msnews/wpo-common\";\r\nimport { canUseDOM, getDocumentElementById, getLocationHostname, getLocationHref, getLocationOrigin, getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { getCookie, getMuidCookie } from \"../utilities/CookieUtility\";\r\nimport { getLocalStorage } from \"../webstorage/LocalStorage\";\r\n\r\nimport { AccountInfo } from \"./Enterprise\";\r\nimport { Market } from \"./Market\";\r\nimport { PlatformType, PageRequestTargetScope } from \"@msnews/config-data-types\";\r\nimport { UrlUtility } from \"../utilities/UrlUtility\";\r\nimport { Utility } from \"../utilities/Utility\";\r\nimport { headData } from \"./HeadData\";\r\nimport { isString } from \"lodash-es\";\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { shouldUseGitConfigs } from \"@msnews/experimentation-helpers\";\r\nimport { ConfigCacheProperties, ConfigOrigin, ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { updateResolverAppErrorsPropertyBag } from \"@msnews/config-resolver\";\r\nimport { isWindowsScenario } from \"@msnews/url-util\";\r\n\r\n/**\r\n * chrome\r\n * The chrome API is not defined in Typescript\r\n */\r\ndeclare global {\r\n interface Window { chrome: any; }\r\n}\r\n\r\n/**\r\n * Page level experience tracking info\r\n */\r\nexport interface ITrackInfo {\r\n sitePage: {\r\n page_product: string,\r\n page_type: string\r\n }\r\n}\r\n\r\n// This is defined in webpack config\r\ndeclare let __WEBPACK_LOCAL_GITCONFIGS__: string;\r\ndeclare let __WEBPACK_LOCAL_GITCONFIGS_LOC__: string;\r\n\r\nexport class AppEnvironment {\r\n /**\r\n * The single instance of the AppEnvironment class.\r\n * @type {AppEnvironment}\r\n */\r\n private static _instance: AppEnvironment;\r\n\r\n /**\r\n * the activity id for the current page view\r\n */\r\n private activityId: string;\r\n\r\n /**\r\n * Base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof AppEnvironment\r\n */\r\n private contentServiceUrlBase: URL;\r\n\r\n private currentRequestTargetScope: PageRequestTargetScope;\r\n\r\n private currentMarket: Market;\r\n private hostPage: IHostPage;\r\n\r\n /** The hostname to use for content links. */\r\n private currentContentLinkHost: string;\r\n\r\n /**\r\n * Indicates that the page is running as an FRE page (i.e. the url contains fre=1)\r\n * Does not indicate that the FRE itself is currently displayed over the page.\r\n */\r\n private isFrePage: boolean;\r\n\r\n /** Flag to enable five column layout. */\r\n private enableFiveColLayout: boolean;\r\n\r\n /**\r\n * Base for the service url, endpoints/queries are appended for specific service calls.\r\n * This is the OneService url used for personalized content.\r\n * Possible values are enumerated on OneServiceConfig.ts\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof AppEnvironment\r\n */\r\n private serviceUrlBase: URL;\r\n\r\n /**\r\n * Base URL for the feed service\r\n */\r\n private feedServiceUrlBase: URL;\r\n\r\n /**\r\n * Base domain for the feed service\r\n */\r\n private serviceDomainUrl: string;\r\n\r\n /**\r\n * Base domain host for static resources\r\n */\r\n private staticDomain: string;\r\n\r\n /**\r\n * Base domain for the enterprise feed service\r\n */\r\n private enterpriseServiceDomainUrl: string;\r\n\r\n /**\r\n * The account info for the current page user wrapped in a promise\r\n */\r\n private accountInfoPromise: Promise;\r\n\r\n /**\r\n * The resolved account info. This is only set when the account info promise is resolved.\r\n */\r\n private resolvedAccountInfo: AccountInfo;\r\n\r\n private appType: string;\r\n private authCookieName: AuthCookieName;\r\n private buildVersion: string;\r\n\r\n private environmentConfigUrl: URL;\r\n\r\n private rootTelemetryId: number;\r\n private trackInfo: ITrackInfo;\r\n private userId: string;\r\n private countryCode: string;\r\n private latitude: string;\r\n private longitude: string;\r\n private environment: Environment;\r\n private featureFlags: any;\r\n private disableCachingConfigs: boolean;\r\n private enableConfigService: boolean;\r\n private isMultiConfigRetrievalEnabled: boolean;\r\n private configServiceBaseUrl: URL;\r\n private disableContentPreviewCache: boolean;\r\n private disableContentCacheIDBRead: boolean;\r\n private sendFeedCallActivityIdInHeader: boolean;\r\n private useOneServiceAuthEndpoints: boolean;\r\n private useOneServiceAnonAuthEndpoints: boolean;\r\n private useAuthFetch: boolean;\r\n private clarityEnabled: boolean;\r\n private isCnDomain: boolean;\r\n private oneServiceApiKey: string;\r\n\r\n /** Flag specific to windows-shell. True if User is AAD Account Type */\r\n private isWinAADUser: boolean;\r\n\r\n /** True if query string has appropriate debug flag */\r\n private isDebug: boolean;\r\n\r\n /** True if query string has appropriate flag to show msnCreatorDashboard (msnDash=) */\r\n private showMnsCreatorDashboard: boolean;\r\n\r\n /** Config Root Url */\r\n private configRootUrl: URL;\r\n\r\n /** Cache busting identifier received from pcs */\r\n private cacheBustingIdentifier: string;\r\n\r\n /** True if this is git configs flight */\r\n private isGitConfigs: boolean;\r\n\r\n /** Indicates whether feature/localization configs are fetched from local repo */\r\n private configOrigins: ConfigOrigins;\r\n\r\n /** For Config caching optimizations. */\r\n private configCacheProperties: ConfigCacheProperties;\r\n\r\n /** CRS endpoint version. Example: v2 or v3 */\r\n private crsVersion: string;\r\n\r\n /** CRS endpoint domain. Example: https://www.msn.com */\r\n private crsDomain: string;\r\n\r\n /** Root config index CMS Id. Example: cms/api/amp/experienceConfigIndex/BBUsYQa */\r\n private configIndexDocId: string;\r\n\r\n /** The WPOData we get from local storage using the requestContext wpoData function */\r\n private wpoData: string;\r\n public get WpoData(): string { return this.wpoData; }\r\n public set WpoData(value: string) {\r\n this.wpoData = value;\r\n this.addWpoFlights();\r\n }\r\n\r\n /**\r\n * ActivityId value from initial server response, use telemetry's requestId instead for associating with current page client navigation\r\n */\r\n public get ActivityId(): string { return this.activityId; }\r\n public set ActivityId(value: string) {\r\n this.activityId = value;\r\n headData.ClientSettings = {\r\n ...headData.ClientSettings,\r\n aid: value\r\n };\r\n }\r\n\r\n /**\r\n * Getter for the base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @readonly\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get EnvironmentConfigUrl(): URL {\r\n // If I mutate the same object, I will need to revert to the original state somewhere.\r\n // For safety reason, it is better to use a new Object\r\n const url = new URL(\"\", this.environmentConfigUrl);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.config\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.config\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.config\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Getter for the base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @readonly\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get ContentServiceUrlBase(): URL {\r\n // If I mutate the same object, I will need to revert to the original state somewhere.\r\n // For safety reason, it is better to use a new Object\r\n const url = new URL(\"\", this.contentServiceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.content\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.content\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.content\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n public get CurrentRequestTargetScope(): PageRequestTargetScope { return this.currentRequestTargetScope; }\r\n public set CurrentRequestTargetScope(value: PageRequestTargetScope) { this.currentRequestTargetScope = value; }\r\n\r\n public get CurrentMarket(): Market { return this.currentMarket; }\r\n public set CurrentMarket(value: Market) { this.currentMarket = value; }\r\n\r\n public get EnableFiveColLayout(): boolean { return this.enableFiveColLayout; }\r\n public set EnableFiveColLayout(value: boolean) { this.enableFiveColLayout = value; }\r\n\r\n public get Environment(): Environment { return this.environment; }\r\n public set Environment(value: Environment) { this.environment = value; }\r\n\r\n public get StaticDomain(): string { return this.staticDomain; }\r\n\r\n public get HostPage(): IHostPage { return this.hostPage; }\r\n public set HostPage(value: IHostPage) { this.hostPage = value; }\r\n\r\n public get AppType(): string { return this.appType; }\r\n\r\n public get AuthCookieName(): AuthCookieName { return this.authCookieName; }\r\n public set AuthCookieName(value: AuthCookieName) { this.authCookieName = value; }\r\n\r\n public get UseOneServiceAuthEndpoints(): boolean { return this.useOneServiceAuthEndpoints; }\r\n public set UseOneServiceAuthEndpoints(value: boolean) { this.useOneServiceAuthEndpoints = value; }\r\n\r\n public get UseOneServiceAnonAuthEndpoints(): boolean { return this.useOneServiceAnonAuthEndpoints; }\r\n public set UseOneServiceAnonAuthEndpoints(value: boolean) { this.useOneServiceAnonAuthEndpoints = value; }\r\n\r\n public get UseAuthFetch(): boolean { return this.useAuthFetch; }\r\n public set UseAuthFetch(value: boolean) { this.useAuthFetch = value; }\r\n\r\n public get AccountInfoPromise(): Promise { return this.accountInfoPromise; }\r\n public set AccountInfoPromise(value: Promise) { this.accountInfoPromise = value; }\r\n\r\n public get ResolvedAccountInfo(): AccountInfo { return this.resolvedAccountInfo; }\r\n public set ResolvedAccountInfo(value: AccountInfo) { this.resolvedAccountInfo = value; }\r\n\r\n public get BuildVersion(): string { return this.buildVersion || \"\"; }\r\n\r\n public get ClarityEnabled(): boolean { return this.clarityEnabled; }\r\n public set ClarityEnabled(value: boolean) { this.clarityEnabled = value; }\r\n\r\n public get IsWinAADUser(): boolean { return this.isWinAADUser; }\r\n public set IsWinAADUser(value: boolean) { this.isWinAADUser = value; }\r\n\r\n public get RootTelemetryId(): number { return this.rootTelemetryId; }\r\n public set RootTelemetryId(value: number) { this.rootTelemetryId = value; }\r\n\r\n public get TrackInfo(): ITrackInfo { return this.trackInfo; }\r\n public set TrackInfo(value: ITrackInfo) { this.trackInfo = value; }\r\n\r\n public get UserId(): string { return this.getUserMuid() || this.userId; }\r\n public set UserId(value: string) { this.userId = value; }\r\n\r\n public get OneServiceApiKey(): string { return this.oneServiceApiKey; }\r\n public set OneServiceApiKey(value: string) { this.oneServiceApiKey = value; }\r\n\r\n /** True if query string has appropriate debug flag */\r\n public get IsDebug(): boolean { return this.isDebug; }\r\n\r\n /** True if query string has appropriate flag to show msnCreatorDashboard (msnDash=) */\r\n public get ShowMnsCreatorDashboard(): boolean { return this.showMnsCreatorDashboard; }\r\n\r\n /**\r\n * Gets the host to use when linking to content.\r\n */\r\n public get contentLinkHost(): string { return this.currentContentLinkHost; }\r\n\r\n public get IsCnDomain(): boolean { return this.isCnDomain; }\r\n\r\n /**\r\n * Getter for the base for the service url, endpoints/queries are appended for specific service calls.\r\n * This is the oneservice url used for personalized content.\r\n * Possible values are enumerated on OneServiceConfig.ts\r\n *\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get ServiceUrlBase(): URL {\r\n const url = new URL(\"\", this.serviceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Base URL for the feed service\r\n */\r\n public get FeedServiceUrlBase(): URL {\r\n if (!this.feedServiceUrlBase) {\r\n return null;\r\n }\r\n\r\n const url = new URL(\"\", this.feedServiceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Base URL for the enterprise service\r\n */\r\n public get EnterpriseServiceUrlBase(): URL {\r\n if (!this.enterpriseServiceDomainUrl) {\r\n return;\r\n }\r\n\r\n const url = new URL(\"\", this.enterpriseServiceDomainUrl);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Returns true if audience mode is set to Enterprise and the user is logged into an AAD account, else false\r\n */\r\n public get isAadAccountUser(): boolean {\r\n return this.CurrentRequestTargetScope && this.CurrentRequestTargetScope.audienceMode === AudienceModeType.Enterprise &&\r\n this.ResolvedAccountInfo && this.ResolvedAccountInfo.account_type && this.ResolvedAccountInfo.account_type === AccountType.AAD;\r\n }\r\n\r\n public get IsFrePage(): boolean { return this.isFrePage; }\r\n\r\n /**\r\n * This is the switch to turn on/off indexed db operation used as a caching layer in config resolver (Resolver.ts)\r\n */\r\n public get DisableCachingConfigs(): boolean { return this.disableCachingConfigs; }\r\n\r\n /**\r\n * This is the switch to turn on/off config service operation\r\n */\r\n public get EnableConfigService(): boolean {\r\n const queryParamOverride = UrlUtility.getQueryParameterByName(\"enableConfigService\", getLocationSearch());\r\n\r\n if (queryParamOverride) {\r\n return queryParamOverride.toLocaleLowerCase() === \"true\";\r\n }\r\n return this.enableConfigService;\r\n }\r\n\r\n /**\r\n * This indicates whether we will use CMS PPE configs or not\r\n */\r\n public get EnableCMSPPEConfigs(): boolean { return headData && headData.EnableCMSPPEConfigs; }\r\n\r\n /**\r\n * Check whether multi config retrieval is supported.\r\n */\r\n public get IsMultiConfigRetrievalEnabled(): boolean { return this.isMultiConfigRetrievalEnabled; }\r\n\r\n /**\r\n * This is the switch to turn on/off content preview caching in core/cache/ContentPreview.ts\r\n */\r\n public get DisableContentPreviewCache(): boolean {\r\n return this.disableContentPreviewCache;\r\n }\r\n\r\n /**\r\n * Returns a flag indicating whether the one service feed fetch call should send activityID\r\n * in the request header or as a QSP in the URL (current behavior is via QSP).\r\n */\r\n public get SendFeedCallActivityIdInHeader(): boolean {\r\n return this.sendFeedCallActivityIdInHeader;\r\n }\r\n\r\n /**\r\n * This is the switch to turn off hydrating content preview cache from IndexedDB.\r\n * Default is false\r\n */\r\n public get DisableContentCacheIDBRead(): boolean {\r\n const queryParamOverride = UrlUtility.getQueryParameterByName(\"disableContentCacheIDBRead\", getLocationSearch());\r\n\r\n if (queryParamOverride) {\r\n return queryParamOverride === \"true\";\r\n }\r\n\r\n return this.disableContentCacheIDBRead;\r\n }\r\n\r\n /**\r\n * Get base url of Config Service.\r\n */\r\n public get ConfigServiceBaseUrl(): URL { return this.configServiceBaseUrl; }\r\n\r\n /**\r\n * This returns feature flags client settings stamped by PCS.\r\n */\r\n public get FeatureFlags(): any { return this.featureFlags; }\r\n\r\n /**\r\n * This returns config root url\r\n */\r\n public get ConfigRootUrl(): URL {\r\n if (!this.configRootUrl) {\r\n return null;\r\n }\r\n\r\n const url = new URL(\"\", this.configRootUrl);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.config\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.config\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.config\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Returns cache busting identifier from PCS.\r\n */\r\n public get CacheBustingIdentifier(): string { return this.cacheBustingIdentifier; }\r\n\r\n /**\r\n * True if this is git configs flight\r\n */\r\n public get IsGitConfigs(): boolean { return this.isGitConfigs; }\r\n\r\n /**\r\n * Returns the country code. For example \"br\"\r\n */\r\n public get CountryCode(): string { return this.countryCode; }\r\n public set CountryCode(value: string) { this.countryCode = value; }\r\n\r\n /// / FIXME: hyphen has a second 'h'\r\n /// / Bug 24228723: [Peregrine] ActivityIdLowerCaseNoHypens misspells \"Hyphen\"\r\n /**\r\n * Gets the Activity ID in lower case and without any hyphens. This helper method should be where parity with Prime is required.\r\n * Use telemetry's requestId instead for associating with current page client navigation\r\n */\r\n public get ActivityIdLowerCaseNoHypens(): string { return ((headData && headData.ClientSettings && headData.ClientSettings.aid) || \"\").toLowerCase(); }\r\n\r\n /**\r\n * Returns the latitude. For example \"42.361145\"\r\n */\r\n public get Latitude(): string { return this.latitude; }\r\n\r\n /**\r\n * Returns the longitude. For example \"-71.057083\"\r\n */\r\n public get Longitude(): string { return this.longitude; }\r\n\r\n /** For Config caching optimizations. */\r\n public get ConfigCacheProperties(): ConfigCacheProperties { return this.configCacheProperties; }\r\n\r\n /** Fetches local dev environment for client resolver */\r\n public get ConfigOrigins(): ConfigOrigins { return this.configOrigins; }\r\n\r\n /**\r\n * Indicates whether configs should be fetched from local repo based on conditions and overrides\r\n */\r\n private setConfigOrigin(): ConfigOrigins {\r\n // Default to production\r\n const configOrigins: ConfigOrigins = { feature: ConfigOrigin.Production, loc: ConfigOrigin.Production };\r\n\r\n if (__WEBPACK_LOCAL_GITCONFIGS_LOC__) {\r\n configOrigins.feature = ConfigOrigin.Local;\r\n configOrigins.loc= ConfigOrigin.Local;\r\n } else if (__WEBPACK_LOCAL_GITCONFIGS__) {\r\n configOrigins.feature = ConfigOrigin.Local;\r\n configOrigins.loc = ConfigOrigin.Production;\r\n }\r\n\r\n // Override based on conditions\r\n if (!this.IsGitConfigs || this.EnableConfigService) {\r\n configOrigins.feature = ConfigOrigin.Production;\r\n configOrigins.loc = ConfigOrigin.Production;\r\n }\r\n return configOrigins;\r\n }\r\n\r\n /**\r\n * Initialize the AppEnvironment singleton instance.\r\n * @param _serviceUrl Optional URL to initialize the ServiceUrlBase.\r\n * Render service can be deployed to the shared cluster or OneService cluster. Depending on where it is deployed, we can override the configServiceUrl or serviceDomainUrl to speed up the performance\r\n * @param _configServiceOverride When render service is deployed to the shared cluster. We want to make calls to the config service within the shared cluster region, instead of calling www.msn.com\r\n * @param _serviceDomainOverride When render service is deployed to OneService cluster, we want to make calls to the feed service within the OneService cluster region, instead of calling assets.msn.com\r\n */\r\n private constructor(_serviceUrl: URL, _configServiceOverride: string, _serviceDomainOverride: string) {\r\n this.initializeAppEnvironment(_serviceUrl, _configServiceOverride, _serviceDomainOverride);\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns {AppEnvironment}\r\n */\r\n public static getInstance(serviceUrl: URL = null, configServiceOverride: string = null, serviceDomainOverride: string = null): AppEnvironment {\r\n return AppEnvironment._instance || (AppEnvironment._instance = new AppEnvironment(serviceUrl, configServiceOverride, serviceDomainOverride));\r\n }\r\n\r\n /**\r\n * Reinitialize the singleton class instance.\r\n * @param serviceUrl OneService service url to initialize to.\r\n * @param configServiceOverride url that is used to override config service url.\r\n * @param serviceDomainOverride url that is used to override service domain url.\r\n * This value is externally configured from SSR environment\r\n * @returns {AppEnvironment}\r\n */\r\n public static resetInstance(serviceUrl: URL = null, configServiceOverride: string = null, serviceDomainOverride: string = null): AppEnvironment {\r\n AppEnvironment._instance = new AppEnvironment(serviceUrl, configServiceOverride, serviceDomainOverride);\r\n appEnvironment = AppEnvironment._instance;\r\n return AppEnvironment._instance;\r\n }\r\n\r\n /**\r\n * Initializes App environment. This is normally only called by the constructor (singleton pattern)\r\n * It is made public so that it can be also called by test code.\r\n */\r\n public initializeAppEnvironment(_serviceUrl?: URL, configServiceOverride?: string, serviceDomainOverride?: string): void {\r\n\r\n let environmentFromHeadData: Environment = null;\r\n const clientSettings = headData && headData.ClientSettings;\r\n\r\n const locationHost: string = getLocationHostname();\r\n this.isCnDomain = locationHost.toLowerCase().endsWith(\".cn\");\r\n\r\n if (clientSettings) {\r\n this.activityId = this.tryReformatGuid(clientSettings.aid);\r\n this.currentMarket = (headData.Locale || clientSettings.apps_locale) as Market;\r\n this.countryCode = clientSettings.geo_country;\r\n this.latitude = clientSettings.geo_lat;\r\n this.longitude = clientSettings.geo_long;\r\n this.configRootUrl = clientSettings.configRootUrl ? new URL(\"\", clientSettings.configRootUrl) : null;\r\n environmentFromHeadData = getEnvironmentFromString(clientSettings.pcsInfo && clientSettings.pcsInfo.env || \"prod\");\r\n\r\n this.setAccountInfoPromise();\r\n this.appType = clientSettings.apptype || \"\";\r\n this.authCookieName = this.getAuthCookieName();\r\n this.useOneServiceAuthEndpoints = false;\r\n this.useOneServiceAnonAuthEndpoints = false;\r\n this.useAuthFetch = false;\r\n\r\n this.featureFlags = clientSettings.featureFlags;\r\n\r\n this.disableCachingConfigs =\r\n this.featureFlags && this.featureFlags.disableCachingConfigs\r\n ? this.featureFlags.disableCachingConfigs === \"true\"\r\n : false;\r\n\r\n this.enableConfigService =\r\n this.featureFlags && this.featureFlags.enableConfigService\r\n ? this.featureFlags.enableConfigService === \"true\"\r\n : true;\r\n\r\n this.disableContentPreviewCache =\r\n this.featureFlags && this.featureFlags.disableContentPreviewCache\r\n ? this.featureFlags.disableContentPreviewCache === \"true\"\r\n : false;\r\n\r\n this.disableContentCacheIDBRead = this.featureFlags && this.featureFlags.disableContentCacheIDBRead\r\n ? this.featureFlags.disableContentCacheIDBRead === \"true\"\r\n : false;\r\n\r\n // Use feature flag as a switch to disable the feature (will need a PCS deployment)\r\n this.sendFeedCallActivityIdInHeader = this.featureFlags && this.featureFlags.disableActivityIdInHeader && this.featureFlags.disableActivityIdInHeader === \"true\"\r\n ? false\r\n : this.appType === AppType.Edge || this.appType === AppType.Hub;\r\n\r\n this.cacheBustingIdentifier = clientSettings.cbid;\r\n\r\n if (clientSettings.pcsInfo && !getAppErrorsPropertyBag().pcsVersion) {\r\n const propertyBagPcsVersion: AppErrorPropertyBag = {\r\n appType: this.appType,\r\n pcsVersion: clientSettings.pcsInfo.v\r\n };\r\n\r\n updateAppErrorsPropertyBag(propertyBagPcsVersion);\r\n }\r\n\r\n const bundleInfo = clientSettings.bundleInfo;\r\n\r\n if (bundleInfo) {\r\n const { alias, configsHash, hash, locConfigsHash, v } = bundleInfo;\r\n this.buildVersion = v || \"\";\r\n updateAppErrorsPropertyBag({ build: this.buildVersion });\r\n updateResolverAppErrorsPropertyBag({ build: this.buildVersion });\r\n\r\n const buildAlias = alias;\r\n if (buildAlias) {\r\n updateAppErrorsPropertyBag({ buildAlias });\r\n }\r\n\r\n if (hash && configsHash && locConfigsHash) {\r\n this.configCacheProperties = {\r\n bundleHash: hash,\r\n configHash: configsHash,\r\n locHash: locConfigsHash\r\n };\r\n }\r\n }\r\n\r\n // Get configIndexDocId\r\n this.configIndexDocId = clientSettings.configIndexDocId;\r\n }\r\n\r\n const rootElement = canUseDOM() ? getDocumentElementById(rootElementId) : null;\r\n const locationHref = getLocationHref();\r\n const locationOrigin = getLocationOrigin();\r\n\r\n // env is read from\r\n // - query string param env, if present\r\n // - headData.ClientSettings.pcsInfo.env\r\n // - defaults to prod otherwise\r\n const envQSOverwrite = getEnvironmentFromString(UrlUtility.getQueryParameterByName(\"env\", locationHref));\r\n this.environment =\r\n envQSOverwrite\r\n || environmentFromHeadData\r\n || Environment.prod;\r\n\r\n const servicesEndpoints = clientSettings && clientSettings.servicesEndpoints;\r\n const pcsProvidedDomainUrl = servicesEndpoints && servicesEndpoints.feedService && servicesEndpoints.feedService.domain || locationOrigin;\r\n\r\n if (canUseDOM()) {\r\n // Get from headdata if possible.\r\n // Else using locationOrigin is okay (current MMX scenario) since it'd use .cn version for China.\r\n // todo: pass this to SW to override regex in service-worker/src/swConstants/DefaultRoutes.enum.ts\r\n this.serviceDomainUrl = pcsProvidedDomainUrl;\r\n } else {\r\n this.serviceDomainUrl = serviceDomainOverride || pcsProvidedDomainUrl;\r\n }\r\n\r\n this.staticDomain = new URL(pcsProvidedDomainUrl).host;\r\n this.enterpriseServiceDomainUrl = servicesEndpoints && servicesEndpoints.enterpriseFeedService && servicesEndpoints.enterpriseFeedService.domain;\r\n\r\n // Get CRS endpoint version. Example: v2 or v3 and domain given by PCS\r\n this.crsVersion = servicesEndpoints && servicesEndpoints.crs && servicesEndpoints.crs.v;\r\n this.crsDomain = servicesEndpoints && servicesEndpoints.crs && servicesEndpoints.crs.domain;\r\n\r\n this.serviceUrlBase = _serviceUrl || (rootElement && rootElement.getAttribute(serviceUrl) && new URL(\"\", rootElement.getAttribute(serviceUrl))) || new URL(\"/service/\", this.serviceDomainUrl);\r\n this.feedServiceUrlBase = this.serviceDomainUrl ? new URL(\"/service/\", this.serviceDomainUrl) : undefined;\r\n\r\n // Get the hostPage from the request url\r\n this.hostPage = HostPage.getHostPageFromUrl(locationHref);\r\n\r\n // Determine if the page is running as an FRE page\r\n this.isFrePage = (UrlUtility.getQueryParameterByName(\"fre\", locationHref) === \"1\");\r\n\r\n this.userId = this.getUserMuid();\r\n\r\n // Get attributes from the head (full page Peregrine experience) or from the spa \"root\" element (PrimeHybrid case)\r\n // TODO, determine where in the element attributes these values should be set\r\n this.rootTelemetryId = rootElement ? Number(rootElement.getAttribute(telemetryId)) : 0;\r\n const trackPageProd = rootElement && rootElement.getAttribute(trackPageProduct);\r\n const trackPageTypeVal = rootElement && rootElement.getAttribute(trackPageType);\r\n this.trackInfo = { sitePage: { page_product: trackPageProd, page_type: trackPageTypeVal } };\r\n\r\n this.currentContentLinkHost = this.createContentLinkHost();\r\n\r\n this.setTargetScope();\r\n\r\n // Before calling this function make sure that\r\n // 1) Target scope is set and pageExperiments are available. No flights is fine.\r\n // 2) ServiceEndPoints are set and crsVersion is available.\r\n // 3) configIndexDocId is set.\r\n // 4) appType is set correctly.\r\n this.isGitConfigs = this.useGitConfigs();\r\n\r\n // Before calling this function make sure that\r\n // 1) Target scope is set and pageExperiments are available. No flights is fine.\r\n // 2) configIndexDocId is set.\r\n // 3) appType is set correctly.\r\n // 4) locationHref is set\r\n // 5) isGitConfigs is set\r\n this.addHubWindowsFlight(locationHref);\r\n this.configOrigins = this.setConfigOrigin();\r\n\r\n // Temporarily hardcode endpoint for MMX flight, when flight is off, we want to use hardcoded value.\r\n // After the flight, we hope to start using the regular logic for MMX\r\n if (this.appType === AppType.MMX && headData && !headData.IsMmxWwwContentRequest) {\r\n const mmxExperimentContentHost = getLocationHostname().endsWith(\".cn\") ? \"https://assets.msn.cn\" : \"https://assets.msn.com\";\r\n this.contentServiceUrlBase = new URL(\"/content/\", mmxExperimentContentHost);\r\n } else {\r\n // IsMmxWwwContentRequest still comes here\r\n this.contentServiceUrlBase = this.serviceDomainUrl ? new URL(\"/content/\", this.serviceDomainUrl) : undefined;\r\n }\r\n\r\n this.isMultiConfigRetrievalEnabled = this.useMultiConfigsRetrieval();\r\n\r\n // Make sure that this.isGitConfigs is set before calling getConfigServiceBaseUrl.\r\n const baseUrl = this.getConfigServiceBaseUrl(this.isMultiConfigRetrievalEnabled, configServiceOverride);\r\n\r\n this.configServiceBaseUrl = baseUrl ? new URL(\"\", baseUrl) : null;\r\n\r\n this.environmentConfigUrl = this.serviceDomainUrl ? new URL(\"/config/v1/\", this.serviceDomainUrl) : undefined;\r\n\r\n this.isDebug = ((UrlUtility.getQueryParameterByName(\"debug\", locationHref) || \"\").toLowerCase() in { 1: 1, true: 1 })\r\n || (UrlUtility.getQueryParameterByName(\"item\", locationHref) || \"\").toLowerCase().indexOf(\"/debug\") > 0\r\n || locationHost.includes(\"localhost\");\r\n\r\n this.showMnsCreatorDashboard = UrlUtility.getQueryParameterByName(\"mnsDash\", locationHref) != null;\r\n\r\n this.oneServiceApiKey = this.getOneServiceApiKey();\r\n\r\n this.enableFiveColLayout = false;\r\n }\r\n\r\n /**\r\n * Get the ApiKey that should be used by the current AppType\r\n * Please work OneService (aka: IDX) before updating it as this can break features\r\n * even if the call succeeds.\r\n */\r\n private getOneServiceApiKey(): string {\r\n let apiKey;\r\n switch (this.appType) {\r\n case AppType.WindowsShell:\r\n apiKey = \"pWw5OmQehOA0XNfgcgrTrwEJZJJJzE83ovtTQx6JRG\";\r\n break;\r\n case AppType.SharedWidgets:\r\n apiKey = \"hFWgtnoLG1BXruRRhEVJo5ACP8414XUG0Ric6JbyND\";\r\n break;\r\n case AppType.NewsAndInterests:\r\n case AppType.WindowsNewsPlus:\r\n apiKey = \"AEbyVYqTQAPvg4lWwMSFHaLkDzl3weRKKIDDInLQUj\";\r\n break;\r\n default:\r\n apiKey = \"0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM\";\r\n }\r\n return apiKey;\r\n }\r\n\r\n /**\r\n * Get the UserMuid from the muid cookie\r\n */\r\n private getUserMuid(): string {\r\n let muid: string;\r\n const muidCookie: string = getMuidCookie();\r\n if (isString(muidCookie)) {\r\n muid = \"m-\" + muidCookie;\r\n }\r\n return muid;\r\n }\r\n\r\n /**\r\n * Get config service base url\r\n * @param isMultiConfigRetrievalEnabled if multiple config retrieval is supported.\r\n * @param configServiceOverride url that is used to override config service url. This value is externally configured from SSR environment.\r\n * @returns {string} - config service base url.\r\n */\r\n private getConfigServiceBaseUrl(isMultiConfigRetrievalEnabled = true, configServiceOverride = null): string {\r\n const relativePath = this.isGitConfigs\r\n ? \"/resolver/api/resolve/v3/config/\"\r\n : `/resolver/api/resolve/${isMultiConfigRetrievalEnabled ? \"v2/\" : \"\"}configindex/`;\r\n\r\n // When doing server side rendering the ClusterRegionUrl env variable should be set, use this to avoid calls to CRS going outside of the cluster.\r\n if (configServiceOverride) {\r\n return configServiceOverride + relativePath;\r\n }\r\n\r\n // For Widgets external partners, use CRS domain given by PCS => client settings => servicesEndpoints => crs => domain\r\n // Use default as \"https://www.msn.com\" when PCS response doesn't have it.\r\n if (canUseDOM() && (this.renderWidgets() || this.appType === AppType.SharedWidgets)) {\r\n return (this.crsDomain || \"https://www.msn.com\") + relativePath;\r\n }\r\n\r\n // int and localhost to use int.msn.com for config service.\r\n if (process && process.env && process.env.WEBPACK_DEV_SERVER) {\r\n return \"https://int.msn.com\" + relativePath;\r\n }\r\n\r\n return getLocationOrigin() ? getLocationOrigin() + relativePath : null;\r\n }\r\n\r\n /**\r\n * Function checks if ConfigService should return multiple configs\r\n * @returns true if supported else false.\r\n */\r\n private useMultiConfigsRetrieval(): boolean {\r\n const urlQuery = getLocationSearch();\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(\"isMultiConfigRetrievalEnabled\", urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n // PCS flag to turn on/off multi config retrieval.\r\n if (this.featureFlags\r\n && this.featureFlags.isMultiConfigRetrievalEnabled) {\r\n return this.featureFlags.isMultiConfigRetrievalEnabled === \"true\";\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Function checks if Git configs is enabled\r\n * @returns true if supported else false.\r\n */\r\n private useGitConfigs(): boolean {\r\n const urlQuery = getLocationSearch();\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(\"isGitConfig\", urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n const flights = this.currentRequestTargetScope && this.currentRequestTargetScope.pageExperiments;\r\n return shouldUseGitConfigs(this.crsVersion, flights, this.configIndexDocId, this.appType);\r\n }\r\n\r\n /**\r\n * Function checks if we are rendering individual experiences (widgets)\r\n * @returns true if QS is set else false.\r\n */\r\n private renderWidgets(): boolean {\r\n const urlQuery = getLocationSearch();\r\n const renderWidgetQS = \"renderWidget\";\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(renderWidgetQS, urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get the auth cookie name based on the app type of the page\r\n * @returns {AuthCookieName} - the name of the auth cookie to use\r\n */\r\n private getAuthCookieName(): AuthCookieName {\r\n const clientSettings = headData && headData.ClientSettings;\r\n const appType: AppType = (clientSettings.apptype || \"\") as AppType;\r\n let authCookieName: AuthCookieName;\r\n switch (appType) {\r\n case AppType.Windows:\r\n authCookieName = headData.ClientSettings.pagetype === PageType.Windows ? AuthCookieName.Anon : AuthCookieName.AppAnon;\r\n break;\r\n case AppType.FirstParty:\r\n case AppType.Hub:\r\n case AppType.MicrosoftNews:\r\n case AppType.Views:\r\n case AppType.Weather:\r\n case AppType.Finance:\r\n case AppType.HomePage:\r\n authCookieName = AuthCookieName.Anon;\r\n break;\r\n case AppType.Edge:\r\n case AppType.EdgeChromium:\r\n case AppType.MMX:\r\n case AppType.Office:\r\n default:\r\n authCookieName = AuthCookieName.AppAnon;\r\n }\r\n\r\n return authCookieName;\r\n }\r\n\r\n /**\r\n * Sets the AccountInfoPromise for the current user.\r\n * If unable to await, ResolvedAccountInfo is also set when the promise is resolved.\r\n */\r\n private setAccountInfoPromise(): void {\r\n this.ResolvedAccountInfo = null;\r\n this.AccountInfoPromise = new Promise((resolve) => {\r\n if (!canUseDOM() || !window.chrome || !window.chrome.authPrivate || !window.chrome.authPrivate.getPrimaryAccountInfo) {\r\n return resolve(null);\r\n }\r\n\r\n const markerName = \"Auth.GetPrimaryAccountInfo\";\r\n const startTime = Math.round(performance.now());\r\n\r\n window.chrome.authPrivate.getPrimaryAccountInfo((accountInfo) => {\r\n const endTime = Math.round(performance.now());\r\n const pageTimings = getPageTimings();\r\n pageTimings[markerName] = endTime - startTime;\r\n\r\n this.ResolvedAccountInfo = accountInfo;\r\n return resolve(accountInfo);\r\n });\r\n });\r\n\r\n // Start the promise asynchronously.\r\n this.AccountInfoPromise;\r\n }\r\n\r\n /**\r\n * Determines the content link host to use.\r\n * @returns The content link host.\r\n */\r\n private createContentLinkHost(): string {\r\n const topLevelDomain = this.currentMarket === Market.ZHCN ? \"cn\" : \"com\";\r\n return \"www.msn.\" + topLevelDomain;\r\n }\r\n\r\n /**\r\n * Reformats the given guid without dashes to a guid string with dashes.\r\n * @param {string} guid - The guid without dashes.\r\n * @returns {string} - The reformatted GUI with dashes.\r\n */\r\n private tryReformatGuid(guid: string): string {\r\n if (guid && guid.length === 32) {\r\n // use a regex to extract the specific substrings to reformat the guid\r\n const matches = guid.match(/(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})/i);\r\n if (matches) {\r\n // join all the captured groups from 1-5 to format the final guid string\r\n guid = matches.slice(1).join(\"-\");\r\n }\r\n }\r\n\r\n return guid;\r\n }\r\n\r\n /**\r\n * Sets target scope for current request.\r\n */\r\n private setTargetScope(): void {\r\n if (!headData || !headData.ClientSettings) {\r\n return;\r\n }\r\n // If user is signed in and \"child\" Cookie exists - set Kids audience mode, otherwise use PCS provided Audience mode.\r\n let audienceMode: AudienceModeType;\r\n if (getCookie(appAnonCookieExistsCookieName) && getCookie(childCookieName)) {\r\n audienceMode = AudienceModeType.Kids;\r\n } else if (headData.ClientSettings.audienceMode === AudienceModeType.Enterprise && this.getEnterpriseOverride()) {\r\n audienceMode = AudienceModeType.Adult;\r\n } else {\r\n audienceMode = headData.ClientSettings.audienceMode || AudienceModeType.Adult;\r\n }\r\n\r\n const { browser, deviceFormFactor, domain, locale, ocid, os, pagetype } = headData.ClientSettings;\r\n\r\n this.currentRequestTargetScope = {\r\n audienceMode: audienceMode,\r\n browser: browser,\r\n deviceFormFactor: deviceFormFactor,\r\n domain: domain,\r\n locale: locale,\r\n ocid,\r\n os: os,\r\n platform: PlatformType.Web,\r\n pageType: pagetype\r\n };\r\n\r\n // if locale is not defined in client settings, try reading it from headData for backward compatibility\r\n if (!this.currentRequestTargetScope.locale && Utility.stringHasData(headData.Locale)) {\r\n const locale = headData.Locale.split(\"-\");\r\n if (locale.length > 1) {\r\n this.currentRequestTargetScope.locale = {\r\n language: locale[0],\r\n // Some spartan locale are in format \"ha-latn-ng\". Here the market is \"ng\" and language is \"ha\"\r\n market: locale[locale.length - 1]\r\n };\r\n }\r\n }\r\n\r\n if (Utility.stringHasData(headData.CurrentFlights)) {\r\n this.currentRequestTargetScope.pageExperiments = headData.CurrentFlights.split(\",\");\r\n }\r\n\r\n this.addWpoFlights();\r\n }\r\n\r\n /**\r\n * Get WpoModel from WpoData that we got from local storage given the specific WPO\r\n * key\r\n */\r\n private getWpoModel(wpoData: string): WpoModel {\r\n let model: WpoModel;\r\n if (wpoData != null) {\r\n model = tryParseJson(wpoData);\r\n if (model != null) {\r\n model;\r\n }\r\n }\r\n return model;\r\n }\r\n\r\n /**\r\n * Adds WPO flights to the current request target scope pageExperiments.\r\n */\r\n private addWpoFlights(): void {\r\n if (!this.FeatureFlags || !this.FeatureFlags.wpoEnabled) {\r\n return;\r\n }\r\n const WPOModel = this.getWpoModel(this.wpoData);\r\n const flightsCached: string[] = getWpoFlights(WPOModel);\r\n\r\n if (!flightsCached) {\r\n return;\r\n }\r\n // TODO: resume it after our perf fix for prg-venus\r\n // const lowerCaseFlightsCached = flightsCached.map(flight => flight.toLowerCase());\r\n // const currentPageExperiments = this.currentRequestTargetScope.pageExperiments || [];\r\n // this.currentRequestTargetScope.pageExperiments = currentPageExperiments.concat(lowerCaseFlightsCached);\r\n const currentPageExperiments = this.currentRequestTargetScope.pageExperiments || [];\r\n this.currentRequestTargetScope.pageExperiments = currentPageExperiments.concat(flightsCached);\r\n }\r\n\r\n /**\r\n * Adds WPO flights to the current request target scope pageExperiments.\r\n */\r\n private addHubWindowsFlight(locationHref: string): void {\r\n if (this.isGitConfigs && this.appType === AppType.Hub && isWindowsScenario(locationHref)) {\r\n const currentPageExperiments = this.currentRequestTargetScope.pageExperiments || [];\r\n this.currentRequestTargetScope.pageExperiments = currentPageExperiments.concat(\"prg-iswin-hub\");\r\n }\r\n }\r\n\r\n private getEnterpriseOverride(): boolean {\r\n return !!getLocalStorage().getObject(EnterpriseToConsumerOverrideKey);\r\n }\r\n}\r\n\r\nexport const getAppEnvironment = AppEnvironment.getInstance;\r\n\r\n// appEnvironment can be reinitialized for server side rendering through resetAppEnvironment.\r\nexport let appEnvironment = AppEnvironment.getInstance();\r\n\r\nexport const resetAppEnvironment = AppEnvironment.resetInstance;","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Peregrine flights with prefix\r\n */\r\nexport const PeregrineFlightPrefix = \"prg-\";\r\n\r\n/**\r\n * OneService flights with prefix\r\n */\r\nexport const OneServiceFlightPrefix = \"1s-\";\r\n\r\n/**\r\n * Config Service v3 endpoint\r\n */\r\nexport const CrsV3Endpoint = \"v3\";\r\n\r\n/**\r\n * Git configs indexedDB caching flight\r\n */\r\nexport const GitConfigsIndexedDbTreatment = \"prg-gitconfigs-t\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppType, CrsV3Endpoint, OneServiceFlightPrefix, PeregrineFlightPrefix } from \"@msnews/experiences-constants\";\r\n\r\n/**\r\n * Specific flights for app types to allow Git configs\r\n */\r\nexport const appTypeExpectedFlightMap: Map = new Map([\r\n [AppType.Edge, \"prg-gitcfgs-edge\"],\r\n [AppType.Finance, \"prg-gitcfgs-fi\"],\r\n [AppType.SuperApp, \"prg-gitcfgs-t\"],\r\n [AppType.Traffic, \"prg-gitcfgs-traf\"],\r\n [AppType.Weather, \"prg-gitcfgs-wea\"]\r\n]);\r\n\r\n/**\r\n * Goes through the array of flights that is given and will filter out any flight that doesn't start with\r\n * prg-. It then sorts them and returns a new string[].\r\n * @param flights Array of flights that we will filter through and return only the peregrine\r\n * @returns specific flights\r\n */\r\nexport function getPeregrineFlights(flights: string[]): string[] {\r\n if (!flights || flights.length === 0) {\r\n return flights;\r\n }\r\n\r\n const cleanedUpFlights = [];\r\n flights.forEach((item) => {\r\n const lowercaseItem = item.toLocaleLowerCase().trim();\r\n // Including specific 1s- prefix to bypass flightID regards OneService's bing.news backfill. Will fill bug to track/remove this.\r\n if (lowercaseItem.startsWith(PeregrineFlightPrefix) || lowercaseItem.startsWith(OneServiceFlightPrefix)) {\r\n cleanedUpFlights.push(lowercaseItem);\r\n }\r\n });\r\n\r\n return cleanedUpFlights.sort();\r\n}\r\n\r\n/**\r\n * Check if Git configs should be used\r\n * @param {string} version - CRS version. Example: v2 or v3 (case sensitive)\r\n * @param {string[]} flights Array of flights. Example: [\"testFlight\", \"prg-abcd\"]\r\n * @param {string} configIndexDocId. Example: cms/api/amp/experienceConfigIndex/BBUsYQa\r\n * @param {string} apptype. Example: edgeChromium\r\n * @returns true if git configs are supported\r\n */\r\nexport function shouldUseGitConfigs(version: string, flights: string[], configIndexDocId: string, apptype: string): boolean {\r\n // If app type is not defined or empty, do not use Git configs.\r\n // For local dev scenarion of individual experiences running in standalone, app type is blank.\r\n // Also app type is MUST param in Git configs, if app type is not present, we do not want to attempt Git configs too in prod.\r\n // If version is not present or it is not v3, do not support Git configs\r\n if (!apptype || !version || version !== CrsV3Endpoint) {\r\n return false;\r\n }\r\n\r\n // Return true if this does not have configIndexDocId\r\n return !configIndexDocId\r\n // Return true if this is a Git configs treatment flight\r\n || containsGitConfigsFlight(apptype, flights);\r\n}\r\n\r\n/**\r\n * Return true if Git configs treatment flight is the expected one for the current apptype\r\n * @param apptype Current apptype\r\n * @param flights array of flights active for current page instance\r\n */\r\nfunction containsGitConfigsFlight(apptype: string, flights: string[]): boolean {\r\n const expectedGitFlight = appTypeExpectedFlightMap.get(apptype);\r\n\r\n if (expectedGitFlight) {\r\n const prgFlights = getPeregrineFlights(flights);\r\n\r\n return !!(prgFlights && prgFlights.length && prgFlights.includes(expectedGitFlight));\r\n }\r\n\r\n return false;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Interface for defining property if this is network failure\r\n */\r\ninterface NetworkErrorInterface {\r\n isNetworkFailure: boolean;\r\n}\r\n\r\n/**\r\n * A network-related error.\r\n */\r\nexport type NetworkError = Error & NetworkErrorInterface;\r\n\r\n/**\r\n * Extending error class to instrument if this is network failure\r\n */\r\nexport class ConfigFetchError extends Error implements NetworkErrorInterface {\r\n isNetworkFailure: boolean;\r\n\r\n constructor(message: string, isNetworkFailure: boolean) {\r\n super(message);\r\n this.isNetworkFailure = isNetworkFailure;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * The start suffix for perf markings.\r\n */\r\nexport const perfMarkerStartSuffix = \"-start\";\r\n\r\n/**\r\n * The end suffix for perf markings.\r\n */\r\nexport const perfMarkerEndSuffix = \"-end\";\r\n\r\n/**\r\n * The perf marking name for crs initial merged config fetch.\r\n */\r\nexport const perfMarkerCrsConfigName = \"CrsConfig\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { perfMarkerEndSuffix, perfMarkerStartSuffix } from \"../constants\";\r\n\r\n/** PerfMarker interface for storing startTime and endMeasure callback. */\r\ninterface PerfMarker {\r\n endMeasure: (updatedDynamicMeasureName?: string) => void,\r\n startTime: number\r\n}\r\n\r\n/** Start and end markers. */\r\nconst _perfMarkers = {};\r\n\r\n/** PageTimings. */\r\nexport const _pageTimings = {};\r\n\r\n/** PerfTimeline to use for recording the values. */\r\nlet _perfTimeline: any;\r\n\r\n/**\r\n * Returns the pageTimings.\r\n * @return The pageTimings.\r\n */\r\nexport function getPerfMarkerHelperPageTimings() {\r\n return _pageTimings;\r\n}\r\n\r\n/**\r\n * Sets the perf timeline and the pagetimings.\r\n * Defaults perfTimeline to undefined.\r\n * @param perfTimeline - The perf timeline object\r\n */\r\nexport function initializePerfMarkerHelper(perfTimeline: any) {\r\n _perfTimeline = perfTimeline;\r\n}\r\n\r\n/**\r\n * Records the time stamp of the given marker.\r\n * Perf marker with StartSuffix should be called first, otherwise it will not do anything.\r\n * @param name - The marker name\r\n * @return An object storing the perfMarker name and the total time taken (end - start).\r\n */\r\nexport function addPerfMarker(name: string): { name: string; timeTaken: number; } {\r\n if (name.endsWith(perfMarkerStartSuffix)) {\r\n name = name.slice(0, name.length - perfMarkerStartSuffix.length);\r\n const newMarker: PerfMarker = {\r\n endMeasure: _perfTimeline && _perfTimeline.startMeasure(name).endMeasure,\r\n startTime: performance.now()\r\n };\r\n _perfMarkers[name] = newMarker;\r\n return;\r\n }\r\n\r\n if (name.endsWith(perfMarkerEndSuffix)) {\r\n name = name.slice(0, name.length - perfMarkerEndSuffix.length);\r\n if (_perfMarkers[name]) {\r\n const { endMeasure, startTime } = _perfMarkers[name];\r\n const timeTaken = Math.round(performance.now() - startTime);\r\n _pageTimings[name] = timeTaken;\r\n if (endMeasure) {\r\n endMeasure();\r\n }\r\n return {\r\n name,\r\n timeTaken\r\n };\r\n }\r\n return;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** Git configs flight treatment t with IndexedDB */\r\nexport const gitConfigsTreatmentWithIdb = \"prg-gitconfigs-t\";\r\n\r\n/** Git configs flight treatment t1 without IndexedDB */\r\nexport const gitConfigsTreatmentWithoutIdb = \"prg-gitconfigs-t1\";\r\n\r\n/** Git configs flight treatment t11 without IndexedDB */\r\nexport const gitConfigsTreatment1WithoutIdb = \"prg-gitconfigs-t11\";\r\n\r\n/**\r\n * Constants used for client resolver\r\n */\r\n// fetch type constants\r\nexport const featureManifests = \"feature-manifests\";\r\nexport const localizationManifests = \"loc-manifests\";\r\n\r\nexport const featureConfigs = \"feature-configs\";\r\nexport const localizationConfigs = \"loc-configs\";\r\n\r\n// instance constants\r\nexport const defaultInstance = \"default\";\r\n\r\n/**\r\n * Constants used for config caching\r\n */\r\nexport namespace ConfigCachingConstants {\r\n /** IndexedDB store */\r\n export const idbStoreName = \"Configurations_12\";\r\n\r\n /** IndexedDB name */\r\n export const idbName = \"wwConfigs\";\r\n\r\n /** Config staleness duration.\r\n * This is used by IndexedDB at client and ServerCache at SSR.\r\n * 604800000 = 7 days in milliseconds\r\n */\r\n export const configStalenessDuration = 604800000;\r\n\r\n /**\r\n * Default max of server side resolver's in-memory config cache.\r\n */\r\n export const serverLruConfigCacheMax = 10240;\r\n\r\n /** Idb config read promise name */\r\n export const idbInitPromiseNameKey = \"initializeIdbKey\";\r\n\r\n /** Idb config read promise name */\r\n export const idbReadPromiseNameKey = \"readConfigsFromIdbKey\";\r\n\r\n /** Idb config write promise name */\r\n export const idbWritePromiseNameKey = \"writeConfigsToIndexedDbKey\";\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IMockManager, MockConfigDictionary } from \"@msnews/core-contracts\";\r\n\r\nimport { getLocationSearch } from \"@msnews/isomorphic-util\";\r\n\r\nexport class MockManager implements IMockManager {\r\n /** Indicates if mock is requested*/\r\n private _mocksEnabled = false;\r\n\r\n private _mockConfigDictionary: MockConfigDictionary = {};\r\n\r\n /**\r\n * Initialize mock manager\r\n */\r\n constructor() {\r\n this._mockConfigDictionary = this.createMockDictionary();\r\n this._mocksEnabled = Object.keys(this._mockConfigDictionary).length !== 0;\r\n }\r\n\r\n /**\r\n * Returns the list of mocked config list\r\n */\r\n public get mockConfigDictionary(): MockConfigDictionary {\r\n return this._mockConfigDictionary;\r\n }\r\n\r\n /**\r\n * Returns if mock was requested\r\n */\r\n public get mocksEnabled(): boolean {\r\n return this._mocksEnabled;\r\n }\r\n\r\n /**\r\n * Gets the list of mocks from QSP\r\n * eg: item= mock:river/default|river/mockinst returns what to mock (river/default) with replacement sought (river/mockinst)\r\n * This is used only in local dev/TEST scenario. Please do not use this for PROD scenarios\r\n * @returns Dictionary of mock configs sought to be replaced\r\n */\r\n private createMockDictionary(): MockConfigDictionary {\r\n // Get all parameters that begin with 'mock:'\r\n const itemParams = new URLSearchParams(getLocationSearch()).getAll(\"item\").filter(item => /^mock:/.test(item));\r\n const mockConfigDictionary: MockConfigDictionary = {};\r\n\r\n itemParams.forEach((param) => {\r\n const [_, mockParam] = param.split(\":\");\r\n const [mockFrom, mockWith] = mockParam.split(\"|\");\r\n mockConfigDictionary[mockFrom] = mockWith;\r\n });\r\n return mockConfigDictionary;\r\n }\r\n}\r\nexport const mockManager = new MockManager();","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, ConfigOrigin, ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { ConfigReference, ExperienceConfig } from \"@msnews/config-data-types\";\r\nimport { defaultInstance, featureConfigs, featureManifests, gitConfigsTreatmentWithIdb, localizationConfigs } from \"./Constants\";\r\n\r\nimport { ConfigCacheProperties } from \"@msnews/core-contracts\";\r\nimport { getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { mockManager } from \"@msnews/mock-config\";\r\n\r\nexport const buildNumberRegex = /^\\d{8}\\.\\d+$/;\r\n\r\n/**\r\n * Get the cache key based on configRef object\r\n * @param {ConfigReference} configRef object\r\n * @returns The unique cache key from configRef\r\n */\r\nexport function getCacheKeyFromConfigRef(configRef: ConfigReference, appType?: string): string {\r\n if (!configRef) {\r\n return;\r\n }\r\n\r\n const { experienceType, instanceSrc, sharedNs } = configRef;\r\n const keys = [appType, experienceType, instanceSrc];\r\n if (sharedNs) {\r\n keys.push(sharedNs);\r\n }\r\n return keys.map(key => key || \"\").join(\"/\").toLowerCase();\r\n}\r\n\r\n/**\r\n * Map key received from CRS response to ConfigReference\r\n * @param key received in CRS response\r\n * @returns ConfigReference\r\n */\r\nexport function getConfigRefFromKey(key: string): ConfigReference {\r\n if (!key) {\r\n return null;\r\n }\r\n\r\n if (key.match(\"^shared/\")) {\r\n const [sharedPrefix, sharedNs, experienceType, instanceSrc] = key.split(\"/\");\r\n return { experienceType, instanceSrc, sharedNs };\r\n } else {\r\n const [experienceType, instanceSrc] = key.split(\"/\");\r\n return { experienceType, instanceSrc };\r\n }\r\n}\r\n\r\n/**\r\n * This function returns child configRefs\r\n * @param {ExperienceConfig} resolvedConfig: Experience resolved properties\r\n * @returns {Set} Array of Config Refs in the resolved config.\r\n */\r\nexport function getChildConfigRefs(resolvedConfig: ExperienceConfig): Set {\r\n const configRefSet = new Set();\r\n if (resolvedConfig && resolvedConfig.properties) {\r\n try {\r\n addConfigRefFromObject(resolvedConfig.properties, configRefSet);\r\n } catch (error) {\r\n // Log Error\r\n }\r\n }\r\n\r\n return configRefSet;\r\n}\r\n\r\n/**\r\n * Adds all config ref found in the object to the given set.\r\n * @param obj The object to search in.\r\n * @param indicies The set of ConfigReference to add to.\r\n */\r\nfunction addConfigRefFromObject(obj: any, indicies: Set): void {\r\n const configRef: any = obj.configRef;\r\n if (configRef && configRef.experienceType) {\r\n indicies.add(configRef);\r\n }\r\n\r\n for (const value of Object.values(obj)) {\r\n if (typeof (value) === \"object\" && value) {\r\n addConfigRefFromObject(value, indicies);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Gets Entity Reference string from entity object.\r\n * This is a combination of experienceType, instanceSrc and sharedNs (if exists), to access manifest hashes.\r\n * @param {ConfigReference} configReference config reference for the root config.\r\n * @param {boolean} isLocalizationConfig indicates if this is for localizationConfigs.\r\n * @returns {Map} returns the merged config map.\r\n */\r\nexport function getConfigReferencePath(configReference: ConfigReference, isLocalizationConfig = false): string {\r\n if (!configReference) {\r\n return;\r\n }\r\n\r\n // use default instance when it is localization configs or when instanceSrc isn't available.\r\n const instance = (isLocalizationConfig ? defaultInstance : configReference.instanceSrc) || defaultInstance;\r\n if (!configReference.sharedNs || isLocalizationConfig) {\r\n return `${configReference.experienceType}/${instance}`;\r\n } else {\r\n return `shared/${configReference.sharedNs}/${configReference.experienceType}/${instance}`;\r\n }\r\n}\r\n\r\n/**\r\n * Race between network and cache promise\r\n * Borrowed from https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook#cache-and-network-race\r\n * @param promises - Array of promises\r\n */\r\nexport function networkAndCacheRace(promises: Array>): Promise {\r\n // return a new promise\r\n return new Promise((resolve, reject) => {\r\n // iterate over each promise, 'chain' is the previously\r\n // returned value, or Promise.reject() for the first\r\n // iteration\r\n promises.reduce((chain: Promise, promise: Promise) => {\r\n // cast \"promise\" to a promise as other promise methods do\r\n promise = Promise.resolve(promise);\r\n // if this promise resolves, resolve the promise\r\n // we originally returned from networkAndCacheRace\r\n // (the resolve function ignore additional calls,\r\n // so first call wins)\r\n // Do nothing at catch because we want to wait for all promises.\r\n promise.then(resolve).catch(reject => {\r\n // do nothing\r\n });\r\n // build a chain of promises, where each catches from\r\n // the previous\r\n return chain.catch(() => {\r\n return promise;\r\n });\r\n }, Promise.reject()).catch(() => {\r\n // if we got here, none of the promises fulfilled\r\n reject(Error(\"Unable get a response from network or cache.\"));\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Return true if bundle, config and loc hash of current page is same as last page\r\n */\r\nexport function isConfigBundleLocHashSameAsLastPage(configCacheProperties: ConfigCacheProperties): boolean {\r\n if (!configCacheProperties) {\r\n return false;\r\n }\r\n\r\n const {bundleHash, lastBundleHash, configHash, lastConfigHash, locHash, lastLocHash} = configCacheProperties;\r\n if (lastBundleHash && lastBundleHash === bundleHash\r\n && lastConfigHash && lastConfigHash === configHash\r\n && lastLocHash && lastLocHash === locHash) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\nexport function sendAppError(appErrorCallback: (data: AppError) => void, appError: AppError): void {\r\n if (appErrorCallback) {\r\n appErrorCallback(appError);\r\n }\r\n}\r\n\r\n/**\r\n * Check if IndexedDB caching is enabled based on the flight treatment\r\n * @param flights Array of flights\r\n * @returns true if this is git configs treatment with indexedDB caching enabled\r\n */\r\nexport function enableIdbCaching(flights: string[]): boolean {\r\n return flights && flights.indexOf(gitConfigsTreatmentWithIdb) > -1;\r\n}\r\n\r\n/**\r\n * Get build number given associated app-type from published bundle info\r\n * eg: https://assets.msn.com/bundles/v1/edgeChromium/20210112.159/v, https://assets.msn.com/bundles/v1/edgeChromium/latest/v)\r\n * This is used only in local dev/TEST scenario. Please do not use this for PROD scenarios\r\n * @param buildVersion Build version\r\n * @param appType associated app type for that build\r\n * @returns Associated build number\r\n */\r\nexport async function getBuildNumberAsync(buildVersion: string, appType: string): Promise {\r\n // Provide QSP build number override to buildVersion specified in bundleInfo\r\n let buildNumber: string;\r\n const itemParams = new URLSearchParams(getLocationSearch()).getAll(\"item\");\r\n const itemSpalink = itemParams ?\r\n itemParams.find((param) => (param && param.indexOf(\"spalink:\") === 0)) :\r\n undefined;\r\n if (itemSpalink) {\r\n buildNumber = itemSpalink.replace(\"spalink:\", \"\").replace(\"/debug\", \"\");\r\n }\r\n const build = buildNumber || buildVersion;\r\n if (!build || !appType || (build !== \"latest\" && build !== \"rolling\" &&\r\n // Check if build number doesn't look legit (eg: 20210112.159)\r\n !buildNumberRegex.test(build))) {\r\n throw new Error(`Arguments are incorrect. Check buildVersion: ${build} appType: ${appType}`);\r\n }\r\n // Adding a datetime qsp to ensure we don't get cached results for assets.msn.com/bundles/v1/rolling\r\n const fetchUrl = `https://assets.msn.com/bundles/v1/${appType}/${build}/v?${(new Date()).getTime()}`;\r\n let response: Response;\r\n try {\r\n response = await fetch(fetchUrl);\r\n if (!response || !response.ok) {\r\n throw new Error(`Response not OK, Status: ${response.status}, StatusText: ${response.statusText}`);\r\n }\r\n return (await response.text()).trim();\r\n } catch (error) {\r\n throw new Error(`getBuildNumberAsync Fetch Url: ${fetchUrl}, ${error}`);\r\n }\r\n}\r\n\r\n/**\r\n * Helper method that indicates whether configs matching the right config-type are from local\r\n * @param configType\r\n * @param configOrigins\r\n */\r\nexport function useLocalConfigs(configType: string, configOrigins: ConfigOrigins): boolean {\r\n return isFeatureConfigType(configType)\r\n ? isLocalOrigin(configOrigins && configOrigins.feature)\r\n : isLocalOrigin(configOrigins && configOrigins.loc);\r\n}\r\n\r\n/**\r\n * Helper method to indicate if config type is feature config related\r\n * @param configType\r\n */\r\nfunction isFeatureConfigType(configType: string): boolean {\r\n return configType === featureConfigs || configType === featureManifests;\r\n}\r\n\r\n/**\r\n * Helper method to indicate if a specific config type (feature or loc) is local\r\n * @param configOrigin\r\n */\r\nfunction isLocalOrigin(configOrigin: ConfigOrigin): boolean {\r\n return configOrigin === ConfigOrigin.Local;\r\n}\r\n\r\n/**\r\n * Helper method to set the right path to local file system in local dev work flow\r\n * @param configType loc-configs or feature-configs\r\n * @param configReference combination of experienceType, instance source and shared namespace\r\n * @param appType\r\n */\r\nexport function getLocalDevPrefix(configType: string, configReference: string, appType: string): string {\r\n let hasMockReplacement = false;\r\n const mockReplacement = mockManager.mocksEnabled\r\n && mockManager.mockConfigDictionary\r\n && mockManager.mockConfigDictionary[configReference];\r\n if (mockReplacement) {\r\n configReference = mockReplacement;\r\n hasMockReplacement = true;\r\n }\r\n\r\n let prependConfigType: string;\r\n if (hasMockReplacement) {\r\n prependConfigType = \"mock\";\r\n } else if (configType === localizationConfigs) {\r\n prependConfigType = \"dev/loc\";\r\n } else {\r\n prependConfigType = \"prod\";\r\n }\r\n const prependConfigLocation = /^shared/.test(configReference) ? configReference : `${appType}/${configReference}`;\r\n return `${prependConfigType}/${prependConfigLocation}`;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { memoize } from \"lodash-es\";\r\nimport { useLocalConfigs } from \"../../../utilities\";\r\n\r\n/**\r\n * BlobFetcher\r\n * This is for downloading the blob according to the url.\r\n */\r\n\r\n// todo: use PCS headdata response here for the assets.msn.com hardcoded part?\r\nconst gitConfigBaseUrl = \"https://assets.msn.com/periconfigs/\";\r\n\r\n// todo: Figure out how to not specify the port\r\nconst gitLocalConfigBaseUrl = \"https://localhost.msn.com:9000/\";\r\n\r\n// Memoize the fetchAsyncNotMemoized function to return promises when it is continuing to fetch.\r\nexport const fetchAsync = memoize(fetchAsyncNotMemoized);\r\n\r\n/**\r\n * This function fetches the file from a combination of provided relative url and the const GIT config base url.\r\n * @param relativeUrl to be used to fetch the blob\r\n * @param configType featureConfigs | featureManifests | localizationConfigs | localizationManifests configType\r\n * @param configOrigins Indicates if configs should be served from local repo\r\n */\r\nexport async function fetchAsyncNotMemoized(relativeUrl: string, configType?: string, configOrigins?: ConfigOrigins): Promise {\r\n if (!relativeUrl) {\r\n // Logs error later in ClientResolver.ts\r\n throw new Error(\"BlobFetcher.ts: Fetch Error: Relative Url is null or undefined.\");\r\n }\r\n const fetchUrl = useLocalConfigs(configType, configOrigins)\r\n ? gitLocalConfigBaseUrl + relativeUrl // File names are case sensitive for local look up but not for Azure Blob Storage\r\n : gitConfigBaseUrl + relativeUrl.toLowerCase();\r\n const fetchPromise = fetch(fetchUrl).then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n\r\n // Logs error later in ClientResolver.ts\r\n throw new Error(`Non-200 response, Status: ${response.status}, StatusText: ${response.statusText}, fetch url: ${fetchUrl}`);\r\n }).catch(error => {\r\n // Catches json parsing and fetch errors.\r\n throw new Error(`BlobFetcher.ts: Fetch Error: fetch url: ${fetchUrl}, error: ${error}.`);\r\n });\r\n\r\n return fetchPromise;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getLocalDevPrefix, useLocalConfigs } from \"../../../utilities\";\r\n\r\nimport { ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { ExperienceIndex } from \"@msnews/config-data-types\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { memoize } from \"lodash-es\";\r\n\r\n/**\r\n * ConfigIndexService class\r\n * This is for fetching and parsing the Config Index into an easily consumable form.\r\n */\r\nexport class ClientConfigIndexService {\r\n /** null config index fetches to note as error later */\r\n private failedConfigIndexFetches: string[] = [];\r\n\r\n /** Application Type */\r\n private appType: string;\r\n\r\n /** Indicates if configs should be served from local repo */\r\n private configOrigins: ConfigOrigins;\r\n\r\n /**\r\n * Initialize client config index service.\r\n * @param {appType} appType\r\n * @param {ConfigOrigins } Indicates if configs should be served from local repo\r\n */\r\n constructor(appType: string, configOrigins: ConfigOrigins) {\r\n this.appType = appType;\r\n this.configOrigins= configOrigins;\r\n this.fetchAndParseConfigIndex = memoize(this.fetchAndParseConfigIndex, (...args) => args.join(\"/\"));\r\n }\r\n\r\n /**\r\n * This function fetches and parses config index file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} hashedFileName config index hashed file name from the manifest file.\r\n */\r\n public async fetchAndParseConfigIndex(configType: string, configReference: string, hashedFileName: string): Promise {\r\n // In prod scenario, we don't proceed if hashedFileName is empty\r\n // In local scenario, hashed name could be empty\r\n // If hashed file name is null/undefined AND it's not local scenario, return undefined\r\n const isLocalConfigs = useLocalConfigs(configType, this.configOrigins);\r\n if (!hashedFileName && !isLocalConfigs) {\r\n return undefined;\r\n }\r\n\r\n const relativeUrl = isLocalConfigs\r\n ? `${getLocalDevPrefix(configType, configReference, this.appType)}/index.json`\r\n : `${configType}/${configReference}/index.json/${hashedFileName}`;\r\n\r\n try {\r\n return await fetchAsync(relativeUrl, configType, this.configOrigins);\r\n } catch (error) {\r\n if (!isLocalConfigs) {\r\n this.failedConfigIndexFetches.push(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns the list of failed config index fetches\r\n */\r\n public getFailedConfigIndexFetches(): string[] {\r\n return this.failedConfigIndexFetches;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getLocalDevPrefix, useLocalConfigs } from \"../../../utilities\";\r\n\r\nimport { ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { ExperienceConfig } from \"@msnews/config-data-types\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { memoize } from \"lodash-es\";\r\n\r\n/**\r\n * ClientConfigService class\r\n * This is for fetching and parsing the Config into an easily consumable form.\r\n */\r\nexport class ClientConfigService {\r\n /** Array for keeping track of the null fetches */\r\n private failedConfigFetches: string[] = [];\r\n\r\n /** Application Type */\r\n private appType: string;\r\n\r\n /** Indicates if configs should be served from local repo */\r\n private configOrigins: ConfigOrigins;\r\n\r\n /**\r\n * Initialize client config service.\r\n * @param {appType} appType\r\n * @param {ConfigOrigins} Indicates if configs should be served from local repo\r\n */\r\n constructor(appType: string, configOrigins: ConfigOrigins) {\r\n this.appType = appType;\r\n this.configOrigins = configOrigins;\r\n this.fetchAndParseConfig = memoize(this.fetchAndParseConfig, (...args) => args.join(\"/\"));\r\n }\r\n\r\n /**\r\n * This function fetches and parses config file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} configFileName config src file name.\r\n * @param {string} hashedFileName config hashed file name from the manifest file.\r\n */\r\n public async fetchAndParseConfig(configType: string, configReference: string, configFileName: string, hashedFileName: string): Promise {\r\n // In prod scenario, we don't proceed if hashedFileName is empty\r\n // In local scenario, hashed name could be empty\r\n // If hashed file name is null/undefined AND it's not local scenario, return undefined\r\n const isLocalConfigs = useLocalConfigs(configType, this.configOrigins);\r\n if (!hashedFileName && !isLocalConfigs) {\r\n return undefined;\r\n }\r\n\r\n const relativeUrl = isLocalConfigs\r\n ? `${getLocalDevPrefix(configType, configReference, this.appType)}/${configFileName}`\r\n : `${configType}/${configReference}/${configFileName}/${hashedFileName}`;\r\n\r\n try {\r\n return await fetchAsync(relativeUrl, configType, this.configOrigins);\r\n } catch (error) {\r\n if (!isLocalConfigs) {\r\n this.failedConfigFetches.push(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns the list of failed config fetches.\r\n */\r\n public getFailedConfigFetches(): string[] {\r\n return this.failedConfigFetches;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigOrigins } from \"@msnews/core-contracts\";\r\nimport { Manifest } from \"@msnews/config-data-types\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { isEmpty } from \"lodash-es\";\r\nimport { useLocalConfigs } from \"../../../utilities\";\r\n\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\nexport class ClientManifestService {\r\n /** Manifest map to quickly return already fetched manifests. */\r\n private manifestsMap: Map = new Map();\r\n\r\n /** Application Type */\r\n private appType: string;\r\n\r\n /** Indicates if configs should be served from local repo */\r\n private configOrigins: ConfigOrigins;\r\n\r\n /**\r\n * Initialize client manifest service based on app type and if configs should be served from local repo\r\n * @param appType\r\n * @param ConfigOrigins Indicates if configs should be served from local repo\r\n */\r\n constructor(appType: string, configOrigins: ConfigOrigins) {\r\n this.appType = appType;\r\n this.configOrigins= configOrigins;\r\n }\r\n\r\n /**\r\n * This function fetches and parses manifest file from azure blob storage.\r\n * @param {string} manifestType config type, loc-manifests or feature-manifests\r\n * @param {string} version build version\r\n */\r\n public async fetchAndParseManifest(manifestType: string, version: string): Promise {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n\r\n const relativeUrl = `${manifestType}/${this.appType}/${version}.json`;\r\n\r\n // We don't need a promise map check because it's done in BlobFetcher.\r\n if (!this.manifestsMap.has(manifestType)) {\r\n try {\r\n const manifestBlobResult = await fetchAsync(relativeUrl);\r\n this.manifestsMap.set(manifestType, manifestBlobResult);\r\n if (isEmpty(manifestBlobResult)) {\r\n throw new Error(`Manifest response is ok but empty or undefined, relative url: ${relativeUrl}`);\r\n }\r\n } catch (error) {\r\n // Update the value to null no matter what the error is.\r\n this.manifestsMap.set(manifestType, null);\r\n throw new Error(`ClientManifestService.ts: ${error}`);\r\n }\r\n }\r\n\r\n // Return for easy testing\r\n // todo: would this cause perf problem since feature manifest is huge?\r\n return this.manifestsMap.get(manifestType);\r\n }\r\n\r\n /**\r\n * Gets the hashed file name from the manifest by creating config index map key.\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n public getConfigIndexHashedFileName(configReference: string, manifestType: string): string {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n\r\n const configIndexKey = `${configReference}/index.json`;\r\n return this.getFromManifest(configIndexKey, manifestType);\r\n }\r\n\r\n /**\r\n * Gets the hashed file name from the manifest by creating config map key.\r\n * @param {string} configReference config reference made from entity information.\r\n * @param {string} configFileName config src file name.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n public getConfigHashedFileName(configReference: string, configFileName: string, manifestType: string): string {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n\r\n const configKey = `${configReference}/${configFileName}`;\r\n return this.getFromManifest(configKey, manifestType);\r\n }\r\n\r\n /**\r\n * Gets the value according to cache key from the local map cache.\r\n * @param {string} cacheKey cache key to read from the map, either for index or config.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n private getFromManifest(cacheKey: string, manifestType: string): string {\r\n if (!this.manifestsMap || !this.manifestsMap.get(manifestType)) {\r\n return undefined;\r\n }\r\n\r\n const manifest = this.manifestsMap.get(manifestType);\r\n if (manifest && manifest.fileHashes) {\r\n return manifest.fileHashes[cacheKey.toLowerCase()];\r\n }\r\n\r\n throw new Error(`ClientManifestService.ts: Manifest is defined but does not have fileHashes: ${cacheKey}: cacheKey snippet of manifest: ${JSON.stringify(manifest).substr(0, 100)}`);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { isArray, mergeWith } from \"lodash-es\";\r\n\r\nimport { ExperienceConfig } from \"@msnews/config-data-types\";\r\n\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\n\r\n/**\r\n * Merges config objects.\r\n * @private\r\n * @param {ExperienceConfigWrapper[]} configs - an array of config documents\r\n * @param {string} experienceType - experienceType\r\n * @return ExperienceConfig - returns merged config based on a set of rules\r\n */\r\nexport function mergeConfigs(configs: ExperienceConfig[]): ExperienceConfig {\r\n if (!configs || configs.length < 1) {\r\n return null;\r\n }\r\n\r\n const result: ExperienceConfig = configs[0];\r\n\r\n // skip the 0th item as it is assigned to result above, only merge properties section\r\n for (let count = 1; count < configs.length; count++) {\r\n result.properties = mergeWith(result.properties, configs[count].properties, configMergeCustomizer);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Customizer for merge. We are explcitly overriding the array from taget to source. No array elements from source are preserved.\r\n * @private\r\n * @param {any} srcValue - source object to merge. Can be of type any\r\n * @param {any} objValue - target object to merge. Can be of type any\r\n * @return target Object when the type is array. Otherwise uses default behavior of merge.\r\n */\r\nfunction configMergeCustomizer(srcValue: any, objValue: any): any {\r\n if (isArray(srcValue)) {\r\n return objValue;\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Browser version operators enum\r\n */\r\nexport enum BrowserVersionOperator {\r\n \"Equals\" = \"equals\",\r\n \"GreaterThan\" = \"greaterThan\",\r\n \"LessThan\" = \"lessThan\",\r\n \"NotEquals\" = \"notEquals\",\r\n \"OneOf\" = \"oneOf\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BrowserVersionOperator, IStringTargetScopeType, PageRequestTargetScope } from \"@msnews/config-data-types\";\r\n\r\n/**\r\n * TargetScopeMatcher\r\n * This is for comparing targetscope from the config with targetscope from the page.\r\n */\r\n\r\n/**\r\n * basic version of target scope that only checks market currently.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope matches with config target scope, otherwise false\r\n */\r\nexport function targetScopeMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n // if target scope is undefined for a config entry, we treat that as default config and apply it\r\n if (!configTargetScope) {\r\n return true;\r\n }\r\n\r\n return (audienceModeMatched(configTargetScope, pageTargetScope)\r\n && browserTypeMatched(configTargetScope, pageTargetScope)\r\n && deviceTypeMatched(configTargetScope, pageTargetScope)\r\n && domainMatched(configTargetScope, pageTargetScope)\r\n && experimentMatched(configTargetScope, pageTargetScope)\r\n && marketMatched(configTargetScope, pageTargetScope)\r\n && ocidMatched(configTargetScope, pageTargetScope)\r\n && osMatched(configTargetScope, pageTargetScope)\r\n && pageTypeMatched(configTargetScope, pageTargetScope)\r\n && platformMatched(configTargetScope, pageTargetScope));\r\n}\r\n\r\n/**\r\n * function to check if current audienceMode type matches target audienceMode type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope audienceMode matches with config target scope audienceMode, otherwise false\r\n */\r\nfunction audienceModeMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return !configTargetScope.audienceMode || pageTargetScope.audienceMode === configTargetScope.audienceMode;\r\n}\r\n\r\n/**\r\n * function to check if current browser type matches target browser type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope browser type matches with config target scope browser type, otherwise false\r\n */\r\nfunction browserTypeMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n if (!configTargetScope.browser\r\n || !configTargetScope.browser.version\r\n || !configTargetScope.browser.browserType) {\r\n return true;\r\n }\r\n\r\n // Proceed if browserType exists and it matches\r\n if (pageTargetScope.browser\r\n && pageTargetScope.browser.browserType\r\n && pageTargetScope.browser.browserType === configTargetScope.browser.browserType) {\r\n\r\n const pcsBrowserVersion = pageTargetScope.browser.version;\r\n if (!pcsBrowserVersion) {\r\n return true;\r\n }\r\n\r\n const configBrowserVersion = configTargetScope.browser.version;\r\n\r\n // If browser version in config index scope is \"87\", match with \"87\" from browser version in page target scope\r\n if (typeof configBrowserVersion === \"string\"\r\n && pcsBrowserVersion === configBrowserVersion) {\r\n return true;\r\n }\r\n\r\n // If browser version is object, check if matches.\r\n if (typeof configBrowserVersion === \"object\") {\r\n const pcsIntBrowserVersion = parseInt(pcsBrowserVersion as string);\r\n for (const operator in configBrowserVersion) {\r\n const value = configBrowserVersion[operator];\r\n\r\n // value is of type number so it can be 0. Hence check for undefined or null explicitly\r\n if (value !== undefined && value !== null) {\r\n switch (operator) {\r\n case BrowserVersionOperator.Equals:\r\n if (pcsIntBrowserVersion !== value) { return false; }\r\n break;\r\n\r\n case BrowserVersionOperator.GreaterThan:\r\n if (!(pcsIntBrowserVersion > value)) { return false; }\r\n break;\r\n\r\n case BrowserVersionOperator.LessThan:\r\n if (!(pcsIntBrowserVersion < value)) { return false; }\r\n break;\r\n\r\n case BrowserVersionOperator.NotEquals:\r\n if (pcsIntBrowserVersion === value) { return false; }\r\n break;\r\n\r\n case BrowserVersionOperator.OneOf:\r\n if ((value as number[]).indexOf(pcsIntBrowserVersion) === -1) { return false; }\r\n break;\r\n\r\n default: return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * function to check if current device type matches target device type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope device type matches with config target scope device type, otherwise false\r\n */\r\nfunction deviceTypeMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return !configTargetScope.deviceFormFactor || pageTargetScope.deviceFormFactor === configTargetScope.deviceFormFactor;\r\n}\r\n\r\n/**\r\n * Check if current domain matches target domain\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return Whether the current target scope domain matches with config target scope domain\r\n */\r\nfunction domainMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return !configTargetScope.domain || pageTargetScope.domain === configTargetScope.domain;\r\n}\r\n\r\n/**\r\n * function to check if current experiment id matches with the requested scope experiment id.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope experiment matches with config target scope experiment, otherwise false\r\n */\r\nfunction experimentMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n pageTargetScope.pageExperiments = pageTargetScope.pageExperiments || [];\r\n\r\n if (typeof configTargetScope.experimentId != \"string\" || Object.keys(configTargetScope.experimentId).length === 0\r\n || pageTargetScope.pageExperiments.indexOf(configTargetScope.experimentId) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Compare the strings case insensitive.\r\n * @private\r\n * @param {string} lhs The string to compare.\r\n * @param {string} rhs The string to compare against.\r\n * @return {number} - true if the strings equal case insensitive.\r\n */\r\nfunction stringsEqualCaseInsensitive(lhs: string, rhs: string): boolean {\r\n return (lhs || \"\").localeCompare(rhs || \"\", undefined, { sensitivity: \"accent\" }) === 0;\r\n}\r\n\r\n/**\r\n * function to check if current market scope match with target scope market.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope market matches with config target scope market, otherwise false\r\n */\r\nfunction marketMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n // if locale is not part of target scope, we assume it is applicable for all locale.\r\n // Separated out this if condition to have clarity about this behavior.\r\n if (!configTargetScope.locale) {\r\n return true;\r\n }\r\n\r\n const targetLocale = configTargetScope.locale;\r\n const currentLocale = pageTargetScope.locale;\r\n\r\n if ((!targetLocale.language || stringsEqualCaseInsensitive(targetLocale.language, currentLocale.language)) &&\r\n (!targetLocale.market || stringsEqualCaseInsensitive(targetLocale.market, currentLocale.market)) &&\r\n (!targetLocale.script || stringsEqualCaseInsensitive(targetLocale.script, currentLocale.script))) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * function to check if current ocid matches target scope ocid\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope ocid matches with config target scope ocid, otherwise false\r\n */\r\nfunction ocidMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return stringTargetScopeTypeMatched(configTargetScope.ocid, pageTargetScope.ocid as string);\r\n}\r\n\r\n/**\r\n * function to check if current operating system type matches target operating system type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope operating system type matches with config target scope operating system type, otherwise false\r\n */\r\nfunction osMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return !configTargetScope.os || pageTargetScope.os === configTargetScope.os;\r\n}\r\n\r\n/**\r\n * function to check if current pagetype matches target scope\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope pagetype matches with config target scope pagetype, otherwise false\r\n */\r\nfunction pageTypeMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n // If there is no pageType in config scope, meaning it should match.\r\n if (!configTargetScope.pageType) {\r\n return true;\r\n }\r\n\r\n // If there is pageType in config scope but no pageType in pageTargetScope, it's not matching\r\n if (!pageTargetScope.pageType) {\r\n return false;\r\n }\r\n\r\n const pcsPageType = pageTargetScope.pageType as string;\r\n const configPageType = configTargetScope.pageType;\r\n\r\n // Check if page type in config and pcs matches\r\n if (typeof configPageType === \"string\"\r\n && configPageType === pcsPageType) {\r\n return true;\r\n }\r\n\r\n if (!configPageType\r\n || typeof configPageType !== \"object\") {\r\n return false;\r\n }\r\n\r\n // If pageType is exact\r\n // Example: exact: \"dhp\"\r\n if (configPageType.exact\r\n && configPageType.exact.toUpperCase() === pcsPageType.toUpperCase()) {\r\n return true;\r\n }\r\n\r\n // Example:\r\n // config scope segments: { “0”: “news”, “1”: “politics” }\r\n // Does not match for above config scope when pcs pagetype: \"news\"\r\n // Does not match for above config scope when pcs pagetype: \"news::coronavirus\"\r\n // Match for above config scope when pcs pagetype: \"news::politics\"\r\n // Match for above config scope when pcs pagetype: \"news::politics::election\"\r\n if (configPageType.segments) {\r\n const segments = configPageType.segments;\r\n const pcsPageTypeSegments = pcsPageType.split(\"::\");\r\n if (pcsPageTypeSegments && pcsPageTypeSegments.length > 0) {\r\n let index = 0;\r\n for (const key in segments) {\r\n const value = segments[key];\r\n if (!value\r\n || typeof value !== \"string\"\r\n // If a segment match is needed for an index where we don't have a segment, then we return false.\r\n || index >= pcsPageTypeSegments.length\r\n // See if the segment values match, if they don't then we return false.\r\n || value.toUpperCase() !== pcsPageTypeSegments[index].toUpperCase()) {\r\n return false;\r\n }\r\n\r\n index++;\r\n }\r\n\r\n // Make sure that config scope pagetype segments are traversed and return true.\r\n return Object.keys(segments).length === index;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * function to check if current scope platform type matches target scope platform type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\nfunction platformMatched(configTargetScope: PageRequestTargetScope, pageTargetScope: PageRequestTargetScope): boolean {\r\n return !configTargetScope.platform || pageTargetScope.platform === configTargetScope.platform;\r\n}\r\n\r\n/**\r\n * function to check if string target scope matches the page value.\r\n * @param configStringValue - string or IStringTargetScopeType value from the config.\r\n * @param pageStringValue - page target string value, cannot be an object.\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\nexport function stringTargetScopeTypeMatched(configStringValue: string | IStringTargetScopeType, pageStringValue: string): boolean {\r\n if (!configStringValue) {\r\n return true;\r\n }\r\n\r\n if (!pageStringValue) {\r\n return false;\r\n }\r\n\r\n // Check if string typed ocid in config and PCS matches\r\n if (typeof configStringValue === \"string\" && stringsEqualCaseInsensitive(configStringValue, pageStringValue)) {\r\n return true;\r\n }\r\n\r\n // if its not an object, then return false.\r\n if (typeof configStringValue !== \"object\") {\r\n return false;\r\n }\r\n\r\n const lowerCasePageStringValue = pageStringValue.toLowerCase();\r\n if (configStringValue.startsWith && !lowerCasePageStringValue.startsWith(configStringValue.startsWith.toLowerCase())) {\r\n return false;\r\n }\r\n\r\n if (configStringValue.endsWith && !lowerCasePageStringValue.endsWith(configStringValue.endsWith.toLowerCase())) {\r\n return false;\r\n }\r\n\r\n if (configStringValue.equals && !stringsEqualCaseInsensitive(configStringValue.equals, pageStringValue)) {\r\n return false;\r\n }\r\n\r\n if (configStringValue.notEquals && stringsEqualCaseInsensitive(configStringValue.notEquals, pageStringValue)) {\r\n return false;\r\n }\r\n\r\n if (configStringValue.contains && !lowerCasePageStringValue.includes(configStringValue.contains.toLowerCase())) {\r\n return false;\r\n }\r\n\r\n if (configStringValue.oneOf && configStringValue.oneOf.indexOf(pageStringValue) === -1) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigOrigin, ConfigOrigins, ResolverEnvironment } from \"@msnews/core-contracts\";\r\nimport { ConfigReference, ExperienceConfig, ExperienceConfigLink, PageRequestTargetScope } from \"@msnews/config-data-types\";\r\nimport { featureConfigs, featureManifests, localizationConfigs, localizationManifests } from \"../../../utilities/Constants\";\r\nimport { getBuildNumberAsync, getConfigReferencePath } from \"../../../utilities/Utilities\";\r\n\r\nimport { ClientConfigIndexService } from \"./ClientConfigIndexService\";\r\nimport { ClientConfigService } from \"./ClientConfigService\";\r\nimport { ClientManifestService } from \"./ClientManifestService\";\r\nimport { mergeConfigs } from \"./ClientConfigMerger\";\r\nimport { targetScopeMatched } from \"./TargetScopeMatcher\";\r\n\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\nexport class ClientSingleConfigResolver {\r\n /** Application Type */\r\n private appType: string;\r\n\r\n /** Target Scope */\r\n private targetScope: PageRequestTargetScope;\r\n\r\n /** Build Version */\r\n private buildVersion: string;\r\n\r\n /** Client Manifest Service */\r\n private clientManifestService: ClientManifestService;\r\n\r\n /** Client Config Index Service */\r\n private clientConfigIndexService: ClientConfigIndexService;\r\n\r\n /** Client Config Service */\r\n private clientConfigService: ClientConfigService;\r\n\r\n /** Indicate if configs should be served from local repo */\r\n private configOrigins: ConfigOrigins;\r\n\r\n /** Build number associated with app type */\r\n private _buildNumber: string;\r\n\r\n /**\r\n * Initialize single config client resolver based on fetching parameters.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment: ResolverEnvironment) {\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ClientSingleConfigResolver.ts: ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n\r\n this.appType = resolverEnvironment.appType;\r\n this.targetScope = resolverEnvironment.targetScope;\r\n this.buildVersion = resolverEnvironment.configServiceParameters.buildVersion;\r\n this.configOrigins = resolverEnvironment.configOrigins;\r\n\r\n this.clientManifestService = new ClientManifestService(this.appType, this.configOrigins);\r\n this.clientConfigIndexService = new ClientConfigIndexService(this.appType, this.configOrigins);\r\n this.clientConfigService = new ClientConfigService(this.appType, this.configOrigins);\r\n }\r\n\r\n /**\r\n * This function fetches and parses manifest file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} appType application type\r\n * @param {string} version build version\r\n */\r\n public async resolveConfigAsync(entity: ConfigReference): Promise {\r\n // todo: consider using promise.then.then train to avoid awaiting for individual steps.\r\n const featureEntityReference = getConfigReferencePath(entity);\r\n const localizationEntityReference = getConfigReferencePath(entity, true);\r\n\r\n this.buildNumber = this.tryGetBuildNumber() || await getBuildNumberAsync(this.buildVersion, this.appType);\r\n\r\n // fetch the manifest files\r\n const featureManifestTask = this.clientManifestService.fetchAndParseManifest(featureManifests, this.buildNumber);\r\n const localizationManifestTask = this.clientManifestService.fetchAndParseManifest(localizationManifests, this.buildNumber);\r\n\r\n // wait for manifest fetches, they are used within ClientManifestService so no return\r\n await Promise.all([featureManifestTask, localizationManifestTask]);\r\n\r\n // try to find configIndexReference in manifest file\r\n const featureIndexHashedFileName = this.clientManifestService.getConfigIndexHashedFileName(featureEntityReference, featureManifests);\r\n const localizationIndexHashedFileName = this.clientManifestService.getConfigIndexHashedFileName(localizationEntityReference, localizationManifests);\r\n\r\n // try to get config index files\r\n const featureConfigIndexTask = this.clientConfigIndexService.fetchAndParseConfigIndex(featureConfigs, featureEntityReference, featureIndexHashedFileName);\r\n const localizationConfigIndexTask = this.clientConfigIndexService.fetchAndParseConfigIndex(localizationConfigs, localizationEntityReference, localizationIndexHashedFileName);\r\n\r\n const indexResults = await Promise.all([featureConfigIndexTask, localizationConfigIndexTask]).then((results) => {\r\n return {\r\n featureIndex: results[0],\r\n localizationIndex: results[1]\r\n };\r\n });\r\n\r\n // maybe skip these just by returning .configs of index, since its default\r\n const featureConfigPaths = indexResults.featureIndex && indexResults.featureIndex.configs || undefined;\r\n const localizationConfigPaths = indexResults.localizationIndex && indexResults.localizationIndex.configs || undefined;\r\n\r\n const configTasks: Promise[] = [];\r\n // get the config tasks according to list of config paths from the index\r\n this.fetchMathingConfigs(configTasks, featureConfigPaths, featureManifests, featureConfigs, featureEntityReference);\r\n this.fetchMathingConfigs(configTasks, localizationConfigPaths, localizationManifests, localizationConfigs, localizationEntityReference);\r\n if (configTasks.length == 0) {\r\n return undefined;\r\n }\r\n\r\n // await all the configs and merge them\r\n const configsToMerge = await Promise.all(configTasks).then(results => results);\r\n const filteredConfigs = configsToMerge.filter(config => config != null); // Remove null or undefined configs\r\n const mergedConfig = mergeConfigs(filteredConfigs);\r\n\r\n return mergedConfig;\r\n }\r\n\r\n /**\r\n * Checks if the config paths match the targetscope of the page.\r\n * If it matches, starts config fetch task and adds it to the configTasks input parameter.\r\n * @param {Promise[]} configTasks array consisting of config fetching tasks, will be updated in this function\r\n * @param {ExperienceConfigLink[]} configPaths config paths from the config index file\r\n * @param {string} manifestType config type, loc-manifests or feature-manifests\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference configReference to use when getting the hashed file name\r\n */\r\n private fetchMathingConfigs(configTasks: Promise[], configPaths: ExperienceConfigLink[], manifestType: string, configType: string, configReference: string): void {\r\n if (!configPaths || configPaths.length == 0) {\r\n return;\r\n }\r\n\r\n configPaths.forEach(configPath => {\r\n if (targetScopeMatched(configPath.targetScope, this.targetScope)) {\r\n const configFileName = configPath.src;\r\n const hashedFileName = this.clientManifestService.getConfigHashedFileName(configReference, configFileName, manifestType);\r\n configTasks.push(this.clientConfigService.fetchAndParseConfig(configType, configReference, configFileName, hashedFileName));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Returns all failed fetches for throwing errors.\r\n */\r\n public getFailedFetches(): string[] {\r\n const allNullFetches: string[] = [];\r\n const configNullFetches = this.clientConfigService.getFailedConfigFetches();\r\n if (configNullFetches.length > 0) {\r\n allNullFetches.push(...configNullFetches);\r\n }\r\n const configIndexNullFetches = this.clientConfigIndexService.getFailedConfigIndexFetches();\r\n if (configIndexNullFetches.length > 0) {\r\n allNullFetches.push(...configIndexNullFetches);\r\n }\r\n return allNullFetches;\r\n }\r\n\r\n public get buildNumber(): string { return this._buildNumber; }\r\n public set buildNumber(value: string) { this._buildNumber = value; }\r\n\r\n /**\r\n * Returns build number if already stored or in prod scenario and returns null for local dev scenario\r\n * (where feature configs are from local repo but localized configs are from PROD (blob storage)\r\n * so that it can be fetched asynchronously later on\r\n */\r\n private tryGetBuildNumber(): string {\r\n if (this.buildNumber) {\r\n return this.buildNumber; // If it has already been set, return it\r\n } else if (this.configOrigins.feature === ConfigOrigin.Local && this.configOrigins.loc === ConfigOrigin.Production) {\r\n // Return null so build number can be fetched asynchronously later\r\n // Fetch build number look up *only* for feature configs local and localized configs from PROD blob storage\r\n return null;\r\n } else { // PROD scenario\r\n return this.buildVersion; // First time look up for prod scenario. After this first lookup, stored in buildNumber\r\n }\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigReference, ExperienceConfig } from \"@msnews/config-data-types\";\r\nimport { getCacheKeyFromConfigRef, getChildConfigRefs, sendAppError } from \"../../../utilities/Utilities\";\r\n\r\nimport { ClientSingleConfigResolver } from \"./ClientSingleConfigResolver\";\r\nimport { FallbackResolverAppErrors } from \"../../../utilities/ResolverAppErrors\";\r\nimport { ResolverEnvironment } from \"@msnews/core-contracts\";\r\n\r\n/**\r\n * Client resolver class\r\n * This is a fallback scenarion when CRS is not available.\r\n */\r\nexport class ClientResolver {\r\n /**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\n private mergedConfigMap: Map = new Map();\r\n\r\n /** Application Type */\r\n private appType: string;\r\n\r\n /** Resolver Environment */\r\n private resolverEnvironment: ResolverEnvironment;\r\n\r\n /** Client Single Config Resolver */\r\n private clientSingleConfigResolver: ClientSingleConfigResolver;\r\n\r\n /**\r\n * Initialize client resolver based on fetching parameters.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment: ResolverEnvironment) {\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ClientResolver.ts: ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n\r\n this.resolverEnvironment = resolverEnvironment;\r\n this.appType = resolverEnvironment.appType;\r\n this.clientSingleConfigResolver = new ClientSingleConfigResolver(resolverEnvironment);\r\n }\r\n\r\n /**\r\n * Gets all the config in the config tree in a recursive manner.\r\n * @param {ConfigReference} entity entity for the root config.\r\n * @param {boolean} getFullTree indicate whether we want to load entire tree at once.\r\n * @returns {Map} returns the merged config map.\r\n */\r\n public async getConfig(entity: ConfigReference, getFullTree = false): Promise {\r\n const cacheKey = getCacheKeyFromConfigRef(entity, this.appType);\r\n\r\n // If this is not in the map, get the tree recursively and add all child configs to map\r\n if (!this.mergedConfigMap.has(cacheKey)) {\r\n await this.getConfigRecursive(entity, getFullTree);\r\n\r\n const allNullFetches = this.clientSingleConfigResolver.getFailedFetches();\r\n if (allNullFetches.length > 0) {\r\n allNullFetches.forEach((nullFetchUrl) => {\r\n sendAppError(this.resolverEnvironment.appErrorCallback,\r\n {\r\n ...FallbackResolverAppErrors.BlobFetchReturnedNull,\r\n message: \"Fetch failed for a config\",\r\n pb: {\r\n ...FallbackResolverAppErrors.BlobFetchReturnedNull.pb,\r\n customMessage: `Failed fetch url: ${nullFetchUrl}`\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n return this.mergedConfigMap.get(cacheKey);\r\n }\r\n\r\n /**\r\n * Get configMap downloaded by fallback resolver.\r\n */\r\n public getConfigMap(): Map {\r\n return this.mergedConfigMap;\r\n }\r\n\r\n /**\r\n * Helper function for getConfig. Gets all the config in the config tree in a recursive manner.\r\n * @param {ConfigReference} entity entity for the root config.\r\n * @param {boolean} getFullTree indicate whether we want to load entire tree at once.\r\n */\r\n public async getConfigRecursive(entity: ConfigReference, getFullTree = false): Promise {\r\n const cacheKey = getCacheKeyFromConfigRef(entity, this.appType);\r\n if (!cacheKey || this.mergedConfigMap.has(cacheKey)) {\r\n return;\r\n }\r\n\r\n try {\r\n // root of specific sub tree\r\n const mergedConfig = await this.clientSingleConfigResolver.resolveConfigAsync(entity);\r\n // add to memory even if it is undefined because we don't want to fetch fail states multiple times\r\n this.mergedConfigMap.set(cacheKey, mergedConfig);\r\n\r\n // Only fetch rest of the tree if requested.\r\n if (getFullTree) {\r\n const unresolvedConfigRefs = getChildConfigRefs(mergedConfig);\r\n if (unresolvedConfigRefs.size == 0) {\r\n return;\r\n }\r\n\r\n const configTasks = [];\r\n unresolvedConfigRefs.forEach(entity => {\r\n configTasks.push (this.getConfigRecursive(entity, getFullTree));\r\n });\r\n\r\n // if a single config fails, it fails all, exists today as well\r\n await Promise.all(configTasks);\r\n }\r\n } catch (error) {\r\n sendAppError(this.resolverEnvironment.appErrorCallback,\r\n {\r\n ...FallbackResolverAppErrors.RecursiveGetFailed,\r\n message: \"Exception in getConfig.\",\r\n pb: {\r\n ...FallbackResolverAppErrors.RecursiveGetFailed.pb,\r\n customMessage: `CacheKey: ${cacheKey} / Error: ${error}`\r\n }\r\n });\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Provides utility functions to get and set data from IndexedDB.\r\n * If dbName is not provied, this class creates a db with name MicrosoftNews.\r\n * If storeName is not provied, this class creates a table/store with name Default.\r\n * Recommended to create a new table for your feature to separate and iterate through entries quickly.\r\n * IndexedDB utility does not require stringify and json parsing so more efficient! Just store your object as value.\r\n */\r\nexport class IndexedDb {\r\n\r\n /** IndexedDb object */\r\n private idb: IDBFactory = indexedDB;\r\n\r\n /** IndexedDb store name */\r\n /** DO NOT PUT DOT IN THE STORE NAME. */\r\n private storeName: string;\r\n\r\n /** IndexedDb promise. Sets when IndexedDB is initialized. */\r\n private idbPromise: Promise;\r\n\r\n /**\r\n * Returns if IndexedDb is supported.\r\n * @returns true if supported else false.\r\n */\r\n public get supported(): boolean {\r\n if (!this.idb) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n public get isGetAllAllowed(): boolean {\r\n if (IDBObjectStore.prototype && IDBObjectStore.prototype.getAll) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @param {IDBFactory} idb - IndexedDB object to override.\r\n */\r\n public _setIndexedDb(idb: IDBFactory): void {\r\n this.idb = idb;\r\n }\r\n\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @return {Promise} existing promise.\r\n */\r\n public _getIdbPromise(): Promise {\r\n return this.idbPromise;\r\n }\r\n\r\n /**\r\n * Returns object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @returns Promise\r\n */\r\n public async getObject(key: IDBValidKey): Promise {\r\n let req: IDBRequest;\r\n\r\n await this.withIdbStore(\"readonly\", \"getObject\", storeCallback => {\r\n req = storeCallback.get(key);\r\n });\r\n return req.result;\r\n }\r\n\r\n /**\r\n * Return all objects from IndexedDB using getAll implementation.\r\n * @public\r\n * @returns Promise\r\n */\r\n public async getAll(): Promise {\r\n let req: IDBRequest;\r\n await this.withIdbStore(\"readonly\", \"getAll\", storeCallback => {\r\n req = storeCallback.getAll();\r\n });\r\n return req.result;\r\n }\r\n\r\n /**\r\n * Returns all objects from IndexedDB.\r\n * if getAll is supported, call it else fallback to Cursor implementation that exists on wide range of devices.\r\n * @public\r\n * @returns Promise\r\n */\r\n public async getAllObjects(): Promise {\r\n if (this.isGetAllAllowed) {\r\n return this.getAll();\r\n }\r\n\r\n const returnArray: Type[] = [];\r\n await this.withIdbStore(\"readonly\", \"getAllObjects\", storeCallback => {\r\n storeCallback.openCursor().onsuccess = function (event: any): void {\r\n const cursor = event.target && event.target.result ? event.target.result : undefined;\r\n if (cursor && cursor.value) {\r\n returnArray.push(cursor.value);\r\n cursor.continue();\r\n }\r\n };\r\n });\r\n return returnArray;\r\n }\r\n\r\n /**\r\n * Sets object into IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @param {any} value - Any typed value you want to insert into IndexedDB.\r\n */\r\n public async setObject(key: IDBValidKey, value: any): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"setObject\", storeCallback => {\r\n storeCallback.put(value, key);\r\n });\r\n }\r\n\r\n /**\r\n * Removes object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n */\r\n public async removeObject(key: IDBValidKey): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"removeObject\", storeCallback => {\r\n storeCallback.delete(key);\r\n });\r\n }\r\n\r\n /**\r\n * Removes all objects from IndexedDB\r\n * @public\r\n */\r\n public async clearObjects(): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"clearObjects\", storeCallback => {\r\n storeCallback.clear();\r\n });\r\n }\r\n\r\n /**\r\n * Initialize IndexedDb.\r\n * @param idbStoreName {string} - IndexedDB store name\r\n * @param dbName {string} - Database name\r\n * @param preInitializedIdbPromise {Promise} - Optional pre-initialized promise that is fetching the {IDBDatabase} object.\r\n * Used to optimize/prime the IDB connection cost so it can be started as early as possible in the page without incurring additional cost\r\n * later when lot more things are happening on the page.\r\n */\r\n public async initializeIndexedDb(\r\n idbVersion = 1,\r\n idbStoreName = \"Default\",\r\n dbName = \"MicrosoftNews\",\r\n preInitializedIdbPromise: Promise = null\r\n ): Promise {\r\n\r\n this.storeName = idbStoreName;\r\n\r\n this.idbPromise = preInitializedIdbPromise || new Promise((resolve, reject) => {\r\n\r\n const openreq = this.idb.open(dbName, idbVersion);\r\n\r\n openreq.onerror = () => {\r\n reject(openreq.error);\r\n };\r\n\r\n openreq.onsuccess = () => {\r\n resolve(openreq.result);\r\n };\r\n\r\n openreq.onupgradeneeded = () => {\r\n openreq.result.createObjectStore(idbStoreName);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Private function to set transaction.\r\n * @param type - IDB read/write mode\r\n * @param operationName - readable name to use in the app trace logging\r\n * @param callback - the callback to invoke with the IDB objectStore.\r\n * @returns {Promise} async operation that ends when the IDB transaction is complete.\r\n */\r\n private async withIdbStore(\r\n type: IDBTransactionMode,\r\n operationName: string,\r\n callback: ((store: IDBObjectStore) => void)\r\n ): Promise {\r\n\r\n return this.idbPromise.then(db => new Promise((resolve, reject) => {\r\n const transaction = db.transaction(this.storeName, type);\r\n\r\n transaction.oncomplete = () => {\r\n resolve();\r\n };\r\n\r\n transaction.onabort = transaction.onerror = () =>\r\n reject(transaction.error);\r\n\r\n callback(transaction.objectStore(this.storeName));\r\n }));\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError } from \"@msnews/core-contracts\";\r\n\r\n/**\r\n * Helper to create an error for logging with message and customMessage properties without having\r\n * to go manually clone the error object, or property bag, etc.\r\n * @param baseError - The base error object to use as prototype for creating the error\r\n * @param message - The custom message to use for the error\r\n * @param customMessage - The custom message that may contain strings that do not aggregate well (i.e., unique / per request data)\r\n */\r\nexport function createError(baseError: AppError, message: string, customMessage?: string): AppError {\r\n return {\r\n ...baseError,\r\n message: message || baseError.message,\r\n pb: customMessage\r\n ? { ...baseError.pb, customMessage }\r\n : baseError.pb\r\n };\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, ResolverEnvironment } from \"@msnews/core-contracts\";\r\nimport { ConfigCachingConstants, ResolverAppErrors, getCacheKeyFromConfigRef } from \"../../utilities\";\r\nimport { ConfigReference, ExperienceConfig, ExperienceConfigCachingWrapper } from \"@msnews/config-data-types\";\r\nimport { IndexedDb, createError } from \"@msnews/web-worker-shared-utils\";\r\n\r\nimport { memoize } from \"lodash-es\";\r\n\r\n/**\r\n * Type definition for cached configs in the indexed DB\r\n */\r\ntype CachedConfigsType = Map;\r\n\r\n/**\r\n * Config cache class\r\n * This interacts with browser's storage and get/set resolved and merged config(s).\r\n */\r\nexport class ConfigCache {\r\n /**\r\n * True if config caching is enabled else false.\r\n */\r\n public enableConfigCaching: boolean = this.useConfigCaching();\r\n\r\n /**\r\n * Instance of IndexedDb class\r\n */\r\n private indexedDb: IndexedDb;\r\n\r\n /**\r\n * Resolver environment properties\r\n */\r\n private resolverEnvironment: ResolverEnvironment;\r\n\r\n /**\r\n * Current Timestamp for config staleness check\r\n */\r\n private stalenessCheckTimestamp: number = new Date().getTime();\r\n\r\n /**\r\n * In-memory map storing configs before read/write to cache.\r\n */\r\n private indexedDbMap: Map = new Map();\r\n\r\n /**\r\n * True if indexedDB is already initialized\r\n */\r\n private indexedDbInitialized: boolean;\r\n\r\n /**\r\n * Read indexedDb for configs.\r\n */\r\n private readConfigsFromIdb = memoize(this._readConfigsFromIdb);\r\n\r\n /**\r\n * Function checks if ConfigCaching is enabled.\r\n * @returns true if supported else false.\r\n */\r\n private useConfigCaching(): boolean {\r\n\r\n // Dev scenario to enable/disable config service\r\n const queryParams = this.resolverEnvironment\r\n && this.resolverEnvironment.configServiceParameters\r\n && this.resolverEnvironment.queryParams;\r\n\r\n if (queryParams && queryParams[\"enableConfigCaching\"]) {\r\n return queryParams[\"enableConfigCaching\"] === \"true\";\r\n }\r\n\r\n // Enable config caching by default\r\n return true;\r\n }\r\n\r\n /**\r\n * Config resolver constructor to initialize child classes.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(readonly environment: ResolverEnvironment, enableIdbCaching = false) {\r\n\r\n if (!environment\r\n || !environment.targetScope\r\n || !environment.appType) {\r\n throw new Error(\"ResolverEnvironment or targetScope or appType does not exist.\");\r\n }\r\n\r\n // Memoize the indexedDB function to protect from being called again\r\n this.initializeIdb = memoize(this.initializeIdb);\r\n\r\n this.resolverEnvironment = environment;\r\n this.indexedDb = new IndexedDb();\r\n\r\n // Do not need to init IDB if IDB caching is disabled\r\n if (enableIdbCaching) {\r\n this.initializeIdb();\r\n }\r\n }\r\n\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n public tryGetConfigSync(configRef: ConfigReference): ExperienceConfig | undefined {\r\n if (configRef) {\r\n const cacheKey = getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n return this.indexedDbMap.get(cacheKey);\r\n }\r\n }\r\n\r\n /**\r\n * This function returns resolve and merge config from browser cache.\r\n * @param {ConfigReference} configRef: The identity structure that uniquely identifies a single instance of an experience\r\n * @returns {Promise} experienceConfig from cache\r\n */\r\n public async getConfig(configRef: ConfigReference): Promise {\r\n if (!configRef) {\r\n return;\r\n }\r\n\r\n const cacheKey = getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n\r\n // If this config exist in memory, return else read from cache.\r\n if (!this.indexedDbMap.has(cacheKey)) {\r\n await this.readConfigsFromIdb();\r\n }\r\n\r\n return this.indexedDbMap.get(cacheKey);\r\n }\r\n\r\n /**\r\n * Update IndexedDB configs from network configs.\r\n * @param configMap\r\n */\r\n public async updateCache(configMap: Map): Promise {\r\n if (!configMap) {\r\n return;\r\n }\r\n\r\n configMap.forEach((experienceConfig, cacheKey) => {\r\n if (experienceConfig) {\r\n const config: ExperienceConfigCachingWrapper = {\r\n storageTimestamp: this.stalenessCheckTimestamp,\r\n configRefCacheKey: cacheKey,\r\n properties: experienceConfig.properties\r\n };\r\n this.indexedDbMap.set(cacheKey, config);\r\n }\r\n });\r\n\r\n await this.writeConfigMapToIdb();\r\n }\r\n\r\n /**\r\n * Init indexedDb.\r\n */\r\n private async initializeIdb(): Promise {\r\n if (!this.enableConfigCaching) {\r\n return;\r\n }\r\n\r\n try {\r\n\r\n const idbConfigOpenPromise = this.resolverEnvironment.configCacheProperties && this.resolverEnvironment.configCacheProperties.idbConfigOpenPromise;\r\n await this.indexedDb.initializeIndexedDb(1, ConfigCachingConstants.idbStoreName, ConfigCachingConstants.idbName, idbConfigOpenPromise);\r\n this.indexedDbInitialized = true;\r\n this.logMessage(\"IndexedDB initialized.\");\r\n\r\n } catch (e) {\r\n this.enableConfigCaching = false;\r\n this.sendAppError(createError(\r\n ResolverAppErrors.IndexedDbInitFailed,\r\n \"Failed to init configs IndexedDB\",\r\n e\r\n ));\r\n }\r\n }\r\n\r\n /**\r\n * Get cached Configs from IndexedDb and populate configMap based on target scope key.\r\n */\r\n private async _readConfigsFromIdb(): Promise {\r\n if (!this.enableConfigCaching) {\r\n return;\r\n }\r\n\r\n // Check if IndexedDB was initialized\r\n if (!this.indexedDbInitialized) {\r\n await this.initializeIdb();\r\n }\r\n\r\n try {\r\n // This is indexedDB cache key and all configs are stored as a value with this key.\r\n const indexedDbKey = this.generateIdbKey();\r\n let cachedConfigs: CachedConfigsType;\r\n let cacheSource: string;\r\n\r\n const { idbConfigLookup = null, idbConfigReadPromise = null } = this.resolverEnvironment.configCacheProperties || {};\r\n\r\n // Check if we have a top page-level initialized IDB read config lookup populated\r\n // with the specific entry we need, and if so use it. Otherwise proceed to load from indexDB\r\n cachedConfigs = (idbConfigLookup || {})[indexedDbKey] as CachedConfigsType;\r\n if (cachedConfigs) {\r\n cacheSource = \"pre-initialized config cache\";\r\n\r\n } else if (idbConfigReadPromise) {\r\n // see if we have the pre-initialized config read promise from IDB, and if so\r\n // await on that instead of starting our own duplicate IDB init/read.\r\n cacheSource = \"pre-initialized IndexedDb read\";\r\n await idbConfigReadPromise;\r\n cachedConfigs = (idbConfigLookup || {})[indexedDbKey] as CachedConfigsType;\r\n } else {\r\n // start our own IDB read.\r\n cacheSource = \"IndexedDb bulk read\";\r\n cachedConfigs = await this.indexedDb.getObject>(indexedDbKey);\r\n }\r\n\r\n if (!cachedConfigs) {\r\n this.logMessage(`readConfigsFromIdb: Didn't find any config in IndexedDB. CacheSource: ${cacheSource}`);\r\n } else {\r\n // targetScopeKey is inserted into IndexedDb along with configIndexHref.\r\n // Although there can be more than type of keys being formed since DHP and NTP will have different ones due to pageType in targetScope.\r\n cachedConfigs.forEach(cachedConfig => {\r\n if (cachedConfig.configRefCacheKey\r\n && !this.isConfigStale(cachedConfig.storageTimestamp)) {\r\n this.indexedDbMap.set(cachedConfig.configRefCacheKey, cachedConfig);\r\n }\r\n });\r\n\r\n this.logMessage(`readConfigsFromIdb: Configs in IndexedDB: ${cachedConfigs.size}. Configs in memory: ${this.indexedDbMap.size}. CacheSource: ${cacheSource}.`);\r\n }\r\n } catch (e) {\r\n this.sendAppError(createError(\r\n ResolverAppErrors.IndexedDbReadFailed,\r\n \"IndexedDb Configs read failed\",\r\n e\r\n ));\r\n }\r\n }\r\n\r\n /**\r\n * Write in-memory configs to indexedDb.\r\n */\r\n private async writeConfigMapToIdb(): Promise {\r\n if (!this.enableConfigCaching || !this.indexedDbMap) {\r\n return;\r\n }\r\n\r\n // Check if IndexedDB was initialized\r\n if (!this.indexedDbInitialized) {\r\n await this.initializeIdb();\r\n }\r\n\r\n try {\r\n // This is indexedDB cache key and all configs are stored as a value with this key.\r\n const indexedDbKey = this.generateIdbKey();\r\n await this.indexedDb.setObject(indexedDbKey, this.indexedDbMap);\r\n this.logMessage(\"writeConfigMapToIdb: completed\");\r\n\r\n } catch (e) {\r\n this.sendAppError(createError(\r\n ResolverAppErrors.IndexedDbWriteFailed,\r\n \"Failed to write configMap to indexedDb\",\r\n e\r\n ));\r\n }\r\n }\r\n\r\n /**\r\n * This function generates a key that is used to write/read configurations to/from storage.\r\n * example key: \"kids|ja|jp|testPage|mmx\"\r\n * @private\r\n * @return string\r\n */\r\n private generateIdbKey(): string {\r\n const { audienceMode = \"\", locale = {}, pageType = \"\" } = this.resolverEnvironment.targetScope || {};\r\n const { language, market } = locale;\r\n\r\n const keys = [audienceMode, language, market, pageType, this.resolverEnvironment.appType || \"\"];\r\n return keys.map(key => key || \"\").join(\"|\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Function to check config is stale.\r\n * @returns true if stale else false.\r\n */\r\n private isConfigStale(storageTimestamp: number): boolean {\r\n return !storageTimestamp || (this.stalenessCheckTimestamp - storageTimestamp) > ConfigCachingConstants.configStalenessDuration;\r\n }\r\n\r\n /**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\n private sendAppError(appError: AppError): void {\r\n if (this.resolverEnvironment.appErrorCallback) {\r\n this.resolverEnvironment.appErrorCallback(appError);\r\n }\r\n }\r\n\r\n /**\r\n * Log message if debug is chosen\r\n * @param message to log\r\n */\r\n private logMessage(message: string): void {\r\n if (this.resolverEnvironment.loggerCallback) {\r\n this.resolverEnvironment.loggerCallback(message);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, ConfigServiceResponse, ResolverEnvironment } from \"@msnews/core-contracts\";\r\nimport { ConfigCrsFetchNon200Response, CrsFetchTimeout, ResolverAppErrors, buildNumberRegex, getBuildNumberAsync, getCacheKeyFromConfigRef, getConfigRefFromKey } from \"../utilities\";\r\nimport { ConfigReference, ExperienceConfig } from \"@msnews/config-data-types\";\r\n\r\nimport { createError } from \"@msnews/web-worker-shared-utils\";\r\nimport { isEmpty } from \"lodash-es\";\r\n\r\n// This is defined in webpack config\r\ndeclare let __WEBPACK_LOCAL_GITCONFIGS__: string;\r\n\r\n/**\r\n * Config service class\r\n * This interacts with CRS and gets resolved and merged config\r\n */\r\nexport class ConfigService {\r\n /**\r\n * Config service params appended\r\n */\r\n private configServiceParams: string;\r\n\r\n /**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\n private configMap: Map = new Map();\r\n\r\n /**\r\n * True if config service is enabled else false.\r\n */\r\n private enableConfigService = true;\r\n\r\n /**\r\n * Dictionary to maintain all promise objects which are not resolved/rejected. Once promise object is resolved/rejected,\r\n * it gets deleted from this dictionary and put in the configMap.\r\n * @type {Map>}\r\n */\r\n private configPromiseMap: Map> = new Map();\r\n\r\n /**\r\n * If config service returns specific error code, then try fallback resolver.\r\n */\r\n private _shouldTryFallbackResolver = false;\r\n\r\n /**\r\n * If CRS fetch had network error\r\n */\r\n private _hadNetworkError = false;\r\n\r\n /**\r\n * If CRS fetch had network error\r\n */\r\n public get hadNetworkError(): boolean {\r\n return this._hadNetworkError;\r\n }\r\n\r\n /**\r\n * If config service returns specific error code, then try fallback resolver.\r\n */\r\n public get shouldTryFallbackResolver(): boolean {\r\n return this._shouldTryFallbackResolver;\r\n }\r\n\r\n /**\r\n * Returns true if config service is enabled\r\n */\r\n public get configServiceEnabled(): boolean {\r\n return this.enableConfigService;\r\n }\r\n\r\n /**\r\n * Returns config service query params\r\n */\r\n public get configServiceQueryParams(): string {\r\n return this.configServiceParams;\r\n }\r\n\r\n /**\r\n * Create config service based on ResolverEnvironment\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(readonly resolverEnvironment: ResolverEnvironment) {\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n this.enableConfigService = false;\r\n throw new Error(\"ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n }\r\n\r\n /**\r\n * Initialize config service\r\n */\r\n public async initialize(): Promise {\r\n this.shouldUseConfigService();\r\n await this.setConfigServiceParams();\r\n }\r\n\r\n /**\r\n * Set query param from CRS request configurations\r\n */\r\n private async setConfigServiceParams(): Promise {\r\n const { appType, configServiceParameters, targetScope } = this.resolverEnvironment;\r\n const { maxDepth } = configServiceParameters;\r\n let { buildVersion } = configServiceParameters;\r\n\r\n // Send PCS apptype to CRS so we can build CRS Jarvis dashboards per apptype.\r\n let configServiceParams = `apptype=${appType}`;\r\n\r\n // Use regex to text whether \"spalink\" QSP is an actual build number (with the format YYYYMMDD.) or an alias (for local scenario only).\r\n // If it is an alias, convert that to a corresponding build number (using the /v endpoint), because CRS can't handle aliases.\r\n if (__WEBPACK_LOCAL_GITCONFIGS__ && !buildNumberRegex.test(buildVersion)) {\r\n buildVersion = await getBuildNumberAsync(buildVersion, appType);\r\n }\r\n\r\n // Add client build version\r\n configServiceParams += `&v=${buildVersion}`;\r\n\r\n // Query string parameter from target scope.\r\n configServiceParams += \"&targetScope=\" + JSON.stringify(targetScope);\r\n\r\n // Add maxDepth if exist. Mostly for dev scenario\r\n if (maxDepth) {\r\n configServiceParams += `&maxDepth=${maxDepth}`;\r\n }\r\n\r\n // If url has dev only query string params, inform CRS so it can exclude from availability and will help debugging on Jarvis.\r\n if (this.containsDevOnlyQueryParameters()) {\r\n configServiceParams += \"&citem=dev:true\";\r\n }\r\n\r\n this.configServiceParams = configServiceParams;\r\n }\r\n\r\n /**\r\n * Function checks if ConfigService is enabled.\r\n * @returns true if supported else false.\r\n */\r\n private shouldUseConfigService(): void {\r\n // Dev scenario to enable/disable config service\r\n const queryParams = this.resolverEnvironment\r\n && this.resolverEnvironment.configServiceParameters\r\n && this.resolverEnvironment.queryParams;\r\n if (queryParams && queryParams[\"enableConfigService\"]) {\r\n this.enableConfigService = queryParams[\"enableConfigService\"] === \"true\";\r\n }\r\n }\r\n\r\n /**\r\n * Function checks if url has any dev only query string param\r\n * @returns true if exist else false.\r\n */\r\n private containsDevOnlyQueryParameters(): boolean {\r\n const queryParams = this.resolverEnvironment.queryParams;\r\n if (!queryParams) {\r\n return false;\r\n }\r\n\r\n const item = queryParams[\"item\"];\r\n if (item && item.length > 0) {\r\n return true;\r\n }\r\n\r\n const citem = queryParams[\"citem\"];\r\n if (citem) {\r\n return true;\r\n }\r\n\r\n const segment = queryParams[\"pcsonly\"];\r\n if (segment) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns in-memory configs\r\n * @returns Map\r\n */\r\n public getConfigMap(): Map {\r\n return this.configMap;\r\n }\r\n\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n public tryGetConfigSync(configRef: ConfigReference): ExperienceConfig | undefined {\r\n if (configRef) {\r\n const cacheKey = this.getCacheKeyFromConfigRef(configRef);\r\n return this.configMap.get(cacheKey);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the resolved merged Experience config from CRS.\r\n * @param {ConfigReference} configRef object\r\n * @return Promise\r\n */\r\n public async getConfig(configRef: ConfigReference): Promise {\r\n // If request configurations aren't available, throw error.\r\n if (!this.resolverEnvironment.configServiceParameters || !this.resolverEnvironment.targetScope || !configRef) {\r\n return Promise.reject(Error(\"Either of configServiceParameters, targetScope or configRef is not set correctly.\"));\r\n }\r\n\r\n // Return if config service is not enabled.\r\n if (!this.enableConfigService) {\r\n this._shouldTryFallbackResolver = true;\r\n return;\r\n }\r\n\r\n // Get cache key from experience type and other meta data.\r\n const cacheKey = this.getCacheKeyFromConfigRef(configRef);\r\n\r\n // Return config is already present in the memory cache.\r\n if (this.configMap.has(cacheKey)) {\r\n return this.configMap.get(cacheKey);\r\n }\r\n\r\n // if configPromiseMap has the item, we already have an active promise which is not yet resolved/rejected. Return this promise\r\n if (this.configPromiseMap.has(cacheKey)) {\r\n return this.configPromiseMap.get(cacheKey);\r\n }\r\n\r\n // Process config from network\r\n const configPromise = new Promise(async (resolve, reject) => {\r\n try {\r\n\r\n await this.getConfigTreeFromCrs(configRef);\r\n resolve(this.configMap.get(cacheKey));\r\n\r\n } catch (error) {\r\n\r\n this.sendAppError(createError(\r\n ResolverAppErrors.GetConfigException,\r\n `Exception in getConfig for ${cacheKey}`,\r\n error\r\n ));\r\n\r\n // If we don't explicitly catch the error, then the promise never gets rejected which might cause issues during experience load time.\r\n reject(error);\r\n\r\n } finally {\r\n this.configPromiseMap.delete(cacheKey);\r\n }\r\n });\r\n\r\n // if caller is using await then this request has been processed and we should not add it to configPromiseMap.\r\n // if caller is trying to download multiple configs in parallel, then processed should be false.\r\n this.configPromiseMap.set(cacheKey, configPromise);\r\n\r\n return configPromise;\r\n }\r\n\r\n /**\r\n * Fetch configs from CRS and add them to in-memory cache.\r\n * @param {ConfigReference} configRef object\r\n */\r\n private async getConfigTreeFromCrs(configRef: ConfigReference): Promise {\r\n try {\r\n\r\n // Set a 5-second timeout for CRS call\r\n let timer: NodeJS.Timer;\r\n const timeoutInMs = 5000;\r\n\r\n const timeoutPromise = new Promise((resolve) => {\r\n timer = setTimeout(\r\n () => {\r\n\r\n // Log an app error if CRS call timed out\r\n const appError: AppError = {\r\n ...CrsFetchTimeout,\r\n pb: {\r\n ...CrsFetchTimeout.pb,\r\n isWebWorker: this.resolverEnvironment.isThisWebWorkerThread\r\n }\r\n };\r\n\r\n this.sendAppError(createError(\r\n appError,\r\n \"CRS fetch timeout\",\r\n `ConfigRef: ${this.getCacheKeyFromConfigRef(configRef)}.`\r\n ));\r\n\r\n // Return null response so that fallback resolver is automatically invoked\r\n return resolve(null);\r\n },\r\n timeoutInMs\r\n );\r\n });\r\n\r\n const crsFetchPromise = this.downloadFromCrs(configRef).then((crsResponse) => {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n\r\n return crsResponse;\r\n });\r\n\r\n // Race between CRS and a timeout based promise\r\n const response = await Promise.race([crsFetchPromise, timeoutPromise]);\r\n const configs = response && response.configs;\r\n if (!configs || isEmpty(configs)) {\r\n\r\n // If CRS failed to return a valid response, try using the fallback resolver.\r\n this._shouldTryFallbackResolver = true;\r\n\r\n return;\r\n }\r\n\r\n // Set shouldRetry to false when CRS response is valid\r\n this._shouldTryFallbackResolver = false;\r\n for (const configKey in configs) {\r\n\r\n const config = configs[configKey];\r\n if (config && config.properties) {\r\n\r\n const cacheKey = this.getCacheKeyFromConfigRef(getConfigRefFromKey(configKey));\r\n this.configMap.set(cacheKey, config);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n this.sendAppError(createError(\r\n ResolverAppErrors.CrsFetchError,\r\n \"CRS fetch network error\",\r\n `ConfigRef: ${this.getCacheKeyFromConfigRef(configRef)}. CrsFetchNetworkError: ${this._hadNetworkError}. Error: ${error}`\r\n ));\r\n }\r\n }\r\n\r\n /**\r\n * Download config(s) from CRS\r\n * @param {ConfigReference} configRef object\r\n * @return Promise returns config service response\r\n */\r\n private async downloadFromCrs(configRef: ConfigReference): Promise {\r\n const fetchUrl = this.generateCrsUrl(configRef);\r\n\r\n return fetch(fetchUrl)\r\n .then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n\r\n // Get appropriate CRS headers and instrument in the app error customMessage\r\n const crsVersion = response.headers.get(\"X-Crs-BuildVersion\") || \"\";\r\n const msedgeRef = response.headers.get(\"x-msedge-ref\") || \"\";\r\n const errorMessage = `Url: ${fetchUrl} and CRS Version: ${crsVersion} and isWebWorkerPresent ${this.resolverEnvironment.isWebWorkerPresent}`;\r\n\r\n const appError: AppError = {\r\n ...ConfigCrsFetchNon200Response,\r\n pb: {\r\n ...ConfigCrsFetchNon200Response.pb,\r\n isWebWorker: this.resolverEnvironment.isThisWebWorkerThread,\r\n fetchNetworkResponse: {\r\n activityId: msedgeRef,\r\n statusCode: response.status\r\n }\r\n }\r\n };\r\n this.sendAppError(createError(\r\n appError,\r\n \"CRS returned non-200 response\",\r\n errorMessage\r\n ));\r\n\r\n return Promise.resolve();\r\n })\r\n .catch(error => {\r\n // If fetch fails to make request or cancelled by the browser, do not make call to fallback resolver.\r\n this._shouldTryFallbackResolver = false;\r\n\r\n // If CRS fetch had network error\r\n this._hadNetworkError = true;\r\n\r\n // This throw is required so that parent function can send appropriate app error.\r\n throw error;\r\n });\r\n }\r\n\r\n /**\r\n * Generate CRS fetch url based on configRef, configServiceParams and configServiceBaseUrl.\r\n * @param {ConfigReference} configRef object\r\n * @returns {URL} CRS fetch url\r\n */\r\n private generateCrsUrl(configRef: ConfigReference): string {\r\n const sharedNsQsp = configRef.sharedNs ? `&sharedNs=${configRef.sharedNs}` : \"\";\r\n const configRefQsp = `expType=${configRef.experienceType}&expInstance=${configRef.instanceSrc}${sharedNsQsp}`;\r\n const configServiceRelativeUrl = `?${configRefQsp}&${this.configServiceParams}`;\r\n const fetchUrl = new URL(configServiceRelativeUrl, this.resolverEnvironment.configServiceParameters.configServiceBaseUrl);\r\n return fetchUrl.toString();\r\n }\r\n\r\n /**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\n private sendAppError(appError: AppError): void {\r\n if (this.resolverEnvironment.appErrorCallback) {\r\n this.resolverEnvironment.appErrorCallback(appError);\r\n }\r\n }\r\n\r\n /**\r\n * Helper to avoid get cache key for the given configRef and the current resolver environment\r\n * @param configRef The config reference for which to get the cache key\r\n * @returns {string} The cache key that uniquely represents the given config reference object.\r\n */\r\n private getCacheKeyFromConfigRef = (configRef: ConfigReference) =>\r\n getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigOrigin, ResolverEnvironment } from \"@msnews/core-contracts\";\r\nimport { ConfigReference, ExperienceConfig } from \"@msnews/config-data-types\";\r\nimport { enableIdbCaching, getCacheKeyFromConfigRef, isConfigBundleLocHashSameAsLastPage } from \"../../utilities\";\r\nimport { getRootConfigRef, perfMarkerCrsConfigName, perfMarkerEndSuffix, perfMarkerStartSuffix } from \"@msnews/web-worker-shared-utils\";\r\n\r\nimport { ClientResolver } from \"./client-fallback-resolver/ClientResolver\";\r\nimport { ConfigCache } from \"./ConfigCache\";\r\nimport { ConfigService } from \"../ConfigService\";\r\n\r\n/**\r\n * Git config resolver class\r\n */\r\nexport class ConfigResolver {\r\n /**\r\n * Config service object\r\n */\r\n private readonly configService: ConfigService;\r\n\r\n /**\r\n * Config cache object\r\n */\r\n private readonly configCache: ConfigCache;\r\n\r\n /**\r\n * ClientResolver object\r\n */\r\n private readonly clientResolver: ClientResolver;\r\n\r\n /**\r\n * Set to true when fallback client side resolver is called\r\n */\r\n private fallbackResolverCalled = false;\r\n\r\n /**\r\n * Flag to indicate if the initial CRS bulk fetch call has finished fetching.\r\n * This flag is used to avoid extra awaiting on completed Promises for new getConfig calls.\r\n */\r\n private crsInitComplete = false;\r\n\r\n /**\r\n * True if bundle, config and loc hash of current page is same as last page\r\n */\r\n private readonly configsEqual: boolean;\r\n\r\n /**\r\n * If this is treatment, use IndexedDB cache else do not.\r\n */\r\n private enableIdbCaching = false;\r\n\r\n /**\r\n * Config resolver constructor to initialize child classes.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(readonly resolverEnvironment: ResolverEnvironment) {\r\n if (!resolverEnvironment || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ResolverEnvironment or targetScope does not exist.\");\r\n }\r\n\r\n // Initialize configService object\r\n this.configService = new ConfigService(resolverEnvironment);\r\n\r\n // True if bundle, config and loc hash of current page is same as last page\r\n this.configsEqual = isConfigBundleLocHashSameAsLastPage(resolverEnvironment.configCacheProperties);\r\n\r\n // True if this belong to idb caching of Git configs\r\n this.enableIdbCaching = enableIdbCaching(resolverEnvironment.targetScope.pageExperiments);\r\n\r\n // Initialize configCache object\r\n this.configCache = new ConfigCache(resolverEnvironment, this.enableIdbCaching);\r\n\r\n // Initialize fallback resolver\r\n this.clientResolver = new ClientResolver(resolverEnvironment);\r\n }\r\n\r\n /**\r\n * True if CRS fetch had network errors, else false\r\n */\r\n public get crsHadNetworkError(): boolean {\r\n return this.configService.hadNetworkError;\r\n }\r\n\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n public tryGetConfigSync(configRef: ConfigReference): ExperienceConfig | undefined {\r\n\r\n if (configRef) {\r\n\r\n // try to do a fast synchronous get from the in-memory caches from each of the layers we have\r\n return this.configService.tryGetConfigSync(configRef)\r\n || this.configCache.tryGetConfigSync(configRef);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the resolved merged Experience config from CRS.\r\n * @param {ConfigReference} configRef: The identity structure that uniquely identifies a single instance of an experience\r\n * @returns {Promise} ExperienceConfig\r\n */\r\n public async getConfig(configRef: ConfigReference): Promise {\r\n if (this.resolverEnvironment.configOrigins.feature === ConfigOrigin.Local\r\n || this.resolverEnvironment.mockManager.mocksEnabled) {\r\n const isLoggerCallbackAvailable = typeof this.resolverEnvironment.loggerCallback === \"function\";\r\n try {\r\n const localConfigs = await this.clientResolver.getConfig(configRef);\r\n if (localConfigs) {\r\n return Promise.resolve(localConfigs);\r\n } else {\r\n isLoggerCallbackAvailable && this.resolverEnvironment.loggerCallback(`ConfigResolver: Failed to fetch configs from local configs. Config: ${getCacheKeyFromConfigRef(configRef)}`);\r\n return Promise.resolve(null);\r\n }\r\n } catch (error) {\r\n isLoggerCallbackAvailable && this.resolverEnvironment.loggerCallback(`${error.message}`);\r\n return Promise.reject(error);\r\n }\r\n }\r\n\r\n if (!this.crsInitComplete) {\r\n this.sendPerfMarker(`${perfMarkerCrsConfigName}${perfMarkerStartSuffix}`);\r\n await this.initiateConfigService();\r\n this.crsInitComplete = true;\r\n this.sendPerfMarker(`${perfMarkerCrsConfigName}${perfMarkerEndSuffix}`);\r\n }\r\n\r\n // try to do a fast synchronous get from the in-memory caches from each of the layers we have\r\n const fromMemoryConfig = this.tryGetConfigSync(configRef);\r\n if (fromMemoryConfig) {\r\n return fromMemoryConfig;\r\n }\r\n\r\n const networkReadPromise = new Promise(async (resolve) => {\r\n if (!this.configService.shouldTryFallbackResolver) {\r\n const crsConfig = await this.configService.getConfig(configRef);\r\n if (crsConfig) {\r\n return resolve(crsConfig);\r\n }\r\n } else {\r\n // Try fallback client resolver when CRS returns a non-200 response.\r\n this.fallbackResolverCalled = true;\r\n const cdnConfig = await this.clientResolver.getConfig(configRef);\r\n if (cdnConfig) {\r\n return resolve(cdnConfig);\r\n }\r\n }\r\n\r\n return resolve(null);\r\n });\r\n\r\n const cacheReadPromise = new Promise(async (resolve) => {\r\n // Fetch configs from cache only if configs are equal\r\n if (this.configsEqual && this.enableIdbCaching) {\r\n const cachedConfig = await this.configCache.getConfig(configRef);\r\n if (cachedConfig) {\r\n return resolve(cachedConfig);\r\n }\r\n }\r\n\r\n // If config hashes are not same, do not resolve cacheReadPromise promise!\r\n // Just so that the networkReadPromise wins when we race between networkReadPromise and cacheReadPromise\r\n });\r\n\r\n // start the race between network and IDB cache read\r\n return Promise.race([cacheReadPromise, networkReadPromise]);\r\n }\r\n\r\n /**\r\n * This overwrite (update) / write configs into cache\r\n * This is typically called after TTVR in web worker context\r\n * @returns true if configs are equal\r\n */\r\n public async updateConfigsCache(): Promise {\r\n // We store CMS configs in IndexedDB at client since caching header for CRS call is 15 minutes for DRI scenarios.\r\n // Git configs have 7 days of caching header, so we want to skip IndexedDB read/write/udpate layer of config caching.\r\n // At this point, client is set to make a network call and will find network response in the disk cache.\r\n // If there is a config update, it has new build version number that gets passed to the client and\r\n // client uses this build version to query CRS and thus that breaks disk cache automatically.\r\n if (!this.enableIdbCaching) {\r\n return this.configsEqual;\r\n }\r\n\r\n // If configs from this page and last page are same, we want to skip writing to cache\r\n // When configs are equal, we return true. This should not update cache as cache update is not required.\r\n // If configs are not equal, we return false. This should update cache with new configs\r\n if (this.configsEqual) {\r\n return this.configsEqual;\r\n }\r\n\r\n // Make sure that CRS getConfig is called.\r\n // So that configMap will be populated in order to write to Cache.\r\n await this.initiateConfigService();\r\n\r\n // Get configMap downloaded from CRS.\r\n const crsConfigMap = this.configService.getConfigMap();\r\n if (crsConfigMap) {\r\n // Write this CRS downloaded map to Cache.\r\n this.configCache.updateCache(crsConfigMap);\r\n return this.configsEqual;\r\n }\r\n\r\n // Try fallback client resolver when CRS returns a non-200 response.\r\n if (!this.configService.shouldTryFallbackResolver) {\r\n return this.configsEqual;\r\n }\r\n\r\n // Make sure that fallback resolver getConfig is called.\r\n // So that configMap will be populated in order to write to Cache.\r\n if (!this.fallbackResolverCalled) {\r\n await this.clientResolver.getConfig(getRootConfigRef());\r\n }\r\n\r\n // Get configMap downloaded from fallback resolver.\r\n const clientResolverConfigMap = this.clientResolver.getConfigMap();\r\n if (clientResolverConfigMap) {\r\n // Write this network downloaded map to Cache.\r\n this.configCache.updateCache(clientResolverConfigMap);\r\n }\r\n\r\n return this.configsEqual;\r\n }\r\n\r\n /**\r\n * To be used by the unit tests\r\n */\r\n public getConfigServiceObject(): ConfigService {\r\n return this.configService;\r\n }\r\n\r\n /**\r\n * Initialize config service call\r\n */\r\n private async initiateConfigService(): Promise {\r\n await this.configService.initialize();\r\n await this.configService.getConfig(getRootConfigRef());\r\n }\r\n\r\n /**\r\n * Send this perf marker.\r\n * @param name perf marker name.\r\n */\r\n private sendPerfMarker(name: string): void {\r\n if (this.resolverEnvironment.perfMarkerCallback) {\r\n this.resolverEnvironment.perfMarkerCallback(name);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConfigReference } from \"@msnews/config-data-types\";\r\n\r\nexport function getRootConfigRef(): ConfigReference {\r\n return { experienceType: \"AppConfig\", instanceSrc: \"default\" };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, createError, PerfTimeline, ResolverAppErrors, logger, tryGetPerfTimeline, CachedConfigsForDifferentFlight, ConfigCrsFetchNon200Response, ConfigCdnFetchNon200Response, ResolverErrorConfigsDownloadedByCdn, SSRAppErrors, GitConfigsInvalidConfigRef, GitConfigsInvalidConfigResolver } from \"@msnews/diagnostics\";\r\nimport { Environment, PageRequestTargetScope, appEnvironment } from \"../app\";\r\nimport { ExperienceConfigWrapper, ExperienceConfigs, getConfigRefString } from \"./configs/\";\r\nimport { IndexedDb, ServerCache, UrlUtility, Utility, getFromWebWorker, isWebWorkerPresent, sendToWebWorker, abortableFetch } from \"../utilities\";\r\nimport { getLocalStorage } from \"../webstorage\";\r\nimport { canUseDOM, getLocationHref, getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { isArray, isEmpty, isString, memoize, mergeWith } from \"lodash-es\";\r\n\r\nimport { IExperienceConfig } from \"cms-models-msn/configuration/IExperienceConfig\";\r\nimport { IExperienceConfigIndex } from \"cms-models-msn/configuration/IExperienceConfigIndex\";\r\nimport { IExperienceConfigLink } from \"cms-models-msn/configuration/IExperienceConfigLink\";\r\nimport { getPeregrineFlights } from \"@msnews/experimentation-helpers\";\r\nimport { AppConfig, ConfigReference, ExperienceConfig } from \"@msnews/config-data-types\";\r\nimport { ConfigCacheProperties, ConfigFetchError, ConfigServiceParameters, ResolverEnvironment } from \"@msnews/core-contracts\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { getRootConfigRef, addPerfMarker, initializePerfMarkerHelper, getPerfMarkerHelperPageTimings } from \"@msnews/web-worker-shared-utils\";\r\nimport { ConfigResolver } from \"@msnews/config-resolver\";\r\nimport { mockManager } from \"@msnews/mock-config\";\r\n\r\n/**\r\n * Type definition for cached configs in the indexed DB\r\n */\r\ntype CachedConfigsType = Map;\r\n\r\n/**\r\n * Constants for TTLs\r\n */\r\nconst SERVER_CACHE_TTL: number = 60 * 60 * 24 * 1000; // one day in milliseconds\r\nconst SERVER_CACHE_CONFIG_STALENESS_TIMEOUT: number = 5 * 60 * 1000; // 5 minutes in milliseconds\r\n\r\n/**\r\n * Constants for fetch timeouts\r\n */\r\nconst CSRTimeoutInMs = 10000;\r\nconst SSRTimeoutInMs = 900;\r\n\r\n/**\r\n * Resolver Class\r\n */\r\nclass Resolver {\r\n\r\n /**\r\n * Target scope of the current page request\r\n * @type {PageRequestTargetScope}\r\n */\r\n private currentTargetScope: PageRequestTargetScope = appEnvironment.CurrentRequestTargetScope;\r\n\r\n /**\r\n * Target scope of the current page request override. Only used by unit tests and tooling\r\n * @type {PageRequestTargetScope}\r\n */\r\n private currentTargetScopeOverride: PageRequestTargetScope;\r\n\r\n /**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\n private configMap: CachedConfigsType = new Map();\r\n\r\n /** set fallback env to prod to avoid any live site issues */\r\n private env: Environment = appEnvironment.Environment || Environment.prod;\r\n\r\n /**\r\n * Config base url used during cms config resolution.\r\n * @type {string}\r\n */\r\n private cdnConfigBaseUrl: URL;\r\n\r\n /**\r\n * Config base url for Config Service\r\n * @type {string}\r\n */\r\n private configServiceBaseUrl: URL;\r\n\r\n /**\r\n * Dictionary to maintain all promise objects which are not resolved/rejected. Once promise object is resolved/rejected,\r\n * it gets deleted from this dictionary and put in the configMap.\r\n * @type {Map>}\r\n */\r\n private promiseMap: Map> = new Map();\r\n\r\n /**\r\n * Maintain promise objects that is updating stale timestamp for server cache.\r\n * This is to prevent concurrent getConfig from updating stale cache even when the head config refresh has initiated\r\n */\r\n private refreshServerCachePromiseMap: Map> = new Map();\r\n\r\n /** Resolver app errors */\r\n private resolverErrors: AppError[];\r\n\r\n /** Object of IndexedDb wrapper class */\r\n private indexedDb: IndexedDb;\r\n\r\n /**\r\n * Check if IndexedDb operation is allowed or not.\r\n * @type {boolean}: true if indexedDB should be used else false.\r\n */\r\n private useIndexedDb: boolean;\r\n\r\n /**\r\n * Check if ServerCache can be used or not.\r\n * @type {boolean}\r\n */\r\n private useServerCache: boolean;\r\n\r\n /** Current Timestamp for config staleness check. */\r\n private stalenessCheckTimestamp: number = new Date().getTime();\r\n\r\n /**\r\n * Check if ConfigService operation is allowed or not.\r\n * @type {boolean}\r\n */\r\n private enableConfigService: boolean;\r\n\r\n /**\r\n * Get config service parameters from currentTargetScope\r\n * @type {string}\r\n */\r\n private configServiceParameters: string;\r\n\r\n /**\r\n * Storage key for indexedDb\r\n * @type {string}\r\n */\r\n private storageKey: string;\r\n\r\n /** Config timings object storing fetch duration of network or cache to retrieve config. */\r\n private configTimings: ConfigFetchTiming[];\r\n\r\n /**\r\n * Check if web worker exists\r\n * @type {boolean}\r\n */\r\n private useWebWorkerToCache: boolean;\r\n\r\n /** The perf timeline for the resolver */\r\n private perfTimeline: PerfTimeline;\r\n\r\n /**\r\n * Check if config service shold return more than 1 config\r\n * @type {boolean}\r\n */\r\n private isMultiConfigRetrievalEnabled = false;\r\n\r\n /** Maps config index HREF to local override for config. */\r\n private localOverrideMap: { [configIndexHref: string]: ExperienceConfigWrapper } = {};\r\n\r\n /** Initialize indexedDb for configs. */\r\n private initializeIndexedDb = memoize(this._initializeIndexedDb);\r\n\r\n /** Initialize configs from IDB. */\r\n private populateConfigMapFromIndexedDbAsync = memoize(this._populateConfigMapFromIndexedDbAsync);\r\n\r\n /** Peregrine only lower cased flights in alphabetical order */\r\n private peregrineFlights: string;\r\n\r\n /** Peregrine flights local storage key */\r\n private peregrineFlightsKey = \"prgflights\";\r\n\r\n /**\r\n * Git config resolver class\r\n */\r\n private configResolver: ConfigResolver;\r\n\r\n /**\r\n * Target scope with Peregrine only flights in page experiments\r\n */\r\n private scopeWithPeregrineFlights: PageRequestTargetScope;\r\n\r\n /**\r\n * Constructor to initialize private variables.\r\n */\r\n public constructor() {\r\n this.initializeCaching();\r\n }\r\n\r\n /**\r\n * Initialize caching layer of resolver.\r\n *\r\n * WARNING!!! Do NOT add async/await in this function. It must remain a pure synchronous function in order\r\n * to initialize the indexedDB cache as quickly as possible before entry point beats to us due to multi-level\r\n * promise waiting hierarchies.\r\n *\r\n * @param idb object of indexedDb class. Unit tests set this value. It will be null in other cases.\r\n * @\r\n */\r\n public initializeCaching(idb?: IndexedDb): void {\r\n /**\r\n * In most cases configRootUrl will be sent by PCS so appEnvironment will have it.\r\n * In case it is not sent, we fall back to environmentConfig so config will be always served.\r\n */\r\n this.cdnConfigBaseUrl = appEnvironment.ConfigRootUrl || appEnvironment.EnvironmentConfigUrl;\r\n\r\n // Get ConfigServiceBaseUrl from appEnvironment\r\n this.configServiceBaseUrl = appEnvironment.ConfigServiceBaseUrl;\r\n\r\n this.resolverErrors = [];\r\n this.configTimings = [];\r\n\r\n this.useWebWorkerToCache = isWebWorkerPresent;\r\n\r\n this.indexedDb = idb ? idb : new IndexedDb();\r\n\r\n const enableCMSPPEConfigs = appEnvironment.EnableCMSPPEConfigs;\r\n\r\n // Check if IndexedDb is supported\r\n this.useIndexedDb =\r\n // Debug scenario: Check if indexedDB is allowed to be read in main thread. By default true.\r\n this.enableIndexedDbInMainResolver()\r\n // PCS flag to turn on/off IndexedDb caching of configs.\r\n && !appEnvironment.DisableCachingConfigs\r\n // Debug scenario: to turn off indexedDB in all threads.\r\n && this.indexedDb.isCachingAllowed\r\n // Check if there exists IndexedDB in browser\r\n && this.indexedDb.supported\r\n // Use case is simple config tests, we do not want to cache\r\n // Also not caching in server-side in this scenario\r\n && !enableCMSPPEConfigs;\r\n\r\n // Check if server cache could be used or not\r\n this.useServerCache = ServerCache !== null\r\n // PCS flag to turn on/off IndexedDb caching of configs.\r\n && !appEnvironment.DisableCachingConfigs\r\n // Use case is simple config tests, we do not want to cache\r\n // Also not caching in server-side in this scenario\r\n && !enableCMSPPEConfigs;\r\n\r\n this.setTargetScopeAndConfigServiceParams();\r\n\r\n // if pre-initialized config map doesn't exist or does not contain the storageKey entry we want,\r\n // then proceed to asynchronously initialize the configMap from indexedDb\r\n // NOTE: we only start the async read, and don't await for this to finish\r\n this.populateConfigMapFromIndexedDbAsync();\r\n }\r\n\r\n /**\r\n * Update target scope as well as updating config service parameters and other related target scope configurations\r\n * in case that target scope from appEnvironment changed during life cycle of a page.\r\n */\r\n public setTargetScopeAndConfigServiceParams() {\r\n\r\n const enableCMSPPEConfigs = appEnvironment.EnableCMSPPEConfigs;\r\n\r\n // Get current target scope in case it has changed. Special case for unit tests where override was set so we don't want to update target scope.\r\n this.currentTargetScope = this.currentTargetScopeOverride || appEnvironment.CurrentRequestTargetScope;\r\n\r\n // Read peregrine specific flights\r\n const pageExperiments = this.currentTargetScope && getPeregrineFlights(this.currentTargetScope.pageExperiments);\r\n if (pageExperiments && pageExperiments.length > 0) {\r\n this.peregrineFlights = pageExperiments.join(\",\");\r\n }\r\n\r\n this.scopeWithPeregrineFlights = {\r\n ...this.currentTargetScope,\r\n pageExperiments\r\n };\r\n\r\n // Check whether to use Config Resolver Service (CRS).\r\n this.enableConfigService = this.useConfigService();\r\n if (this.enableConfigService) {\r\n\r\n // Query string parameter from target scope.\r\n this.configServiceParameters = \"?targetScope=\" + JSON.stringify(this.scopeWithPeregrineFlights);\r\n\r\n // Send PCS apptype to CRS so we can build CRS Jarvis dashboards per apptype.\r\n this.configServiceParameters += `&apptype=${appEnvironment.AppType}`;\r\n\r\n const { IsMultiConfigRetrievalEnabled, CacheBustingIdentifier } = appEnvironment;\r\n\r\n // Check if CRS should fetch multiple configs and its depth.\r\n this.isMultiConfigRetrievalEnabled = IsMultiConfigRetrievalEnabled;\r\n if (this.isMultiConfigRetrievalEnabled) {\r\n this.configServiceParameters += `&maxDepth=${this.getConfigRetrievalMaxDepth()}`;\r\n }\r\n\r\n // If cbid is provided, typically in unit testing context, use it.\r\n // If window has _cbid then use it else use the value from PCS, to send to CRS for busting disk, AFD and Origin cache.\r\n const cacheBustingIdentifier = (canUseDOM() && window._cbid) || CacheBustingIdentifier;\r\n if (cacheBustingIdentifier) {\r\n this.configServiceParameters += `&cbid=${cacheBustingIdentifier}`;\r\n }\r\n\r\n // If url has dev only query string params, inform CRS so it can exclude from availability and will help debugging on Jarvis.\r\n if (this.containsDevOnlyQueryParameters()) {\r\n this.configServiceParameters += \"&item=dev:true\";\r\n }\r\n\r\n if (enableCMSPPEConfigs) {\r\n this.configServiceParameters += \"&item=cms:ppe\";\r\n }\r\n }\r\n\r\n // Update storage key based on target scope.\r\n this.storageKey = this.generateKey();\r\n }\r\n\r\n /**\r\n * Initialize Git config resolver environment.\r\n * @param trackAppErrorEvent - App Error function\r\n */\r\n public initialize(trackAppErrorEvent: (data: AppError) => void) {\r\n\r\n this.perfTimeline = tryGetPerfTimeline(\"Resolver\", \"Resolver\", true);\r\n\r\n initializePerfMarkerHelper(this.perfTimeline);\r\n\r\n // Check if this is git configs treatment\r\n if (!appEnvironment.IsGitConfigs) {\r\n return;\r\n }\r\n\r\n // Optionally pre-initialized IDB config read promise at the top page level\r\n const { _idbConfigOpenPromise = null, _idbConfigReadPromise = null, _idbConfigLookup = null } = canUseDOM() ? window : {};\r\n\r\n const configCacheProperties: ConfigCacheProperties = {\r\n ...this.getConfigCacheProperties(),\r\n idbConfigOpenPromise: _idbConfigOpenPromise,\r\n idbConfigReadPromise: _idbConfigReadPromise,\r\n idbConfigLookup: _idbConfigLookup\r\n };\r\n\r\n // Set up config service param contract\r\n const configServiceParameters: ConfigServiceParameters = {\r\n buildVersion: appEnvironment.BuildVersion,\r\n configServiceBaseUrl: appEnvironment.ConfigServiceBaseUrl.toString()\r\n };\r\n\r\n // Set up Git config resolver contract\r\n const resolverEnvironment: ResolverEnvironment = {\r\n appType: appEnvironment.AppType,\r\n configServiceParameters,\r\n targetScope: this.scopeWithPeregrineFlights,\r\n env: appEnvironment.Environment.toString(),\r\n featureFlags: appEnvironment.FeatureFlags,\r\n isThisWebWorkerThread: false,\r\n isWebWorkerPresent: this.useWebWorkerToCache,\r\n queryParams: UrlUtility.getParamsObj(getLocationSearch()),\r\n appErrorCallback: trackAppErrorEvent,\r\n perfMarkerCallback: addPerfMarker,\r\n loggerCallback: logger.log.bind(logger),\r\n logObjectsCallback: logger.logObjects.bind(logger),\r\n configCacheProperties,\r\n configOrigins: appEnvironment.ConfigOrigins,\r\n mockManager\r\n };\r\n\r\n // Initialize Git configs resolver with resolver environment\r\n this.configResolver = new ConfigResolver(resolverEnvironment);\r\n }\r\n\r\n /**\r\n * Merges config objects.\r\n * @private\r\n * @param {ExperienceConfigWrapper[]} configs - an array of config documents\r\n * @param {string} experienceType - experienceType\r\n * @return ExperienceConfig - returns merged config based on a set of rules\r\n */\r\n public mergeConfig(configs: IExperienceConfig[]): IExperienceConfig {\r\n if (!configs || configs.length < 1) {\r\n return null;\r\n }\r\n\r\n const result: IExperienceConfig = configs[0];\r\n\r\n // skip the 0th item as it is assigned to result above, only merge properties section\r\n for (let count = 1; count < configs.length; count++) {\r\n result.properties = mergeWith(result.properties, configs[count].properties, this.customizer);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * matches targeting scope and returns the config urls for the same.\r\n * @private\r\n * @param {IExperienceConfigIndex} configIndex - an array of config documents\r\n * @return string[] - returns urls for configurations for which the scope matched\r\n */\r\n public resolveConfigIndex(configIndex: IExperienceConfigIndex): string[] {\r\n if (!configIndex) {\r\n return null;\r\n }\r\n\r\n const configPaths: string[] = [];\r\n configIndex.configs.forEach(experienceRef => {\r\n if (this.targetScopeMatched(experienceRef)) {\r\n configPaths.push(experienceRef.href);\r\n }\r\n });\r\n\r\n // if override config is provided, then we add that to the end of list\r\n // so props provided in override config will add/update existing properties.\r\n // This is similar to CMS override settings but scoped to experience level.\r\n if (configIndex.overrideConfig && Utility.stringHasData(configIndex.overrideConfig.href)) {\r\n configPaths.push(configIndex.overrideConfig.href);\r\n }\r\n\r\n return configPaths;\r\n }\r\n\r\n /**\r\n * basic version of target scope that only checks market currently.\r\n * @private\r\n * @param {IExperienceConfigReference} experienceRef - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope matches with config target scope, otherwise false\r\n */\r\n public targetScopeMatched(experienceRef: IExperienceConfigLink): boolean {\r\n const targetScope = experienceRef.targetScope;\r\n\r\n // if target scope is undefined for a config entry, we treat that as default config and apply it\r\n if (!targetScope) {\r\n return true;\r\n }\r\n\r\n return (this.audienceModeMatched(targetScope)\r\n && this.browserTypeMatched(targetScope)\r\n && this.deviceTypeMatched(targetScope)\r\n && this.domainMatched(targetScope)\r\n && this.experimentMatched(targetScope)\r\n && this.marketMatched(targetScope)\r\n && this.osMatched(targetScope)\r\n && this.pageTypeMatched(targetScope)\r\n && this.platformMatched(targetScope));\r\n }\r\n\r\n /**\r\n * function to check if current audienceMode type matches target audienceMode type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope audienceMode matches with config target scope audienceMode, otherwise false\r\n */\r\n public audienceModeMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.audienceMode || this.currentTargetScope.audienceMode === targetScope.audienceMode;\r\n }\r\n\r\n /**\r\n * function to check if current browser type matches target browser type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope browser type matches with config target scope browser type, otherwise false\r\n */\r\n public browserTypeMatched(targetScope: PageRequestTargetScope): boolean {\r\n if (!targetScope.browser || !targetScope.browser.browserType) {\r\n return true;\r\n }\r\n\r\n if (this.currentTargetScope.browser && this.currentTargetScope.browser.browserType === targetScope.browser.browserType &&\r\n (!targetScope.browser.version || this.currentTargetScope.browser.version === targetScope.browser.version)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * function to check if current device type matches target device type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope device type matches with config target scope device type, otherwise false\r\n */\r\n public deviceTypeMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.deviceFormFactor || this.currentTargetScope.deviceFormFactor === targetScope.deviceFormFactor;\r\n }\r\n\r\n /**\r\n * Check if current domain matches target domain\r\n * @param targetScope - experience config reference that has targetscope as child property\r\n * @return Whether the current target scope domain matches with config target scope domain\r\n */\r\n public domainMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.domain || this.currentTargetScope.domain === targetScope.domain;\r\n }\r\n\r\n /**\r\n * function to check if current experiment id matches with the requested scope experiment id.\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope experiment matches with config target scope experiment, otherwise false\r\n */\r\n public experimentMatched(targetScope: PageRequestTargetScope): boolean {\r\n this.currentTargetScope.pageExperiments = this.currentTargetScope.pageExperiments || [];\r\n\r\n if (!isString(targetScope.experimentId) || isEmpty(targetScope.experimentId)\r\n || this.currentTargetScope.pageExperiments.indexOf(targetScope.experimentId) >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Compare the strings case insensitive.\r\n * @private\r\n * @param {string} lhs The string to compare.\r\n * @param {string} rhs The string to compare against.\r\n * @return {number} - true if the strings equal case insensitive.\r\n */\r\n public stringsEqualCaseInsensitive(lhs: string, rhs: string): boolean {\r\n return (lhs || \"\").localeCompare(rhs || \"\", undefined, { sensitivity: \"accent\" }) === 0;\r\n }\r\n\r\n /**\r\n * function to check if current market scope match with target scope market.\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope market matches with config target scope market, otherwise false\r\n */\r\n public marketMatched(targetScope: PageRequestTargetScope): boolean {\r\n // if locale is not part of target scope, we assume it is applicable for all locale.\r\n // Separated out this if condition to have clarity about this behavior.\r\n if (!targetScope.locale) {\r\n return true;\r\n }\r\n\r\n const targetLocale = targetScope.locale;\r\n const currentLocale = this.currentTargetScope.locale;\r\n\r\n if ((!targetLocale.language || this.stringsEqualCaseInsensitive(targetLocale.language, currentLocale.language)) &&\r\n (!targetLocale.market || this.stringsEqualCaseInsensitive(targetLocale.market, currentLocale.market)) &&\r\n (!targetLocale.script || this.stringsEqualCaseInsensitive(targetLocale.script, currentLocale.script))) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * function to check if current operating system type matches target operating system type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope operating system type matches with config target scope operating system type, otherwise false\r\n */\r\n public osMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.os || this.currentTargetScope.os === targetScope.os;\r\n }\r\n\r\n /**\r\n * function to check if current pagetype matches target scope\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope pagetype matches with config target scope pagetype, otherwise false\r\n */\r\n public pageTypeMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.pageType || this.currentTargetScope.pageType === targetScope.pageType;\r\n }\r\n\r\n /**\r\n * function to check if current scope platform type matches target scope platform type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\n public platformMatched(targetScope: PageRequestTargetScope): boolean {\r\n return !targetScope.platform || this.currentTargetScope.platform === targetScope.platform;\r\n }\r\n\r\n /**\r\n * Customizer for merge. We are explcitly overriding the array from taget to source. No array elements from source are preserved.\r\n * @private\r\n * @param {any} srcValue - source object to merge. Can be of type any\r\n * @param {any} objValue - target object to merge. Can be of type any\r\n * @return target Object when the type is array. Otherwise uses default behavior of merge.\r\n */\r\n public customizer(srcValue: any, objValue: any): any {\r\n if (isArray(srcValue)) {\r\n return objValue;\r\n }\r\n }\r\n\r\n /**\r\n * Function to clear internal state map for Unit testing.\r\n * @public\r\n * @void\r\n */\r\n public clearInternalState(): void {\r\n this.configMap.clear();\r\n this.initializeIndexedDb.cache.clear();\r\n this.populateConfigMapFromIndexedDbAsync.cache.clear();\r\n }\r\n\r\n /**\r\n * Function to override current request target scope. Should be used only when running outside the\r\n * context of client side rendering. Example tooling.\r\n * This function should not be called by any client rendering experience running inside the Page Context.\r\n * @public\r\n * @param {PageRequestTargetScope} targetScope - Target scope to override current Request target scope\r\n * @void\r\n */\r\n public overrideCurrentRequestTargetScope(targetScope: PageRequestTargetScope): void {\r\n this.currentTargetScopeOverride = targetScope;\r\n if (this.currentTargetScopeOverride) {\r\n this.currentTargetScope = this.currentTargetScopeOverride;\r\n }\r\n }\r\n\r\n /**\r\n * Function to override current request environment. Should be used only when not running outside the\r\n * context of client side rendering. Example tooling\r\n * @public\r\n * @param {Environment} overrideEnv - environment enum to override\r\n * @void\r\n */\r\n public overrideCurrentRequestEnvironment(overrideEnv: Environment): void {\r\n // fallback as prod\r\n this.env = overrideEnv || Environment.prod;\r\n }\r\n\r\n /**\r\n * Overrides a config entry. Use for local testing only. Does not work on PROD environment.\r\n * @param relativeUrl The config index URL to override\r\n * @param experienceType The experience type\r\n * @param config The config to use\r\n */\r\n public overrideConfig(configId: string | ConfigReference, experienceType: string, config: any): void {\r\n\r\n if (this.env !== Environment.prod) {\r\n\r\n const overrideKey = (typeof configId === \"string\")\r\n ? configId\r\n : getConfigRefString(configId);\r\n\r\n this.localOverrideMap[overrideKey] = {\r\n experienceType: experienceType,\r\n properties: config,\r\n typeVersion: \"1.0.0\",\r\n _name: \"index\"\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Gets the root entry point config for the current app context. This transparently handles\r\n * the entry point config for both CMS and Git based configs.\r\n * @param cmsHref - The CMS based HREF for the app config. This is here to support backwards compatibility\r\n * with CMS based configs when Git configs are not enabled.\r\n * @returns The config for the root entry point experience from which to start page rendering.\r\n */\r\n public async getRootConfig(cmsHref: string): Promise {\r\n\r\n if (!appEnvironment.IsGitConfigs) {\r\n return await this.getConfig(cmsHref);\r\n }\r\n\r\n const appConfigDoc = await this.getConfig(getRootConfigRef());\r\n const appConfig = appConfigDoc.properties as AppConfig;\r\n return await this.getConfig(appConfig.rootExperience.configRef);\r\n }\r\n\r\n /**\r\n * Returns the resolved merged Experience config when passed Experience Config Index.\r\n * This function downloads the config index, filter based on target scope, download the configs and\r\n * merge the configs\r\n * @public\r\n * @param {string | ConfigReference} configId - Experience Index document relative url or configRef object\r\n * @return Promise\r\n */\r\n public async getConfig(configId: string | ConfigReference): Promise {\r\n\r\n if (!this.currentTargetScope) {\r\n return Promise.reject(new Error(`getConfig: Invalid target scope when fetching config ${JSON.stringify(configId)}`));\r\n }\r\n\r\n const startGetConfig = performance.now();\r\n\r\n // If this is Git configs treatment, return config object from Git config resolver.\r\n // Do not use cached response from this file.\r\n if (appEnvironment.IsGitConfigs) {\r\n if ((typeof configId === \"string\")) {\r\n const message = \"Invalid config Id for Git configs flight\";\r\n this.resolverErrors.push({\r\n ...GitConfigsInvalidConfigRef,\r\n message,\r\n pb: {\r\n ...GitConfigsInvalidConfigRef.pb,\r\n customMessage: configId\r\n }\r\n });\r\n return Promise.reject(new Error(`${message}: ${configId}`));\r\n }\r\n\r\n if (!this.configResolver) {\r\n const message = \"Invalid configResolver object for Git configs flight\";\r\n this.resolverErrors.push({\r\n ...GitConfigsInvalidConfigResolver,\r\n message,\r\n pb: {\r\n ...GitConfigsInvalidConfigResolver.pb,\r\n customMessage: JSON.stringify(configId)\r\n }\r\n });\r\n return Promise.reject(new Error(`${message}: ${JSON.stringify(configId)}`));\r\n }\r\n\r\n const configIdStr = getConfigRefString(configId);\r\n const localOverride = this.localOverrideMap[configIdStr];\r\n if (localOverride) {\r\n return localOverride;\r\n }\r\n\r\n this.addConfigTiming(configId.experienceType, startGetConfig, \"network\");\r\n const configEndMeasure = this.perfTimeline && this.perfTimeline.startMeasure(\"config\", configIdStr).endMeasure;\r\n let config: ExperienceConfigWrapper;\r\n let gitConfigFromMemory: ExperienceConfig;\r\n\r\n try {\r\n\r\n gitConfigFromMemory = this.configResolver.tryGetConfigSync(configId);\r\n const gitConfig = gitConfigFromMemory || await this.configResolver.getConfig(configId);\r\n\r\n if (!gitConfig) {\r\n return Promise.reject(new ConfigFetchError(`Could not fetch Git config id ${JSON.stringify(configId)}`, this.configResolver.crsHadNetworkError));\r\n }\r\n\r\n return config = {\r\n experienceType: configId.experienceType,\r\n properties: gitConfig.properties || {},\r\n typeVersion: \"Git\",\r\n _name: getConfigRefString(configId)\r\n };\r\n\r\n } finally {\r\n if (configEndMeasure) {\r\n const configSource = (gitConfigFromMemory && \"memory\") || (config && \"network\") || \"error\";\r\n configEndMeasure(`${configIdStr}-${configSource}`);\r\n }\r\n }\r\n }\r\n\r\n const relativeUrl = configId as string;\r\n\r\n if (!relativeUrl || !isString(relativeUrl) || isEmpty(relativeUrl)) {\r\n throw new Error(\"getConfig: Invalid relativeUrl\");\r\n }\r\n\r\n // If there is a local override for testing, use it.\r\n const localOverride = this.localOverrideMap[relativeUrl];\r\n if (localOverride) {\r\n return localOverride;\r\n }\r\n\r\n const cacheKey = this.getCacheKey(relativeUrl);\r\n\r\n // if it exists in memory, return it immediately\r\n const configFromMemory = this.configMap.get(cacheKey);\r\n if (configFromMemory) {\r\n this.addConfigTiming(configFromMemory.experienceType, startGetConfig, \"cache\");\r\n return configFromMemory;\r\n }\r\n\r\n // if promiseMap has the item, we already have an active promise which is not yet resolved/rejected. Return this promise\r\n const existingPromise = this.promiseMap.get(cacheKey);\r\n if (existingPromise) {\r\n return existingPromise;\r\n }\r\n\r\n let processed = false;\r\n const configEndMeasure = this.perfTimeline && this.perfTimeline.startMeasure(\"config\", relativeUrl).endMeasure;\r\n let experienceType: string;\r\n let configSource: string;\r\n\r\n const configPromise = new Promise(async (resolve, reject) => {\r\n\r\n try {\r\n // Fetch merged config from server cache if available\r\n if (this.useServerCache) {\r\n\r\n let hasCacheError = false;\r\n let isHeadConfig = false;\r\n\r\n const cachedOnServer: boolean = await ServerCache.has(cacheKey);\r\n if (cachedOnServer) {\r\n // Retrieve and deserialize the stringified config stored in ServerCache\r\n const serializedConfig: string = await ServerCache.get(cacheKey);\r\n const configFromServerCache = serializedConfig ? JSON.parse(serializedConfig) as ExperienceConfigWrapper : null;\r\n if (configFromServerCache) {\r\n this.configTimings.push({\r\n experienceType: configFromServerCache.experienceType,\r\n cacheFetchDuration: performance.now() - startGetConfig\r\n });\r\n\r\n // This is true for head configs in multi-config fetch\r\n isHeadConfig = !!(configFromServerCache.relatedConfigIndexHref);\r\n\r\n processed = true;\r\n this.promiseMap.delete(cacheKey);\r\n resolve(configFromServerCache);\r\n\r\n // Update config in server cache if this is already stale (5 minutes)\r\n // This will be fire and forget internally so this resolver might last longer than expected\r\n if (this.isServerCacheConfigStale(configFromServerCache.storageTimestamp)) {\r\n await this.updateServerCache(relativeUrl, configFromServerCache);\r\n }\r\n } else {\r\n logger.log(`Resolver: cacheKey=${cacheKey} Undefined from server cache`);\r\n hasCacheError = true;\r\n }\r\n }\r\n\r\n // Log all config activity for server side so this could be output as metrics.\r\n logger.logObjects({\r\n serverCacheGetConfig: {\r\n cacheKey: cacheKey,\r\n isHeadConfig: isHeadConfig,\r\n isCached: cachedOnServer,\r\n hasCacheError: hasCacheError\r\n }\r\n });\r\n\r\n // Throw error when failed to fetch config from server cache even when it exists.\r\n // This is usually due to really busy IPC traffic ie Server Cache message timing out communication to main process.\r\n if (cachedOnServer && hasCacheError) {\r\n const message = \"Sever Cache key exists but server cache is undefined. Usually due to timeout when server cache IPC is busy.\";\r\n const detailedMessage = `cacheKey=${cacheKey}`;\r\n const error = new Error(message);\r\n Telemetry.sendAppErrorEvent({\r\n ...SSRAppErrors.ServerCacheFetchFailed,\r\n message: message,\r\n pb: {\r\n ...SSRAppErrors.ServerCacheFetchFailed.pb,\r\n customMessage: detailedMessage\r\n }\r\n });\r\n\r\n // Throw the error so the request would 500 instead of returning back results.\r\n throw error;\r\n } else if (cachedOnServer) {\r\n // Already resolved the cached config. End promise.\r\n return;\r\n }\r\n\r\n // Not found on server cache so getting config from network\r\n const networkReadPromise = this.getConfigFromNetwork(relativeUrl);\r\n\r\n // Await on the network promise to get the merged config.\r\n const networkConfigsMap = await networkReadPromise;\r\n const networkConfig = networkConfigsMap.get(cacheKey);\r\n experienceType = networkConfig.experienceType;\r\n this.addConfigTiming(experienceType, startGetConfig, configSource = \"network\");\r\n resolve(networkConfig);\r\n\r\n } else {\r\n // this will contain both the IDB cache read promise, in case we haven't yet read from\r\n // IDB yet, as well as the network read promise, which we will race until one finishes.\r\n const readPromises: Array> = [\r\n\r\n // it's possible that the IDB read is still going on, so see if we can get results from\r\n // cache after racing with it. Note that we never want to 'hard await' on the IDB read\r\n // as it's possible the IDB read may have errored out / stalled, etc. So we're using this\r\n // result only as a secondary fallback. Primary is still the network.\r\n this.populateConfigMapFromIndexedDbAsync()\r\n ];\r\n\r\n const networkReadPromise = this.getConfigFromNetwork(relativeUrl);\r\n readPromises.push(networkReadPromise as Promise);\r\n\r\n // start the race between network and IDB cache read\r\n await Promise.race(readPromises);\r\n\r\n // after the race check in-memory again (in case the IDB read finished populated the\r\n // in-memory map early)\r\n const configFromMemoryAfterRace = this.configMap.get(cacheKey);\r\n if (configFromMemoryAfterRace) {\r\n experienceType = configFromMemoryAfterRace.experienceType;\r\n this.addConfigTiming(experienceType, startGetConfig, configSource = \"cache\");\r\n resolve(configFromMemoryAfterRace);\r\n return;\r\n }\r\n\r\n // Await on the network promise to get the merged config.\r\n const networkConfigsMap = await networkReadPromise;\r\n const networkConfig = networkConfigsMap.get(cacheKey);\r\n experienceType = networkConfig.experienceType;\r\n this.addConfigTiming(experienceType, startGetConfig, configSource = \"network\");\r\n resolve(networkConfig);\r\n\r\n }\r\n } catch (error) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.GetConfigException,\r\n message: \"Exception in getConfig\",\r\n pb: {\r\n ...ResolverAppErrors.GetConfigException.pb,\r\n customMessage: `Relative Url: ${relativeUrl}. Error ${error.message || error}`\r\n }\r\n });\r\n\r\n // If we don't explicitly catch the error, then the promise never gets rejected which might cause issues during experience load time.\r\n reject(error);\r\n } finally {\r\n\r\n processed = true;\r\n this.promiseMap.delete(cacheKey);\r\n\r\n // only measure the network operations (otherwise there are too many overlapping measures to make sense)\r\n if (configEndMeasure) {\r\n configEndMeasure(`${experienceType}-${relativeUrl}-${configSource}`);\r\n }\r\n }\r\n });\r\n\r\n // if caller is using await then this request has been processed and we should not add it to promiseMap.\r\n // if caller is trying to download multiple configs in parallel, then processed should be false.\r\n if (!processed) {\r\n this.promiseMap.set(cacheKey, configPromise);\r\n }\r\n\r\n return configPromise;\r\n }\r\n /**\r\n * Returns the resolved merged Experience config when passed Experience Config Index.\r\n * This function downloads the config index, filter based on target scope, download the configs and\r\n * merge the configs\r\n * @private\r\n * @param {string} relativeUrl - Expeience Index document relative url.\r\n * @param {boolean} sendRefreshError - True if server cache refresh error should be sent immediately. False by default to push to resolverErrors.\r\n * @return Promise> map of config(s) resolved by service/cdn.\r\n */\r\n public async getConfigFromNetwork(relativeUrl: string, sendRefreshError = false): Promise> {\r\n\r\n const cacheKey = this.getCacheKey(relativeUrl);\r\n\r\n const mergedConfigsMap = new Map();\r\n\r\n if (this.enableConfigService) {\r\n const configServiceRelativeUrl = this.removeCmsPathFromRelativeUrl(relativeUrl) + this.configServiceParameters;\r\n try {\r\n // Get merged config from config service with multi config support.\r\n if (this.isMultiConfigRetrievalEnabled) {\r\n const crsResponse = await this.downloadFile(new URL(`${configServiceRelativeUrl}${this.configServiceBaseUrl.search}`, this.configServiceBaseUrl), true);\r\n if (crsResponse && crsResponse.rootConfigIndexId && crsResponse.configs) {\r\n const configs = Object.keys(crsResponse.configs).map(e => crsResponse.configs[e]);\r\n for (const crsMergedConfig of configs) {\r\n if (crsMergedConfig && crsMergedConfig.configIndexHref) {\r\n const configIndexKey = crsMergedConfig.configIndexHref;\r\n const isHeadConfig = configIndexKey === relativeUrl;\r\n // Save config to in-memory cache on client or server cache on server.\r\n // Only track relative config hrefs for head config since only need it to trigger freshness update for the others.\r\n await this.addConfigToConfigMap(configIndexKey, crsMergedConfig, isHeadConfig ? configs : null);\r\n mergedConfigsMap.set(this.getCacheKey(configIndexKey), crsMergedConfig);\r\n\r\n if (canUseDOM()) {\r\n logger.log(`Resolver: ${configIndexKey} config for ${crsMergedConfig.experienceType} fetched from network using CRS url with multi config support.`);\r\n }\r\n }\r\n }\r\n return mergedConfigsMap;\r\n }\r\n } else {\r\n // Get single merged config from config service\r\n const crsConfig = await this.downloadFile(new URL(`${configServiceRelativeUrl}${this.configServiceBaseUrl.search}`, this.configServiceBaseUrl), true);\r\n if (crsConfig) {\r\n // Save config to in-memory cache\r\n await this.addConfigToConfigMap(relativeUrl, crsConfig);\r\n mergedConfigsMap.set(cacheKey, crsConfig);\r\n if (canUseDOM()) {\r\n logger.log(`Resolver: ${cacheKey} config for ${crsConfig.experienceType} fetched from network using CRS url.`);\r\n }\r\n return mergedConfigsMap;\r\n }\r\n }\r\n } catch (error) {\r\n const message = `CRS fetch failed for ${relativeUrl}.`;\r\n const detailedMessage = `CRS relative Url: ${configServiceRelativeUrl} Error: ${error}`;\r\n if (sendRefreshError) {\r\n Telemetry.sendAppErrorEvent({\r\n ...SSRAppErrors.ServerCacheRefreshFailed,\r\n message: message,\r\n pb: {\r\n ...SSRAppErrors.ServerCacheRefreshFailed.pb,\r\n customMessage: detailedMessage\r\n }\r\n });\r\n } else {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.CrsFetchError,\r\n message: message,\r\n pb: {\r\n ...ResolverAppErrors.CrsFetchError.pb,\r\n customMessage: detailedMessage\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Get config from CDN when config service is not enabled or it returned null or invalid response.\r\n if (mergedConfigsMap && !mergedConfigsMap.has(cacheKey)) {\r\n const cdnConfig = await this.downloadMergeConfig(relativeUrl);\r\n if (cdnConfig) {\r\n\r\n // Save config to in-memory cache\r\n await this.addConfigToConfigMap(relativeUrl, cdnConfig);\r\n\r\n mergedConfigsMap.set(cacheKey, cdnConfig);\r\n if (canUseDOM()) {\r\n logger.log(`Resolver: ${cacheKey} config fetched from network using Akamai url.`);\r\n }\r\n\r\n // Dev scenario: if config service is not enabled and we got configs from CDN, do not log app error.\r\n if (this.enableConfigService) {\r\n this.resolverErrors.push({\r\n ...ResolverErrorConfigsDownloadedByCdn,\r\n message: \"Configs served from CDN after CRS fetch failed\",\r\n pb: {\r\n ...ResolverErrorConfigsDownloadedByCdn.pb,\r\n customMessage: `Relative Url: ${relativeUrl} CRS Params: ${this.configServiceParameters}`\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n return mergedConfigsMap;\r\n }\r\n\r\n /**\r\n * Set configMap object with appropriate values.\r\n * @private\r\n * @param configIndexHref example: cms/api/amp/experienceConfigIndex/AfCDeG\r\n * @param config object of ExperienceConfigWrapper\r\n * @param multiConfigs optional array of related ExperienceConfigWrapper due to multi config support from CRS (server only)\r\n */\r\n public async addConfigToConfigMap(configIndexHref: string, config: ExperienceConfigWrapper, multiConfigs?: ExperienceConfigWrapper[]): Promise {\r\n config.storageTimestamp = this.stalenessCheckTimestamp;\r\n config.configIndexHref = configIndexHref;\r\n\r\n const cacheKey = this.getCacheKey(configIndexHref);\r\n\r\n // No need to cache on configMap on server side since it will be another layer of memcache to worry about.\r\n if (this.useServerCache) {\r\n\r\n // Update related config href if passed in.\r\n if (multiConfigs) {\r\n config.relatedConfigIndexHref = multiConfigs.map(c => c.configIndexHref);\r\n }\r\n\r\n // Save config to server cache so other processes could reuse the cache.\r\n // ServerCache only accepts string to avoid serialization issues.\r\n // TTL is 1 day for now.\r\n const serializedConfig = JSON.stringify(config);\r\n await ServerCache.set(cacheKey, serializedConfig, SERVER_CACHE_TTL);\r\n } else {\r\n // Set configMap for future reference.\r\n this.configMap.set(cacheKey, config);\r\n }\r\n }\r\n\r\n /**\r\n * Refresh and update config when stale for server cache in order to reduce overall network call from server side.\r\n * @private\r\n * @param configIndexHref example: cms/api/amp/experienceConfigIndex/AfCDeG\r\n * @param configFromServerCache object of ExperienceConfigWrapper\r\n */\r\n public async updateServerCache(configIndexHref: string, configFromServerCache: ExperienceConfigWrapper) {\r\n\r\n // Server only sanity check\r\n if (!this.useServerCache) {\r\n return;\r\n }\r\n\r\n try {\r\n // Skip refresh config if it is already in the promise map\r\n if (!this.refreshServerCachePromiseMap.get(configIndexHref)) {\r\n\r\n // Refresh config and related config first so other processes don't trigger network call as well.\r\n // This is not perfect as this is not atomic so there might be race condition which doesn't really cause harm except multiple network calls might happen.\r\n // Better implementation would be separate worker thread to deal with refreshes but more complicated implementation.\r\n if (configFromServerCache.relatedConfigIndexHref) {\r\n await Promise.all(configFromServerCache.relatedConfigIndexHref.map(x => {\r\n const refreshPromise = (x === configIndexHref) ?\r\n this.refreshConfigServerCache(configIndexHref, configFromServerCache) :\r\n this.refreshConfigServerCache(x);\r\n\r\n this.refreshServerCachePromiseMap.set(x, refreshPromise);\r\n return refreshPromise;\r\n }));\r\n\r\n // Remove from promise map after all refreshes are done.\r\n for (let i = 0; i < configFromServerCache.relatedConfigIndexHref.length; i++) {\r\n this.refreshServerCachePromiseMap.delete(configFromServerCache.relatedConfigIndexHref[i]);\r\n }\r\n } else {\r\n const refreshPromise = this.refreshConfigServerCache(configIndexHref, configFromServerCache);\r\n this.refreshServerCachePromiseMap.set(configIndexHref, refreshPromise);\r\n await refreshPromise;\r\n this.refreshServerCachePromiseMap.delete(configIndexHref);\r\n }\r\n\r\n // Update config from network again since this is now stale.\r\n //\r\n // Note that there's no await here since we do want to fire and forget config update on server cache\r\n // so we could serve next request asap.\r\n // Closure for \"this\" scope is maintained but not any global singleton;\r\n // so if next request starts before updateServerCache promise is done, singletons could be reset.\r\n // Fortunately, only logger and app errors are called and not appEnvironment.\r\n this.getConfigFromNetwork(configIndexHref);\r\n }\r\n } catch (error) {\r\n const message = `Update server cache failed for ${configIndexHref}.`;\r\n const detailedMessage = `Error: ${error}`;\r\n\r\n Telemetry.sendAppErrorEvent({\r\n ...SSRAppErrors.ServerCacheRefreshFailed,\r\n message: message,\r\n pb: {\r\n ...SSRAppErrors.ServerCacheRefreshFailed.pb,\r\n customMessage: detailedMessage\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Refresh config staleness WITHOUT changing the value on server cache\r\n * so that other processes don't need to fetch config from network at the same time.\r\n * @private\r\n * @param configIndexHref example: cms/api/amp/experienceConfigIndex/AfCDeG\r\n * @param configFromServerCache object of ExperienceConfigWrapper\r\n */\r\n private async refreshConfigServerCache(configIndexHref: string, configFromServerCache?: ExperienceConfigWrapper): Promise {\r\n\r\n // Server only sanity check\r\n if (!this.useServerCache) {\r\n return;\r\n }\r\n\r\n const cacheKey = this.getCacheKey(configIndexHref);\r\n\r\n if (!configFromServerCache) {\r\n const serializedConfig: string = await ServerCache.get(cacheKey);\r\n configFromServerCache = serializedConfig ? JSON.parse(serializedConfig) as ExperienceConfigWrapper : null;\r\n }\r\n\r\n if (configFromServerCache) {\r\n // Update staleness timestamp to current request and set to server cache\r\n configFromServerCache.storageTimestamp = this.stalenessCheckTimestamp;\r\n const serializedConfig = JSON.stringify(configFromServerCache);\r\n await ServerCache.set(cacheKey, serializedConfig, SERVER_CACHE_TTL);\r\n }\r\n }\r\n\r\n /**\r\n * Clear render cache when applicable.\r\n * @private\r\n * @param areConfigsEqual: response from web worker. This is typically true or false in this case.\r\n */\r\n public purgeRenderCacheUponConfigChanges(areConfigsEqual: boolean): void {\r\n if (areConfigsEqual) {\r\n return;\r\n }\r\n\r\n try {\r\n getLocalStorage().removeSubstringKeys(\"lastKnown_\");\r\n getLocalStorage().removeSubstringKeys(\"timestamp_\");\r\n getLocalStorage().removeSubstringKeys(\"keys_\");\r\n } catch (e) {\r\n // Send alert to monitoring system that render cache is not being purged, when it is supposed to.\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.FailedToPurgeRenderCache,\r\n message: \"Failed to purge render cache when cached config and network config is not same.\",\r\n pb: {\r\n ...ResolverAppErrors.FailedToPurgeRenderCache.pb,\r\n customMessage: e\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get the config over the network, merge and return.\r\n * @private\r\n * @param {string} relativeUrl - Expeience Index document relative url.\r\n * @return Promise\r\n */\r\n public async downloadMergeConfig(relativeUrl: string): Promise {\r\n const experienceIndex = await this.downloadFile(new URL(`${relativeUrl}${this.cdnConfigBaseUrl.search}`, this.cdnConfigBaseUrl), false);\r\n const configPaths = this.resolveConfigIndex(experienceIndex);\r\n const configObjects = await this.downloadExperienceConfig(this.cdnConfigBaseUrl, configPaths);\r\n const config: ExperienceConfigWrapper = this.mergeConfig(configObjects) as ExperienceConfigWrapper;\r\n config.experienceType = experienceIndex.experienceType;\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Given an array of config urls, this function downloads them in parallel and returns a promise.\r\n * @private\r\n * @param {string} baseConfigUrl - base config url depends on implementation\r\n * @param {string[]} hrefs - Array of configuration relative urls\r\n * @return Promise\r\n */\r\n public async downloadExperienceConfig(baseConfigUrl: URL, hrefs: string[]): Promise {\r\n const promiseArray = [];\r\n hrefs.forEach(href => {\r\n promiseArray.push(this.downloadFile(new URL(`${href}${baseConfigUrl.search}`, baseConfigUrl), false));\r\n });\r\n\r\n return await Promise.all(promiseArray);\r\n }\r\n\r\n /**\r\n * downloads file from CMS given the relative url\r\n * @private\r\n * @param {string} relativeUrl - relative url of the document\r\n * @param {boolean} isCrsFetch - Is this CRS fetch\r\n * @return Promise returns generic Type object wrapped in Promise\r\n */\r\n public async downloadFile(url: URL, isCrsFetch: boolean): Promise {\r\n // Use node-fetch to be compatible with SSR\r\n // Default timeout is 10 seconds client side, 900ms server side\r\n const timeoutInMs = canUseDOM() ? CSRTimeoutInMs : SSRTimeoutInMs;\r\n const fetchUrl = url.toString();\r\n return abortableFetch(fetchUrl, timeoutInMs)\r\n .then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n\r\n let errorMessage = \"\";\r\n if (isCrsFetch) {\r\n const crsVersion = response.headers.get(\"X-Crs-BuildVersion\") || \"\";\r\n const msedgeRef = response.headers.get(\"x-msedge-ref\") || \"\";\r\n errorMessage = `msedge ref: ${msedgeRef} Status: ${response.status}, Status Text: ${response.statusText}, Url: ${fetchUrl} and CRS Version: ${crsVersion}`;\r\n this.resolverErrors.push(createError(ConfigCrsFetchNon200Response, \"CRS sent non-200 response\", errorMessage));\r\n } else {\r\n errorMessage = `Status: ${response.status}, Status Text: ${response.statusText}, Url: ${fetchUrl}`;\r\n this.resolverErrors.push(createError(ConfigCdnFetchNon200Response, \"Cdn config fetch received non-200 response\", errorMessage));\r\n }\r\n\r\n return Promise.resolve();\r\n });\r\n }\r\n\r\n /**\r\n * This function generates a key that is used to write/read configurations to/from storage.\r\n * example key: \"kids|ja|jp|testPage|mmx\"\r\n * @private\r\n * @return string\r\n */\r\n public generateKey(): string {\r\n\r\n // Client side resolver will use reduced set of keys for perf and retrival logic. This logic has to match WebWorkerResolver.generateKey\r\n if (canUseDOM()) {\r\n\r\n const { audienceMode = \"\", locale = {}, pageType = \"\" } = this.currentTargetScope || {};\r\n const { language, market } = locale;\r\n\r\n const keys = [audienceMode, language, market, pageType, appEnvironment.AppType || \"\"];\r\n return keys.map(key => key || \"\").join(\"|\").toLowerCase();\r\n\r\n // Server side resolver needs to generate full set of target scopes since multiple pages/users will share the same cache for longer duration\r\n } else {\r\n let { audienceMode = \"\",\r\n browser = null,\r\n deviceFormFactor = \"\",\r\n experimentId = \"\",\r\n locale = {},\r\n os = {},\r\n pageType = \"\",\r\n platform = \"\",\r\n pageExperiments = null } = this.currentTargetScope || {};\r\n const { language, market } = locale;\r\n const { browserType = \"\", version = \"\" } = browser || {};\r\n\r\n // Filter out non-peregrine flights so they are not part of cache key.\r\n pageExperiments = getPeregrineFlights(pageExperiments);\r\n\r\n const keys = [audienceMode, browserType, version, deviceFormFactor, language, market, os, experimentId, pageType, platform, pageExperiments ? pageExperiments.join() : \"\", appEnvironment.AppType || \"\"];\r\n return keys.map(key => key || \"\").join(\"|\").toLowerCase();\r\n }\r\n }\r\n\r\n /**\r\n * Function checks if ConfigService is enabled.\r\n * @returns true if supported else false.\r\n */\r\n public useConfigService(): boolean {\r\n const urlQuery = getLocationSearch();\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(\"enableConfigService\", urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n // PCS flag to turn on/off ConfigService.\r\n // When EnableConfigService = false, it gets configs from CDN and merge at client side.\r\n return appEnvironment.EnableConfigService;\r\n }\r\n\r\n /**\r\n * Function that returns maxDepth if exists in query string else default value.\r\n * This is the max depth of the config tree.\r\n * @returns Depth of config in tree.\r\n */\r\n public getConfigRetrievalMaxDepth(): string {\r\n const param = UrlUtility.getQueryParameterByName(\"maxDepth\", getLocationHref());\r\n if (param) {\r\n return param;\r\n }\r\n\r\n // PCS flag for maxDepth\r\n if (appEnvironment.FeatureFlags\r\n && appEnvironment.FeatureFlags.crsMaxDepth) {\r\n return appEnvironment.FeatureFlags.crsMaxDepth;\r\n }\r\n\r\n // Config service to use this default to parse depth of config tree.\r\n return \"10\";\r\n }\r\n\r\n /**\r\n * Function checks if url has any dev only query string param\r\n * @returns true if exist else false.\r\n */\r\n public containsDevOnlyQueryParameters(): boolean {\r\n const urlQuery = getLocationSearch();\r\n const item = UrlUtility.getQueryParameterByName(\"item\", urlQuery);\r\n if (item && item.length > 0) {\r\n return true;\r\n }\r\n\r\n const segment = UrlUtility.getQueryParameterByName(\"pcsonly\", urlQuery);\r\n if (segment && segment.length > 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns resolver errors if any.\r\n * @returns resolverErrors\r\n */\r\n public getResolverErrors(): AppError[] {\r\n return this.resolverErrors;\r\n }\r\n\r\n /**\r\n * Refresh configs in indexedDb. Next time users visits the page within 3 days, we will get configs from indexedDB first\r\n * After TTVR we will background refresh them in web worker through this function.\r\n * If it more than 3 days, we won't use indexedDb response in main thread, After TTVR, we will background refresh.\r\n * This is required to have latest configs in indexedDb\r\n */\r\n public async refreshConfigCache(): Promise {\r\n // If web worker is not enabled, do not refresh.\r\n if (!this.useWebWorkerToCache) {\r\n return;\r\n }\r\n\r\n try {\r\n // Send post message to web worker to refresh indexedDB.\r\n const wwResponse = await getFromWebWorker({ id: \"refreshconfigs\" });\r\n if (wwResponse\r\n && wwResponse.fetched\r\n && wwResponse.payload !== undefined\r\n && wwResponse.payload !== null) {\r\n\r\n // Receive payload as post message response containing whether configs are changed and live cache busting identifier.\r\n const refreshConfigResponse = wwResponse.payload;\r\n\r\n // Check if cached config and network config properties have any changes.\r\n this.purgeRenderCacheUponConfigChanges(refreshConfigResponse.configsEqual);\r\n\r\n // Git configs treatment: write config hashes to local storage.\r\n this.writeConfigCacheProperties();\r\n\r\n // For Flight specific config resolution, we want to use cached configs only if flights match.\r\n try {\r\n getLocalStorage().setItem(this.peregrineFlightsKey, this.peregrineFlights);\r\n } catch (e) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.PrgFlightLsWriteError,\r\n message: \"Error writing prg flights to \",\r\n pb: {\r\n ...ResolverAppErrors.PrgFlightLsWriteError.pb,\r\n customMessage: e\r\n }\r\n });\r\n }\r\n\r\n // Web worker queried CRS endpoint and got value latest liveCbId.\r\n // Write CBID into local storage.\r\n if (refreshConfigResponse.liveCbId) {\r\n const liveCbid = refreshConfigResponse.liveCbId.toString();\r\n this.writeCbidInLocalStorage(liveCbid);\r\n\r\n const pcsCbid = appEnvironment.CacheBustingIdentifier || \"\";\r\n const highestCbid = window._cbid || \"\";\r\n if (!appEnvironment.IsGitConfigs\r\n && (liveCbid !== pcsCbid\r\n || liveCbid !== highestCbid)) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.DifferentCbid,\r\n message: \"Different Cbid detected than configured.\",\r\n pb: {\r\n ...ResolverAppErrors.DifferentCbid.pb,\r\n customMessage: `PcsCbid = ${pcsCbid}. HighestCbid = ${highestCbid}. LiveCbid = ${liveCbid}.`\r\n }\r\n });\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.RefreshConfigCacheFailed,\r\n message: \"refreshConfigCache error\",\r\n pb: {\r\n ...ResolverAppErrors.RefreshConfigCacheFailed.pb,\r\n customMessage: e\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Function checks whether to enable or disable indexedDb in main using query string override.\r\n * @returns true if supported else false.\r\n */\r\n public enableIndexedDbInMainResolver(): boolean {\r\n const urlQuery = getLocationSearch();\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(\"enableIndexedDbInMainResolver\", urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Function to check config is stale.\r\n * @returns true if stale else false.\r\n */\r\n public isConfigStale(storageTimestamp: number): boolean {\r\n if (!storageTimestamp) {\r\n return true;\r\n }\r\n\r\n // 259200000 = 3 days in milliseconds\r\n if ((this.stalenessCheckTimestamp - storageTimestamp) > 259200000) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Function to check config on server cache is stale\r\n * @returns true if stale else false.\r\n */\r\n public isServerCacheConfigStale(storageTimestamp: number): boolean {\r\n if (!storageTimestamp) {\r\n return true;\r\n }\r\n\r\n // 300000 = 5 minutes in milliseconds\r\n if ((this.stalenessCheckTimestamp - storageTimestamp) > SERVER_CACHE_CONFIG_STALENESS_TIMEOUT) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Removes relative path from url and returns Config Index Href.\r\n * Input Example: cms/api/amp/experienceConfigIndex/ABCD\r\n * @returns string. Example: ABCD\r\n */\r\n public removeCmsPathFromRelativeUrl(relativeUrl: string): string {\r\n return relativeUrl.replace(\"cms/api/amp/experienceConfigIndex/\", \"\");\r\n }\r\n\r\n /**\r\n * Removes cached config from IndexedDB.\r\n */\r\n public removeCachedConfig(relativeUrl: string): void {\r\n // check if web worker and indexedDb use is allowed.\r\n if (this.useWebWorkerToCache && this.useIndexedDb) {\r\n // Send post message to web worker.\r\n sendToWebWorker({ id: \"clearconfigcache\", payload: relativeUrl });\r\n } else {\r\n // If web worker is not allowed, remove all configs from indexedDb as they are all stored as a single row.\r\n this.clearConfigCache();\r\n }\r\n }\r\n\r\n /**\r\n * This helper function is used to clear cached configs\r\n * @returns Promise\r\n */\r\n public async clearConfigCache(): Promise {\r\n if (this.useIndexedDb) {\r\n try {\r\n await this.initializeIndexedDb();\r\n\r\n try {\r\n await this.indexedDb.clearObjects();\r\n logger.log(\"Resolver: Cleared all configs from indexedDb.\");\r\n } catch {\r\n logger.logError(\"Resolver: Failed to clear all configs from indexedDb\");\r\n this.useIndexedDb = false;\r\n }\r\n } catch {\r\n logger.logError(\"Resolver: Failed to initialize indexedDb\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * For testing purpose to access what has been set for configServiceParameters\r\n */\r\n public getConfigServiceParameters(): string {\r\n return this.configServiceParameters;\r\n }\r\n\r\n /**\r\n * Adds an entry into the config timings for the given type and relative start time\r\n */\r\n public addConfigTiming(experienceType: string, startTime: number, type: \"network\" | \"cache\"): void {\r\n this.configTimings.push({\r\n experienceType,\r\n [type + \"FetchDuration\"]: performance.now() - startTime\r\n });\r\n }\r\n\r\n /**\r\n * Helper function to get Config Timings\r\n * @param pageTimings _pageTimings object\r\n */\r\n public getConfigTimings(pageTimings: any = {}, getAllConfigTimingsOverride = false): void {\r\n if (appEnvironment.IsGitConfigs) {\r\n // this will merge the perfMarkerHelperTimings to other configTimings.\r\n // ideally we shouldn't need this at all after the CMS code cleanup.\r\n Object.assign(pageTimings, getPerfMarkerHelperPageTimings());\r\n return;\r\n }\r\n\r\n if (!this.configTimings) {\r\n return;\r\n }\r\n\r\n let allConfigsCacheDuration = 0;\r\n let allConfigsNetworkDuration = 0;\r\n for (const configTiming of this.configTimings) {\r\n // Instrument networkFetchDuration and cacheFetchDuration\r\n const experienceType = configTiming.experienceType.toLowerCase();\r\n const cacheFetchDuration = configTiming.cacheFetchDuration;\r\n const networkFetchDuration = configTiming.networkFetchDuration;\r\n\r\n if (experienceType === \"entrypoint\"\r\n || experienceType === \"river\"\r\n || experienceType === \"contentpreview\"\r\n // when appropriate debug flag is set, output all config timings.\r\n || appEnvironment.IsDebug\r\n || getAllConfigTimingsOverride) {\r\n\r\n // Instrumenting networkFetchDuration to check effectiveness of get Config over the network for FRE.\r\n if (networkFetchDuration !== undefined) {\r\n pageTimings[\"ConfigFetch.\" + experienceType] = Math.round(networkFetchDuration);\r\n }\r\n\r\n // Instrumenting cacheFetchDuration to check effectiveness of storing merged config since it will be always used in non FRE.\r\n if (cacheFetchDuration !== undefined) {\r\n pageTimings[\"ConfigCache.\" + experienceType] = Math.round(cacheFetchDuration);\r\n }\r\n }\r\n\r\n if (cacheFetchDuration !== undefined) {\r\n allConfigsCacheDuration += cacheFetchDuration;\r\n }\r\n\r\n if (networkFetchDuration !== undefined) {\r\n allConfigsNetworkDuration += networkFetchDuration;\r\n }\r\n }\r\n\r\n if (allConfigsCacheDuration) {\r\n pageTimings[\"ConfigCache.All\"] = Math.round(allConfigsCacheDuration);\r\n }\r\n\r\n if (allConfigsNetworkDuration) {\r\n pageTimings[\"ConfigFetch.All\"] = Math.round(allConfigsNetworkDuration);\r\n }\r\n }\r\n\r\n /**\r\n * UNIT TEST PURPOSE: Function to set configTimings\r\n * @param ConfigFetchTiming[]\r\n */\r\n public setConfigTimingsObject(configFetchTimings: ConfigFetchTiming[]): void {\r\n this.configTimings = configFetchTimings;\r\n }\r\n\r\n /**\r\n * Get the cache key based on confix index url and the target scope generated suffix.\r\n * @param relativeUrl The config url\r\n * @returns The unique cache key for the merged config + target scope combination.\r\n */\r\n public getCacheKey(relativeUrl: string): string {\r\n return relativeUrl === null ? null : this.removeCmsPathFromRelativeUrl(relativeUrl) + \"_\" + this.storageKey;\r\n }\r\n\r\n /**\r\n * Get cached Configs from IndexedDb and populate configMap based on target scope key.\r\n */\r\n private async _populateConfigMapFromIndexedDbAsync(): Promise {\r\n\r\n let cacheSource: string;\r\n\r\n try {\r\n // Check if indexedDb is present, if not return.\r\n // Check if web worker is present, if not, indexedDb will not be refreshed since refreshConfigCache uses post message to web worker.\r\n // so you may get stale configs within 3 days of time range so this check is essential as well.\r\n // Check if we've previously attempted to read from IDB, and if don't do it again.\r\n if (!this.useIndexedDb || !this.useWebWorkerToCache) {\r\n return;\r\n }\r\n\r\n // For Flight specific config resolution, we want to use cached configs only if flights match.\r\n try {\r\n const prgFlights = getLocalStorage().getItem(this.peregrineFlightsKey);\r\n if (prgFlights\r\n && this.peregrineFlights\r\n && prgFlights !== this.peregrineFlights) {\r\n\r\n // Reverse flight: if cached configs are for different flight, throw app error.\r\n if (this.peregrineFlights.indexOf(\"prg-lsconfigs\") >= 0) {\r\n this.resolverErrors.push({\r\n ...CachedConfigsForDifferentFlight,\r\n message: \"Cached configs are for different flight\"\r\n });\r\n }\r\n\r\n // DO NOT USE CACHED CONFIGS SINCE FLIGHTS ARE NOT SAME\r\n // SO CONFIG RESOLUTION MAY LEAD TO INCONSISTENT BEHAVIOR\r\n return;\r\n }\r\n } catch (e) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.PrgFlightLsReadError,\r\n message: \"Error reading prg flights from local storage\",\r\n pb: {\r\n ...ResolverAppErrors.PrgFlightLsReadError.pb,\r\n customMessage: e\r\n }\r\n });\r\n }\r\n\r\n const startBulkConfig = performance.now();\r\n\r\n this.configMap.clear();\r\n let cachedConfigs: CachedConfigsType;\r\n\r\n // Optionally pre-initialized IDB config read promise at the top page level\r\n const { _idbConfigReadPromise, _idbConfigLookup } = window;\r\n\r\n // Check if we have a top page-level initialized IDB read config lookup populated\r\n // with the specific entry we need, and if so use it. Otherwise proceed to load from indexDB\r\n cachedConfigs = (_idbConfigLookup || {})[this.storageKey] as CachedConfigsType;\r\n if (cachedConfigs) {\r\n\r\n cacheSource = \"pre-initialized config cache\";\r\n\r\n } else if (_idbConfigReadPromise) {\r\n // see if we have the pre-initialized config read promise from IDB, and if so\r\n // await on that instead of starting our own duplicate IDB init/read.\r\n\r\n cacheSource = \"pre-initialized IndexedDb read\";\r\n await _idbConfigReadPromise;\r\n cachedConfigs = (window._idbConfigLookup || {})[this.storageKey] as CachedConfigsType;\r\n\r\n } else {\r\n\r\n // start our own IDB read.\r\n cacheSource = \"IndexedDb bulk read\";\r\n await this.initializeIndexedDb();\r\n cachedConfigs = await this.indexedDb.getObject(this.storageKey);\r\n }\r\n\r\n if (!cachedConfigs || cachedConfigs.size === 0) {\r\n logger.log(`Resolver: Bulk read of configs from ${cacheSource} didn't find any configs.`);\r\n return;\r\n }\r\n\r\n this.populateConfigMapFromCachedConfigs(cachedConfigs, cacheSource);\r\n this.addConfigTiming(\"IdbInitAndReadAll\", startBulkConfig, \"cache\");\r\n\r\n } catch (e) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.IndexedDbBulkReadFailed,\r\n message: \"IndexedDb bulk read failed\",\r\n pb: {\r\n ...ResolverAppErrors.IndexedDbBulkReadFailed.pb,\r\n customMessage: `IndexedDb bulk read from ${cacheSource} failed. Error: ${e}`\r\n }\r\n });\r\n this.useIndexedDb = false;\r\n }\r\n }\r\n\r\n /**\r\n * Initialize indexedDb for configs. Instead of using this directly, please use the memoized\r\n * initializeIndexedDb function instead to avoid re-entrancy of the same async operation.\r\n */\r\n private async _initializeIndexedDb(): Promise {\r\n if (!this.useIndexedDb) {\r\n return;\r\n }\r\n\r\n try {\r\n // IMPORTANT!! The wwConfigs name must be in sync with the PCS script that initializes the IDB and WebWorkerResolver\r\n const { _idbConfigOpenPromise } = window;\r\n await this.indexedDb.initializeIndexedDb(1, \"Configurations_12\", \"wwConfigs\", _idbConfigOpenPromise);\r\n logger.log(\"Resolver: IndexedDb initialized in main thread.\");\r\n } catch (e) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.IndexedDbInitFailed,\r\n message: \"IndexedDb initialization failed\",\r\n pb: {\r\n ...ResolverAppErrors.IndexedDbInitFailed.pb,\r\n customMessage: e\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Populates the in-memory map object with the configs from cache\r\n */\r\n private populateConfigMapFromCachedConfigs(cachedConfigs: CachedConfigsType, cacheSource: string): void {\r\n\r\n // targetScopeKey is inserted into IndexedDb along with configIndexHref.\r\n // Although there can be more than type of keys being formed since DHP and NTP will have different ones due to pageType in targetScope.\r\n let unusableCount = 0;\r\n\r\n cachedConfigs.forEach(cachedConfig => {\r\n if (!cachedConfig.configIndexHref\r\n || this.isConfigStale(cachedConfig.storageTimestamp)) {\r\n\r\n unusableCount++;\r\n } else {\r\n const cacheKey = this.getCacheKey(cachedConfig.configIndexHref);\r\n\r\n this.configMap.set(cacheKey, cachedConfig);\r\n }\r\n });\r\n\r\n logger.log(`Resolver: Found ${cachedConfigs.size - unusableCount} valid configs out of ${cachedConfigs.size} from ${cacheSource}`);\r\n }\r\n\r\n /**\r\n * Get Peregrine specific flights from client settings and local storage\r\n * True if they are same else false\r\n */\r\n private prgFlightsSameAsLocalStorage(): boolean {\r\n try {\r\n const flightsFromStorage = getLocalStorage().getItem(this.peregrineFlightsKey);\r\n return flightsFromStorage\r\n && this.peregrineFlights\r\n && flightsFromStorage === this.peregrineFlights;\r\n } catch (error) {\r\n this.resolverErrors.push({\r\n ...ResolverAppErrors.PrgFlightLsReadError,\r\n message: \"Error reading prg flights from localStorage\",\r\n pb: {\r\n ...ResolverAppErrors.PrgFlightLsReadError.pb,\r\n customMessage: error\r\n }\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get local storage key where we will be storing hashes\r\n */\r\n private getConfigsCacheLocalStorageKey(): string {\r\n const { audienceMode, locale = {}, pageType } = this.currentTargetScope || {};\r\n return `config_hash_${audienceMode}_${locale.language}_${locale.market}_${pageType}_${appEnvironment.AppType}`;\r\n }\r\n\r\n /**\r\n * Gets the config hashes from local storage.\r\n * @param clientSettings - The \"clientSettings\" object.\r\n * @returns string config hash QSP\r\n */\r\n private getConfigCacheProperties(): ConfigCacheProperties {\r\n let configCacheProperties: ConfigCacheProperties;\r\n try {\r\n // Get config hashes from client settings\r\n configCacheProperties = appEnvironment.ConfigCacheProperties;\r\n\r\n // If user was in different flights earlier in last page than right now, no need to get hashes from local storage.\r\n // We do not want to use indexedDB configs.\r\n if (!this.prgFlightsSameAsLocalStorage()) {\r\n // Here we know that flights for this page are different than flights for earlier page for which we have render cache snapshot and configs saved.\r\n // We do not want to use RC snapshot for this and do not want to use cached configs.\r\n // RC snapshot will be helpful like an automatic recovery if something goes wrong.\r\n this.purgeRenderCacheUponConfigChanges(false);\r\n\r\n return configCacheProperties;\r\n }\r\n\r\n // It's possible, especially on Legacy Edge, for appEnvironment.ConfigCacheProperties to be undefined\r\n // due to differences with the AppCache. Also possible if upgrading to GIT configs. We cannot default\r\n // it to an object as it is used in several places as \"truthy\", so adding a check here to make sure we have it.\r\n // Not returning before line 1790 to make sure we don't change the behavior of the function.\r\n if (configCacheProperties) {\r\n // Get last hashes from local storage\r\n const configHashes = getLocalStorage().getItem(this.getConfigsCacheLocalStorageKey());\r\n if (configHashes) {\r\n const {bundleHash, configHash, locHash} = JSON.parse(configHashes) || {};\r\n if (bundleHash && configHash && locHash) {\r\n configCacheProperties.lastBundleHash = bundleHash;\r\n configCacheProperties.lastConfigHash = configHash;\r\n configCacheProperties.lastLocHash = locHash;\r\n }\r\n }\r\n }\r\n\r\n return configCacheProperties;\r\n } catch (error) {\r\n logger.logError(`Error getting config hashes from ls: ${error}`);\r\n\r\n // TODO: Add app error\r\n }\r\n\r\n return configCacheProperties;\r\n }\r\n\r\n /**\r\n * Write config hashes to local storage\r\n */\r\n private writeConfigCacheProperties(): void {\r\n if (!appEnvironment.IsGitConfigs) {\r\n return;\r\n }\r\n\r\n try {\r\n const { bundleHash, configHash, locHash: locHash } = appEnvironment.ConfigCacheProperties || {};\r\n if (bundleHash && configHash && locHash) {\r\n getLocalStorage().setItem(this.getConfigsCacheLocalStorageKey(), JSON.stringify({\r\n bundleHash,\r\n configHash,\r\n locHash\r\n }));\r\n }\r\n } catch (error) {\r\n logger.logError(`Error writing config hashes to ls: ${error}`);\r\n\r\n // TODO: Add app error\r\n }\r\n }\r\n\r\n /**\r\n * Write given CBID in local storage\r\n * @param cbid Cache busting identifier\r\n */\r\n private writeCbidInLocalStorage(cbid: string): void {\r\n const cbidKey = `cbid_${appEnvironment.AppType || \"\"}`;\r\n try {\r\n getLocalStorage().setItem(cbidKey, cbid);\r\n } catch (e) {\r\n throw `Error writing cbid: ${cbid} to local storage with key ${cbidKey}. Error: ${e}`;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Config Timings type to determine how much time each experience took to getConfig\r\n */\r\ninterface ConfigFetchTiming {\r\n /**\r\n * Experience Type\r\n */\r\n experienceType: string,\r\n\r\n /**\r\n * Time took to get configs over the network and merge them.\r\n */\r\n networkFetchDuration?: number,\r\n\r\n /**\r\n * Time took to get merged configs from cache.\r\n */\r\n cacheFetchDuration?: number\r\n}\r\n\r\n/**\r\n * Typed object containing boolean flag that tells if configs are equal and live cbid. This type comes are response from web worker to refresh config message.\r\n */\r\ninterface RefreshConfigsResponse {\r\n /**\r\n * True if configs are equal\r\n */\r\n configsEqual?: boolean;\r\n\r\n /**\r\n * CBID (cache busting identifier) from live document\r\n */\r\n liveCbId?: number;\r\n}\r\n\r\n/** Resolver Singleton */\r\nlet _instance: Resolver = new Resolver();\r\n\r\n/** Reinitialize the singleton class instance. */\r\nexport function resetResolverInstance(): void {\r\n _instance = new Resolver();\r\n}\r\n\r\nexport const resolver = {\r\n getRootConfig: (cmsHref: string) => { return _instance.getRootConfig(cmsHref); },\r\n getConfig: (configId: string | ConfigReference) => { return _instance.getConfig(configId); },\r\n mergeConfig: (configs: IExperienceConfig[]) => { return _instance.mergeConfig(configs); },\r\n resolveConfigIndex: (configIndex: IExperienceConfigIndex) => { return _instance.resolveConfigIndex(configIndex); },\r\n targetScopeMatched: (experienceRef: IExperienceConfigLink) => { return _instance.targetScopeMatched(experienceRef); },\r\n getConfigTimings: (pageTimings: any = {}, getAllConfigTimingsOverride = false) => { return _instance.getConfigTimings(pageTimings, getAllConfigTimingsOverride); },\r\n getResolverErrors: () => { return _instance.getResolverErrors(); },\r\n refreshConfigCache: () => { return _instance.refreshConfigCache(); },\r\n removeCachedConfig: (relativeUrl: string) => { return _instance.removeCachedConfig(relativeUrl); },\r\n clearConfigCache: () => { return _instance.clearConfigCache(); },\r\n getInstance: () => { return _instance; },\r\n setTargetScopeAndConfigServiceParams: () => { return _instance.setTargetScopeAndConfigServiceParams(); },\r\n initialize: (appErrorCallback: (data: AppError) => void) => { return _instance.initialize(appErrorCallback); },\r\n getUseConfigService: () => { return _instance.useConfigService(); },\r\n\r\n // these are test specific exports\r\n overrideConfig: (configId: string | ConfigReference, experienceType: string, config: any) => { return _instance.overrideConfig(configId, experienceType, config); },\r\n overrideCurrentRequestTargetScope: (targetScope: PageRequestTargetScope) => { return _instance.overrideCurrentRequestTargetScope(targetScope); },\r\n overrideCurrentRequestEnvironment: (overrideEnv: Environment) => { return _instance.overrideCurrentRequestEnvironment(overrideEnv); },\r\n generateKey: () => { return _instance.generateKey(); },\r\n clearInternalState: () => { return _instance.clearInternalState(); },\r\n initializeCaching: (idb?: IndexedDb) => { return _instance.initializeCaching(idb); },\r\n getConfigServiceParameters: () => { return _instance.getConfigServiceParameters(); },\r\n setConfigTimingsObject: (configFetchTimings: ConfigFetchTiming[]) => { return _instance.setConfigTimingsObject(configFetchTimings); },\r\n getCacheKey: (relativeUrl: string) => { return _instance.getCacheKey(relativeUrl); },\r\n updateServerCache: (configIndexHref: string, configFromServerCache: ExperienceConfigWrapper) => { return _instance.updateServerCache(configIndexHref, configFromServerCache); }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// TODO: This should be considered for moving it to the Interests experience wrapper, once that\r\n// code arrives, since this is specific to that experience\r\n\r\n/**\r\n * Subnav TabId Enum object\r\n * @export\r\n * @type {enum}\r\n */\r\nexport enum SubnavTabId {\r\n None = 0,\r\n MyFeed = 1,\r\n XFeed = 2,\r\n Interests = 3\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getAppEnvironment, getHeadData } from \"@msnews/core\";\r\nimport { useEnterpriseCompliance, useEnterpriseDomain } from \"@msnews/auth\";\r\n\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * The service URL to use\r\n */\r\nlet serviceUrl: URL;\r\n\r\n/**\r\n * The feed service URL to use\r\n */\r\nlet feedServiceUrl: URL;\r\n\r\n/**\r\n * Initialize AppServiceManager with serviceUrl\r\n *\r\n * @param url {string} - The service url\r\n */\r\nexport function initializeServiceRequest(url: URL): void {\r\n serviceUrl = new URL(\"\", url);\r\n initializationLogs(serviceUrl);\r\n}\r\n\r\n/**\r\n * Initialize AppServiceManager with feedServiceUrl\r\n *\r\n * @param url {string} - The feed service url\r\n */\r\nexport function initializeFeedServiceRequest(url: URL): void {\r\n feedServiceUrl = new URL(\"\", url);\r\n initializationLogs(feedServiceUrl);\r\n}\r\n\r\n/**\r\n * Returns service url\r\n * @returns an URL pointing to Service Request base URL\r\n */\r\nexport function getServiceUrl(): URL {\r\n const appEnvironment = getAppEnvironment();\r\n\r\n if (!serviceUrl) {\r\n // Use enterprise request if in enterprise compliant scenario\r\n const isEnterpriseDomain = useEnterpriseCompliance() && useEnterpriseDomain();\r\n const url = isEnterpriseDomain ? appEnvironment.EnterpriseServiceUrlBase : appEnvironment.ServiceUrlBase;\r\n\r\n initializeServiceRequest(url);\r\n }\r\n\r\n return serviceUrl;\r\n}\r\n\r\n/**\r\n * Returns feed service url\r\n * @returns an URL pointing to Feed Service Request base URL\r\n */\r\nexport function getFeedServiceUrl(): URL {\r\n const appEnvironment = getAppEnvironment();\r\n\r\n if (!feedServiceUrl) {\r\n // Use enterprise request if in enterprise compliant scenario\r\n const isEnterpriseDomain = useEnterpriseCompliance() && useEnterpriseDomain();\r\n const url = isEnterpriseDomain ? appEnvironment.EnterpriseServiceUrlBase : appEnvironment.FeedServiceUrlBase;\r\n\r\n initializeFeedServiceRequest(url);\r\n }\r\n\r\n return feedServiceUrl;\r\n}\r\n\r\n/**\r\n * Appends `subPath` to Service Request URL.\r\n * It is an abstraction for the client so it won't have to\r\n * know the url format\r\n * @param subPath the path to append to Service Request URL\r\n * @param serviceUrl optional Service URL override\r\n * @returns an URL pointing to Service Request base URL appended by `subPath`\r\n */\r\nexport function getServiceUrlForSubpath(subPath: string, serviceUrl: URL = getServiceUrl()): URL {\r\n return new URL(subPath + serviceUrl?.search, serviceUrl);\r\n}\r\n\r\n/**\r\n * Appends `subPath` to Feed Service Request URL.\r\n * It is an abstraction for the client so it won't have to\r\n * know the url format\r\n * @param subPath the path to append to Feed Service Request URL\r\n * @param feedServiceUrl optional Feed Service URL override\r\n * @returns an URL pointing to Feed Service Request base URL appended by `subPath`\r\n */\r\nexport function getFeedServiceUrlForSubpath(subPath: string, feedServiceUrl: URL = getFeedServiceUrl()): URL {\r\n return new URL(subPath + feedServiceUrl?.search, feedServiceUrl);\r\n}\r\n\r\n/**\r\n * Add initial logs based on url and environment\r\n * @param url the url that is being used to initialize\r\n */\r\nfunction initializationLogs(url: URL): void {\r\n let authEnabled = false;\r\n if (!process.env.WEBPACK_DEV_SERVER && url.searchParams.get(\"env.service\") !== \"dev\" && getHeadData().UserIsSignedIn) {\r\n authEnabled = true;\r\n }\r\n\r\n logger.log(\"u-si: \" + getAppEnvironment().UserId);\r\n logger.log(\"a-si: \" + authEnabled);\r\n logger.log(\"ss-si: \" + getHeadData().UserIsSignedIn);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { KeyValueArray, KeyValuePair, Utility } from \"./Utility\";\r\nimport { findIndex, isArray, isEmpty, isString, trimEnd, trimStart } from \"lodash-es\";\r\n\r\nimport { StringMap } from \"../types\";\r\nimport { getLocationOrigin } from \"@msnews/isomorphic-util\";\r\n\r\nexport namespace UrlUtility {\r\n\r\n /**\r\n * Characters that, if present on a url, will make prime routing misbehave\r\n *\r\n * These are the characters we know cause problems:\r\n * - spaces\r\n * - slashes\r\n * - punctuation: !?.:\r\n * - ampersands\r\n *\r\n * As we don't know all the offending characters, we are just removing every character that is not alphanumeric\r\n */\r\n const primeForbiddenCharacters = /[^A-Za-z0-9]+/g;\r\n\r\n /**\r\n * Parse parameters from the given URL\r\n * @param {string} url - the URL to parse for parameters\r\n * @param {boolean} decodeComponents - flag to indicate whether the query param key and value should be URL decoded\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParamsFromUrl(url: string, decodeComponents = false): KeyValueArray {\r\n if (!isString(url)) {\r\n return null;\r\n }\r\n\r\n const queryString: string = (url || \"\").split(\"?\")[1];\r\n return getParams(queryString, decodeComponents);\r\n }\r\n\r\n /**\r\n * Decode the given URL encoded string that may contain plus signs\r\n * @param {string} val - The value to decode.\r\n * @returns {string} - the decoded value\r\n */\r\n function decodeURIComponentWithPlusSign(val: string): string {\r\n val = val.replace(/\\+/g, \" \");\r\n val = decodeURIComponent(val);\r\n return val;\r\n }\r\n\r\n /**\r\n * Encode uri components in a way that won't break prime routing system\r\n * @param uriComponent the uriComponent to be encoded\r\n */\r\n export function encodeURIComponentForPrime(uriComponent: string): string {\r\n return encodeURIComponent(uriComponent.replace(primeForbiddenCharacters, \"-\"));\r\n }\r\n\r\n /**\r\n * Parse parameters from the given query string\r\n * @param {string} queryString - the query string to parse for parameters\r\n * @param {boolean} decodeComponents - flag to indicate whether the query param key and value should be URL decoded\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParams(queryString: string, decodeComponents = false): KeyValueArray {\r\n const params: KeyValueArray = [];\r\n // Remove the leading ? if it is present\r\n if (queryString && queryString.startsWith(\"?\")) {\r\n queryString = queryString.substring(1);\r\n }\r\n\r\n if (queryString) {\r\n // remove hash part.\r\n queryString = queryString.split(\"#\")[0];\r\n const queryArray = queryString.split(\"&\");\r\n for (let ndx = 0; ndx < queryArray.length; ndx++) {\r\n const parts = queryArray[ndx].split(\"=\");\r\n let queryKey = parts[0];\r\n let queryValue = parts[1];\r\n\r\n if (decodeComponents) {\r\n queryKey = decodeURIComponentWithPlusSign(queryKey);\r\n if (queryValue) {\r\n queryValue = decodeURIComponentWithPlusSign(queryValue);\r\n }\r\n }\r\n\r\n // Don't allow for duplicate query string parameter keys. Take the last one\r\n const newParam: KeyValuePair = { key: queryKey, value: queryValue };\r\n const existingParam = findIndex(params, (entry) => entry.key === newParam.key);\r\n if (existingParam === -1) {\r\n params.push(newParam);\r\n } else {\r\n params[existingParam] = newParam;\r\n }\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Parse specific parameters from the given query string, allowing for multiple item=key:value.\r\n * This function ONLY parses qsp item=[key]:[value]\r\n * Note: Use first given rule for duplicate key!\r\n * @param {string} queryString - the query string to parse for parameters\r\n * @param {boolean} decodeComponents - flag to indicate whether the query param key and value should be URL decoded\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParamsWithItems(queryString: string, decodeComponents = false): KeyValueArray {\r\n const params: KeyValueArray = [];\r\n\r\n const inputKey = \"item\";\r\n\r\n if (queryString) {\r\n // Remove the leading ? if it is present\r\n if (queryString.startsWith(\"?\")) {\r\n queryString = queryString.substring(1);\r\n }\r\n\r\n // split on the hashes.\r\n queryString = queryString.split(\"#\")[0];\r\n const queryArray = queryString.split(\"&\");\r\n for (let ndx = 0; ndx < queryArray.length; ndx++) {\r\n const parts = queryArray[ndx].split(\"=\");\r\n let queryKey = parts[0];\r\n let queryValue = parts[1];\r\n\r\n if (decodeComponents) {\r\n queryKey = decodeURIComponentWithPlusSign(queryKey);\r\n if (queryValue) {\r\n queryValue = decodeURIComponentWithPlusSign(queryValue);\r\n }\r\n }\r\n\r\n // If the query key is inputKey (default: \"item\"), and the query values is key:value, then convert the\r\n // value into the actual key/value\r\n if (queryKey.toLowerCase() === inputKey) {\r\n const queryItems = queryValue.split(\":\");\r\n // Ignore value not in \"key:value\" format\r\n if (queryItems.length === 2) {\r\n queryKey = queryItems[0];\r\n queryValue = queryItems[1];\r\n\r\n // Don't allow for duplicate query string parameter keys. Use first given rule for duplicate key!\r\n const newParam: KeyValuePair = { key: queryKey, value: queryValue };\r\n const existingParam = params.findIndex((entry) => entry.key === newParam.key);\r\n if (existingParam === -1) {\r\n params.push(newParam);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Cache URI to paramsObj mapping\r\n */\r\n const hrefParamsObj: any = {};\r\n\r\n /**\r\n * Utility method to extract query string param in url.\r\n *\r\n * @export\r\n * @param {string} name - query param name\r\n * @param {string} href - URL\r\n * @returns {string} - query param value\r\n */\r\n export function getQueryParameterByName(name: string, href: string): string {\r\n if (!hrefParamsObj[href]) {\r\n hrefParamsObj[href] = getParamsObj(href);\r\n }\r\n\r\n const paramsObj = hrefParamsObj[href];\r\n const value = paramsObj[name];\r\n return (value !== undefined)\r\n ? value\r\n : null;\r\n }\r\n\r\n /**\r\n * Check if given url string is a valid url.\r\n * Returns true when url string is a valid url, otherwise false.\r\n *\r\n * @export\r\n * @param url {string} - Url string value to check\r\n * @param validateScheme {boolean} - Should scheme validation be forced\r\n * @return {boolean}\r\n */\r\n export function isValidUrl(url: string, validateScheme: boolean): boolean {\r\n return (isString(url) &&\r\n (url.length > 0) &&\r\n (!validateScheme ||\r\n validateScheme && url.indexOf(\"http\") === 0));\r\n }\r\n\r\n /**\r\n * Converts a keyValueArray into a set of query string parameters\r\n *\r\n * @export\r\n * @param {any} - params to be converted\r\n * @return {string}\r\n */\r\n export function keyValueArrayToQueryString(params: KeyValueArray): string {\r\n // Validate we have a nonempty array\r\n if (!isArray(params) || isEmpty(params)) {\r\n return \"\";\r\n }\r\n\r\n // Filter for valid keyValue entries, and then map them into key==value strings\r\n // joined with an &\r\n const queryString: string = params.filter(kv =>\r\n Utility.isKeyValuePair(\r\n kv,\r\n (key) => typeof (key) === \"string\",\r\n (value) => typeof (value) === \"string\"))\r\n .map(kv => kv.key + \"=\" + kv.value)\r\n .join(\"&\");\r\n\r\n return queryString;\r\n }\r\n\r\n /**\r\n * Helper method to parse the given URLs query parameters to a lookup dictionary\r\n * @param url - the URL string with the query params to parse\r\n * @returns The {StringMap} containing the key/value pairs, or empty object.\r\n */\r\n export function getParamsObj(url: string): StringMap {\r\n const paramsObj = {};\r\n const paramArray = getParamsFromUrl(url, true);\r\n if (paramArray && paramArray.length) {\r\n paramArray.forEach(keyValuePair =>\r\n paramsObj[keyValuePair.key] = keyValuePair.value);\r\n }\r\n return paramsObj;\r\n }\r\n\r\n /**\r\n * For the given `url`, it appends the `subPath` to it.\r\n * It takes propers care to forward slashes characters\r\n * at the end of `url` and at the start of `subPath` parameters\r\n * @param url a valid url\r\n * @param subPath the path which is appended to `url`\r\n * @returns an URL object which is the `url` appended by `subPath`\r\n */\r\n export function joinSubpathToURL(url: URL, subPath: string): URL {\r\n const href = url.href;\r\n const trimmedEndSlashFromHref = trimEnd(href, \"/\");\r\n const trimmedStartSlashFromSubpath = trimStart(subPath, \"/\");\r\n return new URL(`${trimmedEndSlashFromHref}/${trimmedStartSlashFromSubpath}`);\r\n }\r\n\r\n /**\r\n * Updates a search parameter in the given url to map to a new value\r\n * Does not modify the url if the given search param doesn't exist\r\n * @param url the url to update\r\n * @param key the name of the search param to be updated\r\n * @param value the new value for the given search param\r\n * @returns {URL} the updated URL\r\n */\r\n export function updateSearchParam(url: URL, key: string, value: string): URL {\r\n // Note that the searchParams data member may not be compatible with older browser versions\r\n // see https://caniuse.com/#search=searchparams\r\n if (url && url.searchParams && url.searchParams.get(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Appends a search parameter to the given url\r\n * @param url the url to modify\r\n * @param key the name of the search param to be appended\r\n * @param value the new value for the given search param\r\n * @returns {URL} the modified URL\r\n */\r\n export function appendSearchParam(url: URL, key: string, value: string, fallback?: boolean): URL {\r\n if (url) {\r\n if (url.searchParams || fallback) {\r\n url.searchParams.append(key, value);\r\n } else {\r\n // TODO Bug 22390312: [Peregrine] UrlUtility appendSearchParam needs more robust polyfill\r\n url = new URL(url.href + (url.search.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + key + \"=\" + value);\r\n }\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Returns an absolute URL if a relative on is passed in, or returns the passed in URL if already absolute\r\n * @param partialUrl The relative or absolute URL\r\n * @returns {string} the absolute URL\r\n */\r\n export function getAbsoluteUrl(partialUrl: string): string {\r\n if (partialUrl.indexOf(\"://\") > 0 || partialUrl.indexOf(\"//\") === 0) {\r\n return partialUrl;\r\n } else {\r\n return getLocationOrigin() + partialUrl;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Activities, Content, ReactionBreakdownData, TypingUser, User, UserList } from \"@msnews/social-data-service\";\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\n\r\nexport type SetTheme = (theme?: string) => void;\r\nexport type UpdateMe = (me: User) => void;\r\nexport type UpdateNotifications = (notifications: Activities) => void;\r\nexport type UpdateActivities = (activities: Activities) => void;\r\nexport type DeleteActivities = () => void;\r\nexport type UpdateActivityStatus = (id: string, read: boolean) => void;\r\nexport type UpdateActivityAppeal = (id: string, appealSent: boolean) => void;\r\nexport type SetContent = (content: Content, id: string) => void;\r\nexport type UpdateContent = (contentId: string, data: any) => void;\r\nexport type UpdateContentRating = (contentId: string, rating: String) => void;\r\nexport type InsertComments = (contentId: string, comments: Object, page: boolean, parentId?: String, prepend?: boolean) => void;\r\nexport type ResetSpecificCommentId = () => void;\r\nexport type IncrementReplyCount = (contentId: string, commentId?: string) => void;\r\nexport type UpdateCommentRating = (contentId: string, commentId: string, rating: String, updateCounts: boolean) => void;\r\nexport type InsertComment = (contentId: string, comment: Object, parentId?: String, addedOffline?: boolean) => void;\r\nexport type UpdateUser = (userId: String, user: Object) => void;\r\nexport type UpdateUserFollowers = (userId: String, followers: UserList) => void;\r\nexport type UpdateUserFollowing = (userId: String, following: UserList) => void;\r\nexport type UpdateUserComments = (userId: String, comments: Array, reset: boolean) => void;\r\nexport type DeleteUserComment = (userId: String, commentId: string, parentId: string) => void;\r\nexport type SetReactionBreakdown = (data: ReactionBreakdownData) => void;\r\nexport type SetGradientOverlayData = (data: any) => void;\r\nexport type SetPublisherSubscribeFollowButtonData = (data: any) => void;\r\nexport type SetPopup = (moduleName: string, props: Object) => void;\r\nexport type AddTyper = (typer: TypingUser, contentId: string, id: string, market: string) => void;\r\nexport type UpdateTypers = (expireTime: number) => void;\r\nexport type RecordSignalRHub = (contentId: string) => void;\r\nexport type UpdateResponsiveClass = (responsiveClass: string) => void;\r\nexport type DeleteMyData = () => void;\r\nexport type MapCmsIdToContentId = (cmsId: string, market: string, contentId: string) => void;\r\nexport type ResetError = () => void;\r\n\r\nexport const SocialDataActions = {\r\n setTheme: new ActionMap(\"SetTheme\"),\r\n updateMe: new ActionMap(\"UpdateMe\"),\r\n updateNotifications: new ActionMap(\"UpdateNotifications\"),\r\n updateActivities: new ActionMap(\"UpdateActivities\"),\r\n deleteActivities: new ActionMap(\"DeleteActivities\"),\r\n updateActivityStatus: new ActionMap(\"UpdateActivityStatus\"),\r\n setContent: new ActionMap(\"SetContent\"),\r\n updateContent: new ActionMap(\"UpdateContent\"),\r\n updateContentRating: new ActionMap(\"UpdateContentRating\"),\r\n insertComments: new ActionMap(\"FetchContentComments\"),\r\n resetSpecificCommentId: new ActionMap(\"ResetSpecificCommentid\"),\r\n updateCommentRating: new ActionMap(\"UpdateCommentRating\"),\r\n incrementReplyCount: new ActionMap(\"IncrementReplyCount\"),\r\n insertComment: new ActionMap(\"InsertComment\"),\r\n updateUser: new ActionMap(\"UpdateUser\"),\r\n updateUserFollowers: new ActionMap(\"UpdateUserFollowers\"),\r\n updateUserFollowing: new ActionMap(\"UpdateUserFollowing\"),\r\n updateUserComments: new ActionMap(\"UpdateUserComments\"),\r\n deleteUserComment: new ActionMap(\"DeleteUserComment\"),\r\n setReactionBreakdown: new ActionMap(\"SetReactionBreakdown\"),\r\n setGradientOverlayData: new ActionMap(\"SetGradientOverlayData\"),\r\n setPublisherSubscribeFollowButtonData: new ActionMap(\"SetPublisherSubscribeFollowButtonData\"),\r\n setPopup: new ActionMap(\"SetPopup\"),\r\n addTyper: new ActionMap(\"AddTyper\"),\r\n updateTypers: new ActionMap(\"UpdateTypers\"),\r\n recordSignalRHub: new ActionMap(\"RecordSignalRHub\"),\r\n updateResponsiveClass: new ActionMap(\"UpdateResponsiveClass\"),\r\n deleteMyData: new ActionMap(\"DeleteMyData\"),\r\n updateActivityAppeal: new ActionMap(\"UpdateActivityAppeal\"),\r\n mapCmsIdToContentId: new ActionMap(\"MapCmsIdToContentId\"),\r\n resetError: new ActionMap(\"ResetError\")\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { SocialDataState } from \"@msnews/social-data-connector\";\r\n\r\n/**\r\n * SetTime action signature\r\n */\r\nexport type SetComponent = (id?: string, market?: string) => void;\r\nexport type SetSocialData = (socialData: SocialDataState) => void;\r\n\r\n/**\r\n * Class containing actions that apply to the SocialBar connector\r\n */\r\nexport const SocialBarActions = {\r\n setComponent: new ActionMap(\"SetComponent\"),\r\n setSocialData: new ActionMap(\"SetSocialData\")\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { InspectorArgs, InspectorResponse, appEnvironment } from \"@msnews/core\";\r\nimport { SocialBarConfig, SocialBarState } from \"./index\";\r\n\r\nimport { SocialBarProps } from \"./SocialBar.props\";\r\n\r\nexport const SocialBarInspector = {\r\n inspect: (args: InspectorArgs): InspectorResponse => {\r\n\r\n const { config, state } = args;\r\n let { market, theme, styleOverrides } = config;\r\n const { id } = state;\r\n\r\n if (state.theme) {\r\n theme = state.theme;\r\n }\r\n\r\n if (state.market) {\r\n market = state.market;\r\n }\r\n\r\n if (!theme) {\r\n theme = \"default\";\r\n }\r\n\r\n if (!market) {\r\n market = appEnvironment ? appEnvironment.CurrentMarket : \"en-us\";\r\n }\r\n\r\n const props = { ...args.state, id, market, t: config.localizedStrings, theme, jssStyleSheet: styleOverrides };\r\n return { props, missingChildren: [] };\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\n\r\nclass AppErrorLogger {\r\n public onAppError: ((AppError) => void) = undefined;\r\n\r\n public log(error: AppError): void {\r\n if (this.onAppError) {\r\n try {\r\n this.onAppError(error);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n }\r\n\r\n public setOnAppError(onAppError: ((AppError) => void)): void {\r\n this.onAppError = onAppError;\r\n }\r\n}\r\n\r\nexport const appErrorLogger = new AppErrorLogger();","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, SocialDataConnectorNotFound } from \"@msnews/diagnostics\";\r\nimport { IRequestContext, InspectorResponse, ScreenWidth, appEnvironment } from \"@msnews/core\";\r\nimport { SocialDataActions, SocialDataConnector } from \"@msnews/social-data-connector\";\r\n\r\nimport { ComponentConnector } from \"@msnews/experiences-connector\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { DynamicReducer } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { ExperienceInitialProps } from \"@msnews/experiences-base\";\r\nimport { IReducer } from \"@msnews/experiences-redux-contracts\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { SocialBarActions } from \"./SocialBar.actions\";\r\nimport { SocialBarConfig } from \"./SocialBar.config\";\r\nimport { SocialBarInspector } from \"./SocialBar.inspector\";\r\nimport { SocialBarProps } from \"./index\";\r\nimport { SocialBarState } from \"./SocialBar.state\";\r\nimport { Store } from \"redux\";\r\nimport { appErrorLogger } from \"@msnews/social-utils\";\r\n\r\n// A partial config to ensure loading of social data connector.\r\n// This hard-coded config can be removed after making sure that all config documents contain the data connector.\r\nconst socialDataConnectorConfig: Partial = {\r\n dataConnectors: [\r\n {\r\n screenWidth: ScreenWidth.Any,\r\n children: [\r\n {\r\n experienceType: ConnectorNamespaces.SocialData,\r\n instanceId: \"\",\r\n href: \"cms/api/amp/experienceConfigIndex/BB1cKaeg\"\r\n }\r\n ]\r\n }\r\n ]\r\n};\r\n\r\n/**\r\n * The connector for the SocialBar Experience.\r\n */\r\nexport class SocialBarConnector extends ComponentConnector {\r\n\r\n private socialDataConnector: SocialDataConnector;\r\n\r\n /** @inheritdoc */\r\n public constructor(namespace: string, parentNamespace: string, rootReducer: DynamicReducer, reducer: IReducer, store: Store, config: SocialBarConfig, requestContext: IRequestContext) {\r\n super(namespace, parentNamespace, rootReducer, reducer, store, {...socialDataConnectorConfig, ...config}, requestContext);\r\n }\r\n\r\n /** @inheritdoc */\r\n public async onComponentConnect(connectorProps?: ExperienceInitialProps): Promise {\r\n if (!appErrorLogger.onAppError) {\r\n appErrorLogger.setOnAppError(this.onAppError.bind(this));\r\n }\r\n await ComponentConnector.prototype.onComponentConnect.call(this, connectorProps);\r\n\r\n const market = connectorProps && connectorProps.context && connectorProps.context.market ? connectorProps.context.market : appEnvironment.CurrentMarket;\r\n\r\n PageBase.getInstance().rootReducer.getDataConnector(ConnectorNamespaces.SocialData).then((socialDataConnector: SocialDataConnector) => {\r\n if (socialDataConnector) {\r\n this.socialDataConnector = socialDataConnector;\r\n this.registerObservers();\r\n this.updateSocialBarState();\r\n\r\n this.setComponent(market, connectorProps.context.theme, connectorProps.context.id);\r\n } else {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"SocialBar data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"SocialBar data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n });\r\n }\r\n\r\n public registerObservers(): void {\r\n SocialDataActions.setTheme.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.updateMe.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.setContent.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.updateContent.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.updateContentRating.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.updateUser.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.updateResponsiveClass.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.mapCmsIdToContentId.registerObserver(() => this.updateSocialBarState());\r\n SocialDataActions.resetError.registerObserver(() => this.updateSocialBarState());\r\n }\r\n\r\n public updateSocialBarState(): void {\r\n if (this.getSocialDataConnector()) {\r\n SocialBarActions.setSocialData.getActionSender(this).send(this.socialDataConnector.getCurrentState());\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n public mapStateToProps(state: SocialBarState): SocialBarProps {\r\n const inspectorResult: InspectorResponse = SocialBarInspector.inspect({\r\n config: this.config,\r\n children: this.childComponentInstanceList,\r\n state: state\r\n });\r\n\r\n let connectorFunctions = {};\r\n if (this.getSocialDataConnector()) {\r\n connectorFunctions = this.socialDataConnector.getSocialBarConnectorFunctionsWithStateBindings();\r\n }\r\n\r\n return {\r\n ...inspectorResult.props,\r\n ...this.telemetryTags,\r\n children: this.childComponentInstanceList,\r\n mainTelemetryObject: this.telemetryObject,\r\n ...connectorFunctions\r\n };\r\n }\r\n\r\n public async setComponent(market: string, theme: string, id?: string) {\r\n SocialBarActions.setComponent.getActionSender(this).send(id, market);\r\n this.socialDataConnector.setTheme(theme);\r\n }\r\n\r\n private getSocialDataConnector() {\r\n if (!this.socialDataConnector) {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"Social data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"Social data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n return this.socialDataConnector;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionHandler } from \"@msnews/experiences-redux\";\r\nimport { IReducer, IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { SetComponent, SetSocialData, SocialBarActions } from \"./SocialBar.actions\";\r\n\r\nimport { SocialBarState } from \"./SocialBar.state\";\r\nimport { appEnvironment } from \"@msnews/core\";\r\n\r\n/**\r\n * The reducer for the Social connector, and the SocialState\r\n */\r\nexport class SocialBarReducer implements IReducer {\r\n /**\r\n * Update the state for the connector, based on the action being applied\r\n * @param state The previous state\r\n * @param actionPayload The action being applied\r\n */\r\n public reduce(state: SocialBarState, actionPayload: IActionPayload): SocialBarState {\r\n if (!state) { return {}; }\r\n if (!actionPayload) { return state; }\r\n\r\n let newState: SocialBarState;\r\n\r\n ActionHandler.handleAction(actionPayload, SocialBarActions.setComponent, (id?: string, market?: string) => {\r\n id = id || state.id;\r\n market = market || appEnvironment.CurrentMarket || state.market;\r\n newState = {...state, id, market};\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialBarActions.setSocialData, (socialData) => {\r\n newState = { ...state, ...socialData };\r\n });\r\n\r\n return newState || state;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const enums = {\r\n selectPpeParameter: \"oneservice_enable_ppe\",\r\n externalUrls: {\r\n api: \"https://api.msn.com/community/\",\r\n ppeApi: \"https://ppe-api.msn.com/community/\",\r\n guidelinePage: \"https://www.msn.com/en-us/community/guideline\",\r\n guidelinePageEmbed: \"https://www.msn.com/en-us/community/embed/guidelinepage\",\r\n profilePage: \"https://www.msn.com/en-us/community/profile/\",\r\n channelPage: \"https://www.msn.com/en-us/community/channel/\",\r\n privacySettings: \"https://www.msn.com/en-us/settings\",\r\n profileSettings: \"https://account.microsoft.com/profile\",\r\n feedbackForm: \"https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR-V3gf69zQlBm1dJVuXA8mtURVI4UlFHMDRIR0VCWDFWNUQyQU5HVzJJQi4u\",\r\n moderationEmail: \"Appealsprocessor@microsoft.com\",\r\n newPost: \"https://www.msn.com/en-us/community/post/new\"\r\n },\r\n userStateType: {\r\n existingUser: \"existingUser\",\r\n anonymous: \"anonymous\",\r\n newUser: \"newUser\"\r\n },\r\n userNameStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAvatarStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAgeGroup: {\r\n under18: \"Under18\",\r\n above18: \"Above18\"\r\n },\r\n activityType: {\r\n follow: \"Follow\",\r\n reply: \"Reply\",\r\n reaction: \"Reaction\",\r\n badge: \"Achievement\",\r\n moderation: \"Moderation\",\r\n commentDeleteAlert: \"CommentDeleteAlert\",\r\n profileBannedAlert: \"ProfileBannedAlert\",\r\n profileErrorAlert: \"ProfileErrorAlert\"\r\n },\r\n moderationErrorType: {\r\n takedown: \"Takedown\",\r\n ban: \"Ban\",\r\n notAllowName: \"NotAllowName\",\r\n notAllowPicture: \"NotAllowPicture\",\r\n approveUserAppeal: \"ApproveUserAppeal\",\r\n rejectUserAppeal: \"RejectUserAppeal\",\r\n approveProfilePicAppeal: \"ApproveProfilePicAppeal\",\r\n rejectProfilePicAppeal: \"RejectProfilePicAppeal\",\r\n approveCommentAppeal: \"ApproveCommentAppeal\",\r\n rejectCommentAppeal: \"RejectCommentAppeal\"\r\n },\r\n visibleStatusType: {\r\n Normal: \"Normal\",\r\n DeletedByUser: \"DeletedByUser\",\r\n DeletedByAI: \"DeletedByAI\",\r\n DeletedByHI: \"DeletedByHI\",\r\n InReview: \"InReview\"\r\n },\r\n visibleStatusMap: {\r\n DeletedByUser: \"VisibleStatusDeletedByUser\",\r\n DeletedByAI: \"VisibleStatusDeletedByAI\",\r\n DeletedByHI: \"VisibleStatusDeletedByHI\",\r\n InReview: \"VisibleStatusInReview\",\r\n Default: \"VisibleStatusOther\"\r\n },\r\n commentReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n Copyright: \"ReportOptCopyright\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\",\r\n OffTopic: \"ReportOptOffTopic\"\r\n },\r\n userNameReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\",\r\n OffTopic: \"ReportOptOffTopic\"\r\n },\r\n userPictureReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n Copyright: \"ReportOptCopyright\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Nudity: \"ReportOptNudity\",\r\n NonConsensualIntimateImagery: \"ReportOptNonConsensualIntimateImagery\",\r\n Inappropriate: \"ReportOptInappropriate\",\r\n OffTopic: \"ReportOptOffTopic\"\r\n },\r\n reactionOrder: [\r\n \"like\", \"love\", \"surprised\", \"thinking\", \"sad\", \"angry\"\r\n ],\r\n profileReportItemMap: {\r\n UserName: \"ReportUserName\",\r\n ProfilePicture: \"ReportProfilePicture\"\r\n },\r\n profilePageEmptyStates: {\r\n NoUser: \"NoUser\",\r\n NotSocialUser: \"NotSocialUser\"\r\n },\r\n reactionIconMap: {\r\n like: \"EmojiLike\",\r\n love: \"EmojiHeart\",\r\n thinking: \"EmojiThinking\",\r\n surprised: \"EmojiSurprised\",\r\n sad: \"EmojiSad\",\r\n angry: \"EmojiAngry\"\r\n },\r\n reactions: {\r\n like: \"like\",\r\n love: \"love\",\r\n thinking: \"thinking\",\r\n surprised: \"surprised\",\r\n sad: \"sad\",\r\n angry: \"angry\"\r\n },\r\n responsiveLevels: {\r\n L0: \"cwtl-0\",\r\n L1: \"cwtl-1\",\r\n L2: \"cwtl-2\",\r\n MobilePopup: \"cwt-mobile-popup\",\r\n articleOneBlock: \"cwt-article-one-block\"\r\n },\r\n newCommentErrorCodeMap: {\r\n 400: \"NewPostDeniedMsg\",\r\n 403: \"NewPostSessionExpiredMsg\",\r\n 500: \"NewPostWentWrongMsg\",\r\n bodyTooLong: \"NewPostTooLongMsg\",\r\n other: \"NewPostWentWrongMsg\",\r\n 0: \"NewPostWentWrongMsg\",\r\n 1: \"NewPostSessionExpiredMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 6: \"NewPostWentWrongMsg\",\r\n 7: \"NewPostWentWrongMsg\",\r\n 8: \"NewPostWentWrongMsg\",\r\n 9: \"NewPostWentWrongMsg\",\r\n 10: \"NewPostWentWrongMsg\",\r\n 11: \"NewPostWentWrongMsg\",\r\n 12: \"NewPostTooManyCommentsMsg\",\r\n 20: \"NewPostTooLongMsg\",\r\n 21: \"NewPostMentionMsg\",\r\n 22: \"NewPostWentWrongMsg\",\r\n 23: \"NewPostWentWrongMsg\",\r\n 24: \"NewPostDeniedMsg\",\r\n 25: \"NewPostWentWrongMsg\",\r\n 26: \"NewPostWentWrongMsg\",\r\n 27: \"NewPostWentWrongMsg\",\r\n 28: \"NewPostDeniedMsg\",\r\n 29: \"NewPostDeniedMsg\",\r\n 30: \"NewPostDeniedMsg\",\r\n 31: \"NewPostDeniedMsg\",\r\n 32: {\r\n 1: \"NewPostDuplicatedMsg\",\r\n 2: \"NewPostDeniedMsg\",\r\n 3: \"NewPostDeniedMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 5: \"NewPostDeniedMsg\",\r\n 6: \"NewPostDeniedMsg\",\r\n 7: \"NewPostDeniedMsg\",\r\n 8: \"NewPostDeniedMsg\",\r\n 9: \"NewPostDeniedMsg\",\r\n 10: \"NewPostDeniedMsg\",\r\n 11: \"NewPostDeniedMsg\",\r\n 12: \"NewPostDeniedMsg\",\r\n 13: \"NewPostDeniedMsg\",\r\n 14: \"NewPostDeniedMsg\",\r\n 15: \"NewPostDeniedMsg\",\r\n 16: \"NewPostDeniedMsg\",\r\n 17: \"NewPostLanguageErrorMsg\",\r\n 18: \"NewPostURLMsg\"\r\n }\r\n\r\n },\r\n commentsStatusType: {\r\n zero: 0,\r\n minimal: 1,\r\n expanded: 2,\r\n notDetermined: 3\r\n },\r\n theme: {\r\n default: {\r\n name: \"default\",\r\n disabledComponents: []\r\n },\r\n superappBase: {\r\n name: \"superapp\",\r\n disabledComponents: []\r\n },\r\n windowsBase: {\r\n name: \"windows\",\r\n disabledComponents: []\r\n },\r\n superappEmbed: {\r\n name: \"superapp-embed\",\r\n modalComponents: [\"reactionbreakdowncomment\", \"reactionbreakdowncontent\", \"onboardingpage\", \"onboardingthirdpartypage\", \"onboardingunderagepage\", \"reportmenu\", \"profilereportmenu\", \"copyrightform\", \"trademarkform\"],\r\n disabledComponents: [\"profilepage\", \"guidelinepage\", \"articlepage\", \"multiloginpage\", \"reactionbreakdowncomment\", \"reactionbreakdowncontent\", \"onboardingpage\", \"onboardingthirdpartypage\", \"onboardingunderagepage\", \"notificationtray\", \"reportmenu\", \"profilereportmenu\", \"copyrightform\", \"trademarkform\"]\r\n },\r\n superappFullpage: {\r\n name: \"superapp-fullpage\",\r\n modalComponents: [\"reactionbreakdowncomment\", \"reactionbreakdowncontent\", \"onboardingpage\", \"onboardingthirdpartypage\", \"onboardingunderagepage\", \"reportmenu\", \"profilereportmenu\", \"copyrightform\", \"trademarkform\"],\r\n disabledComponents: [\"profilepage\", \"guidelinepage\", \"articlepage\", \"multiloginpage\", \"onboardingthirdpartypage\", \"notificationtray\"]\r\n }\r\n },\r\n profileVisitedLocalStorageKey: \"self-profile-visited\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Telemetry, TelemetryActionType, TelemetryBehaviorType, TelemetryContentType, TelemetryContentViewType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryBase, appEnvironment, getAppEnvironment } from \"@msnews/core\";\r\n\r\nimport { PageType } from \"@msnews/experiences-constants\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { enums } from \"./enums\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\ninterface PrimeCustomTelemetryHandlers {\r\n handleTelemetryCall: Function;\r\n handlePartialPageImpressionCall: Function;\r\n handleUpdateTemplValueCallback?: Promise;\r\n}\r\n\r\nexport class SocialTelemetryManager {\r\n private static primeHandlers: PrimeCustomTelemetryHandlers;\r\n private static dispatchDedupe = {};\r\n\r\n public static setPrimeHandlers(handlers: PrimeCustomTelemetryHandlers) {\r\n if (!this.primeHandlers) {\r\n this.primeHandlers = handlers;\r\n } else {\r\n this.primeHandlers = {\r\n ...this.primeHandlers,\r\n ...handlers\r\n };\r\n }\r\n }\r\n\r\n public static dispatchDedupedTelemetryEvent(telemetryEvent, element) {\r\n const now = Date.now(); // current timestamp in ms.\r\n\r\n if (this.dispatchDedupe[telemetryEvent.eventName]) {\r\n if (this.dispatchDedupe[telemetryEvent.eventName] > 0 && now - this.dispatchDedupe[telemetryEvent.eventName] <= 500) {\r\n logger.log(\"Event deduped\");\r\n return;\r\n }\r\n }\r\n this.dispatchDedupe[telemetryEvent.eventName] = now;\r\n this.handleEvent(telemetryEvent, element, this.primeHandlers && this.primeHandlers.handleTelemetryCall, this.primeHandlers && this.primeHandlers.handlePartialPageImpressionCall);\r\n }\r\n\r\n public static setTemplValue(key, value) {\r\n if (Telemetry?.addOrUpdateTmplProperty) {\r\n Telemetry.addOrUpdateTmplProperty(key, value);\r\n } else if (this.primeHandlers?.handleUpdateTemplValueCallback) {\r\n this.primeHandlers.handleUpdateTemplValueCallback.then(updateTemplValue => {\r\n updateTemplValue(`${key}:${value}`);\r\n });\r\n }\r\n }\r\n\r\n private static handleEvent(telemetryEvent, element, customClickHandler?, customImpressionHandler?) {\r\n try {\r\n const action = (telemetryEvent.subTypes && telemetryEvent.subTypes.action) || (telemetryEvent.contract && telemetryEvent.contract.action) || TelemetryActionType.Click;\r\n const behavior = (telemetryEvent.subTypes && telemetryEvent.subTypes.behavior) || (telemetryEvent.contract && telemetryEvent.contract.behavior) || TelemetryBehaviorType.Undefined;\r\n switch (telemetryEvent.eventType) {\r\n case UpperTelemetryType.ContentView:\r\n if (customImpressionHandler) {\r\n customImpressionHandler(element, telemetryEvent.subTypes.viewType);\r\n break;\r\n }\r\n\r\n if (telemetryEvent.sendPeregrine) {\r\n Telemetry.sendContentViewEvent(element, telemetryEvent.subTypes.viewType); // viewType: TelemetryContentViewType (Load, Partial etc.)\r\n }\r\n break;\r\n default:\r\n if (customClickHandler) {\r\n const headline = (telemetryEvent.contract && telemetryEvent.contract.content && telemetryEvent.contract.content.headline) || `UnknownTelemetryEventName:${telemetryEvent.eventName}`;\r\n const isNavigate = behavior == TelemetryBehaviorType.Navigate;\r\n const primeEventType = (telemetryEvent.subTypes && telemetryEvent.subTypes.action) || (telemetryEvent.contract && telemetryEvent.contract.action) || \"click_nonnav\";\r\n const destination = (telemetryEvent.contract && telemetryEvent.contract.destinationUrl) || null;\r\n\r\n customClickHandler(\r\n element,\r\n action,\r\n behavior,\r\n { type: isNavigate ? \"click\" : primeEventType, originalEvent: \"click\", target: element },\r\n destination,\r\n headline\r\n );\r\n break;\r\n }\r\n if (telemetryEvent.sendPeregrine == false) { break; }\r\n element.setAttribute(\"data-customhandled\", true);\r\n Telemetry.sendActionEvent(element, action, behavior);\r\n break;\r\n }\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n}\r\n\r\n/** PUBLIC TELEMETRY UTILS */\r\n/**\r\n * @param elementTelemetryObject Telemetry object reference to generate tags from\r\n * @param isVisible Flag that should set to true if impressions should be sent for given telemetry object\r\n * @return Telemetry data tags for prime or peregrine\r\n */\r\nexport function renderHybrid(elementTelemetryObject: TelemetryObjectBase, isVisible: boolean, refCallback?: (HTMLElement) => void) {\r\n if (!elementTelemetryObject) {\r\n return {};\r\n }\r\n\r\n // Attach content category and content vertical information to contract if applicable\r\n if (isArticlePage() || isGalleryPage() || isVideoPage()) {\r\n elementTelemetryObject.contract.content = {...elementTelemetryObject.contract.content, ...getPageContentCategoryAndVertical()};\r\n }\r\n\r\n // When Hybrid mode active\r\n const customTelemetryTags = convertToHybridTags(elementTelemetryObject);\r\n const finalAttributes = {ref: (elementRef: HTMLElement) => {\r\n const element = ReactDOM.findDOMNode(elementRef);\r\n try {\r\n if (refCallback) {\r\n refCallback(element);\r\n }\r\n } catch (e) {\r\n logger.logError(e);\r\n } finally {\r\n if (customTelemetryTags && element && !element.getAttribute(\"data-id\")) {\r\n TelemetryBase.setTrackingAttrs(element, element.parentElement, {defaults: customTelemetryTags}, !isVisible);\r\n }\r\n }\r\n }};\r\n\r\n if (!customTelemetryTags) {\r\n /** Generate Tags from telemetry object */\r\n const telemetryTagsObject = elementTelemetryObject.render();\r\n finalAttributes[\"data-t\"] = telemetryTagsObject[\"data-t\"];\r\n }\r\n return finalAttributes;\r\n}\r\n\r\n/**\r\n * @param parentTelemetryObject Telemetry object reference of parent element/context\r\n * @param telemetryContract The telemetry contract that is used when creating new telemetry object\r\n * @param dynamicContentObject Object passed to set/override dynamic fields of content if there are any e.g: id, headline\r\n * @param existingObject Previously created telemetry object if its wanted to be updated\r\n * @return Created or updated telemetry object\r\n */\r\nexport function addOrUpdateTelemetryObject(parentTelemetryObject, telemetryContract, dynamicContentObject, existingObject?): TelemetryObjectBase {\r\n const uniqueTelemetryContract = {...telemetryContract, content: {...telemetryContract.content, ...(dynamicContentObject || {})}};\r\n return parentTelemetryObject ? parentTelemetryObject.addOrUpdateChild(uniqueTelemetryContract, existingObject || null) : null;\r\n}\r\n\r\n/** Telementry Event Dispatcher: used in components */\r\nexport function dispatchTelemetryEvent(telemetryEvent, element, telemetryAttributes = null) {\r\n try {\r\n if (telemetryAttributes && telemetryAttributes.content) {\r\n telemetryEvent.contract.content = {...telemetryEvent.contract.content, ...telemetryAttributes.content};\r\n }\r\n SocialTelemetryManager.dispatchDedupedTelemetryEvent(telemetryEvent, element);\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n}\r\n\r\nexport function genericTelemetryClickDispatcher(element: any, telemetryObject: any): void {\r\n const telemetryEventDispatcherInfo = {\r\n eventName: TelemetryEventNames.genericAction,\r\n contract: {...(telemetryObject && telemetryObject.contract)}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element);\r\n}\r\n\r\nexport function getHeadlineByReactionType(reactionType, isUndo?) {\r\n return `${isUndo ? \"Undo \" : \"\"}${reactionType[0].toUpperCase()}${reactionType.slice(1)}`;\r\n}\r\n\r\nexport function getPageContentType() {\r\n if (isGalleryPage()) {\r\n return TelemetryContentType.Gallery;\r\n } else if (isArticlePage()) {\r\n return TelemetryContentType.Article;\r\n } else if (isVideoPage()) {\r\n return TelemetryContentType.Video;\r\n } else {\r\n return TelemetryContentType.Article;\r\n }\r\n}\r\n\r\n/** PRIVATE TELEMETRY UTILS */\r\n/**\r\n * @param elementTelemetryObject Telemetry object reference to generate tags from\r\n * @return Telemetry data tags for prime\r\n */\r\nfunction convertToHybridTags(elementTelemetryObject: TelemetryObjectBase): any {\r\n if (!elementTelemetryObject || !TelemetryBase.setTrackingAttrs) {\r\n return null;\r\n }\r\n\r\n // Generate Tags for Hybrid pages\r\n const contract: any = elementTelemetryObject.contract || {};\r\n const content = contract.content || {};\r\n const customTelemetryTags = {\r\n n: contract.name,\r\n l: content.id,\r\n hl: content.headline,\r\n ct: content.type,\r\n c: content.category,\r\n v: content.vertical,\r\n b: contract.behavior\r\n };\r\n\r\n // Remove undefined keys\r\n Object.keys(customTelemetryTags).map(key => {\r\n if (!customTelemetryTags[key]) {\r\n delete customTelemetryTags[key];\r\n }\r\n });\r\n return customTelemetryTags;\r\n}\r\n\r\nfunction isGalleryPage() {\r\n const pageType = appEnvironment.CurrentRequestTargetScope && appEnvironment.CurrentRequestTargetScope.pageType as string;\r\n return pageType && (\r\n pageType === PageType.Gallery || pageType === PageType.GalleryFullScreen || pageType === PageType.ArticleFullScreen || pageType.startsWith(\"gallery\")\r\n );\r\n}\r\n\r\nfunction isArticlePage() {\r\n const pageType = appEnvironment.CurrentRequestTargetScope && appEnvironment.CurrentRequestTargetScope.pageType as string;\r\n return pageType && pageType !== PageType.ArticleFullScreen && (\r\n pageType === PageType.Article || pageType.startsWith(\"article\")\r\n );\r\n}\r\n\r\nfunction isVideoPage() {\r\n const pageType = appEnvironment.CurrentRequestTargetScope && appEnvironment.CurrentRequestTargetScope.pageType as string;\r\n return pageType && (\r\n pageType === PageType.Video || pageType === \"channelplayerpage\" || pageType.startsWith(\"video\")\r\n );\r\n}\r\n\r\nfunction getPageContentCategoryAndVertical() {\r\n return {\r\n category: appEnvironment.HostPage && appEnvironment.HostPage.categoryKey,\r\n vertical: appEnvironment.HostPage && appEnvironment.HostPage.verticalKey\r\n };\r\n}\r\n\r\n/** TELEMETRY TYPES */\r\nexport const UpperTelemetryType = {\r\n ContentView: \"ContentView\",\r\n Action: \"Action\"\r\n};\r\n\r\nexport const TelemetryEventNames = {\r\n // event names used at component level\r\n genericLoaded: \"generic-loaded\",\r\n genericAction: \"generic-action\",\r\n genericHover: \"generic-hover\"\r\n\r\n};\r\n\r\n/** Social Event Types */\r\nexport const TelemetryEventMap = {\r\n // events used at component level\r\n genericLoaded: {\r\n eventName: TelemetryEventNames.genericLoaded,\r\n eventType: UpperTelemetryType.ContentView,\r\n contract: {},\r\n subTypes: {viewType: TelemetryContentViewType.Partial},\r\n sendPrime: true,\r\n sendPeregrine: false\r\n },\r\n genericHover: {\r\n eventName: TelemetryEventNames.genericHover,\r\n subTypes: {action: TelemetryActionType.Hover}\r\n }\r\n};\r\n\r\nexport const ReactionToBehaviorTypeMap = {\r\n [enums.reactions.angry]: TelemetryBehaviorType.Angry,\r\n [enums.reactions.like]: TelemetryBehaviorType.Like,\r\n [enums.reactions.love]: TelemetryBehaviorType.Love,\r\n [enums.reactions.sad]: TelemetryBehaviorType.Sad,\r\n [enums.reactions.surprised]: TelemetryBehaviorType.Surprised,\r\n [enums.reactions.thinking]: TelemetryBehaviorType.Thinking\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\nexport function dispatchBridgeEvent(bridgeEventName, data = {}) {\r\n try {\r\n document.dispatchEvent(new CustomEvent(bridgeEventName, {detail: {eventName: bridgeEventName, data: data}}));\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n}\r\n\r\nexport function handleBridgeEvent(customEvent: CustomEvent) {\r\n try {\r\n const data = {type: customEvent.detail.eventName,\r\n ...customEvent.detail.data\r\n };\r\n window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({type: \"community\", data: data}));\r\n logger.log(`Bridge message is sent. Message: ${JSON.stringify({type: \"community\", data: data})}`);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n}\r\n\r\nexport const BridgeEventNames = {\r\n signInClicked: \"sign-in-clicked\",\r\n saveCachedMyReaction: \"save-cached-my-reaction\",\r\n commentsClicked: \"comments-clicked\",\r\n openDeepLink: \"open-deep-link\",\r\n requestBrowser: \"request-browser\",\r\n increaseBackStack: \"increase-back-stack\",\r\n openPopup: \"open-popup\",\r\n closePopup: \"close-popup\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { enums } from \"./enums\";\r\n\r\nexport function hasThemeBase(theme, targetTheme) {\r\n return theme && theme.startsWith(targetTheme.name);\r\n}\r\n\r\nexport function isThemeEqual(theme, targetTheme) {\r\n return theme == targetTheme.name;\r\n}\r\n\r\nexport function isComponentDisabled(theme, component) {\r\n let disabledComponents = [];\r\n for (const key in enums.theme) {\r\n if (enums.theme[key].name === theme) {\r\n disabledComponents = enums.theme[key].disabledComponents;\r\n break;\r\n }\r\n }\r\n return disabledComponents.includes(component);\r\n}\r\n\r\nexport function isComponentInModal(theme, component) {\r\n let modalComponents = [];\r\n for (const key in enums.theme) {\r\n if (enums.theme[key].name === theme) {\r\n modalComponents = enums.theme[key].modalComponents;\r\n break;\r\n }\r\n }\r\n return modalComponents && modalComponents.includes(component);\r\n}","// © Microsoft Corporation. All rights reserved.\r\nexport class AccessibilityHelpers {\r\n static style: HTMLStyleElement;\r\n\r\n static attachAccessibilityListeners = (document: Document, node?: HTMLElement) => {\r\n\r\n if (!node) {\r\n Array.from(document.getElementsByClassName(\"cwt-sort-list-item\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(document.getElementsByClassName(\"cwt-link\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(document.getElementsByClassName(\"cwt-access-li\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(document.getElementsByClassName(\"cwt-button\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(document.getElementsByClassName(\"transaction-history-trigger\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(document.getElementsByTagName(\"a\")).map((AccessibilityHelpers.addTabIndex));\r\n } else {\r\n Array.from(node.getElementsByClassName(\"cwt-sort-list-item\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByClassName(\"cwt-link\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByClassName(\"cwt-access-li\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByClassName(\"cwt-button\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByClassName(\"cwt-privacy-checkbox\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByClassName(\"transaction-history-trigger\")).map(AccessibilityHelpers.addTabIndex);\r\n Array.from(node.getElementsByTagName(\"a\")).map((AccessibilityHelpers.addTabIndex));\r\n }\r\n\r\n !AccessibilityHelpers.style && AccessibilityHelpers.addAccessibilityOutlines();\r\n };\r\n\r\n private static simulateMouseClick = (targetNode) => {\r\n if (targetNode) {\r\n // --- Simulate a natural mouse-click sequence.\r\n triggerMouseEvent(targetNode, \"mousedown\");\r\n triggerMouseEvent(targetNode, \"click\");\r\n }\r\n\r\n function triggerMouseEvent(node, eventType) {\r\n const clickEvent = document.createEvent(\"MouseEvents\");\r\n clickEvent.initEvent(eventType, true, true);\r\n node.dispatchEvent(clickEvent);\r\n }\r\n };\r\n\r\n private static addTabIndex = (ele) => {\r\n if ((ele as HTMLElement).getAttribute(\"no-access\") == \"true\") {\r\n return null;\r\n }\r\n\r\n // Add tab-index\r\n !ele.hasAttribute(\"tabIndex\") && ele.setAttribute(\"tabIndex\", \"0\");\r\n\r\n // Add Enter key listener to fire click event\r\n if (!ele.hasAttribute(\"hasEnterKeydown\")) {\r\n ele.setAttribute(\"hasEnterKeydown\", \"1\");\r\n ele.addEventListener(\"keydown\", (e) => {\r\n if (e.keyCode === 13) { // checks whether the pressed key is \"Enter\"\r\n AccessibilityHelpers.simulateMouseClick(ele);\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n });\r\n }\r\n };\r\n\r\n private static addAccessibilityOutlines = () => {\r\n let shouldHaveOutline = false;\r\n const focusKeys = [9, 37, 38, 39, 40];\r\n\r\n AccessibilityHelpers.style = document.createElement(\"style\");\r\n const targetNode = document.head;\r\n targetNode.append(AccessibilityHelpers.style);\r\n\r\n document.addEventListener(\"keydown\", (e) => {\r\n if (focusKeys.includes(e.keyCode) && !shouldHaveOutline) {\r\n shouldHaveOutline = true;\r\n }\r\n });\r\n document.addEventListener(\"mousedown\", (e) => {\r\n if (e.isTrusted) {\r\n shouldHaveOutline = false;\r\n }\r\n });\r\n document.addEventListener(\"focusin\", (e) => {\r\n if (!shouldHaveOutline && e.isTrusted) {\r\n AccessibilityHelpers.style.innerText = \"[hasEnterKeydown]:focus { outline: none; }\";\r\n } else {\r\n if (AccessibilityHelpers.style) {\r\n AccessibilityHelpers.style.innerText = \"[hasEnterKeydown]:focus { outline: \\\"black auto 1px\\\";}\";\r\n }\r\n }\r\n });\r\n };\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\nconst mouseHandlers = {\r\n makeMouseOutFn: (elem, callback) => {\r\n const list = traverseChildren(elem);\r\n return function onMouseOut(event) {\r\n const e = event.toElement || event.relatedTarget;\r\n if (~list.indexOf(e)) {\r\n return;\r\n }\r\n callback();\r\n };\r\n },\r\n\r\n isElementHover: e => e.parentElement.querySelector(\":hover\") === e\r\n};\r\n\r\nfunction traverseChildren(elem) {\r\n const children = [];\r\n const q = [];\r\n q.push(elem);\r\n while (q.length > 0) {\r\n elem = q.pop();\r\n children.push(elem);\r\n pushAll(elem.children);\r\n }\r\n\r\n function pushAll(elemArray) {\r\n for (let i = 0; i < elemArray.length; i++) {\r\n q.push(elemArray[i]);\r\n }\r\n }\r\n return children;\r\n}\r\n\r\nfunction preventSelection(e) {\r\n document.body.style[\"-webkit-touch-callout\"] = \"none\";\r\n document.body.style[\"-webkit-user-select\"] = \"none\";\r\n document.body.style[\"-khtml-user-select\"] = \"none\";\r\n document.body.style[\"-moz-user-select\"] = \"none\";\r\n document.body.style[\"-ms-user-select\"] = \"none\";\r\n document.body.style[\"user-select\"] = \"none\";\r\n\r\n const removeNoSelect = () => {\r\n document.body.style[\"-webkit-touch-callout\"] = \"unset\";\r\n document.body.style[\"-webkit-user-select\"] = \"unset\";\r\n document.body.style[\"-khtml-user-select\"] = \"unset\";\r\n document.body.style[\"-moz-user-select\"] = \"unset\";\r\n document.body.style[\"-ms-user-select\"] = \"unset\";\r\n document.body.style[\"user-select\"] = \"unset\";\r\n };\r\n\r\n document.body.addEventListener(\"click\", removeNoSelect, {once: true});\r\n document.body.addEventListener(\"mouseup\", removeNoSelect, {once: true});\r\n document.body.addEventListener(\"touchend\", removeNoSelect, {once: true});\r\n}\r\n\r\nfunction stopPropagationAndPreventDefault(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n}\r\n\r\nfunction getPointerCoordinatesByEvent(e) {\r\n let coords;\r\n if (e.type == \"touchstart\" || e.type == \"touchmove\" || e.type == \"touchend\" || e.type == \"touchcancel\") {\r\n const evt = (typeof e.originalEvent === \"undefined\") ? e : e.originalEvent;\r\n const touch = evt.touches[0] || evt.changedTouches[0];\r\n coords = {x: touch.clientX, y: touch.clientY};\r\n } else if (e.type == \"mousedown\" || e.type == \"mouseup\" || e.type == \"mousemove\" || e.type == \"mouseover\"|| e.type==\"mouseout\" || e.type==\"mouseenter\" || e.type==\"mouseleave\") {\r\n coords = {x: e.clientX, y: e.clientY};\r\n }\r\n\r\n return coords;\r\n}\r\n\r\nexport {mouseHandlers, preventSelection, stopPropagationAndPreventDefault, getPointerCoordinatesByEvent};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { enums } from \"./enums\";\r\n\r\nexport class ResponsiveClassManager {\r\n static responsiveClass = \"\";\r\n static listeners: {[key: string]: (responsiveClass) => void} = {};\r\n static isInitialized = false;\r\n static queryLevels = null;\r\n\r\n public static setWindow(window: any) {\r\n if (ResponsiveClassManager.queryLevels) { return; }\r\n\r\n ResponsiveClassManager.queryLevels = [\r\n {\r\n query: window.matchMedia(\"(max-width: 943px)\"),\r\n className: enums.responsiveLevels.articleOneBlock\r\n },\r\n {\r\n query: window.matchMedia(\"(max-width: 640px)\"),\r\n className: enums.responsiveLevels.L0\r\n },\r\n {\r\n query: window.matchMedia(\"(max-width: 540px) and (max-aspect-ratio: 1/1)\"),\r\n className: enums.responsiveLevels.MobilePopup\r\n },\r\n {\r\n query: window.matchMedia(\"(max-width: 480px)\"),\r\n className: enums.responsiveLevels.L1\r\n },\r\n {\r\n query: window.matchMedia(\"(max-width: 340px)\"),\r\n className: enums.responsiveLevels.L2\r\n }\r\n ];\r\n }\r\n\r\n public static addListener(client: any, onChange: (responsiveClass: string) => void) {\r\n if (ResponsiveClassManager.listeners[client]) { return; }\r\n ResponsiveClassManager.listeners[client] = onChange;\r\n\r\n !ResponsiveClassManager.isInitialized && ResponsiveClassManager.listenMediaQueries();\r\n }\r\n\r\n static listenMediaQueries() {\r\n ResponsiveClassManager.isInitialized = true;\r\n // Add listeners for each query level\r\n ResponsiveClassManager.queryLevels.map(queryLevel => queryLevel.query.addListener(() => ResponsiveClassManager.checkMediaQueryLevel(queryLevel)));\r\n\r\n // Check all queryLevels after the next event tick\r\n setTimeout(() => { ResponsiveClassManager.queryLevels.map(queryLevel => ResponsiveClassManager.checkMediaQueryLevel(queryLevel)); });\r\n }\r\n\r\n static checkMediaQueryLevel(queryLevel) {\r\n let classNames= (ResponsiveClassManager.responsiveClass).split(\" \").filter(c => c.trim() != \"\");\r\n\r\n if (queryLevel.query.matches) {\r\n classNames.push(queryLevel.className);\r\n } else {\r\n classNames = classNames.filter(className => className != queryLevel.className);\r\n }\r\n\r\n ResponsiveClassManager.responsiveClass = classNames.join(\" \");\r\n Object.values(ResponsiveClassManager.listeners).map(fn => fn(ResponsiveClassManager.responsiveClass));\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\nexport function contentIdKey(cmsId: string, market: string): string {\r\n return `${cmsId}_${market}`;\r\n}\r\n\r\nexport function selectContentId(contentIds: { [id: string]: string }, cmsId: string, market: string): string {\r\n const key = contentIdKey(cmsId, market);\r\n const contentId = contentIds && contentIds[key];\r\n\r\n if (contentId) {\r\n return contentId;\r\n } else {\r\n logger.log(\"Content id doesn't exist, falling back to key `${cmsId}_${market}`\");\r\n return key;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\nfunction getParameter(key, defaultValue = null) {\r\n return getHashParameter(key) || getQueryParameter(key) || defaultValue;\r\n}\r\nfunction getQueryParameter (key) {\r\n const query = window.location.search.substring(1);\r\n const vars = query.split(\"&\");\r\n const valueList = []; // to support multiple parameters with the same key\r\n for (let i = 0; i < vars.length; i++) {\r\n const pair = vars[i].split(\"=\");\r\n if (pair[0].toLowerCase() == key.toLowerCase()) {\r\n valueList.push(pair[1]);\r\n }\r\n }\r\n if (valueList.length > 0) {\r\n return valueList.map(v => decodeURIComponent(v || \"\")).join(\",\");\r\n }\r\n return null;\r\n}\r\nfunction getHashParameter(key) {\r\n const query = window.location.hash.substring(1);\r\n const vars = query.split(\"&\");\r\n for (let i = 0; i < vars.length; i++) {\r\n const pair = vars[i].split(\"=\");\r\n if (pair[0].toLowerCase() == key.toLowerCase()) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n return null;\r\n}\r\nfunction generateQueryStringByKeyVals(keyVals) {\r\n return (keyVals && Object.keys(keyVals).length > 0) ? \"?\" + Object.keys(keyVals).map(function (key) {\r\n const values = keyVals[key].split(\",\");\r\n return values.map(value => {\r\n if (!value) { // query parameter without a value\r\n return key;\r\n }\r\n return `${key}=${encodeURIComponent(value)}`;\r\n }).join(\"&\");\r\n }).join(\"&\") : \"\";\r\n}\r\nfunction decodeHtml(html) {\r\n const txt = document.createElement(\"textarea\");\r\n txt.innerHTML = html;\r\n return txt.value;\r\n}\r\nfunction getExternalURL(externalURL: string, market?: string, hasSectionIndicator?: string) {\r\n const forwardableParameters = [\"fdhead\", \"item\", \"rt\", \"theme\", \"ocid\", \"env\", \"oneservice_enable_ppe\"];\r\n const queryParams = {};\r\n forwardableParameters.map(x => {\r\n const val = getQueryParameter(x);\r\n if (val !== null) {\r\n queryParams[x] = val;\r\n }\r\n });\r\n const queryString = generateQueryStringByKeyVals(queryParams);\r\n if (market && externalURL.indexOf(\"/en-us/\") > 0) {\r\n externalURL = externalURL.replace(\"/en-us/\", `/${market}/`);\r\n }\r\n if (window.location.origin.indexOf(\"://int.msn.com\") > 0 && externalURL.indexOf(\"://www.msn.com\") > 0) {\r\n externalURL = externalURL.replace(\"://www.msn.com\", \"://int.msn.com\");\r\n }\r\n const segments = [externalURL];\r\n if (queryString && externalURL.indexOf(\"?\") != -1) {\r\n segments.push(`&${queryString.substring(1)}`);\r\n } else if (queryString) {\r\n segments.push(queryString);\r\n }\r\n segments.push(hasSectionIndicator ? `#comments&commentId=${hasSectionIndicator}` : \"\");\r\n return segments.join(\"\");\r\n}\r\nfunction commentsSectionIndicatorExist() {\r\n return window.location.hash.includes(\"comments\");\r\n}\r\n\r\nexport {getParameter, generateQueryStringByKeyVals, decodeHtml, getExternalURL, commentsSectionIndicatorExist};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { appEnvironment } from \"@msnews/core\";\r\n\r\nexport function getFlight(flightId): boolean {\r\n if (appEnvironment.CurrentRequestTargetScope && appEnvironment.CurrentRequestTargetScope.pageExperiments && flightId) {\r\n const experiments = appEnvironment.CurrentRequestTargetScope.pageExperiments;\r\n return !!experiments.find(x => x && x.toLowerCase() == flightId.toLowerCase());\r\n }\r\n return false;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getExternalURL } from \"./urlHelper\";\r\nimport { getFlight } from \"./getFlight\";\r\n\r\n// © Microsoft Corporation. All rights reserved.\r\nexport function isValidURL(pageURL, contentURL, whitelist, blacklist) {\r\n if (!pageURL || (!whitelist && !blacklist) || pageURL.match(\"bypasslist=true\")) {\r\n return true;\r\n }\r\n\r\n const considerURL = pageURL.match(\"/community/embed/\") && contentURL && getExternalURL(contentURL) || pageURL;\r\n if (!considerURL) {\r\n return true;\r\n }\r\n\r\n // If whitelists exist at least 1 whitelist condition should be satisfied\r\n if (whitelist) {\r\n const whitelistArray = whitelist.split(\",\");\r\n const fds = whitelistArray.filter(x => x.indexOf(\"fd:\") == 0).map(x => x.substring(3));\r\n const whitelistTest = whitelistArray.filter(x => x.indexOf(\"fd:\") == -1).map(x => {\r\n try {\r\n return new RegExp(x, \"g\");\r\n } catch (e) {\r\n return x;\r\n }\r\n });\r\n\r\n const testPass = whitelistTest.find(x => considerURL.match(x)) || fds.find(x => getFlight(x));\r\n if (!testPass) {\r\n return false;\r\n }\r\n }\r\n\r\n // If blacklists exist none of the blacklist conditions should be satisfied\r\n if (blacklist) {\r\n const blacklistArray = blacklist.split(\",\");\r\n const fds = blacklistArray.filter(x => x.indexOf(\"fd:\") == 0).map(x => x.substring(3));\r\n const blacklistTest = blacklistArray.filter(x => x.indexOf(\"fd:\") == -1).map(x => {\r\n try {\r\n return new RegExp(x, \"g\");\r\n } catch (e) {\r\n return x;\r\n }\r\n });\r\n const testPass = blacklistTest.find(x => considerURL.match(x)) || fds.find(x => getFlight(x));\r\n if (testPass) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport React from \"react\";\r\n\r\nexport const flag = ;\r\nexport const plus = ;\r\nexport const thumbs_down = ;\r\nexport const thumbs_up = ;\r\nexport const comment = ;\r\nexport const chevron_down = ;\r\nexport const chevron_up = ;\r\nexport const ellipsis = ;\r\nexport const ellipsis2 = ;\r\nexport const ellipsis3 = ;\r\nexport const users = ;\r\nexport const users2 = ;\r\nexport const users3 = ;\r\nexport const user_following = ;\r\nexport const user_locked = ;\r\nexport const trash = ;\r\nexport const pen = ;\r\nexport const close = ;\r\nexport const settings = ;\r\nexport const chevron_right = ;\r\nexport const info_fill = ;\r\nexport const shield = ;\r\nexport const feedback = ;\r\nexport const tick = ;\r\nexport const send = ;\r\nexport const close2 = ;\r\nexport const cup = ;\r\nexport const activity = ;\r\nexport const arrow_reply = ;\r\nexport const exclamation = ;\r\nexport const exclamation_small = ;\r\nexport const exclamation_round = ;\r\nexport const emj_like = ;\r\nexport const emj_love = ;\r\nexport const emj_thinking = ;\r\nexport const emj_surprised = ;\r\nexport const emj_sad = ;\r\nexport const emj_angry = ;\r\nexport const open_outside = ;\r\nexport const posts = ;\r\nexport const check = ;\r\nexport const check_small = ;\r\nexport const typing_animation = ;\r\nexport const chevron_left = ;\r\nexport const like = ;\r\nexport const facebook = ;\r\nexport const twitter = ;\r\nexport const linkedin = ;\r\nexport const email = ;\r\nexport const publisherTabAll = ;\r\nexport const publisherTabPremium = ;\r\nexport const subscriptions = ;\r\nexport const renew = ;\r\nexport const arrow_down = ;\r\nexport const credit_card = ;\r\nexport const check_circled = ;\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { enums } from \"./enums\";\r\n\r\nexport function getReactionColorClass (reaction: string) {\r\n if (!reaction) { return \"\"; }\r\n return (reaction === enums.reactions.love || reaction === enums.reactions.angry) ?\r\n \"cwt-red-reaction\" : \"cwt-yellow-reaction\";\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport React from \"react\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nconst emojiSprite = \"data:image/png;base64,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\";\r\nconst maskPaths = {\r\n likeMaskImage: \"d=\\\"M2.7 28H28V0H1L.3 2.3l-.4 1v5.9l1.2.3c1.5.4 2.6.9 3.4 1.5.8.7 1.3 1.5 1.3 2.5a4.2 4.2 0 01-.4 1.7 1 1 0 000 .3c.6.8.9 1.6.8 2.5a2.3 2.3 0 01-1 1.8v.4c.3.7.3 1.4.1 2.1a3 3 0 01-1 1.7c-.5.3-.7.6-.7.9v.7c0 1-.4 1.9-1 2.4z\\\" fill=\\\"%23FFC700\\\"\",\r\n loveMaskImage: \"d=\\\"M0 23.2V28h28V0H0v.3a10.7 10.7 0 017.8 12.4 16 16 0 01-5.7 8.8L0 23.2z\\\" fill=\\\"%23FFC700\\\"\",\r\n circleMaskImage: \"d=\\\"M1.3 28H28V0H1.3l1.4 1.3C6.2 4.6 8 9.3 8 14a17.2 17.2 0 01-6.7 14z\\\" fill=\\\"%23FFC700\\\"\",\r\n likeMaskImageRTL: \"d=\\\"M28 13.4432V0H0V28H28V27.9606H24.6812C23.9528 27.9606 23.2572 27.5051 23.0133 26.7486C22.8826 26.3432 22.7714 25.9262 22.6904 25.4899C22.258 23.965 22.0436 22.36 22.0005 20.8064L22 20.7898L22.0004 20.7732C22.043 19.0186 22.171 17.2069 22.4727 15.4315L22.4786 15.397L22.6553 14.7781C22.8814 13.9867 23.5867 13.4432 24.3877 13.4432H28Z\\\" fill=\\\"%23FFC700\\\"\",\r\n loveMaskImageRTL: \"d=\\\"M28 0H0V28H28V24.0646C26.6312 23.0066 25.2744 21.9085 23.9784 20.7129L23.9768 20.7114C21.7049 18.6011 19.7588 15.9392 19.1724 12.7661L19.1717 12.7619C18.635 9.73528 19.3673 6.65994 21.221 4.15415L21.2256 4.14796C22.8656 1.9878 25.2984 0.558465 28 0.13032V0Z\\\" fill=\\\"%23FFC700\\\"\",\r\n circleMaskImageRTL: \"d=\\\"M26.6749 0H0V28H26.6429C26.1637 27.6039 25.7043 27.1811 25.2673 26.7327C21.8516 23.4034 19.9163 18.7723 20.0028 14C19.9163 9.22999 21.8499 4.5982 25.2673 1.31048C25.7146 0.845747 26.1846 0.408516 26.6749 0Z\\\" fill=\\\"%23FFC700\\\"\"\r\n};\r\n\r\nexport const getEmojiStylesByWidth = (width: number): object => {\r\n const styles = {\r\n \"background-image\": `url(\"${emojiSprite}\")`,\r\n width: `${width}px`,\r\n height: `${width*1.125}px`,\r\n \"background-size\": `${width*Object.keys(SocialReactions).length}px auto`,\r\n \"background-repeat\": \"no-repeat\"\r\n };\r\n Object.keys(SocialReactions).map((key, i)=> {\r\n styles[`&[data-type=\"${key}\"]`] = { \"background-position\": `-${width*i}px 0`};\r\n });\r\n return styles;\r\n};\r\n\r\nexport const getEmojiMask = (maskName: string, width: number): string => {\r\n return `url('data:image/svg+xml,%3Csvg width=\"${width}\" height=\"${width}\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"%3E%3Cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" ${maskPaths[maskName]} /%3E%3C/svg%3E')`;\r\n};\r\n\r\nexport function renderEmojiByType(reactionType: string, className?: string) {\r\n return
;\r\n}\r\n\r\nenum SocialReactions {\r\n like = \"like\",\r\n love = \"love\",\r\n surprised = \"surprised\",\r\n thinking = \"thinking\",\r\n sad = \"sad\",\r\n angry = \"angry\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryEventMap, dispatchTelemetryEvent, genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface SocialBarPanelTelemetryObjects {\r\n likeButton: TelemetryObjectBase;\r\n activeReactionButton: TelemetryObjectBase;\r\n reactionsCount: TelemetryObjectBase;\r\n commentsButton: TelemetryObjectBase;\r\n reactionsParent: TelemetryObjectBase;\r\n}\r\n\r\nexport const socialBarPanelTelemetryContracts = {\r\n reactionsParent: {\r\n name: \"Reaction\",\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n likeButton: {\r\n name: \"Like\",\r\n behavior: TelemetryBehaviorType.Like, // dynamically updated\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"Like\" // dynamically updated\r\n }\r\n },\r\n reactionsCount: {\r\n name: \"Reactions\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: TelemetryContentType.Comment,\r\n headline: \"Reactions\"\r\n }\r\n },\r\n commentsButton: {\r\n name: \"Comments\",\r\n behavior: TelemetryBehaviorType.Show,\r\n content: {\r\n type: TelemetryContentType.Article,\r\n headline: \"Comments\"\r\n }\r\n }\r\n};\r\n\r\nexport const socialBarPanelTelemetryActionDispatchers = {\r\n likeButtonClick: genericTelemetryClickDispatcher,\r\n commentsButtonClick: genericTelemetryClickDispatcher,\r\n likeButtonHover: (element: any, telemetryObject: any): void => {\r\n const behavior = TelemetryBehaviorType.Show;\r\n const telemetryEventDispatcherInfo = {\r\n ...TelemetryEventMap.genericHover,\r\n contract: {...(telemetryObject && telemetryObject.contract), behavior}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element);\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { enums, mouseHandlers } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport FocusLock from \"react-focus-lock\";\r\nimport { SocialPopoverHandledProps, SocialPopoverUnhandledProps } from \"./SocialPopover.props\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\n\r\ninterface SocialPopoverState {\r\n isHovered: boolean,\r\n delayCompleted: boolean\r\n}\r\n\r\nexport class SocialPopover extends Foundation {\r\n containerRef: React.RefObject;\r\n contentRef: React.RefObject;\r\n timeoutId: number;\r\n static hoverTriggeredPopover: SocialPopover; // only one hover triggered popover should be rendered, this will hold the only instance\r\n shouldMove: boolean;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isHovered: false,\r\n delayCompleted: false\r\n };\r\n\r\n this.containerRef = React.createRef();\r\n this.contentRef = React.createRef();\r\n this.onClickOutside = this.onClickOutside.bind(this);\r\n this.onLeaveTrigger = this.onLeaveTrigger.bind(this);\r\n this.escFunction = this.escFunction.bind(this);\r\n\r\n if (SocialPopover.hoverTriggeredPopover && SocialPopover.hoverTriggeredPopover != this) { SocialPopover.hoverTriggeredPopover.hide(); }\r\n if (this.props.isHover) { SocialPopover.hoverTriggeredPopover = this; }\r\n this.shouldMove = !this.props.disableAutoPosition;\r\n }\r\n\r\n escFunction(event) {\r\n if (event.keyCode === 27) {\r\n this.props.onHide();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n try {\r\n if (this.props.disablePopoverHideHandlers) { return; }\r\n\r\n this.movePopover();\r\n document.addEventListener(\"click\", this.onClickOutside);\r\n document.addEventListener(\"keydown\", this.escFunction);\r\n window.addEventListener(\"scroll\", this.props.onHide);\r\n\r\n if (this.props.isHover && this.props.triggerRef && this.props.triggerRef.current) {\r\n this.props.triggerRef.current.addEventListener(\"mouseleave\", this.onLeaveTrigger);\r\n\r\n if (this.props.hoverDelay) { this.timeoutId = window.setTimeout(() => this.setState({delayCompleted: true}), this.props.hoverDelay); }\r\n }\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n }\r\n componentDidUpdate () {\r\n this.movePopover();\r\n }\r\n componentWillUnmount() {\r\n window.clearTimeout(this.timeoutId);\r\n }\r\n\r\n onClickOutside(event) {\r\n try {\r\n const clickedIsNotTrigger = (this.props.triggerRef &&\r\n this.props.triggerRef.current &&\r\n !this.props.triggerRef.current.contains(event.target)) || !this.props.triggerRef;\r\n\r\n const clickedIsNotChild = this.containerRef &&\r\n this.containerRef.current &&\r\n !this.containerRef.current.contains(event.target);\r\n\r\n if (clickedIsNotChild && clickedIsNotTrigger) {\r\n this.hide();\r\n }\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n }\r\n\r\n onClickInside(e) {\r\n e.stopPropagation();\r\n }\r\n\r\n onLeaveTrigger() {\r\n this.hide();\r\n }\r\n\r\n hide() {\r\n if (this.timeoutId) { window.clearTimeout(this.timeoutId); }\r\n if (SocialPopover.hoverTriggeredPopover == this) { SocialPopover.hoverTriggeredPopover = null; }\r\n\r\n if (this.props.isHover && !this.props.hoverDelay) {\r\n window.setTimeout(() => {\r\n try {\r\n if (!mouseHandlers.isElementHover(this.props.triggerRef.current) &&\r\n !mouseHandlers.isElementHover(this.containerRef.current)) {\r\n this.props.triggerRef.current.removeEventListener(\"mouseleave\", this.onLeaveTrigger);\r\n this.props.onHide();\r\n }\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n }, 200);\r\n } else {\r\n this.props.onHide();\r\n }\r\n }\r\n\r\n movePopover() {\r\n if (!this.shouldMove || !this.contentRef || !this.contentRef.current) { return; }\r\n this.shouldMove = false;\r\n const {marginTop, marginBottom} = this.props;\r\n const popoverRect = (this.contentRef.current.firstChild as HTMLElement).getBoundingClientRect();\r\n const leftDiff = popoverRect.left;\r\n const rightDiff = popoverRect.right - document.documentElement.clientWidth;\r\n const topDiff = popoverRect.top;\r\n const botDiff = popoverRect.bottom - document.documentElement.clientHeight;\r\n if (topDiff<0 || botDiff>0 || leftDiff<0 || rightDiff>0) {\r\n const translateY = (topDiff < 0 ? topDiff-(marginTop || 10) : 0) + (botDiff > 0 ? botDiff+(marginBottom || 10) : 0);\r\n const translateX = (leftDiff < 0 ? leftDiff: 0) + (rightDiff > 0 ? rightDiff: 0);\r\n this.contentRef.current.style.transform = `translateX(${-translateX}px) translateY(${-translateY}px)`;\r\n }\r\n this.contentRef.current.classList.add(\"visible\");\r\n this.props.onMoved && this.props.onMoved();\r\n }\r\n\r\n render() {\r\n if (this.props.hoverDelay && (!this.state.delayCompleted && this.props.isHover)) { return null; }\r\n const { visible, children, isHover, managedClasses, hideOnMobile, responsiveClass, className, style, hasFocusLock } = this.props;\r\n const shouldHideMobile = hideOnMobile && responsiveClass && responsiveClass.includes(enums.responsiveLevels.MobilePopup);\r\n if (shouldHideMobile) { this.props.onHide(); }\r\n\r\n let content;\r\n const innerContent =
\r\n \r\n {children}\r\n
\r\n ;\r\n\r\n if (hasFocusLock) {\r\n content = \r\n {innerContent}\r\n ;\r\n } else {\r\n content = \r\n {innerContent}\r\n ;\r\n }\r\n\r\n return (\r\n visible && !shouldHideMobile ? content : \"\"\r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const SocialPopoverStyles = (config: DesignSystem) => ({\r\n popoverContainer: {\r\n display: \"inline\",\r\n position: \"relative\",\r\n\r\n \"& .cwt-popover-overlay\": {\r\n position: \"absolute\",\r\n \"z-index\": \"-1\",\r\n background: \"transparent\",\r\n width: \"calc(100% + 8px)\",\r\n height: \"calc(100% + 8px)\",\r\n top: \"-4px\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"-4px\"\r\n },\r\n\r\n \"& .cwt-popover-content\": {\r\n position: \"absolute\",\r\n \"z-index\": \"99999999999\",\r\n opacity: \"0\",\r\n \"&.visible\": {\r\n opacity: \"1\"\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialPopoverHandledProps as BaseSocialPopoverHandledProps,\r\n SocialPopoverProps as BaseSocialPopoverProps,\r\n SocialPopoverManagedClasses,\r\n SocialPopoverUnhandledProps\r\n} from \"./SocialPopover.props\";\r\nimport { SocialPopover as BaseSocialPopover } from \"./SocialPopover\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialPopoverClassNameContract } from \"./SocialPopover.classnames\";\r\nimport { SocialPopoverStyles } from \"./SocialPopover.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\nconst SocialPopover = manageJss(SocialPopoverStyles)(BaseSocialPopover);\r\ntype SocialPopover = InstanceType;\r\n\r\ntype SocialPopoverHandledProps = Subtract;\r\n\r\ntype SocialPopoverProps = ManagedJSSProps;\r\n\r\nexport {\r\n SocialPopover,\r\n SocialPopoverProps,\r\n SocialPopoverHandledProps,\r\n SocialPopoverUnhandledProps,\r\n SocialPopoverClassNameContract\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { enums, renderEmojiByType } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialPopover } from \"@msnews/social-popover\";\r\nimport { SocialMiniReactionBreakdownHandledProps, SocialMiniReactionBreakdownUnhandledProps } from \"./SocialMiniReactionBreakdown.props\";\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\n\r\nexport class SocialMiniReactionBreakdown extends Foundation {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
\r\n {Object.keys(enums.reactionIconMap).filter(key => this.props.counts[key] > 0).map(key =>\r\n \r\n {renderEmojiByType(key)}\r\n {this.props.counts[key]}\r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nexport const SocialMiniReactionBreakdownStyles = (config: DesignSystem) => ({\r\n miniReactionBreakdownContainer: {\r\n \"pointer-events\": \"none\",\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"center\",\r\n padding: \"6px 8px\",\r\n background: neutralLayerCard,\r\n \"border-radius\": \"32px\",\r\n \"-webkit-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"-moz-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& i.cwt-icon.cwt-count-icons\": {\r\n display: \"flex\",\r\n margin: \"0 0 !important\",\r\n padding: \"2px 2px !important\",\r\n \"font-size\": \"18px\",\r\n color: neutralForegroundRest,\r\n\r\n \"&:last-child\": {\r\n \"margin-bottom\": \"0 !important\"\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"14px\",\r\n \"font-weight\": \"normal\"\r\n }\r\n }\r\n },\r\n\r\n miniReactionBreakdownPopover: {\r\n top: \"-48px\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"-50%\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialMiniReactionBreakdownHandledProps as BaseSocialMiniReactionBreakdownHandledProps,\r\n SocialMiniReactionBreakdownProps as BaseSocialMiniReactionBreakdownProps,\r\n SocialMiniReactionBreakdownManagedClasses,\r\n SocialMiniReactionBreakdownUnhandledProps\r\n} from \"./SocialMiniReactionBreakdown.props\";\r\nimport { SocialMiniReactionBreakdown as BaseSocialMiniReactionBreakdown } from \"./SocialMiniReactionBreakdown\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialMiniReactionBreakdownClassNameContract } from \"./SocialMiniReactionBreakdown.classnames\";\r\nimport { SocialMiniReactionBreakdownStyles } from \"./SocialMiniReactionBreakdown.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\nconst SocialMiniReactionBreakdown = manageJss(SocialMiniReactionBreakdownStyles)(BaseSocialMiniReactionBreakdown);\r\ntype SocialMiniReactionBreakdown = InstanceType;\r\n\r\ntype SocialMiniReactionBreakdownHandledProps = Subtract;\r\n\r\ntype SocialMiniReactionBreakdownProps = ManagedJSSProps;\r\n\r\nexport {\r\n SocialMiniReactionBreakdown,\r\n SocialMiniReactionBreakdownProps,\r\n SocialMiniReactionBreakdownHandledProps,\r\n SocialMiniReactionBreakdownUnhandledProps,\r\n SocialMiniReactionBreakdownClassNameContract\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { chevron_down, enums, hasThemeBase, renderEmojiByType, renderHybrid } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialMiniReactionBreakdown } from \"@msnews/social-mini-reaction-breakdown\";\r\nimport { SocialMostReactionsHandledProps, SocialMostReactionsUnhandledProps } from \"./SocialMostReactions.props\";\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\n\r\ninterface SocialMostReactionsState {\r\n miniReactionBreakdownVisible: boolean;\r\n isHoverMiniReactionBreakdown: boolean;\r\n}\r\n\r\nconst maskClassMap = {\r\n [enums.reactions.angry]: \"circleMask\",\r\n [enums.reactions.like]: \"likeMask\",\r\n [enums.reactions.love]: \"loveMask\",\r\n [enums.reactions.sad]: \"circleMask\",\r\n [enums.reactions.surprised]: \"circleMask\",\r\n [enums.reactions.thinking]: \"circleMask\"\r\n};\r\nexport class SocialMostReactions extends Foundation {\r\n isHoverHandlersAttached = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n miniReactionBreakdownVisible: false,\r\n isHoverMiniReactionBreakdown: false\r\n };\r\n\r\n }\r\n\r\n render() {\r\n const { containerClassName, t, managedClasses, theme, hideLabel, customLabel, telemetryObject, reactionCounts, onReactionsClick, hasSeperatorBefore, hasSeperatorAfter, responsiveClass} = this.props;\r\n const { miniReactionBreakdownVisible } = this.state;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n\r\n // Reaction Counts\r\n let totalReactionCount = 0;\r\n let mostReactionKeys = [];\r\n if (reactionCounts) {\r\n totalReactionCount = Object.values(reactionCounts as number).reduce(($sum, $count) => $sum + $count, 0);\r\n mostReactionKeys = Object.keys(reactionCounts)\r\n .sort(($0, $1) => reactionCounts[$1] - reactionCounts[$0])\r\n .filter($ => reactionCounts[$] > 0)\r\n .slice(0, 3);\r\n }\r\n\r\n return totalReactionCount > 0 && (\r\n \r\n {miniReactionBreakdownVisible && (\r\n this.setState({ miniReactionBreakdownVisible: false })}\r\n isHover={this.state.isHoverMiniReactionBreakdown}\r\n managedClasses={managedClasses}\r\n responsiveClass={responsiveClass}\r\n />\r\n )}\r\n\r\n { hasSeperatorBefore && |}\r\n\r\n onReactionsClick(e)}\r\n aria-haspopup=\"true\"\r\n ref={instance => !(telemetryObject) && this.setReference(instance)}\r\n {...(telemetryObject ? renderHybrid(telemetryObject && telemetryObject, false, (el) => this.setReference(el)) : {})}\r\n >\r\n \r\n {mostReactionKeys.map((key, index) => (\r\n \r\n {renderEmojiByType(key, index > 0 && managedClasses[maskClassMap[mostReactionKeys[index-1]]])}\r\n \r\n ))}\r\n {!hideLabel && {customLabel || totalReactionCount}}\r\n \r\n \r\n\r\n { hasSeperatorAfter && |}\r\n\r\n { !isSuperApp &&\r\n {\r\n this.setState({\r\n miniReactionBreakdownVisible: false,\r\n isHoverMiniReactionBreakdown: false\r\n });\r\n }}\r\n onClick={() =>\r\n this.setState({\r\n miniReactionBreakdownVisible: !this.state.miniReactionBreakdownVisible,\r\n isHoverMiniReactionBreakdown: false\r\n })\r\n }>\r\n {chevron_down}\r\n \r\n }\r\n \r\n );\r\n }\r\n\r\n setReference(element) {\r\n if (!element) { return; }\r\n\r\n // forward ref\r\n this.props.setReactionsCountRef && this.props.setReactionsCountRef(element);\r\n\r\n // attach hover handlers\r\n !this.isHoverHandlersAttached && this.attachHoverHandlers(element);\r\n }\r\n\r\n attachHoverHandlers(element) {\r\n if (this.isHoverHandlersAttached) { return; }\r\n\r\n this.isHoverHandlersAttached = true;\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n if (!isSuperApp) {\r\n element.addEventListener(\"mouseenter\", () => {\r\n this.setState({\r\n miniReactionBreakdownVisible: true,\r\n isHoverMiniReactionBreakdown: true\r\n });\r\n });\r\n element.addEventListener(\"mouseleave\", () => {\r\n this.setState({\r\n miniReactionBreakdownVisible: false,\r\n isHoverMiniReactionBreakdown: false\r\n });\r\n });\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { HighContrastColor, highContrastSelector } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const primaryDarkerColor = \"#005CA4\"; // darken(accentFillRest, 10%)\r\nexport const primaryFocusColor = \"#3EAAFF\"; // lighten(accentFillRest, 20%)\r\nexport const dangerColor = \"#dc3545\";\r\nexport const dangerFocusColor = \"#BA0C1B\";\r\nexport const profileHrColor = \"rgba(143, 158, 205, 0.2)\";\r\nexport const secondaryBorderColor = \"#BEBEBE\";\r\n\r\n/* Text-Color */\r\nexport const midDarkerTextColor = \"#4F4F4F\";\r\nexport const darkTextColor = \"rgba(0, 0, 0, 0.83)\";\r\nexport const primaryTextColor= \"#0067B8\";\r\nexport const secondaryTextColor= \"#5E5E5E\";\r\nexport const placeholderColor = \"#949494\";\r\n\r\n/* Background Colors*/\r\nexport const darkerBgColor = \"#cccccc\"; // darken(lightBgColor,20%)\r\n\r\n/* Component Based */\r\n\r\n/* Shadow */\r\nexport const mainBoxShadow= \"0px 4px 10px rgba(0, 0, 0, 0.12)\"; // rgba(0, 0, 0, 0.12)\r\n\r\n/* FONT */\r\nexport const mainFontSize = \"16px\";\r\nexport const mainLineHeight = \"22px\";\r\n\r\n/* AVATAR */\r\nexport const avatarSize = \"40px\";\r\n\r\n/* PROFILE */\r\nexport const profileSidePadding = \"40px\";\r\nexport const profileAvatarSize = \"64px\";\r\n\r\n/* OTHER */\r\nexport const avatarPadding = \"51px\"; // calc(1.1rem + @avatar-size);\r\nexport const commentVPadding = \"20px\";\r\nexport const fontFamily = '\"Segoe UI\", \"Segoe WP\", -apple-system, BlinkMacSystemFont, Roboto, \"Helvetica Neue\", Arial, Sans-Serif';\r\n\r\n/* RESET STYLES */\r\nexport const reset = {\r\n margin: \"0\",\r\n padding: \"0\",\r\n border: \"0\",\r\n \"vertical-align\": \"baseline\",\r\n \"list-style\": \"none\",\r\n\r\n \"& *:not([class]),h1,h2,h3,h4,h5,h6\": {\r\n margin: \"0\",\r\n padding: \"0\",\r\n border: \"0\",\r\n \"vertical-align\": \"baseline\",\r\n \"list-style\": \"none\"\r\n },\r\n\r\n \"& ul, li\": {\r\n \"list-style\": \"none\"\r\n }\r\n};\r\n\r\n/* HIGH CONTRAST */\r\n\r\nexport const highContrastButton = {\r\n [highContrastSelector]: {\r\n background: HighContrastColor.selectedBackground,\r\n transition: \"none\",\r\n \"& *, &:focus *, &:hover *\": {\r\n fill: HighContrastColor.selectedText\r\n }\r\n }\r\n};\r\n\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialMostReactionsHandledProps as BaseSocialMostReactionsHandledProps,\r\n SocialMostReactionsProps as BaseSocialMostReactionsProps,\r\n SocialMostReactionsManagedClasses,\r\n SocialMostReactionsUnhandledProps\r\n} from \"./SocialMostReactions.props\";\r\nimport { SocialMostReactions as BaseSocialMostReactions } from \"./SocialMostReactions\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialMostReactionsClassNameContract } from \"./SocialMostReactions.classnames\";\r\nimport { SocialMostReactionsStyles } from \"./SocialMostReactions.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\nconst SocialMostReactions = manageJss(SocialMostReactionsStyles)(BaseSocialMostReactions);\r\ntype SocialMostReactions = InstanceType;\r\n\r\ntype SocialMostReactionsHandledProps = Subtract;\r\n\r\ntype SocialMostReactionsProps = ManagedJSSProps;\r\n\r\nexport {\r\n SocialMostReactions,\r\n SocialMostReactionsProps,\r\n SocialMostReactionsHandledProps,\r\n SocialMostReactionsUnhandledProps,\r\n SocialMostReactionsClassNameContract\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundHint } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { fontFamily, getEmojiMask, getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nconst emojiSize = 16;\r\n\r\nexport const SocialMostReactionsStyles = (config: DesignSystem) => ({\r\n mostReactionsContainer: {\r\n \"font-family\": fontFamily,\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"min-height\": \"20px\",\r\n background: \"none\",\r\n padding: \"0\",\r\n overflow: \"visible\",\r\n position: \"relative\",\r\n height: \"auto\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"&:hover:enabled\": {\r\n background: \"none\"\r\n },\r\n\r\n \"& .cwt-icon\": {\r\n padding: \"0 4px\",\r\n \"font-size\": `${emojiSize}px !important`,\r\n \"align-items\": \"flex-start\",\r\n\r\n \"& .cwt-icon-label\": {\r\n padding: \"0\",\r\n margin: \"1px 0 0\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"3px\",\r\n \"font-size\": \"13px\",\r\n \"line-height\": \"1\"\r\n },\r\n\r\n \"& .emoji-icon\": {\r\n \"&:last-child\": {\r\n },\r\n\r\n \"&:nth-child(1)\": {\r\n \"z-index\": 2\r\n },\r\n \"&:nth-child(2)\": {\r\n \"z-index\": 1\r\n },\r\n \"&:nth-child(3)\": {\r\n \"z-index\": 0\r\n }\r\n }\r\n }\r\n },\r\n seperatorV: {\r\n \"font-size\": \"11px\",\r\n \"font-weight\": \"100\",\r\n color: neutralForegroundHint,\r\n margin: applyLocalizedProperty(\"-5px 12px 0 -2px\", \"-5px -2px 0 12px\", config.direction),\r\n opacity: \".55\"\r\n },\r\n likeMask: {\r\n \"-webkit-mask-image\": `${getEmojiMask([applyLocalizedProperty(\"likeMaskImage\", \"likeMaskImageRTL\", config.direction)].join(), emojiSize)}`,\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-3px\"\r\n },\r\n loveMask: {\r\n \"-webkit-mask-image\": `${getEmojiMask([applyLocalizedProperty(\"loveMaskImage\", \"loveMaskImageRTL\", config.direction)].join(), emojiSize)}`,\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-3px\"\r\n },\r\n circleMask: {\r\n \"-webkit-mask-image\": `${getEmojiMask([applyLocalizedProperty(\"circleMaskImage\", \"circleMaskImageRTL\", config.direction)].join(), emojiSize)}`,\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-3px\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryObjectBase, TelemetryType } from \"@msnews/telemetry-contracts\";\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface ReactionMenuTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n emojis: TelemetryObjectBase[];\r\n}\r\n\r\nexport const reactionMenuTelemetryContracts = {\r\n container: { // ContentReaction>Scenario 2b impr\r\n name: \"ReactionsPopup\"\r\n },\r\n emojis: { // ContentReaction>Scenario 2c & CommentReactions Scenario 2x\r\n type: TelemetryType.ActionButton\r\n }\r\n};\r\n\r\nexport const reactionMenuTelemetryActionDispatchers = {\r\n emojiClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport { ReactionMenuTelemetryObjects, reactionMenuTelemetryActionDispatchers, reactionMenuTelemetryContracts } from \"./ReactionMenu.telemetry\";\r\nimport { ReactionToBehaviorTypeMap, TelemetryEventMap, addOrUpdateTelemetryObject, dispatchTelemetryEvent, getHeadlineByReactionType, getPageContentType, renderHybrid } from \"@msnews/social-utils\";\r\nimport { enums, renderEmojiByType } from \"@msnews/social-utils\";\r\n\r\nimport React from \"react\";\r\nimport { ReactionMenuTouchSlideHandler } from \"@msnews/social-interaction-helpers\";\r\nimport { SocialBarLocalizedStrings } from \"../../SocialBar.localizedStrings\";\r\nimport { SocialBarClassNameContract } from \"../../SocialBar.classnames\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nexport interface ReactionMenuProps extends SocialPopoverProps {\r\n onReaction: (key: string) => void;\r\n onShow?: (target: any, isHover: boolean) => void;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n t: SocialBarLocalizedStrings;\r\n rating?: string;\r\n triggerElements?: Array;\r\n visible?: boolean;\r\n managedClasses?: SocialBarClassNameContract;\r\n}\r\nexport default class ReactionMenu extends React.Component {\r\n public static lastHiddenTime = 1;\r\n public static touchEnabled = false;\r\n\r\n telemetryObjects: ReactionMenuTelemetryObjects;\r\n containerRef: HTMLDivElement;\r\n triggerRef: HTMLElement;\r\n touchSlideHandler: ReactionMenuTouchSlideHandler;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n this.triggerHoverHandler = this.triggerHoverHandler.bind(this);\r\n this.triggerTouchStartHandler = this.triggerTouchStartHandler.bind(this);\r\n this.triggerClickHandler = this.triggerClickHandler.bind(this);\r\n this.touchSlideHandler = new ReactionMenuTouchSlideHandler({\r\n onSlideStart: (target) => {\r\n ReactionMenu.touchEnabled = true;\r\n this.props.onShow && this.props.onShow(target, true);\r\n },\r\n onSlideEnd: () => this.hide(),\r\n onLongpress: (target) => {\r\n ReactionMenu.touchEnabled = true;\r\n this.props.onShow && this.props.onShow(target, true);\r\n },\r\n onLongpressEnd: () => this.hide(),\r\n onTouchEnd: () => { ReactionMenu.touchEnabled = false; }\r\n },\r\n {\r\n onEmojiFocus: (el: HTMLElement) => el.classList.add(\"touchFocused\"),\r\n onEmojiBlur: (el: HTMLElement) => el.classList.remove(\"touchFocused\")\r\n }, \".cwt-link.cwt-icon\");\r\n }\r\n\r\n componentDidMount() {\r\n if (this.containerRef) {\r\n dispatchTelemetryEvent({...TelemetryEventMap.genericLoaded, sendPeregrine: true}, this.containerRef);\r\n }\r\n\r\n this.registerHandlers(this.props.triggerElements);\r\n }\r\n\r\n componentDidUpdate(nextProps: ReactionMenuProps) {\r\n this.registerHandlers(this.props.triggerElements);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.touchSlideHandler.dispose();\r\n this.unregisterHandlers(this.props.triggerElements);\r\n }\r\n\r\n render() {\r\n if (!this.props.visible || (this.props.isHover && !this.triggerRef)) { return null; }\r\n const {t, isHover, managedClasses} = this.props;\r\n\r\n this.generateOrUpdateTelemetryObjects();\r\n\r\n return (\r\n \r\n
{ this.containerRef = el; })}>\r\n {enums.reactionOrder.map((key) =>\r\n this.reactionClickHandler(e.currentTarget, key)}\r\n data-title={t[`EmojiLabel${key}`]}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.emojis && this.telemetryObjects.emojis[key], false)}\r\n >\r\n {renderEmojiByType(key)}\r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n\r\n // :: ReactionMenu specific methods\r\n reactionClickHandler(target, key) {\r\n if (!this.props.visible) { return; }\r\n\r\n reactionMenuTelemetryActionDispatchers.emojiClick(target, this.telemetryObjects && this.telemetryObjects.emojis[key]);\r\n this.props.onReaction(key);\r\n this.hide();\r\n }\r\n hide() {\r\n ReactionMenu.lastHiddenTime = (new Date()).getTime();\r\n this.props && this.props.onHide && setTimeout(() => { this.props.onHide(); }, 10);\r\n }\r\n\r\n // :: Trigger element handlers\r\n triggerHoverHandler(e) {\r\n this.triggerRef = e.currentTarget;\r\n this.setState({});\r\n\r\n if ((new Date()).getTime() - ReactionMenu.lastHiddenTime < 225) { return; }\r\n this.props && this.props.onShow && this.props.onShow(e.currentTarget, true);\r\n }\r\n triggerTouchStartHandler(e) {\r\n this.triggerRef = e.currentTarget;\r\n this.setState({});\r\n this.touchSlideHandler.setupTriggerAtTouchStart(e);\r\n }\r\n triggerClickHandler(e) {\r\n !ReactionMenu.touchEnabled && this.hide();\r\n }\r\n\r\n // :: Event attachers to trigger element\r\n registerHandlers(triggerRefs: Array) {\r\n this.containerRef && this.touchSlideHandler.setReactionMenuContainer(this.containerRef);\r\n\r\n setTimeout(() => {\r\n triggerRefs && triggerRefs.map(ref => {\r\n if (!ref || ref.getAttribute(\"data-trigger-reqistered\")) { return; }\r\n ref.setAttribute(\"data-trigger-reqistered\", \"1\");\r\n ref.addEventListener(\"mouseenter\", this.triggerHoverHandler);\r\n ref.addEventListener(\"click\", this.triggerClickHandler);\r\n ref.addEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n });\r\n }, 10);\r\n }\r\n unregisterHandlers(triggerRefs: Array) {\r\n this.touchSlideHandler.dispose();\r\n\r\n triggerRefs && triggerRefs.map(ref => {\r\n if (!ref || !ref.getAttribute(\"data-trigger-reqistered\")) { return; }\r\n ref.removeAttribute(\"data-trigger-reqistered\");\r\n ref.removeEventListener(\"mouseenter\", this.triggerHoverHandler);\r\n ref.removeEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n });\r\n }\r\n\r\n generateOrUpdateTelemetryObjects() {\r\n const { mainTelemetryObject, rating } = this.props;\r\n\r\n if (mainTelemetryObject) {\r\n const id = mainTelemetryObject.contract.content.id;\r\n const type = mainTelemetryObject.contract.content.type? mainTelemetryObject.contract.content.type : getPageContentType();\r\n\r\n this.telemetryObjects = {\r\n container: addOrUpdateTelemetryObject(mainTelemetryObject, {...reactionMenuTelemetryContracts.container}, { id, type }, this.telemetryObjects && this.telemetryObjects.container),\r\n emojis: []\r\n };\r\n\r\n enums.reactionOrder.map((key) => {\r\n const headline = getHeadlineByReactionType(key, key == rating);\r\n const behavior = ReactionToBehaviorTypeMap[key];\r\n this.telemetryObjects.emojis[key] = addOrUpdateTelemetryObject(mainTelemetryObject, {...reactionMenuTelemetryContracts.emojis, name: headline, behavior}, { id, type, headline }, this.telemetryObjects && this.telemetryObjects.emojis && this.telemetryObjects.emojis[key]);\r\n });\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, chevron_down, comment, enums, getReactionColorClass, renderEmojiByType, thumbs_up } from \"@msnews/social-utils\";\r\nimport { ReactionToBehaviorTypeMap, addOrUpdateTelemetryObject, getHeadlineByReactionType, renderHybrid } from \"@msnews/social-utils\";\r\nimport { SocialBarPanelTelemetryObjects, socialBarPanelTelemetryActionDispatchers, socialBarPanelTelemetryContracts } from \"./SocialBarPanel.telemetry\";\r\n\r\nimport { SocialMostReactions } from \"@msnews/social-most-reactions\";\r\nimport React from \"react\";\r\nimport ReactionMenu from \"../reaction-menu/ReactionMenu\";\r\nimport { SocialBarClassNameContract } from \"../../SocialBar.classnames\";\r\nimport { SocialBarLocalizedStrings } from \"../../SocialBar.localizedStrings\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nexport interface SocialBarPanelProps {\r\n managedClasses?: SocialBarClassNameContract;\r\n rating: string;\r\n onReaction: (type: string) => void;\r\n t: SocialBarLocalizedStrings;\r\n replyLabel?: JSX.Element;\r\n onCommentsClick: (target: HTMLElement) => void;\r\n onReactionsClick: (e: any, ref: HTMLElement) => void;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n showCommentsButton?: boolean;\r\n reactionMenuClassName?: string;\r\n responsiveClass?: string;\r\n reactionCounts?: number;\r\n label: string;\r\n theme?: string;\r\n reactionsDisabled?: boolean;\r\n}\r\n\r\ninterface SocialBarPanelState {\r\n reactionMenuVisible: boolean;\r\n isHoverSocialBarPanel: boolean;\r\n miniReactionBreakdownVisible: boolean;\r\n isHoverMiniReactionBreakdown: boolean;\r\n\r\n}\r\n\r\nexport default class SocialBarPanel extends React.Component {\r\n containerRef: React.RefObject;\r\n focusBackRef: HTMLElement;\r\n telemetryObjects: SocialBarPanelTelemetryObjects;\r\n reactionMenuTriggerRefs: Array;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n reactionMenuVisible: false,\r\n miniReactionBreakdownVisible: false,\r\n isHoverMiniReactionBreakdown: false,\r\n isHoverSocialBarPanel: true\r\n };\r\n\r\n this.containerRef = React.createRef();\r\n this.focusBackRef = null;\r\n this.reactionMenuTriggerRefs = [];\r\n }\r\n\r\n componentDidUpdate() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n onLikeBtnClick(e, telemetryObject) {\r\n // Right Click Detection\r\n if (\"which\" in e && e.which == 3) { return; } else if (\"button\" in e && e.button == 2) { return; }\r\n\r\n const currentRating = this.props.rating || enums.reactions.like;\r\n this.props.onReaction(currentRating);\r\n\r\n this.setState({ reactionMenuVisible: false });\r\n socialBarPanelTelemetryActionDispatchers.likeButtonClick(e.currentTarget, telemetryObject);\r\n }\r\n\r\n onReactionMenuShow(target, isHover) {\r\n this.setState({ reactionMenuVisible: true, isHoverSocialBarPanel: isHover });\r\n socialBarPanelTelemetryActionDispatchers.likeButtonHover(target, this.telemetryObjects.likeButton);\r\n }\r\n\r\n onReactionMenuHide() {\r\n this.setState({reactionMenuVisible: false, isHoverSocialBarPanel: true});\r\n }\r\n\r\n reactionHandler(type) {\r\n this.props.onReaction(type);\r\n }\r\n\r\n onReactionsClick(e, ref, telemetryObject) {\r\n socialBarPanelTelemetryActionDispatchers.likeButtonClick(e.currentTarget, telemetryObject);\r\n this.setState({miniReactionBreakdownVisible: false, isHoverMiniReactionBreakdown: false});\r\n this.props.onReactionsClick(e, ref);\r\n }\r\n\r\n onReplyClick(e, telemetryObject) {\r\n document.dispatchEvent(new CustomEvent(\"cwt-comments-clicked\"));\r\n socialBarPanelTelemetryActionDispatchers.commentsButtonClick(e.currentTarget, telemetryObject);\r\n this.props.onCommentsClick(e.currentTarget);\r\n }\r\n\r\n render() {\r\n const {t, rating, replyLabel, managedClasses, showCommentsButton, reactionMenuClassName, responsiveClass, reactionCounts, label, mainTelemetryObject, theme, reactionsDisabled} = this.props;\r\n const {reactionMenuVisible, isHoverSocialBarPanel} = this.state;\r\n\r\n this.generateOrUpdateTelemetryObjects();\r\n\r\n return (\r\n \r\n { !reactionsDisabled &&\r\n \r\n { this.reactionMenuTriggerRefs.length > 0 &&\r\n this.onReactionMenuHide()}\r\n onShow={(target, isHover) => this.onReactionMenuShow(target, isHover)}\r\n isHover={isHoverSocialBarPanel}\r\n triggerElements={ this.reactionMenuTriggerRefs}\r\n {...{managedClasses, mainTelemetryObject, t, rating, responsiveClass}}\r\n />\r\n }\r\n !ReactionMenu.touchEnabled && this.onLikeBtnClick(e, this.telemetryObjects && this.telemetryObjects.likeButton)}\r\n data-has-over={reactionMenuVisible}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.likeButton, false, el => this.reactionMenuTriggerRefs[0] = el)}\r\n >\r\n {thumbs_up}\r\n {t.EmojiLabellike}\r\n \r\n !ReactionMenu.touchEnabled && this.onLikeBtnClick(e, this.telemetryObjects && this.telemetryObjects.activeReactionButton)}\r\n data-has-over={reactionMenuVisible}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.activeReactionButton, false, el => this.reactionMenuTriggerRefs[1] = el)}\r\n >\r\n {renderEmojiByType(rating)}\r\n {(rating ? t[`EmojiLabel${rating}`] : \"\")}\r\n \r\n this.setState({reactionMenuVisible: true, isHoverSocialBarPanel: false})}> {chevron_down} \r\n \r\n }\r\n\r\n {showCommentsButton &&\r\n this.onReplyClick(e, this.telemetryObjects && this.telemetryObjects.commentsButton)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.commentsButton, false)}\r\n >\r\n {comment}\r\n {replyLabel || t.CommentReplyBtn}\r\n \r\n }\r\n\r\n { !reactionsDisabled && this.onReactionsClick(e, this.focusBackRef, this.telemetryObjects && this.telemetryObjects.reactionsCount)}\r\n hasSeperatorBefore={true}\r\n telemetryObject={this.telemetryObjects && this.telemetryObjects.reactionsCount}\r\n customLabel={label}\r\n {...{ reactionCounts, t, managedClasses, theme, responsiveClass}}\r\n /> }\r\n \r\n );\r\n }\r\n\r\n generateOrUpdateTelemetryObjects() {\r\n const { mainTelemetryObject, rating } = this.props;\r\n\r\n if (mainTelemetryObject) {\r\n const id = mainTelemetryObject.contract.content.id;\r\n const headline = (rating && getHeadlineByReactionType(rating, true));\r\n const behavior = (rating && ReactionToBehaviorTypeMap[rating]);\r\n const reactionsParentTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, {...socialBarPanelTelemetryContracts.reactionsParent}, { id }, this.telemetryObjects && this.telemetryObjects.reactionsParent);\r\n\r\n this.telemetryObjects = {\r\n reactionsCount: addOrUpdateTelemetryObject(mainTelemetryObject, {...socialBarPanelTelemetryContracts.reactionsCount}, { id }, this.telemetryObjects && this.telemetryObjects.reactionsCount),\r\n reactionsParent: reactionsParentTelemetryObject,\r\n likeButton: addOrUpdateTelemetryObject(reactionsParentTelemetryObject, {...socialBarPanelTelemetryContracts.likeButton}, { id }, this.telemetryObjects && this.telemetryObjects.likeButton),\r\n activeReactionButton: !rating && this.telemetryObjects ? this.telemetryObjects.activeReactionButton : addOrUpdateTelemetryObject(reactionsParentTelemetryObject, {...socialBarPanelTelemetryContracts.likeButton, name: headline, behavior}, { id, headline }, this.telemetryObjects && this.telemetryObjects.activeReactionButton),\r\n commentsButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...socialBarPanelTelemetryContracts.commentsButton}, { id }, this.telemetryObjects && this.telemetryObjects.commentsButton)\r\n };\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface ContentSocialBarTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n reactionBreakdown: TelemetryObjectBase;\r\n}\r\n\r\nexport const contentSocialBarTelemetryContracts = {\r\n container: {\r\n name: \"ContentSocialBar\",\r\n type: getPageContentType()\r\n },\r\n reactionBreakdown: {\r\n type: getPageContentType()\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { getContextData } from \"@msnews/core\";\r\nimport { Content } from \"@msnews/social-data-service\";\r\nimport { BridgeEventNames, dispatchBridgeEvent, enums, getFlight, hasThemeBase, isComponentDisabled, isValidURL, selectContentId, addOrUpdateTelemetryObject } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport SocialBarPanel from \"../common/social-bar-panel/SocialBarPanel\";\r\nimport { SocialBarProps } from \"../SocialBar.props\";\r\nimport { SocialBarState } from \"../SocialBar.state\";\r\nimport { contentSocialBarTelemetryContracts, ContentSocialBarTelemetryObjects } from \"./ContentSocialBar.telemetry\";\r\n\r\ninterface ContentSocialBarState {\r\n loaded: boolean;\r\n}\r\n\r\nexport interface ContentSocialBarProps extends SocialBarProps {\r\n content?: Content;\r\n}\r\n\r\nconst mapStateToProps = function (state: SocialBarState, props: SocialBarProps) {\r\n const contentId = selectContentId(state.contentIds, props.id, props.market);\r\n return {\r\n content: state.contents && state.contents[contentId]\r\n };\r\n};\r\n\r\nexport class ContentSocialBar extends React.Component {\r\n containerRef: React.RefObject;\r\n telemetryObjects: ContentSocialBarTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n loaded: false\r\n };\r\n this.containerRef = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n this.props.socialBarConnector?.onSocialBarComponentConnected({ id: this.props.id, market: this.props.market });\r\n this.disableSuperAppBodyScrollbar();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (this.props.id != null && this.props.market != null && prevProps.id != this.props.id || prevProps.market != this.props.market) {\r\n this.props.socialBarConnector?.onSocialBarComponentConnected({ id: this.props.id, market: this.props.market });\r\n }\r\n\r\n if (!prevProps.content && this.props.content) {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n }\r\n\r\n render() {\r\n const { t, managedClasses, users, responsiveClass, mainTelemetryObject, id, content, theme } = this.props;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n if (!content) { return null; }\r\n const { commentStatus, reactionCounts, totalCommentCount, rating, friendRatings, commentWhiteListSegments, commentBlackListSegments, reactionAllowListSegments, reactionBlockListSegments, url } = content;\r\n\r\n const locationHref = getContextData(this.props.requestContext.data.locationHref, \"locationHref\");\r\n const showCommentsButton = commentStatus != \"Off\" &&\r\n isValidURL(locationHref, url, commentWhiteListSegments, commentBlackListSegments);\r\n const isReactionsEnabled = isValidURL(locationHref, url, reactionAllowListSegments, reactionBlockListSegments);\r\n\r\n if (!showCommentsButton && !isReactionsEnabled) {\r\n return null;\r\n }\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n container: addOrUpdateTelemetryObject(mainTelemetryObject, contentSocialBarTelemetryContracts.container, { id }, this.telemetryObjects && this.telemetryObjects.container),\r\n reactionBreakdown: addOrUpdateTelemetryObject(mainTelemetryObject, contentSocialBarTelemetryContracts.reactionBreakdown, { id }, this.telemetryObjects && this.telemetryObjects.reactionBreakdown)\r\n };\r\n\r\n // Reaction Counts\r\n const totalReactionCount = reactionCounts ? Object.values(reactionCounts).reduce(($sum, $count) => $sum + $count, 0) : 0;\r\n const reactionCountsVisible = totalReactionCount > 0;\r\n let label = `${totalReactionCount}`;\r\n const widthExists = (this.containerRef && this.containerRef.current) ? this.containerRef.current.offsetWidth > 700 : false;\r\n if (widthExists && users && friendRatings && Object.keys(friendRatings).length > 0) {\r\n const friendNames = Object.keys(friendRatings).slice(0, 2).map(x => users[x].data.primaryName);\r\n label = friendNames.join(\", \");\r\n if (totalReactionCount > friendNames.length) {\r\n label = String.Format(t.SocialBarNamesAndMoreTxt, {\r\n count: `${totalReactionCount - friendNames.length}`,\r\n names: friendNames.join(\", \")\r\n });\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {String.Format((!totalCommentCount || totalCommentCount > 1) ? t.SocialBarCommentsPlural : t.SocialBarCommentsSingular, {\r\n count: (totalCommentCount || \"\")\r\n })}\r\n }\r\n onCommentsClick={this.commentsClickHandler.bind(this)}\r\n onReactionsClick={this.onReactionsClick.bind(this)}\r\n showCommentsButton={showCommentsButton}\r\n reactionCounts={reactionCounts}\r\n reactionsDisabled={!isReactionsEnabled}\r\n label={label}\r\n {...{t, rating, managedClasses, theme, mainTelemetryObject: this.telemetryObjects && this.telemetryObjects.container, responsiveClass}}\r\n />\r\n \r\n );\r\n }\r\n\r\n onReactionsClick(e, ref) {\r\n const contentId = this.props.content && this.props.content.id;\r\n this.props.popupConnector.openPopup(\"reactionBreakdownContent\", { id: contentId, cornerPosition: {top: \"36px\"}, focusBackRef: ref,\r\n parentTelemetryObject: this.telemetryObjects && this.telemetryObjects.reactionBreakdown});\r\n }\r\n\r\n /* REACTIONS */\r\n reactionHandler(type) {\r\n const content = this.props.content;\r\n if (!content) { return; }\r\n\r\n const sendContentReaction = this.props.socialBarConnector.sendContentReaction;\r\n const reset = content.rating == type;\r\n sendContentReaction(content, type, reset);\r\n }\r\n\r\n /* COMMENTS */\r\n commentsClickHandler(target) {\r\n if (isComponentDisabled(this.props.theme, \"reactionbreakdowncontent\")) {\r\n dispatchBridgeEvent(BridgeEventNames.commentsClicked);\r\n } else {\r\n document.location.href = document.location.href.replace(\"#comments\", \"\")+\"#comments\";\r\n }\r\n return false;\r\n }\r\n\r\n disableSuperAppBodyScrollbar() {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n if (isSuperApp) { document.body.style.overflow = \"hidden\"; }\r\n }\r\n}\r\n\r\nexport default connect(mapStateToProps)(ContentSocialBar);","// © Microsoft Corporation. All rights reserved.\r\nimport { ContentSocialBar } from \"./content-social-bar/ContentSocialBar\";\r\nimport ReactionMenu from \"./common/reaction-menu/ReactionMenu\";\r\nimport SocialBarPanel from \"./common/social-bar-panel/SocialBarPanel\";\r\n\r\nimport {\r\n SocialBarExperienceRenderErrorContentSocialBar,\r\n SocialBarExperienceRenderErrorReactionMenu,\r\n SocialBarExperienceRenderErrorSocialBarPanel,\r\n SocialBarExperienceRenderErrorUnknownComponent\r\n} from \"@msnews/diagnostics\";\r\n\r\nexport const RenderErrors = {\r\n [ContentSocialBar.name]: SocialBarExperienceRenderErrorContentSocialBar,\r\n [ReactionMenu.name]: SocialBarExperienceRenderErrorReactionMenu,\r\n [SocialBarPanel.name]: SocialBarExperienceRenderErrorSocialBarPanel,\r\n UnknownComponent: SocialBarExperienceRenderErrorUnknownComponent\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, BridgeEventNames, ResponsiveClassManager, SocialTelemetryManager, addOrUpdateTelemetryObject, appErrorLogger, enums, handleBridgeEvent, hasThemeBase, preventSelection, renderHybrid } from \"@msnews/social-utils\";\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\nimport { BaseExperience, InitialCommonExperienceProps } from \"@msnews/experiences-base\";\r\nimport { HandledPropsKeys, getContextData } from \"@msnews/core\";\r\nimport { SocialBarHandledProps, SocialBarUnhandledProps } from \"./SocialBar.props\";\r\n\r\nimport ContentSocialBar from \"./content-social-bar/ContentSocialBar\";\r\nimport { ExperienceIds } from \"@msnews/experiences-constants\";\r\nimport React from \"react\";\r\nimport { RenderErrors } from \"./SocialBar.errors\";\r\nimport { SocialService } from \"@msnews/social-data-service\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\ndeclare global {\r\n interface Window {\r\n loginWindow: any;\r\n trackFromWidget: any;\r\n sapphireBridge: any;\r\n msaLoginWindow: any;\r\n signalR: any;\r\n auth2: any;\r\n googleInit: any;\r\n gapi: any;\r\n FB: any;\r\n fbAsyncInit: any;\r\n listenMSALoginWindow: any;\r\n msaLogin: any;\r\n clipboardData: any;\r\n AzureStorage: any;\r\n require: (r: any, f: any) => void;\r\n ReactNativeWebView: any;\r\n }\r\n}\r\n\r\n/**\r\n * Starter kit experience\r\n */\r\nexport class SocialBar extends BaseExperience {\r\n\r\n /** The SocialBar default prop contract. Describes any default values for any component handled props */\r\n public static defaultProps: Partial = {\r\n experienceName: ExperienceIds.socialBar\r\n };\r\n private handleTelemetryCall: Function;\r\n private handlePartialPageImpressionCall: Function;\r\n private handleUpdateTemplValueCallback: Promise;\r\n private handleAppErrorEventCall: (AppError) => void;\r\n telemetryObjects: any;\r\n\r\n constructor(props, context) {\r\n super(props, context);\r\n\r\n this.handleTelemetryCall = this.props.handleTelemetryCall;\r\n this.handlePartialPageImpressionCall = this.props.handlePartialPageImpressionCall;\r\n this.handleAppErrorEventCall = this.props.handleAppErrorEventCall;\r\n this.handleUpdateTemplValueCallback = this.props.handleUpdateTemplValueCallback;\r\n if (this.handleAppErrorEventCall) {\r\n appErrorLogger.setOnAppError(this.handleAppErrorEventCall);\r\n }\r\n this.telemetryObjects = {};\r\n }\r\n\r\n /** @inheritdoc */\r\n protected handledProps: HandledPropsKeys = {\r\n ...InitialCommonExperienceProps,\r\n checkAndLogReducerError: undefined\r\n };\r\n\r\n /** @inheritdoc */\r\n public componentWillMount(): void {\r\n try {\r\n const locationHref = getContextData(this.props.requestContext.data.locationHref, \"locationHref\");\r\n const ppeEnvironmentSelected = locationHref.toLowerCase().indexOf(enums.selectPpeParameter) > -1;\r\n if (ppeEnvironmentSelected) { SocialService.setDomain(enums.externalUrls.ppeApi); }\r\n } catch (e) {\r\n logger.log(\"Error occured using requestContext.\");\r\n }\r\n }\r\n\r\n /** @ineritdoc */\r\n public componentDidMount(): void {\r\n this.setupTelemetry();\r\n this.setupBridge();\r\n this.setupResponsiveClass();\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n isSuperApp && this.preventSelectionInSuperapp();\r\n }\r\n\r\n /** @inheritdoc */\r\n public componentWillUnmount(): void {\r\n this.teardownBridge();\r\n }\r\n\r\n public componentDidCatch(error, info): void {\r\n const componentRegex = new RegExp(\"in (.+) .created by\");\r\n const componentNameResult = info.componentStack.match(componentRegex);\r\n let componentName = componentNameResult && componentNameResult[1] || \"unknown\";\r\n const reduxResult = componentName.match(/Connect\\((.+)\\)/);\r\n const isRedux = (reduxResult && reduxResult[1]) != null;\r\n if (isRedux) {\r\n componentName = reduxResult[1];\r\n }\r\n const isPopup = info.componentStack.indexOf(\"created by Popup\") > 0;\r\n const appError = RenderErrors[componentName] || RenderErrors.UnknownComponent;\r\n\r\n const { id } = this.props;\r\n\r\n appErrorLogger.log({\r\n ...appError,\r\n message: \"SocialBar experience component failed to render\",\r\n pb: {\r\n ...appError.pb,\r\n customMessage: componentName + \" \" + error.name + \": \" + error.message,\r\n stack: error.stack,\r\n socialProps: { id },\r\n isPopup,\r\n isRedux\r\n }\r\n } as AppError);\r\n }\r\n\r\n public componentDidUpdate() {\r\n this.props.checkAndLogReducerError();\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n public preventSelectionInSuperapp() {\r\n document.addEventListener(\"touchstart\", preventSelection);\r\n }\r\n\r\n public preparePropsToPass(propsToPass) {\r\n // Add and pass a container telemetry object matching with the module\r\n const moduleTelemetryContract = { name: \"Socialbar\" };\r\n this.telemetryObjects.module = addOrUpdateTelemetryObject(this.props.mainTelemetryObject, moduleTelemetryContract, {}, this.telemetryObjects.module);\r\n propsToPass.mainTelemetryObject = this.telemetryObjects.module;\r\n }\r\n\r\n /** @inheritdoc */\r\n public render(): JSX.Element {\r\n super.render();\r\n\r\n const { t, theme, children, requestContext, managedClasses } = this.props;\r\n const propsToPass = {...this.unhandledProps(), children, markTtvr: this.markTtvr, t, theme, requestContext};\r\n this.preparePropsToPass(propsToPass);\r\n\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n const { mainContainer, mainSuperAppContainer, mainInSuperappModal } = managedClasses;\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private setupTelemetry = () => {\r\n if (this.handleTelemetryCall && this.handlePartialPageImpressionCall) {\r\n SocialTelemetryManager.setPrimeHandlers({\r\n handleTelemetryCall: this.handleTelemetryCall,\r\n handlePartialPageImpressionCall: this.handlePartialPageImpressionCall,\r\n handleUpdateTemplValueCallback: this.handleUpdateTemplValueCallback\r\n });\r\n }\r\n };\r\n\r\n private setupBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.addEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n private teardownBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.removeEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n /** Helper to mark time to visually ready */\r\n private markTtvr = () => {\r\n window.requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n super.markTimeToVisuallyReady(true);\r\n }, 0);\r\n });\r\n };\r\n\r\n private setupResponsiveClass() {\r\n ResponsiveClassManager.setWindow(window);\r\n ResponsiveClassManager.addListener(this, (responsiveClass) => {\r\n if (this.props.styleConnector && responsiveClass != this.props.responsiveClass) {\r\n this.props.styleConnector.updateResponsiveClass(responsiveClass);\r\n }\r\n });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, DesignSystem, highContrastSelector, isDarkMode, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { avatarSize, dangerColor, dangerFocusColor, darkerBgColor, fontFamily, reset } from \"./commonJssConstants\";\r\n\r\nconst switchSize = \"20px\";\r\n\r\nexport const CommonStyles = (config: DesignSystem) => ({\r\n mainContainer: {\r\n ...reset,\r\n position: \"relative\",\r\n \"line-height\": \"initial\",\r\n \"font-size\": \"16px\",\r\n \"font-family\": fontFamily,\r\n // 'Hide scrollbar'\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar\": {\r\n display: \"none\"\r\n },\r\n\r\n \"& textarea\": {\r\n \"font-family\": fontFamily\r\n },\r\n\r\n \"& *\": {\r\n \"-webkit-font-smoothing\": \"auto\",\r\n \"-moz-osx-font-smoothing\": \"grayscale\",\r\n \"font-smoothing\": \"auto\"\r\n },\r\n \"& label\": {\r\n \"vertical-align\": \"middle\"\r\n },\r\n \"& .no-select, &.no-select \": {\r\n \"-webkit-touch-callout\": \"none\",\r\n /* 'iOS Safari '*/\r\n \"-webkit-user-select\": \"none\",\r\n /* 'Safari '*/\r\n \"-khtml-user-select\": \"none\",\r\n /* 'Konqueror HTML '*/\r\n \"-moz-user-select\": \"none\",\r\n /* 'Old versions of Firefox '*/\r\n \"-ms-user-select\": \"none\",\r\n /* 'Internet Explorer'/'Edge '*/\r\n \"user-select\": \"none\"\r\n /* 'Non-prefixed version, currently'\r\n 'supported by Chrome, Opera and Firefox '*/\r\n },\r\n \"& .cwt-hide\": {\r\n display: \"none\"\r\n },\r\n \"& .cwt-hide-important\": {\r\n display: \"none !important\"\r\n },\r\n \"& .cwt-text-muted\": {\r\n color: neutralForegroundHint\r\n },\r\n \"& .text-center\": {\r\n \"text-align\": \"center\"\r\n },\r\n \"& .dot-before\": {\r\n \"&:before\": {\r\n content: \"'•'\",\r\n margin: \"0 8px\",\r\n \"font-size\": \"14px\",\r\n \"font-weight\": \"400\",\r\n \"line-height\": \"inherit\"\r\n }\r\n },\r\n \"& .cwt-capitalize\": {\r\n \"text-transform\": \"capitalize\"\r\n },\r\n\r\n /* 'Comment Highlighting '*/\r\n \"& @keyframes comment-highlight-animation\": {\r\n from: {\r\n \"margin-top\": \"-10px\",\r\n opacity: \"0.1\"\r\n },\r\n to: {\r\n \"margin-top\": \"0\",\r\n opacity: \"1\"\r\n }\r\n },\r\n \"& .cwt-comment-highlight\": {\r\n \"animation-name\": \"comment-highlight-animation\",\r\n \"animation-duration\": \".3s\",\r\n \"animation-timing-function\": \"ease\"\r\n },\r\n\r\n /* 'STANDALONE '*/\r\n \"& a:not(.cwt-fast-button), a:not([href])\": {\r\n color: neutralForegroundRest,\r\n cursor: \"pointer\"\r\n },\r\n \"& .cwt-link\": {\r\n cursor: \"pointer\"\r\n },\r\n \"& a:not(:hover)\": {\r\n \"text-decoration\": \"none\"\r\n },\r\n \"& a:hover, .cwt-link:hover:not(.cwt-button), .cwt-link.cwt-icon:hover\": {\r\n [`&:not(${highContrastSelector})`]: {\r\n \"text-decoration\": \"none\"\r\n }\r\n },\r\n \"& .cwt-select \": {\r\n padding: \"4px\",\r\n color: neutralForegroundHint,\r\n \"border-radius\": \"4px\"\r\n },\r\n\r\n /* 'BADGE '*/\r\n \"& .cwt-badge\": {\r\n padding: \"0 8px 0.8px\",\r\n \"font-size\": \"11px\",\r\n \"font-weight\": \"500\",\r\n background: \"rgba(0, 0, 0, 0.07)\",\r\n \"border-radius\": \"16px\"\r\n },\r\n\r\n /* 'ICONS '*/\r\n \"& .cwt-icon\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"font-style\": \"normal\",\r\n color: neutralForegroundRest,\r\n\r\n \"& .cwt-icon-label\": {\r\n padding: \"0 5px\",\r\n \"font-style\": \"inherit\",\r\n color: neutralForegroundRest,\r\n \"margin-top\": \"-.12em\"\r\n },\r\n\r\n \"&[disabled] \": {\r\n \"pointer-events\": \"none\",\r\n cursor: \"default\"\r\n },\r\n\r\n \"&.cwt-link:hover\": {\r\n \"text-decoration\": \"none\"\r\n }\r\n },\r\n \"& .cwt-icon, * & .cwt-icon\": {\r\n color: neutralForegroundRest,\r\n\r\n \"& .cwt-icon-vector\": {\r\n \"font-size\": \"inherit\"\r\n }\r\n },\r\n\r\n \"& .cwt-fast-icon-button\": {\r\n \"&, &:active, &:hover\": {\r\n background: \"none\",\r\n border: \"none\"\r\n }\r\n },\r\n\r\n // 'Vector Icons'\r\n \"& .cwt-icon-vector\": {\r\n width: \"1em\",\r\n fill: \"inherit\"\r\n },\r\n \"& a:hover\": {\r\n \"& .cwt-icon\": {\r\n color: accentFillRest\r\n }\r\n },\r\n /* 'SWITCH '*/\r\n \"& .cwt-switch\": {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n width: `calc(${switchSize} * 2)`,\r\n height: `calc(${switchSize})`,\r\n\r\n \"& input\": {\r\n opacity: \"0\",\r\n width: \"0\",\r\n height: \"0\",\r\n\r\n \"&:checked + .cwt-switch-slider\": {\r\n \"background-color\": \"#106EBE\",\r\n border: \"1px solid #106EBE\",\r\n\r\n \"&:before\": {\r\n \"-webkit-transform\": applyLocalizedProperty(`translateX(${switchSize})`, `translateX(-${switchSize})`, config.direction),\r\n \"-ms-transform\": applyLocalizedProperty(`translateX(${switchSize})`, `translateX(-${switchSize})`, config.direction),\r\n transform: applyLocalizedProperty(`translateX(${switchSize})`, `translateX(-${switchSize})`, config.direction),\r\n \"background-color\": \"white\"\r\n }\r\n },\r\n\r\n \"&:disabled + .cwt-switch-slider\": {\r\n opacity: \".5\"\r\n }\r\n }\r\n },\r\n \"& .cwt-switch-slider\": {\r\n position: \"absolute\",\r\n cursor: \"pointer\",\r\n top: \"0\",\r\n left: \"0\",\r\n right: \"0\",\r\n bottom: \"0\",\r\n \"background-color\": \"white\",\r\n border: \"1px solid #323130\",\r\n \"-webkit-transition\": \".3s\",\r\n transition: \".3s\",\r\n \"border-radius\": switchSize,\r\n\r\n \"&:before\": {\r\n position: \"absolute\",\r\n content: \"' '\",\r\n height: `calc(${switchSize} - 8px)`,\r\n width: `calc(${switchSize} - 8px)`,\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"calc(4px - 1px)\",\r\n bottom: \"calc(4px - 1px)\",\r\n \"background-color\": \"#323130\",\r\n \"-webkit-transition\": \".4s\",\r\n transition: \".4s\",\r\n \"border-radius\": \"50%\"\r\n }\r\n },\r\n\r\n /* 'TABS '/ 'TABBAR '*/\r\n \"& .cwt-tabs\": {\r\n margin: \"0 -4px\",\r\n padding: \"0\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"list-style\": \"none\",\r\n \"overflow-x\": \"auto\",\r\n \"overflow-y\": \"hidden\",\r\n\r\n // 'Hide scrollbar'\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar \": {\r\n display: \"none\"\r\n },\r\n \"&:-moz-any(#content,#appcontent) browser\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"-14px !important\",\r\n \"overflow-y\": \"scroll\",\r\n \"margin-bottom\": \"-14px !important\",\r\n \"overflow-x\": \"scroll\"\r\n },\r\n\r\n \"& .cwt-tab-item\": {\r\n padding: \"4px\",\r\n cursor: \"pointer\",\r\n\r\n \"&:hover\": {\r\n \"background-color\": \"rgba(0, 0, 0, .05)\"\r\n }\r\n }\r\n },\r\n\r\n /* 'BUTTON '*/\r\n\r\n \"& .cwt-danger\": {\r\n background: dangerColor,\r\n\r\n \"&:hover\": {\r\n background: dangerFocusColor,\r\n color: neutralLayerCard\r\n }\r\n },\r\n /* 'AVATAR '*/\r\n \"& .cwt-avatar\": {\r\n cursor: \"pointer\",\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n height: avatarSize,\r\n\r\n \"box-sizing\": \"border-box\",\r\n \"object-fit\": \"cover\",\r\n \"border-radius\": \"50%\"\r\n },\r\n\r\n \"& input\": {\r\n font: \"unset\"\r\n },\r\n\r\n // ACCESSIBILITY HELPERS\r\n \"& .cwt-visible-on-focus\": {\r\n display: \"inline-flex !important\",\r\n width: \"0\",\r\n height: \"0\"\r\n },\r\n \"& .cwt-visible-on-focus:focus\": {\r\n width: \"1em\",\r\n background: \"transparent\",\r\n color: neutralForegroundRest,\r\n fill: neutralForegroundRest,\r\n border: \"none\",\r\n height: \"1em\",\r\n \"font-size\": \"16px\",\r\n opacity: \"1.0\",\r\n margin: \"0 3px\",\r\n \"&.mr-12\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"12px\"\r\n }\r\n }\r\n\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, highContrastSelector, isDarkMode, neutralFillActive, neutralFillRest, neutralFocus, neutralForegroundHint } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums, getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const SocialBarPanelStyles = (config: DesignSystem) => ({\r\n socialBarPanelContainer: {\r\n \"touch-action\": \"none\",\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n\r\n \"& .vertical-line\": {\r\n \"font-size\": \"10px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"13px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-2px\",\r\n color: neutralFocus\r\n },\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& > .cwt-icon\": {\r\n \"font-size\": \"16px\",\r\n padding: applyLocalizedProperty(\"6px 2px 6px 8px\", \"6px 8px 6px 2px\", config.direction),\r\n margin: applyLocalizedProperty(\"0 7px 0 0\", \"0 0 0 7px\", config.direction),\r\n color: isDarkMode(config) ? \"#F5F5F5\" : \"#262626\",\r\n \"border-radius\": \"4px\",\r\n\r\n \"& + .cwt-visible-on-focus:focus\": {\r\n margin: applyLocalizedProperty(\"0 6px 0 -8px\", \"0 -8px 0 6px\", config.direction)\r\n },\r\n\r\n \"&.cwt-hide\": {\r\n display: \"none\",\r\n \"pointer-events\": \"none\",\r\n \"touch-events\": \"none\"\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"13px\",\r\n padding: \"0 6px\",\r\n\r\n \"& a.cwt-link:not([href])\": {\r\n color: \"unset\"\r\n }\r\n },\r\n\r\n \"&.cwt-active-reaction .cwt-icon-label\": {\r\n \"font-weight\": \"600\"\r\n },\r\n\r\n '&[role=\"button\"]': {\r\n \"&:hover, &.highlight\": {\r\n background: neutralFillRest\r\n },\r\n \"&:active\": {\r\n background: neutralFillActive\r\n }\r\n }\r\n },\r\n\r\n \"&& > .cwt-icon\": {\r\n [highContrastSelector]: {\r\n color: \"buttontext\"\r\n }\r\n },\r\n\r\n \"& .cwt-reply-btn.cwt-icon\": {\r\n \"& .cwt-icon-vector\": {\r\n \"margin-top\": \"2px\"\r\n }\r\n },\r\n\r\n // 'RATING LABELS'\r\n \"& > .cwt-icon .cwt-icon-label.cwt-red-reaction\": {\r\n color: isDarkMode(config) ? \"#FF948F\" : \"#E02F19\"\r\n },\r\n \"& > .cwt-icon .cwt-icon-label.cwt-yellow-reaction\": {\r\n color: isDarkMode(config) ? \"#FF9333\" : \"#BD5B00\"\r\n },\r\n\r\n [\"&.\" + enums.responsiveLevels.MobilePopup]: {\r\n \"& > .cwt-icon:hover, .cwt-icon-label:hover \": {\r\n color: neutralForegroundHint\r\n }\r\n }\r\n },\r\n contentReactionCounts: {\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n \"font-size\": \"16px !important\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"12px\",\r\n\r\n \"& > .cwt-icon\": {\r\n padding: \"0\",\r\n \"font-size\": \"16px !important\",\r\n \"align-items\": \"flex-start\",\r\n\r\n \"& .cwt-icon-label\": {\r\n padding: \"0 3px\",\r\n \"font-size\": \"13px\",\r\n \"margin-top\": \"0\"\r\n },\r\n\r\n \"& .cwt-icon-vector\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"4px\",\r\n \"margin-top\": \"2px\",\r\n \"&:last-child\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"0\"\r\n }\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialBarProps as BaseSocialBarProps,\r\n SocialBarUnhandledProps as BaseSocialBarUnhandledProps,\r\n SocialBarHandledProps,\r\n SocialBarManagedClasses\r\n} from \"./SocialBar.props\";\r\nimport { SocialBarConfigSchema, mockConfig, mockDefaultState, mockState } from \"./experience-info\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialBar as BaseSocialBar } from \"./SocialBar\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ExperienceInfo } from \"@msnews/core\";\r\nimport { SocialBarActions } from \"./SocialBar.actions\";\r\nimport { SocialBarClassNameContract } from \"./SocialBar.classnames\";\r\nimport { SocialBarConfig } from \"./SocialBar.config\";\r\nimport { SocialBarConnector } from \"./SocialBar.connector\";\r\nimport { SocialBarInspector } from \"./SocialBar.inspector\";\r\nimport { SocialBarReducer } from \"./SocialBar.reducer\";\r\nimport { SocialBarState } from \"./SocialBar.state\";\r\nimport { SocialBarStyles } from \"./SocialBar.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n// The type returned by manageJss type is very complicated so we'll let the compiler infer the type instead of re-declaring just for the package export\r\nconst SocialBar = manageJss(SocialBarStyles)(BaseSocialBar);\r\ntype SocialBar = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ntype SocialBarUnhandledProps = Subtract;\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype SocialBarProps = ManagedJSSProps;\r\n\r\n// Define the ExperienceInfo object. This is used by tooling\r\nconst ToolingInfo: ExperienceInfo = {\r\n reactComponent: SocialBar,\r\n experienceConfigSchema: SocialBarConfigSchema,\r\n defaultMockState: mockDefaultState,\r\n mockState: mockState,\r\n mockConfig: mockConfig,\r\n inspector: SocialBarInspector.inspect\r\n};\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n SocialBar,\r\n SocialBarActions as BarActions,\r\n SocialBarConfig,\r\n SocialBarConnector,\r\n SocialBarProps,\r\n SocialBarReducer,\r\n SocialBarState,\r\n SocialBarClassNameContract,\r\n SocialBarHandledProps,\r\n SocialBarUnhandledProps,\r\n ToolingInfo\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { CommonStyles, CommonSuperAppStyles } from \"@msnews/social-utils\";\r\nimport { ReactionMenuStyles } from \"./common/reaction-menu/ReactionMenu.styles\";\r\nimport { SocialBarPanelStyles } from \"./common/social-bar-panel/SocialBarPanel.styles\";\r\nimport { ContentSocialBarStyles } from \"./content-social-bar/ContentSocialBar.styles\";\r\nimport { ContentSocialBarSuperAppStyles } from \"./content-social-bar/themes/superapp/ContentSocialBarSuperApp.styles\";\r\nimport { SocialBarClassNameContract } from \"./SocialBar.classnames\";\r\n\r\n/**\r\n * The Social styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const SocialBarStyles: ComponentStyles < SocialBarClassNameContract, DesignSystem > = (config: DesignSystem) => ({\r\n ...CommonStyles(config),\r\n ...ReactionMenuStyles(config),\r\n ...ContentSocialBarStyles(config),\r\n\r\n /** SuperApp Styles */\r\n ...CommonSuperAppStyles(config),\r\n ...ContentSocialBarSuperAppStyles(config),\r\n ...SocialBarPanelStyles(config)\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { ZIndex } from \"@msnews/core\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nexport const ReactionMenuStyles = (config: DesignSystem) => ({\r\n reactionMenuContainer: {\r\n display: \"flex !important\",\r\n \"align-items\": \"flex-start\",\r\n \"justify-content\": \"center\",\r\n padding: \"6px 13px 0\",\r\n position: \"absolute\",\r\n height: \"42px\",\r\n background: neutralLayerCard,\r\n \"border-radius\": \"32px\",\r\n \"-webkit-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"-moz-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n animation: \"reaction-menu-fade-in .2s ease-out\",\r\n \"-webkit-animation-fill-mode\": \"forwards\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& > .cwt-icon\": {\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n margin: \"0 0 !important\",\r\n padding: \"4px !important\",\r\n \"font-size\": \"18px\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(28),\r\n transition: \"ease-out .15s\",\r\n width: \"28px\"\r\n },\r\n\r\n \"&:hover div.emoji-icon, &:focus div.emoji-icon, &.touchFocused div.emoji-icon\": {\r\n transform: \"scale(1.285) translateY(-4px)\"\r\n },\r\n\r\n \"&:hover:before, &:focus:before, &.touchFocused:before\": {\r\n position: \"absolute\",\r\n \"z-index\": ZIndex.Dialog.toString(),\r\n top: \"-28px\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"center\",\r\n content: \"attr(data-title)\",\r\n \"white-space\": \"nowrap\",\r\n height: \"18px\",\r\n padding: \"0 8px 1px\",\r\n \"font-size\": \"13px\",\r\n \"text-transform\": \"capitalize\",\r\n background: neutralForegroundRest,\r\n color: neutralLayerCard,\r\n \"border-radius\": \"11px\"\r\n }\r\n }\r\n },\r\n\r\n reactionMenuPopover: {\r\n top: \"-51px\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"-10px\",\r\n \"padding-bottom\": \"4px\"\r\n },\r\n\r\n \"@keyframes reaction-menu-fade-in\": {\r\n from: { top: \"-6px\", opacity: \"0\" },\r\n to: { top: \"-13px\", opacity: \"1\" }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums } from \"@msnews/social-utils\";\r\n\r\nexport const ContentSocialBarStyles = (config: DesignSystem) => ({\r\n contentSocialBarContainer: {\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n margin: \"8px 3px 0\",\r\n\r\n [\"&.\" + enums.responsiveLevels.L0]: {\r\n \"margin-bottom\": \"8px\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const CommonSuperAppStyles = (config: DesignSystem) => ({\r\n mainSuperAppContainer: {\r\n \"& .cwt-fast-button, input.cwt-fast-button, button.cwt-fast-button\": {\r\n \"border-radius\": \"20px\",\r\n \"background-color\": \"linear-gradient(87.44deg, #3D6CDC -5.38%, #625ABA 103.44%)\",\r\n \"font-weight\": \"600\"\r\n },\r\n\r\n \"& a:hover, .cwt-link:hover:not(.cwt-fast-button), .cwt-link.cwt-icon:hover\": {\r\n \"text-decoration\": \"none\"\r\n },\r\n\r\n \"& .cwt-switch\": {\r\n \"& input\": {\r\n \"&:checked + .cwt-switch-slider\": {\r\n background: \"linear-gradient(82.21deg, #3D6CDC -1.34%, #625ABA 97.29%)\"\r\n }\r\n }\r\n }\r\n },\r\n mainInSuperappModal: {\r\n \"overflow-y\": \"auto\",\r\n display: \"flex\",\r\n \"align-items\": \"flex-start\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const ContentSocialBarSuperAppStyles = (config: DesignSystem) => ({\r\n contentSocialBarSuperAppContainer: {\r\n padding: \"72px 16px 0\",\r\n margin: \"5px 0 0\"\r\n },\r\n\r\n contentReactionPopoversSuperAppContainer: {\r\n left: \"0\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { SocialDataState } from \"@msnews/social-data-connector\";\r\n\r\nexport type SetComponent = (id?: string, market?: string, specificCommentId?: string, commentDisplayType?: string) => void;\r\n\r\nexport type SetSocialData = (socialData: SocialDataState) => void;\r\n\r\nexport const SocialCommentActions = {\r\n setComponent: new ActionMap(\"SetComponent\"),\r\n setSocialData: new ActionMap(\"SetSocialData\")\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { InspectorArgs, InspectorResponse, appEnvironment } from \"@msnews/core\";\r\nimport { SocialCommentConfig, SocialCommentState } from \"./index\";\r\n\r\nimport { SocialCommentProps } from \"./SocialComment.props\";\r\n\r\nexport const SocialCommentInspector = {\r\n inspect: (args: InspectorArgs): InspectorResponse => {\r\n\r\n const { config, state } = args;\r\n let { market, theme, commentDisplayType, styleOverrides } = config;\r\n const { id, specificCommentId } = state;\r\n\r\n if (state.theme) {\r\n theme = state.theme;\r\n }\r\n\r\n if (state.commentDisplayType) {\r\n commentDisplayType = state.commentDisplayType;\r\n }\r\n\r\n if (state.market) {\r\n market = state.market;\r\n }\r\n\r\n if (!theme) {\r\n theme = \"default\";\r\n }\r\n\r\n if (!market) {\r\n market = appEnvironment ? appEnvironment.CurrentMarket : \"en-us\";\r\n }\r\n\r\n if (!commentDisplayType) {\r\n commentDisplayType = \"default\";\r\n }\r\n\r\n const props = { ...args.state, id, market, t: config.localizedStrings, theme, commentDisplayType, specificCommentId, jssStyleSheet: styleOverrides };\r\n return { props, missingChildren: [] };\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, SocialDataConnectorNotFound } from \"@msnews/diagnostics\";\r\nimport { IRequestContext, InspectorResponse, ScreenWidth, appEnvironment } from \"@msnews/core\";\r\nimport { SocialDataActions, SocialDataConnector } from \"@msnews/social-data-connector\";\r\n\r\nimport { ComponentConnector } from \"@msnews/experiences-connector\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { DynamicReducer } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { ExperienceInitialProps } from \"@msnews/experiences-base\";\r\nimport { IReducer } from \"@msnews/experiences-redux-contracts\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { SocialCommentActions } from \"./SocialComment.actions\";\r\nimport { SocialCommentConfig } from \"./SocialComment.config\";\r\nimport { SocialCommentInspector } from \"./SocialComment.inspector\";\r\nimport { SocialCommentProps } from \"./index\";\r\nimport { SocialCommentState } from \"./SocialComment.state\";\r\nimport { Store } from \"redux\";\r\nimport { appErrorLogger } from \"@msnews/social-utils\";\r\n\r\n// A partial config to ensure loading of social data connector.\r\n// This hard-coded config can be removed after making sure that all config documents contain the data connector.\r\nconst socialDataConnectorConfig: Partial = {\r\n dataConnectors: [\r\n {\r\n screenWidth: ScreenWidth.Any,\r\n children: [\r\n {\r\n experienceType: ConnectorNamespaces.SocialData,\r\n instanceId: \"\",\r\n href: \"cms/api/amp/experienceConfigIndex/BB1cKaeg\"\r\n }\r\n ]\r\n }\r\n ]\r\n};\r\n\r\n/**\r\n * The connector for the Comment Experience.\r\n */\r\nexport class SocialCommentConnector extends ComponentConnector {\r\n\r\n private socialDataConnector: SocialDataConnector;\r\n\r\n /** @inheritdoc */\r\n public constructor(namespace: string, parentNamespace: string, rootReducer: DynamicReducer, reducer: IReducer, store: Store, config: SocialCommentConfig, requestContext: IRequestContext) {\r\n super(namespace, parentNamespace, rootReducer, reducer, store, {...socialDataConnectorConfig, ...config}, requestContext);\r\n }\r\n\r\n /** @inheritdoc */\r\n public async onComponentConnect(connectorProps?: ExperienceInitialProps): Promise {\r\n if (!appErrorLogger.onAppError) {\r\n appErrorLogger.setOnAppError(this.onAppError.bind(this));\r\n }\r\n await ComponentConnector.prototype.onComponentConnect.call(this, connectorProps);\r\n\r\n const market = connectorProps && connectorProps.context && connectorProps.context.market ? connectorProps.context.market : appEnvironment.CurrentMarket;\r\n\r\n PageBase.getInstance().rootReducer.getDataConnector(ConnectorNamespaces.SocialData).then((socialDataConnector: SocialDataConnector) => {\r\n if (socialDataConnector) {\r\n this.socialDataConnector = socialDataConnector;\r\n this.registerObservers();\r\n this.updateSocialCommentState();\r\n\r\n this.setComponent(market, connectorProps.context.theme, connectorProps.context.id, connectorProps.context.commentDisplayType, connectorProps.context.specificCommentId);\r\n } else {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"Comment data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"Comment data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n });\r\n }\r\n\r\n public registerObservers(): void {\r\n SocialDataActions.setTheme.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateMe.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.setContent.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateContent.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.insertComments.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.resetSpecificCommentId.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateCommentRating.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.incrementReplyCount.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.insertComment.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateUser.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateUserFollowers.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateUserFollowing.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateUserComments.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.deleteUserComment.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.addTyper.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateTypers.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.recordSignalRHub.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.updateResponsiveClass.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.mapCmsIdToContentId.registerObserver(() => this.updateSocialCommentState());\r\n SocialDataActions.resetError.registerObserver(() => this.updateSocialCommentState());\r\n }\r\n\r\n public updateSocialCommentState(): void {\r\n if (this.getSocialDataConnector()) {\r\n SocialCommentActions.setSocialData.getActionSender(this).send(this.socialDataConnector.getCurrentState());\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n public mapStateToProps(state: SocialCommentState): SocialCommentProps {\r\n const inspectorResult: InspectorResponse = SocialCommentInspector.inspect({\r\n config: this.config,\r\n children: this.childComponentInstanceList,\r\n state: state\r\n });\r\n\r\n let connectorFunctions = {};\r\n if (this.getSocialDataConnector()) {\r\n connectorFunctions = this.socialDataConnector.getSocialCommentConnectorFunctionsWithStateBindings();\r\n }\r\n\r\n return {\r\n ...inspectorResult.props,\r\n ...this.telemetryTags,\r\n children: this.childComponentInstanceList,\r\n mainTelemetryObject: this.telemetryObject,\r\n componentConnector: {\r\n setComponent: this.setComponent.bind(this)\r\n },\r\n ...connectorFunctions\r\n };\r\n }\r\n\r\n public async setComponent(market: string, theme: string, id?: string, commentDisplayType?: string, specificCommentId?: string) {\r\n SocialCommentActions.setComponent.getActionSender(this).send(id, market, specificCommentId, commentDisplayType);\r\n this.socialDataConnector.setTheme(theme);\r\n }\r\n\r\n private getSocialDataConnector() {\r\n if (!this.socialDataConnector) {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"Comment data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"Comment data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n return this.socialDataConnector;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionHandler } from \"@msnews/experiences-redux\";\r\nimport { IReducer, IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { SetComponent, SetSocialData, SocialCommentActions } from \"./SocialComment.actions\";\r\n\r\nimport { SocialCommentState } from \"./SocialComment.state\";\r\nimport { appEnvironment } from \"@msnews/core\";\r\n\r\n/**\r\n * The reducer for the Comment connector, and the SocialCommentState\r\n */\r\nexport class SocialCommentReducer implements IReducer {\r\n /**\r\n * Update the state for the connector, based on the action being applied\r\n * @param state The previous state\r\n * @param actionPayload The action being applied\r\n */\r\n public reduce(state: SocialCommentState, actionPayload: IActionPayload): SocialCommentState {\r\n if (!state) { return {}; }\r\n if (!actionPayload) { return state; }\r\n\r\n let newState: SocialCommentState;\r\n\r\n ActionHandler.handleAction(actionPayload, SocialCommentActions.setComponent, (id?: string, market?: string, specificCommentId?: string, commentDisplayType?: string) => {\r\n id = id || state.id;\r\n market = market || appEnvironment.CurrentMarket || state.market;\r\n specificCommentId = specificCommentId || state.specificCommentId;\r\n commentDisplayType = commentDisplayType || state.commentDisplayType;\r\n newState = {...state, id, market, specificCommentId, commentDisplayType};\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialCommentActions.setSocialData, (socialData) => {\r\n newState = { ...state, ...socialData };\r\n });\r\n\r\n return newState || state;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface CommentTelemetryObjects {\r\n compactStartConversationButton: TelemetryObjectBase;\r\n compactJoinConversationButton: TelemetryObjectBase;\r\n overlayAddCommentButton: TelemetryObjectBase;\r\n overlayStartConversationButton: TelemetryObjectBase;\r\n overlayJoinConversationButton: TelemetryObjectBase;\r\n mobileFloaterButton: TelemetryObjectBase;\r\n overlayComments: TelemetryObjectBase;\r\n}\r\n\r\nexport const commentTelemetryContracts = {\r\n /** Scenario-1: view, Scenario-2:click*/\r\n compactStartConversationButton: {\r\n name: \"StartConversation\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-1: view, Scenario-3:click*/\r\n compactJoinConversationButton: {\r\n name: \"JoinConversation\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-4: view, Scenario-5:click*/\r\n overlayAddCommentButton: {\r\n name: \"AddCommentFloater\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-4: view, Scenario-6:click*/\r\n overlayStartConversationButton: {\r\n name: \"StartConversationFloater\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-4: view, Scenario-7:click*/\r\n overlayJoinConversationButton: {\r\n name: \"JoinConversationFloater\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-8: view, Scenario-8a:click*/\r\n mobileFloaterButton: {\r\n name: \"CommentFloater\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Scenario-9: view */\r\n overlayComments: {\r\n name: \"CommentOverlay\",\r\n content: {\r\n type: getPageContentType()\r\n }\r\n }\r\n};\r\n\r\nexport const commentTelemetryActionDispatchers = {\r\n genericClicked: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\nconst sourcePath = \"https://assets.msn.com/staticsb/statics/latest/community/\";\r\n\r\nexport const activityImages = {\r\n trophy: sourcePath+\"img/profile/activity/cup.svg\",\r\n commenter: sourcePath+\"img/profile/activity/commenter.png\"\r\n};\r\nexport const profileImages = {\r\n privateProfile: sourcePath+\"img/profile/private-profile.svg\",\r\n zeroComments: sourcePath+\"img/profile/zero_comments.svg\",\r\n zeroUsers: sourcePath+\"img/profile/zero_users.svg\",\r\n zeroActivity: sourcePath+\"img/profile/zero_activity.svg\"\r\n};\r\nexport const logoImages = {\r\n facebook: sourcePath+\"img/logo/facebook.svg\",\r\n google: sourcePath+\"img/logo/google.svg\",\r\n microsoft: sourcePath+\"img/logo/microsoft.svg\",\r\n microsoftText: sourcePath+\"img/logo/microsoft_text.png\",\r\n msNews: sourcePath+\"img/logo/msnews_logo.svg\"\r\n};\r\nexport const placeholderImages = {\r\n avatar: sourcePath+\"img/avatar-placeholder.svg\",\r\n peopleAvatar: sourcePath+\"img/people-avatar.svg\",\r\n notSocialAvatar: sourcePath+\"img/profile/not_social_avatar_placeholder.svg\",\r\n content: \"http://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAdQPFo.img\"\r\n};\r\nexport const guidlineImages = {\r\n g1: sourcePath+\"img/guidelines/g1_2.png\",\r\n g2: sourcePath+\"img/guidelines/g2_2.png\",\r\n g3: sourcePath+\"img/guidelines/g3_2.png\",\r\n g4: sourcePath+\"img/guidelines/g4_2.png\",\r\n g5: sourcePath+\"img/guidelines/g5_2.png\"\r\n};\r\nexport const onboardingImages = {\r\n underageBg: sourcePath+\"img/onboard/underage_bg.png\",\r\n welcomeBg: sourcePath+\"img/onboard/welcoming_bg.png\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { placeholderImages } from \"./images\";\r\n\r\nexport function avatarFallback(error) {\r\n error.target.onerror=null;\r\n error.target.src=placeholderImages.avatar;\r\n}\r\n\r\nexport function contentImageFallback(error) {\r\n error.target.onerror = null;\r\n error.target.src = placeholderImages.content;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface SortBoxTelemetryObjects {\r\n sortItems: any;\r\n}\r\n\r\nexport const sortBoxTelemetryContracts = {\r\n /** Scenario 1 from ProfileComments\r\n * id: traceId || commentId\r\n * type: Profile or Comment comes from parent\r\n */\r\n sortItem: {\r\n name: \"Sort\",\r\n behavior: TelemetryBehaviorType.Sort\r\n }\r\n};\r\n\r\nexport const sortBoxTelemetryActionDispatchers = {\r\n /** Used for: Scenario 3a and Scenario 4a */\r\n genericClicked: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, chevron_down, tick, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { SocialPopover } from \"@msnews/social-popover\";\r\nimport { sortBoxTelemetryActionDispatchers, sortBoxTelemetryContracts, SortBoxTelemetryObjects } from \"./SortBox.telemetry\";\r\n\r\nexport interface SortBoxProps {\r\n id: string;\r\n onChange: (sortType: string) => void;\r\n managedClasses?: SocialCommentClassNameContract;\r\n t: SocialCommentLocalizedStrings;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n selectedSortType: string;\r\n sortTypes: object;\r\n dontShowLabel?: boolean;\r\n responsiveClass?: string;\r\n}\r\n\r\ninterface SortBoxState {\r\n listVisible: boolean\r\n}\r\n\r\nexport default class SortBox extends React.Component {\r\n sortMenuTriggerRef: React.RefObject;\r\n sortMenuListItemRef: HTMLLIElement;\r\n telemetryObjects: SortBoxTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n listVisible: false\r\n };\r\n\r\n this.sortMenuTriggerRef = React.createRef();\r\n this.sortMenuListItemRef = null;\r\n this.telemetryObjects = {\r\n sortItems: []\r\n };\r\n }\r\n\r\n onLinkClick(e) {\r\n this.setState({\r\n listVisible: true\r\n });\r\n }\r\n\r\n changeSortHandler(e, type) {\r\n\r\n this.props.onChange(type);\r\n this.setState({\r\n listVisible: false\r\n });\r\n\r\n sortBoxTelemetryActionDispatchers.genericClicked(e.currentTarget, this.telemetryObjects && this.telemetryObjects.sortItems && this.telemetryObjects.sortItems[type]);\r\n const ref = window.document.getElementById(`sortMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(() => { ref.focus(); }, 50);\r\n }\r\n }\r\n\r\n handleKeyDown(e) {\r\n if (e.keyCode == 27) { /* ESC key */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const ref = window.document.getElementById(`sortMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(() => { ref.focus(); }, 50);\r\n }\r\n } else if (e.keyCode == 38) { /* Up arrow */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const prev = e.target.previousElementSibling;\r\n if (prev) {\r\n prev.focus();\r\n } else {\r\n e.target.parentElement.lastElementChild.focus();\r\n }\r\n } else if (e.keyCode == 40) { /* Down arrow */\r\n const next = e.target.nextElementSibling;\r\n if (next) {\r\n next.focus();\r\n } else {\r\n e.target.parentElement.firstElementChild.focus();\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n render() {\r\n const { id, t, managedClasses, mainTelemetryObject, selectedSortType, sortTypes, dontShowLabel, responsiveClass } = this.props;\r\n const { listVisible } = this.state;\r\n\r\n return (\r\n
\r\n {!dontShowLabel && t.CommentSortByTxt + \":\"}\r\n {listVisible &&\r\n this.setState({listVisible: false}),\r\n className: managedClasses.sortBoxPopover,\r\n managedClasses: managedClasses,\r\n hasFocusLock: true,\r\n responsiveClass\r\n }}\r\n >\r\n
    \r\n {Object.keys(sortTypes).map((type, index) => {\r\n\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects.sortItems[type] = addOrUpdateTelemetryObject(mainTelemetryObject, sortBoxTelemetryContracts.sortItem, { id: mainTelemetryObject.contract.content.id, headline: type, type: mainTelemetryObject.contract.content.type }, this.telemetryObjects && this.telemetryObjects.sortItems[type]);\r\n }\r\n return this.changeSortHandler(e, type)}\r\n onKeyDown={(e) => this.handleKeyDown(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.sortItems && this.telemetryObjects.sortItems[type], false, (el) => { (index==0) && (this.sortMenuListItemRef = el); })}\r\n >\r\n \r\n {t[sortTypes[type]]}\r\n {type == selectedSortType && tick}\r\n \r\n ;\r\n }\r\n )}\r\n
\r\n \r\n }\r\n
\r\n \r\n {t[sortTypes[selectedSortType]]}\r\n {chevron_down}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BridgeEventNames, dispatchBridgeEvent } from \"./Social.bridge\";\r\n\r\nimport { enums } from \"./enums\";\r\nimport { getExternalURL } from \"./urlHelper\";\r\nimport { isComponentDisabled } from \"./themeHelpers\";\r\n\r\nexport function openProfilePage(componentConnector, theme, userId, market, target = \"_self\") {\r\n const attributes = [];\r\n attributes[\"href\"] = getExternalURL(`${enums.externalUrls.profilePage}${userId}`, market);\r\n attributes[\"target\"] = target;\r\n if (isComponentDisabled(theme, \"profilepage\")) {\r\n if (theme === enums.theme.superappFullpage.name) {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n componentConnector.setComponent(\"profilePage\", market, theme, userId);\r\n };\r\n } else {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dispatchBridgeEvent(BridgeEventNames.openPopup, {component: \"profilepage\", id: userId, fullScreen: true});\r\n };\r\n }\r\n }\r\n return attributes;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BridgeEventNames, dispatchBridgeEvent } from \"./Social.bridge\";\r\n\r\nimport { enums } from \"./enums\";\r\nimport { getExternalURL } from \"./urlHelper\";\r\nimport { hasThemeBase } from \"./themeHelpers\";\r\n\r\nexport function openEditProfilePage(theme, market, target = \"_blank\") {\r\n const url = getExternalURL(enums.externalUrls.profileSettings, market);\r\n const attributes = [];\r\n attributes[\"href\"] = url;\r\n attributes[\"target\"] = target;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n if (isSuperApp) {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dispatchBridgeEvent(BridgeEventNames.requestBrowser, {url});\r\n };\r\n }\r\n\r\n return attributes;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface CommentBoxTelemetryObjects {\r\n postViolationAI: TelemetryObjectBase;\r\n postHumanReview: TelemetryObjectBase;\r\n sendComment: TelemetryObjectBase;\r\n signIn?: TelemetryObjectBase;\r\n userAvatarLink: TelemetryObjectBase;\r\n bannedViewSelfProfileLink: TelemetryObjectBase;\r\n editProfileLink: TelemetryObjectBase;\r\n}\r\n\r\nexport const commentBoxTelemetryContracts = {\r\n postViolationAI: {\r\n name: \"PostViolationAI\",\r\n content: {type: TelemetryContentType.Comment}\r\n },\r\n postHumanReview: {\r\n name: \"PostHumanReview\",\r\n content: {type: TelemetryContentType.Comment}\r\n },\r\n\r\n /** Comments-Scenario 5a */\r\n sendReply: {\r\n name: \"Reply\",\r\n behavior: TelemetryBehaviorType.Comment,\r\n content: {\r\n type: TelemetryContentType.Comment,\r\n headline: \"Post\"\r\n }\r\n },\r\n /** Comments-Scenario 5 */\r\n sendComment: {\r\n name: \"Post\",\r\n behavior: TelemetryBehaviorType.Comment,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"Post\"\r\n }\r\n },\r\n /** Comments-Scenario 4a */\r\n signIn: {\r\n name: \"SignIn\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"SignIn\"\r\n }\r\n },\r\n profileLink: {\r\n name: \"Profile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n editProfileLink: {\r\n name: \"EditProfile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: TelemetryContentType.Profile,\r\n headline: \"EditProfile\"\r\n }\r\n }\r\n};\r\n\r\nexport const commentBoxTelemetryActionDispatchers = {\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BridgeEventNames, dispatchBridgeEvent } from \"./Social.bridge\";\r\n\r\nimport { enums } from \"./enums\";\r\nimport { getExternalURL } from \"./urlHelper\";\r\nimport { isComponentDisabled } from \"./themeHelpers\";\r\n\r\nexport function openGuidelinePage(componentConnector, theme, market, target = \"_blank\") {\r\n const attributes = [];\r\n attributes[\"href\"] = getExternalURL(enums.externalUrls.guidelinePage, market);\r\n attributes[\"target\"] = target;\r\n if (isComponentDisabled(theme, \"guidelinepage\")) {\r\n if (theme === enums.theme.superappFullpage.name) {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n componentConnector.setComponent(\"guidelinepage\", market, theme);\r\n };\r\n } else {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dispatchBridgeEvent(BridgeEventNames.openPopup, {component: \"guidelinepage\", fullScreen: true});\r\n };\r\n }\r\n }\r\n return attributes;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { exclamation_round, openGuidelinePage, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { ComponentConnector } from \"../../SocialComment.props\";\r\n\r\nexport interface DisabledMessageProps {\r\n managedClasses?: SocialCommentClassNameContract;\r\n message: string;\r\n showGuidelines?: boolean;\r\n hideIcon?: boolean;\r\n t?: SocialCommentLocalizedStrings;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n componentConnector?: ComponentConnector;\r\n theme?: string;\r\n market?: string;\r\n}\r\n\r\nexport default class DisabledMessage extends React.Component {\r\n containerRef: HTMLDivElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const {t, message, managedClasses, mainTelemetryObject, showGuidelines, hideIcon, componentConnector, theme, market} = this.props;\r\n\r\n return (\r\n \r\n \r\n { message }\r\n { !hideIcon ? exclamation_round : \"\"}\r\n \r\n \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\n\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { StealthButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { close2 } from \"@msnews/social-utils\";\r\n\r\nexport interface ProfileEducatorProps extends SocialPopoverProps {\r\n managedClasses: SocialCommentClassNameContract;\r\n t: SocialCommentLocalizedStrings;\r\n}\r\n\r\nexport default class ProfileEducator extends React.Component {\r\n\r\n render() {\r\n const { managedClasses: mc, className, onHide } = this.props;\r\n\r\n return (\r\n \r\n
\r\n
View your profile
\r\n

You can find your comments and activity feed here.

\r\n \r\n {close2} \r\n \r\n
\r\n
\r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, avatarFallback, close2, ellipsis2, enums, exclamation, openEditProfilePage, openProfilePage, placeholderImages, send, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { Comment, Content, User } from \"@msnews/social-data-service\";\r\nimport { CommentBoxTelemetryObjects, commentBoxTelemetryActionDispatchers, commentBoxTelemetryContracts } from \"./CommentBox.telemetry\";\r\nimport { ComponentConnector, FollowInfo, PopupConnector, UsersConnector } from \"../../SocialComment.props\";\r\n\r\nimport DisabledMessage from \"../disabled-message/DisabledMessage\";\r\nimport ProfileEducator from \"../profile-educator/ProfileEducator\";\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { SocialCommentState } from \"../../SocialComment.state\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { connect } from \"react-redux\";\r\nimport { getLocalStorage } from \"@msnews/core\";\r\n\r\nexport interface CommentBoxProps {\r\n componentConnector: ComponentConnector,\r\n isFirstCommenter: boolean,\r\n commentBoxType: string,\r\n parentType: string,\r\n parentUser: User,\r\n me: User,\r\n t: SocialCommentLocalizedStrings;\r\n managedClasses?: SocialCommentClassNameContract;\r\n usersConnector: UsersConnector;\r\n popupConnector: PopupConnector;\r\n users: { [id: string]: FollowInfo;}; // dictionary definening\r\n submitCommentAndUpdateState: (value: string) => Promise;\r\n id: string;\r\n market: string;\r\n content: Content;\r\n broadcastAsTyping?: (id: string, market: string, content: Content) => void;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n theme: string;\r\n commentId?: string;\r\n onCommentBoxInitialized?: (commentBox: HTMLDivElement) => void\r\n}\r\n\r\ninterface CommentBoxState {\r\n value: string,\r\n showActions: boolean,\r\n lastTypedTime?: Date,\r\n lastBroadcastTypingTime?: Date,\r\n newCommentVisibleStatus: string,\r\n newCommentErrorMessage: string,\r\n remainingCharsCount: number,\r\n disabledHasClicked: boolean,\r\n disabled: boolean,\r\n focused: boolean,\r\n commentBoxFocusRoot: string,\r\n profileEducatorVisible: boolean;\r\n}\r\n\r\nclass CommentBox extends React.Component {\r\n _isMounted = false;\r\n commentBoxRef: HTMLDivElement;\r\n containerRef: React.RefObject;\r\n signInRef: HTMLAnchorElement;\r\n telemetryObjects: CommentBoxTelemetryObjects;\r\n\r\n private static maxCharsLimit = 2000;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n value: \"\",\r\n showActions: false,\r\n lastTypedTime: undefined,\r\n lastBroadcastTypingTime: undefined,\r\n newCommentVisibleStatus: enums.visibleStatusType.Normal,\r\n newCommentErrorMessage: null,\r\n remainingCharsCount: CommentBox.maxCharsLimit,\r\n disabledHasClicked: false,\r\n disabled: false,\r\n focused: false,\r\n commentBoxFocusRoot: \"keyboard\",\r\n profileEducatorVisible: this.shouldRenderProfileEducator()\r\n };\r\n this.commentBoxRef = null;\r\n this.containerRef = React.createRef();\r\n this.signInRef = null;\r\n this.handleChange = this.handleChange.bind(this);\r\n }\r\n\r\n handleChange(e) {\r\n if (!e || !(this.commentBoxRef && this.state.focused)) { return; }\r\n\r\n e.stopPropagation();\r\n\r\n const charsCount = this.commentBoxRef.innerText.length;\r\n this.setState({showActions: charsCount > 0, remainingCharsCount: CommentBox.maxCharsLimit - charsCount});\r\n\r\n if (this.state.remainingCharsCount <= 0) {\r\n e.preventDefault();\r\n }\r\n\r\n if (!this.state.lastTypedTime || new Date().getTime() - this.state.lastTypedTime.getTime() > 20000) { // if 20sec passed since last recorded time\r\n this.setState({lastTypedTime: new Date()});\r\n }\r\n\r\n if (!this.state.lastBroadcastTypingTime || new Date().getTime() - this.state.lastBroadcastTypingTime.getTime() > 3000) {\r\n this.setState({lastBroadcastTypingTime: new Date()});\r\n if (this.props.broadcastAsTyping && this.props.me && this.props.me.isSocialUser) {\r\n this.props.broadcastAsTyping(this.props.id, this.props.market, this.props.content);\r\n }\r\n }\r\n }\r\n\r\n clear(keepCursorInBox) {\r\n if (this.commentBoxRef) {\r\n this.commentBoxRef.innerText = \"\";\r\n keepCursorInBox && this.commentBoxRef.focus();\r\n }\r\n this.setState({showActions: false, remainingCharsCount: CommentBox.maxCharsLimit });\r\n }\r\n\r\n async submitComment(e) {\r\n if (!this.state.disabled) {\r\n commentBoxTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.sendComment);\r\n\r\n e.stopPropagation();\r\n\r\n this.commentBoxRef.innerHTML = this.commentBoxRef.innerHTML.replace(/()/g, \"\").trim();\r\n\r\n this.setState({disabled: true, newCommentErrorMessage: undefined});\r\n const comment = await this.props.submitCommentAndUpdateState(this.commentBoxRef.innerText);\r\n this.setState({disabled: undefined});\r\n\r\n if (comment && comment.errorCode !== undefined) {\r\n this.setState({ newCommentErrorMessage: this.getErrorMessageFromCodes(comment.errorCode, comment.errorSubCodes)});\r\n } else if (comment) {\r\n if (comment.visibleStatus == enums.visibleStatusType.Normal || comment.visibleStatus == enums.visibleStatusType.InReview) {\r\n this.clear(false);\r\n }\r\n\r\n this.setState({ newCommentVisibleStatus: comment.visibleStatus});\r\n }\r\n }\r\n }\r\n\r\n placeCaretAtEnd(el) {\r\n el.focus();\r\n if (typeof window.getSelection != \"undefined\" && typeof document.createRange != \"undefined\") {\r\n const range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n const sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n listenKeyEvents(el) {\r\n if (!el || this._isMounted) {\r\n return;\r\n }\r\n this._isMounted = true;\r\n const capture = {\r\n capture: true\r\n };\r\n this.commentBoxRef = el;\r\n this.commentBoxRef.addEventListener(\"keyup\", this.handleChange, capture);\r\n this.commentBoxRef.addEventListener(\"keyupCapture\", this.handleChange, capture);\r\n this.commentBoxRef.addEventListener(\"keypress\", this.handleChange, capture);\r\n this.commentBoxRef.addEventListener(\"keypressCapture\", this.handleChange, capture);\r\n if (this.props.commentBoxType == \"Reply\") {\r\n this.placeCaretAtEnd(this.commentBoxRef);\r\n }\r\n if (this.props.onCommentBoxInitialized) { this.props.onCommentBoxInitialized(this.commentBoxRef); }\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n if (this.commentBoxRef) {\r\n this.commentBoxRef.removeEventListener(\"keyup\", this.handleChange);\r\n this.commentBoxRef.removeEventListener(\"keyupCapture\", this.handleChange);\r\n this.commentBoxRef.removeEventListener(\"keypress\", this.handleChange);\r\n this.commentBoxRef.removeEventListener(\"keypressCapture\", this.handleChange);\r\n }\r\n }\r\n\r\n handleSignInClick(e) {\r\n\r\n commentBoxTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.signIn);\r\n this.props.popupConnector.openPopup(\"multiLoginPage\", { contentId: this.props.content.id, focusBackRef: this.signInRef});\r\n }\r\n\r\n commentBoxClickHandler(e, isDisabled) {\r\n const me = this.props.me;\r\n\r\n if (me.state == enums.userStateType.newUser) {\r\n this.props.popupConnector.openPopup(\"onboardingPage\", { contentId: this.props.content.id });\r\n } else if (me.state == enums.userStateType.anonymous) {\r\n this.handleSignInClick(e);\r\n } else if (isDisabled) {\r\n this.setState({ disabledHasClicked: true });\r\n }\r\n }\r\n\r\n commentBoxPasteHandler(e) {\r\n let content;\r\n e.preventDefault();\r\n\r\n if (e.clipboardData) {\r\n content = e.clipboardData.getData(\"text/plain\");\r\n document.execCommand(\"insertText\", false, content);\r\n } else if (window.clipboardData) {\r\n content = window.clipboardData.getData(\"Text\");\r\n if (window.getSelection) { window.getSelection().getRangeAt(0).insertNode(document.createTextNode(content)); }\r\n }\r\n\r\n this.commentBoxRef.innerText = this.commentBoxRef.innerText.substring(0, CommentBox.maxCharsLimit + 1);\r\n }\r\n\r\n getErrorMessageFromCodes(code, subCodes): string {\r\n const maxSubCode = subCodes && subCodes.length > 0 ? Math.max(...subCodes) : null;\r\n\r\n if (enums.newCommentErrorCodeMap[code] && enums.newCommentErrorCodeMap[code][maxSubCode]) {\r\n return enums.newCommentErrorCodeMap[code][maxSubCode];\r\n } else if (enums.newCommentErrorCodeMap[code]) {\r\n return enums.newCommentErrorCodeMap[code];\r\n } else {\r\n return enums.newCommentErrorCodeMap[0];\r\n }\r\n }\r\n\r\n getPlaceholderText() {\r\n const { me, t, commentBoxType, isFirstCommenter, content } = this.props;\r\n\r\n if (content.isExpired) {\r\n return t.CommentBoxPlaceholderExpired;\r\n }\r\n\r\n if (me.state == enums.userStateType.anonymous) {\r\n return t.CommentBoxPlaceholderAnonymousUser;\r\n } else if (me.state == enums.userStateType.newUser) {\r\n return t.CommentBoxPlaceholderNewUser;\r\n } else if (me.isBanned) {\r\n return t.CommentBoxPlaceholderBannedUser;\r\n } else if (me.nameStatus == enums.userNameStatusType.notAllow) {\r\n return t.CommentBoxPlaceholderNameNotAllow;\r\n } else if (commentBoxType == \"Comment\") {\r\n if (isFirstCommenter) {\r\n return t.CommentBoxPlaceholderFirstComment;\r\n }\r\n return t.CommentBoxPlaceholderMsg;\r\n } else {\r\n return t.CommentBoxPlaceholderReply;\r\n }\r\n }\r\n\r\n getAvatarAltText() {\r\n const { me, t } = this.props;\r\n\r\n if (me.nameStatus == enums.userNameStatusType.notAllow) {\r\n return t.NameNotAllowTip.replace(\"{#}\", me.name);\r\n } else if (me.avatarStatus == enums.userAvatarStatusType.notAllow) {\r\n return t.AvatarNotAllowTip;\r\n } else if (me.nameStatus == enums.userNameStatusType.inReview) {\r\n return t.NameInReviewTip;\r\n } else if (me.avatarStatus == enums.userAvatarStatusType.inReview) {\r\n return t.AvatarInReviewTip;\r\n } else if (me.isBanned) {\r\n return t.UserBannedTip;\r\n } else {\r\n return t.AvatarAltText;\r\n }\r\n }\r\n\r\n handleFocus(e) {\r\n this.setState({focused: true});\r\n\r\n if (this.state.commentBoxFocusRoot == \"keyboard\") {\r\n const el = e.target;\r\n const range = document.createRange();\r\n range.selectNodeContents(el);\r\n const sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n\r\n render() {\r\n const {componentConnector, commentBoxType, parentType, parentUser, me, t, managedClasses, market, content, mainTelemetryObject, theme, commentId} = this.props;\r\n\r\n if (!me || !content) { return null; }\r\n\r\n const avatarUrl = me.state != enums.userStateType.newUser && me.avatarStatus == enums.userAvatarStatusType.normal ? me.avatarUrl || placeholderImages.avatar : placeholderImages.avatar;\r\n const placeholderText = this.getPlaceholderText();\r\n const meHasInReviewInfo = (me.avatarStatus == enums.userAvatarStatusType.inReview || me.nameStatus == enums.userNameStatusType.inReview);\r\n const meHasNotAllowInfo = (me.avatarStatus == enums.userAvatarStatusType.notAllow || me.nameStatus == enums.userNameStatusType.notAllow || (!meHasInReviewInfo && me.isBanned));\r\n const disabled = me.state != enums.userStateType.existingUser || content.isExpired || me.isBanned || this.state.disabled || me.nameStatus == enums.userNameStatusType.notAllow;\r\n const isDeleted = this.state.newCommentVisibleStatus != enums.visibleStatusType.Normal &&\r\n [enums.visibleStatusType.DeletedByAI,\r\n enums.visibleStatusType.DeletedByHI,\r\n enums.visibleStatusType.DeletedByUser].includes(this.state.newCommentVisibleStatus);\r\n const isInReview = this.state.newCommentVisibleStatus == enums.visibleStatusType.InReview;\r\n const hasDeniedMessage = this.state.newCommentErrorMessage && (t[this.state.newCommentErrorMessage] || t[enums.newCommentErrorCodeMap[0]]);\r\n\r\n /** Telemetry */\r\n this.telemetryObjects = {\r\n postViolationAI: addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.postViolationAI, { id: commentId || \"\" }, this.telemetryObjects && this.telemetryObjects.postViolationAI),\r\n postHumanReview: addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.postHumanReview, { id: commentId || \"\" }, this.telemetryObjects && this.telemetryObjects.postHumanReview),\r\n sendComment: commentBoxType == \"Comment\"\r\n ? addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.sendComment, { id: content && content.cmsId }, this.telemetryObjects && this.telemetryObjects.sendComment)\r\n : addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.sendReply, { id: commentId || \"\"}, this.telemetryObjects && this.telemetryObjects.sendComment),\r\n signIn: addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.signIn, { id: content && content.cmsId }, this.telemetryObjects && this.telemetryObjects.signIn),\r\n userAvatarLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentBoxTelemetryContracts.profileLink}, { id: me.traceId, headline: me.name}, this.telemetryObjects && this.telemetryObjects.userAvatarLink),\r\n bannedViewSelfProfileLink: addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.profileLink, { id: me.id }, this.telemetryObjects && this.telemetryObjects.bannedViewSelfProfileLink),\r\n editProfileLink: addOrUpdateTelemetryObject(mainTelemetryObject, commentBoxTelemetryContracts.editProfileLink, { id: me.id }, this.telemetryObjects && this.telemetryObjects.editProfileLink)\r\n };\r\n\r\n return (\r\n
\r\n
\r\n {this.state.profileEducatorVisible && commentBoxType == \"Comment\" &&\r\n this.setState({profileEducatorVisible: false})}\r\n />\r\n }\r\n
\r\n \r\n { avatarFallback(e); }}\r\n />\r\n \r\n { meHasInReviewInfo &&\r\n {ellipsis2} \r\n }\r\n {(meHasNotAllowInfo || content.isExpired) &&\r\n {exclamation} \r\n }\r\n
\r\n this.listenKeyEvents(el)}\r\n placeholder = { placeholderText}\r\n suppressContentEditableWarning={true}\r\n role=\"textbox\"\r\n aria-label={t.AriaLabelsCommentBox}\r\n aria-multiline={!disabled}\r\n aria-readonly={disabled}\r\n onClick={ e => this.commentBoxClickHandler(e, disabled)}\r\n onPaste={ e => this.commentBoxPasteHandler(e)}\r\n onFocus={ e => { this.handleFocus(e); }}\r\n onKeyDown={ e => { this.setState({commentBoxFocusRoot: \"keyboard\"}); }}\r\n onMouseEnter={ e => { this.setState({commentBoxFocusRoot: \"mouse\"}); }}\r\n onBlur={() => this.setState({focused: false})}\r\n >\r\n {commentBoxType == \"Comment\" || parentType == \"Comment\" ? \"\" :\r\n \r\n {parentUser.name}\r\n  \r\n \r\n }\r\n
\r\n\r\n
\r\n { this.state.showActions &&\r\n \r\n this.clear(true)} >\r\n {close2}\r\n \r\n this.submitComment(e)} {...renderHybrid(this.telemetryObjects.sendComment, false)}>\r\n {send}\r\n \r\n \r\n }\r\n { me.state == enums.userStateType.anonymous &&\r\n this.handleSignInClick(e)} {...renderHybrid(this.telemetryObjects.signIn, false, (el) => { this.signInRef = el; })}>\r\n {t.CommentBoxButtonSignIn}\r\n \r\n }\r\n { (me.nameStatus == enums.userNameStatusType.notAllow || me.avatarStatus == enums.userAvatarStatusType.notAllow) &&\r\n \r\n {me.nameStatus == enums.userNameStatusType.notAllow ? t.CommentBoxButtonChangeName : t.CommentBoxButtonEditProfile}\r\n \r\n }\r\n { me.isBanned &&\r\n \r\n {t.CommentBoxButtonViewProfile}\r\n \r\n }\r\n
\r\n
\r\n\r\n {this.state.remainingCharsCount < 100 &&
{this.state.remainingCharsCount > 0 ? String.Format(t.CommentBoxCharsRemaining, {remainingCharsCount: this.state.remainingCharsCount}) : t.CommentBoxCharsLimitReached }
}\r\n\r\n { isDeleted && }\r\n\r\n { isInReview && }\r\n\r\n { hasDeniedMessage && }\r\n\r\n \r\n );\r\n }\r\n\r\n shouldRenderProfileEducator() {\r\n const { me } = this.props;\r\n return me && me.isSocialUser && !getLocalStorage().getItem(enums.profileVisitedLocalStorageKey);\r\n }\r\n}\r\nconst mapStateToProps = (state: SocialCommentState) => {\r\n return { id: state.id };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CommentBox);\r\nexport { CommentBox as CommentBoxBase };\r\n\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface DeleteMenuTelemetryObjects {\r\n yesButton: TelemetryObjectBase;\r\n cancelButton: TelemetryObjectBase;\r\n deleteMenu: TelemetryObjectBase;\r\n}\r\n\r\nexport const deleteMenuTelemetryContracts = {\r\n /** Comments-Scenario-10d */\r\n yesButton: {\r\n name: \"CommentDelete\",\r\n behavior: TelemetryBehaviorType.Remove,\r\n content: {\r\n headline: \"Yes\",\r\n type: TelemetryContentType.Comment\r\n }\r\n },\r\n cancelButton: {\r\n name: \"CommentDelete\",\r\n behavior: TelemetryBehaviorType.Remove,\r\n content: {\r\n headline: \"Cancel\",\r\n type: TelemetryContentType.Comment\r\n }\r\n },\r\n /** Comments-Scenario-10c */\r\n deleteMenu: {\r\n name: \"CommentDelete\",\r\n content: { type: TelemetryContentType.Comment }\r\n }\r\n};\r\n\r\nexport const deleteMenuTelemetryActionDispatchers = {\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { deleteMenuTelemetryActionDispatchers, deleteMenuTelemetryContracts, DeleteMenuTelemetryObjects } from \"./DeleteMenu.telemetry\";\r\n\r\nexport interface DeleteMenuProps extends SocialPopoverProps {\r\n id: string;\r\n managedClasses?: SocialCommentClassNameContract;\r\n onConfirmDelete?: (any) => void;\r\n t: SocialCommentLocalizedStrings;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n}\r\n\r\ninterface DeleteMenuState {\r\n visible: boolean\r\n}\r\n\r\nexport default class DeleteMenu extends React.Component {\r\n telemetryObjects: DeleteMenuTelemetryObjects;\r\n containerRef: HTMLDivElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = { visible: true };\r\n this.containerRef = null;\r\n }\r\n\r\n componentDidMount() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n cancelHandler(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n this.props.onHide();\r\n deleteMenuTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.cancelButton);\r\n const ref = window.document.getElementById(`deleteMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(() => { ref.focus(); }, 50);\r\n }\r\n }\r\n\r\n yesHandler(e) {\r\n deleteMenuTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.yesButton);\r\n this.props.onConfirmDelete(e);\r\n }\r\n\r\n handleKeyDown(e) {\r\n if (e.keyCode == 27) { /* ESC key */\r\n const ref = window.document.getElementById(`deleteMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(() => { ref.focus(); }, 50);\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.props.onHide();\r\n } else if (e.keyCode == 38) { /* Up arrow */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const prev = e.target.previousElementSibling;\r\n if (prev) {\r\n prev.focus();\r\n } else {\r\n e.target.parentElement.lastElementChild.focus();\r\n }\r\n } else if (e.keyCode == 40) { /* Down arrow */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const next = e.target.nextElementSibling;\r\n if (next) {\r\n next.focus();\r\n } else {\r\n e.target.parentElement.firstElementChild.focus();\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { managedClasses, t, id, mainTelemetryObject } = this.props;\r\n\r\n /** Generate Telemetry Objects */\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n yesButton: addOrUpdateTelemetryObject(mainTelemetryObject, deleteMenuTelemetryContracts.yesButton, { id }, this.telemetryObjects && this.telemetryObjects.yesButton),\r\n cancelButton: addOrUpdateTelemetryObject(mainTelemetryObject, deleteMenuTelemetryContracts.cancelButton, { id }, this.telemetryObjects && this.telemetryObjects.cancelButton),\r\n deleteMenu: addOrUpdateTelemetryObject(mainTelemetryObject, deleteMenuTelemetryContracts.deleteMenu, { id }, this.telemetryObjects && this.telemetryObjects.deleteMenu)\r\n };\r\n }\r\n\r\n return (\r\n \r\n
{ this.containerRef = el; })}\r\n onKeyDown={(e) => { this.handleKeyDown(e); }}>\r\n \r\n {t.DeleteMenuDeleteComment}\r\n \r\n
    \r\n
  • this.yesHandler(e)} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.yesButton, false)}>\r\n {t.DeleteMenuDeleteCommentConfirm}\r\n
  • \r\n
  • this.cancelHandler(e)} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.cancelButton, false)}>\r\n {t.DeleteMenuDeleteCommentCancel}\r\n
  • \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryEventMap, dispatchTelemetryEvent, genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface ReactionPanelTelemetryObjects {\r\n likeButton: TelemetryObjectBase;\r\n activeReactionButton: TelemetryObjectBase;\r\n reactionsParent: TelemetryObjectBase;\r\n socialbarParent: TelemetryObjectBase;\r\n}\r\n\r\nexport const reactionPanelTelemetryContracts = {\r\n socialbarParent: {\r\n name: \"Socialbar\",\r\n content: {\r\n type: TelemetryContentType.Comment\r\n }\r\n },\r\n reactionsParent: {\r\n name: \"Reaction\",\r\n content: {\r\n type: TelemetryContentType.Comment\r\n }\r\n },\r\n likeButton: { // Scenario 2 click, Scenario 2a hover\r\n name: \"Like\",\r\n behavior: TelemetryBehaviorType.Like, // dynamically updated\r\n content: {\r\n type: TelemetryContentType.Comment,\r\n headline: \"Like\" // dynamically updated\r\n }\r\n }\r\n};\r\n\r\nexport const reactionPanelTelemetryActionDispatchers = {\r\n likeButtonClick: genericTelemetryClickDispatcher,\r\n likeButtonHover: (element: any, telemetryObject: any): void => {\r\n const behavior = TelemetryBehaviorType.Show;\r\n const telemetryEventDispatcherInfo = {\r\n ...TelemetryEventMap.genericHover,\r\n contract: {...(telemetryObject && telemetryObject.contract), behavior}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element);\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryObjectBase, TelemetryType } from \"@msnews/telemetry-contracts\";\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface ReactionMenuTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n emojis: TelemetryObjectBase[];\r\n}\r\n\r\nexport const reactionMenuTelemetryContracts = {\r\n container: { // ContentReaction>Scenario 2b impr\r\n name: \"ReactionsPopup\"\r\n },\r\n emojis: { // ContentReaction>Scenario 2c & CommentReactions Scenario 2x\r\n type: TelemetryType.ActionButton\r\n }\r\n};\r\n\r\nexport const reactionMenuTelemetryActionDispatchers = {\r\n emojiClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport { ReactionMenuTelemetryObjects, reactionMenuTelemetryActionDispatchers, reactionMenuTelemetryContracts } from \"./ReactionMenu.telemetry\";\r\nimport { enums, renderEmojiByType, ReactionToBehaviorTypeMap, TelemetryEventMap, addOrUpdateTelemetryObject, dispatchTelemetryEvent, getHeadlineByReactionType, getPageContentType, renderHybrid } from \"@msnews/social-utils\";\r\n\r\nimport React from \"react\";\r\nimport { ReactionMenuTouchSlideHandler } from \"@msnews/social-interaction-helpers\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nexport interface ReactionMenuProps extends SocialPopoverProps {\r\n onReaction: (key: string) => void;\r\n onShow?: (target: any, isHover: boolean) => void;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n t: SocialCommentLocalizedStrings;\r\n rating?: string;\r\n triggerElements?: Array;\r\n visible?: boolean;\r\n managedClasses?: SocialCommentClassNameContract;\r\n}\r\nexport default class ReactionMenu extends React.Component {\r\n public static lastHiddenTime = 1;\r\n public static touchEnabled = false;\r\n\r\n telemetryObjects: ReactionMenuTelemetryObjects;\r\n containerRef: HTMLDivElement;\r\n triggerRef: HTMLElement;\r\n touchSlideHandler: ReactionMenuTouchSlideHandler;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n this.triggerHoverHandler = this.triggerHoverHandler.bind(this);\r\n this.triggerTouchStartHandler = this.triggerTouchStartHandler.bind(this);\r\n this.triggerClickHandler = this.triggerClickHandler.bind(this);\r\n this.touchSlideHandler = new ReactionMenuTouchSlideHandler({\r\n onSlideStart: (target) => {\r\n ReactionMenu.touchEnabled = true;\r\n this.props.onShow && this.props.onShow(target, true);\r\n },\r\n onSlideEnd: () => this.hide(),\r\n onLongpress: (target) => {\r\n ReactionMenu.touchEnabled = true;\r\n this.props.onShow && this.props.onShow(target, true);\r\n },\r\n onLongpressEnd: () => this.hide(),\r\n onTouchEnd: () => { ReactionMenu.touchEnabled = false; }\r\n },\r\n {\r\n onEmojiFocus: (el: HTMLElement) => el.classList.add(\"touchFocused\"),\r\n onEmojiBlur: (el: HTMLElement) => el.classList.remove(\"touchFocused\")\r\n }, \".cwt-link.cwt-icon\");\r\n }\r\n\r\n componentDidMount() {\r\n if (this.containerRef) {\r\n dispatchTelemetryEvent({...TelemetryEventMap.genericLoaded, sendPeregrine: true}, this.containerRef);\r\n }\r\n\r\n this.registerHandlers(this.props.triggerElements);\r\n }\r\n\r\n componentDidUpdate(nextProps: ReactionMenuProps) {\r\n this.registerHandlers(this.props.triggerElements);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.touchSlideHandler.dispose();\r\n this.unregisterHandlers(this.props.triggerElements);\r\n }\r\n\r\n render() {\r\n if (!this.props.visible || (this.props.isHover && !this.triggerRef)) { return null; }\r\n const {t, isHover, managedClasses} = this.props;\r\n\r\n this.generateOrUpdateTelemetryObjects();\r\n\r\n return (\r\n \r\n
{ this.containerRef = el; })}>\r\n {enums.reactionOrder.map((key) =>\r\n this.reactionClickHandler(e.currentTarget, key)}\r\n data-title={t[`EmojiLabel${key}`]}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.emojis && this.telemetryObjects.emojis[key], false)}\r\n >\r\n {renderEmojiByType(key)}\r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n\r\n // :: ReactionMenu specific methods\r\n reactionClickHandler(target, key) {\r\n if (!this.props.visible) { return; }\r\n\r\n reactionMenuTelemetryActionDispatchers.emojiClick(target, this.telemetryObjects && this.telemetryObjects.emojis[key]);\r\n this.props.onReaction(key);\r\n this.hide();\r\n }\r\n hide() {\r\n ReactionMenu.lastHiddenTime = (new Date()).getTime();\r\n this.props && this.props.onHide && setTimeout(() => { this.props.onHide(); }, 10);\r\n }\r\n\r\n // :: Trigger element handlers\r\n triggerHoverHandler(e) {\r\n this.triggerRef = e.currentTarget;\r\n this.setState({});\r\n\r\n if ((new Date()).getTime() - ReactionMenu.lastHiddenTime < 225) { return; }\r\n this.props && this.props.onShow && this.props.onShow(e.currentTarget, true);\r\n }\r\n triggerTouchStartHandler(e) {\r\n this.triggerRef = e.currentTarget;\r\n this.setState({});\r\n this.touchSlideHandler.setupTriggerAtTouchStart(e);\r\n }\r\n triggerClickHandler(e) {\r\n !ReactionMenu.touchEnabled && this.hide();\r\n }\r\n\r\n // :: Event attachers to trigger element\r\n registerHandlers(triggerRefs: Array) {\r\n this.containerRef && this.touchSlideHandler.setReactionMenuContainer(this.containerRef);\r\n\r\n setTimeout(() => {\r\n triggerRefs && triggerRefs.map(ref => {\r\n if (!ref || ref.getAttribute(\"data-trigger-reqistered\")) { return; }\r\n ref.setAttribute(\"data-trigger-reqistered\", \"1\");\r\n ref.addEventListener(\"mouseenter\", this.triggerHoverHandler);\r\n ref.addEventListener(\"click\", this.triggerClickHandler);\r\n ref.addEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n });\r\n }, 10);\r\n }\r\n unregisterHandlers(triggerRefs: Array) {\r\n this.touchSlideHandler.dispose();\r\n\r\n triggerRefs && triggerRefs.map(ref => {\r\n if (!ref || !ref.getAttribute(\"data-trigger-reqistered\")) { return; }\r\n ref.removeAttribute(\"data-trigger-reqistered\");\r\n ref.removeEventListener(\"mouseenter\", this.triggerHoverHandler);\r\n ref.removeEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n });\r\n }\r\n\r\n generateOrUpdateTelemetryObjects() {\r\n const { mainTelemetryObject, rating } = this.props;\r\n\r\n if (mainTelemetryObject) {\r\n const id = mainTelemetryObject.contract.content.id;\r\n const type = mainTelemetryObject.contract.content.type? mainTelemetryObject.contract.content.type : getPageContentType();\r\n\r\n this.telemetryObjects = {\r\n container: addOrUpdateTelemetryObject(mainTelemetryObject, {...reactionMenuTelemetryContracts.container}, { id, type }, this.telemetryObjects && this.telemetryObjects.container),\r\n emojis: []\r\n };\r\n\r\n enums.reactionOrder.map((key) => {\r\n const headline = getHeadlineByReactionType(key, key == rating);\r\n const behavior = ReactionToBehaviorTypeMap[key];\r\n this.telemetryObjects.emojis[key] = addOrUpdateTelemetryObject(mainTelemetryObject, {...reactionMenuTelemetryContracts.emojis, name: headline, behavior}, { id, type, headline }, this.telemetryObjects && this.telemetryObjects.emojis && this.telemetryObjects.emojis[key]);\r\n });\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, chevron_down, comment, enums, getReactionColorClass, renderEmojiByType, stopPropagationAndPreventDefault, thumbs_up, ReactionToBehaviorTypeMap, addOrUpdateTelemetryObject, getHeadlineByReactionType, renderHybrid } from \"@msnews/social-utils\";\r\nimport { ReactionPanelTelemetryObjects, reactionPanelTelemetryActionDispatchers, reactionPanelTelemetryContracts } from \"./ReactionPanel.telemetry\";\r\n\r\nimport React from \"react\";\r\nimport ReactionMenu from \"../reaction-menu/ReactionMenu\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nexport interface ReactionPanelProps {\r\n managedClasses?: SocialCommentClassNameContract;\r\n rating: string;\r\n onReaction: (type: string) => void;\r\n t: SocialCommentLocalizedStrings;\r\n replyLabel?: JSX.Element;\r\n onReplyClick: (target: HTMLElement) => void;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n showCommentsButton?: boolean;\r\n reactionMenuClassName?: string;\r\n responsiveClass?: string;\r\n}\r\n\r\ninterface ReactionPanelState {\r\n reactionMenuVisible: boolean;\r\n isHoverReactionPanel: boolean;\r\n}\r\n\r\nexport default class ReactionPanel extends React.Component {\r\n reactionMenuTriggerRefs: Array;\r\n containerRef: React.RefObject;\r\n telemetryObjects: ReactionPanelTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n reactionMenuVisible: false,\r\n isHoverReactionPanel: true\r\n };\r\n this.containerRef = React.createRef();\r\n this.reactionMenuTriggerRefs = [];\r\n }\r\n\r\n componentDidUpdate() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n onLikeBtnClick(e, telemetryObject) {\r\n // Right Click Detection\r\n if (\"which\" in e && e.which == 3) { return; } else if (\"button\" in e && e.button == 2) { return; }\r\n\r\n const currentRating = this.props.rating || enums.reactions.like;\r\n this.props.onReaction(currentRating);\r\n\r\n this.setState({ reactionMenuVisible: false });\r\n reactionPanelTelemetryActionDispatchers.likeButtonClick(e.currentTarget, telemetryObject);\r\n }\r\n\r\n onReactionMenuShow(target, isHover) {\r\n this.setState({ reactionMenuVisible: true, isHoverReactionPanel: isHover });\r\n reactionPanelTelemetryActionDispatchers.likeButtonHover(target, this.telemetryObjects.likeButton);\r\n }\r\n\r\n onReactionMenuHide() {\r\n this.setState({reactionMenuVisible: false, isHoverReactionPanel: true});\r\n }\r\n\r\n reactionHandler(type) {\r\n this.props.onReaction(type);\r\n }\r\n\r\n render() {\r\n const {t, rating, replyLabel, onReplyClick, managedClasses, showCommentsButton, reactionMenuClassName, responsiveClass, mainTelemetryObject} = this.props;\r\n const {reactionMenuVisible, isHoverReactionPanel} = this.state;\r\n\r\n this.generateOrUpdateTelemetryObjects();\r\n\r\n return (\r\n \r\n stopPropagationAndPreventDefault(e)}\r\n onMouseMove={e => stopPropagationAndPreventDefault(e)}\r\n onTouchStart={e => stopPropagationAndPreventDefault(e)}\r\n onTouchMove={e => stopPropagationAndPreventDefault(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.reactionsParent, false)}\r\n >\r\n { this.reactionMenuTriggerRefs.length > 0 &&\r\n this.reactionHandler(type)}\r\n onHide={() => this.onReactionMenuHide()}\r\n visible={reactionMenuVisible}\r\n onShow={(target, isHover) => this.onReactionMenuShow(target, isHover)}\r\n isHover={isHoverReactionPanel}\r\n triggerElements={ this.reactionMenuTriggerRefs}\r\n {...{managedClasses, mainTelemetryObject, t, rating, responsiveClass}}\r\n />\r\n }\r\n !ReactionMenu.touchEnabled && this.onLikeBtnClick(e, this.telemetryObjects && this.telemetryObjects.likeButton)}\r\n data-has-over={reactionMenuVisible}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.likeButton, false, el => this.reactionMenuTriggerRefs[0] = el)}\r\n >\r\n {thumbs_up}\r\n {t.EmojiLabellike}\r\n \r\n !ReactionMenu.touchEnabled && this.onLikeBtnClick(e, this.telemetryObjects && this.telemetryObjects.activeReactionButton)}\r\n data-has-over={reactionMenuVisible}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.activeReactionButton, false, el => this.reactionMenuTriggerRefs[1] = el)}\r\n >\r\n {renderEmojiByType(rating)}\r\n {(rating ? t[`EmojiLabel${rating}`] : \"\")}\r\n \r\n this.setState({reactionMenuVisible: true, isHoverReactionPanel: false})}> {chevron_down} \r\n {showCommentsButton &&\r\n onReplyClick(e.currentTarget)}>\r\n {comment}\r\n {replyLabel || t.CommentReplyBtn}\r\n \r\n }\r\n \r\n \r\n );\r\n }\r\n\r\n generateOrUpdateTelemetryObjects() {\r\n const { mainTelemetryObject, rating } = this.props;\r\n\r\n if (mainTelemetryObject) {\r\n const id = mainTelemetryObject.contract.content.id;\r\n const headline = (rating && getHeadlineByReactionType(rating, true));\r\n const behavior = (rating && ReactionToBehaviorTypeMap[rating]);\r\n const socialbarParentTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, {...reactionPanelTelemetryContracts.socialbarParent}, { id }, this.telemetryObjects && this.telemetryObjects.socialbarParent);\r\n\r\n this.telemetryObjects = {\r\n socialbarParent: socialbarParentTelemetryObject,\r\n reactionsParent: addOrUpdateTelemetryObject(socialbarParentTelemetryObject, {...reactionPanelTelemetryContracts.reactionsParent}, { id }, this.telemetryObjects && this.telemetryObjects.reactionsParent),\r\n likeButton: addOrUpdateTelemetryObject(socialbarParentTelemetryObject, {...reactionPanelTelemetryContracts.likeButton}, { id }, this.telemetryObjects && this.telemetryObjects.likeButton),\r\n activeReactionButton: !rating && this.telemetryObjects ? this.telemetryObjects.activeReactionButton : addOrUpdateTelemetryObject(socialbarParentTelemetryObject, {...reactionPanelTelemetryContracts.likeButton, name: headline, behavior}, { id, headline }, this.telemetryObjects && this.telemetryObjects.activeReactionButton)\r\n };\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface ReportMenuTelemetryObjects {\r\n reportItems: TelemetryObjectBase[];\r\n reportMenu: TelemetryObjectBase;\r\n}\r\n\r\nexport const reportMenuTelemetryContracts = {\r\n /**\r\n * Comments-Scenario-10b\r\n * headline: dynamically set for each report reason\r\n * */\r\n reportItem: {\r\n name: \"Report\",\r\n behavior: TelemetryBehaviorType.Report,\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n /** Comments-Scenario-10ai */\r\n reportMenu: {\r\n name: \"ReportedReason\",\r\n content: { type: TelemetryContentType.Comment }\r\n }\r\n};\r\n\r\nexport const reportMenuTelemetryActionDispatchers = {\r\n reportItemClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { SocialService, User } from \"@msnews/social-data-service\";\r\nimport { AccessibilityHelpers, enums, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { PopupConnector, UsersConnector } from \"../../SocialComment.props\";\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport { reportMenuTelemetryActionDispatchers, reportMenuTelemetryContracts, ReportMenuTelemetryObjects } from \"./ReportMenu.telemetry\";\r\n\r\nexport interface ReportMenuProps extends SocialPopoverProps {\r\n managedClasses?: SocialCommentClassNameContract;\r\n onReport?: (key: string, e: any) => void;\r\n t: SocialCommentLocalizedStrings;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n theme?: string;\r\n popupConnector?: PopupConnector;\r\n usersConnector?: UsersConnector;\r\n id?: string;\r\n renderInPopover?: boolean;\r\n me?: User;\r\n}\r\n\r\nexport default class ReportMenu extends React.Component {\r\n telemetryObjects: ReportMenuTelemetryObjects;\r\n containerRef: HTMLUListElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n }\r\n\r\n componentDidMount() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n\r\n if (!this.props.me) { this.props.usersConnector.fetchMe(); }\r\n }\r\n\r\n render() {\r\n if (!this.props.me) { return null; }\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n reportItems: (this.telemetryObjects && this.telemetryObjects.reportItems) || [],\r\n reportMenu: addOrUpdateTelemetryObject(this.props.mainTelemetryObject, reportMenuTelemetryContracts.reportMenu, { id: this.props.id || \"\"}, this.telemetryObjects && this.telemetryObjects.reportMenu)\r\n };\r\n\r\n return this.props.renderInPopover ? this.renderDefault() : this.renderMobile();\r\n }\r\n\r\n renderDefault() {\r\n return (\r\n \r\n
    { this.containerRef = el; })}\r\n >\r\n {this.renderReportItems()}\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderMobile() {\r\n return (\r\n
    { this.containerRef = el; })}\r\n >\r\n \r\n { this.props.t.CommentReportText }\r\n \r\n {this.renderReportItems()}\r\n
\r\n );\r\n }\r\n\r\n renderReportItems() {\r\n return Object.keys(enums.commentReportMap).map(key => {\r\n if (this.telemetryObjects.reportItems) {\r\n this.telemetryObjects.reportItems[key] = addOrUpdateTelemetryObject(this.telemetryObjects.reportMenu, {...reportMenuTelemetryContracts.reportItem}, { id: this.props.id, headline: key }, this.telemetryObjects.reportItems[key]);\r\n }\r\n\r\n return
  • this.reportHandler(key, e) } onKeyDown={(e) => { this.handleKeyDown(e); }} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.reportItems && this.telemetryObjects.reportItems[key], false)}>\r\n {this.props.t[enums.commentReportMap[key]]}\r\n
  • ;\r\n });\r\n }\r\n\r\n reportHandler(reportType, e) {\r\n reportMenuTelemetryActionDispatchers.reportItemClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.reportItems && this.telemetryObjects.reportItems[reportType]);\r\n const reportValue = enums.commentReportMap[reportType];\r\n if (reportValue == enums.commentReportMap.Copyright) {\r\n this.props.popupConnector.closePopup({disableBridge: true});\r\n if (this.props.me.state == enums.userStateType.anonymous) {\r\n this.props.popupConnector.openPopup(\"multiLoginPage\");\r\n } else {\r\n this.props.popupConnector.openPopup(\r\n reportValue == enums.commentReportMap.Copyright ? \"copyrightform\" : \"\",\r\n {id: this.props.id, fullScreen: false, onReport: this.props.onReport});\r\n }\r\n } else {\r\n SocialService.reportComment(this.props.id, reportType);\r\n this.props.onReport && this.props.onReport(reportType, e);\r\n this.props.popupConnector.closePopup();\r\n }\r\n }\r\n\r\n handleKeyDown(e) {\r\n if (e.keyCode == 27) { /* ESC key */\r\n const ref = window.document.getElementById(`reportMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(()=> { ref.focus(); }, 50);\r\n }\r\n e.stopPropagation();\r\n e.preventDefault();\r\n } else if (e.keyCode == 38) { /* Up arrow */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const prev = e.target.previousElementSibling;\r\n if (prev) {\r\n prev.focus();\r\n } else {\r\n e.target.parentElement.lastElementChild.focus();\r\n }\r\n } else if (e.keyCode == 40) { /* Down arrow */\r\n const next = e.target.nextElementSibling;\r\n if (next) {\r\n next.focus();\r\n } else {\r\n e.target.parentElement.firstElementChild.focus();\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Comment, Content, User } from \"@msnews/social-data-service\";\r\nimport { chevron_down, chevron_up } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { CommentConnector, ComponentConnector, FollowInfo, PopupConnector, UsersConnector } from \"../../SocialComment.props\";\r\nimport CommentBox from \"../comment-box/CommentBox\";\r\nimport CommentItem from \"../comment-item/CommentItem\";\r\n\r\nexport interface ReplyListProps {\r\n componentConnector: ComponentConnector;\r\n id: string;\r\n parentId: string;\r\n user: User;\r\n commentItemType: string;\r\n replies: Array;\r\n replyCount: number;\r\n repliesHasPrevious: boolean;\r\n repliesHasMore: boolean;\r\n commentConnector: CommentConnector;\r\n managedClasses?: SocialCommentClassNameContract;\r\n contentDisabled: boolean;\r\n me: User;\r\n usersConnector: UsersConnector;\r\n popupConnector: PopupConnector;\r\n users: { [id: string]: FollowInfo;}; // dictionary definening\r\n t: SocialCommentLocalizedStrings;\r\n hideReplyBox: () => void;\r\n showReplyBox: boolean;\r\n market: string;\r\n content: Content;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n theme: string;\r\n responsiveClass: string;\r\n specificCommentId?: string;\r\n}\r\n\r\nexport default class ReplyList extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.submitCommentAndUpdateState = this.submitCommentAndUpdateState.bind(this);\r\n }\r\n\r\n showReplies(e) {\r\n const top = 10;\r\n const skip = this.props.replies.filter($i => !$i.addedOffline).length || 0;\r\n const showMoreReplies = this.props.commentConnector.showMoreReplies;\r\n\r\n if (!showMoreReplies) { return console.warn(\"Props missing 'commentConnector.showMoreReplies'\"); }\r\n showMoreReplies(this.props.content.id, this.props.id, top, skip, \"Time asc\");\r\n }\r\n\r\n async submitCommentAndUpdateState(value) {\r\n const rootParentCommentId = this.props.parentId || this.props.id;\r\n const submitComment = this.props.commentConnector.submitComment;\r\n\r\n if (!submitComment) { return console.warn(\"Missing props 'commentConnector.submitComment'\"); }\r\n const comment = await submitComment(this.props.content, value, rootParentCommentId, this.props.parentId ? this.props.id : undefined);\r\n\r\n if (comment && !comment.errorCode) {\r\n this.props.hideReplyBox();\r\n }\r\n\r\n return comment;\r\n }\r\n\r\n render() {\r\n const { componentConnector, responsiveClass, contentDisabled, me, t, managedClasses, commentConnector, replies, replyCount, repliesHasPrevious, repliesHasMore, commentItemType: parentType, user: parentUser, usersConnector, popupConnector, users, market, content, mainTelemetryObject, theme, id, specificCommentId } = this.props;\r\n const moreReplyCount = replyCount - (replies ? replies.filter($i => !$i.addedOffline).length : 0);\r\n const submitCommentAndUpdateState = this.submitCommentAndUpdateState.bind(this);\r\n const broadcastAsTyping = this.props.commentConnector.broadcastAsTyping;\r\n const commentItemType=\"Reply\";\r\n const commentBoxType=\"Reply\";\r\n const specificCommentMode = !!specificCommentId;\r\n return (\r\n
    \r\n {this.props.showReplyBox &&\r\n \r\n }\r\n\r\n {specificCommentMode && replies && repliesHasPrevious &&\r\n commentConnector.loadPreviousComments(content.id, replies[0].id, id)}\r\n >\r\n {chevron_up}\r\n {t.SpecificCommentModeSeePreviousRepliesTxt}\r\n \r\n }\r\n
      \r\n {replies && replies.map((item, index) =>\r\n \r\n )}\r\n
    \r\n {specificCommentMode && replies && repliesHasMore &&\r\n commentConnector.loadMoreComments(content.id, replies[replies.length-1].id, id)}\r\n >\r\n {chevron_down}\r\n {t.SpecificCommentModeSeeMoreRepliesTxt}\r\n \r\n }\r\n {((specificCommentMode && replies.length === 0 && moreReplyCount > 0) || (!specificCommentMode && moreReplyCount > 0)) &&\r\n this.showReplies(e)}>\r\n {chevron_down}\r\n \r\n { moreReplyCount < 2 ?\r\n t.SeeMoreRepliesTxt.replace(\"{#}\", `${moreReplyCount}`) :\r\n t.SeeMoreRepliesPluralTxt.replace(\"{#}\", `${moreReplyCount}`)\r\n }\r\n \r\n \r\n }\r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryActionType, TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryEventNames, dispatchTelemetryEvent } from \"@msnews/social-utils\";\r\n\r\nexport interface FollowButtonTelemetryObjects {\r\n followButton: TelemetryObjectBase;\r\n}\r\n\r\nexport const followButtonTelemetryContracts = {\r\n followButton: {\r\n name: \"FollowButton\",\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n }\r\n};\r\n\r\nexport const followButtonTelemetryActionDispatchers = {\r\n followButton: (element: any, isFollow: boolean, telemetryObject: TelemetryObjectBase): void => {\r\n const telemetryEventDispatcherInfo = {\r\n eventName: TelemetryEventNames.genericAction,\r\n contract: telemetryObject.contract,\r\n subTypes: {action: TelemetryActionType.Click, behavior: isFollow ? TelemetryBehaviorType.Follow : TelemetryBehaviorType.Unfollow}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element, null);\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { User } from \"@msnews/social-data-service\";\r\nimport { enums, hasThemeBase, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { SocialCommentClassNameContract } from \"../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../SocialComment.localizedStrings\";\r\nimport { FollowInfo, UsersConnector } from \"../SocialComment.props\";\r\nimport { SocialCommentState } from \"../SocialComment.state\";\r\nimport { followButtonTelemetryActionDispatchers, followButtonTelemetryContracts, FollowButtonTelemetryObjects } from \"./FollowButton.telemetry\";\r\n\r\nexport interface FollowButtonProps {\r\n me: User,\r\n userId: string,\r\n users: { [id: string]: FollowInfo;}, // dictionary definening\r\n managedClasses: SocialCommentClassNameContract,\r\n usersConnector: UsersConnector,\r\n onClick?: (e, userid: string, isFollow: boolean) => void,\r\n mainTelemetryObject?: TelemetryObjectBase\r\n t: SocialCommentLocalizedStrings\r\n theme: string\r\n}\r\n\r\nconst mapStateToProps = function(state: SocialCommentState) {\r\n return {\r\n me: state.me,\r\n users: state.users,\r\n theme: state.theme\r\n };\r\n};\r\n\r\nexport class FollowButton extends React.Component {\r\n telemetryObjects: FollowButtonTelemetryObjects;\r\n\r\n componentDidMount() {\r\n if (!(this.props.users && this.props.users[this.props.userId])) {\r\n const fetchUser = this.props.usersConnector.fetchUser;\r\n const fetchIsUserFollowed = this.props.usersConnector.fetchIsUserFollowed;\r\n if (!fetchUser || !fetchIsUserFollowed) { return console.warn(\"Missing props 'usersConnector.fetchUser' or 'userConnector.fetchIsUserFollowed'\"); }\r\n fetchUser(this.props.userId)\r\n .then(_ => {\r\n fetchIsUserFollowed(this.props.userId);\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const {me, users, userId, managedClasses, mainTelemetryObject, t, theme} = this.props;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n\r\n const user = users[userId] ? users[userId].data : null;\r\n if (!user) { return null; }\r\n const {isFollowing, isPrivateProfile, traceId} = user;\r\n const isSelf = me && me.id == userId;\r\n const isAnonymous = user.state == enums.userStateType.anonymous;\r\n\r\n /** Generate Telemetry Objects */\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n followButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...followButtonTelemetryContracts.followButton}, { id: traceId, headline: !isFollowing ? \"Follow\" : \"Unfollow\"}, this.telemetryObjects && this.telemetryObjects.followButton)\r\n };\r\n }\r\n\r\n const FollowButtonWrapperComponent = isFollowing ? OutlineButton :AccentButton;\r\n\r\n return (\r\n \r\n {!isSelf && !isPrivateProfile && !isAnonymous &&\r\n this.toggleFollow(e, userId, isFollowing)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.followButton, false)}\r\n >\r\n {isFollowing ? t.FollowButtonFollowingText :t.FollowButtonFollowText}\r\n }\r\n \r\n );\r\n }\r\n\r\n toggleFollow(e, userId, isFollowing) {\r\n if (this.props.onClick) { this.props.onClick(e, userId, !isFollowing); }\r\n e.stopPropagation();\r\n\r\n this.props.usersConnector.followUser(userId, !isFollowing);\r\n followButtonTelemetryActionDispatchers.followButton(e.currentTarget, !isFollowing, this.telemetryObjects.followButton);\r\n }\r\n}\r\n\r\nexport default connect(mapStateToProps)(FollowButton);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\nexport interface UserCardTelemetryObjects {\r\n userCardNameLink: TelemetryObjectBase;\r\n userCardAvatarLink: TelemetryObjectBase;\r\n}\r\nexport const userCardTelemetryContracts = {\r\n /** Scenario 2 click profile name\r\n * id: traceId\r\n * headline: username\r\n */\r\n userCardProfileLink: {\r\n name: \"Profile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: TelemetryContentType.Comment\r\n }\r\n }\r\n};\r\n\r\nexport const userCardTelemetryActionDispatchers = {\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { User } from \"@msnews/social-data-service\";\r\nimport { addOrUpdateTelemetryObject, avatarFallback, openProfilePage, placeholderImages, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport FollowButton from \"../../follow-button/FollowButton\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { ComponentConnector, FollowInfo, UsersConnector } from \"../../SocialComment.props\";\r\nimport { SocialCommentState } from \"../../SocialComment.state\";\r\nimport { UserCardTelemetryObjects, userCardTelemetryContracts, userCardTelemetryActionDispatchers } from \"./UserCard.telemetry\";\r\n\r\nexport interface UserCardProps extends SocialPopoverProps {\r\n componentConnector: ComponentConnector;\r\n usersConnector: UsersConnector;\r\n me: User;\r\n users: { [id: string]: FollowInfo;}; // dictionary definening\r\n id: string;\r\n t: SocialCommentLocalizedStrings;\r\n managedClasses?: SocialCommentClassNameContract;\r\n market: string;\r\n theme: string;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n}\r\n\r\ninterface UserCardState {\r\n hasMouseEnter: boolean\r\n}\r\n\r\nconst mapStateToProps = function(state: SocialCommentState) {\r\n return {\r\n theme: state.theme\r\n };\r\n};\r\n\r\nexport class UserCard extends React.Component {\r\n telemetryObjects: UserCardTelemetryObjects;\r\n containerRef: React.RefObject;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = React.createRef();\r\n\r\n this.state = {\r\n hasMouseEnter: false\r\n };\r\n this.telemetryObjects = null;\r\n }\r\n\r\n componentDidMount() {\r\n const fetchUser = this.props.usersConnector.fetchUser;\r\n const fetchIsUserFollowed = this.props.usersConnector.fetchIsUserFollowed;\r\n if (!fetchUser || !fetchIsUserFollowed) { return console.warn(\"Missing props 'usersConnector.fetchUser' or 'userConnector.fetchIsUserFollowed'\"); }\r\n fetchUser(this.props.id)\r\n .then(_ => {\r\n fetchIsUserFollowed(this.props.id);\r\n });\r\n }\r\n\r\n mouseEnterHandler() {\r\n this.setState({hasMouseEnter: true});\r\n }\r\n\r\n avatarLinkActionHandler(e) {\r\n userCardTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.userCardAvatarLink);\r\n }\r\n\r\n nameLinkActionHandler(e) {\r\n userCardTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.userCardNameLink);\r\n }\r\n\r\n render() {\r\n const {componentConnector, me, t, managedClasses, id, usersConnector, users, market, theme, mainTelemetryObject} = this.props;\r\n const user = this.props.users && this.props.users[id] ? this.props.users[id].data : undefined;\r\n if (!user || !users) { return null; }\r\n\r\n const {id: userId, name, postsCount, isFollowing, followersCount, likesCount, isBanned} = user || {};\r\n const avatarUrl = (user && user.avatarUrl ? user.avatarUrl : null) || placeholderImages.avatar;\r\n const isSelf = me.id == userId;\r\n\r\n const triggerRef = this.state.hasMouseEnter ? this.containerRef : this.props.triggerRef;\r\n\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n userCardNameLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...userCardTelemetryContracts.userCardProfileLink}, {id: user.traceId, headline: user.name}, this.telemetryObjects && this.telemetryObjects.userCardNameLink),\r\n userCardAvatarLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...userCardTelemetryContracts.userCardProfileLink}, { id: user.traceId, headline: user.name}, this.telemetryObjects && this.telemetryObjects.userCardAvatarLink)\r\n };\r\n }\r\n\r\n return (\r\n \r\n
    \r\n this.avatarLinkActionHandler(e)}\r\n {...openProfilePage(componentConnector, theme, id, market, \"_blank\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.userCardAvatarLink, false)}\r\n >\r\n {t.AriaLabelsProfilePicture}{ avatarFallback(e); }}/>\r\n \r\n
    \r\n
    \r\n
    \r\n this.nameLinkActionHandler(e)}\r\n {...openProfilePage(componentConnector, theme, id, market, \"_blank\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.userCardNameLink, false)}\r\n >{name}\r\n
    \r\n\r\n {!isSelf && !isBanned &&\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    {t.UserCardPosts}
    \r\n {postsCount || \"-\"}\r\n
    \r\n
    \r\n
    {t.UserCardLikes}
    \r\n {likesCount || \"-\"}\r\n
    \r\n
    \r\n
    {t.ProfileFollowersLbl}
    \r\n {followersCount || \"-\"}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\nexport default connect(mapStateToProps)(UserCard);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface CommentItemTelemetryObjects {\r\n commentItem: TelemetryObjectBase; // from contract: commentItem / deletedCommentItem / reportedCommentItem\r\n reportButton: TelemetryObjectBase;\r\n deleteButton: TelemetryObjectBase;\r\n reactionsCount: TelemetryObjectBase;\r\n reactionBreakdown: TelemetryObjectBase;\r\n userNameLink: TelemetryObjectBase;\r\n userAvatarLink: TelemetryObjectBase;\r\n mentionUserLink: TelemetryObjectBase;\r\n deletedMessage: TelemetryObjectBase;\r\n}\r\n\r\nexport const commentItemTelemetryContracts = {\r\n commentItem: {\r\n name: \"Comment\",\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n deletedCommentItem: {\r\n name: \"CommentDeletedModerator\",\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n reportedCommentItem: {\r\n name: \"CommentReported\",\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n reactionBreakdown: {\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n reportButton: { // Comments-Scenario 10a click\r\n name: \"Report\",\r\n behavior: TelemetryBehaviorType.Report,\r\n content: {\r\n headline: \"Report\",\r\n type: TelemetryContentType.Comment\r\n }\r\n },\r\n deleteButton: { // Scenario 10b click\r\n name: \"Delete\",\r\n behavior: TelemetryBehaviorType.Remove,\r\n content: {\r\n type: TelemetryContentType.Comment,\r\n headline: \"Delete\"\r\n }\r\n },\r\n reactionsCount: { // CommentReactions>Scenario 1\r\n name: \"CommentReactions\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: TelemetryContentType.Comment,\r\n headline: \"Reactions\"\r\n }\r\n },\r\n profileLink: {\r\n name: \"Profile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n guidelinesLink: {\r\n name: \"CommunityGuidelines\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"CommunityGuidelines\"\r\n }\r\n }\r\n};\r\n\r\nexport const commentItemTelemetryActionDispatchers = {\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { Comment, Content, User } from \"@msnews/social-data-service\";\r\nimport { avatarFallback, chevron_down, getAgoText, openGuidelinePage, openProfilePage, enums, exclamation_round, flag, hasThemeBase, isComponentDisabled, placeholderImages, shield, trash, addOrUpdateTelemetryObject, renderHybrid, comment } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport DeleteMenu from \"../../common/delete-menu/DeleteMenu\";\r\nimport { SocialMostReactions } from \"@msnews/social-most-reactions\";\r\nimport ReactionPanel from \"../../common/reaction-panel/ReactionPanel\";\r\nimport ReportMenu from \"../../common/report-menu/ReportMenu\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { CommentConnector, ComponentConnector, FollowInfo, PopupConnector, UsersConnector } from \"../../SocialComment.props\";\r\nimport DisabledMessage from \"../disabled-message/DisabledMessage\";\r\nimport ReplyList from \"../reply-list/ReplyList\";\r\nimport UserCard from \"../user-card/UserCard\";\r\nimport { commentItemTelemetryActionDispatchers, commentItemTelemetryContracts, CommentItemTelemetryObjects } from \"./CommentItem.telemetry\";\r\n\r\nconst minFooterSingleLineWidth = 375;\r\n\r\nexport interface CommentItemProps {\r\n componentConnector: ComponentConnector;\r\n commentConnector: CommentConnector;\r\n item: Comment;\r\n contentDisabled: boolean,\r\n me: User,\r\n t: SocialCommentLocalizedStrings;\r\n managedClasses?: SocialCommentClassNameContract;\r\n commentItemType: string,\r\n usersConnector: UsersConnector;\r\n popupConnector: PopupConnector;\r\n users: { [id: string]: FollowInfo;}; // dictionary definening\r\n market: string;\r\n content: Content;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n theme: string;\r\n responsiveClass: string;\r\n isBlury?: boolean;\r\n commentDisplayType?: string;\r\n specificCommentId?: string;\r\n}\r\n\r\ninterface CommentItemState {\r\n reportMenuVisible: boolean;\r\n deleteMenuVisible: boolean;\r\n selectedReportType: string;\r\n showReplyBox: boolean;\r\n reactionMenuVisible: boolean;\r\n userCardVisible: boolean;\r\n userCardUserId: string;\r\n nowDeleted: boolean;\r\n messageTruncated: boolean;\r\n isHoverUserCard: boolean;\r\n shouldFooterRenderTwoLines: boolean;\r\n mentionUserCardVisible: boolean;\r\n}\r\n\r\nclass CommentItem extends React.Component {\r\n\r\n ref: HTMLLIElement;\r\n messageRef: React.RefObject;\r\n telemetryObjects: CommentItemTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n reportMenuVisible: false,\r\n deleteMenuVisible: false,\r\n selectedReportType: null,\r\n showReplyBox: false,\r\n reactionMenuVisible: false,\r\n userCardVisible: false,\r\n userCardUserId: \"\",\r\n nowDeleted: false,\r\n messageTruncated: null,\r\n isHoverUserCard: false,\r\n shouldFooterRenderTwoLines: false,\r\n mentionUserCardVisible: false\r\n };\r\n\r\n this.hideReplyBox = this.hideReplyBox.bind(this);\r\n this.ref = null;\r\n this.messageRef = React.createRef();\r\n this.telemetryObjects = null;\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.item.mentionUser && !(this.props.users && this.props.users[this.props.item.mentionUser])) {\r\n this.props.usersConnector.fetchUser(this.props.item.mentionUser);\r\n }\r\n if (this.props.item.addedOffline && this.props.commentItemType == \"Reply\" && this.ref) {\r\n this.ref.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"end\"\r\n });\r\n }\r\n\r\n this.checkMessageTruncated();\r\n this.checkContainerWidth();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.checkMessageTruncated();\r\n this.checkContainerWidth();\r\n }\r\n\r\n checkMessageTruncated() {\r\n /** Check if message is truncated by webkit clamp */\r\n if (this.messageRef && this.messageRef.current && this.state.messageTruncated == null) {\r\n this.messageRef.current.scrollHeight > this.messageRef.current.clientHeight + 10\r\n ? this.setState({messageTruncated: true})\r\n : this.setState({messageTruncated: false});\r\n }\r\n }\r\n\r\n /* REPORT */\r\n showReportMenu(e) {\r\n const { theme, popupConnector, item } = this.props;\r\n const isMobile = this.props.responsiveClass?.includes(enums.responsiveLevels.L1);\r\n const isEmbeded = isComponentDisabled(theme, \"reportmenu\");\r\n if (isEmbeded || isMobile) {\r\n popupConnector.openPopup(\"reportmenu\", { id: item.id });\r\n } else {\r\n this.setState({\r\n reportMenuVisible: true\r\n });\r\n }\r\n\r\n commentItemTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.reportButton);\r\n }\r\n\r\n showDeleteMenu(e) {\r\n this.setState({\r\n deleteMenuVisible: true\r\n });\r\n\r\n commentItemTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.deleteButton);\r\n }\r\n\r\n reportHandler(reportType, e) {\r\n this.setState({\r\n reportMenuVisible: false,\r\n selectedReportType: reportType\r\n });\r\n }\r\n\r\n /* REPLY-BOX */\r\n showReplyBox(target?) {\r\n this.setState({\r\n showReplyBox: true\r\n });\r\n }\r\n\r\n hideReplyBox() {\r\n this.setState({\r\n showReplyBox: false\r\n });\r\n }\r\n\r\n replyButtonClickHandler() {\r\n if (this.state.showReplyBox) {\r\n this.hideReplyBox();\r\n } else {\r\n this.showReplyBox();\r\n }\r\n }\r\n\r\n /* REACTION */\r\n reactionHandler(type) {\r\n const sendCommentReaction = this.props.commentConnector.sendCommentReaction;\r\n\r\n const reset = this.props.item && this.props.item.rating == type;\r\n sendCommentReaction(this.props.item, type, reset);\r\n }\r\n\r\n onReactionsClick(e) {\r\n commentItemTelemetryActionDispatchers.genericClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.reactionsCount);\r\n this.props.popupConnector.openPopup(\"reactionBreakdownComment\", {id: this.props.item.id, parentTelemetryObject: this.telemetryObjects && this.telemetryObjects.reactionBreakdown});\r\n }\r\n\r\n showUserCard(e, userId, isVisible=true, isHoverUserCard=true) {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n if (isSuperApp) {\r\n return;\r\n }\r\n this.setState({userCardVisible: isVisible, userCardUserId: userId, isHoverUserCard: isHoverUserCard, mentionUserCardVisible: false});\r\n }\r\n\r\n showMentionUserCard(e, userId, isHoverUserCard=true) {\r\n this.setState({mentionUserCardVisible: true, userCardUserId: userId, isHoverUserCard: isHoverUserCard, userCardVisible: false});\r\n }\r\n\r\n deleteCommentHandler(e, commentId, parentId, userId) {\r\n this.setState({\r\n reportMenuVisible: false,\r\n nowDeleted: true\r\n });\r\n this.props.commentConnector.deleteComment(commentId, parentId, userId);\r\n }\r\n\r\n render() {\r\n const { id, parentId, replyCount, repliesHasPrevious, repliesHasMore, user, createDatetime, isHidden, isInReview, isDeleted, text, visibleStatus, rating, replies, mentionUser: mentionUserId, addedOffline } = this.props.item;\r\n if (!user) { return null; }\r\n\r\n const { isBlury, componentConnector, responsiveClass, contentDisabled, me, t, managedClasses, commentItemType, commentConnector, usersConnector, popupConnector, users, market, content, mainTelemetryObject, theme, specificCommentId } = this.props;\r\n const {reportMenuVisible, selectedReportType, nowDeleted, messageTruncated, deleteMenuVisible, shouldFooterRenderTwoLines} = this.state;\r\n const isReply = parentId && parentId.length > 0;\r\n const hideReplyBox = this.hideReplyBox;\r\n const showAvatar = !selectedReportType && !isHidden;\r\n const showReplyBox = this.state.showReplyBox;\r\n const userCardVisible = me && !me.isBanned && !isHidden && !isDeleted;\r\n const reactionAllowed = me && !me.isBanned && !isHidden;\r\n const isSpecificComment = id === specificCommentId;\r\n const mentionUser = users && users[mentionUserId] && users[mentionUserId].data;\r\n\r\n if (mainTelemetryObject) {\r\n let commentItemContract;\r\n if (isDeleted) {\r\n commentItemContract = commentItemTelemetryContracts.deletedCommentItem;\r\n } else if (addedOffline) {\r\n commentItemContract = {...commentItemTelemetryContracts.commentItem, name: \"CommentPosted\"};\r\n } else {\r\n commentItemContract = commentItemTelemetryContracts.commentItem;\r\n }\r\n this.telemetryObjects = {\r\n commentItem: addOrUpdateTelemetryObject(mainTelemetryObject, commentItemContract, { id }, this.telemetryObjects && this.telemetryObjects.commentItem),\r\n deleteButton: addOrUpdateTelemetryObject(mainTelemetryObject, commentItemTelemetryContracts.deleteButton, { id }, this.telemetryObjects && this.telemetryObjects.deleteButton),\r\n reportButton: addOrUpdateTelemetryObject(mainTelemetryObject, commentItemTelemetryContracts.reportButton, { id }, this.telemetryObjects && this.telemetryObjects.reportButton),\r\n reactionsCount: addOrUpdateTelemetryObject(mainTelemetryObject, commentItemTelemetryContracts.reactionsCount, { id }, this.telemetryObjects && this.telemetryObjects.reactionsCount),\r\n reactionBreakdown: addOrUpdateTelemetryObject(mainTelemetryObject, commentItemTelemetryContracts.reactionBreakdown, { id }, this.telemetryObjects && this.telemetryObjects.reactionBreakdown),\r\n userNameLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentItemTelemetryContracts.profileLink}, { id: user.traceId, headline: user.name}, this.telemetryObjects && this.telemetryObjects.userNameLink),\r\n userAvatarLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentItemTelemetryContracts.profileLink}, { id: user.traceId, headline: user.name}, this.telemetryObjects && this.telemetryObjects.userAvatarLink),\r\n mentionUserLink: mentionUser && addOrUpdateTelemetryObject(mainTelemetryObject, {...commentItemTelemetryContracts.profileLink}, { id: mentionUser.traceId, headline: mentionUser.name}, this.telemetryObjects && this.telemetryObjects.mentionUserLink),\r\n deletedMessage: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentItemTelemetryContracts.guidelinesLink}, { id }, this.telemetryObjects && this.telemetryObjects.deletedMessage)\r\n };\r\n }\r\n\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n\r\n /* SUB ELEMENTS */\r\n let commentBody; // message\r\n if (isDeleted || nowDeleted) {\r\n commentBody =\r\n \r\n {t[enums.visibleStatusMap[visibleStatus] || enums.visibleStatusMap.Default]}\r\n {exclamation_round}\r\n ;\r\n } else {\r\n commentBody =\r\n \r\n {mentionUser &&\r\n \r\n this.showMentionUserCard(e, mentionUserId)}\r\n {...openProfilePage(componentConnector, theme, mentionUserId, market, \"_blank\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.mentionUserLink, false)}\r\n >{mentionUser.name}\r\n  \r\n {this.state.mentionUserCardVisible &&\r\n this.setState({mentionUserCardVisible: false}),\r\n triggerRef: { current: this.ref } as React.RefObject,\r\n isHover: this.state.isHoverUserCard,\r\n mainTelemetryObject,\r\n responsiveClass\r\n }}\r\n />\r\n }\r\n \r\n }\r\n
    \r\n ;\r\n }\r\n\r\n const isSelf = me && user && me.id == user.id;\r\n const avatarUrl = showAvatar && user.avatarStatus == enums.userAvatarStatusType.normal && user.avatarUrl || placeholderImages.avatar;\r\n\r\n let innerContent; // disabled message OR header, body, footer\r\n if (isInReview) { // IN REVIEW\r\n innerContent = ;\r\n } else if (selectedReportType) { // REPORTED\r\n const reportedCommentItemTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, commentItemTelemetryContracts.reportedCommentItem, { id });\r\n innerContent = ;\r\n } else if (nowDeleted) { // REPORTED\r\n innerContent = ;\r\n } else {\r\n innerContent = \r\n
    \r\n
    \r\n {isHidden\r\n ? {t.CommentItemDeletedUserName}\r\n : this.showUserCard(e, user.id, userCardVisible)}\r\n {...openProfilePage(componentConnector, theme, user.id, market, \"_blank\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.userNameLink, false)}\r\n >{user.name}\r\n { !isSuperApp &&\r\n this.showUserCard(e, user.id, userCardVisible, false)}> {chevron_down} \r\n }\r\n \r\n }\r\n {getAgoText(createDatetime)}\r\n
    \r\n
    \r\n {this.state.userCardVisible &&\r\n this.setState({userCardVisible: false}),\r\n triggerRef: { current: this.ref } as React.RefObject,\r\n isHover: this.state.isHoverUserCard,\r\n mainTelemetryObject,\r\n responsiveClass\r\n }}\r\n />\r\n }\r\n\r\n
    \r\n
    {commentBody}
    \r\n { messageTruncated && !isBlury && }\r\n
    \r\n\r\n {!isHidden && !isBlury &&\r\n
    \r\n
    \r\n {isHidden && (\r\n \r\n {shield}\r\n {t.CommentReactionDisabledMsg}\r\n \r\n )}\r\n\r\n {shouldFooterRenderTwoLines ? (\r\n \r\n {this.renderReactionsCount(false)}\r\n
    \r\n {this.renderReactionPanel({ reactionAllowed, contentDisabled, t, rating, managedClasses, responsiveClass })}\r\n
    \r\n ) : (\r\n \r\n {this.renderReactionPanel({ reactionAllowed, contentDisabled, t, rating, managedClasses, responsiveClass })}\r\n {this.renderReactionsCount(true)}\r\n \r\n )}\r\n\r\n {!isSelf ? (\r\n \r\n this.showReportMenu(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.reportButton, false)}\r\n >\r\n {flag}\r\n {t.CommentReportText}\r\n {reportMenuVisible && (\r\n this.setState({ reportMenuVisible: false })}\r\n {...{\r\n t,\r\n managedClasses,\r\n id,\r\n me,\r\n visible: reportMenuVisible,\r\n mainTelemetryObject: this.telemetryObjects && this.telemetryObjects.commentItem,\r\n theme: theme,\r\n popupConnector: this.props.popupConnector,\r\n usersConnector: this.props.usersConnector,\r\n responsiveClass: this.props.responsiveClass,\r\n renderInPopover: true\r\n }}\r\n />\r\n )}\r\n \r\n \r\n ) : (\r\n \r\n this.showDeleteMenu(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.deleteButton, false)}\r\n >\r\n {trash}\r\n {t.CommentDeleteText}\r\n \r\n {deleteMenuVisible && (\r\n this.deleteCommentHandler(e, id, parentId, user.id)}\r\n onHide={() => this.setState({ deleteMenuVisible: false })}\r\n {...{\r\n id,\r\n t,\r\n managedClasses,\r\n className: managedClasses.commentItemDeleteMenuPopover,\r\n visible: deleteMenuVisible,\r\n mainTelemetryObject: this.telemetryObjects && this.telemetryObjects.commentItem\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\n const replyList = ;\r\n const userAvatar = { avatarFallback(e); }}\r\n width=\"40\" height=\"40\"\r\n />;\r\n return (\r\n
  • { this.ref = el; })}>\r\n
    \r\n {showAvatar ? this.showUserCard(e, user.id, userCardVisible)}\r\n {...openProfilePage(componentConnector, theme, user.id, market, \"_blank\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.userAvatarLink, false)}\r\n >\r\n {userAvatar}\r\n : userAvatar}\r\n\r\n
    \r\n {innerContent}\r\n {!isReply && !isBlury ? replyList : \"\"}\r\n
    \r\n {isReply && !isBlury ? replyList : \"\"}\r\n
    \r\n
  • \r\n );\r\n }\r\n\r\n checkContainerWidth() {\r\n const dist = this.ref && this.ref && this.ref.offsetWidth - minFooterSingleLineWidth;\r\n if (dist > 5 && this.state.shouldFooterRenderTwoLines) {\r\n this.setState({\r\n shouldFooterRenderTwoLines: false\r\n });\r\n } else if (dist < -5 && !this.state.shouldFooterRenderTwoLines) {\r\n this.setState({\r\n shouldFooterRenderTwoLines: true\r\n });\r\n }\r\n }\r\n\r\n renderReactionPanel(renderReactionPanelParams) {\r\n const { reactionAllowed, contentDisabled, t, rating, managedClasses, responsiveClass } = renderReactionPanelParams;\r\n return reactionAllowed && !contentDisabled && (\r\n \r\n );\r\n }\r\n\r\n renderReactionsCount(showSeperator) {\r\n const { item: { reactionCounts }, t, managedClasses, theme, responsiveClass } = this.props;\r\n\r\n return this.onReactionsClick(e)}\r\n hasSeperatorBefore={showSeperator}\r\n telemetryObject={this.telemetryObjects && this.telemetryObjects.reactionsCount}\r\n {...{ reactionCounts, t, managedClasses, theme, responsiveClass}}\r\n />;\r\n }\r\n}\r\nexport default CommentItem;\r\n","// © Microsoft Corporation. All rights reserved.\r\nexport function getAgoText(dateTimeStr) {\r\n const monthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\r\n let shortMonthStr;\r\n\r\n const date = new Date(dateTimeStr);\r\n const nowTs = new Date().getTime();\r\n const seconds = Math.floor((nowTs-date.getTime())/1000);\r\n\r\n if (seconds < 30) {\r\n return \"Just now\";\r\n }\r\n\r\n try {\r\n shortMonthStr = date.toLocaleString(\"default\", { month: \"short\" });\r\n } catch (e) {\r\n shortMonthStr = monthNames[date.getMonth()-1];\r\n }\r\n\r\n if (seconds > 604800*52) { // 1 year\r\n return `${shortMonthStr} ${date.getDate()}, ${date.getFullYear()}`;\r\n }\r\n if (seconds > 604800) { // 1 week\r\n return `${shortMonthStr} ${date.getDate()}`;\r\n }\r\n if (seconds > 86400) { // 1 day\r\n return `${Math.floor(seconds/(86400))}d`;\r\n }\r\n if (seconds > 3600) { // 1 hour\r\n return `${Math.floor(seconds/3600)}h`;\r\n }\r\n if (seconds >= 60) { // 1 min\r\n return `${Math.floor(seconds/60)}m`;\r\n }\r\n\r\n return `${seconds}s`;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nexport interface CommentListTelemetryObjects {\r\n mainItem: TelemetryObjectBase\r\n}\r\n\r\nexport const commentListTelemetryContracts = {\r\n mainItem: {\r\n name: \"Comment\",\r\n content: {\r\n type: TelemetryContentType.Comment\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Comments, Content, User } from \"@msnews/social-data-service\";\r\nimport { chevron_down, chevron_up, addOrUpdateTelemetryObject } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport SortBox from \"../../common/sort-box/SortBox\";\r\nimport { SocialCommentClassNameContract } from \"../../SocialComment.classnames\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { CommentConnector, ComponentConnector, FollowInfo, PopupConnector, UsersConnector } from \"../../SocialComment.props\";\r\nimport CommentBox from \"../comment-box/CommentBox\";\r\nimport CommentItem from \"../comment-item/CommentItem\";\r\nimport { commentListTelemetryContracts, CommentListTelemetryObjects } from \"./CommentList.telemetry\";\r\n\r\nexport interface CommentListProps {\r\n componentConnector: ComponentConnector;\r\n comments: Comments;\r\n totalCommentCount: number;\r\n commentConnector: CommentConnector;\r\n contentId: string;\r\n managedClasses?: SocialCommentClassNameContract;\r\n contentDisabled: boolean;\r\n me: User;\r\n usersConnector: UsersConnector;\r\n popupConnector: PopupConnector;\r\n users: { [id: string]: FollowInfo;}; // dictionary definening\r\n t: SocialCommentLocalizedStrings;\r\n market: string;\r\n content: Content;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n theme: string;\r\n responsiveClass: string;\r\n isExpanded: boolean;\r\n commentDisplayType?: string;\r\n onCommentBoxInitialized?: (commentBox: HTMLDivElement) => void;\r\n specificCommentId?: string;\r\n}\r\n\r\ninterface CommentListState {\r\n sortType: string;\r\n showMoreClicked: boolean;\r\n}\r\n\r\nexport default class CommentList extends React.Component {\r\n telemetryObjects: CommentListTelemetryObjects;\r\n static sortTypes = {\r\n Rating: \"CommentSortByTopResponseTxt\",\r\n Time: \"CommentSortByNewestTxt\",\r\n \"Time asc\": \"CommentSortByOldestTxt\"\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n showMoreClicked: false,\r\n sortType: this.props.specificCommentId ? \"Time\" : \"Rating\"\r\n };\r\n\r\n this.submitCommentAndUpdateState = this.submitCommentAndUpdateState.bind(this);\r\n }\r\n\r\n showMoreClicked(e) {\r\n this.setState({\r\n showMoreClicked: true\r\n });\r\n const top = 10;\r\n const skip = this.props.comments.skip + this.props.comments.top;\r\n\r\n const showMoreComments = this.props.commentConnector.showMoreComments;\r\n if (!showMoreComments) { return console.warn(\"Missing props 'showMoreComments'\"); }\r\n\r\n showMoreComments(this.props.contentId, top, skip, this.state.sortType);\r\n }\r\n\r\n getSortedComments(sortType) {\r\n\r\n this.setState({\r\n showMoreClicked: false,\r\n sortType: sortType\r\n });\r\n const top = 2;\r\n const onSortTypeChanged = this.props.commentConnector.onSortTypeChanged;\r\n\r\n if (!onSortTypeChanged) { return console.warn(\"Missing props 'commentConnector.onSortTypeChanged\"); }\r\n onSortTypeChanged(this.props.contentId, top, sortType);\r\n }\r\n\r\n async submitCommentAndUpdateState(value) {\r\n return await this.props.commentConnector.submitComment(this.props.content, value);\r\n }\r\n\r\n render() {\r\n return this.props.isExpanded ? this.renderFull() : this.renderMinimal();\r\n }\r\n\r\n renderMinimal() {\r\n const { comments, managedClasses, mainTelemetryObject, content } = this.props;\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n mainItem: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentListTelemetryContracts.mainItem}, {id: content && content.cmsId}, this.telemetryObjects && this.telemetryObjects.mainItem)\r\n };\r\n\r\n return (\r\n
      \r\n {comments && comments.list && this.renderCommentItem(comments.list[0], true)}\r\n
    \r\n );\r\n }\r\n\r\n renderFull() {\r\n const { onCommentBoxInitialized, componentConnector, comments, contentDisabled, me, t, managedClasses, usersConnector, popupConnector,\r\n users, market, totalCommentCount, content, mainTelemetryObject, theme, contentId, commentConnector, responsiveClass } = this.props;\r\n const moreCommentCount = comments && comments.moreCount;\r\n const submitCommentAndUpdateState = this.submitCommentAndUpdateState.bind(this);\r\n const commentBoxType=\"Comment\";\r\n const isFirstCommenter = totalCommentCount < 1;\r\n const renderCommentSortList = comments && comments.list && comments.list.length > 0;\r\n const broadcastAsTyping = this.props.commentConnector.broadcastAsTyping;\r\n const specificCommentMode = !!this.props.specificCommentId;\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n mainItem: addOrUpdateTelemetryObject(mainTelemetryObject, commentListTelemetryContracts.mainItem, {id: content && content.cmsId}, this.telemetryObjects && this.telemetryObjects.mainItem)\r\n };\r\n\r\n return (\r\n \r\n\r\n {!contentDisabled &&\r\n \r\n }\r\n\r\n {renderCommentSortList &&\r\n
    \r\n \r\n
    \r\n }\r\n\r\n {specificCommentMode && comments && comments.hasPrevious &&\r\n commentConnector.loadPreviousComments(contentId, comments.list[0].id) }\r\n >\r\n {chevron_up}\r\n {t.SpecificCommentModeSeePreviousCommentsTxt}\r\n \r\n }\r\n
      \r\n {comments && comments.list && comments.list.map((item) => this.renderCommentItem(item))}\r\n
    \r\n {specificCommentMode && comments && comments.hasMore &&\r\n commentConnector.loadMoreComments(contentId, comments.list[comments.list.length-1].id) }\r\n >\r\n {chevron_down}\r\n {t.SpecificCommentModeSeeMoreCommentsTxt}\r\n \r\n }\r\n\r\n {!specificCommentMode && moreCommentCount > 0 &&\r\n
    \r\n {this.state.showMoreClicked ?\r\n this.showMoreClicked(e)}>\r\n {chevron_down}\r\n \r\n { moreCommentCount < 2 ?\r\n t.SeeMoreCommentsTxt :\r\n t.SeeMoreCommentsPluralTxt\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 renderCommentItem(item, isBlury?: boolean) {\r\n const { commentDisplayType, componentConnector, responsiveClass, contentDisabled, me, t, managedClasses, commentConnector, usersConnector, popupConnector, users, market, content, mainTelemetryObject, theme, specificCommentId } = this.props;\r\n const commentItemType=\"Comment\";\r\n const commentItemProps = {\r\n componentConnector,\r\n commentItemType,\r\n item,\r\n contentDisabled,\r\n me,\r\n t,\r\n managedClasses,\r\n sortType: this.state.sortType,\r\n commentConnector,\r\n usersConnector,\r\n popupConnector,\r\n users,\r\n market,\r\n content,\r\n mainTelemetryObject,\r\n theme,\r\n responsiveClass,\r\n isBlury: isBlury || false,\r\n commentDisplayType,\r\n specificCommentId\r\n };\r\n if (item.skipRender) {\r\n return null;\r\n }\r\n\r\n return ;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Content, TypingUpdates, User } from \"@msnews/social-data-service\";\r\nimport { avatarFallback, placeholderImages, typing_animation } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { SocialCommentState } from \"../../SocialComment.state\";\r\nimport { TypingUsersClassNameContract } from \"./TypingUsers.classnames\";\r\n\r\nexport interface TypingUsersProps {\r\n me?: User,\r\n typingUpdates?: TypingUpdates;\r\n managedClasses: TypingUsersClassNameContract;\r\n updateTypers: () => void;\r\n listenForTypers: (id: string, market: string, content: Content) => void;\r\n t: SocialCommentLocalizedStrings;\r\n content: Content;\r\n noText?: boolean;\r\n id?: string;\r\n market?: string;\r\n}\r\n\r\ninterface TypingUsersState {\r\n timer?: any;\r\n}\r\n\r\nexport class TypingUsers extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.listenForTypers(this.props.id, this.props.market, this.props.content);\r\n this.setState({timer: setInterval(this.updateTypers.bind(this), 1000)});\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.state && this.state.timer) {\r\n clearInterval(this.state.timer);\r\n }\r\n }\r\n\r\n updateTypers() {\r\n const { typingUpdates, updateTypers } = this.props;\r\n if (typingUpdates) {\r\n updateTypers();\r\n }\r\n }\r\n\r\n render() {\r\n const { me, typingUpdates, managedClasses, t, noText } = this.props;\r\n if (!typingUpdates) {\r\n return null;\r\n }\r\n\r\n const myId = me && me.id;\r\n const { displayedTypers, numTypers } = typingUpdates;\r\n\r\n if (!displayedTypers || !numTypers ||\r\n numTypers === 0 ||\r\n numTypers < displayedTypers.length ||\r\n displayedTypers.length > 3 ||\r\n (numTypers < 3 && numTypers !== displayedTypers.length)) {\r\n return null; // either there's no one typing, or we have inconsistent props passed to us\r\n } else {\r\n return (\r\n
    \r\n \r\n { !noText && }\r\n {typing_animation} \r\n
    \r\n );\r\n }\r\n }\r\n}\r\n\r\n// Create DOM elements\r\nfunction TypingUsersImages(props) {\r\n const { displayedTypers, t } = props;\r\n const className = \"cwt-typing-user-images image-count-\" + displayedTypers.length;\r\n const images = displayedTypers.map((typer, index) => );\r\n return (\r\n
    \r\n {images}\r\n
    \r\n );\r\n}\r\n\r\nfunction TypingUserImage(props) {\r\n const { displayedTyper, index, t } = props;\r\n const className = \"cwt-typing-user-image image\" + index;\r\n return (\r\n
    \r\n {t.AriaLabelsProfilePicture}{ avatarFallback(e); }}>\r\n
    \r\n );\r\n}\r\n\r\nfunction TypingUsersText(props) {\r\n const { me, displayedTypers, numTypers, t} = props;\r\n let text;\r\n if (numTypers === 1) {\r\n const user1 = typingUserName({ displayedTyper: displayedTypers[0], me, t });\r\n text = me === displayedTypers[0].id\r\n ? t.YouTypingUserInfo\r\n : String.Format(t.SingleTypingUserInfo, { user1 });\r\n\r\n } else if (numTypers === 2) {\r\n const user1 = typingUserName({ displayedTyper: displayedTypers[0], me, t });\r\n const user2 = typingUserName({ displayedTyper: displayedTypers[1], me, t });\r\n text = String.Format(t.DoubleTypingUserInfo, { user1, user2 });\r\n\r\n } else if (numTypers >= 3 && numTypers <= displayedTypers.length) {\r\n const user1 = typingUserName({ displayedTyper: displayedTypers[0], me, t });\r\n const user2 = typingUserName({ displayedTyper: displayedTypers[1], me, t });\r\n const user3 = typingUserName({ displayedTyper: displayedTypers[2], me, t });\r\n text = String.Format(t.TripleTypingUserInfo, { user1, user2, user3 });\r\n\r\n } else if (numTypers > 3) {\r\n const user1 = typingUserName({ displayedTyper: displayedTypers[1], me, t });\r\n const user2 = typingUserName({ displayedTyper: displayedTypers[2], me, t });\r\n text = String.Format(t.PeopleTypingUserInfo, { user1, user2, numberOfUsers: numTypers - 2 });\r\n }\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction typingUserName(props) {\r\n const { me, displayedTyper, t } = props;\r\n return `${me === displayedTyper.id ? t.UserPlaceHolder : displayedTyper.name}`;\r\n}\r\n\r\nconst mapStateToProps = (state: SocialCommentState, props: TypingUsersProps) => {\r\n const content: Content = props.content;\r\n const typingUpdates: TypingUpdates = content && content.typingUpdates;\r\n const me: User = state.me;\r\n const id: string = state.id;\r\n const market: string = state.market;\r\n return {\r\n typingUpdates,\r\n me,\r\n id,\r\n market\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(TypingUsers);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface ContentPanelTelemetryObjects {\r\n guidelinesLink: TelemetryObjectBase;\r\n}\r\n\r\nexport const contentPanelTelemetryContracts = {\r\n /** Comments-Scenario-3 */\r\n guidelinesLink: {\r\n name: \"CommunityGuidelines\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"CommunityGuidelines\"\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { Content } from \"@msnews/social-data-service\";\r\nimport { enums, openGuidelinePage, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialCommentLocalizedStrings } from \"../../SocialComment.localizedStrings\";\r\nimport { CommentConnector, ComponentConnector } from \"../../SocialComment.props\";\r\nimport TypingUsers from \"../typing-users/TypingUsers\";\r\nimport { ContentPanelClassNameContract } from \"./ContentPanel.classnames\";\r\nimport { contentPanelTelemetryContracts, ContentPanelTelemetryObjects } from \"./ContentPanel.telemetry\";\r\n\r\nexport interface ContentPanelProps {\r\n managedClasses: ContentPanelClassNameContract;\r\n t: SocialCommentLocalizedStrings;\r\n componentConnector: ComponentConnector;\r\n commentConnector: CommentConnector;\r\n content: Content;\r\n responsiveClass: string;\r\n isExpanded: boolean;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n commentDisplayType?: string;\r\n market?: string;\r\n theme: string;\r\n}\r\nexport default class ContentPanel extends React.Component {\r\n telemetryObjects: ContentPanelTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const totalCommentCount = this.props.content.totalCommentCount;\r\n if (this.props.isExpanded) { return this.renderFullState(); }\r\n if (totalCommentCount == 0) {\r\n return this.renderZeroState();\r\n } else if (!this.props.isExpanded) {\r\n return this.renderMinimalState();\r\n } else {\r\n return this.renderFullState();\r\n }\r\n }\r\n\r\n renderZeroState() {\r\n const { t, content } = this.props;\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {content.conversationTitle}

    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderMinimalState() {\r\n const { t, content, responsiveClass } = this.props;\r\n const { listenForTypers, updateTypers } = this.props.commentConnector;\r\n const typingUserProps = { listenForTypers, updateTypers, managedClasses: this.props.managedClasses, t, content, noText: true };\r\n\r\n return (\r\n
    \r\n \r\n
    BETA
    \r\n
    \r\n );\r\n }\r\n\r\n renderFullState() {\r\n const { t, content, mainTelemetryObject, commentDisplayType, market, componentConnector, theme} = this.props;\r\n const { conversationTitle, totalCommentCount } = content;\r\n const { listenForTypers, updateTypers } = this.props.commentConnector;\r\n const isCommentOverlay = commentDisplayType == \"overlay\";\r\n const isMobile = this.props.responsiveClass?.includes(enums.responsiveLevels.MobilePopup);\r\n const typingUserProps = { listenForTypers, updateTypers, managedClasses: this.props.managedClasses, t, content, noText: isCommentOverlay || isMobile };\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n guidelinesLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...contentPanelTelemetryContracts.guidelinesLink}, { id: this.props.content && this.props.content.cmsId }, this.telemetryObjects && this.telemetryObjects.guidelinesLink)\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n

    {conversationTitle}

    \r\n
    BETA
    \r\n
    \r\n
    \r\n

    {t.ContentPanelCommentsTxt} {totalCommentCount > 0 ? {totalCommentCount} : \"\"}

    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, LightweightButton, OutlineButton, StealthButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { CommentTelemetryObjects, commentTelemetryContracts } from \"./Comment.telemetry\";\r\nimport { SocialTelemetryManager, TelemetryEventMap, addOrUpdateTelemetryObject, avatarFallback, chevron_left, close2, comment, commentsSectionIndicatorExist, contentImageFallback, dispatchTelemetryEvent, enums, hasThemeBase, isValidURL, loadObserver, placeholderImages, renderHybrid, selectContentId } from \"@msnews/social-utils\";\r\nimport { registerVideoPlayStarted, unregisterVideoPlayStarted } from \"../utils/videoEventListener\";\r\n\r\nimport CommentList from \"./comment-list/CommentList\";\r\nimport { Content } from \"@msnews/social-data-service\";\r\nimport ContentPanel from \"./content-panel/ContentPanel\";\r\nimport DisabledMessage from \"./disabled-message/DisabledMessage\";\r\nimport React from \"react\";\r\nimport { SocialCommentProps } from \"../SocialComment.props\";\r\nimport { SocialCommentState } from \"../SocialComment.state\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport UserCard from \"./user-card/UserCard\";\r\nimport { appEnvironment } from \"@msnews/core\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { connect } from \"react-redux\";\r\nimport { getContextData } from \"@msnews/core\";\r\n\r\ninterface CommentState {\r\n commentsLoaded: boolean;\r\n userCardVisible: boolean;\r\n userCardUserId: string;\r\n displayState: number;\r\n isOverlayActive: boolean; // Toogle for swiping comments widget on flight-3\r\n isCompactFloatButtonVisible: boolean;\r\n isEntireComponentScrolled: boolean;\r\n buttonVisibilityTurnedOn: boolean;\r\n componentIsInView: boolean;\r\n isHeaderInView: boolean;\r\n}\r\n\r\nexport interface CommentProps extends SocialCommentProps {\r\n content: Content;\r\n}\r\n\r\nconst mapStateToProps = function (state: SocialCommentState, props: SocialCommentProps) {\r\n const contentId = selectContentId(state.contentIds, props.id, props.market);\r\n return {\r\n responsiveClass: state.responsiveClass,\r\n content: state.contents && state.contents[contentId]\r\n };\r\n};\r\n\r\nexport class Comment extends React.Component {\r\n commentContainerRef: React.RefObject;\r\n commentBox: HTMLDivElement;\r\n minimalContainerRef: React.RefObject;\r\n minimalContainerObserver: IntersectionObserver;\r\n telemetryObjects: CommentTelemetryObjects;\r\n overlayObserver: IntersectionObserver;\r\n overlayContainerRef: HTMLDivElement;\r\n componentEndIndicatorRef: React.RefObject;\r\n isContainerLoaded: boolean;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.commentContainerRef = React.createRef();\r\n this.minimalContainerRef = React.createRef();\r\n this.componentEndIndicatorRef = React.createRef();\r\n loadObserver(() => {\r\n this.minimalContainerObserver = new IntersectionObserver(\r\n this.commentContainerIntersectionHandler.bind(this),\r\n { threshold: [0, .2, .4, .6, .8, 1]}\r\n );\r\n });\r\n\r\n // Overlay Comments Container\r\n this.overlayContainerRef = null;\r\n loadObserver(() => {\r\n this.overlayObserver = new IntersectionObserver(\r\n () => this.overlayContainerRef && dispatchTelemetryEvent({...TelemetryEventMap.genericLoaded, sendPeregrine: true}, this.overlayContainerRef.parentElement.parentElement),\r\n { threshold: .8}\r\n );\r\n });\r\n\r\n this.state = {\r\n commentsLoaded: false,\r\n userCardVisible: false,\r\n userCardUserId: null,\r\n displayState: enums.commentsStatusType.notDetermined,\r\n isOverlayActive: false,\r\n isCompactFloatButtonVisible: true,\r\n isEntireComponentScrolled: false,\r\n buttonVisibilityTurnedOn: true,\r\n componentIsInView: false,\r\n isHeaderInView: true\r\n };\r\n\r\n this.showOverlayCommentsHandler = this.showOverlayCommentsHandler.bind(this);\r\n this.hideOverlayHandler = this.hideOverlayHandler.bind(this);\r\n }\r\n\r\n prepareData() {\r\n const commentToBeFetchedCount = this.props.commentDisplayType == \"overlay\" ? 6 : 2;\r\n this.props.commentConnector && this.props.commentConnector.onCommentComponentConnect(\r\n { id: this.props.id, market: this.props.market, top: commentToBeFetchedCount },\r\n this.props.specificCommentId\r\n );\r\n }\r\n\r\n setTmplFor() {\r\n if (this.state.displayState == enums.commentsStatusType.notDetermined) { return null; }\r\n const { content, requestContext } = this.props;\r\n if (!content) { return null; }\r\n\r\n const { commentStatus, url, commentWhiteListSegments, commentBlackListSegments } = content;\r\n\r\n if (appEnvironment?.CurrentRequestTargetScope?.pageExperiments?.find(x => x == \"prg-comc\")) {\r\n SocialTelemetryManager.setTemplValue(\"NOCOM\", \"1\");\r\n return;\r\n }\r\n\r\n if (commentStatus == \"Off\") {\r\n SocialTelemetryManager.setTemplValue(\"COMDISAB\", \"1\");\r\n return;\r\n }\r\n\r\n if (!isValidURL(getContextData(requestContext?.data?.locationHref, \"locationHref\"), url, commentWhiteListSegments, commentBlackListSegments)) {\r\n SocialTelemetryManager.setTemplValue(\"COMDISAB\", \"1\");\r\n return;\r\n }\r\n\r\n if (!this.isComponentExpanded()) {\r\n SocialTelemetryManager.setTemplValue(\"COMENAB\", \"1\");\r\n } else {\r\n SocialTelemetryManager.setTemplValue(\"COMOPEN\", \"1\");\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"cwt-comments-clicked\", (e) => this.toggleSocialCommentState(e));\r\n document.addEventListener(\"scroll\", this.trackScrolling.bind(this));\r\n this.prepareData();\r\n this.watchSocialBar();\r\n this.setTmplFor();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (this.props.id != null && this.props.market != null && prevProps.id != this.props.id || prevProps.market != this.props.market || prevProps.commentDisplayType != this.props.commentDisplayType || prevProps.specificCommentId != this.props.specificCommentId) {\r\n this.prepareData();\r\n this.setState({\r\n commentsLoaded: false,\r\n displayState: enums.commentsStatusType.notDetermined\r\n });\r\n }\r\n\r\n if (!prevProps.content && this.props.content) {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n\r\n const { content, specificCommentId } = this.props;\r\n const { displayState, commentsLoaded } = this.state;\r\n if (content && !commentsLoaded) {\r\n if (specificCommentId) {\r\n this.expandComponent();\r\n } else if (this.props.commentDisplayType && this.props.commentDisplayType.indexOf(\"compact\") == 0) {\r\n this.setState({\r\n displayState: content.totalCommentCount > 0 ? enums.commentsStatusType.minimal : enums.commentsStatusType.zero\r\n });\r\n } else {\r\n this.expandComponent();\r\n }\r\n if (displayState !== enums.commentsStatusType.notDetermined) {\r\n this.setState({ commentsLoaded: true });\r\n if ((commentsSectionIndicatorExist() || specificCommentId)) {\r\n this.setState({displayState: enums.commentsStatusType.expanded}, () => {\r\n this.setFloatingButtonVisibility(false);\r\n const isDefault = this.props.commentDisplayType == \"default\"; // overlay and compact themes are handled onCommentBoxInitialized\r\n const isOverlay = this.props.commentDisplayType === \"overlay\";\r\n if (isDefault) { // setTimeout's are necessary to provide smooth transition on initial loading\r\n setTimeout(() => { this.jumpToCommentsSection(); }, 250);\r\n } else if (isOverlay) {\r\n setTimeout(() => { this.setState({isOverlayActive: true}); }, 250);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Observe Comments Container\r\n if (!this.isContainerLoaded && this.minimalContainerRef && this.minimalContainerRef.current) {\r\n this.isContainerLoaded = true;\r\n this.minimalContainerObserver.observe(this.minimalContainerRef.current);\r\n }\r\n\r\n // Observe Overlay Comments Container\r\n if (!this.isContainerLoaded && this.overlayContainerRef) {\r\n this.isContainerLoaded = true;\r\n this.overlayObserver.observe(this.overlayContainerRef);\r\n }\r\n\r\n this.setTmplFor();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.isContainerLoaded = false;\r\n document.removeEventListener(\"scroll\", this.trackScrolling.bind(this));\r\n\r\n // Unobserve Comments Container\r\n if (this.minimalContainerRef && this.minimalContainerRef.current) {\r\n this.minimalContainerObserver.unobserve(this.minimalContainerRef.current);\r\n }\r\n\r\n // Unobserve Overlay Comments Container\r\n if (this.overlayContainerRef) {\r\n this.overlayObserver.unobserve(this.overlayContainerRef);\r\n }\r\n }\r\n\r\n render() {\r\n if (this.state.displayState == enums.commentsStatusType.notDetermined) { return null; }\r\n\r\n const { me, managedClasses, usersConnector, users, market, responsiveClass, t, content, mainTelemetryObject, requestContext, commentDisplayType, specificCommentId, componentConnector, theme} = this.props;\r\n if (!content) { return null; }\r\n\r\n const { commentStatus, url, commentWhiteListSegments, commentBlackListSegments } = content;\r\n if (commentStatus == \"Off\") {\r\n return null;\r\n }\r\n\r\n if (!isValidURL(getContextData(requestContext.data.locationHref, \"locationHref\"), url, commentWhiteListSegments, commentBlackListSegments)) {\r\n return null;\r\n }\r\n\r\n const isMobile = this.props.responsiveClass?.includes(enums.responsiveLevels.MobilePopup);\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n const avatarUrl = me && (me.state != enums.userStateType.newUser && me.avatarStatus == enums.userAvatarStatusType.normal ? me.avatarUrl || placeholderImages.avatar : placeholderImages.avatar);\r\n const isExpanded = this.isComponentExpanded();\r\n const contentDisabled = commentStatus != \"On\";\r\n\r\n const renderParams = { me, managedClasses, usersConnector, users, market, responsiveClass, t, content, isSuperApp, isExpanded, contentDisabled, avatarUrl, isMobile, mainTelemetryObject, componentConnector, theme };\r\n const isOverlay = commentDisplayType === \"overlay\";\r\n const commmentView = isOverlay ? this.renderOverlay(renderParams) : this.renderDefaultOrCompact(renderParams);\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n compactStartConversationButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.compactStartConversationButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.compactStartConversationButton),\r\n compactJoinConversationButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.compactJoinConversationButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.compactJoinConversationButton),\r\n overlayAddCommentButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.overlayAddCommentButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.overlayAddCommentButton),\r\n overlayStartConversationButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.overlayStartConversationButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.overlayStartConversationButton),\r\n overlayJoinConversationButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.overlayJoinConversationButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.overlayJoinConversationButton),\r\n mobileFloaterButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.mobileFloaterButton}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.mobileFloaterButton),\r\n overlayComments: addOrUpdateTelemetryObject(mainTelemetryObject, {...commentTelemetryContracts.overlayComments}, { id: content.cmsId }, this.telemetryObjects && this.telemetryObjects.overlayComments)\r\n };\r\n\r\n return \r\n { commmentView }\r\n
    \r\n
    ;\r\n }\r\n\r\n renderContentPanel() {\r\n const { commentDisplayType, managedClasses, popupConnector, commentConnector, t, contents, content, mainTelemetryObject, responsiveClass, market, componentConnector, theme } = this.props;\r\n const isExpanded = this.isComponentExpanded();\r\n const props = { commentDisplayType, content, t, managedClasses, popupConnector, commentConnector, contents, responsiveClass, isExpanded, mainTelemetryObject, market, componentConnector, theme };\r\n return ;\r\n }\r\n\r\n renderCommentList() {\r\n const { componentConnector, commentConnector, responsiveClass, me, t, managedClasses, usersConnector, popupConnector, users, market, content, mainTelemetryObject, theme, commentDisplayType, specificCommentId } = this.props;\r\n const { commentStatus, comments, id: contentId, totalCommentCount } = content;\r\n const contentDisabled = commentStatus != \"On\";\r\n const isExpanded = this.isComponentExpanded();\r\n const isInZeroState = this.state.displayState == enums.commentsStatusType.zero;\r\n const displayNotInitialized = this.state.displayState == enums.commentsStatusType.notDetermined;\r\n const onCommentBoxInitialized = this.onCommentBoxInitialized.bind(this);\r\n\r\n if (!contentDisabled && !isInZeroState && !displayNotInitialized) {\r\n return ;\r\n }\r\n }\r\n\r\n handleKeyDown(e) {\r\n if (e.keyCode == 9) {\r\n const target = window.document.getElementById(`joinButton_${this.props.content.id}`);\r\n if (target != document.activeElement) {\r\n if (target) {\r\n target.focus();\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderDefaultOrCompact(renderParams) {\r\n const {t, managedClasses, responsiveClass, isSuperApp, isExpanded, contentDisabled } = renderParams;\r\n const isCompactFloatMode = this.props.commentDisplayType === \"compactFloat\";\r\n const isMobile = this.props.responsiveClass?.includes(enums.responsiveLevels.MobilePopup);\r\n const isZeroState = this.state.displayState == enums.commentsStatusType.zero;\r\n const buttonName = isZeroState ? t.CommentStartConversation : t.CommentJoinConversation;\r\n\r\n return (\r\n !isExpanded && this.compactCommentsClickHandler(e)}\r\n onKeyDown={(e) => this.handleKeyDown(e)}\r\n >\r\n { contentDisabled\r\n ? this.renderContentDisabledSection(renderParams)\r\n : \r\n { this.renderContentPanel() }\r\n { this.renderCommentList() }\r\n {
    {this.renderDefaultCTAButton()}
    }\r\n\r\n { isCompactFloatMode && !this.isComponentExpanded() &&\r\n (isMobile\r\n ? this.renderOverlayCTAButton()\r\n :
    {this.renderDefaultCTAButton()}
    \r\n )\r\n }\r\n
    \r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderOverlay(renderParams) {\r\n const { managedClasses, responsiveClass, content, contentDisabled, isMobile } = renderParams;\r\n const contentThumbnailUrl = content.thumbnail ? content.thumbnail : placeholderImages.content;\r\n return (\r\n \r\n { contentDisabled\r\n ? this.renderContentDisabledSection(renderParams)\r\n : \r\n { !this.state.isOverlayActive && !this.isComponentScrolledDown() && this.renderOverlayCTAButton() }\r\n\r\n { this.state.isOverlayActive &&\r\n \r\n { !isMobile &&\r\n \r\n { this.renderContentPanel() }\r\n this.hideOverlayHandler()} className=\"cwt-close-button\" title = \"Close\">\r\n {close2} \r\n \r\n \r\n }\r\n\r\n { isMobile &&\r\n
    \r\n this.hideOverlayHandler()} className=\"cwt-fast-button cwt-navbar-button\" >\r\n {chevron_left} \r\n \r\n
    \r\n \"Content\r\n
    \r\n {content.title}\r\n
    \r\n }\r\n\r\n
    { this.overlayContainerRef = el; })}>\r\n {this.renderCommentList()}\r\n
    \r\n
    \r\n }\r\n
    \r\n }\r\n \r\n );\r\n }\r\n\r\n renderContentDisabledSection(renderParams) {\r\n const { me, avatarUrl, usersConnector, users, market, managedClasses, t, componentConnector, theme } = renderParams;\r\n return (\r\n
    \r\n {me &&\r\n
    \r\n { avatarFallback(e); }}\r\n onMouseEnter={(e) => this.showUserCard(e, me.id)}\r\n />\r\n
    \r\n }\r\n {this.state.userCardVisible &&\r\n this.setState({userCardVisible: false}),\r\n triggerRef: this.commentContainerRef,\r\n isHover: true,\r\n mainTelemetryObject: this.props.mainTelemetryObject\r\n }}\r\n />\r\n }\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderDefaultCTAButton() {\r\n if (this.isComponentExpanded()) { return; }\r\n\r\n const { t, content } = this.props;\r\n const { totalCommentCount } = content || {};\r\n const isZeroState = this.state.displayState == enums.commentsStatusType.zero;\r\n const buttonName = isZeroState ? t.CommentStartConversation : t.CommentJoinConversation;\r\n const buttonText = isZeroState ? t.CommentStartConversation : `${t.CommentJoinConversation}${totalCommentCount && totalCommentCount > 0 && ` (${totalCommentCount}) `}`;\r\n const telemetryObject = this.telemetryObjects && (isZeroState ? this.telemetryObjects.compactStartConversationButton : this.telemetryObjects.compactJoinConversationButton);\r\n\r\n const showCommentsFloatButton = (\r\n this.showCompactCommentsHandler()}\r\n id={`joinButton_${content.id}`}\r\n className=\"cwt-fast-button cwt-compact-cta-button\"\r\n aria-live=\"assertive\"\r\n type=\"button\"\r\n tabIndex={1}\r\n name={buttonName}\r\n {...renderHybrid(telemetryObject, true)}\r\n >\r\n \r\n {buttonText} \r\n {comment}\r\n \r\n \r\n );\r\n\r\n return
    {showCommentsFloatButton}
    ;\r\n }\r\n\r\n renderOverlayCTAButton() {\r\n const isMobile = this.props.responsiveClass?.includes(enums.responsiveLevels.MobilePopup);\r\n if (!this.shouldRenderCTAButton(isMobile)) { return; }\r\n const isMobileOrArticleOneBlock = isMobile || this.props.responsiveClass?.includes(enums.responsiveLevels.articleOneBlock);\r\n\r\n const { t, content, me, managedClasses } = this.props;\r\n const { totalCommentCount } = content || {};\r\n const isExistingUser = me && me.state && me.state != enums.userStateType.anonymous;\r\n const avatarUrl = me && (me.state != enums.userStateType.newUser && me.avatarStatus == enums.userAvatarStatusType.normal ? me.avatarUrl || placeholderImages.avatar : placeholderImages.avatar);\r\n const hasComment = totalCommentCount > 0;\r\n const showAddCommentMessage = !isMobileOrArticleOneBlock && hasComment && isExistingUser;\r\n const showProfilePicture = !isMobileOrArticleOneBlock && isExistingUser;\r\n const commentsCountLabel = totalCommentCount && {totalCommentCount} ;\r\n const isOverlay = this.props.commentDisplayType == \"overlay\";\r\n\r\n // Decide Button Message\r\n let buttonMessage = t.CommentStartConversation;\r\n if (hasComment) { buttonMessage = isExistingUser ? t.CommentAddComment : t.CommentJoinConversation; }\r\n\r\n // Decide Telemetry Object\r\n let telemetryObject;\r\n if (this.telemetryObjects) {\r\n if (isMobileOrArticleOneBlock) {\r\n telemetryObject = this.telemetryObjects.mobileFloaterButton;\r\n } else if (showAddCommentMessage) {\r\n telemetryObject = this.telemetryObjects.overlayAddCommentButton;\r\n } else if (hasComment) {\r\n telemetryObject = this.telemetryObjects.overlayJoinConversationButton;\r\n } else {\r\n telemetryObject = this.telemetryObjects.overlayStartConversationButton;\r\n }\r\n }\r\n\r\n const renderProfileImg = () =>\r\n showProfilePicture &&\r\n
    \r\n \"user{ avatarFallback(e); }}/>\r\n
    ;\r\n\r\n const renderButtonIcon = () => {comment} {hasComment && commentsCountLabel} ;\r\n const ShowCommentsButtonType = isMobileOrArticleOneBlock ? OutlineButton : AccentButton;\r\n const showCommentsButton = this.showOverlayCommentsHandler()}\r\n className={classNames(\r\n \"cwt-fast-button\",\r\n \"cwt-overlay-cta-button\",\r\n [\"cwt-overlay-cta-button-desktop\", !isMobileOrArticleOneBlock],\r\n [managedClasses.buttonFadeInContainer, this.state.buttonVisibilityTurnedOn && isMobileOrArticleOneBlock && !isOverlay],\r\n [managedClasses.buttonFadeOutContainer, !this.state.buttonVisibilityTurnedOn && isMobileOrArticleOneBlock && !isOverlay]\r\n )}\r\n beforeContent={renderProfileImg}\r\n afterContent={renderButtonIcon}\r\n aria-live=\"assertive\"\r\n type=\"button\"\r\n name={t.CommentJoinConversation}\r\n {...renderHybrid(telemetryObject, true)}\r\n >\r\n { !isMobileOrArticleOneBlock &&
    {buttonMessage}
    }\r\n ;\r\n\r\n return showCommentsButton;\r\n }\r\n\r\n expandComponent() {\r\n this.setState({\r\n displayState: enums.commentsStatusType.expanded\r\n });\r\n }\r\n\r\n showUserCard(e, userId) {\r\n const me = this.props.me;\r\n if (me.state == enums.userStateType.anonymous) { return; }\r\n this.setState({userCardVisible: true, userCardUserId: userId});\r\n }\r\n\r\n compactCommentsClickHandler(e) {\r\n this.expandComponent();\r\n }\r\n\r\n showCompactCommentsHandler() {\r\n this.expandComponent();\r\n this.jumpToCommentsSection();\r\n }\r\n\r\n showOverlayCommentsHandler() {\r\n registerVideoPlayStarted(this.hideOverlayHandler);\r\n this.setState({isOverlayActive: true}, () => this.jumpToCommentsSection());\r\n }\r\n\r\n jumpToCommentsSection() {\r\n this.addCommentsHashToUrl();\r\n this.scrollCommentContainerIntoView();\r\n this.focusToCommentBox();\r\n }\r\n\r\n addCommentsHashToUrl() {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n const currentHref = document.location.href;\r\n if (!isSuperApp && !currentHref.includes(\"#comments\")) {\r\n if (window.history) {\r\n history.pushState({name: \"displayComments\"}, \"comments\", currentHref+\"#comments\");\r\n } else {\r\n document.location.href = currentHref+\"#comments\";\r\n }\r\n }\r\n }\r\n\r\n removeCommentsFromHashUrl() {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n if (!isSuperApp && document.location.href.includes(\"#comments\") && \"history\" in window) {\r\n window.history.replaceState(null, null, \" \");\r\n }\r\n }\r\n\r\n hideOverlayHandler() {\r\n unregisterVideoPlayStarted(this.hideOverlayHandler);\r\n this.removeCommentsFromHashUrl();\r\n this.setState({isOverlayActive: false});\r\n }\r\n\r\n toggleSocialCommentState(e) {\r\n const isOverlay = this.props.commentDisplayType == \"overlay\";\r\n if (isOverlay) {\r\n const isOverlayActive = this.state.isOverlayActive;\r\n return isOverlayActive ? this.hideOverlayHandler() : this.showOverlayCommentsHandler();\r\n } else {\r\n if (!this.isComponentExpanded()) { this.expandComponent(); }\r\n this.jumpToCommentsSection();\r\n }\r\n }\r\n\r\n commentContainerIntersectionHandler(entries) {\r\n this.setState({componentIsInView: entries[0].intersectionRatio >= .1});\r\n this.minimalContainerRef && this.minimalContainerRef.current && dispatchTelemetryEvent({...TelemetryEventMap.genericLoaded, sendPeregrine: true}, this.minimalContainerRef.current);\r\n }\r\n\r\n onCommentBoxInitialized(commentBox: HTMLDivElement) {\r\n this.commentBox = commentBox;\r\n const isOverlayOrCompact = this.props.commentDisplayType == \"overlay\" || this.props.commentDisplayType.includes(\"compact\");\r\n if (isOverlayOrCompact) {\r\n setTimeout(() => {\r\n this.jumpToCommentsSection();\r\n }, 250);\r\n }\r\n }\r\n\r\n trackScrolling() {\r\n const isEntireComponentScrolled = this.isComponentScrolledDown();\r\n const showButton = !this.state.componentIsInView && !isEntireComponentScrolled;\r\n this.setFloatingButtonVisibility(showButton);\r\n }\r\n\r\n isComponentScrolledDown() {\r\n return this.componentEndIndicatorRef.current ? this.componentEndIndicatorRef.current.getBoundingClientRect().top < 250 : false;\r\n }\r\n\r\n focusToCommentBox() {\r\n return this.commentBox && this.commentBox.focus({preventScroll: true});\r\n }\r\n\r\n isCommentContainerExist() {\r\n return !!((this.commentContainerRef && this.commentContainerRef.current) || (this.minimalContainerRef && this.minimalContainerRef.current));\r\n }\r\n\r\n scrollCommentContainerIntoView() {\r\n const containerExist = this.isCommentContainerExist();\r\n return containerExist && (this.commentContainerRef.current || this.minimalContainerRef.current).scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"start\"\r\n });\r\n }\r\n\r\n isComponentExpanded() {\r\n return this.state.displayState == enums.commentsStatusType.expanded;\r\n }\r\n\r\n setFloatingButtonVisibility(turnOn: boolean) {\r\n if (turnOn) {\r\n this.setState({isCompactFloatButtonVisible: true, buttonVisibilityTurnedOn: true});\r\n } else {\r\n this.setState({buttonVisibilityTurnedOn: false}, () => setTimeout(() => { this.setState({isCompactFloatButtonVisible: false}); }, 350));\r\n }\r\n }\r\n\r\n shouldRenderCTAButton(isMobile) {\r\n const { isHeaderInView } = this.state;\r\n const mobileOverlayActive = isMobile && this.state.isOverlayActive;\r\n const mobileSocialBarInView = isMobile && isHeaderInView;\r\n return !mobileOverlayActive && !mobileSocialBarInView;\r\n }\r\n\r\n /** Watch if social-bar experience is in view */\r\n watchSocialBar() {\r\n const isInViewHandler = (e) => {\r\n const headerElement = document.querySelector(\"[class^='viewsHeader']\") || document.querySelector(\"[class^='contentSocialBarContainer']\");\r\n if (!headerElement) {\r\n this.state.isHeaderInView && this.setState({isHeaderInView: false});\r\n return;\r\n }\r\n const rect = headerElement.getBoundingClientRect();\r\n const isInView = (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= document.documentElement.clientHeight &&\r\n rect.right <= document.documentElement.clientWidth\r\n );\r\n this.setState({isHeaderInView: isInView});\r\n };\r\n window.addEventListener(\"scroll\", isInViewHandler, false);\r\n window.addEventListener(\"DOMContentLoaded\", isInViewHandler, false);\r\n window.addEventListener(\"load\", isInViewHandler, false);\r\n window.addEventListener(\"resize\", isInViewHandler, false);\r\n }\r\n}\r\nexport default connect(mapStateToProps)(Comment);","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport function registerVideoPlayStarted(onPlayCallback: (evt: any) => void) {\r\n const vids = Array.from(document.querySelectorAll(\"video\"));\r\n let lastClickTime = 0;\r\n document.addEventListener(\"click\", e => lastClickTime = e.timeStamp);\r\n vids.map(v => v.addEventListener(\"play\", e => e.timeStamp - lastClickTime < 50 && onPlayCallback(e)));\r\n}\r\n\r\nexport function unregisterVideoPlayStarted(onPlayCallback: (evt: any) => void) {\r\n const vids = Array.from(document.querySelectorAll(\"video\"));\r\n vids.map(v => v.removeEventListener(\"play\", onPlayCallback));\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialCommentExperienceRenderErrorComment,\r\n SocialCommentExperienceRenderErrorCommentBox,\r\n SocialCommentExperienceRenderErrorCommentItem,\r\n SocialCommentExperienceRenderErrorCommentList,\r\n SocialCommentExperienceRenderErrorContentPanel,\r\n SocialCommentExperienceRenderErrorDeleteMenu,\r\n SocialCommentExperienceRenderErrorDisabledMessage,\r\n SocialCommentExperienceRenderErrorFollowButton,\r\n SocialCommentExperienceRenderErrorProfileEducator,\r\n SocialCommentExperienceRenderErrorReactionMenu,\r\n SocialCommentExperienceRenderErrorReactionPanel,\r\n SocialCommentExperienceRenderErrorReplyList,\r\n SocialCommentExperienceRenderErrorReportMenu,\r\n SocialCommentExperienceRenderErrorSortBox,\r\n SocialCommentExperienceRenderErrorTypingUsers,\r\n SocialCommentExperienceRenderErrorUserCard,\r\n SocialCommentExperienceRenderErrorUnknownComponent\r\n} from \"@msnews/diagnostics\";\r\n\r\nimport { Comment } from \"./comment/Comment\";\r\nimport CommentBox from \"./comment/comment-box/CommentBox\";\r\nimport CommentItem from \"./comment/comment-item/CommentItem\";\r\nimport CommentList from \"./comment/comment-list/CommentList\";\r\nimport ContentPanel from \"./comment/content-panel/ContentPanel\";\r\nimport DisabledMessage from \"./comment/disabled-message/DisabledMessage\";\r\nimport ProfileEducator from \"./comment/profile-educator/ProfileEducator\";\r\nimport ReplyList from \"./comment/reply-list/ReplyList\";\r\nimport TypingUsers from \"./comment/typing-users/TypingUsers\";\r\nimport UserCard from \"./comment/user-card/UserCard\";\r\n\r\nimport DeleteMenu from \"./common/delete-menu/DeleteMenu\";\r\nimport ReactionMenu from \"./common/reaction-menu/ReactionMenu\";\r\nimport ReactionPanel from \"./common/reaction-panel/ReactionPanel\";\r\nimport ReportMenu from \"./common/report-menu/ReportMenu\";\r\nimport SortBox from \"./common/sort-box/SortBox\";\r\n\r\nimport FollowButton from \"./follow-button/FollowButton\";\r\n\r\nexport const RenderErrors = {\r\n [Comment.name]: SocialCommentExperienceRenderErrorComment,\r\n [CommentBox.name]: SocialCommentExperienceRenderErrorCommentBox,\r\n [CommentItem.name]: SocialCommentExperienceRenderErrorCommentItem,\r\n [CommentList.name]: SocialCommentExperienceRenderErrorCommentList,\r\n [ContentPanel.name]: SocialCommentExperienceRenderErrorContentPanel,\r\n [DeleteMenu.name]: SocialCommentExperienceRenderErrorDeleteMenu,\r\n [DisabledMessage.name]: SocialCommentExperienceRenderErrorDisabledMessage,\r\n [FollowButton.name]: SocialCommentExperienceRenderErrorFollowButton,\r\n [ProfileEducator.name]: SocialCommentExperienceRenderErrorProfileEducator,\r\n [ReactionMenu.name]: SocialCommentExperienceRenderErrorReactionMenu,\r\n [ReactionPanel.name]: SocialCommentExperienceRenderErrorReactionPanel,\r\n [ReplyList.name]: SocialCommentExperienceRenderErrorReplyList,\r\n [ReportMenu.name]: SocialCommentExperienceRenderErrorReportMenu,\r\n [SortBox.name]: SocialCommentExperienceRenderErrorSortBox,\r\n [TypingUsers.name]: SocialCommentExperienceRenderErrorTypingUsers,\r\n [UserCard.name]: SocialCommentExperienceRenderErrorUserCard,\r\n UnknownComponent: SocialCommentExperienceRenderErrorUnknownComponent\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, BridgeEventNames, ResponsiveClassManager, SocialTelemetryManager, addOrUpdateTelemetryObject, appErrorLogger, enums, handleBridgeEvent, hasThemeBase, preventSelection, renderHybrid } from \"@msnews/social-utils\";\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\nimport { BaseExperience, InitialCommonExperienceProps } from \"@msnews/experiences-base\";\r\nimport { HandledPropsKeys, getContextData } from \"@msnews/core\";\r\nimport { SocialCommentHandledProps, SocialCommentUnhandledProps } from \"./SocialComment.props\";\r\n\r\nimport Comment from \"./comment/Comment\";\r\nimport { ExperienceIds } from \"@msnews/experiences-constants\";\r\nimport React from \"react\";\r\nimport { RenderErrors } from \"./SocialComment.errors\";\r\nimport { SocialService } from \"@msnews/social-data-service\";\r\nimport { TelemetryDOM } from \"@msnews/telemetry-core\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\ndeclare global {\r\n interface Window {\r\n loginWindow: any;\r\n trackFromWidget: any;\r\n sapphireBridge: any;\r\n msaLoginWindow: any;\r\n signalR: any;\r\n auth2: any;\r\n googleInit: any;\r\n gapi: any;\r\n FB: any;\r\n fbAsyncInit: any;\r\n listenMSALoginWindow: any;\r\n msaLogin: any;\r\n clipboardData: any;\r\n AzureStorage: any;\r\n require: (r: any, f: any) => void;\r\n ReactNativeWebView: any;\r\n }\r\n}\r\n\r\nexport class SocialComment extends BaseExperience {\r\n\r\n /** The Comment default prop contract. Describes any default values for any component handled props */\r\n public static defaultProps: Partial = {\r\n experienceName: ExperienceIds.socialComment\r\n };\r\n private handleTelemetryCall: Function;\r\n private handlePartialPageImpressionCall: Function;\r\n private handleUpdateTemplValueCallback: Promise;\r\n private handleAppErrorEventCall: (AppError) => void;\r\n telemetryObjects: any;\r\n\r\n constructor(props, context) {\r\n super(props, context);\r\n\r\n this.handleTelemetryCall = this.props.handleTelemetryCall;\r\n this.handlePartialPageImpressionCall = this.props.handlePartialPageImpressionCall;\r\n this.handleAppErrorEventCall = this.props.handleAppErrorEventCall;\r\n this.handleUpdateTemplValueCallback = this.props.handleUpdateTemplValueCallback;\r\n if (this.handleAppErrorEventCall) {\r\n appErrorLogger.setOnAppError(this.handleAppErrorEventCall);\r\n }\r\n this.telemetryObjects = {};\r\n }\r\n\r\n /** @inheritdoc */\r\n protected handledProps: HandledPropsKeys = {\r\n ...InitialCommonExperienceProps,\r\n checkAndLogReducerError: undefined\r\n };\r\n\r\n /** @inheritdoc */\r\n public componentWillMount(): void {\r\n try {\r\n const locationHref = getContextData(this.props.requestContext.data.locationHref, \"locationHref\");\r\n const ppeEnvironmentSelected = locationHref.toLowerCase().indexOf(enums.selectPpeParameter) > -1;\r\n if (ppeEnvironmentSelected) { SocialService.setDomain(enums.externalUrls.ppeApi); }\r\n } catch (e) {\r\n logger.log(\"Error occured using requestContext.\");\r\n }\r\n }\r\n\r\n /** @ineritdoc */\r\n public componentDidMount(): void {\r\n this.setupTelemetry();\r\n this.setupBridge();\r\n this.setupResponsiveClass();\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n isSuperApp && this.preventSelectionInSuperapp();\r\n }\r\n\r\n /** @inheritdoc */\r\n public componentWillUnmount(): void {\r\n this.teardownBridge();\r\n }\r\n\r\n public componentDidCatch(error, info): void {\r\n const componentRegex = new RegExp(\"in (.+) .created by\");\r\n const componentNameResult = info.componentStack.match(componentRegex);\r\n let componentName = componentNameResult && componentNameResult[1] || \"unknown\";\r\n const reduxResult = componentName.match(/Connect\\((.+)\\)/);\r\n const isRedux = (reduxResult && reduxResult[1]) != null;\r\n if (isRedux) {\r\n componentName = reduxResult[1];\r\n }\r\n const isPopup = info.componentStack.indexOf(\"created by Popup\") > 0;\r\n const appError = RenderErrors[componentName] || RenderErrors.UnknownComponent;\r\n\r\n const { id } = this.props;\r\n\r\n appErrorLogger.log({\r\n ...appError,\r\n message: \"SocialComment experience component failed to render\",\r\n pb: {\r\n ...appError.pb,\r\n customMessage: componentName + \" \" + error.name + \": \" + error.message,\r\n stack: error.stack,\r\n socialProps: { id },\r\n isPopup,\r\n isRedux\r\n }\r\n } as AppError);\r\n }\r\n\r\n public componentDidUpdate() {\r\n this.props.checkAndLogReducerError();\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n public preventSelectionInSuperapp() {\r\n document.addEventListener(\"touchstart\", preventSelection);\r\n }\r\n\r\n public preparePropsToPass(propsToPass) {\r\n // Add and pass a container telemetry object matching with the module\r\n const moduleTelemetryContract = { name: \"COMMENT\" };\r\n this.telemetryObjects.module = addOrUpdateTelemetryObject(this.props.mainTelemetryObject, moduleTelemetryContract, {}, this.telemetryObjects.module);\r\n propsToPass.mainTelemetryObject = this.telemetryObjects.module;\r\n }\r\n\r\n /** @inheritdoc */\r\n public render(): JSX.Element {\r\n super.render();\r\n\r\n const { t, theme, children, requestContext, managedClasses } = this.props;\r\n const propsToPass = {...this.unhandledProps(), children, markTtvr: this.markTtvr, t, theme, requestContext};\r\n this.preparePropsToPass(propsToPass);\r\n\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n const { mainContainer, mainSuperAppContainer, mainInSuperappModal } = managedClasses;\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private setupTelemetry = () => {\r\n if (this.handleTelemetryCall && this.handlePartialPageImpressionCall) {\r\n SocialTelemetryManager.setPrimeHandlers({\r\n handleTelemetryCall: this.handleTelemetryCall,\r\n handlePartialPageImpressionCall: this.handlePartialPageImpressionCall,\r\n handleUpdateTemplValueCallback: this.handleUpdateTemplValueCallback\r\n });\r\n }\r\n };\r\n\r\n private setupBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.addEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n private teardownBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.removeEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n /** Helper to mark time to visually ready */\r\n private markTtvr = () => {\r\n window.requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n super.markTimeToVisuallyReady(true);\r\n }, 0);\r\n });\r\n };\r\n\r\n private setupResponsiveClass() {\r\n ResponsiveClassManager.setWindow(window);\r\n ResponsiveClassManager.addListener(this, (responsiveClass) => {\r\n if (this.props.styleConnector && responsiveClass != this.props.responsiveClass) {\r\n this.props.styleConnector.updateResponsiveClass(responsiveClass);\r\n }\r\n });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { neutralLayerCardContainer, neutralOutlineRest } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const DisabledMessageStyles = {\r\n\r\n disabledMessageContainer: {\r\n display: \"block\",\r\n margin: \"16px 0\",\r\n padding: \"12px !important\",\r\n \"border-radius\": \"8px\",\r\n background: neutralLayerCardContainer,\r\n \"text-align\": \"center\",\r\n\r\n \"& .cwt-icon.cwt-disabled-message\": {\r\n display: \"inline\",\r\n color: neutralOutlineRest,\r\n fill: \"#ff0000\",\r\n opacity: \"1\",\r\n\r\n \"& .cwt-icon-vector\": {\r\n margin: \"-4px 8px 0\",\r\n display: \"inline-flex\",\r\n \"vertical-align\": \"middle\"\r\n }\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const FollowButtonStyles = {\r\n followButtonContainer: {\r\n \"min-width\": \"100px\"\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst shadow = \"0px 0px 5px rgb(0 0 0 / 10%), 0 8px 14px 0px rgb(0 0 0 / 15%)\";\r\nconst arrowWidth = 10;\r\n\r\nexport const ProfileEducatorStyles = (config: DesignSystem) => ({\r\n profileEducator: {\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n width: \"200px\",\r\n padding: \"12px 16px\",\r\n background: neutralLayerCard,\r\n \"border-radius\": \"4px\",\r\n \"-webkit-box-shadow\": shadow,\r\n \"-moz-box-shadow\": shadow,\r\n \"box-shadow\": shadow,\r\n color: neutralForegroundRest,\r\n\r\n \"&:after\": {\r\n position: \"absolute\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: `${arrowWidth}px`,\r\n bottom: `-${arrowWidth}px`,\r\n content: \"' '\",\r\n display: \"block\",\r\n width: \"0\",\r\n height: \"0\",\r\n \"border-left\": `${arrowWidth}px solid transparent`,\r\n \"border-right\": `${arrowWidth}px solid transparent`,\r\n \"border-top\": `${arrowWidth}px solid white`,\r\n \"border-top-color\": neutralLayerCard\r\n }\r\n },\r\n\r\n profileEducatorHeader: {\r\n \"font-size\": \"14px\",\r\n \"font-weight\": \"600\",\r\n \"line-height\": \"26px\"\r\n },\r\n\r\n profileEducatorMessage: {\r\n margin: \"0\",\r\n \"font-size\": \"14px\"\r\n },\r\n\r\n profileEducatorCloseButton: {\r\n position: \"absolute\",\r\n top: \"0\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"0\",\r\n \"font-size\": \"14px\",\r\n opacity: \".55\"\r\n },\r\n\r\n profileEducatorPopover: {\r\n bottom: `${arrowWidth}px`\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialCommentProps as BaseSocialCommentProps,\r\n SocialCommentUnhandledProps as BaseSocialCommentUnhandledProps,\r\n SocialCommentHandledProps,\r\n SocialCommentManagedClasses\r\n} from \"./SocialComment.props\";\r\nimport { SocialCommentConfigSchema, mockConfig, mockDefaultState, mockState } from \"./experience-info\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialComment as BaseSocialComment } from \"./SocialComment\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ExperienceInfo } from \"@msnews/core\";\r\nimport { SocialCommentActions } from \"./SocialComment.actions\";\r\nimport { SocialCommentClassNameContract } from \"./SocialComment.classnames\";\r\nimport { SocialCommentConfig } from \"./SocialComment.config\";\r\nimport { SocialCommentConnector } from \"./SocialComment.connector\";\r\nimport { SocialCommentInspector } from \"./SocialComment.inspector\";\r\nimport { SocialCommentReducer } from \"./SocialComment.reducer\";\r\nimport { SocialCommentState } from \"./SocialComment.state\";\r\nimport { SocialCommentStyle } from \"./SocialComment.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n// The type returned by manageJss type is very complicated so we'll let the compiler infer the type instead of re-declaring just for the package export\r\nconst SocialComment = manageJss(SocialCommentStyle)(BaseSocialComment);\r\ntype SocialComment = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ntype SocialCommentUnhandledProps = Subtract;\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype SocialCommentProps = ManagedJSSProps;\r\n\r\n// Define the ExperienceInfo object. This is used by tooling\r\nconst ToolingInfo: ExperienceInfo = {\r\n reactComponent: SocialComment,\r\n experienceConfigSchema: SocialCommentConfigSchema,\r\n defaultMockState: mockDefaultState,\r\n mockState: mockState,\r\n mockConfig: mockConfig,\r\n inspector: SocialCommentInspector.inspect\r\n};\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n SocialComment,\r\n SocialCommentActions as CommentActions,\r\n SocialCommentConfig,\r\n SocialCommentConnector,\r\n SocialCommentProps,\r\n SocialCommentReducer,\r\n SocialCommentState,\r\n SocialCommentClassNameContract,\r\n SocialCommentHandledProps,\r\n SocialCommentUnhandledProps,\r\n ToolingInfo\r\n};\r\n\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CommonStyles, CommonSuperAppStyles } from \"@msnews/social-utils\";\r\n\r\nimport { CommentBoxStyles } from \"./comment/comment-box/CommentBox.styles\";\r\nimport { CommentItemStyles } from \"./comment/comment-item/CommentItem.styles\";\r\nimport { CommentListStyles } from \"./comment/comment-list/CommentList.styles\";\r\nimport { CommentStyles } from \"./comment/Comment.styles\";\r\nimport { CommentSuperAppStyles } from \"./comment/themes/superapp/CommentSuperApp.styles\";\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { ContentPanelStyles } from \"./comment/content-panel/ContentPanel.styles\";\r\nimport { DeleteMenuMenuStyles } from \"./common/delete-menu/DeleteMenu.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DisabledMessageStyles } from \"./comment/disabled-message/DisabledMessage.styles\";\r\nimport { FollowButtonStyles } from \"./follow-button/FollowButton.styles\";\r\nimport { FollowButtonSuperAppStyles } from \"./follow-button/themes/superapp/FollowButtonSuperApp.styles\";\r\nimport { ProfileEducatorStyles } from \"./comment/profile-educator/ProfileEducator.styles\";\r\nimport { ReactionMenuStyles } from \"./common/reaction-menu/ReactionMenu.styles\";\r\nimport { ReactionPanelStyles } from \"./common/reaction-panel/ReactionPanel.styles\";\r\nimport { ReplyListStyles } from \"./comment/reply-list/ReplyList.styles\";\r\nimport { ReportMenuStyles } from \"./common/report-menu/ReportMenu.styles\";\r\nimport { ReportMenuSuperAppStyles } from \"./common/report-menu/themes/superapp/ReportMenuSuperApp.styles\";\r\nimport { SocialCommentClassNameContract } from \"./SocialComment.classnames\";\r\nimport { SortBoxStyles } from \"./common/sort-box/SortBox.styles\";\r\nimport { TypingUsersStyles } from \"./comment/typing-users/TypingUsers.styles\";\r\nimport { UserCardStyles } from \"./comment/user-card/UserCard.styles\";\r\n\r\n/**\r\n * The Comment styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const SocialCommentStyle: ComponentStyles < SocialCommentClassNameContract, DesignSystem > = (config: DesignSystem) => ({\r\n ...CommonStyles(config),\r\n ...CommentStyles(config),\r\n ...ContentPanelStyles(config),\r\n ...CommentBoxStyles(config),\r\n ...CommentListStyles(config),\r\n ...CommentItemStyles(config),\r\n ...DisabledMessageStyles,\r\n ...ReplyListStyles(config),\r\n ...UserCardStyles(config),\r\n ...ReactionMenuStyles(config),\r\n ...ReactionPanelStyles(config),\r\n ...ReportMenuStyles(config),\r\n ...SortBoxStyles(config),\r\n ...FollowButtonStyles,\r\n ...DeleteMenuMenuStyles(config),\r\n ...TypingUsersStyles(config),\r\n ...ProfileEducatorStyles(config),\r\n\r\n ...CommonSuperAppStyles(config),\r\n ...CommentSuperAppStyles(config),\r\n ...FollowButtonSuperAppStyles(config),\r\n ...ReportMenuSuperAppStyles(config)\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, accentFillHover, accentFillRest, accentForegroundCut, accentForegroundRest, isDarkMode, neutralFillActive, neutralFillStealthActive, neutralFillStealthHover, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { avatarPadding, avatarSize, enums, reset } from \"@msnews/social-utils\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const mainPadding = 15;\r\nconst overlayZIndex = \"99999\"; // for comments for overaly type and floating buttons\r\n\r\nexport const CommentStyles = (config: DesignSystem) => ({\r\n commentContainer: {\r\n ...reset,\r\n \"max-width\": \"1024px\",\r\n \"min-width\": \"260px\",\r\n margin: \"32px auto\",\r\n padding: `${mainPadding}px`,\r\n \"box-sizing\": \"border-box\",\r\n border: \"1px solid #F2F2F2\",\r\n \"border-color\": neutralFillActive,\r\n \"border-radius\": \"8px\",\r\n position: \"relative\",\r\n \"scroll-margin-top\": \"9rem\",\r\n\r\n \"&, &:focus\": {\r\n outline: \"none\"\r\n },\r\n\r\n \"&:focus\": {\r\n outline: \"none\"\r\n },\r\n\r\n /* CONTENT DISABLED MESSAGE */\r\n \"& .cwt-content-disabled-container\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"stretch\",\r\n\r\n \"& .cwt-avatar-container\": {\r\n position: \"relative\",\r\n display: \"flex\",\r\n margin: applyLocalizedProperty(\"0 13px 0 0\", \"0 0 0 13px\", config.direction),\r\n padding: \"3px 0\",\r\n\r\n \"& .cwt-commentbox-avatar\": {\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n height: avatarSize,\r\n \"border-radius\": \"50%\"\r\n }\r\n },\r\n\r\n \"& .cwt-col-stretch\": {\r\n width: \"100%\"\r\n }\r\n },\r\n\r\n \"& .compact-floating-button\": {\r\n position: \"fixed\",\r\n \"z-index\": overlayZIndex,\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"40px\",\r\n bottom: \"45px\"\r\n },\r\n\r\n // 'ROOT PAGINATION'\r\n \"& .cwt-show-more-comments-btn\": {\r\n margin: \"-4px 0 0px\",\r\n \"margin-bottom\": \"40px\",\r\n \"font-weight\": \"600\",\r\n color: accentFillRest,\r\n fill: \"currentColor\",\r\n opacity: \"1\",\r\n\r\n \"& .cwt-icon-label\": {\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest\r\n }\r\n },\r\n\r\n \"& .cwt-show-comments-btn\": {\r\n display: \"inline-flex\",\r\n padding: \"4px\",\r\n margin: \"-4px\",\r\n \"font-size\": \"13px\",\r\n \"font-weight\": \"500\",\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest,\r\n fill: \"currentColor\",\r\n opacity: \"1\",\r\n \"border-radius\": \"4px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n },\r\n\r\n \"&.previous\": {\r\n \"margin-top\": \"20px\"\r\n },\r\n \"&.more\": {\r\n \"margin-bottom\": \"20px\"\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest\r\n },\r\n\r\n \"& .cwt-icon-vector-up\": {\r\n \"-webkit-transform\": \"rotate(180deg)\"\r\n }\r\n },\r\n\r\n /* 'JOIN-THE-CONVERSATION BUTTON '*/\r\n \"& .cwt-join-conversation-container\": {\r\n display: \"flex\",\r\n \"justify-content\": \"center\",\r\n\r\n \"& .cwt-link\": {\r\n width: \"80vw\",\r\n \"max-width\": \"480px\",\r\n padding: \"12px\",\r\n \"text-align\": \"center\",\r\n \"font-size\": \"16px\",\r\n \"font-weight\": \"600\",\r\n background: neutralLayerCard,\r\n color: isDarkMode(config) ? \"#5CB6FF\" :accentFillRest,\r\n border: \"1px solid \",\r\n \"border-color\": accentFillRest,\r\n \"border-radius\": \"2px\",\r\n transition: \"all .3s ease\",\r\n \"margin-bottom\": \"35px\",\r\n\r\n \"&:hover\": {\r\n color: \"white\",\r\n background: accentFillHover\r\n }\r\n }\r\n },\r\n\r\n // Compact floating button\r\n \"& .cwt-compact-cta-button\": {\r\n \"font-weight\": \"600\",\r\n padding: \"10px 40px\",\r\n \"max-width\": \"unset\",\r\n height: \"auto\",\r\n \"& .cwt-icon\": {\r\n \"font-size\": \"18px\",\r\n color: \"white\",\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"16px\",\r\n padding: \"0\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"10px\",\r\n color: \"white\"\r\n }\r\n }\r\n },\r\n\r\n // Overlay floating button\r\n \"& button.cwt-fast-button.cwt-overlay-cta-button\": {\r\n padding: \"12px 15px\",\r\n height: \"auto\",\r\n \"box-shadow\": \"0px 1.2px 3.6px rgba(0, 0, 0, 0.1), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n position: \"fixed\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"20px\",\r\n bottom: \"45px\",\r\n \"font-size\": \"14px\",\r\n \"border-radius\": \"71px\",\r\n \"&:hover, &:focus\": {\r\n \"box-shadow\": \"0px 1.2px 3.6px rgba(0, 0, 0, 0.05), 0px 2.4px 6.4px rgba(0, 0, 0, 0.13)\"\r\n },\r\n \"& .cwt-icon\": {\r\n \"font-size\": \"14px\",\r\n \"font-weight\": \"bold\",\r\n \"align-items\": \"center\",\r\n color: accentForegroundCut,\r\n \"& .cwt-icon-label\": {\r\n color: accentForegroundCut,\r\n \"line-height\": \"24px\",\r\n \"font-size\": \"14px\"\r\n }\r\n },\r\n \"&.cwt-overlay-cta-button-desktop\": {\r\n height: \"69px\",\r\n padding: \"0 28px\",\r\n \"& .cwt-icon\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"15px\",\r\n \"font-weight\": \"normal\",\r\n \"& .cwt-icon-label\": {\r\n display: \"block\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"-8px\"\r\n }\r\n }\r\n }\r\n },\r\n\r\n [`&.${enums.responsiveLevels.L0}`]: {\r\n \"max-width\": \"100vw\"\r\n },\r\n\r\n [`&.${enums.responsiveLevels.articleOneBlock}`]: {\r\n \"scroll-margin-top\": \"6rem\",\r\n \"& button.cwt-fast-button.cwt-overlay-cta-button\": {\r\n \"border-color\": accentForegroundRest,\r\n background: neutralLayerCard,\r\n padding: \"9px 15px 7px\",\r\n \"& .cwt-icon\": {\r\n \"font-size\": \"18px\",\r\n color: \"unset\",\r\n \"& .cwt-icon-label\": {\r\n color: \"unset\",\r\n \"font-size\": \"14px\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n commentMinimalContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n margin: \"32px 5px\",\r\n padding: \"0 15px 0\",\r\n \"box-shadow\": \"0px 0.6px 1.8px rgba(0, 0, 0, 0.1), 0px 3.2px 7.2px rgba(0, 0, 0, 0.13)\",\r\n background: isDarkMode(config) ? \"rgb(66, 66, 66)\" : \"white\",\r\n border: \"none\",\r\n \"& .cwt-content-disabled-container\": {\r\n padding: \"20px\"\r\n },\r\n \"& ul, li\": {\r\n margin: \"0px\"\r\n },\r\n \"& .cwt-join-container\": {\r\n margin: \"0 -15px\",\r\n\r\n \"& button.cwt-fast-button.cwt-compact-cta-button\": {\r\n width: \"100%\",\r\n \"padding-left\": \"0\",\r\n \"padding-right\": \"0\"\r\n }\r\n },\r\n \"& .cwt-message\": {\r\n \"max-height\": \"44px\",\r\n overflow: \"hidden\"\r\n },\r\n \"&:before\": {\r\n content: \"''\",\r\n transition: \"background-position 0.2s ease-in, opacity 0.1s linear 0.1s\",\r\n width: \"100%\",\r\n height: \"60%\",\r\n position: \"absolute\",\r\n background: isDarkMode(config) ? \"linear-gradient(180deg, rgba(66, 66, 66, 0), rgba(66, 66, 66, 1))\" : \"linear-gradient(180deg, rgba(255, 255, 255, 0), #FFFFFF)\",\r\n \"background-repeat\": \"no-repeat\",\r\n opacity: \"100%\",\r\n \"z-index\": \"1\",\r\n left: \"0\",\r\n right: \"0\",\r\n bottom: \"44px\"\r\n },\r\n \"&:hover:before\": {\r\n cursor: \"pointer\",\r\n \"background-position\": \"0px 100px\",\r\n opacity: \"0%\"\r\n },\r\n\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n \"margin-left\": \"0\",\r\n \"margin-right\": \"0\",\r\n \"border-radius\": \"0\",\r\n \"box-shadow\": \"none\"\r\n }\r\n },\r\n commentZeroStateContainer: {\r\n padding: \"24px\",\r\n border: \"1px solid\",\r\n \"border-color\": neutralFillStealthHover,\r\n background: isDarkMode(config) ? \"rgb(66, 66, 66)\" : \"white\",\r\n display: \"flex\",\r\n \"flex-direction\": \"row\",\r\n \"justify-content\": \"space-between\",\r\n \"align-items\": \"center\",\r\n \"border-radius\": \"8px\",\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n \"padding-left\": \"0\",\r\n \"padding-right\": \"0\",\r\n \"margin-left\": \"0\",\r\n \"margin-right\": \"0\",\r\n \"border-top\": \"1px solid\",\r\n \"border-bottom\": \"1px solid\",\r\n \"border-color\": neutralFillActive,\r\n \"border-radius\": \"0\",\r\n \"flex-direction\": \"column\",\r\n \"justify-content\": \"start\",\r\n \"align-items\": \"center\",\r\n \"box-shadow\": \"none\",\r\n \"& button.cwt-start-button\": {\r\n \"margin-top\": \"5px\"\r\n }\r\n }\r\n },\r\n commentOverlayContainer: {\r\n position: \"fixed\",\r\n \"z-index\": overlayZIndex,\r\n background: neutralLayerCard,\r\n border: \"none\",\r\n top: \"0\",\r\n margin: \"0 auto\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"100vw\",\r\n width: \"550px\",\r\n height: \"100vh\",\r\n overflow: \"auto\",\r\n transition: \".2s ease-in\",\r\n \"& .cwt-close-button\": {\r\n \"z-index\": \"1\",\r\n position: \"fixed\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"32px\",\r\n top: \"18px\",\r\n \"& .cwt-icon\": {\r\n color: isDarkMode(config) ? \"white\" :\"black\",\r\n \"font-size\": \"16px\"\r\n }\r\n },\r\n \"& .cwt-avatar-container\": {\r\n height: \"32px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"10px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-13px\",\r\n \"& .cwt-avatar\": {\r\n \"min-width\": \"32px\",\r\n \"max-width\": \"32px\",\r\n height: \"32px\",\r\n \"border-radius\": \"50%\",\r\n border: \"1px solid white\"\r\n }\r\n },\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n margin: \"0\",\r\n width: \"100vw\",\r\n \"& .overlay-title-container\": {\r\n position: \"sticky\",\r\n \"z-index\": \"3\",\r\n top: `-${mainPadding}px`,\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n width: \"calc(100vw - 38px)\",\r\n \"margin-top\": `-${mainPadding}px`,\r\n \"margin-bottom\": \"30px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: `-${mainPadding}px`,\r\n padding: \"20px 8px 16px\",\r\n [applyLocalizedProperty(\"padding-right\", \"padding-left\", config.direction)]: \"30px\",\r\n background: neutralFillStealthActive,\r\n \"border-bottom\": \"1px solid\",\r\n \"border-color\": neutralFillActive,\r\n \"& .cwt-image-container\": {\r\n \"min-width\": \"40px\",\r\n width: \"40px\",\r\n height: \"40px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"12px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"16px\",\r\n \"& .cwt-content-image\": {\r\n \"object-fit\": \"cover\",\r\n \"border-radius\": \"2px\"\r\n }\r\n },\r\n \"& button.cwt-fast-button.cwt-navbar-button\": {\r\n padding: \"4px\",\r\n \"& .cwt-icon\": {\r\n color: neutralForegroundRest,\r\n \"font-size\": \"16px\"\r\n }\r\n },\r\n \"& .cwt-title\": {\r\n display: \"-webkit-box\",\r\n \"-webkit-line-clamp\": \"2\",\r\n \"-webkit-box-orient\": \"vertical\",\r\n overflow: \"hidden\",\r\n \"text-overflow\": \"ellipsis\",\r\n \"font-weight\": \"600\",\r\n \"line-height\": \"24px\",\r\n color: neutralForegroundRest\r\n }\r\n }\r\n }\r\n },\r\n\r\n commentOverlayActiveContainer: {\r\n padding: \"12px 32px\",\r\n \"box-shadow\": \"0px 9px 20px rgba(0, 0, 0, 0.12)\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"calc(100% - 550px)\",\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n padding: \"15px 15px 45px\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"0\"\r\n },\r\n \"& $commentItemContainer\": {\r\n \"&.cwt-specific-comment\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-32px !important\",\r\n \"padding-left\": \"32px !important\",\r\n \"padding-right\": \"32px !important\",\r\n \"&.cwt-specific-reply\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: `calc(0px - (${avatarPadding} + 32px)) !important`,\r\n [applyLocalizedProperty(\"padding-left\", \"padding-right\", config.direction)]: `calc(${avatarPadding} + 32px) !important`\r\n }\r\n }\r\n }\r\n },\r\n\r\n buttonFadeInContainer: {\r\n animation: \"button-fade-in .4s ease\",\r\n \"-webkit-animation-fill-mode\": \"forwards\"\r\n },\r\n\r\n buttonFadeOutContainer: {\r\n animation: \"button-fade-out .4s ease\",\r\n \"-webkit-animation-fill-mode\": \"forwards\"\r\n },\r\n\r\n \"@keyframes button-fade-in\": {\r\n from: { bottom: \"-45px\"},\r\n \"90%\": {bottom: \"50px\"},\r\n to: { bottom: \"45px\"}\r\n },\r\n\r\n \"@keyframes button-fade-out\": {\r\n from: { bottom: \"45px\", opacity: \"1\"},\r\n to: { bottom: \"-45px\", opacity: \"0\"}\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, DesignSystem, isDarkMode, neutralFillActive, neutralFillHover, neutralFillToggleHover, neutralForegroundHint, neutralForegroundRest } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst leftRightPadding = \"15px\";\r\nexport const ContentPanelStyles = (config: DesignSystem) => ({\r\n contentPanelContainer: {\r\n margin: `-15px -${leftRightPadding} 0px -${leftRightPadding}`,\r\n \"scroll-margin-top\": \"150px\",\r\n\r\n \"& .cwt-content-panel-header\": {\r\n display: \"flex\",\r\n \"justify-content\": \"space-between\",\r\n color: neutralForegroundHint,\r\n \"border-bottom\": \"1px solid #F1F1F1\",\r\n \"border-color\": neutralFillActive,\r\n padding: `15px ${leftRightPadding} 18px ${leftRightPadding}`,\r\n \"& .cwt-title\": {\r\n margin: \"3.2px 0\",\r\n \"font-size\": \"24px\",\r\n \"font-weight\": \"bold\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-sub-title\": {\r\n margin: \"0 8px\",\r\n \"font-size\": \"13px\",\r\n \"vertical-align\": \"text-bottom\"\r\n }\r\n },\r\n \"& .cwt-beta-badge\": {\r\n display: \"inline-block\",\r\n padding: \"4.8px\",\r\n \"font-size\": \"10px\",\r\n \"font-weight\": \"bold\",\r\n \"line-height\": \"1em\",\r\n background: neutralFillHover,\r\n color: neutralForegroundRest,\r\n \"letter-spacing\": applyLocalizedProperty(\"-.01em\", \"0\", config.direction),\r\n \"border-radius\": \"4px\",\r\n height: \"1em\"\r\n },\r\n \"& .cwt-guideline-section\": {\r\n padding: `12px ${leftRightPadding} 22px ${leftRightPadding}`,\r\n display: \"flex\",\r\n \"justify-content\": \"space-between\",\r\n \"& .cwt-main-typing-indicator\": {\r\n height: \"22px\",\r\n \"min-width\": \"60px\"\r\n }\r\n },\r\n \"& .cwt-content-panel-content\": {\r\n padding: `16px ${leftRightPadding} 0px ${leftRightPadding}`,\r\n \"& .cwt-title\": {\r\n \"font-size\": \"20px\",\r\n \"font-weight\": \"600\",\r\n color: neutralForegroundRest,\r\n\r\n \"& .cwt-comment-count\": {\r\n \"font-weight\": \"normal\",\r\n color: neutralFillToggleHover\r\n }\r\n }\r\n },\r\n \"& .cwt-content-panel-footer\": {\r\n \"& .cwt-guidelines-message\": {\r\n \"font-size\": \"13px\",\r\n color: neutralForegroundHint,\r\n\r\n \"& .cwt-link\": {\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest\r\n }\r\n }\r\n }\r\n },\r\n\r\n contentPanelZeroStateContainer: {\r\n margin: `-${leftRightPadding}`,\r\n \"& .cwt-content-panel-header\": {\r\n margin: \"0px\",\r\n border: \"0px\"\r\n }\r\n },\r\n\r\n contentPanelMinimalStateContainer: {\r\n position: \"absolute\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"16px\",\r\n top: \"14px\",\r\n display: \"flex\",\r\n \"scroll-margin-top\": \"150px\",\r\n \"& .cwt-beta-badge\": {\r\n display: \"inline-block\",\r\n padding: \"4.8px\",\r\n \"font-size\": \"10px\",\r\n \"font-weight\": \"bold\",\r\n \"line-height\": \"1em\",\r\n background: neutralFillActive,\r\n color: neutralForegroundRest,\r\n \"letter-spacing\": applyLocalizedProperty(\"-.01em\", \"0\", config.direction),\r\n \"border-radius\": \"4px\",\r\n height: \"1em\"\r\n }\r\n },\r\n contentPanelOverlayContainer: {\r\n \"& .cwt-beta-badge\": {\r\n display: \"none\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, DesignSystem, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { avatarSize, dangerColor } from \"@msnews/social-utils\";\r\n\r\nconst inputBorderColor = \"#DDDDDD\";\r\nconst inputShadowColor = \"rgba(0, 0, 0, 0.02)\";\r\nconst inputShadowFocusColor = \"rgba(0, 0, 0, 0.08)\";\r\nconst placeholderColor = \"#717272\";\r\nconst clearInputIconColor = \"#919191\";\r\nconst inReviewMarkColor = \"#FFB900\";\r\nconst notAllowMarkColor = \"#E22C3B\";\r\nconst markSize = 20;\r\n\r\nexport const CommentBoxStyles = (config: DesignSystem) => ({\r\n commentForm: {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n margin: \"0\",\r\n\r\n \"& a.disabled\": {\r\n \"pointer-events\": \"none\",\r\n cursor: \"default\"\r\n },\r\n\r\n \"& .cwt-comment-box-container\": {\r\n display: \"flex\",\r\n \"align-items\": \"flex-start\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n margin: \"0\",\r\n padding: \"0\",\r\n \"border-radius\": \"4px\",\r\n\r\n \"& .cwt-avatar-container\": {\r\n position: \"relative\",\r\n display: \"flex\",\r\n margin: applyLocalizedProperty(\"0 13px 0 0\", \"0 0 0 13px\", config.direction),\r\n padding: \"3px 0\",\r\n height: avatarSize,\r\n\r\n \"& .cwt-commentbox-avatar\": {\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n height: avatarSize,\r\n \"border-radius\": \"50%\"\r\n },\r\n\r\n \"& .cwt-status-mark\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"center\",\r\n position: \"absolute\",\r\n bottom: (-markSize/4)+\"px\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: (-markSize/4)+\"px\",\r\n width: markSize+\"px\",\r\n height: markSize+\"px\",\r\n color: neutralLayerCard,\r\n \"border-radius\": \"50%\",\r\n border: \"2px solid \",\r\n \"border-color\": neutralLayerCard,\r\n\r\n \"&.cwt-inreview\": {\r\n background: inReviewMarkColor\r\n },\r\n\r\n \"&.cwt-notallow\": {\r\n background: notAllowMarkColor\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-comment-box\": {\r\n overflow: \"auto\",\r\n width: \"calc(100% - 90px)\",\r\n \"max-height\": \"480px\",\r\n padding: \"12px 16px 11px\",\r\n \"font-size\": \"16px\",\r\n \"line-height\": \"20px\",\r\n background: neutralLayerCard,\r\n color: neutralForegroundRest,\r\n border: \"1px solid \",\r\n \"border-color\": inputBorderColor,\r\n \"border-radius\": \"8px\",\r\n \"-webkit-box-shadow\": \"0px 4px 4px \" + inputShadowColor,\r\n \"-moz-box-shadow\": \"0px 4px 4px \" + inputShadowColor,\r\n \"box-shadow\": \"0px 4px 4px \" + inputShadowColor,\r\n \"vertical-align\": \"bottom\",\r\n \"overflow-wrap\": \"anywhere\",\r\n \"&.cwt-warning\": {\r\n border: \"1px solid \",\r\n \"border-color\": notAllowMarkColor\r\n },\r\n // Make it always selectable\r\n \"-webkit-touch-callout\": \"default\",\r\n \"-webkit-user-select\": \"auto\",\r\n \"-khtml-user-select\": \"auto\",\r\n \"-moz-user-select\": \"auto\",\r\n \"-ms-user-select\": \"auto\",\r\n \"user-select\": \"auto\",\r\n\r\n // 'Hide scrollbar'\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar \": {\r\n display: \"none\"\r\n },\r\n\r\n \"&:focus\": {\r\n \"-webkit-box-shadow\": \"0px 3px 8px \" + inputShadowFocusColor,\r\n \"-moz-box-shadow\": \"0px 3px 8px \" + inputShadowFocusColor,\r\n \"box-shadow\": \"0px 3px 8px \" + inputShadowFocusColor,\r\n \"-webkit-tap-highlight-color\": \"rgba(255, 255, 255, 0) !important;\",\r\n outline: \"none\"\r\n },\r\n\r\n \"&:empty\": {\r\n display: \"block\",\r\n \"&:before\": {\r\n content: \"attr(placeholder)\",\r\n \"pointer-events\": \"none\",\r\n display: \"block\",\r\n color: placeholderColor,\r\n \"line-height\": \"21px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"60px\"\r\n }\r\n },\r\n\r\n \"&:not(:empty)\": {\r\n \"&:after \": {\r\n content: \"''\",\r\n float: applyLocalizedProperty(\"right\", \"left\", config.direction),\r\n display: \"block\",\r\n height: \"1.325em\",\r\n width: \"56px\"\r\n },\r\n\r\n \"& .cwt-name.cwt-link\": {\r\n \"font-weight\": \"normal\",\r\n\r\n \"&:before\": {\r\n content: \"'@'\"\r\n }\r\n }\r\n },\r\n\r\n '&:not([contentEditable=\"true\"])': {\r\n \"font-style\": \"italic\",\r\n color: \"rgba(26, 26, 26, 0.75)\",\r\n\r\n \"& .cwt-icon-vector\": {\r\n fill: neutralForegroundHint\r\n },\r\n\r\n \"&:empty \": {\r\n \"&:before \": {\r\n content: \"attr(placeholder)\",\r\n \"pointer-events\": \"none\",\r\n display: \"block\",\r\n color: placeholderColor\r\n }\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-button-container\": {\r\n position: \"absolute\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"2px\",\r\n bottom: \"0\",\r\n height: \"46px\",\r\n padding: \"0 8px\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n\r\n \"& .cwt-link\": {\r\n margin: \"0 8px\",\r\n \"font-size\": \"13px\",\r\n \"font-weight\": \"500\",\r\n color: accentFillRest\r\n },\r\n\r\n \"& .cwt-submit-comment-btn\": {\r\n \"& .cwt-icon\": {\r\n color: accentFillRest\r\n },\r\n\r\n \"&:hover\": {\r\n \"& .cwt-icon\": {\r\n color: \"#0b93ff\"\r\n }\r\n }\r\n },\r\n \"& .cwt-clear-comment-btn\": {\r\n \"& .cwt-icon\": {\r\n color: clearInputIconColor\r\n },\r\n\r\n \"&:hover\": {\r\n \"& .cwt-icon\": {\r\n color: neutralForegroundHint\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"& .cwt-character-remaining-msg\": {\r\n margin: \"6px 12px\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-end\",\r\n \"font-size\": \"12px\",\r\n color: dangerColor\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, isDarkMode, neutralFillActive, neutralForegroundHint, neutralForegroundRest } from \"@microsoft/fast-components-styles-msft\";\r\nimport {\r\n primaryTextColor\r\n} from \"@msnews/social-utils\";\r\n\r\nexport const CommentListStyles = (config: DesignSystem) => ({\r\n commentListHeader: {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"space-between\",\r\n margin: \"24px 0 4px\",\r\n padding: \"24px 0 0\",\r\n \"border-top\": \"1px solid #DDDDDD\",\r\n \"border-color\": neutralFillActive,\r\n\r\n \"& .cwt-feedback-btn\": {\r\n \"font-size\": \"14px\",\r\n color: neutralForegroundHint,\r\n fill: \"currentColor\",\r\n\r\n \"&:hover\": {\r\n color: primaryTextColor,\r\n fill: \"currentColor\"\r\n }\r\n }\r\n },\r\n commentListContent: {\r\n padding: \"0\",\r\n color: neutralForegroundRest,\r\n \"list-style\": \"none\",\r\n \"margin-top\": \"16px\",\r\n \"margin-bottom\": \"16px\"\r\n },\r\n\r\n commentListContentBlury: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n padding: \"0 10px\",\r\n margin: \"0\",\r\n\r\n \"&:before\": {\r\n content: \"''\",\r\n transition: \"background-position 0.2s ease-in, opacity 0.1s linear 0.1s\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n position: \"absolute\",\r\n background: isDarkMode(config) ? \"linear-gradient(180deg, rgba(66, 66, 66, 0), rgba(66, 66, 66, 1))\" : \"linear-gradient(180deg, rgba(255, 255, 255, 0), #FFFFFF)\",\r\n \"background-repeat\": \"no-repeat\",\r\n opacity: \"100%\",\r\n \"z-index\": \"1\"\r\n },\r\n \"&:hover:before\": {\r\n cursor: \"pointer\",\r\n \"background-position\": \"0px 100px\",\r\n opacity: \"0%\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, DesignSystem, isDarkMode, neutralFillActive, neutralForegroundHint, neutralForegroundRest } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport {\r\n avatarPadding,\r\n commentVPadding, enums, highContrastButton,\r\n mainFontSize,\r\n mainLineHeight\r\n} from \"@msnews/social-utils\";\r\nimport { mainPadding as mainCommentPadding } from \"../Comment.styles\";\r\n\r\nconst messageMaxClampedLines = 4;\r\n\r\nexport const CommentItemStyles = (config: DesignSystem) => ({\r\n commentItemContainer: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n padding: commentVPadding + \" 0\",\r\n border: \"none\",\r\n \"border-top\": \"1px solid #DDDDDD\",\r\n \"border-color\": neutralFillActive,\r\n\r\n \"&:first-child\": {\r\n border: \"none\"\r\n },\r\n\r\n \"& .cwt-comment-box-container\": {\r\n margin: commentVPadding + \" 0 0\"\r\n },\r\n\r\n \"& .cwt-comment-content\": {\r\n margin: \"0\",\r\n width: \"inherit\",\r\n\r\n \"& .cwt-avatar\": {\r\n float: applyLocalizedProperty(\"left\", \"right\", config.direction),\r\n position: \"relative\",\r\n \"z-index\": \"2\"\r\n },\r\n \"& .cwt-avatar-link.cwt-link\": {\r\n \"&:focus, &:focus-visible\": {\r\n position: \"absolute\"\r\n }\r\n },\r\n\r\n \"& .cwt-inner-content\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: avatarPadding\r\n },\r\n\r\n \"& .cwt-header\": {\r\n margin: \"0\",\r\n padding: \"0\",\r\n\r\n \"& .dot-before::before\": {\r\n opacity: \".8\"\r\n },\r\n \"& .cwt-posted-at\": {\r\n color: neutralForegroundHint,\r\n \"font-size\": mainFontSize\r\n }\r\n },\r\n \"& .cwt-name\": {\r\n \"font-size\": mainFontSize,\r\n \"font-weight\": \"600\",\r\n color: neutralForegroundRest,\r\n\r\n \"&.cwt-link\": {\r\n \"line-height\": mainLineHeight,\r\n height: mainLineHeight,\r\n display: \"inline-flex\",\r\n overflow: \"hidden\",\r\n \"text-overflow\": \"ellipsis\",\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest\r\n }\r\n },\r\n \"& .cwt-deleted-name\": {\r\n \"font-weight\": \"600\"\r\n },\r\n \"& .cwt-message\": {\r\n padding: \"0\",\r\n margin: \"3px 0 2px\",\r\n \"font-size\": \"16px\",\r\n \"line-height\": mainLineHeight,\r\n background: \"none\",\r\n border: \"none\",\r\n \"word-break\": \"break-word\",\r\n\r\n \"& .cwt-name.cwt-link\": {\r\n \"font-weight\": \"normal\",\r\n display: \"inline\",\r\n\r\n \"&:before\": {\r\n content: \"'@'\"\r\n }\r\n },\r\n\r\n \"& .cwt-comment-deleted-message\": {\r\n display: \"inline\",\r\n \"font-style\": \"italic\",\r\n color: neutralForegroundHint,\r\n\r\n \"& .cwt-icon\": {\r\n margin: \"-4px 4px 0\",\r\n color: neutralForegroundHint,\r\n fill: neutralForegroundHint,\r\n display: \"inline-flex\",\r\n \"vertical-align\": \"middle\"\r\n }\r\n },\r\n\r\n \"& > .cwt-clamp\": {\r\n display: \"-webkit-box\",\r\n \"-webkit-line-clamp\": messageMaxClampedLines,\r\n \"-webkit-box-orient\": \"vertical\",\r\n overflow: \"hidden\"\r\n },\r\n\r\n \"& .cwt-show-clamped-btn\": {\r\n color: accentFillRest,\r\n \"font-size\": \"12px\"\r\n }\r\n },\r\n \"& .cwt-footer\": {\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"min-height\": \"20px\",\r\n \"font-size\": \"12px\",\r\n margin: \"11px 0 0\",\r\n color: \"black\",\r\n\r\n \"& .cwt-thread-locked-message\": {\r\n \"letter-spacing\": applyLocalizedProperty(\"-.25pt\", \"0\", config.direction),\r\n fill: \"#09664f\"\r\n },\r\n\r\n \"& .cwt-report-btn\": {\r\n \"font-size\": \"16px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"auto\",\r\n color: neutralForegroundHint,\r\n fill: \"currentColor\",\r\n\r\n '&[data-is-active=\"true\"]': {\r\n color: accentFillRest\r\n },\r\n\r\n \"&:hover, &:focus \": {\r\n color: \"#5CB6FF\",\r\n \"& .cwt-icon-label\": {\r\n color: \"#5CB6FF\"\r\n },\r\n ...highContrastButton\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"13px\",\r\n color: neutralForegroundHint\r\n }\r\n }\r\n }\r\n },\r\n\r\n \"&&.cwt-specific-comment\": {\r\n \"background-color\": isDarkMode(config) ? \"#323232\" : \"#F7F7F7\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: `calc(0px - ${mainCommentPadding}px)`,\r\n \"padding-right\": `${mainCommentPadding}px`,\r\n \"padding-left\": `${mainCommentPadding}px`,\r\n \"&.cwt-specific-reply\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: `calc(0px - (${avatarPadding} + ${mainCommentPadding}px))`,\r\n [applyLocalizedProperty(\"padding-left\", \"padding-right\", config.direction)]: `calc(${avatarPadding} + ${mainCommentPadding}px)`\r\n }\r\n },\r\n\r\n \"&:last-child\": {\r\n \"& .cwt-comment:last-child\": {\r\n border: \"none\",\r\n \"padding-bottom\": \"0\"\r\n }\r\n }\r\n },\r\n\r\n commentItemDeleteMenuPopover: {\r\n bottom: \"16px\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"0\"\r\n },\r\n\r\n commentItemFooterTwoLines: {\r\n \"& .cwt-comment-content\": {\r\n \"& .cwt-footer\": {\r\n \"flex-wrap\": \"wrap\",\r\n\r\n \"& .cwt-reaction-counts\": {\r\n padding: \"0 0 11px 0\"\r\n },\r\n\r\n \"& .cwt-report-btn\": {\r\n \"& .cwt-icon-label\": {\r\n display: \"none\"\r\n }\r\n },\r\n \"& .cwt-line-break\": {\r\n \"flex-basis\": \"100%\",\r\n width: \"0\",\r\n height: \"0\",\r\n overflow: \"hidden\"\r\n }\r\n }\r\n }\r\n },\r\n\r\n commentItemOverlayContainer: {\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n border: \"none\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, accentFillActive, isDarkMode, neutralFillStealthHover } from \"@microsoft/fast-components-styles-msft\";\r\nimport {\r\n commentVPadding,\r\n mainLineHeight\r\n} from \"@msnews/social-utils\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const ReplyListStyles = (config: DesignSystem) => ({\r\n replyListContainer: {\r\n margin: \"4px 0 0\",\r\n \"padding-top\": \"4px\",\r\n\r\n \"& > $commentForm\": {\r\n margin: \"-6px 0 16px\"\r\n },\r\n \"& .cwt-commenting-disabled-container\": {\r\n width: \"100%\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"0\"\r\n },\r\n \"& .cwt-show-replies-btn\": {\r\n display: \"inline-flex\",\r\n margin: \"-4px\",\r\n padding: \"4px\",\r\n \"font-size\": \"13px\",\r\n \"font-weight\": \"500\",\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillActive,\r\n fill: \"currentColor\",\r\n opacity: \"1\",\r\n \"border-radius\": \"4px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n },\r\n\r\n \"&.cwt-specific-comment-mode\": {\r\n \"margin-top\": \"20px\"\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillActive\r\n },\r\n\r\n \"& .cwt-icon-vector-up\": {\r\n \"-webkit-transform\": \"rotate(180deg)\"\r\n }\r\n },\r\n\r\n \"& .cwt-list\": {\r\n padding: \"0\",\r\n margin: \"0\",\r\n\r\n \"& .cwt-comment-form\": {\r\n margin: commentVPadding + \" 0 0\"\r\n },\r\n\r\n \"& > li\": {\r\n padding: commentVPadding + \" 0\",\r\n margin: \"0 0 -1px\",\r\n\r\n \"&:first-child\": {\r\n \"padding-top\": commentVPadding\r\n },\r\n \"&:last-child\": {\r\n \"padding-bottom\": \"0\"\r\n },\r\n\r\n \"& .cwt-comment-content\": {\r\n \"& .cwt-avatar\": {\r\n \"margin-top\": \"0\"\r\n },\r\n \"& .cwt-message\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"1px\",\r\n padding: \"inherit\",\r\n \"font-size\": \"inherit\",\r\n \"line-height\": mainLineHeight,\r\n background: \"inherit\",\r\n border: \"inherit\"\r\n },\r\n \"& .cwt-footer\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"0\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst avatarSize = \"57px\";\r\n\r\nexport const UserCardStyles = (config: DesignSystem) => ({\r\n userCardContainer: {\r\n position: \"absolute\",\r\n \"z-index\": \"9999999999\",\r\n display: \"flex\",\r\n padding: \"14px 0\",\r\n background: neutralLayerCard,\r\n color: neutralForegroundRest,\r\n \"border-radius\": \"4px\",\r\n \"-webkit-box-shadow\": \"0px 0px 2.9px rgba(0, 0, 0, 0.2), 0px 1.6px 12px rgba(0, 0, 0, 0.2)\",\r\n \"-moz-box-shadow\": \"0px 0px 2.9px rgba(0, 0, 0, 0.2), 0px 1.6px 12px rgba(0, 0, 0, 0.2)\",\r\n \"box-shadow\": \"0px 0px 2.9px rgba(0, 0, 0, 0.2), 0px 1.6px 12px rgba(0, 0, 0, 0.2)\",\r\n\r\n \"& .cwt-avatar\": {\r\n height: avatarSize,\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n margin: \"0 18px\"\r\n },\r\n\r\n \"& .cwt-user-info\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"min-width\": \"250px\",\r\n\r\n \"& .cwt-user-header\": {\r\n display: \"flex\",\r\n \"justify-content\": \"space-between\",\r\n\r\n \"& .cwt-name-title\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n height: \"57px\",\r\n \"margin-top\": \"-4px\",\r\n\r\n \"& .cwt-name.cwt-link\": {\r\n \"&:before\": {\r\n content: \"none\"\r\n },\r\n\r\n overflow: \"hidden\",\r\n display: \"-webkit-box\",\r\n \"-webkit-line-clamp\": \"2\",\r\n \"-webkit-box-orient\": \"vertical\",\r\n \"overflow-wrap\": \"break-word\",\r\n \"text-overflow\": \"ellipsis\",\r\n \"max-width\": \"150px\",\r\n height: \"auto\",\r\n \"max-height\": \"57px\",\r\n \"font-size\": \"20px\",\r\n \"font-weight\": \"600\",\r\n \"line-height\": \"26px\",\r\n color: neutralForegroundRest\r\n }\r\n },\r\n\r\n \"& button\": {\r\n margin: \"4px 18px\",\r\n \"min-width\": \"75px\"\r\n }\r\n },\r\n\r\n \"& .cwt-user-stats\": {\r\n display: \"flex\",\r\n \"margin-top\": \"12px\",\r\n\r\n \"& .cwt-stat\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-start\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"36px\",\r\n\r\n \"&:first-child\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"0\"\r\n },\r\n\r\n \"& h6\": {\r\n \"font-size\": \"13px\",\r\n \"font-weight\": \"normal\",\r\n opacity: \".65\"\r\n },\r\n\r\n \"& .cwt-stat-counter\": {\r\n \"margin-top\": \"4px\",\r\n \"font-size\": \"14px\",\r\n \"font-weight\": \"600\",\r\n color: neutralForegroundRest\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n userCardPopover: {\r\n \"z-index\": \"25000 !important\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { ZIndex } from \"@msnews/core\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nexport const ReactionMenuStyles = (config: DesignSystem) => ({\r\n reactionMenuContainer: {\r\n display: \"flex !important\",\r\n \"align-items\": \"flex-start\",\r\n \"justify-content\": \"center\",\r\n padding: \"6px 13px 0\",\r\n position: \"absolute\",\r\n height: \"42px\",\r\n background: neutralLayerCard,\r\n \"border-radius\": \"32px\",\r\n \"-webkit-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"-moz-box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n \"box-shadow\": \"0px 3.2px 7.2px rgba(0, 0, 0, 0.13), 0px 0.6px 1.8px rgba(0, 0, 0, 0.1)\",\r\n animation: \"reaction-menu-fade-in .2s ease-out\",\r\n \"-webkit-animation-fill-mode\": \"forwards\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& > .cwt-icon\": {\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n margin: \"0 0 !important\",\r\n padding: \"4px !important\",\r\n \"font-size\": \"18px\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(28),\r\n transition: \"ease-out .15s\",\r\n width: \"28px\"\r\n },\r\n\r\n \"&:hover div.emoji-icon, &:focus div.emoji-icon, &.touchFocused div.emoji-icon\": {\r\n transform: \"scale(1.285) translateY(-4px)\"\r\n },\r\n\r\n \"&:hover:before, &:focus:before, &.touchFocused:before\": {\r\n position: \"absolute\",\r\n \"z-index\": ZIndex.Dialog.toString(),\r\n top: \"-28px\",\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"center\",\r\n content: \"attr(data-title)\",\r\n \"white-space\": \"nowrap\",\r\n height: \"18px\",\r\n padding: \"0 8px 1px\",\r\n \"font-size\": \"13px\",\r\n \"text-transform\": \"capitalize\",\r\n background: neutralForegroundRest,\r\n color: neutralLayerCard,\r\n \"border-radius\": \"11px\"\r\n }\r\n }\r\n },\r\n\r\n reactionMenuPopover: {\r\n top: \"-51px\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"-10px\",\r\n \"padding-bottom\": \"4px\"\r\n },\r\n\r\n \"@keyframes reaction-menu-fade-in\": {\r\n from: { top: \"-6px\", opacity: \"0\" },\r\n to: { top: \"-13px\", opacity: \"1\" }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, isDarkMode, neutralFillActive, neutralFillRest, neutralForegroundHint } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums, getEmojiStylesByWidth } from \"@msnews/social-utils\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const ReactionPanelStyles = (config: DesignSystem) => ({\r\n reactionPanelContainer: {\r\n \"touch-action\": \"none\",\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& > .cwt-icon\": {\r\n \"font-size\": \"16px\",\r\n padding: applyLocalizedProperty(\"6px 2px 6px 8px\", \"6px 8px 6px 2px\", config.direction),\r\n margin: applyLocalizedProperty(\"-6px 8px -6px -6px\", \"-6px -6px -6px 8px\", config.direction),\r\n \"border-radius\": \"4px\",\r\n\r\n \"&.cwt-hide\": {\r\n display: \"none\",\r\n \"pointer-events\": \"none\",\r\n \"touch-events\": \"none\"\r\n },\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"13px\",\r\n padding: \"0 6px\"\r\n },\r\n\r\n \"&.cwt-active-reaction .cwt-icon-label\": {\r\n \"font-weight\": \"600\"\r\n },\r\n\r\n '&[role=\"button\"]': {\r\n \"&:hover, &.highlight\": {\r\n background: neutralFillRest\r\n },\r\n \"&:active\": {\r\n background: neutralFillActive\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-reply-btn.cwt-icon\": {\r\n \"& .cwt-icon-vector\": {\r\n \"margin-top\": \"2px\"\r\n }\r\n },\r\n\r\n // 'RATING LABELS'\r\n \"& > .cwt-icon .cwt-icon-label.cwt-red-reaction\": {\r\n color: isDarkMode(config) ? \"#FF948F\" : \"#E02F19\"\r\n },\r\n \"& > .cwt-icon .cwt-icon-label.cwt-yellow-reaction\": {\r\n color: isDarkMode(config) ? \"#FF9333\" : \"#BD5B00\"\r\n },\r\n\r\n [\"&.\" + enums.responsiveLevels.MobilePopup]: {\r\n \"& > .cwt-icon:hover\": {\r\n color: neutralForegroundHint\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralFillStealthHover, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const ReportMenuStyles = (config: DesignSystem) => ({\r\n reportMenuContainer: {\r\n width: \"140px\",\r\n height: \"190px\",\r\n padding: \"4px 0 !important\",\r\n \"font-size\": \"14px\",\r\n \"letter-spacing\": applyLocalizedProperty(\"-0.012em\", \"0\", config.direction),\r\n background: neutralLayerCard,\r\n \"border-radius\": \"8px\",\r\n \"box-shadow\": \"0px 0px 5.6px rgba(0, 0, 0, 0.11), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n \"overflow-y\": \"scroll\",\r\n\r\n \"& li\": {\r\n padding: \"8px 14px !important\",\r\n color: neutralForegroundRest,\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover,\r\n cursor: \"pointer\"\r\n }\r\n },\r\n\r\n /* Hide Scrollbars */\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar \": {\r\n display: \"none\"\r\n },\r\n \"&:-moz-any(#content,#appcontent) browser\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"-14px !important\",\r\n \"overflow-y\": \"scroll\",\r\n \"margin-bottom\": \"-14px !important\",\r\n \"overflow-x\": \"scroll\"\r\n }\r\n },\r\n\r\n reportMenuPopover: {\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"0\",\r\n top: \"10px\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { neutralFillStealthHover, neutralForegroundHint, neutralForegroundRest, neutralLayerCard, DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const SortBoxStyles = (config: DesignSystem) => ({\r\n sortBoxContainer: {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"font-size\": \"14px\",\r\n color: neutralForegroundHint,\r\n cursor: \"pointer\",\r\n\r\n \"& .cwt-sort-value-container\": {\r\n position: \"relative\",\r\n margin: \"0 4px\",\r\n\r\n \"& .cwt-sort-value\": {\r\n display: \"inline-block\",\r\n \"font-weight\": \"bold\",\r\n color: neutralForegroundRest,\r\n fill: neutralForegroundHint,\r\n\r\n \"& .cwt-icon-vector\": {\r\n margin: \"0 2px -2px\"\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-sort-list\": {\r\n \"min-width\": \"128px\",\r\n margin: \"0\",\r\n padding: \"6px 0\",\r\n background: neutralLayerCard,\r\n border: \"1px solid rgba(0, 0, 0, 0.08)\",\r\n \"border-radius\": \"8px\",\r\n \"box-shadow\": \"0px 4px 24px rgba(0, 0, 0, 0.04)\",\r\n\r\n \"& .cwt-sort-list-item\": {\r\n padding: \"6px 12px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n },\r\n\r\n \"& .cwt-icon\": {\r\n \"font-size\": \"14px\",\r\n\r\n \"& .cwt-icon-label\": {\r\n \"white-space\": \"nowrap\"\r\n },\r\n\r\n \"& .cwt-icon-vector\": {\r\n \"font-size\": \"18px\",\r\n margin: \"-2px 4px\",\r\n fill: \"#107C10\"\r\n }\r\n },\r\n\r\n \"&.active .cwt-icon .cwt-icon-label\": {\r\n color: neutralForegroundRest\r\n }\r\n }\r\n }\r\n },\r\n\r\n sortBoxPopover: {\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"-6px\",\r\n top: \"10px\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralFillRest, neutralForegroundHint, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const DeleteMenuMenuStyles = (config: DesignSystem) => ({\r\n deleteMenuContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"170px\",\r\n background: neutralLayerCard,\r\n \"border-radius\": \"8px\",\r\n \"box-shadow\": \"0px 0px 5.6px rgba(0, 0, 0, 0.11), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n transition: \".2s ease\",\r\n\r\n \"& .cwt-icon.cwt-menu-header\": {\r\n \"font-size\": \"16px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"auto\",\r\n padding: \"4px 8px 0\",\r\n color: neutralForegroundHint,\r\n fill: \"currentColor\",\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"12px\",\r\n \"font-weight\": \"bold\"\r\n }\r\n },\r\n\r\n \"& .cwt-delete-list\": {\r\n \"min-width\": \"140px\",\r\n \"max-height\": \"188px\",\r\n padding: \"4px 0\",\r\n \"font-size\": \"12px\",\r\n \"letter-spacing\": applyLocalizedProperty(\"-0.012em\", \"0\", config.direction),\r\n \"overflow-y\": \"auto\",\r\n\r\n \"& li\": {\r\n cursor: \"pointer\",\r\n padding: \"4px 12px\",\r\n color: neutralForegroundHint,\r\n\r\n \"&:hover\": {\r\n background: neutralFillRest\r\n }\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundHint, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst avatarSize = \"16px\";\r\nconst typingDotColor = \"#6B6B6B\";\r\nconst typingDotBgColor = \"#F1F1F1\";\r\n\r\nexport const TypingUsersStyles = (config: DesignSystem) => ({\r\n typingUsersContainer: {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n\r\n \"& .cwt-typer-name\": {\r\n display: \"inline-block\",\r\n \"white-space\": \"pre\"\r\n },\r\n\r\n \"& .cwt-typing-user-images\": {\r\n display: \"flex\",\r\n position: \"relative\",\r\n \"align-content\": \"center\",\r\n \"flex-direction\": \"row\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"5px\",\r\n\r\n \"& .cwt-typing-user-image\": {\r\n display: \"inline-block\",\r\n \"border-radius\": \"50%\",\r\n overflow: \"hidden\",\r\n border: \"3px solid \",\r\n \"border-color\": neutralLayerCard,\r\n\r\n \"&:hover\": {\r\n \"z-index\": \"3\"\r\n },\r\n\r\n \"& img\": {\r\n \"border-radius\": \"50%\",\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n height: avatarSize,\r\n display: \"block\",\r\n \"align-items\": \"center\"\r\n }\r\n },\r\n\r\n \"& .image0\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"0\",\r\n \"z-index\": \"2\"\r\n },\r\n\r\n \"& .image1\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-5px\",\r\n \"z-index\": \"1\"\r\n },\r\n\r\n \"& .image2\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"-5px\",\r\n \"z-index\": \"0\"\r\n }\r\n },\r\n\r\n \"& .cwt-typing-users-text\": {\r\n \"align-content\": \"center\",\r\n \"align-items\": \"center\",\r\n color: neutralForegroundHint,\r\n display: \"flex\",\r\n \"font-size\": \"12px\",\r\n \"white-space\": \"pre\"\r\n },\r\n\r\n \"& .cwt-icon.cwt-typing-animation\": {\r\n overflow: \"hidden\",\r\n height: \"12px\",\r\n color: typingDotColor,\r\n background: typingDotBgColor,\r\n padding: \"0 3px\",\r\n margin: \"0 5px -1px\",\r\n \"border-radius\": \"6px 8px\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums } from \"@msnews/social-utils\";\r\n\r\nexport const CommentSuperAppStyles = (config: DesignSystem) => ({\r\n commentSuperAppContainer: {\r\n [`&.${enums.responsiveLevels.MobilePopup}`]: {\r\n \"margin-left\": \"0\",\r\n \"margin-right\": \"0\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const FollowButtonSuperAppStyles = (config: DesignSystem) => ({\r\n followButtonSuperAppContainer: {\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralFillActive, neutralFillStealthHover, neutralForegroundRest, neutralLayerCard, neutralOutlineActive } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const ReportMenuSuperAppStyles = (config: DesignSystem) => ({\r\n reportMenuSuperAppContainer: {\r\n \"max-height\": \"75vh\",\r\n \"max-width\": \"100vw\",\r\n width: \"500px\",\r\n height: \"100%\",\r\n \"font-size\": \"16px\",\r\n background: neutralFillActive,\r\n \"border-radius\": \"12px 12px 0 0\",\r\n margin: \"0\",\r\n \"padding-top\": \"0 !important\",\r\n \"padding-bottom\": \"70px !important\",\r\n \"min-height\": \"450px\",\r\n\r\n \"& .cwt-menu-header\": {\r\n padding: \"20px 27px\",\r\n \"border-bottom\": \"1px solid\",\r\n \"border-color\": neutralOutlineActive,\r\n background: neutralLayerCard,\r\n \"margin-bottom\": \"24px\",\r\n position: \"sticky\",\r\n top: \"0\",\r\n \"font-weight\": \"bold\",\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"22px\",\r\n color: neutralForegroundRest,\r\n padding: \"0\"\r\n }\r\n },\r\n\r\n \"& li\": {\r\n cursor: \"pointer\",\r\n padding: \"14px 24px !important\",\r\n background: neutralLayerCard,\r\n \"font-size\": \"16px\",\r\n \"line-height\": \"20px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { SocialDataState } from \"@msnews/social-data-connector\";\r\n\r\nexport type SetComponent = (moduleName?: string, id?: string, market?: string, commentDisplayType?: string) => void;\r\n\r\nexport type SetSocialData = (socialData: SocialDataState) => void;\r\n\r\nexport const SocialActions = {\r\n setComponent: new ActionMap(\"SetComponent\"),\r\n setSocialData: new ActionMap(\"SetSocialData\")\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { InspectorArgs, InspectorResponse, appEnvironment } from \"@msnews/core\";\r\nimport { SocialConfig, SocialState } from \"./index\";\r\n\r\nimport { SocialProps } from \"./Social.props\";\r\n\r\nexport const SocialInspector = {\r\n inspect: (args: InspectorArgs): InspectorResponse => {\r\n\r\n const { config, state } = args;\r\n let { moduleName, market, theme, commentDisplayType, styleOverrides } = config;\r\n const { id } = state;\r\n if (state.moduleName) {\r\n moduleName = state.moduleName;\r\n }\r\n\r\n if (state.theme) {\r\n theme = state.theme;\r\n }\r\n\r\n if (state.commentDisplayType) {\r\n commentDisplayType = state.commentDisplayType;\r\n }\r\n\r\n if (state.market) {\r\n market = state.market;\r\n }\r\n\r\n if (!theme) {\r\n theme = \"default\";\r\n }\r\n\r\n if (!market) {\r\n market = appEnvironment ? appEnvironment.CurrentMarket : \"en-us\";\r\n }\r\n\r\n if (!commentDisplayType) {\r\n commentDisplayType = \"default\";\r\n }\r\n\r\n const props = { ...args.state, id, moduleName, market, t: config.localizedStrings, theme, commentDisplayType, jssStyleSheet: styleOverrides };\r\n return { props, missingChildren: [] };\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, SocialDataConnectorNotFound, SocialNoModuleName } from \"@msnews/diagnostics\";\r\nimport { BridgeEventNames, appErrorLogger, dispatchBridgeEvent, enums, hasThemeBase } from \"@msnews/social-utils\";\r\nimport { IRequestContext, InspectorResponse, ScreenWidth, appEnvironment } from \"@msnews/core\";\r\nimport { SocialDataActions, SocialDataConnector } from \"@msnews/social-data-connector\";\r\n\r\nimport { ComponentConnector } from \"@msnews/experiences-connector\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { DynamicReducer } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { ExperienceInitialProps } from \"@msnews/experiences-base\";\r\nimport { IReducer } from \"@msnews/experiences-redux-contracts\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { SocialActions } from \"./Social.actions\";\r\nimport { SocialConfig } from \"./Social.config\";\r\nimport { SocialInspector } from \"./Social.inspector\";\r\nimport { SocialProps } from \"./index\";\r\nimport { SocialState } from \"./Social.state\";\r\nimport { Store } from \"redux\";\r\n\r\n// A partial config to ensure loading of social data connector.\r\n// This hard-coded config can be removed after making sure that all config documents contain the data connector.\r\nconst socialDataConnectorConfig: Partial = {\r\n dataConnectors: [\r\n {\r\n screenWidth: ScreenWidth.Any,\r\n children: [\r\n {\r\n experienceType: ConnectorNamespaces.SocialData,\r\n instanceId: \"\",\r\n href: \"cms/api/amp/experienceConfigIndex/BB1cKaeg\"\r\n }\r\n ]\r\n }\r\n ]\r\n};\r\n\r\n/**\r\n * The connector for the Social Experience.\r\n */\r\nexport class SocialConnector extends ComponentConnector {\r\n\r\n private socialDataConnector: SocialDataConnector;\r\n\r\n /** @inheritdoc */\r\n public constructor(namespace: string, parentNamespace: string, rootReducer: DynamicReducer, reducer: IReducer, store: Store, config: SocialConfig, requestContext: IRequestContext) {\r\n super(namespace, parentNamespace, rootReducer, reducer, store, {...socialDataConnectorConfig, ...config}, requestContext);\r\n }\r\n\r\n /** @inheritdoc */\r\n public async onComponentConnect(connectorProps?: ExperienceInitialProps): Promise {\r\n if (!appErrorLogger.onAppError) {\r\n appErrorLogger.setOnAppError(this.onAppError.bind(this));\r\n }\r\n await ComponentConnector.prototype.onComponentConnect.call(this, connectorProps);\r\n\r\n const market = connectorProps && connectorProps.context && connectorProps.context.market ? connectorProps.context.market : appEnvironment.CurrentMarket;\r\n const moduleName = connectorProps && connectorProps.context && connectorProps.context.moduleName || connectorProps.context && this.config.moduleName;\r\n if (!moduleName) {\r\n this.onAppError({\r\n ...SocialNoModuleName,\r\n message: \"No moduleName info not passed into the experience via connection props\",\r\n pb: {\r\n ...SocialNoModuleName.pb,\r\n customMessage: JSON.stringify(connectorProps)\r\n }\r\n } as AppError);\r\n }\r\n\r\n PageBase.getInstance().rootReducer.getDataConnector(ConnectorNamespaces.SocialData).then((socialDataConnector: SocialDataConnector) => {\r\n if (socialDataConnector) {\r\n this.socialDataConnector = socialDataConnector;\r\n this.registerObservers();\r\n this.updateSocialState();\r\n\r\n this.setComponent(moduleName, market, connectorProps.context.theme, connectorProps.context.id, connectorProps.context.commentDisplayType);\r\n\r\n if (connectorProps && connectorProps.context && connectorProps.context.gradientOverlayDataPromise) {\r\n connectorProps.context.gradientOverlayDataPromise.then(gradientOverlayData => {\r\n this.socialDataConnector.setGradientOverlayData(gradientOverlayData);\r\n });\r\n }\r\n\r\n if (connectorProps && connectorProps.context && connectorProps.context.publisherSubscribeFollowButtonDataPromise) {\r\n connectorProps.context.publisherSubscribeFollowButtonDataPromise.then(publisherSubscribeFollowButtonData => {\r\n this.socialDataConnector.setPublisherSubscribeFollowButtonData(publisherSubscribeFollowButtonData);\r\n });\r\n }\r\n } else {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"Social data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"Social data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n });\r\n }\r\n\r\n public registerObservers(): void {\r\n SocialDataActions.setTheme.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateMe.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateNotifications.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.setContent.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateContent.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateContentRating.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateCommentRating.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.incrementReplyCount.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateUser.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateUserFollowers.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateUserFollowing.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateUserComments.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.deleteUserComment.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.setReactionBreakdown.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.setGradientOverlayData.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.setPublisherSubscribeFollowButtonData.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.setPopup.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.updateResponsiveClass.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.deleteMyData.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.mapCmsIdToContentId.registerObserver(() => this.updateSocialState());\r\n SocialDataActions.resetError.registerObserver(() => this.updateSocialState());\r\n }\r\n\r\n public updateSocialState(): void {\r\n if (this.getSocialDataConnector()) {\r\n SocialActions.setSocialData.getActionSender(this).send(this.socialDataConnector.getCurrentState());\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n public mapStateToProps(state: SocialState): SocialProps {\r\n const inspectorResult: InspectorResponse = SocialInspector.inspect({\r\n config: this.config,\r\n children: this.childComponentInstanceList,\r\n state: state\r\n });\r\n\r\n let connectorFunctions = {};\r\n if (this.getSocialDataConnector()) {\r\n connectorFunctions = this.socialDataConnector.getSocialConnectorFunctionsWithStateBindings();\r\n }\r\n\r\n return {\r\n ...inspectorResult.props,\r\n ...this.telemetryTags,\r\n children: this.childComponentInstanceList,\r\n mainTelemetryObject: this.telemetryObject,\r\n componentConnector: {\r\n setComponent: this.setComponent.bind(this)\r\n },\r\n ...connectorFunctions\r\n };\r\n }\r\n\r\n public async setComponent(component: string, market: string, theme: string, id?: string, commentDisplayType?: string) {\r\n const popup = this.getCurrentState().popup;\r\n if (popup && popup.moduleName) {\r\n this.socialDataConnector.closePopup(popup);\r\n }\r\n SocialActions.setComponent.getActionSender(this).send(component, id, market, commentDisplayType);\r\n this.socialDataConnector.setTheme(theme);\r\n this.manageHistory(component, market, theme, id);\r\n }\r\n\r\n private manageHistory(component: string, market: string, theme: string, id?: string) {\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n if (isSuperApp) {\r\n if (history.state == null) {\r\n history.replaceState({...{component, id, market, theme, initial: true}}, \"\");\r\n } else if (component !== history.state.component || market !== history.state.market || theme !== history.state.theme || id !== history.state.id) {\r\n history.pushState({...{component, id, market, theme, initial: false}}, \"\");\r\n dispatchBridgeEvent(BridgeEventNames.increaseBackStack);\r\n }\r\n if (!window.onpopstate) {\r\n window.onpopstate = this.setHistoryComponent.bind(this);\r\n }\r\n }\r\n }\r\n\r\n private async setHistoryComponent(event) {\r\n this.setComponent(event.state.component, event.state.market, event.state.theme, event.state.id);\r\n }\r\n\r\n private getSocialDataConnector() {\r\n if (!this.socialDataConnector) {\r\n this.onAppError({\r\n ...SocialDataConnectorNotFound,\r\n message: \"Social data connector not found in the root reducer\",\r\n pb: {\r\n ...SocialDataConnectorNotFound.pb,\r\n customMessage: \"Social data connector not found in the root reducer\"\r\n }\r\n } as AppError);\r\n }\r\n return this.socialDataConnector;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionHandler } from \"@msnews/experiences-redux\";\r\nimport { IReducer, IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { SetComponent, SetSocialData, SocialActions } from \"./Social.actions\";\r\n\r\nimport { SocialState } from \"./Social.state\";\r\nimport { appEnvironment } from \"@msnews/core\";\r\n\r\n/**\r\n * The reducer for the Social connector, and the SocialState\r\n */\r\nexport class SocialReducer implements IReducer {\r\n /**\r\n * Update the state for the connector, based on the action being applied\r\n * @param state The previous state\r\n * @param actionPayload The action being applied\r\n */\r\n public reduce(state: SocialState, actionPayload: IActionPayload): SocialState {\r\n if (!state) { return {}; }\r\n if (!actionPayload) { return state; }\r\n\r\n let newState: SocialState;\r\n\r\n ActionHandler.handleAction(actionPayload, SocialActions.setComponent, (moduleName?: string, id?: string, market?: string, commentDisplayType?: string) => {\r\n moduleName = moduleName || state.moduleName;\r\n id = id || state.id;\r\n market = market || appEnvironment.CurrentMarket || state.market;\r\n commentDisplayType = commentDisplayType || state.commentDisplayType;\r\n newState = {...state, moduleName, id, market, commentDisplayType};\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialActions.setSocialData, (socialData) => {\r\n newState = { ...state, ...socialData };\r\n });\r\n\r\n return newState || state;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport function getExtension(fileName: string) {\r\n const parts = fileName.split(\".\");\r\n if (parts.length === 1 || (parts[0] === \"\" && parts.length === 2)) {\r\n return \"\";\r\n }\r\n return parts.pop().toLowerCase();\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, Button, OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\nimport { SocialService } from \"@msnews/social-data-service\";\r\nimport { close, getExtension } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialLocalizedStrings } from \"../Social.localizedStrings\";\r\nimport { SocialProps } from \"../Social.props\";\r\n\r\nexport interface CopyrightFormProps extends SocialProps {\r\n reportType: string;\r\n reportItemType?: string;\r\n onReport?: (key: string, e: any) => void;\r\n t: SocialLocalizedStrings;\r\n markTtvr?: () => void;\r\n}\r\n\r\nconst MaxFileSize = 1024 * 1024 * 10; // bytes\r\nconst MaxFileCount = 10;\r\nconst AcceptedAttachmentTypes = [\".pdf\", \".txt\", \".docx\", \".msg\", \".xlsx\", \".xls\"];\r\n\r\nenum FileUploadState {\r\n waiting = \"waiting\",\r\n uploading = \"uploading\",\r\n uploaded = \"uploaded\",\r\n failed = \"failed\"\r\n}\r\nfunction getFileUploadStateString(uploadState: FileUploadState, t: SocialLocalizedStrings) {\r\n return {\r\n [FileUploadState.waiting]: t.CopyrightFormFileWaiting || \"Waiting\",\r\n [FileUploadState.uploading]: t.CopyrightFormFileUploading || \"Uploading\",\r\n [FileUploadState.uploaded]: t.CopyrightFormFileUploaded || \"Uploaded\",\r\n [FileUploadState.failed]: t.CopyrightFormFileUploadFailed || \"Failed\"\r\n }[uploadState];\r\n}\r\n\r\nenum FileUploadFailureReason {\r\n size = \"size\",\r\n format = \"format\",\r\n count = \"count\",\r\n other = \"other\"\r\n}\r\nfunction getFileUploadFailureString(failureReason: FileUploadFailureReason, t: SocialLocalizedStrings) {\r\n return {\r\n [FileUploadFailureReason.size]: t.CopyrightFormFileSizeFailure || \"File size exceeds 10MB\",\r\n [FileUploadFailureReason.format]: t.CopyrightFormFileFormatFailure || \"File format is not supported\",\r\n [FileUploadFailureReason.count]: t.CopyrightFormFileCountFailure || \"Maximum 10 files can be uploaded\",\r\n [FileUploadFailureReason.other]: t.CopyrightFormFileOtherFailure || \"Something went wrong, try again\"\r\n }[failureReason];\r\n}\r\n\r\ninterface FileState {\r\n fileName?: string\r\n uploadState?: FileUploadState,\r\n uploadFailureReason?: FileUploadFailureReason,\r\n fileId?: string,\r\n}\r\n\r\ninterface CopyrightFormState {\r\n step: number;\r\n contactInfo: {\r\n firstName: string;\r\n lastName: string;\r\n email: string\r\n },\r\n details: {\r\n authorizedExample: string;\r\n description: string\r\n },\r\n files: {[key: string]: FileState},\r\n formIsValid: boolean,\r\n validationErrors: {\r\n firstNameError: string;\r\n lastNameError: string;\r\n emailError: string;\r\n emailSyntaxError: string;\r\n authorizedError: string;\r\n descriptionError: string;\r\n }\r\n}\r\nconst step2DefaultState = {\r\n contactInfo: {\r\n firstName: \"\",\r\n lastName: \"\",\r\n email: \"\"\r\n },\r\n details: {\r\n authorizedExample: \"\",\r\n description: \"\"\r\n },\r\n files: {},\r\n formIsValid: false,\r\n validationErrors: {\r\n firstNameError: \"\",\r\n lastNameError: \"\",\r\n emailError: \"\",\r\n emailSyntaxError: \"\",\r\n authorizedError: \"\",\r\n descriptionError: \"\"\r\n }\r\n};\r\nexport default class CopyrightForm extends React.Component {\r\n fileUploadAction: React.RefObject;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state= {\r\n step: 0,\r\n ...step2DefaultState\r\n };\r\n this.fileUploadAction = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n\r\n handleValidation() {\r\n const {contactInfo, details} = this.state;\r\n const {t} = this.props;\r\n\r\n const defaultInvalidMessage = t.CopyrightFormRequiredField;\r\n\r\n const getErrorValue = (field) => !field ? defaultInvalidMessage : \"\";\r\n\r\n const isEmailValid = (email) => {\r\n return typeof email !== \"undefined\" && !!email && /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(email);\r\n };\r\n\r\n const calculatedErrors = {\r\n firstNameError: getErrorValue(contactInfo.firstName),\r\n lastNameError: getErrorValue(contactInfo.lastName),\r\n emailError: getErrorValue(contactInfo.email),\r\n emailSyntaxError: !isEmailValid(contactInfo.email) ? t.CopyrightFormEmailValidation : \"\",\r\n authorizedError: getErrorValue(details.authorizedExample),\r\n descriptionError: getErrorValue(details.description)\r\n };\r\n\r\n const hasError = Object.values(calculatedErrors).some(err => err != \"\");\r\n\r\n this.setState({\r\n validationErrors: calculatedErrors,\r\n formIsValid: !hasError\r\n });\r\n\r\n return !hasError;\r\n }\r\n\r\n updateFileState(fileKey: string, fileName: string, uploadState?: FileUploadState, fileId?: string, uploadFailureReason?: FileUploadFailureReason) {\r\n this.setState(prevState => {\r\n const files = prevState.files;\r\n const fileState: FileState = files[fileKey] || {};\r\n return {\r\n files: {\r\n ...files,\r\n [fileKey]: {\r\n fileName: fileName,\r\n uploadState: uploadState ? uploadState : fileState.uploadState,\r\n fileId: fileId ? fileId : fileState.fileId,\r\n uploadFailureReason: uploadFailureReason ? uploadFailureReason : fileState.uploadFailureReason\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n async fileSelectHandler(e) {\r\n if (e && e.target && e.target.files && e.target.files.length > 0) {\r\n const eventTarget = e.target;\r\n const selectedFiles = eventTarget.files;\r\n const getFileKey = (file: File) => `${file.name}-${file.lastModified}-${file.size}`;\r\n\r\n Object.values(selectedFiles).forEach(\r\n (file: File) => {\r\n const fileKey = getFileKey(file);\r\n if (!this.state.files[fileKey]) {\r\n this.updateFileState(getFileKey(file), file.name, FileUploadState.waiting);\r\n }\r\n }\r\n );\r\n\r\n for (let i = 0; i < selectedFiles.length; i++) {\r\n const file = selectedFiles[i];\r\n const fileKey = getFileKey(file);\r\n const fileExtension = getExtension(file.name);\r\n const isFileAlreadyHandled = this.state.files[fileKey] && this.state.files[fileKey].uploadState !== FileUploadState.waiting;\r\n const uploadedFileCount = Object.values(this.state.files).filter(f => f.uploadState === FileUploadState.uploaded).length;\r\n const updateFileState = this.updateFileState.bind(this, fileKey, file.name);\r\n\r\n if (!isFileAlreadyHandled) {\r\n if (file.size > MaxFileSize) {\r\n updateFileState(FileUploadState.failed, undefined, FileUploadFailureReason.size);\r\n } else if (!AcceptedAttachmentTypes.includes(`.${fileExtension}`)) {\r\n updateFileState(FileUploadState.failed, undefined, FileUploadFailureReason.format);\r\n } else if (uploadedFileCount >= MaxFileCount) {\r\n updateFileState(FileUploadState.failed, undefined, FileUploadFailureReason.count);\r\n } else {\r\n try {\r\n updateFileState(FileUploadState.uploading);\r\n const fileId = await SocialService.uploadCopyrightFile(file);\r\n updateFileState(FileUploadState.uploaded, fileId);\r\n } catch (error) {\r\n logger.logError(`Social experience comment report copyright form file upload failed! The reason: ${error}`);\r\n updateFileState(FileUploadState.failed, undefined, FileUploadFailureReason.other);\r\n }\r\n }\r\n }\r\n }\r\n eventTarget.value = null; // This is necessary to able to select the same file twice. (See: https://stackoverflow.com/questions/12030686)\r\n }\r\n }\r\n\r\n submitForm(e) {\r\n e.preventDefault();\r\n if (this.handleValidation()) {\r\n const intellectualPropertyReportParams = {\r\n reportMessage: this.state.details.description,\r\n intellectualPropertyDetails: {\r\n FirstName: this.state.contactInfo.firstName,\r\n LastName: this.state.contactInfo.lastName,\r\n EmailAddress: this.state.contactInfo.email,\r\n AuthorizedExample: this.state.details.authorizedExample,\r\n AttachedFiles: Object.values(this.state.files).filter(file => file.uploadState === FileUploadState.uploaded).map(file => file.fileId)\r\n }\r\n };\r\n if (this.props.reportItemType) {\r\n SocialService.reportUser(this.props.id, this.props.reportItemType, this.props.reportType, intellectualPropertyReportParams);\r\n } else {\r\n SocialService.reportComment(this.props.id, this.props.reportType, intellectualPropertyReportParams);\r\n }\r\n this.props.onReport && this.props.onReport(this.props.reportType, e);\r\n this.props.popupConnector.closePopup();\r\n }\r\n }\r\n\r\n handleContactInfoOnChange(e) {\r\n const fieldName = e.target.name;\r\n this.setState({\r\n ...this.state,\r\n contactInfo: {\r\n ...this.state.contactInfo,\r\n [fieldName]: e.target.value\r\n },\r\n validationErrors: {\r\n ...this.state.validationErrors,\r\n [fieldName + \"Error\"]: \"\",\r\n emailSyntaxError: fieldName === \"email\" ? \"\" : this.state.validationErrors.emailSyntaxError\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n return (this.state.step == 0 && this.step0()) || (this.state.step == 1 && this.step1());\r\n }\r\n\r\n step0() {\r\n const {managedClasses, t, reportType, reportItemType} = this.props;\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {t.CopyrightFormCheckTxt}

    \r\n

    {t.CopyrightFormCheckSubTxt}

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n {this.renderButtonField(() => this.props.popupConnector.closePopup(), t.DeleteDataCancel, () => this.setState({...this.state, step: 1}), t.CopyrightFormYesContinueButton)}\r\n
    \r\n );\r\n }\r\n\r\n step1() {\r\n const {managedClasses, t}=this.props;\r\n const {firstName, lastName, email}=this.state.contactInfo;\r\n const {authorizedExample, description}=this.state.details;\r\n const {firstNameError, lastNameError, emailError, authorizedError, descriptionError} = this.state.validationErrors;\r\n const fileCount = Object.keys(this.state.files).length;\r\n const waitingOrUploadingFileCount = Object.values(this.state.files).filter(\r\n f => f.uploadState === FileUploadState.waiting || f.uploadState === FileUploadState.uploading\r\n ).length;\r\n const acceptedAttachmentTypes = AcceptedAttachmentTypes.join(\", \");\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {t.CopyrightFormMainTxt}

    \r\n

    {t.CopyrightFormMainSubTxt}

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {t.CopyrightFormContactInfoTitle}
    \r\n {this.renderInputField(t.CopyrightFormContactInfoFirstName, \"firstName\", firstName, firstNameError)}\r\n {this.renderInputField(t.CopyrightFormContactInfoLastName, \"lastName\", lastName, lastNameError)}\r\n {this.renderInputField(t.CopyrightFormContactInfoEmail, \"email\", email, emailError)}\r\n { (this.state.validationErrors.emailSyntaxError) && {t.CopyrightFormEmailValidation} }\r\n
    \r\n
    \r\n
    \r\n
    {t.CopyrightFormDetailsTitle}
    \r\n
    \r\n \r\n

    {t.CopyrightFormAuthorizedExampleSubTxt}

    \r\n this.setState({...this.state, details: {...this.state.details, [e.target.name]: e.target.value}, validationErrors: {...this.state.validationErrors, authorizedError: \"\"}})}>\r\n
    \r\n
    \r\n \r\n

    {t.CopyrightFormDescriptionSubTxt}

    \r\n \r\n
    \r\n
    \r\n \r\n

    {t.CopyrightFormAttachmentsSubTxt}

    \r\n
    \r\n \r\n this.fileUploadAction.current.click()}>{t.CopyrightFormUploadFileButton}\r\n {fileCount > 0 ?\r\n Object.keys(this.state.files).map(fileKey => {\r\n const fileState = this.state.files[fileKey];\r\n return (\r\n \r\n \r\n {fileState.fileName} ∙ {getFileUploadStateString(fileState.uploadState, t)} {fileState.uploadState === FileUploadState.failed && ` (${getFileUploadFailureString(fileState.uploadFailureReason, t)})`}\r\n \r\n \r\n \r\n );\r\n }) :\r\n { t.CopyrightFormNoFileChosen }\r\n }\r\n
    \r\n
    \r\n

    {t.CopyrightFormAttachmentsInfoTxt}

    \r\n
    \r\n
    \r\n this.setState({...this.state, ...step2DefaultState})}>{t.CopyrightFormResetButton}\r\n 0} className={classNames(\r\n \"cwt-fast-button\"\r\n )} onClick={this.submitForm.bind(this)}>{t.CopyrightFormSubmitButton}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderInputField(label, inputName, inputValue, error) {\r\n const {t} = this.props;\r\n return (\r\n
    \r\n \r\n this.handleContactInfoOnChange(e)}>\r\n
    \r\n );\r\n }\r\n\r\n renderButtonField(onClick, btnName, onClick1, btnName1) {\r\n return (\r\n
    \r\n {btnName}\r\n {btnName1}\r\n
    \r\n );\r\n }\r\n\r\n removeFile(fileKey: string) {\r\n const newFiles = {...this.state.files};\r\n delete newFiles[fileKey];\r\n this.setState({files: newFiles});\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { appEnvironment, Environment } from \"@msnews/core\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\n\r\nimport {\r\n CreateSubscriptionParams, ManageSubscriptionParams, LinkToPublisherParams,\r\n GetSubscriptionsForPublisherParams, GetSubscriptionsForPublisherResponse,\r\n RenewSubscriptionParams, GetSubscriptionsParams, GetSubscriptionsResponse,\r\n UnlinkPublisherParams, SubscriptionSDKInitParams\r\n} from \"./Interfaces\";\r\n\r\nconst prodSdkUrl = \"https://xpaycdn.azureedge.net/js/pack/xpaySubscription.js\";\r\nconst intSdkUrl = \"https://xpaycdn-int.azureedge.net/js/pack/xpaySubscription.js\";\r\n\r\nlet subscriptionContainerId: string;\r\n\r\n// SDK is already initialized if `subscriptionContainerId` has a value\r\nconst isAlreadyInitialized = (): boolean => !!subscriptionContainerId;\r\n\r\n// `sdkLoaded` promise is resolved when the SDK source file is loaded\r\nlet sdkLoadedResolver: (value: boolean) => void;\r\nexport const sdkLoaded: Promise = new Promise(resolve => {\r\n sdkLoadedResolver = resolve;\r\n});\r\n\r\nfunction getSdkUrl(): string {\r\n switch (appEnvironment.Environment) {\r\n case Environment.int:\r\n case Environment.int1:\r\n case Environment.intpr:\r\n case Environment.intpef:\r\n return intSdkUrl;\r\n case Environment.prod:\r\n default:\r\n return prodSdkUrl;\r\n }\r\n}\r\n\r\nexport function initializeSubscriptionSdk() {\r\n if (!isAlreadyInitialized()) {\r\n const sdkScript = document.createElement(\"script\");\r\n sdkScript.onload = () => {\r\n sdkLoadedResolver(true);\r\n init({\r\n env: getSdkEnv(),\r\n requestId: Telemetry ? Telemetry.getRequestId() : appEnvironment.ActivityIdLowerCaseNoHypens\r\n });\r\n };\r\n sdkScript.src = getSdkUrl();\r\n sdkScript.defer = true;\r\n document.body.appendChild(sdkScript);\r\n\r\n subscriptionContainerId = \"subscription-sdk-container\";\r\n const subscriptionContainer = document.createElement(\"div\");\r\n subscriptionContainer.id = subscriptionContainerId;\r\n document.body.appendChild(subscriptionContainer);\r\n }\r\n}\r\n\r\nexport async function init(params: SubscriptionSDKInitParams) {\r\n return callSdkFunction(\"init\", params);\r\n}\r\n\r\nexport async function renderCreateSubscription(params: CreateSubscriptionParams) {\r\n return callSdkFunction(\"renderCreateSubscription\", params);\r\n}\r\n\r\nexport async function renderManageSubscription(params: ManageSubscriptionParams) {\r\n return callSdkFunction(\"renderManageSubscription\", params);\r\n}\r\n\r\nexport async function renewSubscription(params: RenewSubscriptionParams) {\r\n return callSdkFunction(\"renewSubscription\", params);\r\n}\r\n\r\nexport async function renderLinkToPublisher(params: LinkToPublisherParams) {\r\n return callSdkFunction(\"renderLinkToPublisher\", params);\r\n}\r\n\r\nexport async function getSubscriptionsForPublisher(params: GetSubscriptionsForPublisherParams): Promise {\r\n return callSdkFunction(\"getSubscriptionsForPublisher\", params);\r\n}\r\n\r\nexport async function getSubscriptions(params: GetSubscriptionsParams): Promise {\r\n return callSdkFunction(\"getSubscriptions\", params);\r\n}\r\n\r\nexport async function unlinkPublisher(params: UnlinkPublisherParams): Promise {\r\n return callSdkFunction(\"unlinkPublisher\", params);\r\n}\r\n\r\nexport enum ProductType {\r\n Basic = 0,\r\n Advanced = 1,\r\n Premium = 2\r\n}\r\n\r\nexport enum MsnProductType {\r\n Undefined = 0,\r\n Basic = 1,\r\n Advanced = 2,\r\n Premium = 3\r\n}\r\n\r\nexport function mapSdkProductTypeToMsnProductType(sdkProductType: ProductType) {\r\n return sdkProductType + 1;\r\n}\r\n\r\nexport function mapMsnProductTypeToSdkProductType(msnProductType: MsnProductType) {\r\n return msnProductType - 1;\r\n}\r\n\r\nexport enum EnvList {\r\n PROD = 0,\r\n CI = 1,\r\n TEST = 2,\r\n INT = 3\r\n}\r\n\r\nasync function callSdkFunction(functionName: string, params) {\r\n await sdkLoaded;\r\n const func = window.xpaySubscription[functionName];\r\n params = await ensureRequiredParams(params);\r\n return func(params);\r\n}\r\n\r\nasync function ensureRequiredParams(params) {\r\n return {\r\n ...params,\r\n env: params.env !== undefined ? params.env : getSdkEnv(),\r\n tileContainerId: subscriptionContainerId\r\n };\r\n}\r\n\r\nexport function getSdkEnv(): EnvList {\r\n switch (appEnvironment.Environment) {\r\n case Environment.int:\r\n case Environment.int1:\r\n case Environment.intpr:\r\n case Environment.intpef:\r\n return EnvList.INT;\r\n case Environment.prod:\r\n default:\r\n return EnvList.PROD;\r\n }\r\n}\r\n\r\nexport enum SubscriptionStatus {\r\n Active = \"Active\",\r\n Expired = \"Expired\",\r\n Canceled = \"Canceled\",\r\n PaymentFailed = \"PaymentFailed\"\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getSubscriptionsForPublisher } from \"@msnews/subscription-sdk-wrapper\";\r\nimport { getXPayToken, User } from \"@msnews/social-data-service\";\r\n\r\nexport async function hasPremiumSubscription (me: User, publisherId: string): Promise {\r\n return getSubscriptionsForPublisher({\r\n publisherId: publisherId,\r\n authToken: await getXPayToken(me.id)\r\n }).then(response => {\r\n if (response.status && response.data && response.data.find(s => s.subscriptionType === \"Premium\")) {\r\n return true;\r\n }\r\n return false;\r\n }).catch(() => {\r\n return false;\r\n });\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase, TelemetryType } from \"@msnews/telemetry-contracts\";\r\n\r\nexport interface GradientOverlayTelemetryObjects {\r\n readFullContentButton: TelemetryObjectBase;\r\n}\r\n\r\nexport const gradientOverlayTelemetryContracts = {\r\n\r\n readFullContentButton: {\r\n name: \"SubscribeToReadFullPremiumContent\",\r\n behavior: TelemetryBehaviorType.Undefined,\r\n type: TelemetryType.ActionButton,\r\n content: {\r\n headline: \"SubscribeToReadFullPremiumContent\",\r\n type: TelemetryContentType.Article }\r\n }\r\n\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { MsnProductType, ProductType, initializeSubscriptionSdk, renderCreateSubscription } from \"@msnews/subscription-sdk-wrapper\";\r\nimport { addOrUpdateTelemetryObject, enums, getExternalURL, placeholderImages, renderHybrid } from \"@msnews/social-utils\";\r\n\r\nimport React from \"react\";\r\nimport { SocialProps } from \"../../Social.props\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { getXPayToken } from \"@msnews/social-data-service\";\r\nimport { hasPremiumSubscription } from \"../../utils/subscriptionHelpers\";\r\nimport { gradientOverlayTelemetryContracts, GradientOverlayTelemetryObjects } from \"./GradientOverlay.telemetry\";\r\n\r\ninterface GradientOverlayState {\r\n overlayVisible: boolean;\r\n}\r\n\r\nexport default class GradientOverlay extends React.Component {\r\n private subscriptionChecked: boolean;\r\n telemetryObjects: GradientOverlayTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n overlayVisible: false\r\n };\r\n this.telemetryObjects= null;\r\n }\r\n\r\n componentDidMount() {\r\n initializeSubscriptionSdk();\r\n const { me, gradientOverlayData } = this.props;\r\n if (!me) {\r\n this.props.usersConnector.fetchMe();\r\n } else if (gradientOverlayData) {\r\n this.checkSubscription();\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n const { me, gradientOverlayData } = this.props;\r\n if (!this.subscriptionChecked && me && gradientOverlayData) {\r\n this.checkSubscription();\r\n }\r\n }\r\n\r\n async checkSubscription() {\r\n this.subscriptionChecked = true;\r\n const { me, gradientOverlayData } = this.props;\r\n if (gradientOverlayData.subscriptionProductType === MsnProductType.Premium) {\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n if (isAnonymous) {\r\n this.activateComponent();\r\n } else {\r\n if (!gradientOverlayData.publisherProfileId) {\r\n return this.activateComponent();\r\n }\r\n\r\n hasPremiumSubscription(me, gradientOverlayData.publisherProfileId).then(hasSubscription => {\r\n if (!hasSubscription) {\r\n this.activateComponent();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n activateComponent() {\r\n const { me } = this.props;\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n\r\n document.body.style.overflow = \"hidden\";\r\n if (isAnonymous) {\r\n this.setState(() => ({ overlayVisible: true }));\r\n } else {\r\n this.renderCreateSubscriptionPanel();\r\n }\r\n }\r\n\r\n async onButtonClick(e) {\r\n const { me } = this.props;\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n if (isAnonymous) {\r\n return this.props.popupConnector.openPopup(\"multiLoginPage\");\r\n } else {\r\n this.renderCreateSubscriptionPanel();\r\n }\r\n }\r\n\r\n async renderCreateSubscriptionPanel() {\r\n const { gradientOverlayData, me, market } = this.props;\r\n await renderCreateSubscription({\r\n publisherId: gradientOverlayData.publisherProfileId,\r\n publisherName: gradientOverlayData.publisherName,\r\n publisherLogoUrl: gradientOverlayData.publisherLogoUrl,\r\n productType: ProductType.Premium,\r\n userProfilePageUrl: getExternalURL(`${enums.externalUrls.profilePage}${me.id}`, market),\r\n locale: market,\r\n authToken: await getXPayToken(me.id),\r\n userProfileImageUrl: me.primaryAvatar || placeholderImages.avatar,\r\n scenario: \"article\",\r\n onSuccess: () => {\r\n window.location.reload();\r\n }\r\n });\r\n this.setState(() => ({ overlayVisible: false }));\r\n }\r\n\r\n render() {\r\n const { t, managedClasses, gradientOverlayData, mainTelemetryObject } = this.props;\r\n if (!gradientOverlayData || !this.state.overlayVisible) { return null; }\r\n\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n readFullContentButton: addOrUpdateTelemetryObject(mainTelemetryObject, gradientOverlayTelemetryContracts.readFullContentButton, { id: gradientOverlayData.publisherProfileId }, this.telemetryObjects && this.telemetryObjects.readFullContentButton)\r\n };\r\n }\r\n\r\n return (\r\n
    this.onButtonClick(e)}>\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\nconst defaultIds = {\r\n fbClientId: \"223505105588011\",\r\n googleClientId: \"967108317934-brcub79f1q5gt8mniu3e912rtrdtmfor.apps.googleusercontent.com\"\r\n};\r\n\r\nasync function facebookLogin(fbClientId?: string): Promise {\r\n fbClientId = fbClientId || defaultIds.fbClientId;\r\n return new Promise((resolve, reject) => {\r\n const callback = function() {\r\n if (window.FB) {\r\n window.FB.login((response) => {\r\n if (response && response.authResponse) {\r\n window.FB.api(\"/me\", {fields: \"email\" }, (response) => {\r\n if (response && response.email) {\r\n return resolve(response.email);\r\n }\r\n return reject();\r\n }\r\n );\r\n } else {\r\n // User cancelled login or did not fully authorize.\r\n return reject();\r\n }\r\n }, {scope: \"email\"});\r\n return;\r\n }\r\n };\r\n\r\n if (window.FB) {\r\n window.FB.init({\r\n appId: fbClientId\r\n });\r\n callback();\r\n return;\r\n }\r\n window.fbAsyncInit = function() {\r\n window.FB.init({\r\n appId: fbClientId,\r\n cookie: true, // This is important, it's not enabled by default\r\n version: \"v7.0\"\r\n });\r\n callback();\r\n };\r\n\r\n (function(d, s, id) {\r\n const fjs = d.getElementsByTagName(s)[0];\r\n if (d.getElementById(id)) { return; }\r\n const js = d.createElement(s); js.id = id;\r\n js.src = \"https://connect.facebook.net/en_US/sdk.js\";\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }(document, \"script\", \"facebook-jssdk\"));\r\n });\r\n}\r\n\r\nasync function googleLogin(googleClientId?: string): Promise {\r\n googleClientId = googleClientId || defaultIds.googleClientId;\r\n return new Promise((resolve, reject) => {\r\n const loginAndGetPassword = function() {\r\n window.auth2.signIn().then(() => {\r\n const email = getEmailFromActiveSession();\r\n if (email) {\r\n return resolve(email);\r\n }\r\n // Email consent is not given\r\n reject();\r\n }).catch((e) => {\r\n // Login failed\r\n reject(e);\r\n });\r\n };\r\n\r\n const getEmailFromActiveSession = function() {\r\n try {\r\n return window.auth2.currentUser.get().getBasicProfile().getEmail();\r\n } catch (e) {\r\n return null;\r\n }\r\n };\r\n\r\n if (window.auth2) {\r\n const email = getEmailFromActiveSession();\r\n if (email) {\r\n return resolve(email);\r\n }\r\n loginAndGetPassword();\r\n return;\r\n }\r\n\r\n window.googleInit = function() {\r\n window.gapi.load(\"auth2\", function() {\r\n window.auth2 = window.gapi.auth2.init({\r\n client_id: googleClientId,\r\n scope: \"email\"\r\n });\r\n loginAndGetPassword();\r\n });\r\n };\r\n\r\n (function(d, s, id) {\r\n const fjs = d.getElementsByTagName(s)[0];\r\n if (d.getElementById(id)) { return; }\r\n const js = d.createElement(s); js.id = id;\r\n js.src = \"https://apis.google.com/js/platform.js?onload=googleInit\";\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }(document, \"script\", \"google-jssdk\"));\r\n });\r\n}\r\n\r\nfunction msaLogin(email?: string, market?: string, replyUrl?: string, isSignup?: boolean): Promise {\r\n market = market || \"en-us\";\r\n replyUrl = replyUrl || `https://www.msn.com/${market}/settings`;\r\n const redirectLink = `https://www.msn.com/${market}/homepage/Secure/Passport?ru=${encodeURIComponent(replyUrl)}?pfr=1`;\r\n const baseUrl = isSignup ? \"http://signup.live.com/signup.aspx\" : \"https://login.live.com/login.srf\";\r\n const url = `${baseUrl}?${email ? `username=${encodeURIComponent(email)}` : \"\"}&wa=wsignin1.0&wp=LBI&wreply=${encodeURIComponent(redirectLink)}`;\r\n\r\n window.msaLoginWindow = window.open(url, \"_blank\", \"width=400,height=450\");\r\n return new Promise((resolve, reject) => {\r\n window.listenMSALoginWindow = () => {\r\n if (!window.msaLoginWindow) {\r\n // Login window is not available anymore\r\n return reject();\r\n }\r\n try {\r\n if (window.msaLoginWindow &&\r\n window.msaLoginWindow.location.href &&\r\n window.msaLoginWindow.location.href.indexOf(replyUrl) == 0 &&\r\n window.msaLoginWindow.document.body) {\r\n // Login sucessfully completed.\r\n window.msaLoginWindow.close();\r\n return resolve();\r\n }\r\n } catch (e) {\r\n // Login in progress keep retrying\r\n }\r\n setTimeout(() => { window.listenMSALoginWindow(); }, 500);\r\n };\r\n window.listenMSALoginWindow();\r\n });\r\n}\r\n\r\nexport { facebookLogin, googleLogin, msaLogin };","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface MultiLoginPageTelemetryObjects {\r\n main: TelemetryObjectBase;\r\n loginMicrosoft: TelemetryObjectBase;\r\n loginGoogle: TelemetryObjectBase;\r\n loginFacebook: TelemetryObjectBase;\r\n}\r\n\r\nexport const multiLoginPageTelemetryContracts = {\r\n /**\r\n * Comments-Scenario 4b\r\n * */\r\n main: {\r\n name: \"LoginSelectMethod\",\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Comments-Scenario 4ci */\r\n loginMicrosoft: {\r\n name: \"ContinueWithMicrosoft\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"ContinueWithMicrosoft\"\r\n }\r\n },\r\n /** Comments-Scenario 4cii */\r\n loginGoogle: {\r\n name: \"ContinueWithGoogle\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"ContinueWithGoogle\"\r\n }\r\n },\r\n /** Comments-Scenario 4cii */\r\n loginFacebook: {\r\n name: \"ContinueWithFacebook\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"ContinueWithFacebook\"\r\n }\r\n }\r\n};\r\n\r\nexport const multiLoginPageTelemetryActionDispatchers = {\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { getContextData } from \"@msnews/core\";\r\nimport { facebookLogin, googleLogin, logoImages, msaLogin, placeholderImages, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { SocialProps } from \"../Social.props\";\r\nimport { multiLoginPageTelemetryActionDispatchers, multiLoginPageTelemetryContracts, MultiLoginPageTelemetryObjects } from \"./MultiLoginPage.telemetry\";\r\n\r\nexport default class MultiLoginPage extends React.Component {\r\n containerRef: HTMLDivElement;\r\n telemetryObjects: MultiLoginPageTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n async loginWith(event, loginType: string, telemetryObject): Promise {\r\n multiLoginPageTelemetryActionDispatchers.genericClick(event.currentTarget, telemetryObject);\r\n\r\n let email = null;\r\n try {\r\n if (loginType == \"facebook\") {\r\n email = await facebookLogin();\r\n } else if (loginType == \"google\") {\r\n email = await googleLogin();\r\n }\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n if (loginType != \"microsoft\" && !email) {\r\n return;\r\n } else if (loginType != \"microsoft\" && email) {\r\n this.props.popupConnector.openPopup(\"onboardingThirdPartyPage\", { email, loginType, contentId: this.props.contentId });\r\n return;\r\n }\r\n\r\n try {\r\n const requestContext = this.props.requestContext;\r\n const locationHref = getContextData(requestContext.data.locationHref, \"locationHref\");\r\n await msaLogin(email, this.props.market, locationHref.split(\"?\")[0]);\r\n this.props.usersConnector.fetchMe();\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (this.props.me.isSocialUser) {\r\n this.props.popupConnector.closePopup();\r\n } else if (this.props.me.name) {\r\n this.props.popupConnector.openPopup(\"onboardingPage\", { contentId: this.props.contentId });\r\n }\r\n }\r\n\r\n render() {\r\n const { managedClasses, market, t, mainTelemetryObject, contentId, contents } = this.props;\r\n const cmsId = contentId && contents && contents[contentId] && contents[contentId].cmsId;\r\n\r\n /** Generate Telemetry Objects */\r\n const containerTelemetryObject= addOrUpdateTelemetryObject(mainTelemetryObject, multiLoginPageTelemetryContracts.main, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.main);\r\n this.telemetryObjects = {\r\n main: containerTelemetryObject,\r\n loginMicrosoft: addOrUpdateTelemetryObject(containerTelemetryObject, multiLoginPageTelemetryContracts.loginMicrosoft, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.loginMicrosoft),\r\n loginGoogle: addOrUpdateTelemetryObject(containerTelemetryObject, multiLoginPageTelemetryContracts.loginGoogle, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.loginGoogle),\r\n loginFacebook: addOrUpdateTelemetryObject(containerTelemetryObject, multiLoginPageTelemetryContracts.loginFacebook, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.loginFacebook)\r\n };\r\n\r\n const renderLoginImage = (image) => ;\r\n\r\n return (\r\n
    \r\n {t.AriaLabelsProfilePicture}\r\n

    {t.MultiLoginTitle}

    \r\n renderLoginImage(logoImages.microsoft)} className=\"cwt-link cwt-fast-button cwt-image-button\" onClick={e => this.loginWith(e, \"microsoft\", this.telemetryObjects.loginMicrosoft)} {...renderHybrid(this.telemetryObjects.loginMicrosoft, false)}>\r\n {t.MultiLoginMicrosoft}\r\n \r\n renderLoginImage(logoImages.google)} className=\"cwt-link cwt-fast-button cwt-image-button\" onClick={e => this.loginWith(e, \"google\", this.telemetryObjects.loginGoogle)} {...renderHybrid(this.telemetryObjects.loginGoogle, false)}>\r\n {t.MultiLoginGoogle}\r\n \r\n renderLoginImage(logoImages.facebook)} className=\"cwt-link cwt-fast-button cwt-image-button\" onClick={ e => this.loginWith(e, \"facebook\", this.telemetryObjects.loginFacebook)} {...renderHybrid(this.telemetryObjects.loginFacebook, false)}>\r\n {t.MultiLoginFacebook}\r\n \r\n\r\n {t.MultiLoginFooterTerms}),\r\n MultiLoginFooterPrivacy: renderToString({t.MultiLoginFooterPrivacy})\r\n })\r\n }}/>\r\n
    \r\n );\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BridgeEventNames, dispatchBridgeEvent } from \"./Social.bridge\";\r\n\r\nimport { getExternalURL } from \"./urlHelper\";\r\nimport { isComponentDisabled } from \"./themeHelpers\";\r\n\r\nexport function openArticlePage(theme, url, contentId, commentId, target = \"_self\") {\r\n const attributes = [];\r\n attributes[\"href\"] = getExternalURL(url, undefined, commentId);\r\n attributes[\"target\"] = target;\r\n if (isComponentDisabled(theme, \"articlepage\")) {\r\n attributes[\"onClick\"] = (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const idAndMarket = contentId.split(\"_\");\r\n dispatchBridgeEvent(BridgeEventNames.openDeepLink, {link: `msnnews://application/view?entitytype=Article&contentId=${idAndMarket[0]}&commentId=${commentId}&shouldScrollToComments=true`});\r\n };\r\n }\r\n return attributes;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nexport interface NotificationCardTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n closeButton: TelemetryObjectBase;\r\n messageLink: TelemetryObjectBase;\r\n deletedMessageLink: TelemetryObjectBase;\r\n profileLink: TelemetryObjectBase;\r\n}\r\n\r\nexport const notificationCardTelemetryContracts = {\r\n // Toast > Scenario-1 contentview\r\n reply: {\r\n name: \"CommentRespondToast\",\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n // Toast > Scenario-2 and Scenario-5 click\r\n closeButton: {\r\n name: \"Close\",\r\n behavior: TelemetryBehaviorType.Close,\r\n content: { headline: \"Close\", type: TelemetryContentType.Toast }\r\n },\r\n // Toast > Scenario-3 click\r\n commentLink: {\r\n name: \"GoToComment\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n // Toast > Scenario-4 contentview\r\n achievement: {\r\n name: \"CommunityProfileAchievementBadge\",\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n // Toast > Scenario-6 click\r\n achievementLink: {\r\n name: \"Achievement\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n reaction: {\r\n name: \"ReactionToast\",\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n follow: {\r\n name: \"FollowToast\",\r\n content: { type: TelemetryContentType.Toast }\r\n },\r\n deletedMessageLink: {\r\n name: \"GoToGuidelines\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: { headline: \"GoToGuidelines\", type: TelemetryContentType.Toast }\r\n },\r\n profileLink: {\r\n name: \"GoToProfile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: { headline: \"GoToProfile\", type: TelemetryContentType.Toast }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { ActivityData, User } from \"@msnews/social-data-service\";\r\nimport { activityImages, avatarFallback, close, enums, exclamation_round, openArticlePage, openGuidelinePage, openProfilePage, placeholderImages, addOrUpdateTelemetryObject, dispatchTelemetryEvent, renderHybrid, TelemetryEventMap } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { SocialClassNameContract } from \"../../Social.classnames\";\r\nimport { SocialLocalizedStrings } from \"../../Social.localizedStrings\";\r\nimport { ComponentConnector, FollowInfo, UsersConnector } from \"../../Social.props\";\r\nimport { notificationCardTelemetryContracts, NotificationCardTelemetryObjects } from \"./NotificationCard.telemetry\";\r\n\r\nexport interface NotificationCardProps {\r\n componentConnector: ComponentConnector;\r\n notification: ActivityData,\r\n managedClasses?: SocialClassNameContract;\r\n t: SocialLocalizedStrings;\r\n usersConnector: UsersConnector;\r\n users: { [id: string]: FollowInfo}; // dictionary definening\r\n market: string;\r\n me: User;\r\n theme: string;\r\n mainTelemetryObject: TelemetryObjectBase;\r\n}\r\n\r\nexport default class NotificationCard extends React.Component {\r\n containerRef: HTMLDivElement;\r\n telemetryObjects: NotificationCardTelemetryObjects;\r\n private static AchievementTitles;\r\n private static AchievementMessages;\r\n isLoaded: boolean;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n // Initialize variables with localized strings.\r\n NotificationCard.AchievementTitles = {\r\n Member: props.t.AchievementTitlesMember,\r\n Commenter: props.t.AchievementTitlesCommenter,\r\n Networker: props.t.AchievementTitlesNetworker,\r\n ConversationStarter: props.t.AchievementTitlesConversationStarter\r\n };\r\n\r\n NotificationCard.AchievementMessages = {\r\n Member: props.t.AchievementMessagesMember,\r\n Commenter: props.t.AchievementMessagesCommenter,\r\n Networker: props.t.AchievementMessagesNetworker,\r\n ConversationStarter: props.t.AchievementMessagesConversationStarter\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.notification.target && this.props.notification.target.comment &&\r\n this.props.notification.target.comment.mentionUser && !(this.props.users && this.props.users[this.props.notification.target.comment.mentionUser])) {\r\n this.props.usersConnector.fetchUser(this.props.notification.target.comment.mentionUser);\r\n }\r\n\r\n this.sendContentView();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.sendContentView();\r\n }\r\n\r\n closeHandler() {\r\n this.props.usersConnector.markActivityAsRead(this.props.notification.id, true);\r\n }\r\n\r\n getImageFromNotification(notification: ActivityData) {\r\n switch (notification.type) {\r\n case enums.activityType.follow:\r\n return notification.user && notification.user.avatarUrl || placeholderImages.avatar;\r\n\r\n case enums.activityType.badge:\r\n return activityImages.trophy;\r\n\r\n case enums.activityType.reply:\r\n return notification.user && notification.user.avatarUrl || placeholderImages.avatar;\r\n\r\n case enums.activityType.reaction:\r\n return placeholderImages.peopleAvatar;\r\n }\r\n }\r\n\r\n getTitleFromNotification(notification: ActivityData, t: SocialLocalizedStrings, theme: string, componentConnector: ComponentConnector) {\r\n switch (notification.type) {\r\n case enums.activityType.follow:\r\n return
    { notification.user.name } )\r\n })\r\n }} />;\r\n\r\n case enums.activityType.badge:\r\n return NotificationCard.AchievementTitles[notification.badgeType];\r\n\r\n case enums.activityType.reply:\r\n return
    { notification.user.name }),\r\n commentLink: renderToString({ t.NotificationYourComment })\r\n })\r\n }}/>;\r\n\r\n case enums.activityType.reaction: {\r\n let totalReactionCount = 0;\r\n if (notification.target.reactionCounts) {\r\n totalReactionCount = Object.values(notification.target.reactionCounts).reduce(($sum, $count) => $sum + $count, 0);\r\n }\r\n return
    { t.NotificationYourComment })\r\n })\r\n }}/>;\r\n }\r\n }\r\n }\r\n\r\n getMessageFromNotification(notification: ActivityData, users: { [id: string]: FollowInfo}, t: SocialLocalizedStrings, theme: string, componentConnector: ComponentConnector, market: string) {\r\n switch (notification.type) {\r\n case enums.activityType.follow:\r\n return \"\";\r\n\r\n case enums.activityType.badge:\r\n return
    \r\n {NotificationCard.AchievementMessages[notification.badgeType]}\r\n
    ;\r\n\r\n case enums.activityType.reply: {\r\n const mentionUser = notification.target.comment.mentionUser;\r\n return notification.target.comment.isDeleted ?\r\n \r\n :\r\n
    \r\n {mentionUser &&\r\n \r\n \r\n {users && users[mentionUser] && users[mentionUser].data && users[mentionUser].data.name}\r\n  \r\n \r\n }\r\n \r\n
    \r\n \r\n
    ;\r\n }\r\n\r\n case enums.activityType.reaction: {\r\n let totalReactionCount = 0;\r\n if (notification.target.reactionCounts) {\r\n totalReactionCount = Object.values(notification.target.reactionCounts).reduce(($sum, $count) => $sum + $count, 0);\r\n }\r\n return
    { t.NotificationYourComment })\r\n })\r\n }}/>;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const {componentConnector, users, notification, managedClasses, t, theme, market} = this.props;\r\n const isImageClickable = notification.type === enums.activityType.follow || notification.type === enums.activityType.reply;\r\n const isAchievement = notification.type === enums.activityType.badge;\r\n\r\n this.generateTelemetryObjects();\r\n\r\n const notificationImg = (\r\n { avatarFallback(e); }}\r\n />\r\n );\r\n\r\n return (\r\n
    { this.containerRef = el; })}>\r\n \r\n {close} \r\n \r\n
    \r\n
    \r\n { isImageClickable ?\r\n { notificationImg }\r\n : notificationImg\r\n }\r\n
    \r\n
    {this.getTitleFromNotification(notification, t, theme, componentConnector)}
    \r\n
    \r\n
    {this.getMessageFromNotification(notification, users, t, theme, componentConnector, market)}
    \r\n
    \r\n );\r\n }\r\n\r\n generateTelemetryObjects() {\r\n const { notification, mainTelemetryObject } = this.props;\r\n if (!mainTelemetryObject) { return; }\r\n\r\n const containerTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, this.getContainerTelemetryContract(notification.type), { id: notification.id }, this.telemetryObjects && this.telemetryObjects.container);\r\n this.telemetryObjects = {\r\n container: containerTelemetryObject,\r\n closeButton: addOrUpdateTelemetryObject(containerTelemetryObject, notificationCardTelemetryContracts.closeButton, { id: notification.id }, this.telemetryObjects && this.telemetryObjects.closeButton),\r\n messageLink: addOrUpdateTelemetryObject(containerTelemetryObject, this.getMessageLinkTelemetryContract(notification.type), { id: notification.id }, this.telemetryObjects && this.telemetryObjects.messageLink),\r\n deletedMessageLink: addOrUpdateTelemetryObject(containerTelemetryObject, notificationCardTelemetryContracts.deletedMessageLink, { id: notification.id }, this.telemetryObjects && this.telemetryObjects.deletedMessageLink),\r\n profileLink: addOrUpdateTelemetryObject(containerTelemetryObject, notificationCardTelemetryContracts.profileLink, { id: notification.id }, this.telemetryObjects && this.telemetryObjects.profileLink)\r\n };\r\n }\r\n\r\n getContainerTelemetryContract(notificationType) {\r\n switch (notificationType) {\r\n case enums.activityType.badge: return notificationCardTelemetryContracts.achievement;\r\n case enums.activityType.reply: return notificationCardTelemetryContracts.reply;\r\n case enums.activityType.reaction: return notificationCardTelemetryContracts.reaction;\r\n case enums.activityType.follow: return notificationCardTelemetryContracts.follow;\r\n }\r\n }\r\n\r\n getMessageLinkTelemetryContract(notificationType) {\r\n switch (notificationType) {\r\n case enums.activityType.badge: return notificationCardTelemetryContracts.achievementLink;\r\n case enums.activityType.reply: return notificationCardTelemetryContracts.commentLink;\r\n case enums.activityType.reaction: return notificationCardTelemetryContracts.commentLink;\r\n case enums.activityType.follow: return notificationCardTelemetryContracts.profileLink;\r\n }\r\n }\r\n\r\n sendContentView() {\r\n if (!this.containerRef || this.isLoaded) { return; }\r\n\r\n this.isLoaded = true;\r\n dispatchTelemetryEvent({...TelemetryEventMap.genericLoaded, sendPeregrine: true}, this.containerRef.parentElement);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Activities } from \"@msnews/social-data-service\";\r\nimport NotificationCard from \"./NotificationCard\";\r\nimport React from \"react\";\r\nimport { SocialLocalizedStrings } from \"../../Social.localizedStrings\";\r\nimport { SocialProps } from \"../../Social.props\";\r\nimport { SocialState } from \"../../Social.state\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { connect } from \"react-redux\";\r\n\r\nexport interface NotificationTrayProps extends SocialProps {\r\n notifications: Activities;\r\n t: SocialLocalizedStrings;\r\n alignment?: \"left\" | \"right\";\r\n}\r\n\r\nconst mapStateToProps = function(state: SocialState) {\r\n return {\r\n me: state.me,\r\n notifications: state.notifications,\r\n theme: state.theme\r\n };\r\n};\r\n\r\nexport class NotificationTray extends React.Component {\r\n fetchNotificationsJobId: NodeJS.Timer;\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.usersConnector.fetchNotifications();\r\n this.fetchNotificationsJobId = setInterval(() => { this.props.usersConnector.fetchNotifications(); }, 30000);\r\n }\r\n\r\n componentWillUnmount() {\r\n clearInterval(this.fetchNotificationsJobId);\r\n }\r\n\r\n render() {\r\n const { alignment, componentConnector, t, managedClasses, users, usersConnector, market, me, notifications, theme, mainTelemetryObject } = this.props;\r\n if (!notifications) { return null; }\r\n const isLeftAligned = alignment == \"left\";\r\n\r\n return (\r\n
    \r\n {notifications.list.map(notification => {\r\n return ;\r\n })}\r\n
    \r\n );\r\n }\r\n}\r\nexport default connect(mapStateToProps)(NotificationTray);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface OnboardingPageTelemetryObjects {\r\n main: TelemetryObjectBase;\r\n step1Continue: TelemetryObjectBase;\r\n step1EditProfile: TelemetryObjectBase;\r\n step2ThanksPage: TelemetryObjectBase;\r\n step2LetsGo: TelemetryObjectBase;\r\n}\r\n\r\nexport interface OnboardingThirdPartyPageTelemetryObjects {\r\n main: TelemetryObjectBase;\r\n onboardingThirdPartyPageSignIn: TelemetryObjectBase;\r\n onboardingThirdPartyPageCreateAccount: TelemetryObjectBase;\r\n}\r\n\r\nexport const onboardingPageTelemetryContracts = {\r\n /** Comments-Scenario 4d */\r\n onboardingPage: {\r\n name: \"CommunityWelcomeStep1\",\r\n content: {\r\n type: getPageContentType()\r\n }\r\n },\r\n /** Comments-Scenario 4ciia */\r\n onboardingThirdPartyPage: {\r\n name: \"CommunityLinkAccount\",\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"ContinueWithMicrosoft\"\r\n }\r\n },\r\n /** Scenario 4ciia (scenario index has duplicate) */\r\n onboardingThirdPartyPageSignIn: {\r\n name: \"SignInWithThisAccount\",\r\n behavior: TelemetryBehaviorType.SignIn,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"SignInWithThisAccount\"\r\n }\r\n },\r\n /** Scenario 4ciib*/\r\n onboardingThirdPartyPageCreateAccount: {\r\n name: \"CreateNewMSA\",\r\n behavior: TelemetryBehaviorType.Open,\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"CreateNewMSA\"\r\n }\r\n },\r\n /** Comments-Scenario 4dii */\r\n step1Continue: {\r\n behavior: TelemetryBehaviorType.Close,\r\n name: \"Continue\",\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"Continue\"\r\n }\r\n },\r\n /** Comments-Scenario 4di */\r\n step1EditProfile: {\r\n behavior: TelemetryBehaviorType.Navigate,\r\n name: \"Edit Profile\",\r\n content: {\r\n type: getPageContentType(),\r\n headline: \"EditProfile\"\r\n }\r\n },\r\n /** Comments-Scenario 4d2 */\r\n step2ThanksPage: {\r\n name: \"CommunityWelcomeStep2\",\r\n content: {type: TelemetryContentType.Article}\r\n },\r\n /** Comments-Scenario 4d2a */\r\n step2LetsGo: {\r\n behavior: TelemetryBehaviorType.Navigate,\r\n name: \"LetsGo\",\r\n content: {\r\n type: TelemetryContentType.Article,\r\n headline: \"LetsGo\"\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { avatarFallback, enums, exclamation_round, getExternalURL, hasThemeBase, openEditProfilePage, placeholderImages, addOrUpdateTelemetryObject, dispatchTelemetryEvent, renderHybrid, TelemetryEventMap } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { SocialProps } from \"../Social.props\";\r\nimport { onboardingPageTelemetryContracts, OnboardingPageTelemetryObjects } from \"./OnboardingPage.telemetry\";\r\n\r\ninterface OnboardingPageState {\r\n step: number;\r\n createUserInProgress: boolean;\r\n createUserErrorMessage?: string;\r\n}\r\nexport default class OnboardingPage extends React.Component {\r\n containerRef: HTMLDivElement;\r\n fetchAndVerifyMeTimerId: NodeJS.Timer;\r\n maxRetryCount: number;\r\n retryCount: number;\r\n telemetryObjects: OnboardingPageTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n this.maxRetryCount = 3;\r\n this.retryCount = 0;\r\n this.state = {step: 0, createUserInProgress: false};\r\n }\r\n\r\n componentDidMount() {\r\n if (this.containerRef) {\r\n dispatchTelemetryEvent(TelemetryEventMap.genericLoaded, this.containerRef);\r\n }\r\n this.props.usersConnector.fetchMe(true);\r\n this.fetchAndVerifyMeTimerId = setInterval(this.fetchAndVerifyMe.bind(this), 10000);\r\n }\r\n\r\n componentDidUpdate(prevProps: SocialProps) {\r\n if (!prevProps.me && this.props.me) {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n }\r\n\r\n fetchAndVerifyMe() {\r\n if (this.retryCount >= this.maxRetryCount || (this.props.me.nameStatus != enums.userNameStatusType.inReview && this.props.me.avatarStatus != enums.userAvatarStatusType.inReview)) {\r\n clearInterval(this.fetchAndVerifyMeTimerId);\r\n } else {\r\n this.props.usersConnector.fetchMe();\r\n this.retryCount++;\r\n }\r\n }\r\n\r\n editProfileHandler() {\r\n this.props.popupConnector.closePopup();\r\n }\r\n\r\n async continueOnboardingHandler(e) {\r\n this.setState({createUserInProgress: true, createUserErrorMessage: undefined});\r\n try {\r\n await this.props.usersConnector.createUser();\r\n this.setState({step: 1, createUserInProgress: false});\r\n } catch (error) {\r\n if (error.code == 22) {\r\n // Just ignore duplicate user error since me is already filled with the existing user in this case\r\n this.setState({step: 1, createUserInProgress: false});\r\n } else {\r\n this.setState({createUserErrorMessage: this.getCreateUserErrorMessage(error)});\r\n }\r\n }\r\n }\r\n\r\n getCreateUserErrorMessage(error) {\r\n switch (error.code) {\r\n case 0: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 1: return this.props.t.OnboardingErrorNotSignInMsg;\r\n case 2: return this.props.t.OnboardingErrorNotAllowMsg;\r\n case 3: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 4: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 5: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 6: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 7: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 8: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 9: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 10: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 20: return this.props.t.OnboardingErrorNoNameMsg;\r\n case 21: return this.props.t.OnboardingErrorUnknownMsg;\r\n case 23: return this.props.t.OnboardingFailChildMsg;\r\n }\r\n }\r\n\r\n letsGoHandler(e) {\r\n this.props.popupConnector.closePopup({refreshPage: true});\r\n }\r\n\r\n render() {\r\n\r\n const { managedClasses, market, me, t, mainTelemetryObject, contentId, theme, contents } = this.props;\r\n const cmsId = contentId && contents && contents[contentId] && contents[contentId].cmsId;\r\n const { step } = this.state;\r\n\r\n if (!me) { return null; }\r\n\r\n const { primaryAvatar, avatarStatus, ageGroup } = me;\r\n const isChild = ageGroup == enums.userAgeGroup.under18;\r\n\r\n /** Generate Telemetry Objects */\r\n if (mainTelemetryObject) {\r\n const onboardingStep2TelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, onboardingPageTelemetryContracts.step2ThanksPage, {id: cmsId}, this.telemetryObjects && this.telemetryObjects.step2ThanksPage);\r\n const containerTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, onboardingPageTelemetryContracts.onboardingPage, {id: cmsId}, this.telemetryObjects && this.telemetryObjects.main);\r\n this.telemetryObjects = {\r\n main: containerTelemetryObject,\r\n step1Continue: addOrUpdateTelemetryObject(containerTelemetryObject, onboardingPageTelemetryContracts.step1Continue, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.step1Continue),\r\n step1EditProfile: addOrUpdateTelemetryObject(containerTelemetryObject, {...onboardingPageTelemetryContracts.step1EditProfile}, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.step1EditProfile),\r\n step2ThanksPage: onboardingStep2TelemetryObject,\r\n step2LetsGo: addOrUpdateTelemetryObject(onboardingStep2TelemetryObject, onboardingPageTelemetryContracts.step2LetsGo, {id: cmsId}, this.telemetryObjects && this.telemetryObjects.step2LetsGo)\r\n };\r\n }\r\n\r\n if (isChild) {\r\n return (
    { this.containerRef = el; }}>\r\n { avatarFallback(e); }}\r\n />\r\n\r\n

    {t.OnboardingUnderageTitle}

    \r\n

    {t.OnboardingUnderageMsg}

    \r\n\r\n
    \r\n {t.OnboardingCloseWindow} \r\n
    \r\n
    );\r\n }\r\n\r\n return ((step == 0 && this.step0()) || (step == 1 && this.step1()));\r\n }\r\n\r\n step0() {\r\n const { t, managedClasses, me, theme, market} = this.props;\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n const { primaryAvatar, primaryName, nameStatus, avatarStatus, ageGroup} = me;\r\n const hasNotAllowInfo = avatarStatus == enums.userAvatarStatusType.notAllow || nameStatus == enums.userNameStatusType.notAllow;\r\n const hasInReviewInfo = avatarStatus == enums.userAvatarStatusType.inReview || nameStatus == enums.userNameStatusType.inReview;\r\n const isChild = ageGroup == enums.userAgeGroup.under18;\r\n const isNoName = me.name == null || me.name.trim() === \"\";\r\n\r\n const EditButtonWrapperComponent = !hasNotAllowInfo ? OutlineButton : AccentButton;\r\n return (\r\n
    { this.containerRef = el; })}>\r\n
    \r\n \r\n
    \r\n

    {t.OnboardingTitle}

    \r\n

    {t.OnboardingSubTitle}

    \r\n { avatarFallback(e); }}\r\n />\r\n \r\n {primaryName}\r\n \r\n
    \r\n
    \r\n {!hasNotAllowInfo && !hasInReviewInfo && !isChild && !this.state.createUserErrorMessage && {t.OnboardingSuccessMsg}}\r\n {avatarStatus == enums.userAvatarStatusType.inReview && {t.OnboardingReviewImageMsg}}\r\n {nameStatus == enums.userNameStatusType.inReview && {t.OnboardingReviewNameMsg}}\r\n \r\n {this.state.createUserErrorMessage &&\r\n \r\n {exclamation_round}\r\n {this.state.createUserErrorMessage}\r\n \r\n }\r\n \r\n \r\n {avatarStatus == enums.userAvatarStatusType.notAllow &&\r\n \r\n {exclamation_round}\r\n {t.OnboardingFailImageMsg}\r\n \r\n }\r\n \r\n \r\n {nameStatus == enums.userNameStatusType.notAllow &&\r\n \r\n {exclamation_round}\r\n {t.OnboardingFailNameMsg}\r\n \r\n }\r\n \r\n \r\n {isChild &&\r\n \r\n {exclamation_round}\r\n {t.OnboardingFailChildMsg}\r\n \r\n }\r\n \r\n
    \r\n
    \r\n {!isSuperApp && !isChild &&\r\n this.editProfileHandler()}\r\n {...openEditProfilePage(theme, market)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.step1EditProfile, false)}\r\n >\r\n {t.OnboardingEditProfile}\r\n }\r\n {!isChild && !isNoName && this.continueOnboardingHandler(e)} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.step1Continue, false)}> {t.OnboardingContinue} }\r\n {isChild && {t.OnboardingOK} }\r\n
    \r\n {t.OnboardingProceedingGuidelines}),\r\n OnboardingProceedingTermsOfService: renderToString({t.OnboardingProceedingTermsOfService}),\r\n OnboardingProceedingPrivacyAndCookies: renderToString({t.OnboardingProceedingPrivacyAndCookies})\r\n })\r\n }}/>\r\n
    \r\n );\r\n }\r\n\r\n step1() {\r\n const { t, managedClasses, me} = this.props;\r\n const { primaryAvatar, name} = me;\r\n const thanksJoiningTitle = String.Format((t.OnboardingThanksJoiningTitle), {name: name});\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n

    {thanksJoiningTitle}

    \r\n

    {t.OnboardingThanksJoiningSubTitle}

    \r\n\r\n
    \r\n { this.letsGoHandler(e)} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.step2LetsGo, false)}> {t.OnboardingOK} }\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { getContextData } from \"@msnews/core\";\r\nimport { logoImages, msaLogin, addOrUpdateTelemetryObject, dispatchTelemetryEvent, renderHybrid, TelemetryEventMap } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialProps } from \"../Social.props\";\r\nimport { onboardingPageTelemetryContracts, OnboardingThirdPartyPageTelemetryObjects } from \"./OnboardingPage.telemetry\";\r\n\r\nexport default class OnboardingThirdPartyPage extends React.Component {\r\n containerRef: HTMLDivElement;\r\n telemetryObjects: OnboardingThirdPartyPageTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n }\r\n\r\n async signInThirdPartyMsaHandler(e) {\r\n try {\r\n const requestContext = this.props.requestContext;\r\n const locationHref = getContextData(requestContext.data.locationHref, \"locationHref\");\r\n await msaLogin(this.props.email, this.props.market, locationHref.split(\"?\")[0]);\r\n this.props.usersConnector.fetchMe();\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n }\r\n\r\n async createNewMicrosoftAccountHandler(e) {\r\n const requestContext = this.props.requestContext;\r\n const locationHref = getContextData(requestContext.data.locationHref, \"locationHref\");\r\n await msaLogin(null, this.props.market, locationHref.split(\"?\")[0], true);\r\n this.props.usersConnector.fetchMe();\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.props.me.isSocialUser) {\r\n this.props.popupConnector.closePopup();\r\n } else if (this.props.me.name) {\r\n this.props.popupConnector.openPopup(\"onboardingPage\", { contentId: this.props.contentId });\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n if (this.containerRef) {\r\n dispatchTelemetryEvent(TelemetryEventMap.genericLoaded, this.containerRef);\r\n }\r\n }\r\n\r\n render() {\r\n const { managedClasses, email, loginType, t, mainTelemetryObject, contentId, contents } = this.props;\r\n const cmsId = contentId && contents && contents[contentId] && contents[contentId].cmsId;\r\n\r\n /** Generate Telemetry Objects */\r\n if (mainTelemetryObject) {\r\n const containerTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, onboardingPageTelemetryContracts.onboardingThirdPartyPage, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.main);\r\n this.telemetryObjects = {\r\n main: containerTelemetryObject,\r\n onboardingThirdPartyPageSignIn: addOrUpdateTelemetryObject(containerTelemetryObject, onboardingPageTelemetryContracts.onboardingThirdPartyPageSignIn, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.onboardingThirdPartyPageSignIn),\r\n onboardingThirdPartyPageCreateAccount: addOrUpdateTelemetryObject(containerTelemetryObject, onboardingPageTelemetryContracts.onboardingThirdPartyPageCreateAccount, { id: cmsId }, this.telemetryObjects && this.telemetryObjects.onboardingThirdPartyPageCreateAccount)\r\n };\r\n }\r\n\r\n return (\r\n
    { this.containerRef = el; })}>\r\n {t.ImgAltsMicrosoftLogo}/\r\n

    {t.OnboardingThirdPartyTitle}

    \r\n

    \r\n { t.OnboardingThirdPartySubTitle.replace(\"#provider#\", loginType) }\r\n

    \r\n \r\n {email}\r\n \r\n\r\n
    \r\n this.signInThirdPartyMsaHandler(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.onboardingThirdPartyPageSignIn, false)}\r\n > {t.OnboardingThirdPartySignIn} \r\n
    \r\n\r\n \r\n this.createNewMicrosoftAccountHandler(e)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.onboardingThirdPartyPageCreateAccount, false)}\r\n > {t.OnboardingThirdPartyCreate} \r\n \r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { avatarFallback, enums, placeholderImages } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialProps } from \"../Social.props\";\r\n\r\nexport default class OnboardingUnderagePage extends React.Component {\r\n containerRef: React.RefObject;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = React.createRef();\r\n }\r\n\r\n closePopup() {\r\n this.props.popupConnector.closePopup();\r\n }\r\n\r\n render() {\r\n const { managedClasses, me, t } = this.props;\r\n\r\n const { primaryAvatar, avatarStatus } = me;\r\n\r\n return (\r\n
    \r\n { avatarFallback(e); }}\r\n />\r\n\r\n

    {t.OnboardingUnderageTitle}

    \r\n

    {t.OnboardingUnderageMsg}

    \r\n\r\n
    \r\n {t.OnboardingCloseWindow} \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nexport interface ProfileManageDataPageTelemetryObjects {\r\n clearData: TelemetryObjectBase;\r\n clearDataConfirmation: TelemetryObjectBase;\r\n step0CancelBtn: TelemetryObjectBase;\r\n step0RemoveDataBtn: TelemetryObjectBase;\r\n step1YesRemoveDataBtn: TelemetryObjectBase;\r\n step1CancelDataBtn: TelemetryObjectBase;\r\n\r\n}\r\n\r\nexport const profileManageDataPageTelemetryContracts = {\r\n /** Profile Privacy > Scenario 3a */\r\n clearData: {\r\n name: \"ClearMyData\",\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n /** Profile Privacy > Scenario 3c */\r\n clearDataConfirmation: {\r\n name: \"ClearDataConfirmation\",\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n /** Profile Privacy > Scenario 3b cancel\r\n * id: traceId\r\n */\r\n step0CancelBtn: {\r\n name: \"Cancel\",\r\n behavior: TelemetryBehaviorType.Cancel,\r\n content: {\r\n headline: \"Cancel\",\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n /** Profile Privacy > Scenario 3b removedata\r\n * id: traceId\r\n */\r\n step0RemoveDataBtn: {\r\n name: \"RemoveData\",\r\n behavior: TelemetryBehaviorType.Cancel,\r\n content: {\r\n headline: \"Remove Data\",\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n /** Profile Privacy > Scenario 3d user clicks yes remove data\r\n * id: traceId\r\n */\r\n step1YesRemoveDataBtn: {\r\n name: \"RemoveDataConfirmation\",\r\n behavior: TelemetryBehaviorType.Cancel,\r\n content: {\r\n headline: \"Yes Remove It\",\r\n type: TelemetryContentType.Profile\r\n }\r\n },\r\n /** Profile Privacy > Scenario 3d user clicks cancel\r\n * id: traceId\r\n*/\r\n step1CancelDataBtn: {\r\n name: \"Cancel\",\r\n behavior: TelemetryBehaviorType.Cancel,\r\n content: {\r\n headline: \"Cancel\",\r\n type: TelemetryContentType.Profile\r\n }\r\n }\r\n\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { check, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport React from \"react\";\r\nimport { SocialProps } from \"../../Social.props\";\r\nimport { profileManageDataPageTelemetryContracts, ProfileManageDataPageTelemetryObjects } from \"./ProfileManagaDataPage.telemetry\";\r\n\r\nenum DataType {\r\n activity = \"activity\",\r\n comment = \"comment\",\r\n reaction = \"reaction\",\r\n follow = \"follow\"\r\n}\r\n\r\ninterface ProfileManageDataPageState {\r\n deletingData: {\r\n activity: boolean;\r\n comment: boolean;\r\n reaction: boolean;\r\n follow: boolean;\r\n };\r\n step: number;\r\n}\r\n\r\nexport default class ProfileManageDataPage extends React.Component {\r\n telemetryObjects: ProfileManageDataPageTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n deletingData: {\r\n activity: true,\r\n comment: true,\r\n reaction: true,\r\n follow: true\r\n },\r\n step: 0\r\n };\r\n }\r\n\r\n toggleCheckState(stateKey: string) {\r\n this.setState({ deletingData: { ...this.state.deletingData, [stateKey]: !this.state.deletingData[stateKey] } });\r\n }\r\n\r\n submitClearData() {\r\n this.props.profileConnector.deleteMyData(this.state.deletingData);\r\n this.closePopup();\r\n }\r\n\r\n removeDataClickHandler(e) {\r\n this.setState({ step: 1});\r\n }\r\n\r\n cancelClickHandler(e) {\r\n this.closePopup();\r\n }\r\n\r\n closePopup() {\r\n this.props.popupConnector.closePopup();\r\n }\r\n\r\n render() {\r\n const { mainTelemetryObject, me} = this.props;\r\n const { step } = this.state;\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n clearData: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.clearData, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.clearData),\r\n clearDataConfirmation: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.clearDataConfirmation, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.clearDataConfirmation),\r\n step0CancelBtn: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.step0CancelBtn, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.step0CancelBtn),\r\n step0RemoveDataBtn: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.step0RemoveDataBtn, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.step0RemoveDataBtn),\r\n step1YesRemoveDataBtn: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.step1YesRemoveDataBtn, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.step1YesRemoveDataBtn),\r\n step1CancelDataBtn: addOrUpdateTelemetryObject(mainTelemetryObject, profileManageDataPageTelemetryContracts.step1CancelDataBtn, { id: me.traceId }, this.telemetryObjects && this.telemetryObjects.step1CancelDataBtn)\r\n\r\n };\r\n\r\n return ((step == 0 && this.step0()) || (step == 1 && this.step1()));\r\n }\r\n\r\n step0() {\r\n const { t, managedClasses} = this.props;\r\n const { activity: activityChecked, comment: commentsChecked, reaction: reactionsChecked, follow: followChecked } = this.state.deletingData;\r\n const uncheckedOptions = !activityChecked && !commentsChecked && !reactionsChecked && !followChecked;\r\n\r\n return (\r\n
    \r\n
    \r\n

    {t.ProfileManageDataDeleteProfileTxt}

    \r\n

    {t.ProfileManageDataDeleteProfileSubTxt}

    \r\n
    \r\n
    \r\n
      \r\n
    • \r\n
      \r\n {activityChecked && {check} }\r\n
      \r\n
      \r\n {t.ProfileManageDataDeleteMyActivityTitle}\r\n

      {t.ProfileManageDataDeleteMyActivityTxt}

      \r\n
      \r\n
    • \r\n
    • \r\n
      \r\n {commentsChecked && {check} }\r\n
      \r\n
      \r\n {t.ProfileManageDataDeleteMyCommentsTitle}\r\n

      \r\n {t.ProfileManageDataDeleteMyCommentsTxt}\r\n

      \r\n
      \r\n
    • \r\n
    • \r\n
      \r\n {reactionsChecked && {check} }\r\n
      \r\n
      \r\n {t.ProfileManageDataDeleteMyReactionsTitle}\r\n

      \r\n {t.ProfileManageDataDeleteMyReactionsTxt}\r\n

      \r\n
      \r\n
    • \r\n
    • \r\n
      \r\n {followChecked && {check} }\r\n
      \r\n
      \r\n {t.ProfileManageDataDeleteMyFollowersTitle}\r\n

      \r\n {t.ProfileManageDataDeleteMyFollowersTxt}\r\n

      \r\n
      \r\n
    • \r\n
    \r\n

    {t.DeleteDataFromCommunity}

    \r\n
    \r\n {t.DeleteDataCancel} \r\n {t.DeleteDataRemoveData}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n step1() {\r\n const {managedClasses, t} = this.props;\r\n return (\r\n
    \r\n
    \r\n

    {t.DeleteDataConfirmationQuestion}

    \r\n
    \r\n\r\n

    {t.ProfileManageDataDeleteDataMsg}

    \r\n\r\n
    \r\n {t.DeleteDataDeleteProfileCancel} \r\n {t.DeleteDataDeleteConfirm}\r\n
    \r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryActionType, TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nexport interface PublisherSubscribeFollowButtonTelemetryObjects {\r\n publisherSubscribeFollowButton: TelemetryObjectBase;\r\n publisherSubscribeFollowingButton: TelemetryObjectBase,\r\n publisherSubscribeSubscribedButton: TelemetryObjectBase;\r\n viewProfileLink: TelemetryObjectBase;\r\n}\r\n\r\nexport const publisherSubscribeFollowButtonTelemetryContracts = {\r\n publisherSubscribeFollowButton: {\r\n name: \"FollowButton\",\r\n behavior: TelemetryBehaviorType.Undefined,\r\n action: TelemetryActionType.Click,\r\n content: {\r\n headline: \"FollowButton\",\r\n type: TelemetryContentType.Article\r\n }\r\n },\r\n publisherSubscribeFollowingButton: {\r\n name: \"FollowingButton\",\r\n behavior: TelemetryBehaviorType.Undefined,\r\n action: TelemetryActionType.Click,\r\n content: {\r\n headline: \"FollowingButton\",\r\n type: TelemetryContentType.Article\r\n }\r\n },\r\n publisherSubscribeSubscribedButton: {\r\n name: \"Subscribed\",\r\n behavior: TelemetryBehaviorType.Undefined,\r\n action: TelemetryActionType.Click,\r\n content: {\r\n headline: \"Subscribed\",\r\n type: TelemetryContentType.Article\r\n }\r\n },\r\n viewProfileLink: {\r\n name: \"ViewProfile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n action: TelemetryActionType.Click,\r\n content: {\r\n headline: \"ViewProfile\",\r\n type: TelemetryContentType.Article\r\n }\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Direction, classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { PublisherSubscribeFollowButtonTelemetryObjects, publisherSubscribeFollowButtonTelemetryContracts } from \"./PublisherSubscribeFollowButton.telemetry\";\r\nimport { addOrUpdateTelemetryObject, check_circled, enums, getExternalURL, plus, publisherTabPremium, renderHybrid, shouldUseMoreFromPublisherFollowApi } from \"@msnews/social-utils\";\r\n\r\nimport React from \"react\";\r\nimport { SocialClassNameContract } from \"../Social.classnames\";\r\nimport { SocialProps } from \"../Social.props\";\r\nimport { hasPremiumSubscription } from \"../utils/subscriptionHelpers\";\r\nimport { initializeSubscriptionSdk } from \"@msnews/subscription-sdk-wrapper\";\r\n\r\nexport enum SubscribeButtonStateEnum {\r\n Following = \"Following\",\r\n Follow = \"Follow\",\r\n Subscribed = \"Subscribed\"\r\n}\r\n\r\nexport interface PublisherSubscribeFollowButtonState {\r\n isSubscribed: Boolean,\r\n isFollowing: boolean // used for \"more-from publisher follow API\"\r\n}\r\n\r\nconst businessInsiderPublisherId = \"AA28VO\";\r\n\r\nexport default class PublisherSubscribeFollowButton extends React.Component {\r\n buttonConfig: {[key in SubscribeButtonStateEnum]: {text: string, icon: JSX.Element, managedClassName: keyof SocialClassNameContract}} = {\r\n [SubscribeButtonStateEnum.Follow]: {\r\n text: this.props.t.FollowButtonFollowText,\r\n icon: plus,\r\n managedClassName: \"publisherSubscribeFollowButtonInactive\"\r\n },\r\n [SubscribeButtonStateEnum.Following]: {\r\n text: this.props.t.FollowButtonFollowingText,\r\n icon: check_circled,\r\n managedClassName: \"publisherSubscribeFollowButtonActive\"\r\n },\r\n [SubscribeButtonStateEnum.Subscribed]: {\r\n text: this.props.t.PublisherProfilePageSubscribed,\r\n icon: publisherTabPremium,\r\n managedClassName: \"publisherSubscribeFollowButtonActive\"\r\n }\r\n };\r\n\r\n private subscriptionAndFollowChecked: boolean;\r\n private selfRef: React.RefObject;\r\n private shouldUseMoreFromPublisherFollowApi: boolean;\r\n\r\n telemetryObjects: PublisherSubscribeFollowButtonTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.selfRef = React.createRef();\r\n this.state = {\r\n isSubscribed: false,\r\n isFollowing: undefined\r\n };\r\n this.telemetryObjects = null;\r\n }\r\n\r\n componentDidMount() {\r\n initializeSubscriptionSdk();\r\n const { me, publisherSubscribeFollowButtonData } = this.props;\r\n if (!me) {\r\n this.props.usersConnector.fetchMe();\r\n } else if (publisherSubscribeFollowButtonData) {\r\n this.checkSubscriptionAndFollowStatus();\r\n }\r\n\r\n window.addEventListener(\"resize\", this.alignSelf.bind(this));\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n const { me, publisherSubscribeFollowButtonData } = this.props;\r\n if (!this.subscriptionAndFollowChecked && me && publisherSubscribeFollowButtonData) {\r\n if (publisherSubscribeFollowButtonData) {\r\n this.checkSubscriptionAndFollowStatus();\r\n }\r\n }\r\n this.alignSelf();\r\n }\r\n\r\n async checkSubscriptionAndFollowStatus() {\r\n this.subscriptionAndFollowChecked = true;\r\n const { me, publisherSubscribeFollowButtonData } = this.props;\r\n const { fetchUser, fetchIsUserFollowed } = this.props.usersConnector;\r\n const { publisherId, publisherProfileId } = publisherSubscribeFollowButtonData;\r\n this.shouldUseMoreFromPublisherFollowApi = shouldUseMoreFromPublisherFollowApi(publisherId);\r\n\r\n if (this.shouldUseMoreFromPublisherFollowApi) {\r\n this.props.publisherSubscribeFollowButtonConnector.initializePublisherServiceClient();\r\n this.updateFollowStatusFromMoreFromApi();\r\n } else {\r\n fetchUser(publisherProfileId)\r\n .then(() => {\r\n fetchIsUserFollowed(publisherProfileId);\r\n });\r\n }\r\n\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n if (!isAnonymous) {\r\n hasPremiumSubscription(me, publisherProfileId).then(result => {\r\n this.setState(() => ({ isSubscribed: result }));\r\n });\r\n }\r\n\r\n }\r\n\r\n alignSelf() {\r\n // Aligns itself over web-component ViewsTitle in ViewsHeader (in views app-type, article-page experience)\r\n const container = document.querySelector(\"div[class*=viewsHeaderInfoLeft]\");\r\n const titleWebComponent = document.getElementsByTagName(\"msnews-views-title\")[0];\r\n\r\n if (!container || !titleWebComponent || !this.selfRef || !this.selfRef.current) { return; }\r\n\r\n const publisher = titleWebComponent.shadowRoot.querySelector(\".providerInfoWrapper > a\");\r\n\r\n const containerRect = container.getBoundingClientRect();\r\n const publisherRect = publisher.getBoundingClientRect();\r\n const titleWebComponentRect = titleWebComponent.getBoundingClientRect();\r\n\r\n if (document.dir === Direction.ltr) {\r\n const containerEnd = containerRect.x + containerRect.width;\r\n const publisherEnd = publisherRect.x + publisherRect.width;\r\n const margin = containerRect.width - (containerEnd - publisherEnd);\r\n this.selfRef.current.style.marginRight = \"0px\";\r\n this.selfRef.current.style.marginLeft = `${margin + 5}px`;\r\n } else {\r\n const containerEnd = containerRect.x + containerRect.width;\r\n const margin = (containerEnd - publisherRect.x);\r\n this.selfRef.current.style.marginLeft = \"0px\";\r\n this.selfRef.current.style.marginRight = `${margin + 5}px`;\r\n }\r\n this.selfRef.current.style.bottom = `${titleWebComponentRect.height - 12}px`;\r\n }\r\n\r\n render() {\r\n const { managedClasses, t, publisherSubscribeFollowButtonData, market } = this.props;\r\n const currentState = this.getCurrentState();\r\n\r\n if (!publisherSubscribeFollowButtonData || !currentState) { return null; }\r\n\r\n const config = this.getButtonConfig(currentState);\r\n const { publisherProfileId, publisherId } = publisherSubscribeFollowButtonData;\r\n const publisherPageUrl = getExternalURL(`${enums.externalUrls.channelPage}${publisherProfileId}`, market);\r\n const isBusinessInsider = publisherId === businessInsiderPublisherId;\r\n\r\n return (\r\n
    \r\n this.onButtonClick(e)}\r\n {...this.renderTelemetryTag(this.telemetryObjects)}\r\n >\r\n { config.icon } \r\n { config.text }\r\n \r\n { isBusinessInsider &&\r\n \r\n {t.PublisherSubscribeFollowButtonViewProfileText}\r\n \r\n }\r\n
    \r\n );\r\n }\r\n\r\n onButtonClick(e) {\r\n const currentState = this.getCurrentState();\r\n if (currentState == SubscribeButtonStateEnum.Subscribed) {\r\n this.redirectToPublisherProfile();\r\n } else if (currentState == SubscribeButtonStateEnum.Following) {\r\n this.unfollowPublisher();\r\n } else {\r\n this.followPublisher();\r\n }\r\n }\r\n\r\n redirectToPublisherProfile() {\r\n const { publisherSubscribeFollowButtonData: { publisherProfileId }, market } = this.props;\r\n window.open(getExternalURL(`${enums.externalUrls.channelPage}${publisherProfileId}`, market));\r\n }\r\n\r\n async updateFollowStatusFromMoreFromApi() {\r\n const { publisherId } = this.props.publisherSubscribeFollowButtonData;\r\n const isFollowing = await this.props.publisherSubscribeFollowButtonConnector.getPublisherIsFollowing(publisherId);\r\n this.setState(() => ({ isFollowing }));\r\n }\r\n\r\n followPublisher() {\r\n const { me, publisherSubscribeFollowButtonData: { publisherProfileId, publisherId } } = this.props;\r\n\r\n if (this.shouldUseMoreFromPublisherFollowApi) {\r\n this.props.publisherSubscribeFollowButtonConnector.followPublisher(publisherId, true).then(\r\n () => this.updateFollowStatusFromMoreFromApi()\r\n );\r\n return;\r\n }\r\n\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n if (isAnonymous) {\r\n this.signIn();\r\n } else {\r\n this.props.usersConnector.followUser(publisherProfileId, true);\r\n }\r\n }\r\n\r\n unfollowPublisher() {\r\n const { publisherSubscribeFollowButtonData: { publisherProfileId, publisherId } } = this.props;\r\n\r\n if (this.shouldUseMoreFromPublisherFollowApi) {\r\n this.props.publisherSubscribeFollowButtonConnector.followPublisher(publisherId, false).then(\r\n () => this.updateFollowStatusFromMoreFromApi()\r\n );\r\n } else {\r\n this.props.usersConnector.followUser(publisherProfileId, false);\r\n }\r\n }\r\n\r\n getCurrentState() {\r\n const { me, publisherSubscribeFollowButtonData, users } = this.props;\r\n const publisherProfileId = publisherSubscribeFollowButtonData?.publisherProfileId;\r\n\r\n let isFollowing: boolean;\r\n if (this.shouldUseMoreFromPublisherFollowApi) {\r\n if (this.state.isFollowing == undefined) {\r\n return null;\r\n }\r\n isFollowing = this.state.isFollowing;\r\n } else {\r\n if (!publisherSubscribeFollowButtonData || !publisherProfileId || !users || !users[publisherProfileId] || !users[publisherProfileId].isFollowingFetched) {\r\n return null;\r\n }\r\n\r\n const isAnonymous = me && me.state == enums.userStateType.anonymous;\r\n if (isAnonymous) {\r\n return SubscribeButtonStateEnum.Follow;\r\n }\r\n\r\n isFollowing = users[publisherProfileId].data?.isFollowing;\r\n }\r\n\r\n if (this.state.isSubscribed) {\r\n return SubscribeButtonStateEnum.Subscribed;\r\n } else {\r\n return isFollowing ? SubscribeButtonStateEnum.Following : SubscribeButtonStateEnum.Follow;\r\n }\r\n }\r\n\r\n getButtonConfig(state: SubscribeButtonStateEnum) {\r\n return this.buttonConfig[state];\r\n }\r\n\r\n signIn() {\r\n this.props.popupConnector.openPopup(\"multiLoginPage\");\r\n }\r\n\r\n renderTelemetryTag(telemetryObject) {\r\n\r\n const { publisherSubscribeFollowButtonData, mainTelemetryObject } = this.props;\r\n const { isSubscribed } = this.state;\r\n const isFollowing = this.getCurrentState() == SubscribeButtonStateEnum.Following;\r\n const id = publisherSubscribeFollowButtonData.publisherId;\r\n\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n publisherSubscribeFollowButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...publisherSubscribeFollowButtonTelemetryContracts.publisherSubscribeFollowButton}, { id }, this.telemetryObjects && this.telemetryObjects.publisherSubscribeFollowButton),\r\n publisherSubscribeFollowingButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...publisherSubscribeFollowButtonTelemetryContracts.publisherSubscribeFollowingButton}, { id }, this.telemetryObjects && this.telemetryObjects.publisherSubscribeFollowingButton),\r\n publisherSubscribeSubscribedButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...publisherSubscribeFollowButtonTelemetryContracts.publisherSubscribeSubscribedButton}, { id }, this.telemetryObjects && this.telemetryObjects.publisherSubscribeSubscribedButton),\r\n viewProfileLink: addOrUpdateTelemetryObject(mainTelemetryObject, {...publisherSubscribeFollowButtonTelemetryContracts.viewProfileLink}, { id }, this.telemetryObjects && this.telemetryObjects.viewProfileLink)\r\n };\r\n }\r\n\r\n if (isSubscribed) {\r\n telemetryObject= this.telemetryObjects.publisherSubscribeSubscribedButton;\r\n return {...renderHybrid(this.telemetryObjects && telemetryObject, false)};\r\n } else {\r\n telemetryObject = isFollowing ? this.telemetryObjects.publisherSubscribeFollowingButton : this.telemetryObjects.publisherSubscribeFollowButton;\r\n return {...renderHybrid(this.telemetryObjects && telemetryObject, false)};\r\n }\r\n\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getFlight } from \"./getFlight\";\r\n\r\nconst businessInsiderPublisherId = \"AA28VO\";\r\n\r\nexport function shouldUseMoreFromPublisherFollowApi (publisherId: string) {\r\n if (getFlight(\"prg-publv1\") && publisherId === businessInsiderPublisherId) {\r\n return false;\r\n }\r\n return true;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryEventNames, dispatchTelemetryEvent, genericTelemetryClickDispatcher, getPageContentType } from \"@msnews/social-utils\";\r\n\r\nexport interface ReactionBreakdownTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n tabs: { [tabKey: string]: TelemetryObjectBase };\r\n}\r\n\r\nexport interface ReactionBreakdownListItemTelemetryObjects {\r\n container: TelemetryObjectBase;\r\n userName: TelemetryObjectBase;\r\n profilePicture: TelemetryObjectBase;\r\n}\r\n\r\nexport const reactionBreakdownTelemetryContracts = {\r\n /** Profile Followers > Scenario 1a */\r\n commentReactionBreakdown: {\r\n name: \"CommentReactionsOverlay\",\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n /** Profile Following > Scenario 1a */\r\n contentReactionBreakdown: {\r\n name: \"ReactionsOverlay\",\r\n content: { type: getPageContentType() }\r\n },\r\n /** Click Tab, Profile Comments > Scenario 4b */\r\n tab: {\r\n name: \"ReactionsButton\",\r\n behavior: TelemetryBehaviorType.Show,\r\n content: { type: getPageContentType() }\r\n }\r\n};\r\n\r\nexport const reactionBreakdownListItemTelemetryContracts = {\r\n userNameAndProfilePic: {\r\n name: \"Profile\",\r\n behavior: TelemetryBehaviorType.Navigate,\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n }\r\n};\r\n\r\nexport const reactionBreakdownTelemetryActionDispatchers = {\r\n /** Used for: Scenario 3a and Scenario 4a */\r\n tabClicked: (element: any, telemetryObject: TelemetryObjectBase): void => {\r\n const telemetryEventDispatcherInfo = {\r\n eventName: TelemetryEventNames.genericAction,\r\n contract: {...(telemetryObject && telemetryObject.contract)}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element);\r\n },\r\n genericClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryActionType, TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport { TelemetryEventNames, dispatchTelemetryEvent } from \"@msnews/social-utils\";\r\n\r\nexport interface FollowButtonTelemetryObjects {\r\n followButton: TelemetryObjectBase;\r\n}\r\n\r\nexport const followButtonTelemetryContracts = {\r\n followButton: {\r\n name: \"FollowButton\",\r\n content: {\r\n type: TelemetryContentType.Profile\r\n }\r\n }\r\n};\r\n\r\nexport const followButtonTelemetryActionDispatchers = {\r\n followButton: (element: any, isFollow: boolean, telemetryObject: TelemetryObjectBase): void => {\r\n const telemetryEventDispatcherInfo = {\r\n eventName: TelemetryEventNames.genericAction,\r\n contract: telemetryObject.contract,\r\n subTypes: {action: TelemetryActionType.Click, behavior: isFollow ? TelemetryBehaviorType.Follow : TelemetryBehaviorType.Unfollow}\r\n };\r\n\r\n dispatchTelemetryEvent(telemetryEventDispatcherInfo, element, null);\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccentButton, OutlineButton } from \"@microsoft/fast-components-react-msft\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { User } from \"@msnews/social-data-service\";\r\nimport { enums, hasThemeBase, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { SocialClassNameContract } from \"../Social.classnames\";\r\nimport { SocialLocalizedStrings } from \"../Social.localizedStrings\";\r\nimport { FollowInfo, UsersConnector } from \"../Social.props\";\r\nimport { SocialState } from \"../Social.state\";\r\nimport { followButtonTelemetryActionDispatchers, followButtonTelemetryContracts, FollowButtonTelemetryObjects } from \"./FollowButton.telemetry\";\r\n\r\nexport interface FollowButtonProps {\r\n me: User,\r\n userId: string,\r\n users: { [id: string]: FollowInfo;}, // dictionary definening\r\n managedClasses: SocialClassNameContract,\r\n usersConnector: UsersConnector,\r\n onClick?: (e, userid: string, isFollow: boolean) => void,\r\n mainTelemetryObject?: TelemetryObjectBase\r\n t: SocialLocalizedStrings\r\n theme: string\r\n}\r\n\r\nconst mapStateToProps = function(state: SocialState) {\r\n return {\r\n me: state.me,\r\n users: state.users,\r\n theme: state.theme\r\n };\r\n};\r\n\r\nexport class FollowButton extends React.Component {\r\n telemetryObjects: FollowButtonTelemetryObjects;\r\n\r\n componentDidMount() {\r\n if (!(this.props.users && this.props.users[this.props.userId])) {\r\n const fetchUser = this.props.usersConnector.fetchUser;\r\n const fetchIsUserFollowed = this.props.usersConnector.fetchIsUserFollowed;\r\n if (!fetchUser || !fetchIsUserFollowed) { return console.warn(\"Missing props 'usersConnector.fetchUser' or 'userConnector.fetchIsUserFollowed'\"); }\r\n fetchUser(this.props.userId)\r\n .then(_ => {\r\n fetchIsUserFollowed(this.props.userId);\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const {me, users, userId, managedClasses, mainTelemetryObject, t, theme} = this.props;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n\r\n const user = users[userId] ? users[userId].data : null;\r\n if (!user) { return null; }\r\n const {isFollowing, isPrivateProfile, traceId} = user;\r\n const isSelf = me && me.id == userId;\r\n const isAnonymous = user.state == enums.userStateType.anonymous;\r\n\r\n /** Generate Telemetry Objects */\r\n if (mainTelemetryObject) {\r\n this.telemetryObjects = {\r\n followButton: addOrUpdateTelemetryObject(mainTelemetryObject, {...followButtonTelemetryContracts.followButton}, { id: traceId, headline: !isFollowing ? \"Follow\" : \"Unfollow\"}, this.telemetryObjects && this.telemetryObjects.followButton)\r\n };\r\n }\r\n\r\n const FollowButtonWrapperComponent = isFollowing ? OutlineButton :AccentButton;\r\n\r\n return (\r\n \r\n {!isSelf && !isPrivateProfile && !isAnonymous &&\r\n this.toggleFollow(e, userId, isFollowing)}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.followButton, false)}\r\n >\r\n {isFollowing ? t.FollowButtonFollowingText :t.FollowButtonFollowText}\r\n }\r\n \r\n );\r\n }\r\n\r\n toggleFollow(e, userId, isFollowing) {\r\n if (this.props.onClick) { this.props.onClick(e, userId, !isFollowing); }\r\n e.stopPropagation();\r\n\r\n this.props.usersConnector.followUser(userId, !isFollowing);\r\n followButtonTelemetryActionDispatchers.followButton(e.currentTarget, !isFollowing, this.telemetryObjects.followButton);\r\n }\r\n}\r\n\r\nexport default connect(mapStateToProps)(FollowButton);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { User } from \"@msnews/social-data-service\";\r\nimport { avatarFallback, openProfilePage, placeholderImages, renderEmojiByType, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport FollowButton from \"../follow-button/FollowButton\";\r\nimport { SocialLocalizedStrings } from \"../Social.localizedStrings\";\r\nimport { ComponentConnector } from \"../Social.props\";\r\nimport { reactionBreakdownListItemTelemetryContracts, ReactionBreakdownListItemTelemetryObjects } from \"./ReactionBreakdown.telemetry\";\r\n\r\nexport interface ReactionBreakdownListItemProps {\r\n componentConnector: ComponentConnector;\r\n isAnonymous: boolean,\r\n user: User,\r\n rateValue: string,\r\n managedClasses,\r\n usersConnector,\r\n market,\r\n onFollow?: (e: any, userId: string, isFollow: boolean) => void,\r\n onLoad?: (target: any, userId: string) => void,\r\n mainTelemetryObject?: TelemetryObjectBase,\r\n t: SocialLocalizedStrings,\r\n theme: string\r\n}\r\n\r\nexport default class ReactionBreakdownListItem extends React.Component {\r\n containerRef: HTMLLIElement;\r\n isLoaded: boolean;\r\n telemetryObjects: ReactionBreakdownListItemTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.containerRef = null;\r\n this.isLoaded = false;\r\n }\r\n\r\n followClickHandler(e, userId, isFollow) {\r\n if (this.props.onFollow) { this.props.onFollow(e, userId, isFollow); }\r\n }\r\n\r\n render() {\r\n const {componentConnector, isAnonymous, user, rateValue, managedClasses, usersConnector, market, mainTelemetryObject, t, theme} = this.props;\r\n /** Generate telemetry objects */\r\n const containerTelemetryObject = addOrUpdateTelemetryObject(mainTelemetryObject, mainTelemetryObject.contract, { type: TelemetryContentType.Profile }, this.telemetryObjects && this.telemetryObjects.container);\r\n this.telemetryObjects = {\r\n container: containerTelemetryObject,\r\n userName: addOrUpdateTelemetryObject(containerTelemetryObject, reactionBreakdownListItemTelemetryContracts.userNameAndProfilePic, {id: user.traceId || user.id, headline: user.primaryName }, this.telemetryObjects && this.telemetryObjects.userName),\r\n profilePicture: addOrUpdateTelemetryObject(containerTelemetryObject, reactionBreakdownListItemTelemetryContracts.userNameAndProfilePic, { id: user.traceId || user.id, headline: user.primaryName }, this.telemetryObjects && this.telemetryObjects.profilePicture)\r\n };\r\n\r\n return (\r\n
  • \r\n
    \r\n { this.containerRef = el; })}\r\n >\r\n {t.AriaLabelsProfilePicture}{ avatarFallback(e); }} />\r\n \r\n \r\n {renderEmojiByType(rateValue)}\r\n \r\n {isAnonymous ?\r\n
    {user.primaryName}
    :\r\n
    \r\n { this.containerRef = el; })}\r\n >\r\n {user.primaryName}\r\n \r\n
    \r\n }\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
  • \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ReactionBreakdownTelemetryObjects, reactionBreakdownTelemetryActionDispatchers, reactionBreakdownTelemetryContracts } from \"./ReactionBreakdown.telemetry\";\r\nimport { enums, hasThemeBase, renderEmojiByType, TelemetryEventMap, addOrUpdateTelemetryObject, dispatchTelemetryEvent, renderHybrid } from \"@msnews/social-utils\";\r\n\r\nimport React from \"react\";\r\nimport ReactionBreakdownListItem from \"./ReactionBreakdownListItem\";\r\nimport { SocialProps } from \"../Social.props\";\r\nimport { String } from \"typescript-string-operations\";\r\nimport { capitalize } from \"lodash-es\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\ninterface ReactionBreakdownState {\r\n activeTab: string;\r\n}\r\n\r\nexport default class ReactionBreakdown extends React.Component {\r\n telemetryObjects: ReactionBreakdownTelemetryObjects;\r\n containerRef: HTMLDivElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n activeTab: props.activeTab || \"all\"\r\n };\r\n this.containerRef = null;\r\n }\r\n\r\n componentDidMount() {\r\n if (this.containerRef) {\r\n dispatchTelemetryEvent(TelemetryEventMap.genericLoaded, this.containerRef);\r\n }\r\n this.props.reactionBreakdownConnector.onReactionBreakdownComponentConnected({ commentId: this.props.commentId, contentId: this.props.contentId });\r\n }\r\n\r\n componentDidUpdate(prevProps: SocialProps) {\r\n if (this.props.id != null && this.props.market != null && prevProps.id != this.props.id || prevProps.market != this.props.market) {\r\n this.props.reactionBreakdownConnector.onReactionBreakdownComponentConnected({ commentId: this.props.commentId, contentId: this.props.contentId });\r\n }\r\n\r\n if (!prevProps.reactionBreakdown?.reactions && this.props.reactionBreakdown?.reactions) {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.reactionBreakdownConnector.onReactionBreakdownComponentDisconnected();\r\n }\r\n\r\n showTab(event, tabName) {\r\n this.sendTabClickedTelemetry(event.currentTarget, tabName);\r\n\r\n this.setState({\r\n activeTab: tabName\r\n });\r\n }\r\n\r\n prepareActiveTabItems(args) {\r\n if (!args.items || !args.activeTab || !args.users) { console.warn(\"ReactionBreakdown missing argument!\"); }\r\n const meId = args.me.id;\r\n\r\n const attachUserDataToItem = (item, userId) => {\r\n const userState = args.users[userId];\r\n return {...item, user: userState.data};\r\n };\r\n\r\n if (!args.breakdownWithTabs) {\r\n // self id is `meId` if the user is logged in, `undefined` if the user is anonymous\r\n const itemOfSelf = args.items.all.find(item => item.userId === meId || item.userId === undefined);\r\n const selfId = itemOfSelf && itemOfSelf.userId;\r\n return itemOfSelf ? [attachUserDataToItem(itemOfSelf, selfId)] : [];\r\n }\r\n\r\n return args.items[args.activeTab]\r\n .sort((a, b) => {\r\n if (a.userId == meId) {\r\n return -1;\r\n } else if (b.userId == meId) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n })\r\n .map(item => attachUserDataToItem(item, item.userId));\r\n }\r\n\r\n sendTabClickedTelemetry(target, tabName) {\r\n reactionBreakdownTelemetryActionDispatchers.tabClicked(target, this.telemetryObjects && this.telemetryObjects.tabs && this.telemetryObjects.tabs[tabName]);\r\n }\r\n\r\n getOtherReactionsString(reaction: string, otherCount: number) {\r\n if (otherCount < 1) {\r\n console.warn(`There is no reaction string for this reaction count: ${otherCount}`);\r\n return \"\";\r\n }\r\n const t = this.props.t;\r\n // {reaction: [, ]}\r\n const reactionStrings = {\r\n [enums.reactions.love]: [t.ReactionBreakDownOneOtherLoves, t.ReactionBreakDownSomeOthersLove],\r\n [enums.reactions.like]: [t.ReactionBreakDownOneOtherLikes, t.ReactionBreakDownSomeOthersLike],\r\n [enums.reactions.surprised]: [t.ReactionBreakDownOneOtherIsSurprised, t.ReactionBreakDownSomeOthersAreSurprised],\r\n [enums.reactions.angry]: [t.ReactionBreakDownOneOtherIsAngry, t.ReactionBreakDownSomeOthersAreAngry],\r\n [enums.reactions.sad]: [t.ReactionBreakDownOneOtherIsSad, t.ReactionBreakDownSomeOthersAreSad],\r\n [enums.reactions.thinking]: [t.ReactionBreakDownOneOtherIsThinking, t.ReactionBreakDownSomeOthersAreThinking]\r\n };\r\n return otherCount === 1 ? reactionStrings[reaction][0] : String.Format(reactionStrings[reaction][1], {otherCount: otherCount});\r\n }\r\n\r\n render() {\r\n const { componentConnector, reactionBreakdown, me, users, managedClasses, usersConnector, market, responsiveClass, t, mainTelemetryObject, theme, contentId, contents, commentId} = this.props;\r\n const isSuperApp = hasThemeBase(theme, enums.theme.superappBase);\r\n const isContentModerated = contentId && contents && contents[contentId] && contents[contentId].commentStatus === \"On\";\r\n const breakdownWithTabs: boolean = !!commentId || isContentModerated;\r\n const reactions = reactionBreakdown && reactionBreakdown.reactions;\r\n if (!reactions || !me) { return null; }\r\n const {items, reactionCounts} = reactions;\r\n const {activeTab} = this.state;\r\n const activeTabItems = this.prepareActiveTabItems({items, users, activeTab, me, breakdownWithTabs});\r\n // Reaction Counts\r\n const moreCounts: {[key: string]: number} = {};\r\n reactionCounts.all = 0;\r\n if (reactionCounts) {\r\n reactionCounts.all = Object.values(reactionCounts).reduce(($sum, $count) => $sum + $count, 0);\r\n\r\n Object.keys(reactionCounts).filter(key => key !== \"all\").forEach(key => {\r\n if (breakdownWithTabs) {\r\n moreCounts[key] = reactionCounts[key] - items[key].length;\r\n } else {\r\n const selfReacted = activeTabItems.length === 1;\r\n const reactionType = selfReacted && activeTabItems[0].rateValue;\r\n moreCounts[key] = (reactionType === key) ? reactionCounts[key]-1 : reactionCounts[key];\r\n }\r\n });\r\n }\r\n\r\n /** Generate Telemetry Objects */\r\n const cmsId = (contentId && contents && contents[contentId] && contents[contentId].cmsId);\r\n this.telemetryObjects = {\r\n container: addOrUpdateTelemetryObject(\r\n mainTelemetryObject,\r\n this.props.commentId ? reactionBreakdownTelemetryContracts.commentReactionBreakdown : reactionBreakdownTelemetryContracts.contentReactionBreakdown,\r\n { id: commentId || cmsId},\r\n this.telemetryObjects && this.telemetryObjects.container\r\n ),\r\n tabs: {}\r\n };\r\n Object.keys(reactionCounts).map(key => {\r\n if (this.telemetryObjects && this.telemetryObjects.container) {\r\n this.telemetryObjects.tabs[key] = addOrUpdateTelemetryObject(\r\n this.telemetryObjects.container,\r\n {...reactionBreakdownTelemetryContracts.tab},\r\n { id: commentId || cmsId, headline: capitalize(key) },\r\n this.telemetryObjects && this.telemetryObjects.tabs && this.telemetryObjects.tabs[key]\r\n );\r\n }\r\n });\r\n\r\n const OtherReactionsItem = ({reaction}) => {\r\n if (!moreCounts[reaction]) { return null; }\r\n return (\r\n
  • \r\n
    \r\n \r\n {renderEmojiByType(reaction)}\r\n \r\n
    {this.getOtherReactionsString(reaction, moreCounts[reaction])}
    \r\n
    \r\n
  • \r\n );\r\n };\r\n\r\n return (\r\n \r\n
    \r\n
    \r\n

    {t.ReactionBreakDownTitle}

    \r\n
      \r\n
    • this.showTab(e, \"all\")}\r\n {...renderHybrid(this.telemetryObjects && this.telemetryObjects.tabs && this.telemetryObjects.tabs[\"all\"], true)}>\r\n \r\n
      {t.ReactionBreakDownTabText}
      \r\n {reactionCounts.all}\r\n
      \r\n
    • \r\n\r\n {\r\n breakdownWithTabs && Object.keys(reactionCounts).filter(key => key != \"all\").map(key =>\r\n reactionCounts[key] > 0 &&\r\n
    • this.showTab(e, key)} key={key}>\r\n \r\n {renderEmojiByType(key)}\r\n {reactionCounts[key]}\r\n \r\n
    • \r\n )\r\n }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
      \r\n {activeTabItems.map((item, index) => {\r\n const isAnonymous = item.user.state == enums.userStateType.anonymous;\r\n return ;\r\n })}\r\n {activeTab === \"all\" ?\r\n Object.entries(moreCounts).sort((t0, t1) => t1[1]-t0[1]).map(tab => ):\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryContentType, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface ReportMenuTelemetryObjects {\r\n reportItems: TelemetryObjectBase[];\r\n reportMenu: TelemetryObjectBase;\r\n}\r\n\r\nexport const reportMenuTelemetryContracts = {\r\n /**\r\n * Comments-Scenario-10b\r\n * headline: dynamically set for each report reason\r\n * */\r\n reportItem: {\r\n name: \"Report\",\r\n behavior: TelemetryBehaviorType.Report,\r\n content: { type: TelemetryContentType.Comment }\r\n },\r\n /** Comments-Scenario-10ai */\r\n reportMenu: {\r\n name: \"ReportedReason\",\r\n content: { type: TelemetryContentType.Comment }\r\n }\r\n};\r\n\r\nexport const reportMenuTelemetryActionDispatchers = {\r\n reportItemClick: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { SocialService, User } from \"@msnews/social-data-service\";\r\nimport { AccessibilityHelpers, enums, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport { SocialClassNameContract } from \"../../Social.classnames\";\r\nimport { SocialLocalizedStrings } from \"../../Social.localizedStrings\";\r\nimport { PopupConnector, UsersConnector } from \"../../Social.props\";\r\nimport { SocialPopover, SocialPopoverProps } from \"@msnews/social-popover\";\r\nimport { reportMenuTelemetryActionDispatchers, reportMenuTelemetryContracts, ReportMenuTelemetryObjects } from \"./ReportMenu.telemetry\";\r\n\r\nexport interface ReportMenuProps extends SocialPopoverProps {\r\n managedClasses?: SocialClassNameContract;\r\n onReport?: (key: string, e: any) => void;\r\n t: SocialLocalizedStrings;\r\n mainTelemetryObject?: TelemetryObjectBase;\r\n theme?: string;\r\n popupConnector?: PopupConnector;\r\n usersConnector?: UsersConnector;\r\n id?: string;\r\n renderInPopover?: boolean;\r\n me?: User;\r\n markTtvr?: () => void;\r\n}\r\n\r\nexport default class ReportMenu extends React.Component {\r\n telemetryObjects: ReportMenuTelemetryObjects;\r\n containerRef: HTMLUListElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.containerRef = null;\r\n }\r\n\r\n componentDidMount() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n\r\n if (!this.props.me) { this.props.usersConnector.fetchMe(); }\r\n }\r\n\r\n componentDidUpdate(prevProps: ReportMenuProps) {\r\n if (!prevProps.me && this.props.me) {\r\n this.props.markTtvr && this.props.markTtvr();\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.props.me) { return null; }\r\n\r\n /** Generate Telemetry Objects */\r\n this.telemetryObjects = {\r\n reportItems: (this.telemetryObjects && this.telemetryObjects.reportItems) || [],\r\n reportMenu: addOrUpdateTelemetryObject(this.props.mainTelemetryObject, reportMenuTelemetryContracts.reportMenu, { id: this.props.id || \"\"}, this.telemetryObjects && this.telemetryObjects.reportMenu)\r\n };\r\n\r\n return this.props.renderInPopover ? this.renderDefault() : this.renderMobile();\r\n }\r\n\r\n renderDefault() {\r\n return (\r\n \r\n
      { this.containerRef = el; })}\r\n >\r\n {this.renderReportItems()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderMobile() {\r\n return (\r\n
      { this.containerRef = el; })}\r\n >\r\n \r\n { this.props.t.CommentReportText }\r\n \r\n {this.renderReportItems()}\r\n
    \r\n );\r\n }\r\n\r\n renderReportItems() {\r\n return Object.keys(enums.commentReportMap).map(key => {\r\n if (this.telemetryObjects.reportItems) {\r\n this.telemetryObjects.reportItems[key] = addOrUpdateTelemetryObject(this.telemetryObjects.reportMenu, {...reportMenuTelemetryContracts.reportItem}, { id: this.props.id, headline: key }, this.telemetryObjects.reportItems[key]);\r\n }\r\n\r\n return
  • this.reportHandler(key, e) } onKeyDown={(e) => { this.handleKeyDown(e); }} {...renderHybrid(this.telemetryObjects && this.telemetryObjects.reportItems && this.telemetryObjects.reportItems[key], false)}>\r\n {this.props.t[enums.commentReportMap[key]]}\r\n
  • ;\r\n });\r\n }\r\n\r\n reportHandler(reportType, e) {\r\n reportMenuTelemetryActionDispatchers.reportItemClick(e.currentTarget, this.telemetryObjects && this.telemetryObjects.reportItems && this.telemetryObjects.reportItems[reportType]);\r\n const reportValue = enums.commentReportMap[reportType];\r\n if (reportValue == enums.commentReportMap.Copyright) {\r\n this.props.popupConnector.closePopup({disableBridge: true});\r\n if (this.props.me.state == enums.userStateType.anonymous) {\r\n this.props.popupConnector.openPopup(\"multiLoginPage\");\r\n } else {\r\n this.props.popupConnector.openPopup(\r\n reportValue == enums.commentReportMap.Copyright ? \"copyrightform\" : \"\",\r\n {id: this.props.id, fullScreen: false, onReport: this.props.onReport});\r\n }\r\n } else {\r\n SocialService.reportComment(this.props.id, reportType);\r\n this.props.onReport && this.props.onReport(reportType, e);\r\n this.props.popupConnector.closePopup();\r\n }\r\n }\r\n\r\n handleKeyDown(e) {\r\n if (e.keyCode == 27) { /* ESC key */\r\n const ref = window.document.getElementById(`reportMenu_${this.props.id}`);\r\n if (ref) {\r\n window.setTimeout(()=> { ref.focus(); }, 50);\r\n }\r\n e.stopPropagation();\r\n e.preventDefault();\r\n } else if (e.keyCode == 38) { /* Up arrow */\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const prev = e.target.previousElementSibling;\r\n if (prev) {\r\n prev.focus();\r\n } else {\r\n e.target.parentElement.lastElementChild.focus();\r\n }\r\n } else if (e.keyCode == 40) { /* Down arrow */\r\n const next = e.target.nextElementSibling;\r\n if (next) {\r\n next.focus();\r\n } else {\r\n e.target.parentElement.firstElementChild.focus();\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AccessibilityHelpers, enums, hasThemeBase, isComponentDisabled, isComponentInModal, preventSelection, addOrUpdateTelemetryObject, renderHybrid } from \"@msnews/social-utils\";\r\n\r\nimport CopyrightForm from \"../copyright-form/CopyrightForm\";\r\nimport GradientOverlay from \"../common/gradient-overlay/GradientOverlay\";\r\nimport { IRequestContext } from \"@msnews/core\";\r\nimport MultiLoginPage from \"../multi-login-page/MultiLoginPage\";\r\nimport NotificationTray from \"../common/notification/NotificationTray\";\r\nimport OnboardingPage from \"../onboarding-page/OnboardingPage\";\r\nimport OnboardingThirdPartyMsaPage from \"../onboarding-page/OnboardingThirdPartyPage\";\r\nimport OnboardingUnderagePage from \"../onboarding-page/OnboardingUnderagePage\";\r\nimport ProfileManageDataPage from \"../profile/profile-manage-data-page/ProfileManageDataPage\";\r\nimport PublisherSubscribeFollowButton from \"../publisher-subscribe-follow-button/PublisherSubscribeFollowButton\";\r\nimport React from \"react\";\r\nimport ReactionBreakdown from \"../reaction-breakdown/ReactionBreakdown\";\r\nimport ReportMenu from \"../common/report-menu/ReportMenu\";\r\nimport { SocialUnhandledProps } from \"../Social.props\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\n\r\nconst usedProps = [\"component\"];\r\n\r\ninterface MainProps extends SocialUnhandledProps {\r\n requestContext: IRequestContext;\r\n}\r\n\r\nexport default class Main extends React.PureComponent {\r\n telemetryObjects: any;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.telemetryObjects = {};\r\n }\r\n\r\n componentDidMount() {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n isSuperApp && this.preventSelectionInSuperapp();\r\n }\r\n\r\n preparePropsToPass(moduleName) {\r\n const propsToPass = {...this.props};\r\n usedProps.map(x => delete propsToPass[x]);\r\n\r\n // Add and pass a container telemetry object matching with the module\r\n const moduleTelemetryContract = { name: moduleName.toUpperCase() };\r\n this.telemetryObjects.module = addOrUpdateTelemetryObject(this.props.mainTelemetryObject, moduleTelemetryContract, {}, this.telemetryObjects.module);\r\n propsToPass.mainTelemetryObject = this.telemetryObjects.module;\r\n\r\n return propsToPass;\r\n }\r\n\r\n switchToComponent(moduleName, id) {\r\n if (!moduleName) { return null; }\r\n const propsToPass = this.preparePropsToPass(moduleName);\r\n moduleName = moduleName.toLowerCase();\r\n\r\n switch (moduleName) {\r\n case \"reactionbreakdowncontent\":\r\n return ;\r\n\r\n case \"reactionbreakdowncomment\":\r\n return ;\r\n\r\n case \"multiloginpage\":\r\n return ;\r\n\r\n case \"onboardingpage\":\r\n return ;\r\n\r\n case \"onboardingthirdpartypage\":\r\n return ;\r\n\r\n case \"onboardingunderagepage\":\r\n return ;\r\n\r\n case \"reportmenu\":\r\n return ;\r\n\r\n case \"copyrightform\":\r\n return ;\r\n\r\n case \"trademarkform\":\r\n return ;\r\n\r\n case \"notificationtray\":\r\n return ;\r\n\r\n case \"managedatapage\":\r\n return ;\r\n\r\n case \"publishersubscribefollowbutton\":\r\n return ;\r\n\r\n case \"gradientoverlay\":\r\n return ;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n componentDidUpdate() {\r\n AccessibilityHelpers.attachAccessibilityListeners(document);\r\n }\r\n\r\n render() {\r\n const isSuperApp = hasThemeBase(this.props.theme, enums.theme.superappBase);\r\n const { mainContainer, mainSuperAppContainer, mainInSuperappModal} = this.props.managedClasses;\r\n const isRenderedInSuperappModal = isComponentInModal(this.props.theme, this.props.moduleName);\r\n const notificationPosition = this.props.commentDisplayType === \"overlay\" ? \"left\" : \"right\";\r\n\r\n const componentToRender = this.switchToComponent(this.props.moduleName, this.props.id);\r\n\r\n return (\r\n \r\n { componentToRender }\r\n { componentToRender != null && !isComponentDisabled(this.props.theme, \"notificationtray\") && }\r\n
    \r\n );\r\n }\r\n\r\n preventSelectionInSuperapp() {\r\n document.addEventListener(\"touchstart\", preventSelection);\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryBehaviorType, TelemetryObjectBase, TelemetryType } from \"@msnews/telemetry-contracts\";\r\n\r\nimport { genericTelemetryClickDispatcher } from \"@msnews/social-utils\";\r\n\r\nexport interface PopupTelemetryObjects {\r\n closeBtn: TelemetryObjectBase;\r\n}\r\n\r\nexport const popupTelemetryContracts = {\r\n closeBtn: {\r\n name: \"CloseDialog\",\r\n behavior: TelemetryBehaviorType.Close,\r\n content: {\r\n headline: \"Close\"\r\n }\r\n }\r\n};\r\n\r\nexport const popupTelemetryActionDispatchers = {\r\n /** Used for: Scenario 3a and Scenario 4a */\r\n genericClicked: genericTelemetryClickDispatcher\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { close, addOrUpdateTelemetryObject, getPageContentType, renderHybrid } from \"@msnews/social-utils\";\r\nimport { TelemetryContentType } from \"@msnews/telemetry-contracts\";\r\nimport React from \"react\";\r\nimport FocusLock from \"react-focus-lock\";\r\nimport Main from \"../main/main\";\r\nimport { SocialLocalizedStrings } from \"../Social.localizedStrings\";\r\nimport { PopupData, SocialProps } from \"../Social.props\";\r\nimport { popupTelemetryActionDispatchers, popupTelemetryContracts, PopupTelemetryObjects } from \"./Popup.telemetry\";\r\n\r\nexport interface PopupProps extends SocialProps {\r\n popup?: PopupData;\r\n hideOverlay?: boolean;\r\n hideButtons?: boolean;\r\n t: SocialLocalizedStrings;\r\n}\r\n\r\nexport default class Popup extends React.PureComponent {\r\n telemetryObjects: PopupTelemetryObjects;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.escFunction = this.escFunction.bind(this);\r\n }\r\n\r\n escFunction(event) {\r\n if (event.keyCode === 27) {\r\n this.closePopup();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"keydown\", this.escFunction);\r\n }\r\n\r\n closePopup() {\r\n if (this.props.popup && this.props.popup.popupProps && this.props.popup.popupProps[\"focusBackRef\"]) {\r\n const ref = this.props.popup.popupProps[\"focusBackRef\"];\r\n window.setTimeout(() => { ref.focus(); }, 50);\r\n }\r\n this.props.popupConnector.closePopup();\r\n }\r\n\r\n closeClickHandler(e) {\r\n popupTelemetryActionDispatchers.genericClicked(e.currentTarget, this.telemetryObjects && this.telemetryObjects.closeBtn);\r\n this.closePopup();\r\n }\r\n\r\n render() {\r\n const { popup, hideOverlay, hideButtons, responsiveClass, t, mainTelemetryObject } = this.props;\r\n if (!popup) { return null; }\r\n\r\n const { moduleName, popupProps } = popup;\r\n if (!moduleName) { return null; }\r\n if (moduleName == \"profilereportmenu\") { return null; }\r\n // Override existing props from popup props\r\n const propsToPass = {...this.props, moduleName, ...popupProps };\r\n\r\n /** Generate Telemetry Objects */\r\n const parentTelemetryObject = popupProps && popupProps[\"parentTelemetryObject\"];\r\n const contentType = parentTelemetryObject && parentTelemetryObject.contract && parentTelemetryObject.contract.content && parentTelemetryObject.contract.content.type == TelemetryContentType.Comment ? TelemetryContentType.Comment : getPageContentType();\r\n this.telemetryObjects = {\r\n closeBtn: addOrUpdateTelemetryObject(mainTelemetryObject, {... popupTelemetryContracts.closeBtn }, {id: parentTelemetryObject && parentTelemetryObject.contract.content.id, type: contentType}, this.telemetryObjects && this.telemetryObjects.closeBtn)\r\n };\r\n\r\n return (\r\n \r\n
    \r\n { !hideOverlay &&\r\n
     
    \r\n }\r\n
    \r\n { !hideButtons &&\r\n
    \r\n {close}\r\n
    \r\n }\r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\nimport CopyrightForm from \"./copyright-form/CopyrightForm\";\r\nimport { FollowButton } from \"./follow-button/FollowButton\";\r\nimport GradientOverlay from \"./common/gradient-overlay/GradientOverlay\";\r\nimport Main from \"./main/main\";\r\nimport MultiLoginPage from \"./multi-login-page/MultiLoginPage\";\r\nimport NotificationCard from \"./common/notification/NotificationCard\";\r\nimport { NotificationTray } from \"./common/notification/NotificationTray\";\r\nimport OnboardingPage from \"./onboarding-page/OnboardingPage\";\r\nimport OnboardingThirdPartyPage from \"./onboarding-page/OnboardingThirdPartyPage\";\r\nimport OnboardingUnderagePage from \"./onboarding-page/OnboardingUnderagePage\";\r\nimport Popup from \"./popup/Popup\";\r\nimport ProfileManageDataPage from \"./profile/profile-manage-data-page/ProfileManageDataPage\";\r\nimport PublisherSubscribeFollowButton from \"./publisher-subscribe-follow-button/PublisherSubscribeFollowButton\";\r\nimport ReactionBreakdown from \"./reaction-breakdown/ReactionBreakdown\";\r\nimport ReactionBreakdownListItem from \"./reaction-breakdown/ReactionBreakdownListItem\";\r\nimport ReportMenu from \"./common/report-menu/ReportMenu\";\r\n\r\nimport {\r\n SocialExperienceRenderErrorCopyrightForm,\r\n SocialExperienceRenderErrorFollowButton,\r\n SocialExperienceRenderErrorGradientOverlay,\r\n SocialExperienceRenderErrorMain,\r\n SocialExperienceRenderErrorMultilineLogin,\r\n SocialExperienceRenderErrorNotificationCard,\r\n SocialExperienceRenderErrorNotificationTray,\r\n SocialExperienceRenderErrorOnbardingThirdParty,\r\n SocialExperienceRenderErrorOnboarding,\r\n SocialExperienceRenderErrorOnboardingUnderagePage,\r\n SocialExperienceRenderErrorPopup,\r\n SocialExperienceRenderErrorProfileManageDataPage,\r\n SocialExperienceRenderErrorPublisherSubscribeFollowButton,\r\n SocialExperienceRenderErrorReactionBreakdown,\r\n SocialExperienceRenderErrorReactionBreakdownListItem,\r\n SocialExperienceRenderErrorReportMenu,\r\n SocialExperienceRenderErrorUnknownComponent\r\n} from \"@msnews/diagnostics\";\r\n\r\nexport const RenderErrors = {\r\n [CopyrightForm.name]: SocialExperienceRenderErrorCopyrightForm,\r\n [FollowButton.name]: SocialExperienceRenderErrorFollowButton,\r\n [GradientOverlay.name]: SocialExperienceRenderErrorGradientOverlay,\r\n [Main.name]: SocialExperienceRenderErrorMain,\r\n [MultiLoginPage.name]: SocialExperienceRenderErrorMultilineLogin,\r\n [NotificationCard.name]: SocialExperienceRenderErrorNotificationCard,\r\n [NotificationTray.name]: SocialExperienceRenderErrorNotificationTray,\r\n [OnboardingThirdPartyPage.name]: SocialExperienceRenderErrorOnbardingThirdParty,\r\n [OnboardingPage.name]: SocialExperienceRenderErrorOnboarding,\r\n [OnboardingUnderagePage.name]: SocialExperienceRenderErrorOnboardingUnderagePage,\r\n [Popup.name]: SocialExperienceRenderErrorPopup,\r\n [ProfileManageDataPage.name]: SocialExperienceRenderErrorProfileManageDataPage,\r\n [PublisherSubscribeFollowButton.name]: SocialExperienceRenderErrorPublisherSubscribeFollowButton,\r\n [ReactionBreakdown.name]: SocialExperienceRenderErrorReactionBreakdown,\r\n [ReactionBreakdownListItem.name]: SocialExperienceRenderErrorReactionBreakdownListItem,\r\n [ReportMenu.name]: SocialExperienceRenderErrorReportMenu,\r\n UnknownComponent: SocialExperienceRenderErrorUnknownComponent\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\nimport { BaseExperience, InitialCommonExperienceProps } from \"@msnews/experiences-base\";\r\nimport { BridgeEventNames, ResponsiveClassManager, appErrorLogger, enums, handleBridgeEvent, SocialTelemetryManager } from \"@msnews/social-utils\";\r\nimport { HandledPropsKeys, getContextData } from \"@msnews/core\";\r\nimport { SocialHandledProps, SocialUnhandledProps } from \"./Social.props\";\r\n\r\nimport { ExperienceIds } from \"@msnews/experiences-constants\";\r\nimport Main from \"./main/main\";\r\nimport Popup from \"./popup/Popup\";\r\nimport React from \"react\";\r\nimport { RenderErrors } from \"./Social.errors\";\r\nimport { SocialService } from \"@msnews/social-data-service\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\ndeclare global {\r\n interface Window {\r\n loginWindow: any;\r\n trackFromWidget: any;\r\n sapphireBridge: any;\r\n msaLoginWindow: any;\r\n signalR: any;\r\n auth2: any;\r\n googleInit: any;\r\n gapi: any;\r\n FB: any;\r\n fbAsyncInit: any;\r\n listenMSALoginWindow: any;\r\n msaLogin: any;\r\n clipboardData: any;\r\n AzureStorage: any;\r\n require: (r: any, f: any) => void;\r\n ReactNativeWebView: any;\r\n }\r\n}\r\n\r\n/**\r\n * Starter kit experience\r\n */\r\nexport class Social extends BaseExperience {\r\n /** The Social default prop contract. Describes any default values for any component handled props */\r\n public static defaultProps: Partial = {\r\n experienceName: ExperienceIds.social\r\n };\r\n private handleTelemetryCall: Function;\r\n private handlePartialPageImpressionCall: Function;\r\n private handleAppErrorEventCall: (AppError) => void;\r\n\r\n constructor(props, context) {\r\n super(props, context);\r\n\r\n this.handleTelemetryCall = this.props.handleTelemetryCall;\r\n this.handlePartialPageImpressionCall = this.props.handlePartialPageImpressionCall;\r\n this.handleAppErrorEventCall = this.props.handleAppErrorEventCall;\r\n if (this.handleAppErrorEventCall) {\r\n appErrorLogger.setOnAppError(this.handleAppErrorEventCall);\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n protected handledProps: HandledPropsKeys = {\r\n ...InitialCommonExperienceProps,\r\n checkAndLogReducerError: undefined\r\n };\r\n\r\n /** @inheritdoc */\r\n public componentWillMount(): void {\r\n try {\r\n const locationHref = getContextData(this.props.requestContext.data.locationHref, \"locationHref\");\r\n const ppeEnvironmentSelected = locationHref.toLowerCase().indexOf(enums.selectPpeParameter) > -1;\r\n if (ppeEnvironmentSelected) { SocialService.setDomain(enums.externalUrls.ppeApi); }\r\n } catch (e) {\r\n logger.log(\"Error occured using requestContext.\");\r\n }\r\n }\r\n\r\n /** @ineritdoc */\r\n public componentDidMount(): void {\r\n this.setupTelemetry();\r\n this.setupBridge();\r\n this.setupResponsiveClass();\r\n }\r\n\r\n /** @inheritdoc */\r\n public componentWillUnmount(): void {\r\n this.teardownBridge();\r\n }\r\n\r\n public componentDidCatch(error, info): void {\r\n const componentRegex = new RegExp(\"in (.+) .created by\");\r\n const componentNameResult = info.componentStack.match(componentRegex);\r\n let componentName = componentNameResult && componentNameResult[1] || \"unknown\";\r\n const reduxResult = componentName.match(/Connect\\((.+)\\)/);\r\n const isRedux = (reduxResult && reduxResult[1]) != null;\r\n if (isRedux) {\r\n componentName = reduxResult[1];\r\n }\r\n const isPopup = info.componentStack.indexOf(\"created by Popup\") > 0;\r\n const appError = RenderErrors[componentName] || RenderErrors.UnknownComponent;\r\n\r\n const { moduleName, id } = this.props;\r\n\r\n appErrorLogger.log({\r\n ...appError,\r\n message: \"Social experience component failed to render\",\r\n pb: {\r\n ...appError.pb,\r\n customMessage: componentName + \" \" + error.name + \": \" + error.message,\r\n stack: error.stack,\r\n socialProps: { moduleName, id },\r\n isPopup,\r\n isRedux\r\n }\r\n } as AppError);\r\n }\r\n\r\n public componentDidUpdate() {\r\n this.props.checkAndLogReducerError();\r\n }\r\n\r\n /** @inheritdoc */\r\n public render(): JSX.Element {\r\n super.render();\r\n\r\n const { t, theme, children } = this.props;\r\n const propsToPass = {...this.unhandledProps(), children, markTtvr: this.markTtvr, t, theme};\r\n\r\n return (\r\n \r\n
    \r\n \r\n \r\n );\r\n }\r\n\r\n private setupTelemetry = () => {\r\n if (this.handleTelemetryCall && this.handlePartialPageImpressionCall) {\r\n SocialTelemetryManager.setPrimeHandlers({\r\n handleTelemetryCall: this.handleTelemetryCall,\r\n handlePartialPageImpressionCall: this.handlePartialPageImpressionCall\r\n });\r\n }\r\n };\r\n\r\n private setupBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.addEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n private teardownBridge = () => {\r\n if (canUseDOM()) {\r\n Object.keys(BridgeEventNames).forEach(eventName => document.removeEventListener(BridgeEventNames[eventName], handleBridgeEvent));\r\n }\r\n };\r\n\r\n /** Helper to mark time to visually ready */\r\n private markTtvr = () => {\r\n window.requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n super.markTimeToVisuallyReady(true);\r\n }, 0);\r\n });\r\n };\r\n\r\n private setupResponsiveClass() {\r\n ResponsiveClassManager.setWindow(window);\r\n ResponsiveClassManager.addListener(this, (responsiveClass) => {\r\n if (this.props.styleConnector && responsiveClass != this.props.responsiveClass) {\r\n this.props.styleConnector.updateResponsiveClass(responsiveClass);\r\n }\r\n });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, isDarkMode, neutralFillRest, neutralForegroundHint, neutralForegroundRest, neutralLayerCard, neutralOutlineActive } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { enums, profileHrColor, reset } from \"@msnews/social-utils\";\r\n\r\nconst fontSize = \"13px\";\r\nconst borderRadius = \"2px\";\r\n\r\nexport const CopyrightFormStyles = (config: DesignSystem) => ({\r\n copyrightFormContainer: {\r\n ...reset,\r\n \"box-sizing\": \"border-box\",\r\n width: \"500px\",\r\n \"max-width\": \"100vw\",\r\n display: \"flex !important\",\r\n \"flex-direction\": \"column\",\r\n padding: \"19px\",\r\n \"padding-bottom\": \"20px\",\r\n background: neutralLayerCard,\r\n \"max-height\": \"85vh\",\r\n \"min-height\": \"550px\",\r\n \"overflow-y\": \"auto\",\r\n \"font-size\": fontSize,\r\n\r\n \"& .cwt-input-container\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\"\r\n },\r\n\r\n \"& .cwt-h-seperator\": {\r\n background: profileHrColor,\r\n height: \"0px\",\r\n border: \"1px solid\",\r\n \"border-color\": neutralOutlineActive,\r\n \"box-sizing\": \"border-box\",\r\n width: \"100%\",\r\n margin: \"20px 0\"\r\n },\r\n \"& .cwt-sub-text\": {\r\n \"font-weight\": \"normal\",\r\n \"margin-top\": \"8px\",\r\n \"margin-bottom\": \"12px\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralForegroundHint\r\n },\r\n \"& .cwt-title\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"& .cwt-main-title\": {\r\n margin: \"16px 16px 8px\",\r\n \"font-weight\": \"600\",\r\n \"font-size\": \"24px\",\r\n color: neutralForegroundRest\r\n }\r\n },\r\n \"& div.cwt-buttons\": {\r\n display: \"flex\",\r\n \"flex-wrap\": \"wrap\",\r\n \"justify-content\": \"center\",\r\n margin: \"20px 0 0\",\r\n\r\n \"& .cwt-fast-button\": {\r\n \"min-width\": \"134px\",\r\n \"margin-bottom\": \"11px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"8px\"\r\n }\r\n },\r\n \"& .cwt-input-label\": {\r\n \"font-weight\": \"600\",\r\n margin: \"20px 2px 8px\",\r\n color: neutralForegroundRest,\r\n display: \"flex\",\r\n \"justify-content\": \"space-between\",\r\n\r\n \"& .cwt-input-label-asterisk\": {\r\n color: isDarkMode(config) ? \"#FFCCCC\" : \"#B30000\",\r\n \"&::before\": {\r\n content: \"'*'\"\r\n }\r\n }\r\n },\r\n \"& .cwt-required-text\": {\r\n color: isDarkMode(config) ? \"#FFCCCC\" : \"#B30000\"\r\n },\r\n \"& .cwt-input-box\": {\r\n background: neutralLayerCard,\r\n border: \"1px solid\",\r\n \"border-color\": neutralOutlineActive,\r\n \"box-shadow\": \"0px 4px 4px rgba(0, 0, 0, 0.02)\",\r\n \"border-radius\": borderRadius,\r\n color: isDarkMode(config) ? \"white\" : \"black\",\r\n padding: \"9px\"\r\n },\r\n \"& .cwt-input-disabled\": {\r\n background: neutralFillRest,\r\n \"font-weight\": \"400\",\r\n color: neutralForegroundRest\r\n },\r\n \"& .cwt-input-box-error\": {\r\n \"border-color\": isDarkMode(config) ? \"#FFCCCC\" : \"#B30000\",\r\n \"box-shadow\": isDarkMode(config) ? \"0px 1px 1px #FFCCCC\" : \"0px 1px 1px #B30000\"\r\n },\r\n \"& .cwt-header-sections\": {\r\n \"margin-bottom\": \"8px\",\r\n \"font-size\": `calc( ${fontSize} + (2px))`,\r\n color: neutralForegroundRest,\r\n \"font-weight\": \"600\"\r\n },\r\n \"& .cwt-header-comment-id\": {\r\n \"margin-top\": \"20px\",\r\n \"margin-bottom\": \"10px\",\r\n \"font-weight\": \"600\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralForegroundHint\r\n },\r\n\r\n \"& .cwt-media-container\": {\r\n position: \"relative\",\r\n \"min-height\": \"36px\",\r\n display: \"flex\",\r\n \"flex-wrap\": \"wrap\",\r\n \"align-items\": \"center\",\r\n border: \"1px solid\",\r\n \"border-color\": neutralOutlineActive,\r\n padding: \"4px\",\r\n \"box-shadow\": \"0px 4px 4px rgba(0, 0, 0, 0.02)\",\r\n \"& .cwt-media-input\": {\r\n position: \"absolute\",\r\n height: \"100%\",\r\n opacity: \"0\",\r\n width: \"100%\",\r\n \"&:hover\": {\r\n cursor: \"pointer\"\r\n }\r\n },\r\n \"& .cwt-fast-button\": {\r\n \"min-width\": \"134px\",\r\n margin: \"4px 0px 4px\",\r\n \"z-index\": \"1\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"12px\"\r\n },\r\n \"& .cwt-media\": {\r\n margin: \"4px 0px 4px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"12px\",\r\n display: \"flex\",\r\n \"z-index\": \"10\",\r\n \"align-items\": \"center\",\r\n [applyLocalizedProperty(\"padding-left\", \"padding-right\", config.direction)]: \"10px\",\r\n \"border-radius\": \"4px\",\r\n \"background-color\": isDarkMode(config) ? \"#4D4D4D\" : \"#C2C2C2\",\r\n color: neutralForegroundRest,\r\n \"&.cwt-upload-failed\": {\r\n \"background-color\": isDarkMode(config) ? \"#FF493E\" : \"#FF7970\"\r\n },\r\n \"&.cwt-upload-succeed\": {\r\n \"background-color\": isDarkMode(config) ? \"#576F3C\" : \"#A4BE87\"\r\n }\r\n },\r\n \"& .cwt-media-status\": {\r\n \"font-style\": \"italic\"\r\n },\r\n \"& .cwt-media-span\": {\r\n \"z-index\": \"10\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralForegroundHint\r\n }\r\n },\r\n [\"&.\" + enums.responsiveLevels.L0]: {\r\n width: \"100vw\",\r\n \"max-width\": \"100vw\",\r\n \"max-height\": \"85vh\",\r\n \"& .cwt-input-label\": {\r\n \"flex-direction\": \"column\",\r\n \"cwt-required-text\": {\r\n \"margin-top\": \"10px\"\r\n }\r\n }\r\n }\r\n }\r\n});\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const FollowButtonStyles = {\r\n followButtonContainer: {\r\n \"min-width\": \"100px\"\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { reset } from \"@msnews/social-utils\";\r\n\r\nconst avatarSize = \"64px\";\r\n\r\nexport const MultiLoginPageStyles = {\r\n multiLoginPageContainer: {\r\n ...reset,\r\n overflow: \"hidden\",\r\n \"overflow-y\": \"auto\",\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-start\",\r\n width: \"500px\",\r\n \"max-width\": \"calc(100vw - 40px)\",\r\n padding: \"40px 20px\",\r\n background: neutralLayerCard,\r\n\r\n \"&:before\": {\r\n content: \"' '\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n height: \"8px\",\r\n width: \"100%\",\r\n background: accentFillRest\r\n },\r\n\r\n \"& p.cwt-title\": {\r\n margin: \"22px 0 28px\",\r\n \"font-size\": \"24px\",\r\n \"font-weight\": \"600\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-avatar\": {\r\n height: avatarSize,\r\n width: avatarSize,\r\n \"min-width\": avatarSize\r\n },\r\n\r\n \"& .cwt-fast-button.cwt-image-button\": {\r\n width: \"250px\",\r\n height: \"auto\",\r\n \"justify-content\": \"stretch\",\r\n \"max-width\": \"96%\",\r\n margin: \"5px 0\",\r\n padding: \"11px 0\",\r\n\r\n \"& .cwt-image\": {\r\n margin: \"0 25px\"\r\n }\r\n },\r\n\r\n \"& .cwt-privacy-text\": {\r\n margin: \"40px 16px 16px\",\r\n \"font-size\": \"13px\",\r\n color: neutralForegroundHint,\r\n\r\n \"& .cwt-link\": {\r\n padding: \"0 .1em\",\r\n color: accentFillRest\r\n }\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { neutralFillStealthHover, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums } from \"@msnews/social-utils\";\r\n\r\nexport const PopupStyles = {\r\n overlayContainer: {\r\n display: \"flex !important\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"center\",\r\n position: \"fixed\",\r\n left: \"0px\",\r\n right: \"0px\",\r\n top: \"0px\",\r\n bottom: \"0px\",\r\n \"z-index\": \"9999999999\",\r\n \"background-color\": \"transparent\",\r\n\r\n \"& .cwt-overlay\": {\r\n position: \"absolute\",\r\n left: \"0px\",\r\n right: \"0px\",\r\n top: \"0px\",\r\n bottom: \"0px\",\r\n \"background-color\": \"rgba(0,0,0,0.5)\"\r\n },\r\n\r\n \"& .cwt-content\": {\r\n position: \"fixed\",\r\n \"z-index\": \"10\",\r\n margin: \"0\",\r\n \"max-width\": \"100%\",\r\n \"max-height\": \"calc(100% + 16px)\",\r\n overflow: \"auto\",\r\n\r\n // 'Hide scrollbar'\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar \": {\r\n display: \"none\"\r\n },\r\n\r\n \"& .cwt-corner-buttons\": {\r\n position: \"sticky\",\r\n top: \"40px\",\r\n margin: \"0 12px\",\r\n \"z-index\": \"9999\",\r\n display: \"flex\",\r\n \"font-size\": \"13px\",\r\n \"align-items\": \"center\",\r\n \"flex-direction\": \"row-reverse\",\r\n\r\n \"& .cwt-icon.cwt-link\": {\r\n padding: \"8px\",\r\n color: neutralForegroundRest,\r\n \"border-radius\": \"4px\",\r\n background: neutralLayerCard,\r\n \"box-shadow\": \"0 0 3px rgb(0 0 0 / 10%)\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-content-container\": {\r\n display: \"block !important\",\r\n overflow: \"auto\",\r\n height: \"100%\",\r\n \"border-radius\": \"6px\",\r\n\r\n \"& > div\": {\r\n display: \"block !important\"\r\n }\r\n }\r\n },\r\n\r\n [\"&.\"+enums.responsiveLevels.MobilePopup]: {\r\n \"align-items\": \"flex-end\",\r\n\r\n \"& .cwt-content\": {\r\n width: \"100vw\",\r\n\r\n \"& .cwt-content-container\": {\r\n \"border-radius\": \"20px 20px 0 0 !important\"\r\n }\r\n\r\n }\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, accentFillRest, accentForegroundRest, isDarkMode, neutralFillStealthActive, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { enums, getEmojiStylesByWidth, reset } from \"@msnews/social-utils\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst sidePadding = 20;\r\nconst avatarSize = \"28px\";\r\nconst width = 466;\r\n\r\nconst scrollGradientStyle = (config) => {\r\n return {\r\n content: \"''\",\r\n width: \"100%\",\r\n height: \"20px\",\r\n position: \"absolute\",\r\n \"background-repeat\": \"no-repeat\",\r\n \"z-index\": \"1\",\r\n left: \"0\",\r\n right: \"0\",\r\n background: isDarkMode(config) ? \"linear-gradient(180deg, rgba(66, 66, 66, 0), rgba(66, 66, 66, 1))\" : \"linear-gradient(180deg, rgba(255, 255, 255, 0), #FFFFFF)\"\r\n };\r\n};\r\n\r\nexport const ReactionBreakdownStyles = (config: DesignSystem) => ({\r\n reactionBreakdownContainer: {\r\n ...reset,\r\n \"box-sizing\": \"content-box !important\",\r\n display: \"block !important\",\r\n margin: \"0 auto\",\r\n\r\n [\"&.\"+enums.responsiveLevels.MobilePopup]: {\r\n display: \"flex !important\",\r\n \"max-width\": \"100vw\",\r\n \"overflow-x\": \"hidden\",\r\n\r\n \"& .cwt-reaction-breakdown-inner\": {\r\n width: \"100vw\",\r\n\r\n \"& .cwt-tab-content\": {\r\n height: \"unset\",\r\n \"min-height\": \"270px\",\r\n \"max-height\": `${screen.height*.9 - 120}px`\r\n }\r\n }\r\n },\r\n\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16),\r\n transition: \"none\"\r\n },\r\n\r\n \"& .cwt-reaction-breakdown-inner\": {\r\n \"box-sizing\": \"content-box !important\",\r\n display: \"block !important\",\r\n width: `${width - 2*sidePadding}px`,\r\n \"max-width\": \"100vw\",\r\n margin: \"0 auto\",\r\n padding: \"0\",\r\n background: neutralLayerCard,\r\n \"overflow-x\": \"hidden\",\r\n\r\n \"& .cwt-reaction-breakdown-header\": {\r\n position: \"sticky\",\r\n top: \"0\",\r\n \"z-index\": \"5\",\r\n \"padding-top\": \"20px\",\r\n background: neutralLayerCard\r\n },\r\n\r\n \"& .cwt-title\": {\r\n color: neutralForegroundRest,\r\n margin: \"0 0 16px\",\r\n \"font-size\": \"16px !important\",\r\n \"font-weight\": \"bold\",\r\n \"text-align\": \"start\",\r\n padding: `0 ${sidePadding}px`\r\n },\r\n\r\n \"& .cwt-tabs\": {\r\n padding: `0 ${sidePadding}px`,\r\n \"align-items\": \"flex-start\",\r\n \"& .cwt-tab-item\": {\r\n position: \"relative\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"4px\",\r\n \"border-radius\": \"8px 8px 0 0\",\r\n \"min-height\": \"26px\",\r\n\r\n \"&.active > .cwt-icon > .cwt-icon-label\": {\r\n color: isDarkMode(config) ? \"#5CB6FF\" : accentFillRest\r\n },\r\n \"&.active:after\": {\r\n position: \"absolute\",\r\n content: \"' '\",\r\n height: \"3px\",\r\n width: \"100%\",\r\n bottom: \"0\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"0\",\r\n background: accentForegroundRest\r\n },\r\n\r\n \"&.cwt-link:hover\": {\r\n \"text-decoration\": \"none\"\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-h-seperator\": {\r\n height: \"1px\",\r\n margin: \"0\",\r\n background: \"rgba(0, 0, 0, 0.08)\",\r\n border: \"none\"\r\n },\r\n\r\n \"& .cwt-badge\": {\r\n \"font-size\": \"14px\",\r\n color: isDarkMode(config) ? \"#D1D1D1\" : \"#4D4D4D\"\r\n },\r\n\r\n \"& .cwt-tab-content\": {\r\n display: \"block !important\",\r\n height: \"280px\",\r\n margin: `0 -${sidePadding}px`,\r\n \"overflow-y\": \"auto\",\r\n \"&\": {\r\n // This is for cross-browser compatibility of scrollbar positioning,\r\n // overlay is not supported on all browsers\r\n \"overflow-y\": \"overlay\"\r\n },\r\n\r\n // Scrollbar\r\n \"scrollbar-width\": \"thin\",\r\n \"scrollbar-color\": \"rgba(0, 0, 0, 0.3) transparent\",\r\n \"&::-webkit-scrollbar\": {\r\n width: \"6px\"\r\n },\r\n \"&::-webkit-scrollbar-track\": {\r\n background: \"transparent\"\r\n },\r\n \"&::-webkit-scrollbar-thumb\": {\r\n \"background-color\": \"rgba(0, 0, 0, 0.3)\",\r\n \"border-radius\": \"6px\"\r\n },\r\n\r\n \"&:before\": {\r\n ...scrollGradientStyle(config),\r\n transform: \"translateY(-5px) scaleY(-.75)\"\r\n },\r\n\r\n \"&:after\": {\r\n ...scrollGradientStyle(config),\r\n bottom: \"0\"\r\n }\r\n },\r\n\r\n \"& .cwt-icon\": {\r\n \"& div.emoji-icon\": {\r\n ...getEmojiStylesByWidth(16)\r\n },\r\n \"& .cwt-icon-label\": {\r\n \"margin-top\": \"-1.25px\",\r\n \"font-size\": \"14px\"\r\n }\r\n },\r\n\r\n \"& .cwt-reacting-users\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n padding: `0 ${sidePadding}px`,\r\n margin: \"8px 0 32px\",\r\n\r\n \"& li\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"space-between\",\r\n \"font-size\": \"14px\",\r\n padding: `0 ${sidePadding}px`,\r\n \"min-height\": \"42px\",\r\n \"max-height\": \"60px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthActive\r\n },\r\n\r\n \"& .cwt-avatar\": {\r\n height: avatarSize,\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize\r\n },\r\n\r\n \"& .cwt-name\": {\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-reaction\": {\r\n margin: \"0 10px\",\r\n \"font-size\": \"16px\"\r\n },\r\n\r\n \"& .cwt-reaction-more\": {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"5px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"10px\"\r\n },\r\n\r\n \"& .cwt-fast-button\": {\r\n height: \"21px\",\r\n \"min-width\": \"64px\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"20px\",\r\n \"font-size\": \"12px\"\r\n },\r\n\r\n \"& .float-item\": {\r\n display: \"flex\",\r\n height: \"36px\",\r\n \"align-items\": \"center\",\r\n\r\n \"& a.cwt-link.cwt-avatar-link\": {\r\n display: \"flex\"\r\n }\r\n }\r\n },\r\n\r\n \"& li.cwt-rest-reactions\": {\r\n \"& .cwt-name\": {\r\n color: neutralForegroundHint\r\n }\r\n }\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialProps as BaseSocialProps,\r\n SocialUnhandledProps as BaseSocialUnhandledProps,\r\n SocialHandledProps,\r\n SocialManagedClasses\r\n} from \"./Social.props\";\r\nimport { SocialConfigSchema, mockConfig, mockDefaultState, mockState } from \"./experience-info\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { Social as BaseSocial } from \"./Social\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ExperienceInfo } from \"@msnews/core\";\r\nimport { SocialActions } from \"./Social.actions\";\r\nimport { SocialClassNameContract } from \"./Social.classnames\";\r\nimport { SocialConfig } from \"./Social.config\";\r\nimport { SocialConnector } from \"./Social.connector\";\r\nimport { SocialInspector } from \"./Social.inspector\";\r\nimport { SocialReducer } from \"./Social.reducer\";\r\nimport { SocialState } from \"./Social.state\";\r\nimport { SocialStyles } from \"./Social.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n// The type returned by manageJss type is very complicated so we'll let the compiler infer the type instead of re-declaring just for the package export\r\nconst Social = manageJss(SocialStyles)(BaseSocial);\r\ntype Social = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ntype SocialUnhandledProps = Subtract;\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype SocialProps = ManagedJSSProps;\r\n\r\n// Define the ExperienceInfo object. This is used by tooling\r\nconst ToolingInfo: ExperienceInfo = {\r\n reactComponent: Social,\r\n experienceConfigSchema: SocialConfigSchema,\r\n defaultMockState: mockDefaultState,\r\n mockState: mockState,\r\n mockConfig: mockConfig,\r\n inspector: SocialInspector.inspect\r\n};\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n Social,\r\n SocialActions,\r\n SocialConfig,\r\n SocialConnector,\r\n SocialProps,\r\n SocialReducer,\r\n SocialState,\r\n SocialClassNameContract,\r\n SocialHandledProps,\r\n SocialUnhandledProps,\r\n ToolingInfo\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CommonStyles, CommonSuperAppStyles } from \"@msnews/social-utils\";\r\n\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { CopyrightFormStyles } from \"./copyright-form/CopyrightForm.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { FollowButtonStyles } from \"./follow-button/FollowButton.styles\";\r\nimport { FollowButtonSuperAppStyles } from \"./follow-button/themes/superapp/FollowButtonSuperApp.styles\";\r\nimport { GradientOverlayStyles } from \"./common/gradient-overlay/GradientOverlay.styles\";\r\nimport { MultiLoginPageStyles } from \"./multi-login-page/MultiLoginPage.styles\";\r\nimport { NotificationCardStyles } from \"./common/notification/NotificationCard.styles\";\r\nimport { NotificationTrayStyles } from \"./common/notification/NotificationTray.styles\";\r\nimport { OnboardingPageStyles } from \"./onboarding-page/OnboardingPage.styles\";\r\nimport { PopupStyles } from \"./popup/Popup.styles\";\r\nimport { PublisherSubscribeFollowButtonStyles } from \"./publisher-subscribe-follow-button/PublisherSubscribeFollowButton.styles\";\r\nimport { ProfileManageDataPageStyles } from \"./profile/profile-manage-data-page/ProfileManageDataPage.styles\";\r\nimport { ReactionBreakdownStyles } from \"./reaction-breakdown/ReactionBreakdown.styles\";\r\nimport { ReactionBreakdownSuperAppStyles } from \"./reaction-breakdown/themes/superapp/ReactionBreakdownSuperApp.styles\";\r\nimport { ReportMenuStyles } from \"./common/report-menu/ReportMenu.styles\";\r\nimport { ReportMenuSuperAppStyles } from \"./common/report-menu/themes/superapp/ReportMenuSuperApp.styles\";\r\nimport { SocialClassNameContract } from \"./Social.classnames\";\r\n\r\n/**\r\n * The Social styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const SocialStyles: ComponentStyles < SocialClassNameContract, DesignSystem > = (config: DesignSystem) => ({\r\n ...CommonStyles(config),\r\n ...ReportMenuStyles(config),\r\n ...PopupStyles,\r\n ...NotificationCardStyles(config),\r\n ...NotificationTrayStyles(config),\r\n ...FollowButtonStyles,\r\n ...ReactionBreakdownStyles(config),\r\n ...MultiLoginPageStyles,\r\n ...ProfileManageDataPageStyles(config),\r\n ...OnboardingPageStyles(config),\r\n ...GradientOverlayStyles(config),\r\n ...CopyrightFormStyles(config),\r\n ...PublisherSubscribeFollowButtonStyles(config),\r\n\r\n /** SuperApp Styles */\r\n ...CommonSuperAppStyles(config),\r\n ...FollowButtonSuperAppStyles(config),\r\n ...ReactionBreakdownSuperAppStyles(config),\r\n ...ReportMenuSuperAppStyles(config)\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralFillStealthHover, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const ReportMenuStyles = (config: DesignSystem) => ({\r\n reportMenuContainer: {\r\n width: \"140px\",\r\n height: \"190px\",\r\n padding: \"4px 0 !important\",\r\n \"font-size\": \"14px\",\r\n \"letter-spacing\": applyLocalizedProperty(\"-0.012em\", \"0\", config.direction),\r\n background: neutralLayerCard,\r\n \"border-radius\": \"8px\",\r\n \"box-shadow\": \"0px 0px 5.6px rgba(0, 0, 0, 0.11), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n \"overflow-y\": \"scroll\",\r\n\r\n \"& li\": {\r\n padding: \"8px 14px !important\",\r\n color: neutralForegroundRest,\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover,\r\n cursor: \"pointer\"\r\n }\r\n },\r\n\r\n /* Hide Scrollbars */\r\n \"-ms-overflow-style\": \"none\",\r\n \"&::-webkit-scrollbar \": {\r\n display: \"none\"\r\n },\r\n \"&:-moz-any(#content,#appcontent) browser\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"-14px !important\",\r\n \"overflow-y\": \"scroll\",\r\n \"margin-bottom\": \"-14px !important\",\r\n \"overflow-x\": \"scroll\"\r\n }\r\n },\r\n\r\n reportMenuPopover: {\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"0\",\r\n top: \"10px\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst avatarSize = \"32px\";\r\nconst shadowColor = \"rgba(50, 50, 50, 0.16)\";\r\nconst titleSize = \"14px\";\r\nconst messageSize = \"13px\";\r\nconst rootPadding = \"10px\";\r\nconst rightPadding = \"24px\";\r\nconst rootWidth = \"294px\";\r\nconst rootHeight = \"76px\";\r\n\r\nexport const NotificationCardStyles = (config: DesignSystem) => ({\r\n notificationCardContainer: {\r\n position: \"relative\",\r\n padding: rootPadding,\r\n [applyLocalizedProperty(\"padding-right\", \"padding-left\", config.direction)]: rightPadding,\r\n width: rootWidth,\r\n height: rootHeight,\r\n background: neutralLayerCard,\r\n \"box-shadow\": \"0px 0px 12px \" + shadowColor,\r\n \"border-radius\": \"6px\",\r\n \"box-sizing\": \"unset !important\",\r\n\r\n \"& .cwt-close-button\": {\r\n position: \"absolute\",\r\n top: \"16px\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"8px\",\r\n background: \"none\",\r\n border: \"none\"\r\n },\r\n\r\n \"& .cwt-notification-header\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n\r\n \"& .cwt-image-container\": {\r\n display: \"inline-flex\",\r\n\r\n \"& .cwt-avatar\": {\r\n height: avatarSize,\r\n \"min-width\": avatarSize,\r\n \"max-width\": avatarSize,\r\n display: \"block\"\r\n },\r\n\r\n \"& .cwt-not-clickable\": {\r\n cursor: \"default\"\r\n },\r\n \"& .cwt-not-round\": {\r\n \"border-radius\": \"0\",\r\n \"object-fit\": \"contain\"\r\n }\r\n },\r\n\r\n \"& .cwt-title\": {\r\n margin: \"0 10px\",\r\n \"font-weight\": \"600\",\r\n \"font-size\": titleSize,\r\n color: neutralForegroundRest,\r\n \"white-space\": \"nowrap\",\r\n overflow: \"hidden\",\r\n \"text-overflow\": \"ellipsis\"\r\n }\r\n },\r\n\r\n \"& .cwt-message\": {\r\n margin: \"4px\",\r\n \"font-size\": messageSize,\r\n color: neutralForegroundHint,\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n height: \"42px\",\r\n \"& *\": {\r\n display: \"inline\"\r\n },\r\n \"& .cwt-name.cwt-link\": {\r\n \"font-weight\": \"600\",\r\n\r\n \"&::before\": {\r\n content: \"'@'\",\r\n display: \"inline\"\r\n }\r\n },\r\n \"& > .cwt-clamp\": {\r\n display: \"-webkit-box\",\r\n \"-webkit-line-clamp\": \"2\",\r\n \"-webkit-box-orient\": \"vertical\",\r\n overflow: \"hidden\",\r\n \"text-overflow\": \"ellipsis\",\r\n \"line-height\": \"17px\",\r\n \"max-height\": \"38px\"\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const NotificationTrayStyles = (config: DesignSystem) => ({\r\n notificationTrayContainer: {\r\n position: \"fixed\",\r\n bottom: \"0\",\r\n margin: \"30px\",\r\n \"z-index\": \"99999999999999999 \",\r\n\r\n \"& > *\": {\r\n \"margin-bottom\": \"16px\"\r\n }\r\n },\r\n notificationTrayContainerLeftAligned: {\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"0\"\r\n },\r\n notificationTrayContainerRightAligned: {\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"0\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralForegroundHint, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\nimport { profileHrColor, reset } from \"@msnews/social-utils\";\r\n\r\nconst sidePadding = \"36px\";\r\nconst containerWidth = \"470px\";\r\nconst checkBoxSize = \"22px\";\r\n\r\nexport const ProfileManageDataPageStyles = (config: DesignSystem) => ({\r\n profileManageDataPageContainer: {\r\n ...reset,\r\n \"box-sizing\": \"content-box !important\",\r\n display: \"flex !important\",\r\n \"flex-direction\": \"column\",\r\n \"justify-content\": \"space-between\",\r\n \"align-items\": \"center\",\r\n width: `calc( ${containerWidth} - (${sidePadding} * 2))`,\r\n \"max-width\": `calc( 100% - (${sidePadding} * 2))`,\r\n margin: \"0 auto\",\r\n padding: \"34px \" + sidePadding,\r\n \"min-height\": `calc( ${containerWidth} - (34px * 2))`,\r\n background: neutralLayerCard,\r\n\r\n \"& .cwt-h-seperator\": {\r\n height: \"1px\",\r\n margin: `0 -${sidePadding}`,\r\n background: profileHrColor,\r\n border: \"none\"\r\n },\r\n\r\n \"& .cwt-sub-text\": {\r\n \"font-weight\": \"normal\",\r\n \"font-size\": \"13px\",\r\n \"line-height\": \"18px\",\r\n color: neutralForegroundHint\r\n },\r\n\r\n \"& .cwt-header\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"margin-bottom\": \"16px\",\r\n\r\n \"& .cwt-title\": {\r\n margin: \"16px 16px 8px\",\r\n \"font-weight\": \"600\",\r\n \"font-size\": \"24px\"\r\n }\r\n },\r\n\r\n \"& div.cwt-buttons\": {\r\n display: \"flex\",\r\n \"flex-wrap\": \"wrap\",\r\n \"justify-content\": \"center\",\r\n margin: \"20px 0 0\",\r\n\r\n \"& .cwt-fast-button\": {\r\n \"min-width\": \"130px\",\r\n \"margin-bottom\": \"5px\",\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"9px\"\r\n }\r\n },\r\n\r\n \"& .cwt-checklist\": {\r\n margin: \"16px 0 14px\",\r\n padding: \"0\",\r\n\r\n \"& .cwt-checklist-item\": {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n margin: \"0 0 14px\",\r\n\r\n \"& .cwt-checkbox\": {\r\n \"min-width\": checkBoxSize,\r\n \"min-height\": checkBoxSize,\r\n margin: \"0\",\r\n padding: \"4px\",\r\n background: neutralLayerCard,\r\n border: \"1px solid #DDDDDD\",\r\n \"border-radius\": \"2px\",\r\n\r\n \"& .cwt-icon\": {\r\n \"font-size\": checkBoxSize,\r\n color: neutralForegroundHint\r\n }\r\n },\r\n\r\n \"& div.cwt-checklist-item-content\": {\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"justify-content\": \"center\",\r\n margin: \"0 16px\",\r\n\r\n \"& .cwt-label\": {\r\n margin: \"0\",\r\n padding: \"0\",\r\n \"font-size\": \"15px\",\r\n \"font-weight\": \"600\",\r\n \"line-height\": \"20px\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-sub-text\": {\r\n margin: \"0\",\r\n padding: \"0\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { accentFillRest, DesignSystem, isDarkMode, neutralFillToggleHover, neutralForegroundRest, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\nimport { onboardingImages, reset } from \"@msnews/social-utils\";\r\n\r\nconst avatarSize = \"80px\";\r\nconst underageAvatarSize = \"50px\";\r\nconst successTextColor = \"#28623F\";\r\nconst failedTextColor = \"#E22C3B\";\r\nconst reviewTextColor = \"orange\";\r\n\r\nexport const OnboardingPageStyles = (config: DesignSystem) => ({\r\n onboardingPageContainer: {\r\n ...reset,\r\n overflow: \"hidden\",\r\n \"overflow-y\": \"auto\",\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-start\",\r\n width: \"500px\",\r\n \"max-width\": \"calc(100vw - 40px)\",\r\n padding: \"40px 20px\",\r\n background: neutralLayerCard,\r\n \"text-align\": \"center\",\r\n \"box-shadow\": \"0px 1.2px 3.6px rgba(0, 0, 0, 0.1), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n\r\n \"&:before\": {\r\n content: \"' '\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n height: \"8px\",\r\n width: \"100%\",\r\n background: accentFillRest\r\n },\r\n\r\n \"& .cwt-top-logo\": {\r\n height: \"24px\",\r\n margin: \"0 0 40px\"\r\n },\r\n\r\n \"& .cwt-ellipse-steps\": {\r\n \"text-align\": \"center\",\r\n \"margin-top\": \"-20px\",\r\n\r\n \"& .cwt-active-step\": {\r\n height: \"8px\",\r\n width: \"8px\",\r\n margin: \"0 4px\",\r\n display: \"inline-block\",\r\n \"border-radius\": \"50%\",\r\n \"background-color\": \"#929292\"\r\n },\r\n \"& .cwt-step\": {\r\n height: \"8px\",\r\n width: \"8px\",\r\n margin: \"0 4px\",\r\n display: \"inline-block\",\r\n \"border-radius\": \"50%\",\r\n \"background-color\": \"#EFEFEF\"\r\n }\r\n },\r\n\r\n \"& .cwt-title\": {\r\n margin: \"20px 0 0\",\r\n \"font-size\": \"24px\",\r\n padding: \"0 16px\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-sub-title\": {\r\n \"max-width\": \"400px\",\r\n margin: \"16px 0 0\",\r\n \"font-size\": \"13px\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralFillToggleHover\r\n },\r\n\r\n \"& .cwt-avatar\": {\r\n \"touch-action\": \"none\",\r\n \"margin-top\": \"36px\",\r\n height: avatarSize,\r\n width: avatarSize,\r\n \"min-width\": avatarSize,\r\n\r\n \"&.cwt-error\": {\r\n border: \"1px solid \"+failedTextColor\r\n }\r\n },\r\n\r\n \"& .cwt-name\": {\r\n \"margin-top\": \"24px\",\r\n \"font-size\": \"24px\",\r\n color: neutralForegroundRest,\r\n\r\n \"&.cwt-error\": {\r\n color: failedTextColor\r\n }\r\n },\r\n\r\n \"& .cwt-email\": {\r\n \"margin-top\": \"30px\",\r\n \"font-size\": \"18px\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-h-seperator\": {\r\n width: \"100%\",\r\n \"max-width\": \"380px\",\r\n margin: \"24px 0 12px\",\r\n \"border-top\": \"1px solid #949494\"\r\n },\r\n\r\n \"& .cwt-status-message\": {\r\n \"margin-top\": \"8px\",\r\n \"max-width\": \"345px\",\r\n \"min-height\": \"36px\",\r\n \"font-size\": \"13px\",\r\n\r\n \"& .cwt-icon-vector\": {\r\n \"font-size\": \"16px\"\r\n },\r\n\r\n \"& .cwt-success-message\": {\r\n color: isDarkMode(config) ? \"#BAE3C8\" : successTextColor\r\n },\r\n\r\n \"& .cwt-review-message\": {\r\n display: \"block\",\r\n \"margin-top\": \"6px\",\r\n color: reviewTextColor\r\n },\r\n\r\n \"& .cwt-error-message\": {\r\n display: \"block\",\r\n \"margin-top\": \"6px\",\r\n\r\n \"& *\": {\r\n color: failedTextColor\r\n }\r\n }\r\n },\r\n\r\n \"& .cwt-buttons\": {\r\n \"margin-top\": \"30px\",\r\n display: \"flex\",\r\n padding: \"7px 0\",\r\n\r\n \"& .cwt-fast-button\": {\r\n margin: \"0 4px\"\r\n }\r\n },\r\n\r\n \"& .cwt-footer-text\": {\r\n \"margin-top\": \"14px\",\r\n \"max-width\": \"345px\",\r\n padding: \"0 16px\",\r\n \"font-size\": \"13px\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralFillToggleHover,\r\n\r\n \"& .cwt-link\": {\r\n color: isDarkMode(config) ? \"#BDDCFF\" : accentFillRest\r\n }\r\n }\r\n },\r\n\r\n onboardingUnderagePageContainer: {\r\n ...reset,\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-start\",\r\n width: \"540px\",\r\n \"max-width\": \"100%\",\r\n height: \"470px\",\r\n \"max-height\": \"90vh\",\r\n padding: \"40px 0 54px\",\r\n background: `center bottom no-repeat url('${onboardingImages.underageBg}')`,\r\n \"background-color\": neutralLayerCard,\r\n \"text-align\": \"center\",\r\n \"box-shadow\": \"0px 1.2px 3.6px rgba(0, 0, 0, 0.1), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n\r\n \"&:before\": {\r\n content: \"' '\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n height: \"8px\",\r\n width: \"100%\",\r\n background: accentFillRest\r\n },\r\n\r\n \"& .cwt-title\": {\r\n \"font-size\": \"24px\",\r\n \"max-width\": \"380px\",\r\n padding: \"0 16px\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-sub-title\": {\r\n \"max-width\": \"400px\",\r\n margin: \"20px 16px 0\",\r\n \"font-size\": \"13px\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralFillToggleHover\r\n },\r\n\r\n \"& .cwt-avatar\": {\r\n \"touch-action\": \"none\",\r\n margin: \"16px 0 36px\",\r\n height: underageAvatarSize,\r\n width: underageAvatarSize,\r\n \"min-width\": underageAvatarSize\r\n },\r\n\r\n \"& .cwt-buttons\": {\r\n \"margin-top\": \"40px\",\r\n display: \"flex\",\r\n padding: \"7px 0\",\r\n\r\n \"& .cwt-fast-button\": {\r\n margin: \"0 4px\"\r\n }\r\n }\r\n },\r\n onboardingWelcomePageStep2Container: {\r\n ...reset,\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n display: \"flex\",\r\n \"flex-direction\": \"column\",\r\n \"align-items\": \"center\",\r\n \"justify-content\": \"flex-start\",\r\n width: \"540px\",\r\n \"max-width\": \"100%\",\r\n \"max-height\": \"60vh\",\r\n height: \"470px\",\r\n padding: \"40px 0 54px\",\r\n background: `center bottom -130px no-repeat url('${onboardingImages.welcomeBg}')`,\r\n \"background-color\": neutralLayerCard,\r\n \"text-align\": \"center\",\r\n \"box-shadow\": \"0px 1.2px 3.6px rgba(0, 0, 0, 0.1), 0px 6.4px 14.4px rgba(0, 0, 0, 0.13)\",\r\n\r\n \"&:before\": {\r\n content: \"' '\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n height: \"8px\",\r\n width: \"100%\",\r\n background: accentFillRest\r\n },\r\n\r\n \"& .cwt-ellipse-steps\": {\r\n \"text-align\": \"center\",\r\n \"margin-top\": \"-20px\",\r\n\r\n \"& .cwt-active-step\": {\r\n height: \"8px\",\r\n width: \"8px\",\r\n margin: \"8px 4px\",\r\n display: \"inline-block\",\r\n \"border-radius\": \"50%\",\r\n \"background-color\": \"#929292\"\r\n },\r\n \"& .cwt-step\": {\r\n height: \"8px\",\r\n width: \"8px\",\r\n margin: \"8px 4px\",\r\n display: \"inline-block\",\r\n \"border-radius\": \"50%\",\r\n \"background-color\": \"#EFEFEF\"\r\n }\r\n },\r\n\r\n \"& .cwt-title\": {\r\n \"font-size\": \"24px\",\r\n \"margin-top\": \"20px\",\r\n width: \"381px\",\r\n height: \"61px\",\r\n padding: \"0 16px\",\r\n color: neutralForegroundRest\r\n },\r\n\r\n \"& .cwt-sub-title\": {\r\n \"max-width\": \"400px\",\r\n margin: \"-10px 16px 0\",\r\n \"font-size\": \"13px\",\r\n color: isDarkMode(config) ? \"#D9D9D9\" : neutralFillToggleHover\r\n },\r\n\r\n \"& .cwt-avatar-step2\": {\r\n \"touch-action\": \"none\",\r\n \"margin-top\": \"12px\",\r\n height: underageAvatarSize,\r\n width: underageAvatarSize,\r\n \"border-radius\": \"50%\"\r\n },\r\n\r\n \"& .cwt-buttons\": {\r\n \"margin-top\": \"21px\",\r\n display: \"flex\",\r\n padding: \"7px 0\",\r\n\r\n \"& .cwt-fast-button\": {\r\n margin: \"0 4px\"\r\n },\r\n \"& .cwt-button-ok\": {\r\n width: \"136px\",\r\n height: \"40px\"\r\n }\r\n },\r\n\r\n \"& .cwt-image-container\": {\r\n \"margin-top\": \"-66px\",\r\n \"margin-bottom\": \"-60px\",\r\n\r\n \"& .cwt-image\": {\r\n width: \"350px\",\r\n \"object-fit\": \"center\",\r\n \"object-position\": \"0 130px\"\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, accentFillRest, isDarkMode, neutralLayerCard } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const GradientOverlayStyles = (config: DesignSystem) => ({\r\n gradientOverlayContainer: {\r\n \"& .cwt-overlay\": {\r\n position: \"fixed\",\r\n width: \"100vw\",\r\n height: \"50vh\",\r\n bottom: \"0\",\r\n transition: \"background-position .4s ease\",\r\n cursor: \"pointer\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"0\",\r\n background: isDarkMode(config) ?\r\n \"linear-gradient(180deg, rgba(66, 66, 66, 0), rgba(66, 66, 66, 1))\" :\r\n \"linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1))\",\r\n \"background-repeat\": \"no-repeat\",\r\n \"z-index\": \"2147483645\",\r\n\r\n \"&:hover\": {\r\n \"background-position\": \"0px 3vh\"\r\n }\r\n }\r\n },\r\n\r\n overlayButton: {\r\n padding: \"10px 100px\",\r\n border: \"1px solid\",\r\n color: accentFillRest,\r\n background: neutralLayerCard,\r\n margin: \"20px 0\",\r\n cursor: \"pointer\",\r\n \"font-size\": \"16px\",\r\n \"border-color\": accentFillRest,\r\n \"border-radius\": \"30px\",\r\n position: \"fixed\",\r\n [applyLocalizedProperty(\"left\", \"right\", config.direction)]: \"50%\",\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"unset\",\r\n transform: applyLocalizedProperty(\"translateX(-50%)\", \"translateX(50%)\", config.direction),\r\n bottom: \"20px\",\r\n \"max-width\": \"95vw\"\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty } from \"@microsoft/fast-jss-utilities\";\r\n\r\nexport const PublisherSubscribeFollowButtonStyles = (config: DesignSystem) => ({\r\n publisherSubscribeFollowButtonContainer: {\r\n display: \"flex\",\r\n \"align-items\": \"center\",\r\n \"font-size\": \"12px\",\r\n \"font-family\": \"inherit\",\r\n color: \"white\",\r\n position: \"absolute\"\r\n },\r\n publisherSubscribeFollowButton: {\r\n display: \"flex\",\r\n \"flex-direction\": \"row\",\r\n background: \"none\",\r\n padding: \"6px 16px\",\r\n \"font-size\": \"inherit\",\r\n \"font-family\": \"inherit\",\r\n \"border-radius\": \"20px\",\r\n \"align-items\": \"center\",\r\n cursor: \"pointer\",\r\n color: \"currentColor\",\r\n\r\n \"& .cwt-icon\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"10px\",\r\n color: \"currentColor\"\r\n }\r\n },\r\n publisherSubscribeFollowButtonInactive: {\r\n border: \"1px solid\",\r\n \"border-color\": \"rgba(255, 255, 255, 0.32)\",\r\n\r\n \"&:hover\": {\r\n \"background-color\": \"rgba(255, 255, 255, 0.08)\"\r\n }\r\n },\r\n publisherSubscribeFollowButtonActive: {\r\n border: \"none\"\r\n },\r\n publisherSubscribeFollowButtonViewProfileLink: {\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: \"15px\",\r\n \"white-space\": \"nowrap\",\r\n \"&&&\": {\r\n color: \"currentColor\"\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const FollowButtonSuperAppStyles = (config: DesignSystem) => ({\r\n followButtonSuperAppContainer: {\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const ReactionBreakdownSuperAppStyles = (config: DesignSystem) => ({\r\n reactionBreakdownSuperAppContainer: {\r\n \"& .cwt-reaction-breakdown-inner\": {\r\n \"& .cwt-tab-content\": {\r\n height: \"unset\",\r\n \"min-height\": \"280px\"\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DesignSystem, neutralFillActive, neutralFillStealthHover, neutralForegroundRest, neutralLayerCard, neutralOutlineActive } from \"@microsoft/fast-components-styles-msft\";\r\n\r\nexport const ReportMenuSuperAppStyles = (config: DesignSystem) => ({\r\n reportMenuSuperAppContainer: {\r\n \"max-height\": \"75vh\",\r\n \"max-width\": \"100vw\",\r\n width: \"500px\",\r\n height: \"100%\",\r\n \"font-size\": \"16px\",\r\n background: neutralFillActive,\r\n \"border-radius\": \"12px 12px 0 0\",\r\n margin: \"0\",\r\n \"padding-top\": \"0 !important\",\r\n \"padding-bottom\": \"70px !important\",\r\n \"min-height\": \"450px\",\r\n\r\n \"& .cwt-menu-header\": {\r\n padding: \"20px 27px\",\r\n \"border-bottom\": \"1px solid\",\r\n \"border-color\": neutralOutlineActive,\r\n background: neutralLayerCard,\r\n \"margin-bottom\": \"24px\",\r\n position: \"sticky\",\r\n top: \"0\",\r\n \"font-weight\": \"bold\",\r\n\r\n \"& .cwt-icon-label\": {\r\n \"font-size\": \"22px\",\r\n color: neutralForegroundRest,\r\n padding: \"0\"\r\n }\r\n },\r\n\r\n \"& li\": {\r\n cursor: \"pointer\",\r\n padding: \"14px 24px !important\",\r\n background: neutralLayerCard,\r\n \"font-size\": \"16px\",\r\n \"line-height\": \"20px\",\r\n\r\n \"&:hover\": {\r\n background: neutralFillStealthHover\r\n }\r\n }\r\n }\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\nexport function dispatchBridgeEvent(bridgeEventName, data = {}) {\r\n try {\r\n document.dispatchEvent(new CustomEvent(bridgeEventName, {detail: {eventName: bridgeEventName, data: data}}));\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n}\r\n\r\nexport const BridgeEventNames = {\r\n signInClicked: \"sign-in-clicked\",\r\n saveCachedMyReaction: \"save-cached-my-reaction\",\r\n openPopup: \"open-popup\",\r\n closePopup: \"close-popup\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport function fetchSignalR(callback: () => void) {\r\n const url = \"https://assets.msn.com/labs/views/CommentWidget/js/signalr.min.js\";\r\n const id = \"signalR-jssdk\";\r\n fetchScript(url, id, callback);\r\n}\r\n\r\nexport async function fetchBlobClient(): Promise {\r\n const url = \"https://assets.msn.com/labs/views/CommentWidget/js/azure-storage.blob.min.js\";\r\n const id = \"azure-storage-blob-jssdk\";\r\n return new Promise((res, rej) => {\r\n if (window.AzureStorage) {\r\n return res(window.AzureStorage);\r\n }\r\n fetchScript(url, id, () => {\r\n if (window.AzureStorage) {\r\n return res(window.AzureStorage);\r\n }\r\n return rej();\r\n });\r\n });\r\n}\r\n\r\nfunction fetchScript(url: string, id: string, callback: () => void) {\r\n const d = document;\r\n const s = \"script\";\r\n if (!d.getElementById(id)) {\r\n const fjs = d.getElementsByTagName(s)[0];\r\n const js = d.createElement(s) as HTMLScriptElement; js.id = id;\r\n js.src = url;\r\n js.onload = callback;\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }\r\n}\r\n\r\nexport interface AzureStorage {\r\n Blob: Blob;\r\n}\r\n\r\nexport interface Blob {\r\n createBlobServiceWithSas: (accountUrl: string, token: string) => BlobService;\r\n}\r\n\r\nexport interface BlobService {\r\n createBlockBlobFromBrowserFile: (container: string, blobName: string, file: any, callback: (error, result, response) => void) => void;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialService } from \"@msnews/social-data-service\";\r\nimport { fetchSignalR } from \"./fetchScripts\";\r\n\r\nexport interface SignalRMessage {\r\n type: string;\r\n data: any;\r\n}\r\n\r\nexport class WebSockets {\r\n private static signalRConnection: any;\r\n private static signalRHub: string;\r\n\r\n public static async open(hubName: string, onNewMessage: (message: SignalRMessage) => void, fetching = false) {\r\n if (WebSockets.signalRHub === hubName) {\r\n return;\r\n }\r\n\r\n if (window.signalR) {\r\n WebSockets.signalRHub = hubName;\r\n const info = await SocialService.getSignalRConnectionInfo(hubName);\r\n info.accessToken = info.accessToken || info.accessKey;\r\n info.url = info.url || info.endpoint;\r\n\r\n const options = {\r\n accessTokenFactory: () => info.accessToken\r\n };\r\n\r\n const connection = new window.signalR.HubConnectionBuilder()\r\n .withUrl(info.url, options)\r\n .configureLogging(window.signalR.LogLevel.Information)\r\n .build();\r\n\r\n connection.on(\"newMessage\", onNewMessage);\r\n\r\n if (WebSockets.signalRConnection) {\r\n WebSockets.signalRConnection.stop();\r\n }\r\n WebSockets.signalRConnection = connection;\r\n WebSockets.signalRConnection.start()\r\n .catch();\r\n\r\n return this.get();\r\n } else if (!fetching) {\r\n // set fetching=true to make sure we don't enter infinite recursion if script fails to load\r\n fetchSignalR(WebSockets.open.bind(this, hubName, onNewMessage, true));\r\n }\r\n }\r\n public static close() {\r\n if (WebSockets.signalRConnection) {\r\n WebSockets.signalRConnection.stop();\r\n WebSockets.signalRConnection = undefined;\r\n WebSockets.signalRHub = undefined;\r\n }\r\n }\r\n\r\n public static get() {\r\n return { connection: WebSockets.signalRConnection, hub: WebSockets.signalRHub };\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\n\r\nclass AppErrorLogger {\r\n public onAppError: ((AppError) => void) = undefined;\r\n\r\n public log(error: AppError): void {\r\n if (this.onAppError) {\r\n try {\r\n this.onAppError(error);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n }\r\n\r\n public setOnAppError(onAppError: ((AppError) => void)): void {\r\n this.onAppError = onAppError;\r\n }\r\n}\r\n\r\nexport const appErrorLogger = new AppErrorLogger();","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Comment } from \"@msnews/social-data-service\";\r\n\r\nexport function commentExists(commentList: Array, commentId) {\r\n return commentList && commentList.find(comment => {\r\n return comment.id === commentId || (comment.replies && comment.replies.find(reply => {\r\n return reply.id === commentId;\r\n }));\r\n });\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const enums = {\r\n selectPpeParameter: \"oneservice_enable_ppe\",\r\n externalUrls: {\r\n api: \"https://api.msn.com/community/\",\r\n ppeApi: \"https://ppe-api.msn.com/community/\",\r\n guidelinePage: \"https://www.msn.com/en-us/community/guideline\",\r\n profilePage: \"https://www.msn.com/en-us/community/profile/\",\r\n privacySettings: \"https://www.msn.com/en-us/settings\",\r\n profileSettings: \"https://account.microsoft.com/profile\",\r\n feedbackForm: \"https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR-V3gf69zQlBm1dJVuXA8mtURVI4UlFHMDRIR0VCWDFWNUQyQU5HVzJJQi4u\",\r\n moderationEmail: \"Appealsprocessor@microsoft.com\",\r\n newPost: \"https://www.msn.com/en-us/community/post/new\"\r\n },\r\n userStateType: {\r\n existingUser: \"existingUser\",\r\n anonymous: \"anonymous\",\r\n newUser: \"newUser\"\r\n },\r\n userNameStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAvatarStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAgeGroup: {\r\n under18: \"Under18\",\r\n above18: \"Above18\"\r\n },\r\n activityType: {\r\n follow: \"Follow\",\r\n reply: \"Reply\",\r\n reaction: \"Reaction\",\r\n badge: \"Achievement\",\r\n moderation: \"Moderation\",\r\n commentDeleteAlert: \"CommentDeleteAlert\",\r\n profileBannedAlert: \"ProfileBannedAlert\",\r\n profileErrorAlert: \"ProfileErrorAlert\"\r\n },\r\n moderationErrorType: {\r\n takedown: \"Takedown\",\r\n ban: \"Ban\",\r\n notAllowName: \"NotAllowName\",\r\n notAllowPicture: \"NotAllowPicture\",\r\n approveUserAppeal: \"ApproveUserAppeal\",\r\n rejectUserAppeal: \"RejectUserAppeal\",\r\n approveProfilePicAppeal: \"ApproveProfilePicAppeal\",\r\n rejectProfilePicAppeal: \"RejectProfilePicAppeal\",\r\n approveCommentAppeal: \"ApproveCommentAppeal\",\r\n rejectCommentAppeal: \"RejectCommentAppeal\"\r\n },\r\n visibleStatusType: {\r\n Normal: \"Normal\",\r\n DeletedByUser: \"DeletedByUser\",\r\n DeletedByAI: \"DeletedByAI\",\r\n DeletedByHI: \"DeletedByHI\",\r\n InReview: \"InReview\"\r\n },\r\n visibleStatusMap: {\r\n DeletedByUser: \"VisibleStatusDeletedByUser\",\r\n DeletedByAI: \"VisibleStatusDeletedByAI\",\r\n DeletedByHI: \"VisibleStatusDeletedByHI\",\r\n InReview: \"VisibleStatusInReview\",\r\n Default: \"VisibleStatusOther\"\r\n },\r\n commentReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Copyright: \"ReportOptCopyright\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n userNameReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n userPictureReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Copyright: \"ReportOptCopyright\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Nudity: \"ReportOptNudity\",\r\n NonConsensualIntimateImagery: \"ReportOptNonConsensualIntimateImagery\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n reactionOrder: [\r\n \"like\", \"love\", \"surprised\", \"thinking\", \"sad\", \"angry\"\r\n ],\r\n profileReportItemMap: {\r\n UserName: \"ReportUserName\",\r\n ProfilePicture: \"ReportProfilePicture\"\r\n },\r\n profilePageEmptyStates: {\r\n NoUser: \"NoUser\",\r\n NotSocialUser: \"NotSocialUser\"\r\n },\r\n reactionIconMap: {\r\n like: \"EmojiLike\",\r\n love: \"EmojiHeart\",\r\n thinking: \"EmojiThinking\",\r\n surprised: \"EmojiSurprised\",\r\n sad: \"EmojiSad\",\r\n angry: \"EmojiAngry\"\r\n },\r\n reactions: {\r\n like: \"like\",\r\n love: \"love\",\r\n thinking: \"thinking\",\r\n surprised: \"surprised\",\r\n sad: \"sad\",\r\n angry: \"angry\"\r\n },\r\n responsiveLevels: {\r\n L0: \"cwtl-0\",\r\n L1: \"cwtl-1\",\r\n L2: \"cwtl-2\",\r\n MobilePopup: \"cwt-mobile-popup\"\r\n },\r\n newCommentErrorCodeMap: {\r\n 400: \"NewPostDeniedMsg\",\r\n 403: \"NewPostSessionExpiredMsg\",\r\n 500: \"NewPostWentWrongMsg\",\r\n bodyTooLong: \"NewPostTooLongMsg\",\r\n other: \"NewPostWentWrongMsg\",\r\n 0: \"NewPostWentWrongMsg\",\r\n 1: \"NewPostSessionExpiredMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 6: \"NewPostWentWrongMsg\",\r\n 7: \"NewPostWentWrongMsg\",\r\n 8: \"NewPostWentWrongMsg\",\r\n 9: \"NewPostWentWrongMsg\",\r\n 10: \"NewPostWentWrongMsg\",\r\n 11: \"NewPostWentWrongMsg\",\r\n 12: \"NewPostTooManyCommentsMsg\",\r\n 20: \"NewPostTooLongMsg\",\r\n 21: \"NewPostMentionMsg\",\r\n 22: \"NewPostWentWrongMsg\",\r\n 23: \"NewPostWentWrongMsg\",\r\n 24: \"NewPostDeniedMsg\",\r\n 25: \"NewPostWentWrongMsg\",\r\n 26: \"NewPostWentWrongMsg\",\r\n 27: \"NewPostWentWrongMsg\",\r\n 28: \"NewPostDeniedMsg\",\r\n 29: \"NewPostDeniedMsg\",\r\n 30: \"NewPostDeniedMsg\",\r\n 31: \"NewPostDeniedMsg\",\r\n 32: {\r\n 1: \"NewPostDuplicatedMsg\",\r\n 2: \"NewPostDeniedMsg\",\r\n 3: \"NewPostDeniedMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 5: \"NewPostDeniedMsg\",\r\n 6: \"NewPostDeniedMsg\",\r\n 7: \"NewPostDeniedMsg\",\r\n 8: \"NewPostDeniedMsg\",\r\n 9: \"NewPostDeniedMsg\",\r\n 10: \"NewPostDeniedMsg\",\r\n 11: \"NewPostDeniedMsg\",\r\n 12: \"NewPostDeniedMsg\",\r\n 13: \"NewPostDeniedMsg\",\r\n 14: \"NewPostDeniedMsg\",\r\n 15: \"NewPostDeniedMsg\",\r\n 16: \"NewPostDeniedMsg\",\r\n 17: \"NewPostLanguageErrorMsg\",\r\n 18: \"NewPostURLMsg\"\r\n }\r\n\r\n },\r\n commentsStatusType: {\r\n zero: 0,\r\n minimal: 1,\r\n expanded: 2,\r\n notDetermined: 3\r\n },\r\n theme: {\r\n default: {\r\n name: \"default\",\r\n disabledComponents: []\r\n },\r\n superappBase: {\r\n name: \"superapp\",\r\n disabledComponents: []\r\n },\r\n windowsBase: {\r\n name: \"windows\",\r\n disabledComponents: []\r\n },\r\n superappEmbed: {\r\n name: \"superapp-embed\",\r\n disabledComponents: [\"profilepage\", \"guidelinepage\", \"articlepage\", \"multiloginpage\", \"reactionbreakdowncomment\", \"reactionbreakdowncontent\", \"onboardingpage\", \"onboardingthirdpartypage\", \"onboardingunderagepage\", \"notificationtray\", \"reportmenu\", \"profilereportmenu\", \"copyrightform\", \"trademarkform\"]\r\n },\r\n superappFullpage: {\r\n name: \"superapp-fullpage\",\r\n disabledComponents: [\"profilepage\", \"guidelinepage\", \"articlepage\", \"multiloginpage\", \"onboardingthirdpartypage\", \"notificationtray\"]\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\nexport function contentIdKey(cmsId: string, market: string): string {\r\n return `${cmsId}_${market}`;\r\n}\r\n\r\nexport function selectContentId(contentIds: { [id: string]: string }, cmsId: string, market: string): string {\r\n const key = contentIdKey(cmsId, market);\r\n const contentId = contentIds && contentIds[key];\r\n\r\n if (contentId) {\r\n return contentId;\r\n } else {\r\n logger.log(\"Content id doesn't exist, falling back to key `${cmsId}_${market}`\");\r\n return key;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n AppError,\r\n SocialExperiencePublisherFollowUnfollowError,\r\n SocialExperiencePublisherIsFollowedFetchError,\r\n SocialExperienceReducerIncorrectArgumentError,\r\n logger\r\n} from \"@msnews/diagnostics\";\r\nimport { BridgeEventNames, dispatchBridgeEvent } from \"./SocialData.bridge\";\r\nimport { Content, ItemTypes, SocialService, SocialServiceMapper, TypingUpdates, TypingUser, User, getParameter } from \"@msnews/social-data-service\";\r\nimport { GradientOverlayData, PublisherSubscribeFollowButtonData, SocialDataState } from \"./SocialData.state\";\r\nimport { PublisherActions, PublisherServiceClient } from \"@msnews/publishers-service-client\";\r\nimport { SignalRMessage, WebSockets } from \"./utils/webSockets\";\r\n\r\nimport { DataConnector } from \"@msnews/experiences-redux\";\r\nimport { SocialDataActions } from \"./SocialData.actions\";\r\nimport { appErrorLogger } from \"./utils/AppErrorLogger\";\r\nimport { commentExists } from \"./utils/parseState\";\r\nimport { enums } from \"./utils/enums\";\r\nimport { isComponentDisabled } from \"./utils/themeHelpers\";\r\nimport { selectContentId } from \"./utils/contentIdKey\";\r\n\r\ndeclare global {\r\n interface Window {\r\n signalR: any;\r\n AzureStorage: any;\r\n ReactNativeWebView: any;\r\n }\r\n}\r\n\r\n/**\r\n * The connector for the SocialData Experience.\r\n */\r\nexport class SocialDataConnector extends DataConnector {\r\n private publisherServiceClient?: PublisherServiceClient;\r\n\r\n public getSocialBarConnectorFunctionsWithStateBindings() {\r\n const state = this.getCurrentState() as SocialDataState;\r\n return {\r\n checkAndLogReducerError: this.checkAndLogReducerError.bind(this),\r\n styleConnector: {\r\n updateResponsiveClass: this.updateResponsiveClass.bind(this)\r\n },\r\n socialBarConnector: {\r\n onSocialBarComponentConnected: this.onSocialBarComponentConnected.bind(this, state.me),\r\n sendContentReaction: this.sendContentReaction.bind(this)\r\n },\r\n popupConnector: {\r\n openPopup: this.openPopup.bind(this, state.theme),\r\n closePopup: this.closePopup.bind(this, state.popup)\r\n }\r\n };\r\n }\r\n\r\n public getSocialCommentConnectorFunctionsWithStateBindings() {\r\n const state = this.getCurrentState() as SocialDataState;\r\n return {\r\n checkAndLogReducerError: this.checkAndLogReducerError.bind(this),\r\n styleConnector: {\r\n updateResponsiveClass: this.updateResponsiveClass.bind(this)\r\n },\r\n commentConnector: {\r\n onCommentComponentConnect: this.onCommentComponentConnect.bind(this, state.me),\r\n submitComment: this.submitComment.bind(this, state.me, state.theme),\r\n deleteComment: this.deleteComment.bind(this, state.me, state.theme),\r\n appealComment: this.appealComment.bind(this),\r\n sendCommentReaction: this.sendCommentReaction.bind(this),\r\n showMoreComments: this.showMoreComments.bind(this),\r\n showMoreReplies: this.showMoreReplies.bind(this),\r\n loadMoreComments: this.loadMoreComments.bind(this),\r\n loadPreviousComments: this.loadPreviousComments.bind(this),\r\n onSortTypeChanged: this.onSortTypeChanged.bind(this),\r\n updateTypers: this.updateTypers.bind(this),\r\n broadcastAsTyping: this.broadcastAsTyping.bind(this, state.me),\r\n listenForTypers: this.listenForTypers.bind(this)\r\n },\r\n usersConnector: {\r\n fetchUser: this.fetchUser.bind(this, state.users),\r\n fetchIsUserFollowed: this.fetchIsUserFollowed.bind(this, state.users, state.me),\r\n followUser: this.followUser.bind(this, state.users, state.me, state.theme),\r\n createUser: this.createUser.bind(this, state.me),\r\n fetchMe: this.fetchMe.bind(this),\r\n appealMe: this.appealMe.bind(this),\r\n appealMyPicture: this.appealMyPicture.bind(this),\r\n fetchActivities: this.fetchActivities.bind(this, state.activities),\r\n fetchNotifications: this.fetchNotifications.bind(this, state.me),\r\n markActivityAsRead: this.markActivityAsRead.bind(this)\r\n },\r\n popupConnector: {\r\n openPopup: this.openPopup.bind(this, state.theme),\r\n closePopup: this.closePopup.bind(this, state.popup)\r\n }\r\n };\r\n }\r\n\r\n public getSocialProfileConnectorFunctionsWithStateBindings() {\r\n const state = this.getCurrentState() as SocialDataState;\r\n return {\r\n checkAndLogReducerError: this.checkAndLogReducerError.bind(this),\r\n styleConnector: {\r\n updateResponsiveClass: this.updateResponsiveClass.bind(this)\r\n },\r\n profileConnector: {\r\n onProfilePageComponentConnected: this.onProfilePageComponentConnected.bind(this, state.users, state.me),\r\n fetchUserFollowers: this.fetchUserFollowers.bind(this, state.users),\r\n fetchUserFollowings: this.fetchUserFollowings.bind(this, state.users),\r\n fetchUserComments: this.fetchUserComments.bind(this, state.users),\r\n setProfilePrivate: this.setProfilePrivate.bind(this),\r\n deleteMyData: this.deleteMyData.bind(this, state.me, state.users),\r\n initializePublisherServiceClient: this.initializePublisherServiceClient.bind(this),\r\n followPublisher: this.followPublisher.bind(this),\r\n getPublisherIsFollowing: this.getPublisherIsFollowing.bind(this)\r\n },\r\n commentConnector: {\r\n appealComment: this.appealComment.bind(this),\r\n deleteComment: this.deleteComment.bind(this, state.me, state.theme)\r\n },\r\n usersConnector: {\r\n fetchUser: this.fetchUser.bind(this, state.users),\r\n fetchIsUserFollowed: this.fetchIsUserFollowed.bind(this, state.users, state.me),\r\n followUser: this.followUser.bind(this, state.users, state.me, state.theme),\r\n createUser: this.createUser.bind(this, state.me),\r\n fetchMe: this.fetchMe.bind(this),\r\n appealMe: this.appealMe.bind(this),\r\n appealMyPicture: this.appealMyPicture.bind(this),\r\n fetchActivities: this.fetchActivities.bind(this, state.activities),\r\n fetchNotifications: this.fetchNotifications.bind(this, state.me),\r\n markActivityAsRead: this.markActivityAsRead.bind(this)\r\n },\r\n popupConnector: {\r\n openPopup: this.openPopup.bind(this, state.theme),\r\n closePopup: this.closePopup.bind(this, state.popup)\r\n }\r\n };\r\n }\r\n\r\n public getSocialConnectorFunctionsWithStateBindings() {\r\n const state = this.getCurrentState() as SocialDataState;\r\n return {\r\n checkAndLogReducerError: this.checkAndLogReducerError.bind(this),\r\n styleConnector: {\r\n updateResponsiveClass: this.updateResponsiveClass.bind(this)\r\n },\r\n profileConnector: {\r\n deleteMyData: this.deleteMyData.bind(this, state.me, state.users)\r\n },\r\n usersConnector: {\r\n fetchUser: this.fetchUser.bind(this, state.users),\r\n fetchIsUserFollowed: this.fetchIsUserFollowed.bind(this, state.users, state.me),\r\n followUser: this.followUser.bind(this, state.users, state.me, state.theme),\r\n createUser: this.createUser.bind(this, state.me),\r\n fetchMe: this.fetchMe.bind(this),\r\n appealMe: this.appealMe.bind(this),\r\n appealMyPicture: this.appealMyPicture.bind(this),\r\n fetchActivities: this.fetchActivities.bind(this, state.activities),\r\n fetchNotifications: this.fetchNotifications.bind(this, state.me),\r\n markActivityAsRead: this.markActivityAsRead.bind(this)\r\n },\r\n reactionBreakdownConnector: {\r\n onReactionBreakdownComponentConnected: this.onReactionBreakdownComponentConnected.bind(this, state.me),\r\n onReactionBreakdownComponentDisconnected: this.onReactionBreakdownComponentDisconnected.bind(this)\r\n },\r\n popupConnector: {\r\n openPopup: this.openPopup.bind(this, state.theme),\r\n closePopup: this.closePopup.bind(this, state.popup)\r\n },\r\n publisherSubscribeFollowButtonConnector: {\r\n initializePublisherServiceClient: this.initializePublisherServiceClient.bind(this),\r\n followPublisher: this.followPublisher.bind(this),\r\n getPublisherIsFollowing: this.getPublisherIsFollowing.bind(this)\r\n }\r\n };\r\n }\r\n\r\n public async setTheme(theme?: string) {\r\n SocialDataActions.setTheme.getActionSender(this).send(theme);\r\n }\r\n\r\n public async setGradientOverlayData(data: GradientOverlayData) {\r\n SocialDataActions.setGradientOverlayData.getActionSender(this).send(data);\r\n }\r\n\r\n public async setPublisherSubscribeFollowButtonData(data: PublisherSubscribeFollowButtonData) {\r\n SocialDataActions.setPublisherSubscribeFollowButtonData.getActionSender(this).send(data);\r\n }\r\n\r\n public async onCommentComponentConnect(me, contentInfo, specificCommentId?) {\r\n if (!me) {\r\n this.fetchMe();\r\n }\r\n\r\n const content = await this.getAndUpdateContent(contentInfo);\r\n if (content.notCreated) {\r\n return;\r\n }\r\n\r\n if (specificCommentId) {\r\n this.loadSpecificComment(content.id, specificCommentId).catch(\r\n () => SocialDataActions.resetSpecificCommentId.getActionSender(this).send()\r\n );\r\n } else {\r\n this.loadAllComments(content.id, contentInfo);\r\n }\r\n\r\n return content;\r\n }\r\n\r\n public async loadSpecificComment(contentId, commentId) {\r\n const comment = await SocialService.getCommentById(commentId);\r\n if (!comment || comment.contentId !== contentId) {\r\n throw new Error(\"The specific comment doesn't belong to this content\");\r\n }\r\n const isReply = comment.parentId;\r\n\r\n if (isReply) {\r\n const commentsBefore = await SocialService.getCommentsByAnchorCommentId(comment.id, {top: 2, orderBy: \"time desc\"});\r\n const commentsAfter = await SocialService.getCommentsByAnchorCommentId(comment.id, {top: 2, orderBy: \"time asc\"});\r\n const replies = {\r\n ...{...commentsBefore, hasPrevious: commentsBefore.hasMore}, // since it is reversed\r\n list: commentsBefore.list.reverse().concat(commentsAfter.list.slice(1)), // get rid of one of the anchor comments\r\n hasMore: commentsAfter.hasMore\r\n };\r\n\r\n const parentAndItsAround = await SocialService.getCommentsByAnchorCommentId(comment.parentId, {top: 1, orderBy: \"rating\"});\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, parentAndItsAround, false);\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, replies, false, comment.parentId);\r\n\r\n this.updateCommentRatings(contentId, parentAndItsAround.list.concat(replies.list));\r\n } else {\r\n const commentsBefore = await SocialService.getCommentsByAnchorCommentId(comment.id, {top: 2, orderBy: \"rating asc\"});\r\n const commentsAfter = await SocialService.getCommentsByAnchorCommentId(comment.id, {top: 2, orderBy: \"rating desc\"});\r\n const commentAndItsAround = {\r\n ...{...commentsBefore, hasPrevious: commentsBefore.hasMore}, // since it is reversed\r\n list: commentsBefore.list.reverse().concat(commentsAfter.list.slice(1)), // get rid of one of the anchor comments\r\n hasMore: commentsAfter.hasMore\r\n };\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, commentAndItsAround, false);\r\n\r\n this.updateCommentRatings(contentId, commentAndItsAround.list);\r\n }\r\n\r\n }\r\n\r\n public async loadAllComments(contentId, contentInfo) {\r\n const topCommentsToFetchCount = contentInfo.top || 2;\r\n const skippedCommentsCount = contentInfo.skip || 0;\r\n\r\n SocialService.getCommentsByContentId(contentId, {top: topCommentsToFetchCount, skip: skippedCommentsCount}).then(comments => {\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, comments, false);\r\n this.updateCommentRatings(contentId, comments.list);\r\n });\r\n }\r\n\r\n public showMoreComments(contentId, top, skip, sortType) {\r\n SocialService.getCommentsByContentId(contentId, {top, skip, sortType})\r\n .then(comments => {\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, comments, true);\r\n this.updateCommentRatings(contentId, comments.list);\r\n });\r\n }\r\n\r\n public onSortTypeChanged(contentId, top, sortType) {\r\n const params = {top, skip: 0, sortType};\r\n SocialService.getCommentsByContentId(contentId, params)\r\n .then(comments => {\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, comments, false);\r\n this.updateCommentRatings(contentId, comments.list);\r\n });\r\n SocialDataActions.resetSpecificCommentId.getActionSender(this).send();\r\n }\r\n\r\n public loadCommentsUsingAnchorComment(contentId, anchorCommentId, loadPrevious: boolean, parentCommentId?) {\r\n const isReply = parentCommentId;\r\n const orderBy = isReply ? \"time\" : \"rating\";\r\n // 'previous' definition of time and rating ordering is different since one of them is ascending and the other is descending\r\n const asc = orderBy === \"time\" ? !loadPrevious : loadPrevious;\r\n const prepending = (orderBy === \"time\" && !asc) || (orderBy === \"rating\" && asc);\r\n SocialService.getCommentsByAnchorCommentId(anchorCommentId, {top: 5, orderBy: `${orderBy} ${asc ? \"asc\" : \"desc\"}`})\r\n .then(comments => {\r\n let commentList = comments.list.slice(1); // get rid of anchor comment, since it is already loaded\r\n // `hasMore` and `hasPrevious` is meaningful only in the direction we are looking for\r\n // because starting point is the anchor comment\r\n if (prepending) {\r\n commentList = commentList.reverse();\r\n comments.hasPrevious = comments.hasMore;\r\n comments.hasMore = undefined;\r\n } else {\r\n comments.hasPrevious = undefined;\r\n }\r\n comments.list = commentList;\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, comments, true, parentCommentId, prepending);\r\n this.updateCommentRatings(contentId, comments.list);\r\n });\r\n }\r\n\r\n public loadMoreComments(contentId, lastCommentId, parentCommentId?) {\r\n this.loadCommentsUsingAnchorComment(contentId, lastCommentId, false, parentCommentId);\r\n }\r\n\r\n public loadPreviousComments(contentId, firstCommentId, parentCommentId?) {\r\n this.loadCommentsUsingAnchorComment(contentId, firstCommentId, true, parentCommentId);\r\n }\r\n\r\n public showMoreReplies(contentId, commentId, top, skip, orderBy) {\r\n const params = {top, skip, orderBy};\r\n\r\n SocialService.getCommentsByParentId(commentId, params)\r\n .then(comments => {\r\n SocialDataActions.insertComments.getActionSender(this).send(contentId, comments, true, commentId);\r\n this.updateCommentRatings(contentId, comments.list);\r\n });\r\n }\r\n\r\n public updateCommentRatings(contentId, commentList) {\r\n commentList.forEach(comment => {\r\n SocialService.getRating(ItemTypes.comments, comment.id)\r\n .then((rating) => {\r\n SocialDataActions.updateCommentRating.getActionSender(this).send(contentId, comment.id, rating, false);\r\n });\r\n });\r\n }\r\n\r\n public handleUserLoginFromState(me, theme): boolean {\r\n if (!me) {\r\n return false;\r\n }\r\n if (me.state == enums.userStateType.anonymous) {\r\n this.openPopup(theme, \"multiLoginPage\");\r\n return false;\r\n } else if (me.state == enums.userStateType.newUser) {\r\n this.openPopup(theme, \"onboardingPage\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n async submitComment(me, theme, content, body, commentParentId, commentMentionReplyId) {\r\n // If comment value is empty string then terminate\r\n if (body.trim().length < 1) {\r\n return;\r\n }\r\n\r\n if (!this.handleUserLoginFromState(me, theme)) {\r\n return;\r\n }\r\n\r\n try {\r\n let responseComment;\r\n await SocialService\r\n .postComment(content.id, me.id, body, commentParentId, commentMentionReplyId)\r\n .then(response => Object.assign(response, { user: me }))\r\n .then(comment => {\r\n responseComment = comment;\r\n SocialDataActions.insertComment.getActionSender(this).send(content.id, comment, commentParentId, true);\r\n const hubName = (comment as any).contentId;\r\n SocialService.broadcastCommentNotification(hubName, (comment as any).id, commentParentId);\r\n })\r\n .catch(response => {\r\n try {\r\n if (response) {\r\n responseComment = { errorCode: response.code, errorSubCodes: response.subCodes };\r\n }\r\n } catch (e) {\r\n responseComment = { errorCode: 0 };\r\n }\r\n });\r\n return responseComment;\r\n } catch (error) {\r\n logger.logError(`Error: comment post failed => ${JSON.stringify(error)}`);\r\n return false;\r\n }\r\n }\r\n\r\n public deleteComment(me, theme, commentId, parentId, userId) {\r\n if (!this.handleUserLoginFromState(me, theme)) {\r\n return;\r\n }\r\n\r\n SocialService.deleteComment(commentId)\r\n .then(_ => {\r\n SocialDataActions.deleteUserComment.getActionSender(this).send(userId, commentId, parentId);\r\n });\r\n }\r\n\r\n public sendCommentReaction(comment, rateValue, reset) {\r\n if (reset) {\r\n SocialService.resetRating(ItemTypes.comments, comment.id)\r\n .then(_ => {\r\n SocialDataActions.updateCommentRating.getActionSender(this).send(comment.contentId, comment.id, undefined, true);\r\n });\r\n } else {\r\n SocialService.rate(ItemTypes.comments, comment.id, rateValue, false)\r\n .then(rating => {\r\n SocialDataActions.updateCommentRating.getActionSender(this).send(comment.contentId, comment.id, rating, true);\r\n });\r\n }\r\n }\r\n\r\n public async sendContentReaction(content, rateValue, reset) {\r\n if (reset) {\r\n SocialService.resetRating(ItemTypes.contents, content.id, window.ReactNativeWebView && this.saveReactionInSuperAppLocalStorage)\r\n .then(_ => {\r\n SocialDataActions.updateContentRating.getActionSender(this).send(content.id, undefined);\r\n });\r\n } else {\r\n SocialService.rate(ItemTypes.contents, content.id, rateValue, false, window.ReactNativeWebView && this.saveReactionInSuperAppLocalStorage)\r\n .then(rating => {\r\n SocialDataActions.updateContentRating.getActionSender(this).send(content.id, rating);\r\n });\r\n }\r\n }\r\n\r\n public async getContent(contentInfo) {\r\n const { id: cmsId, market } = contentInfo;\r\n let localContent = this.getLocalContent(cmsId, market);\r\n if (localContent) {\r\n return localContent;\r\n }\r\n\r\n const content = await SocialService.getContentById(cmsId, market);\r\n\r\n // Concurrency control\r\n localContent = this.getLocalContent(cmsId, market);\r\n if (localContent) {\r\n return localContent;\r\n }\r\n SocialDataActions.setContent.getActionSender(this).send(content, content.id || selectContentId({}, cmsId, market));\r\n SocialDataActions.mapCmsIdToContentId.getActionSender(this).send(cmsId, market, content.id || selectContentId({}, cmsId, market));\r\n return content;\r\n }\r\n\r\n private getLocalContent(cmsId: string, market: string) {\r\n const state: SocialDataState = this.getCurrentState();\r\n return state && state.contents && state.contents[selectContentId({}, cmsId, market)];\r\n }\r\n\r\n public async getAndUpdateContent(contentInfo) {\r\n const content = await this.getContent(contentInfo);\r\n if (!content.notCreated) {\r\n SocialService.getRating(ItemTypes.contents, content.id).then(rating => {\r\n SocialDataActions.updateContent.getActionSender(this).send(content.id, {rating});\r\n });\r\n }\r\n return content;\r\n }\r\n\r\n public fetchUser(users, userId, force=false) {\r\n const user = users && users[userId];\r\n if (!force && user && (user.isFetched || user.isFetching)) { return Promise.resolve(); }\r\n\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, { isFetching: true });\r\n return SocialService.getUserById(userId)\r\n .then(user => {\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, { data: user, isFetched: true, isFetching: false });\r\n })\r\n .catch(e => SocialDataActions.updateUser.getActionSender(this).send(userId, { isFetching: false }));\r\n }\r\n\r\n public fetchIsUserFollowed(users, me, userId, force=false) {\r\n const user = users && users[userId];\r\n if (!force && user && (user.isFollowingFetched || user.isFollowingFetching)) { return Promise.resolve(); }\r\n\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, { isFollowingFetching: true });\r\n return SocialService.getUserIsFollowed(me.id, userId)\r\n .then(result => {\r\n const newUser = { data: { isFollowing: result }, isFollowingFetched: true, isFollowingFetching: false };\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, newUser);\r\n })\r\n .catch(e => SocialDataActions.updateUser.getActionSender(this).send(userId, { isFollowingFetching: false }));\r\n }\r\n\r\n public async followUser(users, me, theme, userId, follow) {\r\n if (!this.handleUserLoginFromState(me, theme)) {\r\n return;\r\n }\r\n\r\n if (follow) {\r\n SocialService.followUser(me.id, userId)\r\n .then(_ => {\r\n const newUser = { data: { isFollowing: true,\r\n followers: users[userId].data.followers && {...users[userId].data.followers, list: users[userId].data.followers.list.concat(users[me.id].data)},\r\n followersCount: users[userId].data.followersCount + 1 }, isFollowingFetched: true, isFollowingFetching: false\r\n };\r\n const newMe = { data: {\r\n following: users[me.id].data.following && {...users[me.id].data.following, list: users[me.id].data.following.list.concat(users[userId].data)},\r\n followingCount: users[me.id].data.followingCount + 1 }, isFollowingFetched: true, isFollowingFetching: false\r\n };\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, newUser);\r\n SocialDataActions.updateUser.getActionSender(this).send(me.id, newMe);\r\n });\r\n } else {\r\n SocialService.unfollowUser(me.id, userId)\r\n .then(_ => {\r\n const newUser = { data: { isFollowing: false,\r\n followers: users[userId].data.followers && {...users[userId].data.followers, list: users[userId].data.followers.list.filter(x => x.id != users[me.id].data.id)},\r\n followersCount: users[userId].data.followersCount - 1 }, isFollowingFetched: true, isFollowingFetching: false };\r\n const newMe = { data: {\r\n following: users[me.id].data.following && {...users[me.id].data.following, list: users[me.id].data.following.list.filter(x => x.id != users[userId].data.id)},\r\n followingCount: users[me.id].data.followingCount - 1 }, isFollowingFetched: true, isFollowingFetching: false\r\n };\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, newUser);\r\n SocialDataActions.updateUser.getActionSender(this).send(me.id, newMe);\r\n });\r\n }\r\n }\r\n\r\n public async createUser(me) {\r\n let newUser = await SocialService.createUser();\r\n newUser = {...me, ...newUser};\r\n SocialDataActions.updateMe.getActionSender(this).send(newUser);\r\n }\r\n\r\n public async onSocialBarComponentConnected(me, contentInfo) {\r\n if (!me) {\r\n me = await this.fetchMe();\r\n }\r\n const content = await this.getContent(contentInfo);\r\n if (!content.notCreated) {\r\n const cachedMyReaction = getParameter(\"cachedMyReaction\");\r\n if (cachedMyReaction) {\r\n content.rating = cachedMyReaction;\r\n SocialDataActions.updateContent.getActionSender(this).send(content.id, {rating: cachedMyReaction});\r\n }\r\n SocialService.getFriendRatings(ItemTypes.contents, content.id).then(ratings => {\r\n this.processRatings(content.id, me, ratings, cachedMyReaction);\r\n });\r\n }\r\n return content;\r\n }\r\n\r\n public processRatings(contentId, me, ratings, cachedMyReaction) {\r\n if (!ratings || !ratings.items) {\r\n return;\r\n }\r\n const friendRatings = {};\r\n ratings.items.map(rating => {\r\n const userRecord = rating.links.find(x => x.type == \"User\");\r\n if (userRecord && userRecord.item) {\r\n SocialDataActions.updateUser.getActionSender(this).send(userRecord.item.id, { data: SocialServiceMapper.convertUser(userRecord.item), isFetched: true, isFetching: false });\r\n friendRatings[userRecord.item.id] = rating.subType.toLowerCase();\r\n }\r\n });\r\n if (!cachedMyReaction && me && me.id in friendRatings) {\r\n SocialDataActions.updateContent.getActionSender(this).send(contentId, {rating: friendRatings[me.id]});\r\n delete friendRatings[me.id];\r\n }\r\n if (!cachedMyReaction && me && me.id) {\r\n const myAnonReaction = ratings.items.find(x => x.sourceId == me.id);\r\n if (myAnonReaction && myAnonReaction.subType) {\r\n SocialDataActions.updateContent.getActionSender(this).send(contentId, {rating: myAnonReaction.subType.toLowerCase()});\r\n }\r\n }\r\n\r\n SocialDataActions.updateContent.getActionSender(this).send(contentId, {friendRatings});\r\n }\r\n\r\n public async fetchUserFollowers(users, userId) {\r\n const followers = users && users[userId] && users[userId].data && users[userId].data.followers;\r\n if (followers && followers.hasMore === false) { return; }\r\n return SocialService.getFollowersByUserId(userId, 10, (followers && followers.list) ? followers.list.length : 0)\r\n .then(followers => {\r\n return SocialDataActions.updateUserFollowers.getActionSender(this).send(userId, followers);\r\n });\r\n }\r\n\r\n public async fetchUserFollowings(users, userId) {\r\n const following = users && users[userId] && users[userId].data && users[userId].data.following;\r\n if (following && following.hasMore === false) { return; }\r\n return SocialService.getFollowingsByUserId(userId, 10, (following && following.list) ? following.list.length : 0)\r\n .then(following => {\r\n return SocialDataActions.updateUserFollowing.getActionSender(this).send(userId, following);\r\n });\r\n }\r\n\r\n public fetchUserComments(users, userId, reset, orderBy) {\r\n let skip = 0;\r\n if (!reset && users && users[userId] && users[userId].data && users[userId].data.comments && users[userId].data.comments.list) {\r\n skip = users[userId].data.comments.list.length;\r\n }\r\n return SocialService.getCommentsByUserId(userId, 10, skip, orderBy)\r\n .then(comments => {\r\n return SocialDataActions.updateUserComments.getActionSender(this).send(userId, comments, reset);\r\n });\r\n }\r\n\r\n public async fetchActivities(activities) {\r\n if (activities && activities.hasMore === false) { return; }\r\n return SocialService.getUserActivities(10, (activities && activities.list) ? activities.list.length : 0)\r\n .then(activities => {\r\n return SocialDataActions.updateActivities.getActionSender(this).send(activities);\r\n });\r\n }\r\n\r\n public async fetchNotifications(me) {\r\n return me && me.isSocialUser && SocialService.getUserNotifications()\r\n .then(notifications => {\r\n if (notifications && notifications.list && notifications.list.length > 0) {\r\n return SocialDataActions.updateNotifications.getActionSender(this).send(notifications);\r\n }\r\n });\r\n }\r\n\r\n public async markActivityAsRead(id, updateReduxStore = false) {\r\n return SocialService.updateUserActivityStatus(id, true)\r\n .then(_ => {\r\n if (updateReduxStore) {\r\n SocialDataActions.updateActivityStatus.getActionSender(this).send(id, true);\r\n }\r\n });\r\n }\r\n\r\n public async fetchMe(verify = false) {\r\n return new Promise((resolve, reject) => SocialService.fetchMe(verify).then((user) => {\r\n SocialDataActions.updateMe.getActionSender(this).send(user);\r\n resolve(user);\r\n }));\r\n }\r\n\r\n public async onReactionBreakdownComponentConnected(me, data) {\r\n if (!me) {\r\n this.fetchMe();\r\n }\r\n\r\n let reactions;\r\n if (data.commentId || data.contentId) {\r\n reactions = await SocialService.getRatingBreakdown(data.commentId ? ItemTypes.comments : ItemTypes.contents, data.commentId || data.contentId);\r\n } else {\r\n console.warn(\"Could not get reaction breakdown info. Missing input parameter; please provide commentId, contentId, pageUrl or canonicalUrl\");\r\n }\r\n\r\n const newItems = { };\r\n Object.keys(reactions.items).forEach(key => {\r\n newItems[key] = reactions.items[key].map(item => {\r\n const user = item.user;\r\n const userId = user.id;\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, { data: SocialServiceMapper.convertUser(user), isFetched: true, isFetching: false });\r\n const newItem = { ...item, userId };\r\n delete newItem.user;\r\n return newItem;\r\n });\r\n });\r\n reactions.items = newItems;\r\n SocialDataActions.setReactionBreakdown.getActionSender(this).send({reactions});\r\n }\r\n\r\n public async onReactionBreakdownComponentDisconnected() {\r\n const emptyReactions = {reactions: {reactionCounts: {all: 0, like: 0, love: 0, angry: 0, surprised: 0, thinking: 0, sad: 0}, items: { all: [], like: [], love: [], angry: [], surprised: [], thinking: [], sad: []}}};\r\n SocialDataActions.setReactionBreakdown.getActionSender(this).send(emptyReactions);\r\n }\r\n\r\n public async onProfilePageComponentConnected(users, me, userId) {\r\n if (!me) {\r\n me = await this.fetchMe();\r\n }\r\n\r\n const id = userId == \"me\" ? me.id : userId;\r\n\r\n SocialService.getUserProfile(id)\r\n .then(data => {\r\n SocialDataActions.updateUser.getActionSender(this).send(id, { data: data, isFetched: true, isFetching: false });\r\n });\r\n\r\n this.fetchIsUserFollowed(users, me, id);\r\n }\r\n\r\n public setProfilePrivate(userId, isPrivate) {\r\n SocialService.updateUserSettings(userId, isPrivate)\r\n .then(_ => {\r\n const data = {isPrivateProfile: isPrivate};\r\n SocialDataActions.updateUser.getActionSender(this).send(userId, { data: data });\r\n });\r\n }\r\n\r\n public openPopup(theme, moduleName, props?) {\r\n if (isComponentDisabled(theme, moduleName.toLowerCase())) {\r\n if (moduleName.toLowerCase() === \"multiloginpage\") {\r\n dispatchBridgeEvent(BridgeEventNames.signInClicked);\r\n } else {\r\n dispatchBridgeEvent(BridgeEventNames.openPopup, {component: moduleName.toLowerCase(), id: props && props.id, fullScreen: props && props.fullScreen || false});\r\n }\r\n } else {\r\n SocialDataActions.setPopup.getActionSender(this).send(moduleName, props);\r\n }\r\n }\r\n\r\n public closePopup(popup, props?) {\r\n if (popup && popup.moduleName) {\r\n SocialDataActions.setPopup.getActionSender(this).send(undefined, undefined);\r\n } else {\r\n // Do not close the report menu modal in order to get the copyright form open message from web view\r\n if (!(props && props.disableBridge)) {\r\n dispatchBridgeEvent(BridgeEventNames.closePopup, {refreshPage: (props && props.refreshPage) || false});\r\n }\r\n }\r\n }\r\n\r\n public async listenForTypers(id: string, market: string, content: Content) {\r\n const contentId = (content && content.id) || (id && market && id + \"_\" + market);\r\n if (contentId && (!content || !content.typingUpdates || !content.typingUpdates.hubName || content.typingUpdates.hubName !== contentId)) {\r\n SocialDataActions.recordSignalRHub.getActionSender(this).send(contentId);\r\n WebSockets.open(contentId, this.handleSignalRMessage.bind(this, contentId, id, market));\r\n }\r\n }\r\n\r\n public async handleSignalRMessage(contentId: string, id: string, market: string, message: SignalRMessage) {\r\n if (message.type === \"typing-notification\") {\r\n const typer: TypingUser = message.data;\r\n typer.lastTypingTime = Date.now();\r\n SocialDataActions.addTyper.getActionSender(this).send(typer, contentId, id, market);\r\n } else if (message.type === \"comment-notification\") {\r\n const state: SocialDataState = this.getCurrentState();\r\n const content = state && state.contents && state.contents[contentId];\r\n const { commentId } = message.data;\r\n const commentList = content.comments && content.comments.list;\r\n if (commentExists(commentList, commentId)) {\r\n // we've already loaded this comment\r\n return;\r\n }\r\n\r\n const newComment = await SocialService.getCommentById(commentId);\r\n if (!newComment) {\r\n // comment fetch failed\r\n return;\r\n }\r\n const { createdBy, contentId: commentContentId } = newComment;\r\n\r\n if (commentContentId !== contentId) {\r\n return;\r\n }\r\n // this comment is from the correct content\r\n\r\n const commentParentId = newComment.parentId;\r\n const parentComment = commentExists(commentList, commentParentId);\r\n if (commentParentId && !parentComment) {\r\n // parent comment isn't in the store, so we can't insert the new comment\r\n SocialDataActions.incrementReplyCount.getActionSender(this).send(contentId);\r\n return;\r\n }\r\n\r\n if (parentComment && parentComment.replies.length < parentComment.replyCount) {\r\n // we only want to increment the reply count because the whole reply list isn't expanded.\r\n SocialDataActions.incrementReplyCount.getActionSender(this).send(commentParentId);\r\n return;\r\n }\r\n\r\n if (!content || !content.id) {\r\n // no content info in store, fetch from api (should include new comment)\r\n await this.onCommentComponentConnect(state.me, { id: id, market: market });\r\n return;\r\n }\r\n if (!newComment.user) {\r\n await this.fetchUser(state.users, createdBy);\r\n const user = this.getCurrentState().users[createdBy];\r\n newComment.user = user.data;\r\n }\r\n SocialDataActions.insertComment.getActionSender(this).send(commentContentId, newComment, commentParentId);\r\n }\r\n }\r\n\r\n public isUpdateTypersChanged(expirationTime: number): boolean {\r\n const state: SocialDataState = this.getCurrentState();\r\n const contents = state.contents;\r\n for (const contentId in state.contents) {\r\n const typingUpdates: TypingUpdates = contents[contentId] && contents[contentId].typingUpdates || {typingUsers: {}} as TypingUpdates;\r\n const keysNeededToDelete = Object.keys(typingUpdates.typingUsers).filter(userId => typingUpdates.typingUsers[userId].lastTypingTime < expirationTime);\r\n if (keysNeededToDelete.length > 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public async updateTypers() {\r\n const expireTime: number = Date.now() - 5000;\r\n if (this.isUpdateTypersChanged(expireTime)) {\r\n SocialDataActions.updateTypers.getActionSender(this).send(expireTime);\r\n }\r\n }\r\n\r\n public broadcastAsTyping(me: User, id: string, market: string, content: Content) {\r\n const contentId = (content && content.id) || (id && market && id + \"_\" + market);\r\n if (contentId && me) {\r\n SocialService.broadcastTypingNotification(contentId, me.id, me.name, me.avatarUrl);\r\n }\r\n }\r\n\r\n public updateResponsiveClass(relativeClass) {\r\n SocialDataActions.updateResponsiveClass.getActionSender(this).send(relativeClass);\r\n }\r\n\r\n public deleteMyData(me, users, deletingData) {\r\n SocialService.deleteMyData(deletingData);\r\n let newMe = {...users[me.id].data};\r\n if (deletingData.comment) {\r\n newMe = {...newMe, postsCount: 0,\r\n commentSummary: {\r\n totalCount: 0,\r\n subCommentSummaries: []\r\n },\r\n comments: {\r\n list: [],\r\n asc: false,\r\n commentStatus: \"On\",\r\n hasMore: false,\r\n hasPrevious: true,\r\n moreCount: 0,\r\n skip: 0,\r\n top: 10,\r\n totalCount: 0\r\n }};\r\n } if (deletingData.reaction) {\r\n newMe = {...newMe, likesCount: 0, reactionsCount: 0,\r\n reactionSummary: {\r\n totalCount: 0,\r\n subReactionSummaries: []\r\n }};\r\n } if (deletingData.follow) {\r\n newMe.followers.list.forEach(user => {\r\n const id = user.id;\r\n const newUser = { data: { isFollowing: false } };\r\n SocialDataActions.updateUser.getActionSender(this).send(id, newUser);\r\n }),\r\n newMe = {...newMe, followingCount: 0,\r\n following: {\r\n list: []\r\n },\r\n followSummary: {\r\n totalCount: 0,\r\n subFollowSummaries: []\r\n }};\r\n } if (deletingData.activity) {\r\n SocialDataActions.deleteActivities.getActionSender(this).send();\r\n }\r\n SocialDataActions.updateUser.getActionSender(this).send(me.id,\r\n {data: newMe});\r\n }\r\n\r\n public appealComment(commentId: string, activityId: string) {\r\n SocialService.appealComment(commentId).then(_ => {\r\n this.appealActivity(activityId);\r\n });\r\n }\r\n\r\n public appealMe(activityId: string) {\r\n SocialService.appealMe().then(_ => {\r\n this.appealActivity(activityId);\r\n });\r\n }\r\n\r\n public appealMyPicture(activityId: string) {\r\n SocialService.appealMyPicture().then(_ => {\r\n this.appealActivity(activityId);\r\n });\r\n }\r\n\r\n public appealActivity(activityId: string) {\r\n SocialDataActions.updateActivityAppeal.getActionSender(this).send(activityId, true);\r\n }\r\n\r\n public checkAndLogReducerError(): void {\r\n const state: SocialDataState = this.getCurrentState();\r\n const error = state.error;\r\n if (!error) { return; }\r\n SocialDataActions.resetError.getActionSender(this).send();\r\n const appError = SocialExperienceReducerIncorrectArgumentError;\r\n appErrorLogger.log({\r\n ...appError,\r\n message: \"Reducer incorrect argument\",\r\n pb: {\r\n ...appError.pb,\r\n customMessage: `Undefined argument \"${error.argument}\" for \"${error.action}\" action`\r\n }\r\n } as AppError);\r\n }\r\n\r\n public saveReactionInSuperAppLocalStorage(id: string, reaction?: string): void {\r\n dispatchBridgeEvent(BridgeEventNames.saveCachedMyReaction, {id: id, reaction: reaction});\r\n }\r\n\r\n public initializePublisherServiceClient(): void {\r\n this.publisherServiceClient = new PublisherServiceClient(window.fetch.bind(window), false);\r\n }\r\n\r\n public async followPublisher(publisherId: string, follow: boolean): Promise {\r\n try {\r\n await this.publisherServiceClient.publisherUserAction(\r\n publisherId,\r\n PublisherActions.More,\r\n follow ? \"POST\" : \"DELETE\"\r\n );\r\n return true;\r\n } catch (error) {\r\n appErrorLogger.log({\r\n ...SocialExperiencePublisherFollowUnfollowError,\r\n message: \"Failed to follow/unfollow publisher\"\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n public async getPublisherIsFollowing(publisherId: string): Promise {\r\n try {\r\n return await this.publisherServiceClient.getUserPublisherStatus(publisherId, PublisherActions.More);\r\n } catch (error) {\r\n appErrorLogger.log({\r\n ...SocialExperiencePublisherIsFollowedFetchError,\r\n message: \"Failed to fetch publisher follow status\"\r\n });\r\n return false;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { enums } from \"./enums\";\r\n\r\nexport function hasThemeBase(theme, targetTheme) {\r\n return theme && theme.startsWith(targetTheme.name);\r\n}\r\n\r\nexport function isThemeEqual(theme, targetTheme) {\r\n return theme == targetTheme.name;\r\n}\r\n\r\nexport function isComponentDisabled(theme, component) {\r\n let disabledComponents = [];\r\n for (const key in enums.theme) {\r\n if (enums.theme[key].name === theme) {\r\n disabledComponents = enums.theme[key].disabledComponents;\r\n break;\r\n }\r\n }\r\n return disabledComponents.includes(component);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionHandler } from \"@msnews/experiences-redux\";\r\nimport { IReducer, IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport {\r\n AddTyper,\r\n DeleteActivities,\r\n DeleteUserComment,\r\n IncrementReplyCount,\r\n InsertComment,\r\n InsertComments,\r\n MapCmsIdToContentId,\r\n RecordSignalRHub,\r\n ResetError,\r\n ResetSpecificCommentId,\r\n SetContent,\r\n SetGradientOverlayData,\r\n SetPopup,\r\n SetPublisherSubscribeFollowButtonData,\r\n SetReactionBreakdown,\r\n SetTheme,\r\n SocialDataActions,\r\n UpdateActivities,\r\n UpdateActivityAppeal,\r\n UpdateActivityStatus,\r\n UpdateCommentRating,\r\n UpdateContent,\r\n UpdateContentRating,\r\n UpdateMe,\r\n UpdateNotifications,\r\n UpdateResponsiveClass,\r\n UpdateTypers,\r\n UpdateUser,\r\n UpdateUserComments,\r\n UpdateUserFollowers,\r\n UpdateUserFollowing\r\n} from \"./SocialData.actions\";\r\nimport { Comment, Content, TypingUpdates, TypingUser, TypingUsers, User } from \"@msnews/social-data-service\";\r\n\r\nimport { SocialDataState } from \"./SocialData.state\";\r\nimport { contentIdKey } from \"./utils/contentIdKey\";\r\nimport { enums } from \"./utils/enums\";\r\n\r\n/**\r\n * The reducer for the SocialData connector, and the SocialDataState\r\n */\r\nexport class SocialDataReducer implements IReducer {\r\n /**\r\n * Update the state for the connector, based on the action being applied\r\n * @param state The previous state\r\n * @param actionPayload The action being applied\r\n */\r\n public reduce(state: SocialDataState, actionPayload: IActionPayload): SocialDataState {\r\n if (!state) { return {}; }\r\n if (!actionPayload) { return state; }\r\n\r\n let newState: SocialDataState;\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setTheme, (theme) => {\r\n theme = theme || state.theme || \"default\";\r\n newState = { ...state, theme };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateMe, (me) => {\r\n newState = { ...state, me: me, users: updateUser(state.users, me.id, { data: me, isFetched: true, isFetching: false }), ...makeErrorIfUndefined(\"UpdateUser\", { userId: me.id }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateNotifications, (notifications) => {\r\n newState = { ...state, notifications: updateNotifications(state.notifications, notifications) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateActivities, (activities) => {\r\n newState = { ...state, activities: updateActivities(state.activities, activities) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.deleteActivities, () => {\r\n newState = { ...state, activities: { top: 0, skip: 0, hasMore: false, moreCount: 0, list: []} };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateActivityStatus, (id, read) => {\r\n newState = { ...state, activities: updateActivityStatus(state.activities, id, read), notifications: updateNotificationStatus(state.notifications, id, read) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateActivityAppeal, (id, appealSent) => {\r\n newState = { ...state, activities: updateActivityAppeal(state.activities, id, appealSent) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setContent, (content, contentId) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: content }, ...makeErrorIfUndefined(\"SetContent\", { contentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateContent, (contentId, data) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: { ...state.contents[contentId], ...data } }, ...makeErrorIfUndefined(\"UpdateContent\", { contentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateContentRating, (contentId, rating) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: updateContentRating(state.contents[contentId], rating) }, ...makeErrorIfUndefined(\"UpdateContentRating\", { contentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.insertComments, (contentId, comments, page, parentId, prepend?) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: insertComments(state.contents[contentId], comments, page, parentId, prepend) }, ...makeErrorIfUndefined(\"InsertComments\", { contentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.resetSpecificCommentId, () => {\r\n newState = { ...state, specificCommentId: undefined };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateCommentRating, (contentId, commentId, rating, updateCounts) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: updateCommentRating(state.contents[contentId], commentId, rating, updateCounts)}, ...makeErrorIfUndefined(\"updateCommentRating\", { contentId, commentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.incrementReplyCount, (contentId, commentId) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: incrementReplyCount(state.contents[contentId], commentId) }, ...makeErrorIfUndefined(\"IncrementReplyCount\", { contentId, commentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.insertComment, (contentId, comment, parentId?, addedOffline?) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: insertComment(state.contents[contentId], comment, parentId, addedOffline) }, ...makeErrorIfUndefined(\"InsertComment\", { contentId, comment }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateUser, (userId, user) => {\r\n newState = { ...state, users: updateUser(state.users, userId, user), ...makeErrorIfUndefined(\"UpdateUser\", { userId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateUserFollowers, (userId, followers) => {\r\n newState = { ...state, users: updateUserFollowers(state.users, userId, followers), ...makeErrorIfUndefined(\"UpdateUserFollowers\", { userId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateUserFollowing, (userId, following) => {\r\n newState = { ...state, users: updateUserFollowing(state.users, userId, following), ...makeErrorIfUndefined(\"UpdateUserFollowing\", { userId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateUserComments, (userId, comments, reset) => {\r\n newState = { ...state, users: updateUserComments(state.users, userId, comments, reset), ...makeErrorIfUndefined(\"UpdateUserComments\", { userId, comments }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.deleteUserComment, (userId, commentId, parentId) => {\r\n newState = { ...state, users: deleteUserComment(state.users, userId, commentId), contents: deleteComment(state.contents, commentId, parentId), ...makeErrorIfUndefined(\"DeleteUserComment\", { userId, commentId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setReactionBreakdown, (data) => {\r\n newState = { ...state, reactionBreakdown: data };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setGradientOverlayData, (data) => {\r\n newState = { ...state, gradientOverlayData: data };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setPublisherSubscribeFollowButtonData, (data) => {\r\n newState = { ...state, publisherSubscribeFollowButtonData: data };\r\n });\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.setPopup, (moduleName, props) => {\r\n newState = { ...state, popup: { moduleName, popupProps: props } };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.addTyper, (typer: TypingUser, contentId: string, id: string, market: string) => {\r\n newState = { ...state, contents: addTyper(id, market, state.contents, state.me, typer, contentId) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateTypers, (expirationTime: number) => {\r\n newState = { ...state, contents: updateTypersIfNeeded(state.contents, state.me, expirationTime) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.recordSignalRHub, (contentId: string) => {\r\n newState = { ...state, contents: { ...state.contents, [contentId]: recordSignalRHub(state.contents[contentId], contentId) } };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.updateResponsiveClass, (responsiveClass) => {\r\n newState = { ...state, responsiveClass: responsiveClass };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.mapCmsIdToContentId, (cmsId, market, contentId) => {\r\n newState = { ...state, contentIds: { ...state.contentIds, [contentIdKey(cmsId, market)]: contentId }, ...makeErrorIfUndefined(\"MapCmsIdToContentId\", { contentId, cmsId }) };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, SocialDataActions.resetError, () => {\r\n newState = { ...state, error: undefined };\r\n });\r\n\r\n return newState || state;\r\n }\r\n}\r\n\r\nfunction updateUser(users={}, userId, user) {\r\n const userSkeleton = {\r\n isFetched: false,\r\n isFetching: false,\r\n isFollowingFetched: false,\r\n isFollowingFetching: false,\r\n data: undefined\r\n };\r\n const oldUserState = users[userId] || userSkeleton;\r\n const newUsers = { ...users,\r\n [userId]: {\r\n ...oldUserState,\r\n ...user,\r\n data: {\r\n ...oldUserState.data,\r\n ...user.data\r\n }\r\n }\r\n };\r\n\r\n return newUsers;\r\n}\r\n\r\nfunction updateUserFollowers(users={}, userId, followers) {\r\n const oldUserState = users[userId];\r\n if (!oldUserState) { return users; }\r\n\r\n return {...users,\r\n [userId]: {...oldUserState,\r\n data: {...oldUserState.data,\r\n followers: {\r\n ...oldUserState.data.followers,\r\n ...followers,\r\n list: oldUserState.data.followers.list.concat(followers.list)\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction updateUserFollowing(users={}, userId, following) {\r\n const oldUserState = users[userId];\r\n if (!oldUserState) { return users; }\r\n\r\n return {...users,\r\n [userId]: {...oldUserState,\r\n data: {...oldUserState.data,\r\n following: {\r\n ...oldUserState.data.following,\r\n ...following,\r\n list: oldUserState.data.following.list.concat(following.list)\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction updateUserComments(users={}, userId, comments, reset=false) {\r\n const oldUserState = users[userId];\r\n if (!oldUserState) { return users; }\r\n\r\n return {...users,\r\n [userId]: {...oldUserState,\r\n data: {...oldUserState.data,\r\n comments: reset\r\n ? comments\r\n : {\r\n ...oldUserState.data.comments,\r\n ...comments,\r\n list: oldUserState.data.comments.list.concat(comments.list)\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction deleteUserComment(users={}, userId, commentId) {\r\n const oldUserState = users[userId];\r\n if (!(oldUserState && oldUserState.data.comments)) { return users; }\r\n\r\n return {...users,\r\n [userId]: {...oldUserState,\r\n data: {...oldUserState.data,\r\n comments: {...oldUserState.data.comments,\r\n list: markCommentAsDeleted(oldUserState.data.comments.list, commentId)\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\nfunction insertComments(content, comments, page, parentId, prepend?) {\r\n const list = (content && content.comments && content.comments.list) ? content.comments.list : [];\r\n\r\n if (parentId) {\r\n return mapAllComments(content, comment =>\r\n comment.id == parentId ? {\r\n ...comment,\r\n replies: insertReplies(comment.replies, comments.list),\r\n replyCount: comments.totalCount,\r\n repliesHasPrevious: comments.hasPrevious !== undefined ? comments.hasPrevious : comment.repliesHasPrevious,\r\n repliesHasMore: comments.hasMore !== undefined ? comments.hasMore : comment.repliesHasMore\r\n } :\r\n comment\r\n );\r\n } else {\r\n let commentList: Array;\r\n if (page) {\r\n commentList = prepend ? comments.list.concat(list) : list.concat(comments.list);\r\n } else {\r\n commentList = comments.list;\r\n }\r\n\r\n return {\r\n ...content,\r\n comments: {\r\n ...comments,\r\n list: commentList,\r\n hasPrevious: comments.hasPrevious !== undefined ? comments.hasPrevious : (content.comments && content.comments.hasPrevious),\r\n hasMore: comments.hasMore !== undefined ? comments.hasMore : (content.comments && content.comments.hasMore)\r\n }\r\n };\r\n }\r\n}\r\n\r\nfunction updateNotifications(existingNotifications, newNotifications) {\r\n const notificationList = existingNotifications ? existingNotifications.list : [];\r\n for (let index = 0; index < newNotifications.list.length; index++) {\r\n const newNotification = newNotifications.list[index];\r\n if (!notificationList.find(x => x.id == newNotification.id)) {\r\n notificationList.push(newNotification);\r\n }\r\n }\r\n notificationList.sort(function(a, b) {\r\n const keyA = new Date(a.datetime); const keyB = new Date(b.datetime);\r\n if (keyA < keyB) { return 1; }\r\n if (keyA > keyB) { return -1; }\r\n return 0;\r\n });\r\n return { ...newNotifications,\r\n list: notificationList.length > 3 ? notificationList.slice(0, 3) : notificationList\r\n };\r\n}\r\n\r\nfunction updateNotificationStatus(notifications, id, read) {\r\n if (!notifications) { return; }\r\n if (!read) { return notifications; }\r\n return { ...notifications,\r\n list: notifications.list.filter(x => x.id != id)\r\n };\r\n}\r\n\r\nfunction updateActivities(existingActivities, newActivities) {\r\n const activityList = existingActivities ? existingActivities.list : [];\r\n for (let index = 0; index < newActivities.list.length; index++) {\r\n const activity = newActivities.list[index];\r\n if (activity.type == enums.activityType.reaction) {\r\n const relatedActivity = activityList.find(x => x.type == enums.activityType.reaction && x.target.comment && x.target.comment.id == activity.target.comment.id);\r\n if (relatedActivity) {\r\n activity.skipRender = true;\r\n }\r\n }\r\n activityList.push(activity);\r\n }\r\n return { ...newActivities,\r\n list: activityList\r\n };\r\n}\r\n\r\nfunction updateActivityStatus(activities, id, read) {\r\n if (!activities) { return; }\r\n const activityList = activities ? activities.list : [];\r\n if (activityList.find(activity => activity.id == id)) {\r\n activityList.find(activity => activity.id == id).isSeen = read;\r\n }\r\n return { ...activities,\r\n list: activityList\r\n };\r\n}\r\n\r\nfunction updateActivityAppeal(activities, id, appealSent) {\r\n if (!activities) { return; }\r\n const activityList = activities ? activities.list : [];\r\n const index = activityList.findIndex(activity => activity.id == id);\r\n if (index >= 0) {\r\n activityList[index] = { ...activityList[index], appealSent: appealSent };\r\n }\r\n return { ...activities,\r\n list: activityList\r\n };\r\n}\r\n\r\nfunction updateCommentRating(content, commentId, rating, updateCounts) {\r\n return mapAllComments(content, $ => {\r\n if ($.id != commentId) { return $; }\r\n const comment = { ...$, rating: rating };\r\n if (updateCounts) {\r\n if ($.rating) {\r\n comment.reactionCounts[$.rating] = Math.max(0, comment.reactionCounts[$.rating] - 1);\r\n }\r\n if (rating) {\r\n comment.reactionCounts[rating] = Math.max(1, comment.reactionCounts[rating] + 1);\r\n }\r\n }\r\n return comment;\r\n });\r\n}\r\n\r\nfunction updateContentRating(content, rating) {\r\n content = content || { reactionCounts: {} };\r\n if (content.rating) {\r\n content.reactionCounts[content.rating] = Math.max(0, content.reactionCounts[content.rating] - 1);\r\n }\r\n if (rating) {\r\n content.reactionCounts[rating] = Math.max(1, content.reactionCounts[rating] + 1);\r\n }\r\n return {...content, rating: rating};\r\n}\r\n\r\nfunction mapAllComments(content: Content, mapFunc: (comment: Comment) => Comment): Content {\r\n function mapCommentAndReplies(comment: Comment): Comment {\r\n const newComment = mapFunc(comment);\r\n return {...newComment,\r\n replies: (newComment.replies ? newComment.replies.map(mapCommentAndReplies) : null)\r\n };\r\n }\r\n return {...content,\r\n comments: {...content.comments,\r\n list: (content.comments && content.comments.list)\r\n ? content.comments.list.map(mapCommentAndReplies)\r\n : null\r\n }\r\n };\r\n}\r\n\r\nfunction incrementReplyCount(content, commentId) {\r\n const newState = mapAllComments(content, $comment => {\r\n if ($comment.id !== commentId) { return $comment; }\r\n return {...$comment,\r\n replyCount: $comment.replyCount + 1\r\n };\r\n });\r\n if (newState.commentSummary) {\r\n newState.commentSummary.totalCount++;\r\n const replyCount = newState.commentSummary.subCommentSummaries.find(x => x.type == \"Reply\");\r\n if (replyCount) {\r\n replyCount.totalCount++;\r\n }\r\n }\r\n newState.totalCommentCount++;\r\n return newState;\r\n}\r\n\r\nfunction insertComment(content: Content, newComment, parentId?, addedOffline?: boolean): Content {\r\n newComment.addedOffline = Boolean(addedOffline);\r\n if (parentId) {\r\n const newState = mapAllComments(content, $comment => {\r\n if ($comment.id != parentId) { return $comment; }\r\n return {...$comment,\r\n replies: $comment.replies.concat(newComment)\r\n };\r\n });\r\n if (newState.commentSummary) {\r\n newState.commentSummary.totalCount++;\r\n const replyCount = newState.commentSummary.subCommentSummaries.find(x => x.type == \"Reply\");\r\n if (replyCount) {\r\n replyCount.totalCount++;\r\n }\r\n }\r\n newState.totalCommentCount++;\r\n return newState;\r\n } else {\r\n const newState = {\r\n ...content,\r\n comments: {...content.comments,\r\n list: [newComment].concat(content.comments.list)\r\n }\r\n };\r\n if (newState.commentSummary) {\r\n newState.commentSummary.totalCount++;\r\n const commentCount = newState.commentSummary.subCommentSummaries.find(x => x.type == \"Comment\");\r\n if (commentCount) {\r\n commentCount.totalCount++;\r\n }\r\n }\r\n newState.totalCommentCount++;\r\n return newState;\r\n }\r\n}\r\n\r\nfunction deleteComment(contents, commentId, parentId) {\r\n if (!contents) {\r\n return undefined;\r\n }\r\n\r\n function deleteCommentFromContent(content) {\r\n if (!content) {\r\n return undefined;\r\n }\r\n\r\n const list = (content && content.comments && content.comments.list) ? content.comments.list : [];\r\n\r\n if (parentId) {\r\n return mapAllComments(content, $comment => {\r\n if ($comment.id != parentId) { return $comment; }\r\n return {...$comment,\r\n replies: markCommentAsDeleted($comment.replies, commentId)\r\n };\r\n });\r\n } else {\r\n return {...content,\r\n comments: {...content.comments,\r\n list: markCommentAsDeleted(list, commentId)\r\n }\r\n };\r\n }\r\n }\r\n\r\n return mapAllContents(contents, deleteCommentFromContent);\r\n}\r\n\r\nfunction getDisplayedTypers(myId: string, typingUsers?: TypingUsers): TypingUser[] {\r\n const numDisplayed = 3; // configure to however many users you want to display\r\n if (!typingUsers) {\r\n return [];\r\n }\r\n const typingUserIds: Array = Object.keys(typingUsers);\r\n if (typingUserIds.length === 0) {\r\n return [];\r\n }\r\n\r\n const displayedTypers: Array = [];\r\n\r\n // If we are one of the typingUsers, we want ourselves to be at the front of the list.\r\n // this provides us with instant feedback from which we can infer that others are also\r\n // seeing that we're typing.\r\n if (myId && typingUsers[myId]) {\r\n displayedTypers.push(typingUsers[myId]);\r\n }\r\n\r\n for (const id of typingUserIds) {\r\n if (!myId || !typingUsers[myId] || typingUsers[myId].id !== id) {\r\n displayedTypers.push(typingUsers[id]);\r\n }\r\n if (displayedTypers.length >= numDisplayed) {\r\n return displayedTypers;\r\n }\r\n }\r\n\r\n return displayedTypers;\r\n}\r\n\r\nfunction mapAllContents(contents: { [id: string]: Content }, mapFunc: (content: Content) => Content): { [id: string]: Content } {\r\n const newContents: { [id: string]: Content } = {};\r\n for (const [contentId, content] of Object.entries(contents)) {\r\n newContents[contentId] = mapFunc(content);\r\n }\r\n return newContents;\r\n}\r\n\r\nfunction addTyper(currentId: string, currentMarket: string, contents: { [id: string]: Content }, me: User, typer: TypingUser, contentId: string): { [id: string]: Content } {\r\n return mapAllContents(contents, (content) => {\r\n const currentContentId = (content && content.id) || (currentId && currentMarket && currentId + \"_\" + currentMarket);\r\n if (currentContentId !== contentId || Object.keys(content.typingUpdates.typingUsers).includes(typer.id)) {\r\n return content;\r\n }\r\n const typingUpdates = { ...content.typingUpdates };\r\n const myId = me && me.id;\r\n const newTypingUsers: TypingUsers = { ...typingUpdates.typingUsers, [typer.id]: typer };\r\n typingUpdates.typingUsers = newTypingUsers;\r\n typingUpdates.displayedTypers = getDisplayedTypers(myId, newTypingUsers);\r\n typingUpdates.numTypers = Object.keys(newTypingUsers).length;\r\n return { ...content, typingUpdates };\r\n });\r\n}\r\n\r\nfunction updateTypersIfNeeded(contents: { [id: string]: Content }, me: User, expirationTime: number): { [id: string]: Content } {\r\n return mapAllContents(contents, (content) => {\r\n const typingUpdates: TypingUpdates = content && { ...content.typingUpdates };\r\n const myId: string = me && me.id;\r\n const cleaningStaleTypers = true; // set to false for testing\r\n if (typingUpdates && typingUpdates.typingUsers) {\r\n const newTypingUsers: TypingUsers = cleaningStaleTypers ? {} : { ...typingUpdates.typingUsers };\r\n for (const userId in typingUpdates.typingUsers) {\r\n const user = typingUpdates.typingUsers[userId];\r\n if (user.lastTypingTime >= expirationTime) {\r\n newTypingUsers[userId] = user;\r\n }\r\n }\r\n return Object.keys(newTypingUsers).length == Object.keys(typingUpdates.typingUsers).length ? content : {\r\n ...content,\r\n typingUpdates: {\r\n ...typingUpdates,\r\n typingUsers: newTypingUsers,\r\n displayedTypers: getDisplayedTypers(myId, newTypingUsers),\r\n numTypers: Object.keys(newTypingUsers).length\r\n }\r\n };\r\n }\r\n });\r\n}\r\n\r\nfunction recordSignalRHub(content: Content, contentId: string) {\r\n const typingUpdates = {\r\n typingUsers: {},\r\n displayedTypers: [],\r\n numTypers: 0,\r\n hubName: contentId\r\n };\r\n return { ...content, typingUpdates };\r\n}\r\n\r\nfunction markCommentAsDeleted(comments, commentId) {\r\n const newComments = [];\r\n for (let index = 0; index < comments.length; index++) {\r\n const comment = comments[index];\r\n if (comment.id == commentId) {\r\n comment.isDeleted = true;\r\n comment.isHidden = true;\r\n comment.visibleStatus = \"DeletedByUser\";\r\n }\r\n newComments.push(comment);\r\n }\r\n return newComments;\r\n}\r\n\r\nfunction insertReplies(existingReplies, newReplies) {\r\n const replies = existingReplies.concat(newReplies).map(x => { x.addedOffline = false; return x; });\r\n const replyIds = replies.map(x => x.id);\r\n const distinctReplies = replies.filter(function(item, index) {\r\n return replyIds.indexOf(item.id) >= index;\r\n });\r\n distinctReplies.sort(function(a, b) {\r\n const keyA = new Date(a.createDatetime); const keyB = new Date(b.createDatetime);\r\n if (keyA < keyB) { return -1; }\r\n if (keyA > keyB) { return 1; }\r\n return 0;\r\n });\r\n return distinctReplies;\r\n}\r\n\r\nfunction makeErrorIfUndefined(action: string, args: Object): { error: { action: string, argument: string } } {\r\n for (const [key, value] of Object.entries(args)) {\r\n if (!value) {\r\n return { error: { action: action, argument: key } };\r\n }\r\n }\r\n return { error: undefined };\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport \"../publicPath\";\r\n\r\nimport { DarkModeBackgroundColor, ExperienceInitialProps } from \"@msnews/experiences-base\";\r\nimport { RequestContext, TelemetryBase, UrlUtility, appEnvironment, getAppEnvironment, resolver } from \"@msnews/core\";\r\nimport { SocialBarConnector, SocialBarReducer, ToolingInfo as SocialBarToolingInfo } from \"@msnews/social-bar\";\r\nimport { SocialCommentConnector, SocialCommentReducer, ToolingInfo as SocialCommentToolingInfo } from \"@msnews/social-comment\";\r\nimport { SocialConnector, SocialReducer, ToolingInfo as SocialToolingInfo } from \"@msnews/social\";\r\nimport { SocialDataConnector, SocialDataReducer } from \"@msnews/social-data-connector\";\r\nimport { handleAppErrorEventCall, handlePartialPageImpressionCall, handleSetTrackingAttrs, handleTelemetryCall } from \"../integration/PrimeTelemetry\";\r\n\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { DesignSystemDefaults } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DesignSystemProvider } from \"@microsoft/fast-jss-manager-react\";\r\nimport { Direction } from \"@microsoft/fast-web-utilities\";\r\nimport { IExperienceConfig } from \"cms-models-msn/configuration/IExperienceConfig\";\r\nimport { Mediator } from \"../integration/Mediator\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport React from \"react\";\r\nimport { getTrackInfo } from \"track-info-integration\";\r\nimport { sendRequest } from \"@msnews/oneservice\";\r\n\r\n// Containers for experiences\r\nconst roots: { [id: string]: HTMLElement; } = {};\r\nconst apps: { [id: string]: PageBase; } = {};\r\nlet experienceConfigSocial: IExperienceConfig = null;\r\nlet experienceConfigSocialBar: IExperienceConfig = null;\r\nlet experienceConfigSocialComment: IExperienceConfig = null;\r\n\r\n// Map base telemetry to prime library for hybrid\r\nTelemetryBase.trackAppErrorEvent = handleAppErrorEventCall;\r\nTelemetryBase.trackPartialImpression = handlePartialPageImpressionCall;\r\nTelemetryBase.trackEvent = handleTelemetryCall;\r\nTelemetryBase.setTrackingAttrs = handleSetTrackingAttrs;\r\nconst handleUpdateTemplValueCallback = getTrackInfo().then(trackInfo => {\r\n const appEnvironment = getAppEnvironment();\r\n appEnvironment.RootTelemetryId = 0;\r\n appEnvironment.TrackInfo = trackInfo;\r\n return trackInfo.updateTemplValue;\r\n});\r\n\r\nconst gradientOverlayEnabled = getFlight(\"prg-subs\");\r\nconst publisherSubscribeFollowButtonEnabled = getFlight(\"prg-publv0\") || getFlight(\"prg-publv1\");\r\n\r\nfunction getFlight(flightId): boolean {\r\n if (appEnvironment.CurrentRequestTargetScope && appEnvironment.CurrentRequestTargetScope.pageExperiments && flightId) {\r\n const experiments = appEnvironment.CurrentRequestTargetScope.pageExperiments;\r\n return !!experiments.find(x => x && x.toLowerCase() == flightId.toLowerCase());\r\n }\r\n return false;\r\n}\r\n\r\nfunction getPageType() {\r\n const href = document.location && document.location.href;\r\n if (!href) {\r\n return undefined;\r\n }\r\n try {\r\n const market = href.split(\"/\").find(x => x.length === 5 && x[2] == \"-\").toLowerCase();\r\n const typeAndId = href.split(\"?\")[0].split(\"#\")[0].split(\"/\").pop();\r\n const pageType = typeAndId.indexOf(\"ar-\") === 0 && \"article\" || typeAndId.indexOf(\"ss-\") === 0 && \"slideshow\" || typeAndId.indexOf(\"vi-\") === 0 && \"video\";\r\n if (pageType && market) {\r\n const id = typeAndId.split(\"-\").pop();\r\n return {\r\n pageType,\r\n id,\r\n market\r\n };\r\n }\r\n } catch (e) {\r\n // no-op\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction addSocialBarIntoArticle(id, market) {\r\n try {\r\n // Todo make sure it works with embedded articles\r\n const container = document.getElementsByClassName(\"authorinfo-flexar\")[0].parentElement;\r\n const newContainer = document.createElement(\"div\");\r\n newContainer.className = \"authorinfo-flexar\";\r\n newContainer.style.display = \"block\";\r\n newContainer.innerHTML = \"
    \";\r\n const exp = newContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n const separator = container.getElementsByTagName(\"hr\")[0];\r\n if (separator) {\r\n container.insertBefore(newContainer, separator);\r\n } else {\r\n container.appendChild(newContainer);\r\n }\r\n } catch (e) {\r\n // no-op\r\n }\r\n}\r\n\r\n// Add social bar container into video page\r\nfunction addSocialBarIntoVideo(id, market) {\r\n try {\r\n // Todo make sure it works with embedded videos\r\n const container = document.getElementsByClassName(\"metadata\")[0].parentElement;\r\n const newContainer = document.createElement(\"div\");\r\n newContainer.className = \"metadata\";\r\n newContainer.innerHTML = \"
    \";\r\n const exp = newContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n const separator = container.getElementsByClassName(\"share-container\")[0] || container.getElementsByClassName(\"btns-container\")[0] || container.getElementsByClassName(\"video-description\")[0];\r\n if (separator) {\r\n container.insertBefore(newContainer, separator);\r\n } else {\r\n container.appendChild(newContainer);\r\n }\r\n } catch (e) {\r\n // no-op\r\n }\r\n}\r\n\r\n// Add comment container into view page (body)\r\nfunction addOverlayCommentContainer(id, market) {\r\n const commentContainer = document.createElement(\"div\");\r\n commentContainer.className = \"microsoftNewsCommentModule\";\r\n commentContainer.innerHTML = \"
    \";\r\n const exp = commentContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n document.body.appendChild(commentContainer);\r\n}\r\n\r\n// Add social popup container into view page (body)\r\nfunction addSocialPopupContainer(id, market) {\r\n const popupContainer = document.createElement(\"div\");\r\n popupContainer.innerHTML = \"
    \";\r\n const exp = popupContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n document.body.appendChild(popupContainer);\r\n}\r\n\r\n// Create social bar, comments and social popup containers inside article, gallery, video pages\r\n// Add publisher subscribe/follow button container\r\nfunction addPublisherSubscribeFollowButtonContainer(id, market) {\r\n const buttonContainer = document.createElement(\"div\");\r\n buttonContainer.style.display = \"inline-block\";\r\n buttonContainer.style.position = \"relative\";\r\n buttonContainer.style.bottom = \"3.9rem\";\r\n buttonContainer.style.left = \"1.2rem\";\r\n buttonContainer.innerHTML = \"
    \";\r\n\r\n const exp = buttonContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n\r\n const header = document.getElementsByClassName(\"collection-headline-flex\")[0];\r\n const publisherLogo = header.getElementsByClassName(\"partnerlogo-img\")[0];\r\n header.insertBefore(buttonContainer, publisherLogo.nextSibling);\r\n}\r\n\r\n// Add gradient overlay container\r\nfunction addGradientOverlayContainer(id, market) {\r\n const gradientOverlayContainer = document.createElement(\"div\");\r\n gradientOverlayContainer.innerHTML = \"
    \";\r\n const exp = gradientOverlayContainer.children[0] as HTMLDivElement;\r\n exp.setAttribute(\"data-social-id\", id);\r\n exp.setAttribute(\"data-social-market\", market);\r\n document.body.appendChild(gradientOverlayContainer);\r\n}\r\n\r\n// Create social bar and comments containers inside article, gallery, video pages\r\nfunction createContainers() {\r\n const pageConfig = getPageType();\r\n if (!pageConfig) {\r\n return;\r\n }\r\n if (pageConfig.pageType === \"video\") {\r\n addSocialBarIntoVideo(pageConfig.id, pageConfig.market);\r\n } else {\r\n addSocialBarIntoArticle(pageConfig.id, pageConfig.market);\r\n }\r\n if (!getFlight(\"prg-rctns_v0\")) {\r\n addOverlayCommentContainer(pageConfig.id, pageConfig.market);\r\n }\r\n if (gradientOverlayEnabled) {\r\n addGradientOverlayContainer(pageConfig.id, pageConfig.market);\r\n }\r\n if (publisherSubscribeFollowButtonEnabled) {\r\n addPublisherSubscribeFollowButtonContainer(pageConfig.id, pageConfig.market);\r\n }\r\n addSocialPopupContainer(pageConfig.id, pageConfig.market);\r\n}\r\n\r\nfunction renderSocialBar(app, root, designSystem, requestContext) {\r\n const context = {\r\n handleTelemetryCall,\r\n handlePartialPageImpressionCall,\r\n handleAppErrorEventCall,\r\n handleUpdateTemplValueCallback,\r\n id: root.dataset.socialId,\r\n market: root.dataset.socialMarket\r\n };\r\n\r\n const props: ExperienceInitialProps = {\r\n parentTelemetry: {},\r\n context\r\n };\r\n const socialBarConnector = new SocialBarConnector(\"SocialBar\", \"\", app.rootReducer, new SocialBarReducer(), app.store, {...experienceConfigSocialBar.properties, dataConnectors: []}, requestContext);\r\n socialBarConnector.connectComponent(SocialBarToolingInfo.reactComponent, props).then((socialExperience) => {\r\n app.renderRootElement(\r\n React.createElement(\r\n DesignSystemProvider,\r\n { designSystem },\r\n React.createElement(socialExperience, {...props.context})\r\n ),\r\n root);\r\n });\r\n}\r\n\r\nfunction renderSocialComment(app, root, designSystem, requestContext, commentDisplayType) {\r\n const lowerCaseHref = document.location.href.toLowerCase();\r\n const specificCommentId = lowerCaseHref.indexOf(\"commentid=\") != -1 && lowerCaseHref.split(\"commentid=\").pop().split(\"&\")[0];\r\n const context = {\r\n handleTelemetryCall,\r\n handlePartialPageImpressionCall,\r\n handleAppErrorEventCall,\r\n handleUpdateTemplValueCallback,\r\n id: root.dataset.socialId,\r\n market: root.dataset.socialMarket,\r\n commentDisplayType\r\n };\r\n if (specificCommentId && specificCommentId != \"undefined\") {\r\n context[\"specificCommentId\"] = specificCommentId;\r\n }\r\n\r\n const props: ExperienceInitialProps = {\r\n parentTelemetry: {},\r\n context\r\n };\r\n const socialCommentConnector = new SocialCommentConnector(\"SocialComment\", \"\", app.rootReducer, new SocialCommentReducer(), app.store, {...experienceConfigSocialComment.properties, dataConnectors: []}, requestContext);\r\n socialCommentConnector.connectComponent(SocialCommentToolingInfo.reactComponent, props).then((socialExperience) => {\r\n app.renderRootElement(\r\n React.createElement(\r\n DesignSystemProvider,\r\n { designSystem },\r\n React.createElement(socialExperience, {...props.context})\r\n ),\r\n root);\r\n });\r\n}\r\n\r\nfunction renderSocial(app, root, designSystem, requestContext, commentDisplayType, publisherSubscribeFollowButtonDataPromise, gradientOverlayDataPromise) {\r\n const context = {\r\n handleTelemetryCall,\r\n handlePartialPageImpressionCall,\r\n handleAppErrorEventCall,\r\n id: root.dataset.socialId,\r\n market: root.dataset.socialMarket,\r\n commentDisplayType,\r\n moduleName: root.dataset.socialModule\r\n };\r\n\r\n if (root.dataset.socialModule.toLowerCase() === \"publishersubscribefollowbutton\") {\r\n context[\"publisherSubscribeFollowButtonDataPromise\"] = publisherSubscribeFollowButtonDataPromise.promise;\r\n } else if (root.dataset.socialModule.toLowerCase() === \"gradientoverlay\") {\r\n context[\"gradientOverlayDataPromise\"] = gradientOverlayDataPromise.promise;\r\n }\r\n\r\n const props: ExperienceInitialProps = {\r\n parentTelemetry: {},\r\n context\r\n };\r\n const socialConnector = new SocialConnector(\"Social\", \"\", app.rootReducer, new SocialReducer(), app.store, {...experienceConfigSocial.properties, dataConnectors: []}, requestContext);\r\n socialConnector.connectComponent(SocialToolingInfo.reactComponent, props).then((socialExperience) => {\r\n app.renderRootElement(\r\n React.createElement(\r\n DesignSystemProvider,\r\n { designSystem },\r\n React.createElement(socialExperience, {...props.context})\r\n ),\r\n root);\r\n });\r\n}\r\n\r\n// Render experiences into existing containers\r\nfunction renderToContainers(): void {\r\n if (!experienceConfigSocial || !experienceConfigSocialBar || !experienceConfigSocialComment) {\r\n return;\r\n }\r\n\r\n // Override the design system for dark mode and ltr/rtl\r\n const requestContext = new RequestContext();\r\n const ocid = UrlUtility.getQueryParameterByName(\"ocid\", document.location && document.location.href);\r\n const isHybridWindowsPage = ocid && (ocid.toLowerCase().indexOf(\"winp\") == 0 || ocid.toLowerCase().indexOf(\"win10newsapp\") == 0);\r\n const isDarkModeSupported = isHybridWindowsPage || getFlight(\"darkmodevvs\") || getFlight(\"prg-mobileappview\");\r\n\r\n // Todo support other flight types in future\r\n const commentDisplayType = \"overlay\";\r\n\r\n // This flight requires widget to be shown under Ad container\r\n if (commentDisplayType == \"overlay\") {\r\n const newStyle = document.createElement(\"style\");\r\n newStyle.innerHTML = `\r\n .videojsplayer .player-wrapper.shrunk {\r\n bottom: 125px;\r\n z-index: 2147483637;\r\n }\r\n `;\r\n document.body.appendChild(newStyle);\r\n }\r\n\r\n const darkModeQuery = matchMedia(\"(prefers-color-scheme:dark)\");\r\n const backgroundColor = isDarkModeSupported && darkModeQuery.matches ? DarkModeBackgroundColor : DesignSystemDefaults.backgroundColor;\r\n const direction = document.dir && document.dir.toLowerCase() === \"rtl\" ? Direction.rtl : Direction.ltr;\r\n\r\n const designSystem = {\r\n ...DesignSystemDefaults,\r\n backgroundColor,\r\n direction\r\n };\r\n\r\n // Data promises for publisher subscribe/follow button and gradient overlay\r\n const createPromise = () => {\r\n let resolver;\r\n return {\r\n promise: new Promise(resolve => resolver = resolve),\r\n resolve: resolver\r\n };\r\n };\r\n const publisherSubscribeFollowButtonDataPromise = createPromise();\r\n const gradientOverlayDataPromise = createPromise();\r\n if (gradientOverlayEnabled || publisherSubscribeFollowButtonEnabled) {\r\n const pageType = getPageType();\r\n const contentUrl = `https://assets.msn.com/content/view/v2/Detail/${pageType.market}/${pageType.id}`;\r\n sendRequest(() => fetch(contentUrl), \"GetContentData\")\r\n .then(async response => {\r\n const data = await response.json();\r\n if (publisherSubscribeFollowButtonEnabled) {\r\n publisherSubscribeFollowButtonDataPromise.resolve({\r\n publisherProfileId: data.provider?.profileId,\r\n publisherId: data.provider?.id\r\n });\r\n }\r\n if (gradientOverlayEnabled) {\r\n gradientOverlayDataPromise.resolve({\r\n publisherProfileId: data.provider?.profileId,\r\n publisherName: data.provider?.name,\r\n publisherLogoUrl: data.provider?.logo?.url,\r\n subscriptionProductType: data.subscriptionProductType\r\n });\r\n }\r\n })\r\n .catch(() => { /* no-op */ });\r\n }\r\n\r\n // For each detected container, render corresponding experiences based on container definition.\r\n for (const key in roots) {\r\n const root = roots[key];\r\n // Root doesn't satisfy rendering conditions\r\n if (!root || !root.dataset || !root.dataset.socialId || !root.dataset.socialModule) {\r\n continue;\r\n }\r\n\r\n // We need a new store for each experience to isolate their redux per container.\r\n let app = null;\r\n\r\n // sticky and fixed roots are sharing the same redux store.\r\n if (key == \"sticky\" || key == \"fixed\") {\r\n app = apps[\"sticky\"] || apps[\"fixed\"];\r\n }\r\n\r\n if (!app) {\r\n PageBase.resetPageBaseInstance();\r\n app = PageBase.getInstance();\r\n app.start();\r\n apps[key] = app;\r\n }\r\n\r\n // Update app environment\r\n appEnvironment.HostPage = {\r\n originalUrl: location.href,\r\n hostName: location.hostname,\r\n topDomain: appEnvironment.HostPage.topDomain,\r\n verticalKey: root.dataset.verticalkey || (appEnvironment.HostPage && appEnvironment.HostPage.verticalKey) || \"news\",\r\n categoryKey: root.dataset.categorykey || (appEnvironment.HostPage && appEnvironment.HostPage.categoryKey) || \"other\"\r\n };\r\n\r\n // Create an instance of the social data connector\r\n const socialDataConnector = new SocialDataConnector(\r\n ConnectorNamespaces.SocialData,\r\n \"\",\r\n app.rootReducer,\r\n new SocialDataReducer(),\r\n app.store,\r\n undefined,\r\n requestContext\r\n );\r\n\r\n if (root.dataset.socialModule.toLowerCase() === \"socialbar\") {\r\n renderSocialBar(app, root, designSystem, requestContext);\r\n } else if (root.dataset.socialModule.toLowerCase() === \"comment\") {\r\n renderSocialComment(app, root, designSystem, requestContext, commentDisplayType);\r\n } else {\r\n renderSocial(app, root, designSystem, requestContext, commentDisplayType, publisherSubscribeFollowButtonDataPromise, gradientOverlayDataPromise);\r\n }\r\n }\r\n}\r\n\r\nfunction findRoots(setupContainers: boolean, removeOldContainers?: boolean): void {\r\n const placeHolders = {\r\n sticky: \"social-experience-socialbar-sticky\",\r\n fixed: \"social-experience-socialbar-fixed\",\r\n comment: \"social-experience-comment\",\r\n popup: \"social-experience-popup\",\r\n publisherSubscribeFollowButton: \"social-experience-publisher-subscribe-follow-button\",\r\n gradientOverlay: \"social-experience-gradient-overlay\",\r\n spaTest: \"social\"\r\n };\r\n const keys = Object.keys(placeHolders);\r\n const mockContentId = \"BBBMTFk\";\r\n\r\n keys.map(key => {\r\n try {\r\n // When Prime view contain embedded content we need to handle multiple containers with the same id\r\n if (document.querySelectorAll) {\r\n const placeholders = document.querySelectorAll(`[id=${placeHolders[key]}]`);\r\n if (placeholders.length > 0) {\r\n roots[key] = placeholders[placeholders.length - 1] as HTMLElement;\r\n }\r\n }\r\n } catch (e) {\r\n // Suppress the error\r\n }\r\n if (!roots[key]) {\r\n roots[key] = document.getElementById(placeHolders[key]);\r\n }\r\n\r\n // Remove old container if we want to re-draw new widget for new id\r\n if (removeOldContainers && roots[key]) {\r\n roots[key].parentElement.removeChild(roots[key]);\r\n delete roots[key];\r\n }\r\n });\r\n\r\n // Prepare SPA test mode\r\n if (!roots.comment && !roots.sticky && !roots.fixed && !roots.popup && roots.spaTest && location.hash.indexOf(\"debugviewonly\") != -1) {\r\n roots.spaTest.innerHTML = `\r\n ${placeHolders.comment}:
    \r\n ${placeHolders.sticky}:
    \r\n ${placeHolders.fixed}:
    \r\n ${placeHolders.popup}:
    \r\n `;\r\n keys.map(key => roots[key] = document.getElementById(placeHolders[key]));\r\n }\r\n delete roots.spaTest;\r\n\r\n if (setupContainers && !roots.comment && !roots.sticky && !roots.fixed && !roots.popup) {\r\n createContainers();\r\n findRoots(false);\r\n }\r\n}\r\n\r\nfindRoots(true);\r\n\r\n// Currently hard coded the experience config index.\r\nPromise.all(\r\n [\r\n resolver.getConfig(\"cms/api/amp/experienceConfigIndex/BB1enwaG\"),\r\n resolver.getConfig(\"cms/api/amp/experienceConfigIndex/BB1dqeiP\"),\r\n resolver.getConfig(\"cms/api/amp/experienceConfigIndex/BB1d8Nnn\")\r\n ]).then((values) => {\r\n experienceConfigSocial = values[0];\r\n experienceConfigSocialBar = values[1];\r\n experienceConfigSocialComment = values[2];\r\n renderToContainers();\r\n});\r\n// Listen to update events from Prime (Necessary as video page auto updates current displayed video)\r\nMediator.registerSocialActionsUpdatedEvent(async () => {\r\n findRoots(true, true);\r\n renderToContainers();\r\n});","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Converts the given error object to its string representation based on\r\n * the type of the input object.\r\n * @param error - the error object to convert to a string.\r\n * @param tryIncludeErrorStack - If true, will try to get the stack of the error\r\n * if the error is an actual Error object that has a stack.\r\n * @returns {string} - The string representation of the error.\r\n */\r\nexport function stringifyError(error: string | object | Error, tryIncludeErrorStack?: boolean): string {\r\n if (error instanceof Error) {\r\n const message = error.toString();\r\n return tryIncludeErrorStack && error.stack\r\n ? `${message}, Stack: ${error.stack}`\r\n : message;\r\n } else if (typeof error === \"string\") {\r\n return error;\r\n } else {\r\n return JSON.stringify(error);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError } from \"@msnews/core-contracts\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { getAppErrorsPropertyBag } from \"../AppError/AppErrors\";\r\n\r\n/**\r\n * Logs the given exception to telemetry.\r\n * @param error The error thrown.\r\n * @param appError The app error entry to log under.\r\n * @param message A message about what failed. This is what the error will be bucketed under for reporting purposes. The WHY will be included in the exception details.\r\n * @param customMessage details message for debug purpose\r\n */\r\nexport function logException(error: Error, appError: AppError, message: string, customMessage?: string): void {\r\n const errorObj = createError(appError, message, customMessage || error && error.toString());\r\n errorObj.pb.stack = error && error.stack;\r\n Telemetry.sendAppErrorEvent(errorObj);\r\n}\r\n\r\n/**\r\n * Helper that updates the property bag message and then fires the app error\r\n * @param appError The apperror\r\n * @param message The message for the error\r\n * @param customMessage The custom message to add to the property bag\r\n */\r\nexport function logError(appError: AppError, message: string, customMessage?: string): void {\r\n Telemetry.sendAppErrorEvent(createError(appError, message, customMessage));\r\n}\r\n\r\n/**\r\n * Helper to create an error for logging with message and customMessage properties without having\r\n * to go manually clone the error object, or property bag, etc.\r\n * @param baseError - The base error object to use as prototype for creating the error\r\n * @param message - The custom message to use for the error\r\n * @param customMessage - The custom message that may contain strings that do not aggregate well (i.e., unique / per request data)\r\n */\r\nexport function createError(baseError: AppError, message: string, customMessage?: string): AppError {\r\n const pageGlobalPb = getAppErrorsPropertyBag();\r\n return {\r\n ...baseError,\r\n message: message || baseError.message,\r\n pb: customMessage\r\n ? { ...pageGlobalPb, ...baseError.pb, customMessage }\r\n : { ...pageGlobalPb, ...baseError.pb }\r\n };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport namespace DynamicBundles {\r\n const dynamicBundles: { [experienceName: string]: () => Promise } = {};\r\n\r\n /**\r\n * lazy load the experience\r\n *\r\n * @param experienceName - the experience name\r\n * @return {Promise} - the experience wrapped by the promise\r\n */\r\n export const loadExperience = async (experienceName: string) => {\r\n const bundle = dynamicBundles[experienceName];\r\n if (!bundle) {\r\n throw new Error(`Attempted to load unknown dynamic bundle \"${experienceName}\". Make sure it's a registered dynamic experience bundle.`);\r\n }\r\n return bundle();\r\n };\r\n\r\n /**\r\n * register the experience for lazy loading\r\n *\r\n * @param experienceName - the experience name\r\n * @param es6Import - the import(\"@msnews/your/experience/path\")\r\n */\r\n export const registerExperience = (experienceName: string, es6Import: () => Promise) => {\r\n dynamicBundles[experienceName] = es6Import;\r\n };\r\n\r\n /**\r\n * check if an experience is registered\r\n * @param experienceName - the experience name\r\n * @return {boolean} - return true if experience is already registered, otherwise false\r\n */\r\n export const hasExperienceRegistered = (experienceName: string): boolean => {\r\n return !!dynamicBundles[experienceName];\r\n };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport async function fetchBlobClient(): Promise {\r\n const url = \"https://assets.msn.com/labs/views/CommentWidget/js/azure-storage.blob.min.js\";\r\n const id = \"azure-storage-blob-jssdk\";\r\n return new Promise((res, rej) => {\r\n if ((window as any).AzureStorage) {\r\n return res((window as any).AzureStorage);\r\n }\r\n fetchScript(url, id, () => {\r\n if ((window as any).AzureStorage) {\r\n return res((window as any).AzureStorage);\r\n }\r\n return rej();\r\n });\r\n });\r\n}\r\n\r\nfunction fetchScript(url: string, id: string, callback: () => void) {\r\n const d = document;\r\n const s = \"script\";\r\n if (!d.getElementById(id)) {\r\n const fjs = d.getElementsByTagName(s)[0];\r\n const js = d.createElement(s) as HTMLScriptElement; js.id = id;\r\n js.src = url;\r\n js.onload = callback;\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }\r\n}\r\n\r\nexport interface AzureStorage {\r\n Blob: Blob;\r\n}\r\n\r\nexport interface Blob {\r\n createBlobServiceWithSas: (accountUrl: string, token: string) => BlobService;\r\n}\r\n\r\nexport interface BlobService {\r\n createBlockBlobFromBrowserFile: (container: string, blobName: string, file: any, callback: (error, result, response) => void) => void;\r\n}","// © Microsoft Corporation. All rights reserved.\r\nimport { SocialAPIRequestErrorComments, SocialAPIRequestErrorContents, SocialAPIRequestErrorUnknown, SocialAPIRequestErrorUsers } from \"@msnews/diagnostics\";\r\n\r\nexport const ApiErrors = {\r\n unknown: SocialAPIRequestErrorUnknown,\r\n contents: SocialAPIRequestErrorContents,\r\n users: SocialAPIRequestErrorUsers,\r\n comments: SocialAPIRequestErrorComments\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\n\r\nclass AppErrorLogger {\r\n public onAppError: ((AppError) => void) = undefined;\r\n\r\n public log(error: AppError): void {\r\n if (this.onAppError) {\r\n try {\r\n this.onAppError(error);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n }\r\n\r\n public setOnAppError(onAppError: ((AppError) => void)): void {\r\n this.onAppError = onAppError;\r\n }\r\n}\r\n\r\nexport const appErrorLogger = new AppErrorLogger();","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ApiErrors, appErrorLogger, fetchBlobClient, generateQueryStringByKeyVals, getParameter } from \"../utils\";\r\nimport { AppError, logger } from \"@msnews/diagnostics\";\r\nimport { Environment, appEnvironment, getLocalStorage, getOcid } from \"@msnews/core\";\r\n\r\nimport { SocialReactions } from \"../schema/SocialBarData\";\r\nimport { SocialServiceMapper } from \"../mapper/SocialServiceMapper\";\r\nimport { User } from \"../schema/User\";\r\nimport { enums } from \"../schema/enums\";\r\nimport { getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { MY_REACTIONIDS, MY_REACTION_PREFIX } from \"../Constants\";\r\n\r\nexport enum ItemTypes {\r\n contents = \"contents\",\r\n comments = \"comments\",\r\n users = \"users\"\r\n}\r\n\r\nexport const saveLocalContentReaction = (id: string, reactionType: SocialReactions, reset: boolean, localStorageSave?: (id: string, reaction?: string) => void): void => {\r\n if (localStorageSave) {\r\n localStorageSave(id, reset ? null : reactionType);\r\n } else if (getLocalStorage().supported) {\r\n if (reset) {\r\n getLocalStorage().setItem(`${MY_REACTION_PREFIX}${id}`, \"\"); // Compatibility\r\n getLocalStorage().removeItem(`${MY_REACTION_PREFIX}${id}`);\r\n const myReactionIds = getLocalStorage().getItem(MY_REACTIONIDS);\r\n let ids = myReactionIds ? myReactionIds.split(\",\") : [];\r\n ids = ids.filter(x => x != id);\r\n getLocalStorage().setItem(MY_REACTIONIDS, ids.join(\",\"));\r\n } else if (reactionType) {\r\n const myReactionIds = getLocalStorage().getItem(MY_REACTIONIDS);\r\n let ids = myReactionIds ? myReactionIds.split(\",\") : [];\r\n // Cleanup local storage\r\n // If local storage exceed more than 200 ids remove the first half 100\r\n if (ids.length > 200) {\r\n ids = ids.filter((x, y) => {\r\n if (y < 100) {\r\n getLocalStorage().removeItem(`${MY_REACTION_PREFIX}${x}`);\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n ids.push(id);\r\n getLocalStorage().setItem(`${MY_REACTION_PREFIX}${id}`, reactionType);\r\n getLocalStorage().setItem(MY_REACTIONIDS, ids.join(\",\"));\r\n }\r\n }\r\n};\r\n\r\nexport const getXPayToken = async (meId: string): Promise => {\r\n const isPpeEnabled = getLocationSearch().toLowerCase().indexOf(enums.selectPpeParameter) > -1;\r\n if (appEnvironment.Environment === Environment.int && !isPpeEnabled) {\r\n console.warn(\"PPE environment must be enabled in INT environment for Subscription SDK to work\");\r\n } else if (appEnvironment.Environment === Environment.prod && isPpeEnabled) {\r\n console.warn(\"PPE environment must not be enabled in PROD environment for Subscription SDK to work\");\r\n }\r\n\r\n if (getLocalStorage().supported) {\r\n const env = isPpeEnabled ? \"int\" : \"prod\";\r\n const tokenStorageKey = `community_xpay_token_${meId}_${env}`;\r\n const tokenExpirationStorageKey = `community_xpay_token_expires_${meId}_${env}`;\r\n\r\n const storedToken = getLocalStorage().getItem(tokenStorageKey);\r\n if (storedToken) {\r\n const tokenExpires = getLocalStorage().getItem(tokenExpirationStorageKey);\r\n if (tokenExpires && ((new Date(parseInt(tokenExpires))).valueOf() - Date.now()) > 10000) { // more than ten seconds to expiration\r\n return storedToken;\r\n }\r\n }\r\n\r\n const response = await SocialService.getXPayTokenInfo();\r\n getLocalStorage().setItem(tokenStorageKey, response.accessToken);\r\n getLocalStorage().setItem(tokenExpirationStorageKey, (Date.now() + response.expiresIn*1000).toString());\r\n return response.accessToken;\r\n } else {\r\n const response = await SocialService.getXPayTokenInfo();\r\n return response.accessToken;\r\n }\r\n};\r\n\r\nexport class SocialService {\r\n private static domain = enums.externalUrls.api;\r\n private static testDomain = enums.externalUrls.ppeApi;\r\n private static sendAuthHeader: string;\r\n private static get msaAccessToken(): string {\r\n return getParameter(\"msaAccessToken\");\r\n }\r\n private static get muid(): string {\r\n return getParameter(\"muid\");\r\n }\r\n private static get fdhead(): string {\r\n return getParameter(\"fdhead\") || (appEnvironment.CurrentRequestTargetScope &&\r\n appEnvironment.CurrentRequestTargetScope.pageExperiments &&\r\n appEnvironment.CurrentRequestTargetScope.pageExperiments.join());\r\n }\r\n private static get ocid(): string {\r\n return getParameter(\"ocid\") || getOcid();\r\n }\r\n private static endpoints = {\r\n contents: SocialService.domain.concat(\"urls/\"),\r\n comments: SocialService.domain.concat(\"comments/\"),\r\n commentsCDN: \"https://assets.msn.com/service/community/comments/\",\r\n users: SocialService.domain.concat(\"users/\"),\r\n systags: \"https://api.msn.com/graph/systags\",\r\n typingUpdates: \"https://assets.msn.com/labs/api/\"\r\n };\r\n\r\n constructor(sendAuthHeader) {\r\n SocialService.sendAuthHeader = sendAuthHeader;\r\n }\r\n\r\n // SocialService Config\r\n public static setDomain(newDomain) {\r\n this.domain = newDomain;\r\n this.endpoints = {\r\n ...this.endpoints,\r\n contents: SocialService.domain.concat(\"urls/\"),\r\n comments: SocialService.domain.concat(\"comments/\"),\r\n users: SocialService.domain.concat(\"users/\")\r\n };\r\n }\r\n\r\n // USER\r\n public static async fetchMe(verify): Promise {\r\n return SocialService.getUserById(\"me\", verify);\r\n }\r\n\r\n public static async deleteMyData(deletingData): Promise {\r\n const queryParams = {\r\n ...deletingData,\r\n profile: \"social\"\r\n };\r\n return SocialService.DELETE(SocialService.endpoints.users + \"me/\", queryParams);\r\n }\r\n\r\n public static async getUserById(userId: string, verify = false) {\r\n return SocialService.GET(SocialService.endpoints.users + userId, { version: \"1.1\", profile: \"social\", verify: verify })\r\n .then((data) => SocialServiceMapper.convertUser(data || null));\r\n }\r\n\r\n public static async getXPayTokenInfo() {\r\n return SocialService.GET(SocialService.domain + \"xpaytoken\");\r\n }\r\n\r\n public static async getUserProfile(userId: string) {\r\n let user = {\r\n followers: undefined,\r\n following: undefined,\r\n comments: undefined\r\n };\r\n return Promise.all([\r\n SocialService.GET(SocialService.endpoints.users + userId, { version: \"1.1\", profile: \"social\" }) // get user\r\n .then((data) => {\r\n user = {\r\n ...user,\r\n ...SocialServiceMapper.convertUser(data || null)\r\n };\r\n }),\r\n SocialService.getFollowersByUserId(userId).then((data) => {\r\n user.followers = data;\r\n }),\r\n SocialService.getFollowingsByUserId(userId).then((data) => {\r\n user.following = data;\r\n }),\r\n SocialService.getCommentsByUserId(userId).then((data) => {\r\n user.comments = data;\r\n })\r\n ]).then((results) => {\r\n return user;\r\n }).catch((data) => {\r\n logger.logError(\"Error getting user profile: \" + data.statusText);\r\n });\r\n }\r\n\r\n public static async getUserContents(userId: string, market: string, premium?: boolean, args: any = {}) {\r\n const params: any = {\r\n market,\r\n $top: args.top || 20,\r\n $skip: args.skip || 0,\r\n $orderby: args.orderBy || \"Time\"\r\n };\r\n if (premium) {\r\n params.productType = \"premium\";\r\n }\r\n return SocialService.GET(SocialService.endpoints.users + userId + \"/contents\", params);\r\n }\r\n\r\n public static async appealMe() {\r\n return SocialService.POST(SocialService.endpoints.users + \"me/appeals\", {});\r\n }\r\n\r\n public static async appealMyPicture() {\r\n return SocialService.POST(SocialService.endpoints.users + \"me/pictureAppeals\", {});\r\n }\r\n\r\n public static async getFollowersByUserId(userId, top = 10, skip = 0): Promise {\r\n const queryParams = {\r\n $top: top,\r\n $skip: skip\r\n };\r\n return SocialService.GET(SocialService.endpoints.users + userId + \"/followers\", queryParams).then(data => SocialServiceMapper.convertUserList(data));\r\n }\r\n\r\n public static async getFollowingsByUserId(userId, top = 10, skip = 0): Promise {\r\n const queryParams = {\r\n $top: top,\r\n $skip: skip\r\n };\r\n return SocialService.GET(SocialService.endpoints.users + userId + \"/followings\", queryParams).then(data => SocialServiceMapper.convertUserList(data));\r\n }\r\n\r\n /** @param userInfo Used to create a matching user */\r\n public static async createUser(notUserAvatar?: boolean) {\r\n const postBody = { notUseAvatar: notUserAvatar || false };\r\n return SocialService.POST(SocialService.endpoints.users + \"me\", postBody, { profile: \"social\" }, undefined)\r\n .then((data) => SocialServiceMapper.convertUser(data || null))\r\n .catch(e => { return e.json().then(error => { throw error; }); });\r\n }\r\n\r\n /** @param isPrivateProfile Can be one of: true, false */\r\n public static async updateUserSettings(userId: string, isPrivateProfile: boolean) {\r\n const queryParams = {};\r\n const postBody = {};\r\n postBody[userId] = {\r\n isPrivateProfile: isPrivateProfile\r\n };\r\n return SocialService.PUT(SocialService.endpoints.users + userId + \"/settings\", postBody, queryParams, userId);\r\n }\r\n public static async followUser(userId: string, targetId: string) {\r\n return SocialService.POST(SocialService.endpoints.users + targetId + \"/followers/\" + userId, {}, {}, userId);\r\n }\r\n public static async unfollowUser(userId: string, targetId: string) {\r\n return SocialService.DELETE(SocialService.endpoints.users + targetId + \"/followers/\" + userId, {}, userId);\r\n }\r\n public static async getUserIsFollowed(userId: string, targetId: string) {\r\n return new Promise((resolve, reject) => {\r\n if (!userId) {\r\n resolve(null);\r\n return;\r\n }\r\n SocialService.GET(SocialService.endpoints.users + targetId + \"/followers/\" + userId, {})\r\n .then((data) => resolve(true))\r\n .catch((data) => resolve(false));\r\n });\r\n }\r\n public static async reportUser(userId: string, reportItemType: string, reportType: string, intellectualPropertyReportParams?: any) {\r\n const urlPart = reportItemType == \"ProfilePicture\" ? \"PictureAbusereports\" : \"NameAbusereports\";\r\n\r\n const { reportMessage, intellectualPropertyDetails } = intellectualPropertyReportParams || {};\r\n const postBody = {\r\n ReportType: reportType,\r\n ReportMessage: reportMessage || \"\",\r\n IntellectualPropertyDetails: intellectualPropertyDetails\r\n };\r\n try {\r\n return SocialService.POST(SocialService.endpoints.users + userId + \"/\" + urlPart, postBody, {});\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n public static async getUserNotifications() {\r\n const queryParams = {\r\n onlynotification: true,\r\n read: false,\r\n $top: 5,\r\n $skip: 0\r\n };\r\n return SocialService.GET(SocialService.endpoints.users + \"me/activities\", queryParams)\r\n .then((data) => SocialServiceMapper.convertUserActivities(data || null));\r\n }\r\n public static async getUserActivities(top, skip) {\r\n const queryParams = {\r\n $top: top || 50,\r\n $skip: skip || 0\r\n };\r\n return SocialService.GET(SocialService.endpoints.users + \"me/activities\", queryParams)\r\n .then((data) => SocialServiceMapper.convertUserActivities(data || null));\r\n }\r\n public static async updateUserActivityStatus(id: string, read = true) {\r\n const postBody = {\r\n id: id,\r\n read: read\r\n };\r\n return SocialService.POST(SocialService.endpoints.users + \"me/activities\", postBody);\r\n }\r\n\r\n // CONTENT\r\n public static async getContentById(cmsid: string, market?: string) {\r\n const params = this.isURL(cmsid) ? {\r\n url: cmsid,\r\n market,\r\n version: \"1.1\"\r\n } : {\r\n cmsid,\r\n market,\r\n version: \"1.1\"\r\n };\r\n if (!market) {\r\n delete params.market;\r\n }\r\n return SocialService.GET(SocialService.endpoints.contents, params)\r\n .then((data) => SocialServiceMapper.convertContent(data || null));\r\n }\r\n\r\n // https://stackoverflow.com/questions/8667070/javascript-regular-expression-to-validate-url\r\n private static isURL(value: string) {\r\n return /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(value);\r\n }\r\n\r\n // COMMENT\r\n public static async getCommentById(commentId) {\r\n return SocialService.GET(SocialService.endpoints.comments + commentId)\r\n .then((data) => SocialServiceMapper.convertComment(data || null));\r\n }\r\n public static async getCommentByIdFromCDN(commentId) {\r\n return SocialService.GET(SocialService.endpoints.commentsCDN + commentId)\r\n .then((data) => SocialServiceMapper.convertComment(data || null));\r\n }\r\n public static async getCommentsByContentId(contentId, args) {\r\n const queryParams = {\r\n contentId: contentId,\r\n $top: args.top || 50,\r\n $skip: args.skip || 0,\r\n $orderby: args.orderBy || args.sortType || \"Rating\"\r\n };\r\n return SocialService.GET(SocialService.endpoints.comments, queryParams)\r\n .then((data) => {\r\n // Calculate comment status\r\n let commentStatus = \"On\";\r\n try {\r\n const contentCommentStatus = data.links.find((link) => link.type == \"Content\").item.commentStatus;\r\n commentStatus = contentCommentStatus || commentStatus;\r\n } catch (e) {\r\n logger.logError(\"Invalid content data in comments response.\");\r\n }\r\n\r\n // Crate commentsList with pagination info and commentStatus\r\n try {\r\n const commentsObj = SocialServiceMapper.convertCommentList(data || null);\r\n commentsObj.commentStatus = commentStatus;\r\n\r\n return commentsObj;\r\n } catch (e) {\r\n logger.logError(\"Invalid comment list data in comments response.\");\r\n\r\n return {\r\n commentStatus: \"Off\",\r\n list: []\r\n };\r\n }\r\n });\r\n }\r\n public static async getCommentsByParentId(parentCommentId, args) {\r\n const queryParams = {\r\n parentId: parentCommentId,\r\n $top: args.top || 10,\r\n $skip: args.skip || 0,\r\n $orderby: args.orderBy || \"Time\"\r\n };\r\n return SocialService.GET(SocialService.endpoints.comments, queryParams)\r\n .then((data) => SocialServiceMapper.convertCommentList(data || null));\r\n }\r\n public static async getCommentsByAnchorCommentId(anchorCommentId, args) {\r\n const queryParams = {\r\n anchorId: anchorCommentId,\r\n $top: args.top || 10,\r\n $skip: args.skip || 0,\r\n $orderby: args.orderBy || \"Time\"\r\n };\r\n return SocialService.GET(SocialService.endpoints.comments, queryParams)\r\n .then((data) => SocialServiceMapper.convertCommentList(data || null));\r\n }\r\n public static async getCommentsByUserId(userId, top = 10, skip = 0, orderBy = \"Time\"): Promise {\r\n const queryParams = {\r\n userId: userId,\r\n $top: top,\r\n $skip: skip,\r\n $orderby: orderBy\r\n };\r\n return SocialService.GET(SocialService.endpoints.comments, queryParams)\r\n .then((data) => SocialServiceMapper.convertCommentList(data || null));\r\n }\r\n public static async postComment(contentId, userId, commentBody, commentParentId = undefined, commentMentionReplyId = undefined) {\r\n const postBody = {\r\n ContentId: contentId,\r\n Body: commentBody,\r\n parentId: commentParentId && commentParentId != contentId ? commentParentId : undefined,\r\n mentionReply: commentMentionReplyId\r\n };\r\n return new Promise((resolve, reject) => {\r\n SocialService.POST(SocialService.endpoints.comments, postBody, {}, userId)\r\n .then((data) => {\r\n resolve(SocialServiceMapper.convertComment(data || null));\r\n }, (response) => {\r\n response.json().then(data => {\r\n reject(data);\r\n }).catch(e => {\r\n logger.logError(\"Error getting comment info: \" + response.statusText);\r\n reject();\r\n });\r\n });\r\n });\r\n }\r\n public static async deleteComment(commentId) {\r\n return SocialService.DELETE(SocialService.endpoints.comments + commentId, {});\r\n }\r\n public static async appealComment(commentId) {\r\n return SocialService.POST(SocialService.endpoints.comments + commentId + \"/appeals\", {});\r\n }\r\n public static async reportComment(commentId, reportType, intellectualPropertyReportParams?) {\r\n const { reportMessage, intellectualPropertyDetails } = intellectualPropertyReportParams || {};\r\n const postBody = {\r\n ReportType: reportType,\r\n ReportMessage: reportMessage || \"\",\r\n IntellectualPropertyDetails: intellectualPropertyDetails\r\n };\r\n try {\r\n return SocialService.POST(SocialService.endpoints.comments + commentId + \"/abusereports\", postBody, {});\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n public static async uploadCopyrightFile(file): Promise {\r\n const sasTokenInfo = await SocialService.GET(SocialService.endpoints.users + \"me/UploadSasToken\", { type: \"ContentReport\" });\r\n const AzureStorage = await fetchBlobClient();\r\n const blobUri = `https://${sasTokenInfo.accountUrl.split(\"?\")[0]}`;\r\n const blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri, sasTokenInfo.sasString);\r\n return new Promise((res, rej) => {\r\n blobService.createBlockBlobFromBrowserFile(sasTokenInfo.container, sasTokenInfo.blobName, file, async (error, result, response) => {\r\n if (error) {\r\n return rej(error);\r\n }\r\n return res(sasTokenInfo.id);\r\n });\r\n });\r\n }\r\n\r\n // ITEMS\r\n public static async rate(item, id, rateValue, forceRate = false, localStorageSave?: (id: string, reaction?: string) => void) {\r\n const queryParams = {};\r\n const postBody = {\r\n subType: rateValue\r\n };\r\n try {\r\n const data = await SocialService.POST(SocialService.endpoints[item] + id + \"/reactions\", postBody, queryParams);\r\n saveLocalContentReaction(id, rateValue, false, localStorageSave);\r\n return SocialServiceMapper.convertRatingToRateValue(data || null);\r\n } catch (e) {\r\n logger.logError(e);\r\n return rateValue;\r\n }\r\n }\r\n public static async resetRating(item, id, localStorageSave?: (id: string, reaction?: string) => void) {\r\n try {\r\n saveLocalContentReaction(id, null, true, localStorageSave);\r\n return SocialService.DELETE(SocialService.endpoints[item] + id + \"/reactions\", {});\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n public static async getFriendRatings(item, id) {\r\n return SocialService.GET(SocialService.endpoints[item] + id + \"/reactions\", { friends: true, $top: 2 });\r\n }\r\n public static async getRating(item, id) {\r\n return SocialService.GET(SocialService.endpoints[item] + id + \"/reactions\", {})\r\n .then((data) => SocialServiceMapper.convertRatingToRateValue(data || null));\r\n }\r\n public static async getRatingBreakdown(item, id) {\r\n return SocialService.GET(SocialService.endpoints[item] + id + \"/reactions\", { others: true })\r\n .then((data) => SocialServiceMapper.convertReactionsResponseToReactionBreakdownData(data || null));\r\n }\r\n\r\n private static prepareHubString(contentId: string) {\r\n return contentId.replace(/-/g, \"_\"); // signalR won't accept hubs with dashes\r\n }\r\n\r\n // Realtime Typing Updates\r\n public static async getSignalRConnectionInfo(contentId: string) {\r\n const hub = this.prepareHubString(contentId);\r\n return SocialService.POST(SocialService.endpoints.typingUpdates + \"RealtimeTypingNegotiate\", {}, { hub });\r\n }\r\n\r\n public static async broadcastCommentNotification(contentId: string, commentId: string, commentParentId: string) {\r\n const hub = this.prepareHubString(contentId);\r\n const data = {\r\n type: \"comment-notification\",\r\n data: {\r\n commentId,\r\n commentParentId\r\n }\r\n };\r\n return SocialService.POST(SocialService.endpoints.typingUpdates + \"RealtimeTypingBroadcast\", data, { hub }).then(res => { }, err => { });\r\n }\r\n\r\n public static async broadcastTypingNotification(contentId: string, id: string, name: string, profileImageUrl: string) {\r\n const hub = this.prepareHubString(contentId);\r\n const data = {\r\n type: \"typing-notification\",\r\n data: {\r\n id,\r\n name,\r\n profileImageUrl\r\n }\r\n };\r\n return SocialService.POST(SocialService.endpoints.typingUpdates + \"RealtimeTypingBroadcast\", data, { hub }, id).then(res => { }, err => { });\r\n }\r\n\r\n private static async GET(url, queryParams?, userId?) {\r\n queryParams = queryParams || {};\r\n const requestArgs = {\r\n queryParams: queryParams,\r\n authHeader: undefined,\r\n body: undefined,\r\n method: \"GET\"\r\n };\r\n if (userId && SocialService.sendAuthHeader) {\r\n requestArgs.authHeader = userId;\r\n }\r\n return this.xhr(url, requestArgs);\r\n }\r\n\r\n private static async POST(url, data, queryParams?, userId?, type = \"POST\") {\r\n queryParams = queryParams || {};\r\n const requestArgs = {\r\n method: type,\r\n queryParams: queryParams,\r\n body: data,\r\n authHeader: undefined\r\n };\r\n if (userId && SocialService.sendAuthHeader) {\r\n requestArgs.authHeader = userId;\r\n }\r\n return this.xhr(url, requestArgs);\r\n }\r\n\r\n private static async PUT(url, data, queryParams, userId?) {\r\n return SocialService.POST(url, data, queryParams, userId, \"PUT\");\r\n }\r\n\r\n private static async DELETE(url, queryParams, userId?) {\r\n queryParams = queryParams || {};\r\n const requestArgs = {\r\n method: \"DELETE\",\r\n queryParams: queryParams,\r\n authHeader: undefined,\r\n body: undefined\r\n };\r\n if (userId && SocialService.sendAuthHeader) {\r\n requestArgs.authHeader = userId;\r\n }\r\n return this.xhr(url, requestArgs);\r\n }\r\n\r\n private static cachedResponses: { [url: string]: Promise } = {};\r\n private static clearCache() {\r\n SocialService.cachedResponses = {};\r\n }\r\n\r\n private static async fetchRetry(url, options, retry = 2) {\r\n try {\r\n const res = await fetch(url, options);\r\n if (res.status >= 500) {\r\n throw new Error(\"Retry API error\");\r\n }\r\n return res;\r\n } catch (err) {\r\n if (retry <= 1) {\r\n throw err;\r\n }\r\n return await SocialService.fetchRetry(url, options, retry - 1);\r\n }\r\n }\r\n\r\n private static fetchCachedResponse(url, options) {\r\n if (options && options.method == \"GET\" && url in SocialService.cachedResponses) {\r\n return SocialService.cachedResponses[url];\r\n }\r\n\r\n if (options && options.method != \"GET\") {\r\n SocialService.clearCache();\r\n }\r\n\r\n const result = SocialService.fetchRetry(url, options);\r\n if (options && options.method == \"GET\") {\r\n SocialService.cachedResponses[url] = result;\r\n setTimeout(() => {\r\n if (url in SocialService.cachedResponses) {\r\n delete SocialService.cachedResponses[url];\r\n }\r\n }, 500);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static async xhr(url, args = {\r\n queryParams: undefined,\r\n method: undefined,\r\n authHeader: undefined,\r\n body: undefined\r\n }): Promise {\r\n // receives args: method, queryParams, headers, body\r\n args.queryParams.scn = appEnvironment.AppType === \"windowsShell\" ? \"APP_ANON\" : \"MSNRPSAuth\";\r\n args.queryParams.wrapodata = \"false\";\r\n\r\n const headers = { \"Content-Type\": \"application/json\" };\r\n if (args.authHeader) {\r\n headers[\"X-MSN-SCP-Auth\"] = args.authHeader;\r\n }\r\n if (SocialService.msaAccessToken) {\r\n headers[\"UserTicketType\"] = \"2\";\r\n headers[\"UserAuthToken\"] = SocialService.msaAccessToken;\r\n headers[\"SiteName\"] = \"api.msn.com\";\r\n }\r\n if (SocialService.muid) {\r\n headers[\"muid\"] = \"m-\" + SocialService.muid;\r\n }\r\n if (SocialService.fdhead) {\r\n args.queryParams.fdhead = SocialService.fdhead;\r\n }\r\n if (SocialService.ocid) {\r\n args.queryParams.ocid = SocialService.ocid;\r\n }\r\n\r\n const queryString = generateQueryStringByKeyVals(args.queryParams);\r\n const fetchOptions: any = {\r\n method: args.method || \"GET\",\r\n headers,\r\n credentials: \"include\"\r\n };\r\n if (args.body) {\r\n fetchOptions.body = JSON.stringify(args.body);\r\n }\r\n\r\n return SocialService.fetchCachedResponse(url + queryString, fetchOptions).then(response => {\r\n if (response.status >= 200 && response.status < 300 || response.status == 401) {\r\n if (response.status == 204) {\r\n return {};\r\n }\r\n try {\r\n // Cloning for multiple consumers\r\n return response.clone().json().then(result => {\r\n if (result.value) {\r\n result = result.value[0];\r\n }\r\n return result;\r\n });\r\n } catch (e) {\r\n this.onRequestError(url, args);\r\n throw ({\r\n status: response.status,\r\n statusText: \"INVALID_RESPONSE\"\r\n });\r\n }\r\n } else {\r\n if (response.status > 499 || response.status == 400) {\r\n this.onRequestError(url, args);\r\n }\r\n throw response;\r\n }\r\n });\r\n }\r\n\r\n private static onRequestError(url, args): void {\r\n const resource = this.resourceForUrl(url);\r\n const appError: AppError = ApiErrors[resource] || ApiErrors.unknown;\r\n appErrorLogger.log({\r\n ...appError,\r\n message: \"Request failed\",\r\n pb: {\r\n ...appError.pb,\r\n customMessage: resource,\r\n url: url,\r\n method: args.method\r\n }\r\n } as AppError);\r\n }\r\n\r\n private static resourceForUrl(url): string {\r\n for (const [key, value] of Object.entries(ItemTypes)) {\r\n if (url.indexOf(`/${value}`) > 0) {\r\n return value;\r\n }\r\n }\r\n return \"unknown\";\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nfunction setBodyUserSelect(value: string) {\r\n document.body.style[\"-webkit-touch-callout\"] = value;\r\n document.body.style[\"-webkit-user-select\"] = value;\r\n document.body.style[\"-khtml-user-select\"] = value;\r\n document.body.style[\"-moz-user-select\"] = value;\r\n document.body.style[\"-ms-user-select\"] = value;\r\n document.body.style[\"user-select\"] = value;\r\n}\r\n\r\nfunction preventSelection(e) {\r\n setBodyUserSelect(\"none\");\r\n\r\n const removeNoSelect = () => setBodyUserSelect(\"unset\");\r\n\r\n document.body.addEventListener(\"click\", removeNoSelect, {once: true});\r\n document.body.addEventListener(\"mouseup\", removeNoSelect, {once: true});\r\n document.body.addEventListener(\"touchend\", removeNoSelect, {once: true});\r\n}\r\n\r\nfunction getPointerCoordinatesByEvent(e) {\r\n let coords;\r\n if (e.type == \"touchstart\" || e.type == \"touchmove\" || e.type == \"touchend\" || e.type == \"touchcancel\") {\r\n const evt = (typeof e.originalEvent === \"undefined\") ? e : e.originalEvent;\r\n const touch = evt.touches[0] || evt.changedTouches[0];\r\n coords = {x: touch.clientX, y: touch.clientY};\r\n } else if (e.type == \"mousedown\" || e.type == \"mouseup\" || e.type == \"mousemove\" || e.type == \"mouseover\"|| e.type==\"mouseout\" || e.type==\"mouseenter\" || e.type==\"mouseleave\") {\r\n coords = {x: e.clientX, y: e.clientY};\r\n }\r\n\r\n return coords;\r\n}\r\n\r\nfunction isPointerOnElement(e: Event, el: HTMLElement) {\r\n if (!e || !el) { return; }\r\n\r\n const rect = el.getBoundingClientRect();\r\n const pointerCoords = getPointerCoordinatesByEvent(e);\r\n return rect.left <= pointerCoords.x && rect.right >= pointerCoords.x && rect.top <= pointerCoords.y && rect.bottom >= pointerCoords.y;\r\n}\r\n\r\nexport {preventSelection, getPointerCoordinatesByEvent, isPointerOnElement};","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\ndeclare global {\r\n interface Window {\r\n ReactNativeWebView: any;\r\n }\r\n}\r\n\r\nfunction sendBridgeEvent(bridgeEventName, data: any = {}) {\r\n try {\r\n data = {\r\n type: bridgeEventName,\r\n ...data\r\n };\r\n window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify({type: \"community\", data: data}));\r\n } catch (e) {\r\n // suppress error\r\n }\r\n}\r\n\r\nconst lockTouch = () => sendBridgeEvent(\"lock-touch\");\r\nconst unlockTouch = () => sendBridgeEvent(\"unlock-touch\");\r\n\r\nexport {lockTouch, unlockTouch};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getPointerCoordinatesByEvent, isPointerOnElement, preventSelection } from \"./utils/EventHelpers\";\r\nimport { lockTouch, unlockTouch } from \"./utils/BridgeHelpers\";\r\n\r\nimport { enums } from \"@msnews/social-data-service\";\r\n\r\n/**\r\n * GENERIC TOUCH & SLIDE HANDLER\r\n */\r\ninterface TouchSlideCallbacks {\r\n onLongpress?: (target: HTMLElement) => void; // called when longpress mode activated (timeout is achieved)\r\n onLongpressEnd?: (e: Event) => void; // called at the first touch-end or touch-move after longpress mode activated\r\n onTouchStart?: (e: Event) => void;\r\n onTouchEnd?: (e: Event) => void;\r\n onTriggerClick?: (e: Event) => void;\r\n onSlide?: (coords: any, e: Event) => void;\r\n onSlideStart?: (target: HTMLElement) => void;\r\n onSlideEnd?: () => void;\r\n}\r\n\r\ninterface TouchSlideConfig {\r\n slideDisabled?: boolean;\r\n longpressDisabled?: boolean;\r\n}\r\n\r\nclass TouchSlideHandler {\r\n static readonly trackingPeriod = 16; // 60 Hz\r\n private static lastTouchEndTime = 0;\r\n\r\n // Configurable Parameters\r\n private longPressTimeout = 250; // [ms]\r\n private reopenTimeout = 50; // [ms] time period that must pass before another reactionmenu can open by touch\r\n private slideDisabled = false;\r\n private longpressDisabled = false;\r\n\r\n // Main Proporties\r\n private hasLongpressed: boolean;\r\n private isHandled: boolean; // true if event handlers are attached and not removed\r\n protected triggerElement: HTMLElement;\r\n private callbacks: TouchSlideCallbacks;\r\n\r\n constructor(callbacks: TouchSlideCallbacks, config?: TouchSlideConfig) {\r\n this.callbacks = callbacks;\r\n this.triggerTouchStartHandler = this.triggerTouchStartHandler.bind(this);\r\n this.triggerClickHandler = this.triggerClickHandler.bind(this);\r\n this.touchEndHandler = this.touchEndHandler.bind(this);\r\n\r\n this.slideDisabled = config && config.slideDisabled;\r\n this.longpressDisabled = config && config.longpressDisabled;\r\n }\r\n\r\n public setupTrigger(target: HTMLElement) {\r\n // Event captured from a NEW or DIFFERENT element\r\n if (this.triggerElement != target) {\r\n this.unregisterTriggerEventHandlers();\r\n this.triggerElement = target;\r\n }\r\n this.registerTriggerEventHandlers();\r\n }\r\n\r\n public setupTriggerAtTouchStart(e: Event) {\r\n this.setupTrigger(e.currentTarget as HTMLElement);\r\n this.triggerTouchStartHandler(e);\r\n }\r\n\r\n public dispose() {\r\n this.unregisterTriggerEventHandlers();\r\n this.triggerElement = null;\r\n }\r\n\r\n public releaseTouchEvents() {\r\n unlockTouch();\r\n this.unregisterTriggerEventHandlers();\r\n }\r\n\r\n // :: TOUCH HANDLERS\r\n private triggerTouchStartHandler(e: Event) {\r\n !this.longpressDisabled && this.listenLongpress(e.currentTarget as HTMLElement);\r\n !this.slideDisabled && this.listenSlideStart(e.currentTarget as HTMLElement);\r\n this.callbacks.onTouchStart && this.callbacks.onTouchStart(e);\r\n preventSelection(e);\r\n lockTouch();\r\n if (!this.enoughTimePassedSinceLastTouchEnd(e.timeStamp)) { return; }\r\n }\r\n\r\n private triggerClickHandler(e: Event) {\r\n // If long press activated right before this click\r\n if (this.hasLongpressed && isPointerOnElement(e, this.triggerElement)) {\r\n e.stopPropagation();\r\n return;\r\n }\r\n\r\n // Check if the event fired when touch point inside on trigger element\r\n if (isPointerOnElement(e, this.triggerElement)) {\r\n this.triggerElement.click();\r\n this.triggerElement.blur();\r\n unlockTouch();\r\n this.callbacks.onTriggerClick && this.callbacks.onTriggerClick(e);\r\n }\r\n }\r\n\r\n private touchEndHandler(e: Event) {\r\n this.callbacks.onTouchEnd && this.callbacks.onTouchEnd(e);\r\n this.releaseTouchEvents();\r\n }\r\n\r\n // :: LONGPRESS HANDLERS\r\n private listenLongpress = (target: HTMLElement) => {\r\n if (this.hasLongpressed) { return; } // if already in lonpress mode do nothing\r\n let isInterrupted = false;\r\n\r\n // Define functions to call for when timeout achieved or interrupted\r\n const stopLongpress = () => isInterrupted = true;\r\n const initiateLongpress = () => {\r\n if (isInterrupted) { return; }\r\n this.hasLongpressed = true;\r\n this.callbacks.onLongpress && this.callbacks.onLongpress(target);\r\n\r\n // Set the event handlers to get out of longpress mode\r\n document.addEventListener(\"touchstart\", () => {\r\n this.hasLongpressed = false;\r\n document.addEventListener(\"touchend\", this.callbacks.onLongpressEnd, {once: true});\r\n document.addEventListener(\"touchmove\", this.callbacks.onLongpressEnd, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n // Set LongPress timer to initiate SLIDE event\r\n setTimeout(initiateLongpress, this.longPressTimeout);\r\n\r\n // Stop longpress timer if touchend fires before timeout\r\n target.addEventListener(\"touchend\", stopLongpress, {once: true});\r\n target.addEventListener(\"touchmove\", stopLongpress, {once: true});\r\n\r\n };\r\n\r\n // :: SLIDE HANDLERS\r\n private listenSlideStart = (target: HTMLElement) => {\r\n // Slide Event Initiation\r\n const initiateSlide = () => {\r\n this.triggerElement.removeEventListener(\"touchend\", this.triggerClickHandler);\r\n\r\n this.callbacks.onSlideStart && this.callbacks.onSlideStart(target);\r\n this.listenSliding(); // Start listening slide events\r\n };\r\n\r\n // Listen TouchMove to initiate SLIDE event\r\n document.addEventListener(\"touchmove\", initiateSlide, {once: true});\r\n\r\n // TERMINATE initiating SLIDE event\r\n document.addEventListener(\"touchend\", () => {\r\n document.removeEventListener(\"touchmove\", initiateSlide);\r\n }, {once: true});\r\n };\r\n\r\n private listenSliding() {\r\n this.hasLongpressed = false;\r\n\r\n let lastMoveTimeStamp = 0;\r\n const touchMoveHandler = (e: Event) => {\r\n e.stopPropagation();\r\n e.cancelable && e.preventDefault();\r\n\r\n // Skip if touch change period is shorter than [touchTrackingPeriod]\r\n if (e.timeStamp - lastMoveTimeStamp < TouchSlideHandler.trackingPeriod) { return; }\r\n lastMoveTimeStamp = e.timeStamp;\r\n\r\n const coords = getPointerCoordinatesByEvent(e); // Get last touch coordinates\r\n this.callbacks.onSlide && this.callbacks.onSlide(coords, e);\r\n };\r\n\r\n // Listen Slide Events\r\n document.addEventListener(\"touchmove\", touchMoveHandler, {capture: true, passive: false});\r\n\r\n // Stop Listening Slide Events\r\n document.addEventListener(\"touchend\", () => {\r\n document.removeEventListener(\"touchmove\", touchMoveHandler, {capture: true});\r\n this.callbacks.onSlideEnd && this.callbacks.onSlideEnd();\r\n }, {capture: true, once: true});\r\n }\r\n\r\n // :: ADD / REMOVE HANDLERS of TRIGGER ELEMENT\r\n // ADD EventListeners if triggerElement is set and handlers are not attached\r\n private registerTriggerEventHandlers() {\r\n setTimeout(() => {\r\n if (!this.triggerElement || this.isHandled) { return; }\r\n this.isHandled = true;\r\n this.triggerElement.addEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n this.triggerElement.addEventListener(\"touchend\", this.triggerClickHandler);\r\n document.addEventListener(\"touchend\", this.touchEndHandler);\r\n }, 10);\r\n }\r\n\r\n // REMOVE EventListeners if triggerElement is set and handlers are attached\r\n private unregisterTriggerEventHandlers() {\r\n if (!this.triggerElement || !this.isHandled) { return; }\r\n this.isHandled = false;\r\n this.triggerElement.removeEventListener(\"touchstart\", this.triggerTouchStartHandler);\r\n this.triggerElement.removeEventListener(\"touchend\", this.triggerClickHandler);\r\n document.removeEventListener(\"touchend\", this.touchEndHandler);\r\n }\r\n\r\n // UTIL\r\n private enoughTimePassedSinceLastTouchEnd(timeStamp: number) {\r\n return timeStamp - TouchSlideHandler.lastTouchEndTime > this.reopenTimeout;\r\n }\r\n}\r\n\r\n/**\r\n * REACTIONMENU TOUCH & SLIDE HANDLER\r\n */\r\ninterface ReactionMenuTouchSlideCallbacks{\r\n onEmojiFocus: (el: HTMLElement) => void;\r\n onEmojiBlur: (el: HTMLElement) => void;\r\n}\r\nclass ReactionMenuTouchSlideHandler extends TouchSlideHandler {\r\n readonly virtualTray = {\r\n height: 140,\r\n width: 100,\r\n hMargin: 20\r\n };\r\n\r\n // Main Properties\r\n private containerElement: HTMLElement;\r\n private emojiElementSelector: string;\r\n\r\n // Variables that change onSlide\r\n private touchFocusedEmojiElement: HTMLElement;\r\n\r\n // Focus / Blur callbacks\r\n private reactioMenuCallbacks: ReactionMenuTouchSlideCallbacks;\r\n\r\n constructor(callbacks: TouchSlideCallbacks, reactioMenuCallbacks: ReactionMenuTouchSlideCallbacks, emojiSelector: string, config?: TouchSlideConfig) {\r\n super({\r\n ...callbacks,\r\n onSlide: (coords: any, e: Event) => {\r\n this.reactionMenuSlideHandler(coords, e);\r\n callbacks.onSlide && callbacks.onSlide(coords, e);\r\n },\r\n onSlideEnd: () => {\r\n this.reactionHandler();\r\n callbacks.onSlideEnd && callbacks.onSlideEnd();\r\n },\r\n onLongpressEnd: (e: Event) => {\r\n if (isPointerOnElement(e, this.containerElement) || isPointerOnElement(e, this.triggerElement)) { return; }\r\n\r\n callbacks.onLongpressEnd && callbacks.onLongpressEnd(e);\r\n }\r\n }, config);\r\n this.reactioMenuCallbacks = reactioMenuCallbacks;\r\n this.emojiElementSelector = emojiSelector;\r\n }\r\n\r\n public setReactionMenuContainer(el: HTMLElement) {\r\n this.containerElement = el;\r\n }\r\n\r\n public dispose() {\r\n this.containerElement = null;\r\n super.dispose();\r\n }\r\n\r\n // :: MAIN HANDLERS\r\n private reactionHandler() {\r\n this.touchFocusedEmojiElement && this.touchFocusedEmojiElement.click();\r\n }\r\n private reactionMenuSlideHandler(coords: any, e: Event) {\r\n if (!this.containerElement) { return; }\r\n\r\n const reactionMenuRect: ClientRect = this.containerElement.getBoundingClientRect();\r\n\r\n // Calculate virtual tray ranges based on reactionmenu rect\r\n const yRange = {start: reactionMenuRect.top - this.virtualTray.height/2, end: reactionMenuRect.bottom + this.virtualTray.height/2};\r\n const xRange = {start: reactionMenuRect.left, end: reactionMenuRect.left + reactionMenuRect.width};\r\n\r\n // Calculate boundaries per emoji\r\n const virtualWidthPerEmoji = (xRange.end - xRange.start) / enums.reactionOrder.length;\r\n const matchingEmojiIndex = Math.min(Math.max(Math.floor((coords.x - xRange.start)/virtualWidthPerEmoji), 0), enums.reactionOrder.length - 1);\r\n\r\n // Check if touch point is inside any of the emoji boundaries then focus or blur\r\n if (coords.x < xRange.start - this.virtualTray.hMargin || coords.x > xRange.end + this.virtualTray.hMargin || coords.y < yRange.start || coords.y > yRange.end) {\r\n // Unselect focused emojis when touch leaves the virtual tray\r\n this.touchFocusedEmojiElement && this.reactioMenuCallbacks.onEmojiBlur(this.touchFocusedEmojiElement);\r\n this.touchFocusedEmojiElement = null;\r\n } else {\r\n // Focus on the emoji matching with the position inside the virtual tray\r\n const emojiToFocus = this.containerElement.querySelectorAll(this.emojiElementSelector)[matchingEmojiIndex];\r\n if (this.touchFocusedEmojiElement != emojiToFocus) {\r\n this.touchFocusedEmojiElement && this.reactioMenuCallbacks.onEmojiBlur(this.touchFocusedEmojiElement);\r\n this.touchFocusedEmojiElement = emojiToFocus as HTMLElement;\r\n this.reactioMenuCallbacks.onEmojiFocus(this.touchFocusedEmojiElement);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { TouchSlideHandler, ReactionMenuTouchSlideHandler };","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Local storage key to save prerendered page reload telemetry data\r\n */\r\nexport const expPersistentDataChangeTrackerKey = \"epdu\";\r\n\r\n/**\r\n * Local storage key to save prerendered page reload telemetry data\r\n */\r\nexport const prerenderedPageReload = \"ppreload\";\r\n\r\n/**\r\n * Local storage key to track of the page's age (used for telemetry)\r\n */\r\nexport const prerenderedPageAge = \"ppage\";\r\n\r\n/**\r\n * The key for storing \"timeTakenFromVisibleToReload\" value in local storage.\r\n * This value will be used to calculate the totalTimeTaken between when the current page became visible\r\n * and next page(same page reloaded by prerender code)'s TTAFMax event.\r\n */\r\nexport const timeTakenFromVisibleToReloadKey = \"timeTakenFromVisibleToReload\";\r\n\r\n/**\r\n * Visibility change event\r\n */\r\nexport const visibilityChangeEventName = \"visibilitychange\";\r\n\r\n/**\r\n * Force reload flag name\r\n */\r\nexport const forceReloadFlagName = \"fpr\";\r\n\r\n/**\r\n * Time To Page Reveal when page's primary content is already rendered.\r\n * This is for when the page was revealed after the page had finished loading in the background\r\n */\r\nexport const timeToPageRevealMarker = \"TTPR\";\r\n\r\n/**\r\n * Time To Functional SearchBox\r\n */\r\nexport const timeToFunctionalSearchBoxMarker = \"TTF.SearchBox\";\r\n\r\n/**\r\n * Time To Visually Ready Marker\r\n */\r\nexport const timeToVisuallyReadyMarker = \"TTVR\";\r\n\r\n/**\r\n * Time To Visually Ready Marker SearchBox\r\n */\r\nexport const timeToVisuallyReadySearchBoxMarker = \"TTVR.SearchBox\";\r\n\r\n/**\r\n * Time To Visually Ready Marker when the page was loaded in the background\r\n */\r\nexport const ttvrBackgroundExecution = \"TTVR.BackgroundExecution\";\r\n\r\n/**\r\n * PageTiming entry added when the page is background preloaded\r\n */\r\nexport const backgroundPreloadKey = \"backgroundpreload\";\r\n\r\n/**\r\n * PageTiming entry added when the page is prerendered\r\n */\r\nexport const prerenderKey = \"prerender\";\r\n\r\n/**\r\n * Time To Page Visible\r\n */\r\nexport const timeToPageVisible = \"TTPV\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActivityLogItem } from \"clientcore-infrastructure-analytics/models/IActivityLogItem\";\r\nimport { ILoggingService } from \"clientcore-infrastructure-analytics/ILoggingService\";\r\nimport { LoggedExceptionManager } from \"clientcore-infrastructure-analytics/LoggedExceptionManager\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * ExponentialBackoffRetry implements retry logic for transient errors.\r\n * When encountering transient errors, the request is tried again and each retry is delayed exponentially using following calculation:\r\n * Math.min(this.baseRetryDelay * Math.pow(this.factor, retry), this.maxRetryDelay).\r\n * The request is retried until maximum retry count is reached or the request completes successfully or fails with a non-transient error.\r\n * Each delay is offset by a random number between a minimum and maximum offset range, so that in the cases of when there is a failure\r\n * where many clients fail at once (e.g. network outage) there is not a huge amount of requests at the same time to the server.\r\n * @class\r\n */\r\nexport class ExponentialBackoffRetry {\r\n\r\n /**\r\n * Default base delay between each retries.\r\n * @type {number}\r\n */\r\n private static defaultBaseRetryDelayInMs = 100;\r\n\r\n /**\r\n * Default exponential factor to use to increase each retry delay.\r\n * @type {number}\r\n */\r\n private static defaultFactor = 2;\r\n\r\n /**\r\n * Default maximum offset for each delay.\r\n * @type {number}\r\n */\r\n private static defaultMaxOffsetInMs = 25;\r\n\r\n /**\r\n * Default number of retries.\r\n * @type {number}\r\n */\r\n private static defaultMaxRetries = 5;\r\n\r\n /**\r\n * Default minimum offset for each delay.\r\n * @type {number}\r\n */\r\n private static defaultMinOffsetInMs = 1;\r\n\r\n /**\r\n * Maximum allowed number of retries.\r\n * @type {number}\r\n */\r\n private static maxAllowedRetries = 10;\r\n\r\n /**\r\n * Maximum allowed time in milliseconds to delay each retry.\r\n * @type {number}\r\n */\r\n private static maxAllowedRetryDelayInMs = 2000;\r\n\r\n /**\r\n * Base delay value in milliseconds to delay each retry.\r\n * Default value is 100.\r\n * @type {number}\r\n */\r\n private baseRetryDelayInMs: number;\r\n\r\n /**\r\n * The exponential factor to use for delaying each subsequent retry.\r\n * Default value is 2.\r\n * @type {number}\r\n */\r\n private factor: number;\r\n\r\n /**\r\n * The logging service\r\n * @type {ILoggingService}\r\n */\r\n private loggingService: ILoggingService;\r\n\r\n /**\r\n * Maximum delay offet in milliseconds.\r\n * Default value is 25.\r\n * @type {number}\r\n */\r\n private maxOffsetInMs: number;\r\n\r\n /**\r\n * Maximum number of retries.\r\n * Default is 5.\r\n * @type {number}\r\n */\r\n private maxRetries: number;\r\n\r\n /**\r\n * Maximum delay in milliseconds between each retry.\r\n * Default value is 2000.\r\n * @type {number}\r\n */\r\n private maxRetryDelayInMs: number;\r\n\r\n /**\r\n * Minimum delay offet in milliseconds.\r\n * Default value is 1.\r\n * @type {number}\r\n */\r\n private minOffsetInMs: number;\r\n\r\n /**\r\n * Initializes a new instance of the 'ExponentialBackoffRetry' class.\r\n *\r\n * @constructor\r\n * @param loggingService {ILoggingService}\r\n * @param maxRetries? {number} The maximum number of times to retry the operation. Default is 5 and maximum value allowed is 10.\r\n * @param baseRetryDelayInMs? {number} The base delay in milliseconds for each retry. Default is 100.\r\n * @param maxRetryDelayInMs? {number} The maximum number of milliseconds between two retries. Default and maximum allowed is 2000.\r\n * @param factor? {number} The exponential factor to use. Default is 2.\r\n * @param minOffsetInMs? {number} The minimum delay in milliseconds offset to use. Default is 1.\r\n * @param maxOffsetInMs? {number} The maximum delay in milliseconds offset to use. Default is 25.\r\n */\r\n constructor(\r\n loggingService: ILoggingService,\r\n maxRetries?: number,\r\n baseRetryDelayInMs?: number,\r\n maxRetryDelayInMs?: number,\r\n factor?: number,\r\n minOffsetInMs?: number,\r\n maxOffsetInMs?: number) {\r\n if (!loggingService) {\r\n throw new Error(\"loggingService is required for ExponentialBackoffRetry.\");\r\n }\r\n\r\n const loggedExceptionManager = new LoggedExceptionManager(loggingService);\r\n\r\n this.logInvalidParams(\r\n loggedExceptionManager,\r\n maxRetries,\r\n baseRetryDelayInMs,\r\n maxRetryDelayInMs,\r\n factor,\r\n maxOffsetInMs\r\n );\r\n\r\n this.loggingService = loggingService;\r\n this.maxRetries = maxRetries || ExponentialBackoffRetry.defaultMaxRetries;\r\n this.baseRetryDelayInMs = baseRetryDelayInMs || ExponentialBackoffRetry.defaultBaseRetryDelayInMs;\r\n this.maxRetryDelayInMs = maxRetryDelayInMs || ExponentialBackoffRetry.maxAllowedRetryDelayInMs;\r\n this.factor = factor || ExponentialBackoffRetry.defaultFactor;\r\n this.minOffsetInMs = minOffsetInMs || ExponentialBackoffRetry.defaultMinOffsetInMs;\r\n this.maxOffsetInMs = maxOffsetInMs || ExponentialBackoffRetry.defaultMaxOffsetInMs;\r\n\r\n if (canUseDOM()) {\r\n this.loggingService.infoCallback(() => \"ExponentialBackoffRetry has been configured.\", null, { maxRetries, minTimeout: baseRetryDelayInMs, maxTimeout: maxRetryDelayInMs, factor });\r\n }\r\n }\r\n\r\n /**\r\n * Execute given request and retry it as configured.\r\n * @param serviceCall {() => Promise}\r\n */\r\n public async executeRequest(serviceCall: () => Promise, requestInfo?: any, activity?: IActivityLogItem): Promise {\r\n return new Promise(async(resolve, reject) => {\r\n await this.tryRequest(serviceCall, resolve, reject, 0 /* currentRetry is 0 based */, requestInfo, activity);\r\n });\r\n }\r\n\r\n /**\r\n * Log valid params to the class constructor.\r\n *\r\n * @constructor\r\n * @param loggedExceptionManager {LoggedExceptionManager}\r\n * @param maxRetries? {number} The maximum number of times to retry the operation. Default is 5 and maximum value allowed is 10.\r\n * @param baseRetryDelayInMs? {number} The base delay in milliseconds for each retry. Default is 100.\r\n * @param maxRetryDelayInMs? {number} The maximum number of milliseconds between two retries. Default and maximum allowed is 2000.\r\n * @param factor? {number} The exponential factor to use. Default is 2.\r\n */\r\n private logInvalidParams(\r\n loggedExceptionManager: LoggedExceptionManager,\r\n maxRetries?: number,\r\n baseRetryDelayInMs?: number,\r\n maxRetryDelayInMs?: number,\r\n factor?: number,\r\n maxOffsetInMs?: number): void {\r\n if (maxRetries && (maxRetries < 1 || maxRetries > ExponentialBackoffRetry.maxAllowedRetries)) {\r\n loggedExceptionManager.fatal(`maxRetries should be at least 1 and less than ${ExponentialBackoffRetry.maxAllowedRetries}.`);\r\n }\r\n\r\n if (baseRetryDelayInMs && baseRetryDelayInMs < ExponentialBackoffRetry.defaultBaseRetryDelayInMs) {\r\n loggedExceptionManager.fatal(\"baseRetryDelay has to be a positive value greater than or equal to 100.\");\r\n }\r\n\r\n if (baseRetryDelayInMs && maxOffsetInMs && baseRetryDelayInMs <= maxOffsetInMs) {\r\n loggedExceptionManager.fatal(\"baseRetryDelay must not be smaller than the maximum delay offset.\");\r\n }\r\n\r\n if (maxRetryDelayInMs && (maxRetryDelayInMs <= 0 || maxRetryDelayInMs > ExponentialBackoffRetry.maxAllowedRetryDelayInMs)) {\r\n loggedExceptionManager.fatal(`maxRetryDelay has to be a positive value less than ${ExponentialBackoffRetry.maxAllowedRetryDelayInMs}.`);\r\n }\r\n\r\n if (factor && factor <= 0) {\r\n loggedExceptionManager.fatal(\"factor has to be a positive value.\");\r\n }\r\n }\r\n\r\n /**\r\n * Try the request if it fails with a transient error.\r\n * @param serviceCall {() => Promise} The request to execute and retry.\r\n * @param currentRetry {number} current retry count, 0 based.\r\n * @param requestInfo? {TRequestInfo} Additional request info to include in logging.\r\n * @param activity? {IActivityLogItem} Optional activity to associate logged messages with.\r\n * @returns {Promise}\r\n */\r\n private async tryRequest(\r\n serviceCall: () => Promise,\r\n resolve: (result?: any) => void,\r\n reject: (error: any) => void,\r\n currentRetry: number,\r\n requestInfo?: any,\r\n activity?: IActivityLogItem): Promise {\r\n try {\r\n const timeoutInMs = 10000; // Default timeout is 10 sec\r\n\r\n // Note that abortableFetch has its own internal timeout.\r\n // If so if that is used inside serviceCall and timer ran out,\r\n // error will be thrown and it will also end this outer layer timeout early.\r\n const response = await this.timeoutServiceRequest(timeoutInMs, serviceCall());\r\n resolve(response);\r\n } catch (error) {\r\n // If the error is transient and retry if we didn't exceed the retry count.\r\n // On server side we do not retry failed requests.\r\n if (canUseDOM() && (currentRetry < this.maxRetries)) {\r\n // Offset for delay, in the instance where there is some sort of outage and all clients retry at the same interval. In this case it will stagger the retries.\r\n const fractionDigit = 3;\r\n const offset = parseFloat((Math.random() * (this.minOffsetInMs - this.maxOffsetInMs) + this.maxOffsetInMs).toFixed(fractionDigit));\r\n // Weather to add or subtract the random element.\r\n const half = 0.5;\r\n const plusOrMinus = Math.random() < half ? -1 : 1;\r\n // Delay the retry based on the factor and the current retry count. Do not exceed maximum delay allowed.\r\n const delay = Math.min(this.baseRetryDelayInMs * Math.pow(this.factor, currentRetry), this.maxRetryDelayInMs);\r\n // Offset the delay either positively or negatively by the offset.\r\n const delayWithOffset = delay + (offset * plusOrMinus);\r\n this.loggingService.warnCallback(() => `Retrying the request in ${delayWithOffset} milliseconds.`, activity, { error, currentRetry: currentRetry + 1, requestInfo });\r\n setTimeout(() => this.tryRequest(serviceCall, resolve, reject, currentRetry + 1, requestInfo, activity), delayWithOffset);\r\n } else {\r\n // Give up retrying.\r\n this.loggingService.errorCallback(\r\n () => (canUseDOM() && (currentRetry < this.maxRetries)) ? `ExponentialBackoffRetry has exceeded maximum retries ${this.maxRetries}` : \"Request has failed.\",\r\n activity,\r\n { error, currentRetry, requestInfo });\r\n reject(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Timeout functionality for service call;\r\n * This is not a connection timeout but rather a response timeout\r\n *\r\n * @param {number} timeoutInMs - The timeout in ms\r\n * @param {Promise} promise - The promise for service call\r\n * @return {Promise} - A promise of the service response\r\n */\r\n private async timeoutServiceRequest(timeoutInMs: number, promise: Promise): Promise {\r\n return new Promise(async (resolve, reject) => {\r\n const timeoutId = setTimeout(() => reject(new Error(\"Service Request Timed out!\")), timeoutInMs);\r\n\r\n try {\r\n const response = await promise;\r\n resolve(response);\r\n clearTimeout(timeoutId);\r\n } catch (error) {\r\n reject(error);\r\n clearTimeout(timeoutId);\r\n }\r\n });\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActivityLoggingService } from \"clientcore-infrastructure-analytics/ActivityLoggingService\";\r\nimport { BrowserConsoleAppender } from \"clientcore-infrastructure-analytics/appenders/BrowserConsoleAppender\";\r\nimport { ExponentialBackoffRetry } from \"@msnews/core\";\r\nimport { IInstrumentationService } from \"clientcore-infrastructure-analytics/IInstrumentationService\";\r\nimport { InstrumentationService } from \"clientcore-infrastructure-analytics/InstrumentationService\";\r\nimport { LogLevel } from \"clientcore-infrastructure-analytics/models/LogLevel\";\r\nimport { OneServiceUtility } from \"./OneServiceUtility\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Instrumentation service\r\n *\r\n * @type {IInstrumentationService}\r\n */\r\nlet instrumentationService: IInstrumentationService;\r\n\r\n/**\r\n * Retry manager\r\n *\r\n * @type {ExponentialBackoffRetry}\r\n */\r\nlet exponentialBackoffRetry: ExponentialBackoffRetry;\r\n\r\n/**\r\n * Number of times to retry requests\r\n */\r\nconst retryCount = 3;\r\n\r\n/**\r\n * Sends a request\r\n * If the request utilizes AbortController, provide the controller instance to abort the fetch with ExponentialBackoffRetry\r\n * @returns {Promise} - A promise to fulfill the request\r\n */\r\nexport async function sendRequest(request: () => Promise, activityName: string): Promise {\r\n const activity = getInstrumentationService().activityLoggingService.createActivity(activityName);\r\n return await OneServiceUtility.serviceRequestOnComplete(\r\n () => getExponentialBackoffRetry().executeRequest(request, null, activity),\r\n () => getInstrumentationService().activityLoggingService.endActivity(activity));\r\n}\r\n\r\n/**\r\n * Get exponential backoff retry instance\r\n */\r\nfunction getExponentialBackoffRetry(): ExponentialBackoffRetry {\r\n if (exponentialBackoffRetry) {\r\n return exponentialBackoffRetry;\r\n }\r\n\r\n // On server side retryCount wil be ignored\r\n exponentialBackoffRetry = new ExponentialBackoffRetry(getInstrumentationService().loggingService, retryCount);\r\n\r\n return exponentialBackoffRetry;\r\n}\r\n\r\n/**\r\n * Get instrumentation service instance\r\n */\r\nfunction getInstrumentationService(): IInstrumentationService {\r\n if (instrumentationService) {\r\n return instrumentationService;\r\n }\r\n\r\n const activityService = ActivityLoggingService.getInstance(\"ExperienceActivityLogger\");\r\n // Todo: use a different appender to log into mds tables\r\n if (canUseDOM() && logger.isDebug()) {\r\n activityService.addAppender(new BrowserConsoleAppender(LogLevel.Activity));\r\n }\r\n\r\n instrumentationService = new InstrumentationService(logger.getLoggingService(), activityService);\r\n\r\n return instrumentationService;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\nfunction supportsIntersectionObserver(): boolean {\r\n return (\r\n \"IntersectionObserver\" in global &&\r\n \"IntersectionObserverEntry\" in global &&\r\n \"intersectionRatio\" in IntersectionObserverEntry.prototype\r\n );\r\n}\r\n\r\nfunction loadPolyfills(): Promise {\r\n const polyfills = [];\r\n\r\n if (!supportsIntersectionObserver()) {\r\n polyfills.push(import(\"intersection-observer\"));\r\n }\r\n\r\n return Promise.all(polyfills);\r\n}\r\n\r\nexport const loadObserver = (observer) => {\r\n return loadPolyfills().then(observer);\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Client side properties that Render Service sends to initialize RequestData.\r\n * These properties are typically passed via query param to the render service.\r\n * On the client side these are available and populated through the DOM.\r\n */\r\nexport interface RequestProps {\r\n\r\n /**\r\n * URL for the original client request.\r\n */\r\n href: string;\r\n\r\n /**\r\n * Height of client browser window.\r\n */\r\n innerHeight: number;\r\n\r\n /**\r\n * Device pixel ratio of client.\r\n */\r\n devicePixelRatio: number;\r\n\r\n /**\r\n * CSS Grid support of the client browser.\r\n */\r\n canUseCssGrid: boolean;\r\n\r\n /**\r\n * Request Id.\r\n */\r\n requestId: string;\r\n\r\n /**\r\n * The request cookie string\r\n */\r\n cookie: string;\r\n\r\n /**\r\n * The request referer string\r\n */\r\n referer: string;\r\n}\r\n\r\n/**\r\n * Singleton class to store client browser data sent through query param to Render Service.\r\n * This is only used under server environment.\r\n */\r\nclass RequestData {\r\n /**\r\n * The single instance of the RequestData class.\r\n * @type {RequestData}\r\n */\r\n private static _instance: RequestData = null;\r\n\r\n /**\r\n * URL object to be used to store original request url.\r\n */\r\n public readonly url: URL;\r\n\r\n /**\r\n * Inner height of browser from the original request.\r\n */\r\n public readonly innerHeight: number;\r\n\r\n /**\r\n * Device pixel ratio from the original request.\r\n */\r\n public readonly devicePixelRatio: number;\r\n\r\n /**\r\n * Boolean flag that represents if CSS Grid is supported by the browser from the original request.\r\n */\r\n public readonly canUseCssGrid: boolean;\r\n\r\n /**\r\n * Request Id.\r\n */\r\n public readonly requestId: string;\r\n\r\n /**\r\n * Request cookie string\r\n */\r\n public readonly cookie: string;\r\n\r\n /**\r\n * Request referer string\r\n */\r\n public readonly referer: string;\r\n\r\n /**\r\n * Initialize the request data instance with passed in client properties\r\n */\r\n private constructor(data: RequestProps) {\r\n this.url = new URL(data.href);\r\n this.innerHeight = data.innerHeight;\r\n this.devicePixelRatio = data.devicePixelRatio;\r\n this.canUseCssGrid = data.canUseCssGrid;\r\n this.requestId = data.requestId;\r\n this.cookie = data.cookie;\r\n this.referer = data.referer;\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns RequestData\r\n */\r\n public static getInstance(): RequestData {\r\n if (global[\"TEST_ENV\"] && !RequestData._instance) {\r\n resetRequestData({\r\n href: \"http://localhost:8080/\",\r\n innerHeight: 768,\r\n devicePixelRatio: 1,\r\n canUseCssGrid: false,\r\n requestId: \"0\",\r\n cookie: \"\",\r\n referer: \"\"\r\n });\r\n }\r\n\r\n if (!RequestData._instance) {\r\n // Throw error if the request data has not been set as this should never be the case.\r\n // This likely highlights that the request data was not initialized when handling a\r\n // request when server side rendering.\r\n // TODO - http://osgvsowi/24832691 renable throwing an error.\r\n // This is currently disabled as other singletons that are initialized at import time use\r\n // this they will throw an error before anyone has the chance to initialize the request data\r\n resetRequestData({\r\n href: \"http://localhost:8080/\",\r\n innerHeight: 0,\r\n devicePixelRatio: 0,\r\n canUseCssGrid: false,\r\n requestId: \"0\",\r\n cookie: \"\",\r\n referer: \"\"\r\n });\r\n // throw new Error(\"Request data is not initialized yet through ResetInstance.\");\r\n }\r\n return RequestData._instance;\r\n }\r\n\r\n /**\r\n * Reset singleton class instance with passed in info and client settings\r\n * @returns RequestData\r\n */\r\n public static resetInstance(data: RequestProps): RequestData {\r\n RequestData._instance = new RequestData(data);\r\n return RequestData._instance;\r\n }\r\n}\r\n\r\n/**\r\n * Export function to reset the request data singleton.\r\n * This must be used to set the request data.\r\n */\r\nexport const resetRequestData = RequestData.resetInstance;\r\n\r\n/**\r\n * Export get instance function for testing\r\n */\r\nexport const getRequestData = () => (RequestData.getInstance());","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * The aria-label html attribute\r\n * @type {string}\r\n */\r\nexport const ariaLabelAttribute = \"aria-label\";\r\n\r\n/**\r\n * The id attribute on the
    element that is the root element for Peregrine Pages / Experiences.\r\n * There is only ever 1 root element on a page\r\n * @type {string}\r\n */\r\nexport const rootElementId = \"msnewsroot\";\r\n\r\n/**\r\n * Element names that are commonly used in Peregrine pages and experiences\r\n * @type {object}\r\n */\r\nexport const htmlElementIds: any = {\r\n html: \"html\",\r\n head: \"head\",\r\n body: \"body\"\r\n};\r\n\r\n/**\r\n * Constants used by application cache related scenarios\r\n */\r\nexport const applicationCacheConstants = {\r\n /**\r\n * Attribute name on html tag that is set when appcache is being used on the page\r\n */\r\n manifestAttributeName: \"manifest\",\r\n\r\n /**\r\n * Local storage key that holds the appcache info used to determine page refresh needs\r\n * for different page types.\r\n */\r\n pagesRefreshData: \"ac_prd\"\r\n};\r\n\r\n/**\r\n * The attributes that are part of markup elements that we care about\r\n */\r\nexport const clientSettings = \"data-client-settings\";\r\nexport const pagetypeSettings = \"data-pagetype\";\r\nexport const id = \"data-id\";\r\nexport const info = \"data-info\";\r\nexport const js = \"data-js\";\r\nexport const t = \"data-t\";\r\nexport const lang = \"lang\";\r\nexport const dir = \"dir\";\r\nexport const serviceUrl = \"data-service-url\";\r\nexport const telemetryId = \"data-telemetry-id\";\r\nexport const trackPageProduct = \"data-page-product\";\r\nexport const trackPageType = \"data-page-type\";\r\n\r\n/**\r\n * The number of characters that our Service Request Ids must have. This is currently defined by OneService\r\n * @type {number}\r\n */\r\nexport const numberOfCharactersNeededForUniqueRequestId = 32;\r\n\r\n/**\r\n * The minimum number of path segments that will be in the URL which hosts MS News Experience pages.\r\n * The first path segment should be the vertical key, e.g. spartan and the second path segment\r\n * should be the the category key, e.g. ntp\r\n * @type {number}\r\n */\r\nexport const minimumHostPagePathSegments = 2;\r\n\r\n/**\r\n * Default value we use for the name of the cookie that holds the ANID\r\n */\r\nexport const anonCookieName = \"APP_ANON\";\r\n\r\n/**\r\n * App Anon Cookie Exists Cookie Name. This cookie is a marker if APP_ANON exist or not.\r\n * This is necessary because APP_ANON is HTTP cookie and not accessible by JS.\r\n */\r\nexport const appAnonCookieExistsCookieName = \"aace\";\r\n\r\n/**\r\n * Child cookie name, used to signal if rpsUser is child account.\r\n */\r\nexport const childCookieName = \"child\";\r\n\r\n/**\r\n * Tracks user engagement for the Meet Now feature via the first day it was shown\r\n */\r\nexport const meetNowEngagementDayFirstShown = \"meetnow-day-first-shown\";\r\n\r\n/**\r\n * Tracks user engagment for the Meet Now feature via the number of clicks\r\n */\r\nexport const meetNowEngagementNumberOfClicks = \"meetnow-number-clicks\";\r\n\r\n/**\r\n * Tracks whether user engagement requirements for the Meet Now feature have been met\r\n */\r\nexport const meetNowengagementReached = \"meetnow-engagement-reached\";\r\n\r\n/**\r\n * Migration consent state cookie, indicates user has already granted or denied migration consent\r\n */\r\nexport const migrationConsentStateKey = \"migration-state\";\r\n\r\n/**\r\n * Id of MSCC cookie banner container element.\r\n */\r\nexport const msccCookieBannerElementId = \"consent-banner-container\";\r\n\r\n/**\r\n * Nurturing accepted state key is intended to be used in local storage, indicates user has opted in or out of Iris targeted content.\r\n */\r\nexport const nurturingAcceptedStateKey = \"nurturingAccepted\";\r\n\r\n/**\r\n * Recommended search key is intended to be used in local storage,\r\n * indicates user has opted in or out to show recommended search below search box\r\n */\r\nexport const recommendedSearchKey = \"recommended-search-enabled\";\r\n\r\n/**\r\n * Search history key is intended to be used in local storage, indicates user has opted in or out to show search history\r\n */\r\nexport const searchHistoryKey = \"search-history-enabled\";\r\n\r\n/**\r\n * Local storage key to indicated if no search history is expected based on auth logic\r\n * If it is expected then do not show search history toggle, otherwise show search history toggle in settings dialog\r\n */\r\nexport const noSearchHistoryExpectedKey = \"no-search-history-expected-auth\";\r\n\r\n/**\r\n * key which is used to force consumer mode for Enterprise Users.\r\n */\r\nexport const EnterpriseToConsumerOverrideKey = \"forceConsumer\";\r\n\r\n/**\r\n * Headers used for one service requests\r\n */\r\nexport const oneServiceHeaders = {\r\n activityId: \"x-client-activityid\",\r\n authorization: \"Authorization\",\r\n entAuthorization: \"Ent-Authorization\",\r\n rpsToken: \"UserAuthToken\",\r\n muid: \"MUID\"\r\n};\r\n\r\n/**\r\n * used query string params in OneService requests\r\n */\r\nexport const oneServiceQueryStringKeys = {\r\n activityId: \"activityId\",\r\n apiKey: \"apikey\",\r\n complexInfoPaneEnabled: \"cipenabled\",\r\n contentType: \"contentType\",\r\n delta: \"delta\",\r\n disableTypeSerialization: \"DisableTypeSerialization\",\r\n infopaneCount: \"infopaneCount\",\r\n fdhead: \"fdhead\",\r\n feedLayoutRequestType: \"t\",\r\n filter: \"$filter\",\r\n ids: \"ids\",\r\n location: \"location\",\r\n market: \"market\",\r\n ocid: \"ocid\",\r\n parentContentId: \"parent-content-id\",\r\n parentNamespace: \"parent-ns\",\r\n parentTitle: \"parent-title\",\r\n queryQ: \"q\",\r\n query: \"query\",\r\n queryType: \"queryType\",\r\n qScope: \"qscope\",\r\n responseSchema: \"responseSchema\", // IDX returns nextPageUrl with camel cased responseSchema query string\r\n select: \"$select\",\r\n session: \"session\",\r\n signInCookieName: \"scn\",\r\n skip: \"$skip\",\r\n source: \"source\",\r\n timeOut: \"timeOut\",\r\n top: \"$top\",\r\n type: \"type\",\r\n user: \"user\",\r\n wrapOData: \"wrapodata\",\r\n infoPaneItemCount: \"t:InfoPane.itemCount\",\r\n newsTop: \"newsTop\",\r\n newsSkip: \"newsSkip\",\r\n collectionIds: \"collectionIds\",\r\n locale: \"locale\"\r\n};\r\n\r\n/**\r\n * Constants to use as role attribute value for elements\r\n */\r\nexport enum AriaRoles {\r\n /**\r\n * Presentation role is used to remove semantic meaning from an element and any of its related child elements.\r\n */\r\n Presentation = \"presentation\"\r\n}\r\n\r\n/**\r\n * Basic enum values for mobile device orientation\r\n */\r\nexport enum DeviceOrientation {\r\n Unknown = \"Unknown\",\r\n Portrait = \"Portrait\",\r\n Landscape = \"Landscape\"\r\n}\r\n\r\n/**\r\n * Common local storage keys\r\n */\r\nexport const CoreLocalStorageKeys = {\r\n /**\r\n * This key is used to store a dictionary of app versions per app type based on the current page version from the DOM.\r\n * Note that the version value will represent the current **loaded page** version and **not the new version** in scenarios\r\n * where the page is cached and require a new version to be loaded upon version detection (i.e., appcache, or service worker).\r\n * In these cached/refresh scenarios, we still want to store the version that the page was actually loaded from.\r\n */\r\n pageVersions: \"pageVersions\"\r\n};\r\n\r\n/**\r\n * The default APIKey for OneService requests\r\n */\r\nexport const defaultOneServiceApiKey = \"0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM\";\r\n\r\n/**\r\n * Url for microsoft news page\r\n */\r\nexport const MicrosoftNewsUrl = \"https://microsoftnews.msn.com/\";\r\n\r\n/**\r\n * Local storage key for user's currently selected pivot (used for enterprise)\r\n */\r\nexport const SelectedPivotStorageId = \"selectedPivot\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Attempts to parse a given string to a JSON object\r\n * @param {string} jsonString - The string to parse.\r\n * @returns {any} - the parsed object if successful, or null otherwise.\r\n */\r\nexport function tryParseJson(jsonString: string): any {\r\n try {\r\n return JSON.parse(jsonString);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Attempts to parse the given value as a integer and if failed will return the defaultValue.\r\n * @param {string} value - The value to parse.\r\n * @param {number} defaultValue - The default value to return if parsing fails\r\n * @returns {number} the parsed value if it was a valid number or otherwise the default value if specified.\r\n */\r\nexport function tryParseInt(value: string, defaultValue: number): number {\r\n const n = parseInt(value);\r\n return isNaN(n) ? defaultValue : n;\r\n}\r\n\r\n/**\r\n * Attempts to convert the given JSON object to a string.\r\n * @param jsonObj - The JSON object to convert.\r\n * @returns {string} - the converted string if successful, or null otherwise.\r\n */\r\nexport function tryStringifyJson(jsonObj: {}): string {\r\n try {\r\n return JSON.stringify(jsonObj);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { TelemetryLibraryBase } from \"../telemetry-interfaces\";\r\n\r\n/**\r\n * Static global variables used to reference to Telemetry library implementation.\r\n * @var TelemetryLibraryBase\r\n */\r\nexport let Telemetry: TelemetryLibraryBase = null;\r\n\r\n/**\r\n * Initialize Telemetry\r\n * @param telemetry TelemetryLibraryBase implementation\r\n */\r\nexport function initTelemetry(telemetry: TelemetryLibraryBase): void {\r\n Telemetry = telemetry;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Returns local storage object, or null if it is not accessible.\r\n * This is minimal version used by client side inline script.\r\n */\r\nexport function getLocalStorageInline(): Storage {\r\n try {\r\n return localStorage;\r\n } catch (error) {\r\n return null;\r\n }\r\n}","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { RenderCache, RenderCacheKeys } from \"./RenderCache\";\r\nimport { keysPrefix, locationHref, normalizedUrlConfigkey, riverRcClassName } from \"./Constants\";\r\n\r\nimport { KeyValueArray, getLocalStorageInline } from \"@msnews/core\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nlet renderCacheObject: RenderCache;\r\n\r\nexport const windowAvailable = !!((typeof(window) !== \"undefined\") && window);\r\n\r\n/**\r\n * Function to get render cache if it's valid.\r\n * @returns Render cache object if it exists and is valid otherwise null.\r\n */\r\nexport function getRenderCache(): RenderCache {\r\n if (renderCacheObject) {\r\n return renderCacheObject;\r\n }\r\n\r\n const storage = getLocalStorageInline();\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n // get all normalized render cache keys from local storage\r\n let renderCacheKeys: RenderCacheKeys;\r\n const renderCacheStoredKeys = storage.getItem(renderCacheKeyOfNormalizedKeys);\r\n try {\r\n renderCacheKeys = renderCacheStoredKeys && JSON.parse(renderCacheStoredKeys);\r\n } catch (error) {\r\n return null; // keys not parsable.\r\n }\r\n\r\n if (!renderCacheKeys || !renderCacheKeys.keyn || !renderCacheKeys.expn || !renderCacheKeys.frcn || !renderCacheKeys.jssn) {\r\n return null;\r\n }\r\n\r\n const cacheExpirationTimestamp = storage.getItem(renderCacheKeys.expn);\r\n if (!cacheExpirationTimestamp) {\r\n return null; // Cache Expiration Timestamp not exist\r\n }\r\n\r\n const parsedCacheExpirationTimestamp = parseInt(cacheExpirationTimestamp);\r\n if (!parsedCacheExpirationTimestamp) {\r\n return null; // Cache Expiration Timestamp broken.\r\n }\r\n\r\n const currentTimestamp: number = new Date().getTime();\r\n if (currentTimestamp >= parsedCacheExpirationTimestamp) {\r\n return null; // cache expired.\r\n }\r\n\r\n const renderCacheStorage = storage.getItem(renderCacheKeys.keyn);\r\n if (!renderCacheStorage) {\r\n return null; // Cache object is missing.\r\n }\r\n\r\n try {\r\n renderCacheObject = JSON.parse(renderCacheStorage);\r\n } catch (error) {\r\n return null; // Cache object not parsable.\r\n }\r\n\r\n if (!renderCacheObject || !renderCacheObject.dom || !renderCacheObject.batch_css) {\r\n renderCacheObject = null; // Cache object is broken\r\n }\r\n\r\n return renderCacheObject;\r\n}\r\n\r\n/**\r\n * Batch All styles into one object.\r\n */\r\nexport function batchCSS(): string {\r\n let batchCss = \"\";\r\n\r\n // Enumerate and write out all of the JSS styles\r\n const styles = document.getElementsByTagName(\"style\");\r\n const length = styles.length;\r\n\r\n for (let i = 0; i < length; i++) {\r\n // Skip any styles that do not have a data-jss attribute to always pick newer styles added by jss\r\n if (styles[i].dataset.jss != null) {\r\n batchCss += styles[i].innerHTML;\r\n }\r\n }\r\n\r\n return batchCss;\r\n}\r\n\r\n/**\r\n * Scrapes Dom and remove River.\r\n */\r\nexport function scrapeDom(includeNewsFeed: boolean): string {\r\n const root = document.getElementById(\"root\");\r\n\r\n if (!root || !root.innerHTML) {\r\n return \"\";\r\n }\r\n\r\n /* Currently we don't have functionality to include experiences separately,\r\n because of that we do return whole dom if river included in render cache and exclude river otherwise */\r\n if (includeNewsFeed) {\r\n return root.innerHTML;\r\n }\r\n\r\n const rivers = document.getElementsByClassName(riverRcClassName);\r\n\r\n if (!rivers || !rivers.length) {\r\n return root.innerHTML;\r\n }\r\n\r\n const river = rivers[0] as HTMLElement;\r\n\r\n return root.innerHTML.replace(river.outerHTML, \"\");\r\n}\r\n\r\n/**\r\n * Gets the state object from render cache.\r\n * @returns The redux state object.\r\n */\r\nexport function getStateFromRenderCache(): any {\r\n // Check to see if this app instance was bootstrapped with a render-cache\r\n const renderCache = getRenderCache();\r\n\r\n if (!renderCache || !renderCache.state) {\r\n return null; // Render Cache missing or it does not include State.\r\n }\r\n\r\n let initialState;\r\n\r\n try {\r\n initialState = JSON.parse(renderCache.state, reduxStoreStringifyReviver);\r\n } catch (error) {\r\n // Cache state object is not parsable.\r\n }\r\n\r\n return initialState;\r\n}\r\n\r\n/**\r\n * Redux Store Stringify replacer HOF, generates store stringify.\r\n * @param storeExceptions list of store namespaces which will not be included in result.\r\n */\r\nexport function reduxStoreStringifyReplacer(key: string, value: any): any {\r\n const originalObject = this[key];\r\n if (originalObject instanceof Map) {\r\n return {\r\n dataType: \"Map\",\r\n value: [...originalObject]\r\n };\r\n } else {\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Function to normalize current URL\r\n * Example:\r\n * For normalizeKeyParamsList = [\"startpage\", \"prerender\"]\r\n * https://ntp.msn.com/edge/ntp?locale=en-us&startpage=1 is normalized to https://ntp.msn.com/edge/ntp?locale=en-us\r\n * https://ntp.msn.com/edge/ntp?startpage=1&locale=en-us is normalized to https://ntp.msn.com/edge/ntp?locale=en-us\r\n * https://ntp.msn.com/edge/ntp?locale=en-us&startpage=1&prerender=1 is normalized to https://ntp.msn.com/edge/ntp?locale=en-us\r\n * @returns normalized location href\r\n */\r\nexport function getNormalizedLocationHref(configParamsList?: [string]) {\r\n\r\n // get the url\r\n const normalizeKeyParamsList = configParamsList || getNormalizeKeyParamsList();\r\n\r\n if (!normalizeKeyParamsList || !normalizeKeyParamsList.length) {\r\n return locationHref;\r\n }\r\n\r\n const searchParams: URLSearchParams = new URLSearchParams(location.search);\r\n if (!searchParams) {\r\n return locationHref;\r\n }\r\n\r\n const normalizedParams: KeyValueArray = [];\r\n searchParams.forEach((value, key) => {\r\n if (!normalizeKeyParamsList.includes(key)) {\r\n normalizedParams.push({ key, value });\r\n }\r\n });\r\n\r\n // Filter for valid keyValue entries, and then map them into key==value strings\r\n // joined with an &\r\n const queryString = normalizedParams.map(kv => kv.key + \"=\" + kv.value).join(\"&\");\r\n const basePath = (locationHref || \"\").split(\"?\")[0];\r\n return basePath + (queryString ? \"?\" + queryString : \"\");\r\n}\r\n\r\n/**\r\n * set normalized param list to localStorage\r\n */\r\nexport function setNormalizeKeyParamsList(normalizeKeyParamsList: Array): void {\r\n if (normalizeKeyParamsList) {\r\n const storage = getLocalStorageInline();\r\n if (storage) {\r\n storage.setItem(normalizedUrlConfigkey, normalizeKeyParamsList.toString());\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * The key for storing all render cache normalized keys\r\n * Maintain a single entry for collection of all render cache keys\r\n * Example: for https://ntp.msn.com/edge/ntp?locale=en-us URL,\r\n * we have one key with all the following render cache keys values\r\n *\r\n * key: keys_https://ntp.msn.com/edge/ntp?locale=en-us&startpage=1\r\n * value: {\r\n * keyn: \"lastKnown_https://ntp.msn.com/edge/ntp?locale=en-us\", // render cache key\r\n * expn: \"timestamp_https://ntp.msn.com/edge/ntp?locale=en-us\", // expiration key\r\n * frcn: \"force_timestamp_https://ntp.msn.com/edge/ntp?locale=en-us\", // force timestamp key\r\n * jssn: \"lastKnown_https://ntp.msn.com/edge/ntp?locale=en-us_jssMap\" // jss map key\r\n * }\r\n */\r\nexport const renderCacheKeyOfNormalizedKeys = `${keysPrefix}${(typeof (window) !== \"undefined\" ? getNormalizedLocationHref() : \"\")}`;\r\n\r\n/**\r\n * Custom JSON.stringify reviver that will create Map objects from a string/JSON representation\r\n * @param key not used\r\n * @param value The value being converted from a string\r\n */\r\nfunction reduxStoreStringifyReviver(key: any, value: any): any {\r\n // If the value being restored is a object, check it it was a map\r\n if (typeof value === \"object\" && value !== null) {\r\n // If the object value being restored was a map, that was custom written, then revive it by creating a map\r\n if (value.dataType === \"Map\") {\r\n return new Map(value.value);\r\n }\r\n }\r\n\r\n // Return the original value being restored\r\n return value;\r\n}\r\n\r\n/**\r\n * get normalized param list from localStorage\r\n */\r\nfunction getNormalizeKeyParamsList(): Array {\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n const storage = getLocalStorageInline();\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const normalizeUrlQsp = storage.getItem(normalizedUrlConfigkey);\r\n return normalizeUrlQsp ? normalizeUrlQsp.split(\",\") : null;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different page types\r\n * @enum\r\n */\r\nexport enum PageType {\r\n Article = \"article\",\r\n ArticleFullScreen = \"articlefullscreen\",\r\n DHP = \"dhp\",\r\n Gallery = \"gallery\",\r\n GalleryFullScreen = \"galleryfullscreen\",\r\n Launcher = \"launcher\",\r\n MMX = \"mmx\",\r\n NewsAndInterests = \"newsandinterestshp\",\r\n Newsbar = \"newsbar\",\r\n NTP = \"ntp\",\r\n Story = \"story\",\r\n Shopping = \"shopping\",\r\n ShoppingProductDetails = \"shopping::product\",\r\n ShoppingDealsStoreCategory = \"shopping::deals::storecategory\",\r\n Video = \"video\",\r\n Windows = \"windowshp\",\r\n WindowsShell = \"shellhp\"\r\n}\r\n\r\n/** The AudienceMode enum */\r\nexport enum AudienceModeType {\r\n Adult = \"adult\",\r\n Enterprise = \"enterprise\",\r\n Kids = \"kids\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration indicating the MSA sign in status for the page.\r\n */\r\nexport enum SignedInStatus {\r\n Unknown,\r\n NotSignedIn,\r\n SignedIn\r\n}\r\n\r\n/**\r\n * The various account types that we support in Peregrine, this enum can be modified as new types are added\r\n * \"MSA\" - MSA\r\n * \"AAD\" - AAD\r\n */\r\nexport enum AccountType {\r\n MSA = \"MSA\",\r\n AAD = \"AAD\",\r\n UNSUPPORTED_SOVEREIGNTY = \"UNSUPPORTED_SOVEREIGNTY\"\r\n}\r\n\r\n/**\r\n * Note: these values are used by the Telemetry team and must remain in the following order:\r\n * 0 - NonAadAccount\r\n * 1 - AadAccount\r\n * 2 - Unknown\r\n */\r\nexport enum AadAccountType {\r\n NonAadAccount = 0,\r\n AadAccount = 1,\r\n Unknown = 2\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { LiteLogger } from \"./LiteLogger\";\r\nimport { ILoggingService } from \"clientcore-infrastructure-analytics/ILoggingService\";\r\n\r\n/**\r\n * Interface for logger so different implementation of logger could be used.\r\n */\r\nexport interface Logger {\r\n\r\n /**\r\n * Returns the logging service\r\n * @returns {ILoggingService}\r\n */\r\n getLoggingService(): ILoggingService;\r\n\r\n /**\r\n * Checks whether we're running in debug mode.\r\n * @returns True when either debug=1 or debug=true is present as a query param, otherwise false.\r\n */\r\n isDebug(): boolean;\r\n\r\n /**\r\n * Override the isDebug setting. Useful when server side rendering.\r\n */\r\n setDebug(isDebug: boolean): void;\r\n\r\n /**\r\n * Set the tags to filter logs.\r\n * @param tags Tags to filter logs. If empty, do not filter.\r\n */\r\n setTags(tags: string[]): void;\r\n\r\n /**\r\n * Log console message.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Message to log.\r\n * @param tags - Optional tags for specifying log type for filtering logs.\r\n */\r\n log(message: string, tags?: string[]): void;\r\n\r\n /**\r\n * Log error message.\r\n * @param message - Message to log\r\n */\r\n logError(message: string): void;\r\n\r\n /**\r\n * Lazy log console message. Use this when the message being constructed is complex or expensive so that it's only evaluated if needed.\r\n * Note that the callback is not invoked and the message is not output unless you're in debug mode.\r\n * @param getMessage - The function to call to get message to log\r\n */\r\n logCallback(getMessage: () => string): void;\r\n\r\n /**\r\n * Log the object to the console.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Array of messages to log\r\n */\r\n logObjects(...message: any[]): void;\r\n}\r\n\r\n/**\r\n * Set the logger instance.\r\n * @param _logger The logger instance to change to.\r\n */\r\nexport function setLogger(_logger: Logger): void {\r\n logger = _logger;\r\n}\r\n\r\n/** Logger used by everyone. Default is LiteLogger. Please set up desired logger implementaiton with setLogger(). */\r\nexport let logger: Logger = new LiteLogger();\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// todo: Deliverable 29531401: [Client] Move client-data-settings to a separate library to avoid importing core library\r\n// Remove these and import from common library once the above deliverable is completed.\r\n\r\n/**\r\n * Checks if the DOM is available to access and use.\r\n * @returns {boolean} - true if DOM is available, or false if it is not. This is typically true for\r\n * client side rendering and false for server side rendering.\r\n */\r\nexport function canUseDOM(): boolean {\r\n return !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\r\n}\r\n\r\n/**\r\n * Return true if html has app cache enabled\r\n */\r\nexport function isAppCache() {\r\n if (canUseDOM() && window.applicationCache) {\r\n const htmlElement = window.document.getElementsByTagName(\"html\")[0];\r\n return htmlElement.getAttribute(\"manifest\");\r\n }\r\n\r\n return false;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { isAppCache } from \"./Utilities\";\r\n\r\n// todo: Deliverable 29531401: [Client] Move client-data-settings to a separate library to avoid importing core library\r\n// Import common functions from the new library once the above deliverable is completed.\r\n\r\nlet clientSettings: ClientSettings;\r\nlet currentFlights: string;\r\n\r\n/** The client settings object. */\r\nexport interface ClientSettings {\r\n /** The name of the app */\r\n apptype: string;\r\n\r\n /** The name of the page */\r\n pagetype: string;\r\n\r\n /** The activity ID */\r\n aid: string;\r\n\r\n /** The PCS page generation time in ISO 8601 format, UTC. */\r\n pageGenTime?: string;\r\n\r\n /** Information about the JS bundles we are running. */\r\n bundleInfo: {\r\n /** The build number for the JS bundles. */\r\n v: string;\r\n }\r\n\r\n /** Information about PCS that created the page. */\r\n pcsInfo: {\r\n /** The environment we are on */\r\n env: string;\r\n\r\n /** The build number for PCS. */\r\n v: string;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the client settings object.\r\n */\r\nexport function getPageSettings(): ClientSettings {\r\n if (!clientSettings) {\r\n const settingsJson: string = document.head.getAttribute(\"data-client-settings\");\r\n if (settingsJson) {\r\n clientSettings = JSON.parse(settingsJson);\r\n }\r\n }\r\n\r\n return clientSettings;\r\n}\r\n\r\n/**\r\n * Extract eligible flight ids from head data.\r\n * @returns string of flight ids.\r\n */\r\nexport function getCurrentFlights(): string {\r\n if (currentFlights) {\r\n return currentFlights;\r\n }\r\n\r\n let clientInfo = document.head.getAttribute(\"data-info\");\r\n const clientSettings = getPageSettings();\r\n\r\n // If page is possibly app cached, check the updated head data if available.\r\n // Use flights from stored head data if they aren't too old.\r\n // This logic is similiar to initializeFromStorage from HeadData\r\n // except we have to do it first in the inline script to get the flight ids.\r\n if (isAppCache()) {\r\n let storedHeadData;\r\n try {\r\n const storedHeadDataString = window.localStorage.getItem(\"shd_\" + clientSettings.pagetype);\r\n storedHeadData = JSON.parse(storedHeadDataString);\r\n } catch {\r\n storedHeadData = null;\r\n }\r\n\r\n if (storedHeadData) {\r\n const responseClientSettings = storedHeadData.clientSettings;\r\n const responseFlights = storedHeadData.info;\r\n\r\n // The stored head data is corrupt, bail\r\n if (responseClientSettings && responseFlights) {\r\n\r\n // If DOM page gen time is later than response page gen time, bail. We don't want to load stale head data from storage.\r\n if (clientSettings.pageGenTime < responseClientSettings.pageGenTime) {\r\n // Use the new flights from stored head data\r\n clientInfo = responseFlights;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Create array from comma separated list of flights enabled in current request.\r\n currentFlights = ((/f:\\s*([^;]+)/i.exec(clientInfo) || {})[1] || \"\").toLowerCase();\r\n\r\n return currentFlights;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** Global map for inline script so the initial cookie map is cached. */\r\nlet cookieMapInline: {[cookieName: string]: string};\r\n\r\n/**\r\n * Helper to get cookie value at inline script. This were to have minimal dependency.\r\n * Snapshot of cookies will be made and do not respect cookie changes during runtime.\r\n * @param name - The cookie name\r\n * @returns Decoded cookie value when found, otherwise null\r\n */\r\nexport function getCookieInline(name: string): string {\r\n if (!name) {\r\n return null;\r\n }\r\n\r\n if (!cookieMapInline) {\r\n const cookiePairs = document.cookie.split(\"; \");\r\n cookieMapInline = {};\r\n\r\n const length = cookiePairs && cookiePairs.length;\r\n for (let index = 0; index < length; index++) {\r\n const cookieKeyValue = cookiePairs[index].split(\"=\");\r\n cookieMapInline[cookieKeyValue[0].toLocaleLowerCase()] = decodeURIComponent(cookieKeyValue[1]);\r\n }\r\n }\r\n\r\n const normalizedName = name.toLocaleLowerCase();\r\n const cookieVal = cookieMapInline[normalizedName];\r\n return cookieVal || null;\r\n}\r\n\r\n/**\r\n * Helper to get encoded cookie value at inline script.\r\n * @param name - The cookie name\r\n * @returns Encoded cookie value when found, otherwise null\r\n */\r\nexport function getEncodedCookieInline(name: string): string {\r\n const cookieVal = getCookieInline(name);\r\n return (cookieVal && encodeURIComponent(cookieVal)) || null;\r\n}\r\n\r\n/** Only used for unit test */\r\nexport function resetCookieMapInline() {\r\n cookieMapInline = null;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ClientSettings, getCurrentFlights, getPageSettings } from \"./PageSettings\";\r\n\r\nimport { getCookieInline } from \"@msnews/core\";\r\n\r\n/** Declared cookie consent required function on PCS side. */\r\nexport declare function getCookieConsentRequired(): boolean;\r\n\r\nlet loggingEndpoint;\r\nconst Product = {\r\n mmx: \"emmx\",\r\n edge: \"spartan\",\r\n edgeChromium: \"anaheim\",\r\n hybrid: \"spartan\",\r\n hub: \"prime\",\r\n microsoftNews: \"msnews\",\r\n office: \"entnews\"\r\n};\r\n\r\n/**\r\n * Logs error to the given endpoint (e.g. otf). ONLY USE FROM INLINE SCRIPTS.\r\n * @param message - The error message\r\n * @param appErrorId - The app error id to be logged\r\n * @param propertyBag - The blob to store additional error information\r\n */\r\nexport function logError(message: string, appErrorId: number, propertyBag: any): void {\r\n try {\r\n const settingsObject: ClientSettings = getPageSettings();\r\n const flightIds: string = getCurrentFlights();\r\n const params: object = getLoggingParameters(settingsObject);\r\n\r\n let iKey = \"\";\r\n if (params && params[\"apikey\"] && params[\"apikey\"] !== \"\") {\r\n iKey = getIKeyValue(params[\"apikey\"]);\r\n }\r\n\r\n const payload: string = getLoggingPayload(appErrorId, message, settingsObject, iKey, propertyBag, flightIds);\r\n if (params && payload) {\r\n console.error(payload);\r\n\r\n const url: string = \"https://\" + loggingEndpoint + \"/OneCollector/1.0\" + formatParams(params);\r\n navigator.sendBeacon(url, payload); // fire and forget\r\n } else {\r\n console.log(\"missing parameters in data-client-settings. \" + message);\r\n }\r\n } catch {\r\n console.log(\"error logging the app error. \" + message);\r\n }\r\n}\r\n\r\n/**\r\n * Gets data to set the logging parameters\r\n * @param settingsObject - The object containing client settings\r\n */\r\nfunction getLoggingParameters(settingsObject: ClientSettings): object {\r\n if (settingsObject) {\r\n const { pcsInfo, pageGenTime } = settingsObject;\r\n const uploadTime = new Date(pageGenTime).getTime();\r\n const isProd: boolean = !pcsInfo || pcsInfo.env === \"prod\";\r\n\r\n // JSLL endpoints\r\n loggingEndpoint = isProd ? \"browser.events.data.msn.com\" : \"events-sandbox.data.msn.com\";\r\n const apikey = isProd\r\n ? \"0ded60c75e44443aa3484c42c1c43fe8-9fc57d3f-fdac-4bcf-b927-75eafe60192e-7279\"\r\n : \"f8857dedc6f54ca8962cfb713e01e7d7-e9250191-fe0b-446f-95ae-07516262f98c-7028\";\r\n\r\n return {\r\n cors: \"true\",\r\n \"content-type\": \"application/x-json-stream\",\r\n \"client-id\": \"NO_AUTH\",\r\n \"client-version\": \"1DS-Web-JS-2.2.2\",\r\n apikey: apikey,\r\n \"upload-time\": uploadTime,\r\n w: \"0\",\r\n anoncknm: \"app_anon\"\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Gets data to set the logging payload\r\n * @param appErrorId - The app error id to be logged\r\n * @param message - The error message\r\n * @param iKey - The key for authenticating on 1DS endpoint\r\n * @param propertyBag - The blob to store additional error information\r\n * @param flightIds - The flight ids\r\n */\r\nfunction getLoggingPayload(appErrorId: number, message: string, settingsObject: ClientSettings, iKey: string, propertyBag: any, flightIds: string): string {\r\n if (settingsObject) {\r\n propertyBag = propertyBag || {};\r\n const { apptype, pagetype, pageGenTime, bundleInfo } = settingsObject;\r\n\r\n propertyBag.pageGenTime = pageGenTime;\r\n propertyBag.build = bundleInfo && bundleInfo.v;\r\n propertyBag.appType = apptype;\r\n\r\n const pageProduct = Product[apptype] ? Product[apptype] : apptype;\r\n const source = apptype + \"-\" + pagetype;\r\n const market = document.getElementsByTagName(\"html\")[0].getAttribute(\"lang\");\r\n\r\n let muid = \"\";\r\n try {\r\n const isCookieConsentRequired: boolean = getCookieConsentRequired && typeof getCookieConsentRequired === \"function\" && getCookieConsentRequired();\r\n if (!isCookieConsentRequired) {\r\n muid = getCookieInline(\"muid\");\r\n }\r\n } catch {\r\n console.log(\"error fetching muid.\");\r\n }\r\n\r\n // Setting RID=AID might not be correct. The more complex logic in the bundles may determine that we have already burned this as a RID\r\n // and generate a new one different from AID. But it's better than nothing and we cannot see AID on app error reports right now.\r\n // Most of the time when we are not using app cache these two will be the same.\r\n const payload = {\r\n name: \"MS.News.Web.AppError\",\r\n time: pageGenTime,\r\n ver: \"4.0\",\r\n iKey: `o:${iKey}`,\r\n data: {\r\n baseData: {},\r\n baseType: \"MS.News.Web.Base\",\r\n page: {\r\n name: \"default\",\r\n product: pageProduct,\r\n type: pagetype\r\n },\r\n browser: {\r\n clientId: muid\r\n },\r\n flight: {\r\n id: flightIds\r\n },\r\n request: {\r\n activityId: settingsObject.aid,\r\n requestId: settingsObject.aid\r\n },\r\n locale: {\r\n mkt: market\r\n },\r\n extSchema: {\r\n id: appErrorId,\r\n source: source,\r\n severity: 0,\r\n pb: propertyBag,\r\n message: message\r\n }\r\n }\r\n };\r\n\r\n return payload ? JSON.stringify(payload) : null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Format query string parameters\r\n * @param params - The logging params\r\n */\r\nfunction formatParams(params: object): string {\r\n return \"?\" + Object\r\n .keys(params)\r\n .map(function (key: string): string {\r\n return key + \"=\" + encodeURIComponent(params[key]);\r\n }).join(\"&\");\r\n}\r\n\r\n/**\r\n * Extracts the value of iKey from apikey\r\n * @param apikey - The value of apikey for 1DS authentication\r\n */\r\nexport function getIKeyValue(apikey: string): string {\r\n\r\n if (apikey) {\r\n const iKeyIndex = apikey.indexOf(\"-\");\r\n if (iKeyIndex > 0) {\r\n return apikey.substring(0, iKeyIndex);\r\n }\r\n }\r\n\r\n return \"\";\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConnectorConstants, IActionPayload, IDataConnector, IReducer } from \"@msnews/experiences-redux-contracts\";\r\nimport { assign, get, merge, set } from \"lodash-es\";\r\n\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { dataConnectorInjector } from \"./DataConnectorInjector\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { logError } from \"@msnews/page-error-handling\";\r\nimport { reportDataConnectorStateChange } from \"./DataConnectorTracker\";\r\n\r\n/** Resolve & Reject Function Signature */\r\ntype ResolveConnectorSignature = (connector: IDataConnector) => void;\r\ntype RejectConnectorSignature = (error: Error) => void;\r\n\r\n/**\r\n * Pending getDataConnector Promise\r\n */\r\ninterface PendingConnectorPromise {\r\n /** Promise */\r\n promise: Promise>;\r\n /** callback to resolve the promise */\r\n resolve: ResolveConnectorSignature;\r\n /** callback to reject the promise */\r\n reject: RejectConnectorSignature;\r\n}\r\n\r\n/** Result from running a reducer. */\r\ninterface ReducerResult {\r\n /** The new state calculated by the reducer */\r\n newState: any;\r\n\r\n /** True if the state changed. */\r\n stateChanged: boolean;\r\n}\r\n\r\n/**\r\n * A reducer that can dynamically add and remove individual sub-reducers\r\n * @class\r\n */\r\nexport class DynamicReducer {\r\n\r\n /**\r\n * A map of connectors, which maintain the sub-spaced state. Reducers and connectors are keyed by namespace\r\n */\r\n private readonly _connectorMap: {[key: string]: IDataConnector} = {};\r\n\r\n /**\r\n * The list of global connectors. Used for fast lookup instead of iterating through _connectorMap keys and toArray methods.\r\n */\r\n private readonly _globalConnectors: IDataConnector[] = [];\r\n\r\n /**\r\n * The list of all connectors. Used for fast lookup instead of iterating through _connectorMap keys and toArray methods.\r\n */\r\n private readonly _allConnectors: IDataConnector[] = [];\r\n\r\n /**\r\n * The list of all pending promises for the get data connector call. Used to resolve the promise when data connector is instantiated.\r\n */\r\n private readonly _getDataConnectorPendingPromises: Map = new Map();\r\n\r\n /**\r\n * Creates an instance of the `DynamicReducer` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n */\r\n constructor() {\r\n // bind the reduce method to this instance\r\n this.reduce = this.reduce.bind(this);\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have their reducers registered with this instance\r\n * @method\r\n * @returns {IDataConnector} A simple arry of all connectors\r\n */\r\n public connectors(): IDataConnector[] {\r\n return this._allConnectors;\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have their reducers registered with this instance\r\n * @method\r\n * @param {string} namespace The namespace of the connector to return, if it is in the map\r\n * @returns {IDataConnector | undefined} A simple arry of all connectors\r\n */\r\n public connector(namespace: string): IDataConnector | undefined {\r\n return (this._connectorMap[namespace]);\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have state that is global\r\n * @method\r\n * @returns {IDataConnector} A simple arry of connectors that have global state\r\n */\r\n public globalConnectors(): IDataConnector[] {\r\n return this._globalConnectors;\r\n }\r\n\r\n /**\r\n * Returns a promise which resolves immediately if the data connector is already present on the page,\r\n * otherwise resolves when the data connector is instantiated on the Page later in the lifecycle.\r\n * @method\r\n * @param namespace The namespace of data connector to return\r\n */\r\n public getDataConnector(namespace: ConnectorNamespaces): Promise> {\r\n // Check for data connector, if it is already present resolve immediately\r\n const dataConnector = this.connector(namespace);\r\n if (dataConnector) {\r\n return Promise.resolve(dataConnector);\r\n }\r\n\r\n // Check if we have an entry for the namespace in pending promise map, if present return the same promise\r\n const pendingPromise = this._getDataConnectorPendingPromises.get(namespace);\r\n if (pendingPromise) {\r\n return pendingPromise.promise;\r\n }\r\n\r\n // If the data connector is not on the page and has no entry in the pending promise map, create a new promise\r\n let resolveCallback: ResolveConnectorSignature;\r\n let rejectCallback: RejectConnectorSignature;\r\n const promise = new Promise>((resolve, reject) => {\r\n // Get the reference to the resolve & reject which can be called later when the data connector is instantiated on the Page\r\n resolveCallback = resolve;\r\n rejectCallback = reject;\r\n });\r\n\r\n // Add the promise to the pending promise map\r\n this._getDataConnectorPendingPromises.set(namespace, { promise: promise, resolve: resolveCallback, reject: rejectCallback });\r\n\r\n // Return the promise\r\n return promise;\r\n }\r\n\r\n /**\r\n * Produces the next state based on the given action. The state to be reduced is an aggregate of the reducers for all of the connectors\r\n * that have been added.\r\n * The overall state looks something like:\r\n * This will be the state for the redux-subspace for the connector. It is of the form:\r\n * {\r\n * FOO: {\r\n * _@STATE@_: {\r\n * \r\n * },\r\n * BAR: {\r\n * _@STATE@_: {\r\n * \r\n * },\r\n * },\r\n * }\r\n * }\r\n * @function\r\n * @param state {any} The previous state of the application. The application state, will contain one or more sub-states, which will be individually reduced\r\n * @param actionPayload {IActionPayload} The action detail to update the state with.\r\n * @returns {any} The next state for the application, containing the next state for each connector (a.k.a subspace)\r\n */\r\n public reduce(state: any, actionPayload: IActionPayload): any {\r\n // If the initial state is undefined, then create an empty object to start with\r\n if (isNullOrUndefined(state)) {\r\n state = {};\r\n }\r\n\r\n let newState = { ...state };\r\n let stateChanged = false;\r\n const connectorKey: string = actionPayload.key;\r\n\r\n // See if we need to reduce for a specific connector. This is the common case.\r\n if (actionPayload !== undefined && connectorKey !== undefined) {\r\n const typeIsString: boolean = typeof actionPayload.type === \"string\";\r\n if (typeIsString && actionPayload.type.endsWith(ConnectorConstants.renderAction)) {\r\n // If this is a special action, used to force a re-render, then we need to set stateChanged to true, and create a clone of the existing scoped state\r\n const statePropertyKey = connectorKey + \".\" + ConnectorConstants.connectorStateKey;\r\n const connectorState = assign({}, get(state, statePropertyKey, undefined));\r\n set(newState, statePropertyKey, connectorState);\r\n stateChanged = true;\r\n } else if (typeIsString && actionPayload.type.endsWith(ConnectorConstants.dataConnectorMergeInitAction)) {\r\n // This is an action meant to set up initial state when an experience injects data connector state into itself.\r\n const experienceFullNamespace: string = connectorKey;\r\n const dataConnectorName: ConnectorNamespaces = actionPayload.params[0];\r\n\r\n if (dataConnectorName) {\r\n dataConnectorInjector.initializeExperience(newState, experienceFullNamespace, dataConnectorName);\r\n stateChanged = true;\r\n }\r\n } else {\r\n const connector = this._connectorMap[connectorKey];\r\n if (connector) {\r\n // If the connector doing the reducing is global, then create a deep copy of state, so that all the connected\r\n // components think the state is new, and run their mappers. Connected components are subscribed to, and only see\r\n // changed in their subspace portion of the state tree. The redux connect implementation uses strict equal comparison,\r\n // meaning it consider the state change if it is a new object reference, even if all the properties are still the same\r\n if (connector.isGlobal) {\r\n newState = merge({}, newState);\r\n }\r\n\r\n const connectorReducerResult = this.computeNextStateForConnector(newState, connectorKey, actionPayload);\r\n stateChanged = connectorReducerResult.stateChanged;\r\n\r\n if (stateChanged) {\r\n // Check to see if any experiences are including this data connector state. If so, update those too.\r\n dataConnectorInjector.reportStateChange(newState, connectorKey, connectorReducerResult.newState);\r\n\r\n if (canUseDOM()) {\r\n reportDataConnectorStateChange(connectorKey, connectorReducerResult.newState);\r\n }\r\n }\r\n } else {\r\n // If connector is not found in the map, throw error immediately during SSR.\r\n if (!canUseDOM()) {\r\n logError(`ConnectorMap for ${connectorKey} is undefined.`, 34006, {});\r\n throw new Error(\"Reducer for: \" + connectorKey + \" must not return undefined.\");\r\n }\r\n }\r\n }\r\n } else {\r\n // Iterate over the full list of connectors calling each reducer. This is not the common case, and is typically done\r\n // for actions that come from Redux, during initialization\r\n Object.keys(this._connectorMap).forEach(key => {\r\n if (this.computeNextStateForConnector(newState, key, actionPayload).stateChanged) {\r\n stateChanged = true;\r\n }\r\n });\r\n }\r\n\r\n // Return the newState, as modified by the reducer(s) if it was changed, otherwise return the original state\r\n if (stateChanged) {\r\n return newState;\r\n } else {\r\n return state;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a sub reducer for a connector to the sub-reducer collection.\r\n * @method\r\n * @param {IDataConnector} connector The connector to add.\r\n */\r\n public addSubReducerForConnector(connector: IDataConnector): void {\r\n if (!connector) {\r\n throw new Error(\"The parameter 'connector' cannot be null.\");\r\n }\r\n\r\n // Add the sub-reducer and connector into their maps, based on the connector's namespace\r\n const key = connector.fullNamespace;\r\n this._connectorMap[key] = connector;\r\n\r\n // update the all and global connector fast lookup lists\r\n this._allConnectors.push(connector);\r\n\r\n if (connector.isGlobal) {\r\n this._globalConnectors.push(connector);\r\n }\r\n\r\n // Check if there is a pending promise for the data connector\r\n // DO NOT CHANGE namespace to fullnamespace, data connectors are supposed to be queried using just the namespace by design.\r\n if (this._getDataConnectorPendingPromises.has(connector.namespace)) {\r\n // Get the resolve callback for the pending promise and resolve it\r\n const pendingPromise = this._getDataConnectorPendingPromises.get(connector.namespace);\r\n\r\n try {\r\n pendingPromise.resolve(connector);\r\n } catch (error) {\r\n pendingPromise.reject(error);\r\n }\r\n\r\n // Delete the entry from the pending promise map\r\n this._getDataConnectorPendingPromises.delete(connector.namespace);\r\n }\r\n\r\n connector.store.dispatch({ key: key, type: \"@@connector-view/INIT\" });\r\n }\r\n\r\n /**\r\n * Helper method to compute the next state for a given connector. This method will get the connector's actual state\r\n * from the state tree, call the reducer, and then state the state in the passed in object that is to receive the new state\r\n * @param {any} state The current subspace (or root) state object, which will be updated\r\n * @param {string} key The key to the connector in the connector map\r\n * @param {IActionPayload} actionPayload The action to apply\r\n * @returns Information on how the connector state was changed\r\n */\r\n private computeNextStateForConnector(state: any, key: string, actionPayload: IActionPayload): ReducerResult {\r\n // Get the connector, so that we can call the reducer\r\n const connector = this._connectorMap[key];\r\n\r\n // Setup the key and get the actual state property for the connector. lodash uses dotted notation\r\n // so the key will be something like: namespace._@STATE@_\r\n const statePropertyKey = key + \".\" + ConnectorConstants.connectorStateKey;\r\n const connectorPreviousState = get(state, statePropertyKey, undefined);\r\n\r\n // Call the reducer for the connector, and validate that we received a state object back.\r\n const nextStateForConnector = this.subReduce(connector.reducer, connectorPreviousState, actionPayload);\r\n if (typeof nextStateForConnector === \"undefined\") {\r\n throw new Error(\"Reducer for: \" + key + \" must not return undefined.\");\r\n }\r\n\r\n // If the state changed, then set the new connector state in the overall state object\r\n const connectorStateChanged: boolean = nextStateForConnector !== connectorPreviousState;\r\n if (connectorStateChanged) {\r\n set(state, statePropertyKey, nextStateForConnector);\r\n }\r\n\r\n return { newState: nextStateForConnector, stateChanged: connectorStateChanged };\r\n }\r\n\r\n /**\r\n * Calls the reducer that has been registered to handle the state associated with a specific subspace\r\n * @param {Reducer} reducer The reducer to call\r\n * @param {TSubReducerState} state The state object for the subreducer\r\n * @param {IActionPayload} actionPayload The action to apply\r\n */\r\n private subReduce(reducer: IReducer, previousState: TSubReducerState, actionPayload: IActionPayload): TSubReducerState {\r\n const reducedState: TSubReducerState = reducer.reduce(previousState, actionPayload);\r\n if (reducedState !== previousState) {\r\n return reducedState;\r\n } else {\r\n return previousState;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { captureJssGeneratedClasses } from \"@msnews/render-cache\";\r\nimport { registerResetCallback } from \"@msnews/core\";\r\n\r\n/**\r\n * Map which is used to store DesignSystem to GenerateClassName Callback.\r\n * Serialized designSystem is used as the key to ensure designSystemIndex is incremented if the designSystem is updated.\r\n * Weakmap is not used as identical designSystem objects should not be treated as different designSystems, an example is PivotContent.tsx progressive hydration.\r\n * Objects potentially garbage collected in WeakMap will also result in designSystemIndexMap being out of sync.\r\n */\r\nlet designSystemMap = new Map();\r\n\r\n/**\r\n * Map which will store number of DesignSystem appearances with same name.\r\n */\r\nlet designSystemIndexMap = new Map();\r\n\r\n/**\r\n * Register a callback to reset the designSystem globals.\r\n * The callback is registered once when the module is loaded and invoked once on the server side at the beginning of each request.\r\n */\r\nregisterResetCallback(() => {\r\n designSystemMap = new Map();\r\n designSystemIndexMap = new Map();\r\n});\r\n\r\n/**\r\n * JSS callback function that defines the class name generation logic\r\n * The default jss manager class name generation logic increments counter based on order\r\n * of how the experiences are rendered. We cannot guarantee the order due to async nature\r\n * of experiences which potentially causes different class names on every reload/refresh.\r\n * Instead here with this callback, we start the counter from 1 per rule to ensure class\r\n * names stays consistent irrespective of when they are rendered.\r\n *\r\n * Design system is taken into account since a change in it can result in potential different\r\n * styling being needed even if that rule was already used in a previous design system.\r\n *\r\n * For example:\r\n * For TopSites, with this override the class name would be generated as \"topSites-DS-default1-1\"\r\n * (jss manager by default would have generated it something like \"topSites-0-1-305\")\r\n * If the design system were to be updated and the same rule would be passed then you would\r\n * get topsites-DS-default2-1.\r\n */\r\nexport function createGenerateClassName(designSystem: any): (rule: any, sheet: any) => string {\r\n if (!designSystem) {\r\n return;\r\n }\r\n\r\n const dsKey = JSON.stringify(designSystem);\r\n let callback = designSystemMap.get(dsKey);\r\n\r\n if (!callback) {\r\n const dsName = designSystem.name || \"unknown\";\r\n const dsIndex = designSystemIndexMap.get(dsName) + 1 || 1;\r\n const rulesMap: any = {};\r\n callback = (rule: any, sheet: any) => {\r\n const key = rule.key;\r\n\r\n if (!rulesMap[key]) {\r\n rulesMap[key] = 1;\r\n } else {\r\n rulesMap[key]++;\r\n }\r\n\r\n const name = `DS-${dsName}${dsIndex}-${rulesMap[key]}`;\r\n captureJssGeneratedClasses(key, name);\r\n\r\n return `${key}-${name}`;\r\n };\r\n\r\n designSystemMap.set(dsKey, callback);\r\n designSystemIndexMap.set(dsName, dsIndex);\r\n }\r\n\r\n return callback;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Provider, connect } from \"react-redux\";\r\nimport { Store, StoreEnhancer, compose, createStore } from \"redux\";\r\nimport { getPageTimings, logger, perfMarker } from \"@msnews/diagnostics\";\r\n\r\nimport { DynamicReducer } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { IDataConnector } from \"@msnews/experiences-redux-contracts\";\r\nimport { JSSManager } from \"@microsoft/fast-jss-manager-react\";\r\nimport React from \"react\";\r\nimport ReactDom from \"react-dom\";\r\nimport { applyMiddleware } from \"redux-subspace\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { create } from \"jss\";\r\nimport { createGenerateClassName } from \"./PageHelper\";\r\nimport { getStateFromRenderCache } from \"@msnews/render-cache\";\r\nimport jssGlobal from \"jss-global\";\r\nimport jssNested from \"jss-nested\";\r\n\r\ndeclare global {\r\n interface Window {\r\n\r\n /**\r\n * Enable redux devtools extension debugging\r\n */\r\n __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: any;\r\n\r\n /**\r\n * Boolean flag to indicate if render cache hydration is happening\r\n */\r\n needsHydrate?: boolean;\r\n\r\n /**\r\n * Boolean flag to indicate if state is stored in render cache along with DOM\r\n */\r\n hasPreHydrateState?: boolean;\r\n }\r\n}\r\n\r\n/**\r\n * Page Base.\r\n * Each page or hybrid page/experience must have an instance of the PageBase, which contains the the store, and dynamic reducer\r\n * for the experience/app.\r\n * PageBase is setup as a singleton, so the proper usage in consumers is:\r\n * var pageBase = PageBase.getInstance();\r\n * @export\r\n * @class\r\n */\r\nexport class PageBase {\r\n /**\r\n * The singleton instance of this class\r\n * @type: {PageBase}\r\n */\r\n private static _instance: PageBase;\r\n\r\n /**\r\n * The Dynamic reducer for this app/experience\r\n * @type: {DynamicReducer}\r\n */\r\n private _rootReducer: DynamicReducer;\r\n\r\n /**\r\n * The Redux store containing the top level application state. All component and data connectors will manage namespaced subspaces within\r\n * this store\r\n * @type {Store}\r\n */\r\n private _store: Store;\r\n\r\n /**\r\n * Constructor for PageBase class\r\n * @constructor\r\n * @param {any} initialState Optional initial redux state provided as part of SSR response during hydration\r\n */\r\n private constructor(initialState?: any) {\r\n /**\r\n * In debug build, add the option to turn on redux-devtools-extension debugging.\r\n * More info here https://github.com/zalmoxisus/redux-devtools-extension\r\n */\r\n let enhancer: StoreEnhancer;\r\n const middlewares: any = [];\r\n if (canUseDOM() && ((typeof logger !== \"undefined\") && logger ? logger.isDebug() : false)) {\r\n const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 }) || compose;\r\n enhancer = composeEnhancers(applyMiddleware(...middlewares)\r\n );\r\n } else {\r\n enhancer = applyMiddleware(...middlewares);\r\n }\r\n\r\n // Create the root reducer\r\n this._rootReducer = new DynamicReducer();\r\n\r\n // Check to see if this app instance was bootstrapped with a render-cache\r\n initialState = initialState || (canUseDOM() && window.needsHydrate && getStateFromRenderCache()) || {};\r\n if (canUseDOM()) {\r\n window.hasPreHydrateState = !!(initialState && Object.keys(initialState).length !== 0);\r\n }\r\n\r\n // create the store with a basic root reducer\r\n this._store = createStore(this.rootReducer.reduce, initialState, enhancer);\r\n\r\n }\r\n\r\n /**\r\n * Reset PageBase. Useful when handling multiple requests when server side rendering.\r\n */\r\n public static resetPageBaseInstance(initialState?: any): void {\r\n this._instance = new PageBase(initialState);\r\n }\r\n\r\n /**\r\n * Gets the Redux store for this app/experience\r\n * @method\r\n * @returns {Store} The overall state for the App, which contains sub-states for each connector\r\n */\r\n public get store(): Store {\r\n return this._store;\r\n }\r\n\r\n /**\r\n * Gets the root reducer for this app/experience\r\n * @returns {DynamicReducer} The reducer for the app/experience\r\n */\r\n public get rootReducer(): DynamicReducer {\r\n return this._rootReducer;\r\n }\r\n\r\n /**\r\n * Gets the singleton instance of this class for the app/experience\r\n * @returns {PageBase} The instance of PageBase for the page/hybrid experience\r\n */\r\n public static getInstance(initialState?: any): PageBase {\r\n return this._instance || (this._instance = new this(initialState));\r\n }\r\n\r\n /**\r\n * Starts the application by calling the onApplicationStart method for each connector that has been added to the app.\r\n * @function\r\n * @method\r\n */\r\n public start(): void {\r\n // Iterate over all of the connector's and call their OnApplicationStart method\r\n const allConnectors: IDataConnector[] = this.rootReducer.connectors();\r\n allConnectors.forEach(connector => connector.onApplicationStart());\r\n }\r\n\r\n /**\r\n * Creates and renders a root element, that is connected to the store.\r\n * The root element will created with the passed in connected element as a child.\r\n * @function\r\n * @param {React.ReactElement} connectedTopLevelElement The top level rendering element for the page/application.\r\n * @param {HTMLElement} hostElement The host element (usually a
    ) to contain the msnews-experiences-redux application\r\n * @param {Function} callback An optional callback to be fired after hydration is complete, used when hydrating server side rendered content.\r\n * @param {boolean} bypassJSS To bypass JSSManager instance update set this to false\r\n * @param {Boolean} isSSR An optional flag to signal page is server side rendered and hydration is needed instead of render.\r\n * @method\r\n */\r\n public renderRootElement(\r\n connectedTopLevelElement: React.ReactElement,\r\n hostElement: HTMLElement,\r\n callback?: Function,\r\n bypassJSS?: Boolean,\r\n isSSR?: Boolean): void {\r\n // Update the base JSS manager instance\r\n if (bypassJSS !== true) {\r\n this.updateJssManagerInstance();\r\n }\r\n\r\n // Create a ReactElement, that contains the Redux provider with the store, passing the incoming top level element in as a child, so that\r\n // the pageElement wraps the top level element with the redux store\r\n const rootElement = React.createElement(Provider, { store: this._store }, connectedTopLevelElement);\r\n\r\n // Capture Render cache state in page timings\r\n const pageTimings = getPageTimings();\r\n\r\n if (isSSR) {\r\n pageTimings[\"isRenderCachePresent\"] = 0;\r\n perfMarker.startMark(\"SSR.Hydrate\");\r\n ReactDom.hydrate(rootElement, hostElement, callback);\r\n perfMarker.endMark(\"SSR.Hydrate\");\r\n window.needsHydrate = false;\r\n } else if (window.needsHydrate) {\r\n ReactDom.hydrate(rootElement, hostElement);\r\n pageTimings[\"isRenderCachePresent\"] = 1;\r\n window.needsHydrate = false;\r\n } else {\r\n perfMarker.startMark(\"CSR.Render\");\r\n pageTimings[\"isRenderCachePresent\"] = 0;\r\n ReactDom.render(rootElement, hostElement);\r\n perfMarker.endMark(\"CSR.Render\");\r\n }\r\n }\r\n\r\n /**\r\n * Creates and renders a widget in a provided element, that is connected to the store.\r\n * The root element will created with the passed in connected element as a child.\r\n * @function\r\n * @param widgetElement The rendering element for this experience\\widget.\r\n * @param {HTMLElement} hostElement The host element (usually a
    ) to contain the msnews-experiences-redux application\r\n * @method\r\n */\r\n public renderWidget(\r\n widgetElement: React.ReactElement,\r\n hostElement: HTMLElement): void {\r\n\r\n const rootElement = React.createElement(Provider, { store: this._store }, widgetElement);\r\n ReactDom.render(rootElement, hostElement);\r\n }\r\n\r\n /**\r\n * Updates the base JSSManager instance with the correct default plugins\r\n */\r\n public updateJssManagerInstance(): void {\r\n const jssInstance: ReturnType = create({\r\n plugins: [jssNested(), jssGlobal()]\r\n });\r\n\r\n JSSManager.createGenerateClassName = createGenerateClassName;\r\n JSSManager.jss = jssInstance;\r\n }\r\n}\r\n\r\nexport default PageBase;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { WebStorage } from \"./WebStorage\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * Local storage class for persistent storage\r\n */\r\nexport class LocalStorage extends WebStorage {\r\n constructor() {\r\n let storage: Storage = null;\r\n\r\n if (canUseDOM()) {\r\n try {\r\n storage = localStorage;\r\n } catch (ex) {\r\n // Getting local storage failed. Can happen in Chrome when user has disabled cookies.\r\n }\r\n }\r\n\r\n super(storage);\r\n }\r\n}\r\n\r\n/**\r\n * Set the local storage instance. Useful when setting up mock storage instance.\r\n * @param _storage The local storage instance to change to.\r\n */\r\nexport function setLocalStorage(_storage: WebStorage): void {\r\n safeLocalStorage = _storage;\r\n}\r\n\r\n/**\r\n * Get the local storage instance. This should be used in place of window.localStorage\r\n * as the browser API would throw exception on browsers with cookies disabled.\r\n * @return The local storage instance.\r\n */\r\nexport function getLocalStorage(): WebStorage {\r\n return safeLocalStorage;\r\n}\r\n\r\nlet safeLocalStorage: WebStorage = new LocalStorage();","// © Microsoft Corporation. All rights reserved.\r\n// Provides utility functions to get and set data from browser webStorage.\r\n\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Base class for localeStorage and sessionStorage abstractions\r\n */\r\nexport class WebStorage {\r\n\r\n /**\r\n * Check if the web storage is supported\r\n * @returns {boolean} true if supported\r\n */\r\n public get supported(): boolean {\r\n return !!this.storage;\r\n }\r\n\r\n /**\r\n * Local storage object for persistent storage\r\n * @param storage Storage used.\r\n */\r\n constructor(private readonly storage: Storage) {\r\n }\r\n\r\n /**\r\n * Get given key's value from web storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public getItem(key: string): string {\r\n if (this.supported) {\r\n return this.storage.getItem(key);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the value from local storage using the key.\r\n * @param {string} key - the storage key to store under\r\n * @param {T} defaultValue - the default value to return if parsing fails\r\n * @returns {T} The parsed JSON value\r\n */\r\n public getObject(key: string, defaultValue?: T): T {\r\n const value = this.getItem(key);\r\n if (value != null) {\r\n const parsedObj = tryParseJson(value);\r\n if (parsedObj != null) {\r\n return parsedObj;\r\n }\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Gets given index location key from web storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public key(index: number): string {\r\n if (this.supported && index >= 0) {\r\n return this.storage.key(index);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the given value after stringifying as JSON\r\n * @param {string} key - the storage key to store under\r\n * @param {T} value - the value to serialize and store\r\n */\r\n public setObject(key: string, value: T): void {\r\n (value !== undefined)\r\n ? this.setItem(key, JSON.stringify(value))\r\n : this.removeItem(key);\r\n }\r\n\r\n /**\r\n * Removes the given key from storage and returns the existing value parsed\r\n * @param {string} key - the key to remove.\r\n */\r\n public removeObject(key: string): T {\r\n const value = this.removeItem(key);\r\n if (value != null) {\r\n return tryParseJson(value);\r\n }\r\n }\r\n\r\n /**\r\n * Set given key's value to local storage\r\n * @param {string} key - Key name\r\n * @param {string} value - Key value\r\n */\r\n public setItem(key: string, value: string): void {\r\n if (this.supported) {\r\n // Catch quota exceeded exception\r\n try {\r\n this.storage.setItem(key, value);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove key item from local storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public removeItem(key: string): string {\r\n if (this.supported) {\r\n const value = this.getItem(key);\r\n this.storage.removeItem(key);\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Removes all keys containing the given substring in the storage key\r\n * @param {string} substring The substring to check\r\n */\r\n public removeSubstringKeys(substring: string): void {\r\n if (!this.supported || !substring) {\r\n return;\r\n }\r\n\r\n const matchingKeys = [];\r\n for (let index = 0; index < this.storage.length; index++) {\r\n const storageKey = this.key(index);\r\n if (storageKey && storageKey.includes(substring)) {\r\n matchingKeys.push(storageKey);\r\n }\r\n }\r\n\r\n for (let index = 0; index < matchingKeys.length; index++) {\r\n this.removeItem(matchingKeys[index]);\r\n }\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration indicating for samesite when setting cookies.\r\n */\r\nexport enum SameSiteValues {\r\n /**\r\n * (Default when not specified) Cookies are not sent on normal cross-site subrequests (for example to load images or frames into a third party site),\r\n * but are sent when a user is navigating to the origin site (i.e. when following a link).\r\n */\r\n Lax = \"lax\",\r\n /**\r\n * Cookies will only be sent in a first-party context and not be sent along with requests initiated by third party websites.\r\n */\r\n Strict = \"strict\",\r\n /**\r\n * Cookies will be sent in all contexts, i.e in responses to both first-party and cross-origin requests.If SameSite=None is set,\r\n * the cookie Secure attribute must also be set (or the cookie will be blocked).\r\n */\r\n None = \"none\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM, getCookieString } from \"@msnews/isomorphic-util\";\r\n\r\nimport { SameSiteValues } from \"@msnews/experiences-constants\";\r\n\r\n/**\r\n * Returns the cookie content given a name\r\n *\r\n * @param name {string} - cookie name\r\n * @returns the value of the cookie or `null`, if the key is not found.\r\n */\r\nexport function getCookie(name: string): string {\r\n const cookieString = getCookieString();\r\n\r\n if (cookieString) {\r\n const re = new RegExp(\"\\\\b\" + name + \"\\\\s*=\\\\s*([^;]*)\", \"i\");\r\n const match = re.exec(cookieString);\r\n return (match && match.length > 1 ? match[1] : null);\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Helper function that retrieves the MUID from the document.cookie\r\n * or uses the saved value if the cookie was retrieved for the current page instance\r\n */\r\nexport function getMuidCookie(): string {\r\n return getCookie(\"MUID\");\r\n}\r\n\r\n/**\r\n * Helper function used to set a cookie\r\n * NOTE: THIS BYPASSES ANY GDPR CHECK AND HENCE ONLY REQUIRED FUNCTIONAL COOKIES SHOULD BE SET USING THIS\r\n * IF YOU DO NOT KNOW IF YOUR COOKIE IS ONE THEN PLEASE USE Cookies.ts setCookie THAT MAKES USE OF GDPR LOGIC CHECKS\r\n * When expiryDays is equal to -1 it will unset the cookie\r\n * * @param {string} name Cookie name\r\n * * @param {string} value Cookie value\r\n * * @param {number} expiryDays Cookie expiry days\r\n * * @param {string} domain Cookie domain\r\n * * @param {string} path Cookie path\r\n * * @param {boolean} secure Is it a https only cookie\r\n * * @param {SameSiteValues} sameSiteValue What value should we use for samesite? also sets secure.\r\n */\r\nexport function setRequireFunctionalCookie(name: string, value: string, expiryDays?: number, domain?: string, path?: string, secure?: boolean, sameSiteValue?: SameSiteValues): void {\r\n let expiryDate;\r\n const builder = [name, \"=\", value];\r\n if (-1 === expiryDays) {\r\n // Expires date format is supposed to be in GMT.\r\n expiryDate = \"Fri, 31 Dec 1999 23:59:59 GMT\";\r\n } else if (expiryDays) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + (expiryDays * 86400000)); // 86400000 == 24*60*60*1000 (ms/day)\r\n expiryDate = date.toUTCString();\r\n }\r\n\r\n if (expiryDate) { builder.push(\";expires=\", expiryDate); }\r\n if (domain) { builder.push(\";domain=\", domain); }\r\n if (path) { builder.push(\";path=\", path); }\r\n if (secure) { builder.push(\";secure\"); }\r\n // Do we have a value to set for samesite? NOTE: the browser default is \"lax\" so we won't set when we have that value.\r\n if (sameSiteValue && sameSiteValue !== SameSiteValues.Lax) {\r\n builder.push(\";samesite=\", sameSiteValue.toString());\r\n // If samesite is \"none\" and we have not already set \"secure\".\r\n if (sameSiteValue === SameSiteValues.None && !secure) {\r\n builder.push(\";secure\");\r\n }\r\n }\r\n\r\n if (canUseDOM() && document) {\r\n document.cookie = builder.join(\"\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Split from DOMHelper to aid treeshaking\r\n// which currently adds class definition dependency (eg. RequestData)\r\n// even if they aren't used by code that only uses canUseDOM\r\n//\r\n// This being used in PCS inline scripts so only add to here\r\n// if critically important and do not have any other dependencies;\r\n// otherwise add to DOMHelpers\r\n\r\n/**\r\n * Checks if the DOM is available to access and use.\r\n * @returns {boolean} - true if DOM is available, or false if it is not. This is typically true for\r\n * client side rendering and false for server side rendering.\r\n */\r\nexport function canUseDOM(): boolean {\r\n return !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Aad data formatted from browser response\r\n */\r\nexport type AadData = {\r\n /**\r\n * Access token\r\n */\r\n token?: string;\r\n\r\n /**\r\n * Any error info\r\n */\r\n errorInfo?: AadErrorInfo;\r\n\r\n /**\r\n * Flag to indicate if call was successful\r\n */\r\n isSuccess?: boolean;\r\n\r\n /**\r\n * Flag to indicate if token is valid\r\n */\r\n isValid?: boolean;\r\n\r\n /**\r\n * Status for the authentication\r\n */\r\n status: AccessTokenStatus;\r\n};\r\n\r\n/**\r\n * Error info from aad request\r\n */\r\nexport type AadErrorInfo = {\r\n /**\r\n * Error string\r\n */\r\n error_string?: string;\r\n\r\n /**\r\n * Platform error code\r\n */\r\n platform_error_code?: number;\r\n\r\n /**\r\n * Primary error code\r\n */\r\n primary_error?: number;\r\n\r\n /**\r\n * Secondary error code\r\n */\r\n secondary_error?: number;\r\n\r\n /**\r\n * Internal error code for auth issues not handled by auth api\r\n */\r\n internal_error_code?: number;\r\n};\r\n\r\n/**\r\n * Account info\r\n */\r\nexport type AccountInfo = {\r\n /**\r\n * Account id\r\n */\r\n account_id?: string;\r\n\r\n /**\r\n * Account type\r\n */\r\n account_type?: string;\r\n\r\n /**\r\n * Tenant id\r\n */\r\n tenant_id?: string;\r\n\r\n /**\r\n * First name\r\n */\r\n first_name?: string;\r\n\r\n /**\r\n * Last name\r\n */\r\n last_name?: string;\r\n\r\n /**\r\n * Region/scope of customer's cloud environment\r\n */\r\n region_scope?: RegionScope;\r\n\r\n /**\r\n * Object ID\r\n */\r\n oid?: string;\r\n};\r\n\r\nexport enum RegionScope {\r\n /** Global cloud user */\r\n GLOBAL = \"GLOBAL\",\r\n /** GCC Moderate user */\r\n GCC_MODERATE = \"GCC_MODERATE\"\r\n}\r\n\r\nexport enum AccessTokenStatus {\r\n success,\r\n mfaRequired,\r\n otherError\r\n}\r\n\r\n/**\r\n * The client id of our application\r\n */\r\nexport const clientId = \"d7b530a4-7680-4c23-a8bf-c52c121d2e87\";\r\n\r\n/**\r\n * The scope/resource id for enterprise One Service\r\n */\r\nexport const oneServiceScope = \"https://enterprisenews.microsoft.com\";\r\n\r\n/**\r\n * The friendly name for the scope/resource for Enterprise One Service to be used\r\n * in logging.\r\n */\r\nexport const oneServiceFriendlyName = \"OneService\";\r\n\r\n/**\r\n * Edge Chromium version including and after which the blended ntp experience is available\r\n */\r\nexport const eNtpChromiumVersion = 87;","// © Microsoft Corporation. All rights reserved.\r\n\r\nconst DefaultSize1ColumnWidth = 300;\r\nconst DefaultSize2ColumnWidth = 624;\r\nconst DefaultSize3ColumnWidth = 948;\r\nconst DefaultSize4ColumnWidth = 1272;\r\nconst DefaultSize5ColumnWidth = 1596;\r\nconst DefaultGutterSize = 24;\r\n\r\nexport const Size1ColumnWidth = DefaultSize1ColumnWidth;\r\nexport let Size2ColumnWidth = DefaultSize2ColumnWidth;\r\nexport let Size3ColumnWidth = DefaultSize3ColumnWidth;\r\nexport let Size4ColumnWidth = DefaultSize4ColumnWidth;\r\nexport let Size5ColumnWidth = DefaultSize5ColumnWidth;\r\nexport let GutterSize = DefaultGutterSize;\r\n\r\n/** Updates the current ColumnWidths based on changes in gutterSize */\r\nexport function updateColumnWidths(gutterSize: number): void {\r\n GutterSize = gutterSize;\r\n Size5ColumnWidth = (Size1ColumnWidth * 5) + (gutterSize * 4);\r\n Size4ColumnWidth = (Size1ColumnWidth * 4) + (gutterSize * 3);\r\n Size3ColumnWidth = (Size1ColumnWidth * 3) + (gutterSize * 2);\r\n Size2ColumnWidth = (Size1ColumnWidth * 2) + gutterSize;\r\n}\r\n\r\n/** Resets the ColumnWidths to their default values */\r\nexport function resetColumnWidthsAndGutterSize(): void {\r\n GutterSize = DefaultGutterSize;\r\n Size2ColumnWidth = DefaultSize2ColumnWidth;\r\n Size3ColumnWidth = DefaultSize3ColumnWidth;\r\n Size4ColumnWidth = DefaultSize4ColumnWidth;\r\n Size5ColumnWidth = DefaultSize5ColumnWidth;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { toNumber as _toNumber, isString } from \"lodash-es\";\r\n\r\nexport type KeyValuePair = { key: K, value: V };\r\nexport type KeyValueArray = KeyValuePair[];\r\n\r\nexport namespace Utility {\r\n /**\r\n * Check if given value is not null. Returns true when not null, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for not null\r\n * @return {boolean}\r\n */\r\n export function isNotNullOrUndefined(value: any): boolean {\r\n return typeof value !== \"undefined\" && value !== null;\r\n }\r\n\r\n export interface IHashable {\r\n /**\r\n * This function will return the string representation of the complex object\r\n * @type {function}\r\n */\r\n toString(): string;\r\n }\r\n\r\n /**\r\n * Check if given value is defined. Returns true when defined, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for defined\r\n * @return {boolean}\r\n */\r\n export function isDefined(value: any): boolean {\r\n return (typeof value !== \"undefined\");\r\n }\r\n\r\n /**\r\n * Check if a given value is a valid key value pair\r\n *\r\n * @export\r\n * @param potentialKeyValuePair\r\n * @return {boolean}\r\n */\r\n export function isKeyValuePair(potentialKeyValuePair: { key: K, value: V },\r\n isKey: (key: K) => boolean,\r\n isValue: (value: V) => boolean): boolean {\r\n return Utility.isNonNullObject(potentialKeyValuePair)\r\n && isKey(potentialKeyValuePair.key)\r\n && isValue(potentialKeyValuePair.value);\r\n }\r\n\r\n /**\r\n * Check if given value is a non null object. Returns true when value is non null , otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for non null\r\n * @return {boolean}\r\n */\r\n export function isNonNullObject(value: any): boolean {\r\n return value && typeof value === \"object\";\r\n }\r\n\r\n /**\r\n * Check if given value is not null. Returns true when not null, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for not null\r\n * @return {boolean}\r\n */\r\n export function isNotNull(value: any): boolean {\r\n return value !== null;\r\n }\r\n\r\n /**\r\n * Check if given value is a a non-null or non-empty string. Returns true when it is, otherwise false.\r\n *\r\n * @export\r\n * @param {string} value - Value to check for string\r\n * @return {boolean}\r\n */\r\n export function isNullOrWhiteSpace(value: string): boolean {\r\n return !isString(value) || value.trim() === \"\";\r\n }\r\n\r\n /**\r\n * Converts string to number\r\n *\r\n * @export\r\n * @param {string} value - string to convert to a number\r\n * @param {number} defaultValue - number to return if there is an error\r\n * @return {number}\r\n */\r\n export function toNumber(value: string, defaultValue = -1): number {\r\n if (!value) {\r\n return defaultValue;\r\n }\r\n\r\n const result = _toNumber(value);\r\n if (!isNaN(result)) {\r\n return result;\r\n } else {\r\n return defaultValue;\r\n }\r\n }\r\n\r\n /**\r\n * Check if given value is an array with content in it.\r\n * Returns true when value is an array with content, otherwise false.\r\n *\r\n * @export\r\n * @param {any[]} value - Value to check for array with content\r\n * @return {boolean}\r\n */\r\n export function arrayHasData(value: any[]): boolean {\r\n if (isNotNullOrUndefined(value)) {\r\n return ((value.constructor === Array) && (value.length > 0));\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if given value is a string with content in it.\r\n * Returns true when value is a string with content, otherwise false.\r\n *\r\n * @export\r\n * @param {string} value - Value to check for string with content\r\n * @return {boolean}\r\n */\r\n export function stringHasData(value: string): boolean {\r\n return (isString(value) && (value.trim().length > 0));\r\n }\r\n\r\n /**\r\n * Convert object to string representation for it's values.\r\n * @param {object} object - The object to convert\r\n * @returns {string}\r\n */\r\n export function objectToString(object: object): string {\r\n let value = \"\";\r\n let firstRun = true;\r\n\r\n if (typeof object !== \"object\") {\r\n return value;\r\n }\r\n\r\n for (const attribute in object) {\r\n if (typeof object[attribute] === \"object\") {\r\n value += firstRun ? `${objectToString(object[attribute])}` : `-${objectToString(object[attribute])}`;\r\n } else {\r\n value += firstRun ? `${object[attribute]}` : `-${object[attribute]}`;\r\n }\r\n\r\n firstRun = false;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Helper function to replace hyphens with empty strings\r\n *\r\n * @param {string} input - Input string\r\n * @returns {string}\r\n */\r\n export function removeHyphens(input: string): string {\r\n if (!input) {\r\n return;\r\n }\r\n return input.replace(/-/g, \"\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, AppErrorPropertyBag, ErrorBehavior, Severity } from \"@msnews/core-contracts\";\r\n\r\n/**\r\n * All app errors are set to create IcM ticket by default unless specified in individual error code otherwise.\r\n */\r\nconst severity = Severity.Alert;\r\n\r\n/**\r\n * Build number is only passed in from updateResolverAppErrorsPropertyBag on page initialization\r\n */\r\nconst pb: AppErrorPropertyBag = {\r\n build: \"\"\r\n};\r\n\r\n/**\r\n * Append or update property bag properties. At page level intialization, this should be called to update the build number.\r\n * Since all app error objects has reference to this base property bag, calling this method will in fact update for all app errors.\r\n * @param newPbInfo Additional information needed for app error property bag\r\n */\r\nexport function updateResolverAppErrorsPropertyBag(newPbInfo: Partial): void {\r\n Object.assign(pb, newPbInfo);\r\n}\r\n\r\n/**\r\n * Getter for the base app error property bag. Currently only used in unit test\r\n */\r\nexport function getResolverAppErrorsPropertyBag(): AppErrorPropertyBag {\r\n return pb;\r\n}\r\n\r\nconst resolverSourceFile = \"ConfigService.ts\";\r\nexport const ResolverAppErrors = {\r\n /**\r\n * IndexedDb write failed in resolver.\r\n */\r\n IndexedDbWriteFailed: {\r\n id: 22010,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb read failed in resolver.\r\n */\r\n IndexedDbReadFailed: {\r\n id: 22011,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver fetch errors.\r\n */\r\n CrsFetchError: {\r\n id: 22012,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver was enabled but we still went to Assets to getConfig and merge configs at client (classic resolver).\r\n */\r\n ReceivedConfigFromCdnAsCrsFetchFailed: {\r\n id: 22013,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Exception In GetConfig function.\r\n */\r\n GetConfigException: {\r\n id: 22014,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb bulk read failed in resolver.\r\n */\r\n IndexedDbBulkReadFailed: {\r\n id: 22015,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to remove cached config\r\n */\r\n IndexedDbFailedToRemoveCachedConfig: {\r\n id: 22016,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to clear all configs\r\n */\r\n IndexedDbFailedToClearAllCachedConfigs: {\r\n id: 22017,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache is purged due to changes in config\r\n */\r\n RenderCachePurgedDueToChangesInConfig: {\r\n id: 22018,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache failed purge even though config changes were detected.\r\n */\r\n FailedToPurgeRenderCache: {\r\n id: 22019,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to refresh config cache\r\n */\r\n RefreshConfigCacheFailed: {\r\n id: 22020,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to initialize indexedDb\r\n */\r\n IndexedDbInitFailed: {\r\n id: 22021,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Different cache busting identifier\r\n */\r\n DifferentCbid: {\r\n id: 22022,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error writing prg flights to localStorage\r\n */\r\n PrgFlightLsWriteError: {\r\n id: 22023,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error reading prg flights to localStorage\r\n */\r\n PrgFlightLsReadError: {\r\n id: 22024,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Configs served from CDN after CRS fetch failed\r\n */\r\nexport const ResolverErrorConfigsDownloadedByCdn: AppError = {\r\n id: 22025,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Cached configs are for different flight\r\n */\r\nexport const CachedConfigsForDifferentFlight: AppError = {\r\n id: 22026,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * CRS sent non-200 response\r\n */\r\nexport const ConfigCrsFetchNon200Response: AppError = {\r\n id: 22027,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true,\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n\r\n/**\r\n * Cdn config fetch received non-200 response\r\n */\r\nexport const ConfigCdnFetchNon200Response: AppError = {\r\n id: 22028,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n};\r\n\r\n/**\r\n * Invalid config ref received to resolve configs when Git configs is enabled\r\n */\r\nexport const GitConfigsInvalidConfigRef: AppError = {\r\n id: 22029,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/**\r\n * Invalid configResolver object for Git configs flight\r\n */\r\nexport const GitConfigsInvalidConfigResolver: AppError = {\r\n id: 22030,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n\r\n/**\r\n * Config Service Resolver timeout.\r\n */\r\nexport const CrsFetchTimeout: AppError = {\r\n id: 22031,\r\n source: resolverSourceFile,\r\n severity,\r\n pb: {\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n\r\n/** Starts from 22050 */\r\nexport const FallbackResolverAppErrors = {\r\n /**\r\n * getConfigRecursive function try catch failed.\r\n */\r\n RecursiveGetFailed: {\r\n id: 22050,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * BlobFetcher fetch failed for configs or config index.\r\n */\r\n BlobFetchReturnedNull: {\r\n id: 22051,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * Error that when Server Cache config refresh failed\r\n */\r\nexport const ServerCacheRefreshFailed: AppError = {\r\n id: 34009,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * Error that when SSR failed to getConfig.\r\n */\r\nexport const ServerCacheFetchFailed: AppError = {\r\n id: 34005,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n\r\n/**\r\n * SSR config resolver returned null config\r\n */\r\nexport const SsrResolverReturnedNullConfig: AppError = {\r\n id: 34011,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.HighImpact,\r\n pb\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** Type info of a single page measure in the window._pageMeasures object */\r\nexport type PageMeasure = {\r\n\r\n /** Name of the timeline */\r\n timelineName: string;\r\n\r\n /** Name of the metric */\r\n measureName: string;\r\n\r\n /** Flag that indicates whether this measure is an async measure */\r\n async?: boolean;\r\n\r\n /** The start time of the measure */\r\n from: number;\r\n\r\n /** The end time of the measure */\r\n to: number;\r\n};\r\n\r\n/**\r\n * Interface for PerfTimeline constructor\r\n *\r\n * Reason for constructor interface is to\r\n * prevent PerfTimeline implementation and dependencies\r\n * from added to inline script bundle (eg. Edge Legacy service-ui)\r\n * when perftimeline is disabled.\r\n*/\r\ninterface PerfTimelineConstructor {\r\n /**\r\n * New method to construct a {PerfTimeline} instance\r\n * @param timelineName - the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n * @param instanceId - this specific instance's ID. Used during a renaming operation to idenfity any previous isntance.\r\n * @param addPerfMarks - Flag to indicate whether to log perf marks with the native performance API.\r\n * @param addPageTimings - Flag to indicate whether to log the perf marks into the _pageTimings object.\r\n * @param async - Flag to mark this timeline as an async timeline, so by default all measures under\r\n * this timeline will show under a new process line.\r\n */\r\n new (timelineName: string,\r\n instanceId: string,\r\n addPerfMarks: boolean,\r\n addPageTimings: boolean,\r\n async?: boolean): PerfTimeline;\r\n}\r\n\r\n/**\r\n * Factory method to construct a {PerfTimeline} instance\r\n * @param timelineName - the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n * @param instanceId - this specific instance's ID. Used during a renaming operation to idenfity any previous isntance.\r\n * @param addPerfMarks - Flag to indicate whether to log perf marks with the native performance API.\r\n * @param addPageTimings - Flag to indicate whether to log the perf marks into the _pageTimings object.\r\n * @param async - Flag to mark this timeline as an async timeline, so by default all measures under\r\n * this timeline will show under a new process line.\r\n */\r\nexport function createPerfTimeline(\r\n ctor: PerfTimelineConstructor,\r\n timelineName: string,\r\n instanceId: string,\r\n addPerfMarks = false,\r\n addPageTimings = false,\r\n async?: boolean\r\n): PerfTimeline {\r\n return new ctor(timelineName, instanceId, addPerfMarks, addPageTimings, async);\r\n}\r\n\r\n/** PerfTimeline interface for diagnostic utilities and its clients. */\r\nexport interface PerfTimeline {\r\n\r\n /**\r\n * the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n */\r\n readonly timelineName: string;\r\n\r\n /** this specific instance's ID. Used during a renaming operation to idenfity any previous isntance. */\r\n readonly instanceId: string;\r\n\r\n /** Renames this instances of the timeline to the new given name. */\r\n rename(timelineName: string): void;\r\n\r\n /** Marks the start of a timeline measurement. */\r\n startMeasure(coreMarkerName: string, dynamicMeasureName?: string, async?: boolean): {\r\n /** Method that should be used to mark the end the measure */\r\n endMeasure: (updatedDynamicMeasureName?: string) => void\r\n };\r\n\r\n /** Returns the list of page measures for this timeline object */\r\n getPageMeasures(): Array;\r\n\r\n /** Instruments the start/begin for the given function with a given binding context */\r\n instrumentFunc(funcName: string, func: TFunc, bindingContext?: Object): TFunc;\r\n\r\n /** Instruments the start/begin for the given async-style function */\r\n instrumentPromise(promiseName: string, getPromise: () => Promise , async?: boolean): Promise ;\r\n}\r\n\r\n/** Main factory function interface for perf timeline. */\r\nexport interface TryGetPerfTimelineFunc {\r\n /**\r\n * Gets or creates a perf timeline object for the given experience instance\r\n * @param experienceName - the name of the experience for which to create the timeline\r\n * @param instanceId - the ID that will uniquely identify this timeline across multiple instances.\r\n * @param async - Optional flag to indicate the default tracing mode for this timeline.\r\n * Specifying true will render the measures under its own process id in the app trace.\r\n * Useful if the timeline will contain many async operations that frequently overlap with each other.\r\n * Note that this value can be overriden when taking an individual measure as well.\r\n */\r\n (experienceName: string, instanceId: string, async?: boolean): PerfTimeline;\r\n}\r\n\r\n/** Internal function reference for the perf timeline factory method */\r\nlet tryGetPerfTimelineFuncRef: TryGetPerfTimelineFunc = null;\r\n\r\n/** Set the function to use to get PerfTimeline. This is used by initializeExperienceDiagnotics. */\r\nexport function setTryGetPerfTimelineFunc(func: TryGetPerfTimelineFunc): void {\r\n tryGetPerfTimelineFuncRef = func;\r\n}\r\n\r\n/**\r\n * Gets or creates a perf timeline object for the given experience instance\r\n * @param experienceName - the name of the experience for which to create the timeline\r\n * @param instanceId - the ID that will uniquely identify this timeline across multiple instances.\r\n * @param async - Optional flag to indicate the default tracing mode for this timeline.\r\n * Specifying true will render the measures under its own process id in the app trace.\r\n * Useful if the timeline will contain many async operations that frequently overlap with each other.\r\n * Note that this value can be overriden when taking an individual measure as well.\r\n */\r\nexport const tryGetPerfTimeline: TryGetPerfTimelineFunc = (experienceName: string, instanceId: string, async?: boolean): PerfTimeline => {\r\n if (tryGetPerfTimelineFuncRef) {\r\n return tryGetPerfTimelineFuncRef(experienceName, instanceId, async);\r\n } else {\r\n return null;\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different browser types\r\n * @enum\r\n */\r\nexport enum BrowserType {\r\n EdgeChromium = \"edgeChromium\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IClientSettings } from \"./ClientSettings\";\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { getLocalStorage } from \"../webstorage\";\r\n\r\n/**\r\n * The response from the HeadData API\r\n */\r\nexport interface HeadDataResponse {\r\n /** The client settings object. */\r\n clientSettings: IClientSettings;\r\n\r\n /** The info string, containing flights. */\r\n info: string;\r\n}\r\n\r\n/**\r\n * Gets the local storage key for the head data.\r\n * @param pagetype The page type of the page used as local storage cache key\r\n */\r\nexport function getStoredHeadDataKey(pagetype: string): string {\r\n return \"shd_\" + pagetype;\r\n}\r\n\r\n/**\r\n * Gets the stored head data, or null if none is stored.\r\n * @param pagetype The page type of the page used as local storage cache key\r\n * @return The stored head data if found, otherwise return null\r\n */\r\nexport function getStoredHeadData(pagetype: string): HeadDataResponse {\r\n const storageKey: string = getStoredHeadDataKey(pagetype);\r\n const storedHeadDataJson: string = getLocalStorage().getItem(storageKey);\r\n return (storedHeadDataJson) ? tryParseJson(storedHeadDataJson) : null;\r\n}\r\n\r\n/**\r\n * Sets the stored head data. Pass in null to clear the stored data.\r\n * @param pagetype The page type of the page used as local storage cache key\r\n * @param headDataResponse The head data response from api call to be set to local storage\r\n */\r\nexport function setStoredHeadData(pagetype: string, headDataResponse: HeadDataResponse) {\r\n const storageKey: string = getStoredHeadDataKey(pagetype);\r\n\r\n if (headDataResponse) {\r\n getLocalStorage().setItem(storageKey, JSON.stringify(headDataResponse));\r\n } else {\r\n getLocalStorage().removeItem(storageKey);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM, getDocumentElementsByTagName, getLocationSearch, getLocationHostname } from \"@msnews/isomorphic-util\";\r\nimport { applicationCacheConstants, clientSettings, dir, htmlElementIds, info, js, lang, pagetypeSettings, CoreLocalStorageKeys } from \"../constants\";\r\n\r\nimport { IClientSettings } from \"./ClientSettings\";\r\nimport { AudienceModeType, BrowserType } from \"@msnews/experiences-constants\";\r\nimport { WebClientData } from \"../types/WebClientData\";\r\nimport { UrlUtility } from \"../utilities/UrlUtility\";\r\nimport { getLocalStorage } from \"../webstorage\";\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { KeyValueArray } from \"../utilities\";\r\nimport { logger, updateAppErrorsPropertyBag } from \"@msnews/diagnostics\";\r\nimport { parseISO } from \"date-fns\";\r\nimport { getStoredHeadData, setStoredHeadData, HeadDataResponse } from \"./StoredHeadData\";\r\nimport { eNtpChromiumVersion } from \"./Enterprise\";\r\n\r\n/**\r\n * Format used for activity ID stored in storage\r\n */\r\nexport type StoredActivityId = {\r\n /**\r\n * ID value\r\n */\r\n id: string;\r\n\r\n /**\r\n * Timestamp of when value was stored\r\n */\r\n ts: number;\r\n};\r\n\r\nexport const MmxWwwContentFlightId = \"prg-mmxcontent-t\";\r\n\r\n/** Type for storing app versions for different page types */\r\nexport type PageAppVersions = { [pageType: string]: string };\r\n\r\n/**\r\n * Class for getting the head data information.\r\n */\r\nclass HeadData {\r\n /**\r\n * The single instance of the HeadData class.\r\n * @type {HeadData}\r\n */\r\n private static _instance: HeadData;\r\n\r\n private anonCookieName: string;\r\n private locale: string;\r\n private marketDir: string;\r\n private currentFlights: string;\r\n private clientSettings: IClientSettings;\r\n private enableCMSPPEConfigs = false;\r\n private userIsSignedIn: boolean; // Always signed out on server side: https://dev.azure.com/microsoft/OS/_workitems/edit/25344027\r\n private isPreload: boolean;\r\n private isPrerender: boolean;\r\n private headElement: any;\r\n private htmlElement: any;\r\n private applicationCache: any;\r\n private isAppcache: boolean;\r\n private isBlendedEnterprise: boolean;\r\n private isMmxWwwContentRequest: boolean;\r\n private isServiceWorkerCache: boolean;\r\n private ssoComplete: boolean;\r\n private aadState: boolean;\r\n private locationSearch: string;\r\n private lastKnownAppVersion: string;\r\n\r\n // TODO: Task 24890741: refactor this class to use the current singleton pattern with ES6 modules\r\n // This will also clean up these getters/setters\r\n public get Locale(): string { return this.locale; }\r\n\r\n public get MarketDir(): string { return this.marketDir; }\r\n public set MarketDir(value: string) { this.marketDir = value; }\r\n\r\n public get CurrentFlights(): string { return this.currentFlights || \"\"; }\r\n public set CurrentFlights(value: string) { this.currentFlights = value; }\r\n\r\n public get ClientSettings(): IClientSettings { return this.clientSettings; }\r\n public set ClientSettings(value: IClientSettings) { this.clientSettings = value; }\r\n\r\n public get EnableCMSPPEConfigs(): boolean { return this.enableCMSPPEConfigs; }\r\n\r\n public get UserIsSignedIn(): boolean { return this.userIsSignedIn; }\r\n public set UserIsSignedIn(value: boolean) { this.userIsSignedIn = value; }\r\n\r\n public get IsPreload(): boolean { return this.isPreload; }\r\n public set IsPreload(value: boolean) { this.isPreload = value; }\r\n\r\n public get IsPrerender(): boolean { return this.isPrerender; }\r\n public set IsPrerender(value: boolean) { this.isPrerender = value; }\r\n\r\n public get IsAppCache(): boolean { return this.isAppcache; }\r\n\r\n public get IsBlendedEnterprise(): boolean { return this.isBlendedEnterprise; }\r\n public set IsBlendedEnterprise(value: boolean) { this.isBlendedEnterprise = value; }\r\n\r\n public get IsMmxWwwContentRequest(): boolean { return this.isMmxWwwContentRequest; }\r\n public set IsMmxWwwContentRequest(value: boolean) { this.isMmxWwwContentRequest = value; }\r\n\r\n public get IsServiceWorkerCache(): boolean { return this.isServiceWorkerCache; }\r\n\r\n /**\r\n * The last known app version for the currently loaded page type.\r\n * To get the current page version, use clientSettings.bundleInfo.v value.\r\n */\r\n public get LastKnownAppVersion(): string { return this.lastKnownAppVersion; }\r\n\r\n // TODO: Dependencies that some client side code expects headData to specify but doesn't due to PCS\r\n public get AnonCookieName(): string { return this.anonCookieName; }\r\n public set AnonCookieName(value: string) { this.anonCookieName = value; }\r\n\r\n public get SsoComplete(): boolean { return this.ssoComplete; }\r\n\r\n public get AadState(): boolean { return this.aadState; }\r\n public set AadState(value: boolean) { this.aadState = value; }\r\n\r\n public set LocaleName(value: string) { this.locale = value; }\r\n\r\n /**\r\n * True if we need to generate a new RID for telemetry.\r\n * In normal scenarios the ActivityID and telemetry RID will match. But sometimes we are unable to refresh the head data\r\n * to get a new activity ID. In those cases we need to generate a fresh RID for telemetry, and the ActivityID and RID will\r\n * not match.\r\n */\r\n public newRidNeeded: boolean;\r\n\r\n /**\r\n * Initialize the head data instance, on server side provide the client info & client settings\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n */\r\n private constructor(clientData?: WebClientData) {\r\n this.initializeHeadData(clientData);\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns {HeadData}\r\n */\r\n public static getInstance(): HeadData { return HeadData._instance || (HeadData._instance = new HeadData()); }\r\n\r\n /**\r\n * Reset singleton class instance with passed in info and client settings. Used on server side to reset HeadData for each request.\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n * @returns {HeadData}\r\n */\r\n public static resetInstance(clientData?: WebClientData): HeadData {\r\n HeadData._instance = new HeadData(clientData);\r\n headData = HeadData._instance;\r\n return HeadData._instance;\r\n }\r\n\r\n /**\r\n * Initializes head data. If WebClientData is provided use that, otherwise do client side initialization.\r\n * @param {WebClientData} clientData - Data object containing both client info and settings\r\n */\r\n public initializeHeadData(clientData?: WebClientData): void {\r\n if (clientData) {\r\n // Data is passed in only from Render Service under Node.JS environment since there is no DOM.\r\n this.initializeFromData(clientData);\r\n return;\r\n }\r\n\r\n this.newRidNeeded = undefined;\r\n this.lastUsedActivityIdBacking = undefined;\r\n this.locationSearch = getLocationSearch();\r\n this.htmlElement = canUseDOM() ? getDocumentElementsByTagName(htmlElementIds.html)[0] : null;\r\n this.headElement = canUseDOM() ? getDocumentElementsByTagName(htmlElementIds.head)[0] : null;\r\n this.applicationCache = canUseDOM() ? window.applicationCache : null;\r\n\r\n if (!this.htmlElement || !this.headElement) {\r\n return;\r\n }\r\n\r\n // We always initialize from DOM first because\r\n // even if we are in an appcache/service worker case, we still need some data from the DOM\r\n // and we will fallback to DOM if there are no items found in storage\r\n this.initializeFromDom();\r\n\r\n // Attempt to override with local storage item when in appcache scenario\r\n // In service worker scenario, just update the storage activity id\r\n if (this.applicationCache && this.htmlElement.getAttribute(applicationCacheConstants.manifestAttributeName)) {\r\n this.isAppcache = true;\r\n } else if (window && window.navigator && window.navigator.serviceWorker && window.navigator.serviceWorker.controller) {\r\n this.isServiceWorkerCache = true;\r\n }\r\n\r\n if (this.isAppcache || this.isServiceWorkerCache) {\r\n // First apply head data from local storage. This might change the AID\r\n this.initializeFromStorage();\r\n\r\n // Now update last used activity ID based on the current activity ID\r\n this.initializeLastUsedActivityId();\r\n }\r\n\r\n // Below items are common for both scenarios\r\n const clientSettingsLocaleExists = this.clientSettings && this.clientSettings.locale && this.clientSettings.locale.language && this.clientSettings.locale.market;\r\n this.locale = clientSettingsLocaleExists &&\r\n (\r\n this.clientSettings.locale.language\r\n + \"-\"\r\n + (this.clientSettings.locale.script ? this.clientSettings.locale.script + \"-\" : \"\")\r\n + this.clientSettings.locale.market\r\n ).toLowerCase() || \"\";\r\n\r\n const marketDir = this.htmlElement.getAttribute(dir);\r\n this.marketDir = marketDir && marketDir.toLocaleLowerCase() || \"\";\r\n\r\n this.setQueryItemProvidedValues();\r\n\r\n // Note: This isn't currently being stamped by PCS\r\n const headDataJs = this.headElement.getAttribute(js);\r\n if (headDataJs) {\r\n const headJs = <{ anonckname: string, signedin: number }>tryParseJson(headDataJs);\r\n this.anonCookieName = headJs.anonckname;\r\n this.userIsSignedIn = headJs.signedin === 1;\r\n }\r\n\r\n // Checks if current request is background preload\r\n if (UrlUtility.getQueryParameterByName(\"backgroundpreload\", this.locationSearch)\r\n && document.visibilityState === \"hidden\") {\r\n this.isPreload = true;\r\n this.logDocumentVisibility();\r\n }\r\n\r\n // Checks if current request is prerender request\r\n if (UrlUtility.getQueryParameterByName(\"prerender\", this.locationSearch)\r\n && document.visibilityState === \"hidden\") {\r\n this.isPrerender = true;\r\n this.logDocumentVisibility();\r\n }\r\n\r\n // Determine if we are in Enterprise version or not\r\n this.setIsBlendedEnterprise();\r\n this.setIsMmxWwwContentRequest();\r\n }\r\n\r\n private lastUsedActivityIdBacking: StoredActivityId;\r\n\r\n /**\r\n * Gets the last used activity ID, or null if there is none stored.\r\n */\r\n public get lastUsedActivityId(): StoredActivityId {\r\n if (this.lastUsedActivityIdBacking) {\r\n return this.lastUsedActivityIdBacking;\r\n }\r\n\r\n const storageKey: string = this.getStoredActivityIdKey();\r\n const storedActivityIdJson: string = getLocalStorage().getItem(storageKey);\r\n if (storedActivityIdJson) {\r\n this.lastUsedActivityIdBacking = tryParseJson(storedActivityIdJson);\r\n }\r\n\r\n return this.lastUsedActivityIdBacking;\r\n }\r\n\r\n /**\r\n * Sets the last used activity ID. Pass in null to clear the stored data.\r\n */\r\n public set lastUsedActivityId(activityId: StoredActivityId) {\r\n const storageKey: string = this.getStoredActivityIdKey();\r\n if (activityId) {\r\n if (activityId.id && activityId.ts) {\r\n getLocalStorage().setItem(storageKey, JSON.stringify(activityId));\r\n this.lastUsedActivityIdBacking = activityId;\r\n }\r\n } else {\r\n getLocalStorage().removeItem(storageKey);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the stored head data, or null if none is stored.\r\n */\r\n public get storedHeadData(): HeadDataResponse {\r\n return getStoredHeadData(this.clientSettings.pagetype);\r\n }\r\n\r\n /**\r\n * Sets the stored head data. Pass in null to clear the stored data.\r\n */\r\n public set storedHeadData(headDataResponse: HeadDataResponse) {\r\n setStoredHeadData(this.clientSettings.pagetype, headDataResponse);\r\n }\r\n\r\n /**\r\n * Initializes the client settings and info from client data passed in externally (render service query param)\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n */\r\n private initializeFromData(clientData: WebClientData): void {\r\n this.clientSettings = clientData.clientSettings;\r\n\r\n this.setFlights(clientData.clientInfo);\r\n\r\n this.setQueryItemProvidedValues();\r\n\r\n const clientSettingsLocaleExists = this.clientSettings && this.clientSettings.locale && this.clientSettings.locale.language && this.clientSettings.locale.market;\r\n this.locale = clientSettingsLocaleExists &&\r\n (\r\n this.clientSettings.locale.language\r\n + \"-\"\r\n + (this.clientSettings.locale.script ? this.clientSettings.locale.script + \"-\" : \"\")\r\n + this.clientSettings.locale.market\r\n ).toLowerCase() || \"\";\r\n this.marketDir = clientData.marketDir && clientData.marketDir.toLocaleLowerCase() || \"\";\r\n\r\n // Determine if we are in Enterprise version or not\r\n this.setIsBlendedEnterprise();\r\n this.setIsMmxWwwContentRequest();\r\n }\r\n\r\n /**\r\n * Initializes the client settings and info from DOM element\r\n */\r\n private initializeFromDom(): void {\r\n\r\n this.setFlights(this.headElement.getAttribute(info));\r\n\r\n const dataClientSettings = this.headElement.getAttribute(clientSettings);\r\n if (!dataClientSettings) {\r\n return;\r\n }\r\n\r\n this.clientSettings = tryParseJson(dataClientSettings);\r\n if (!this.clientSettings) {\r\n return;\r\n }\r\n\r\n this.calculateForwardableParams();\r\n const { pagetype } = this.clientSettings;\r\n\r\n // If clientSettings.pagetype does not exist, try getting from data-pagetype.\r\n // For Peregrine full spa page: pagetype is part of data-client-settings. There is no data-pagetype.\r\n // For Prime/Hybrid, pagetype is outside of data-client-settings and it belongs to data-pagetype\r\n if (!pagetype) {\r\n const pageTypeFromSettings = this.headElement.getAttribute(pagetypeSettings);\r\n this.clientSettings.pagetype = pageTypeFromSettings == null ? undefined : pageTypeFromSettings;\r\n }\r\n\r\n // try to get the previously store page version from local storage for this page type,\r\n // and store back the current version\r\n if (pagetype) {\r\n try {\r\n const storedVersions = getLocalStorage().getObject(CoreLocalStorageKeys.pageVersions) || {};\r\n this.lastKnownAppVersion = storedVersions[pagetype];\r\n\r\n // update the dictionary with the new value if different, and store it back to local storage\r\n const { bundleInfo: currentDomVersion } = this.clientSettings;\r\n if (currentDomVersion && this.lastKnownAppVersion !== currentDomVersion.v) {\r\n storedVersions[pagetype] = currentDomVersion.v;\r\n getLocalStorage().setObject(CoreLocalStorageKeys.pageVersions, storedVersions);\r\n }\r\n } catch {\r\n logger.log(`${this.logPrefix()} couldn't complete local storage related operation.`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Initializes headData client settings and info from the value found in storage\r\n * and if none is found, falls back to using the DOM element\r\n */\r\n private initializeFromStorage(): void {\r\n const currentPageStoredHeadData = this.storedHeadData;\r\n\r\n if (currentPageStoredHeadData) {\r\n this.populateFromApiResponse(currentPageStoredHeadData);\r\n }\r\n }\r\n\r\n /**\r\n * Populates fields based on a HeadData API response.\r\n * @param response The response to populate from.\r\n */\r\n private populateFromApiResponse(response: HeadDataResponse) {\r\n if (!response) {\r\n return;\r\n }\r\n\r\n const responseClientSettings = response.clientSettings;\r\n const responseFlights = response.info;\r\n\r\n // The stored head data is corrupt, bail\r\n if (!responseClientSettings || !responseFlights) {\r\n return;\r\n }\r\n\r\n // If DOM page gen time is later than response page gen time, bail. We don't want to load stale head data from storage.\r\n if (this.clientSettings.pageGenTime >= responseClientSettings.pageGenTime) {\r\n // Purge obsolete stored head data.\r\n this.storedHeadData = null;\r\n return;\r\n }\r\n\r\n // Hold on to the current DOM queryparams as we will need to override\r\n // what we get from what is in storage\r\n const domQueryParams = this.clientSettings.queryparams;\r\n\r\n // save the current version if available in a temp variable so we can\r\n // restore it back after updating the clientSettings object with the one from\r\n // storage (which came from head data API, which does not contain the version info\r\n // by design, because version is tied with the static bundles, which should represent the currently\r\n // loaded page.\r\n const currentPageVersion = this.clientSettings && this.clientSettings.bundleInfo && this.clientSettings.bundleInfo.v;\r\n this.clientSettings = responseClientSettings;\r\n\r\n // restore the version after the object update\r\n this.clientSettings.bundleInfo = Object.assign(this.clientSettings.bundleInfo || {}, { v: currentPageVersion });\r\n\r\n // restore the queryParams base on what is found in DOM\r\n // as we want the DOM value to be what is used\r\n // and not what is found in storage for this field\r\n // We want these to stay true to what PCS generated for the page\r\n // and avoid desync when reading what comes from future headData API calls.\r\n this.clientSettings.queryparams = domQueryParams;\r\n this.calculateForwardableParams();\r\n\r\n this.setFlights(responseFlights);\r\n }\r\n\r\n /**\r\n * Initializes the queryparams from parameters\r\n */\r\n private calculateForwardableParams() {\r\n const params = this.clientSettings ? this.clientSettings.queryparams : \"\";\r\n if (!params) {\r\n return;\r\n }\r\n const forwardableParams = [\"fdhead\", \"item\"];\r\n const lowerCaseParams = params.toLocaleLowerCase();\r\n const availableParams = forwardableParams.map((key) => {\r\n const paramValue = UrlUtility.getQueryParameterByName(key, lowerCaseParams);\r\n if (!paramValue) {\r\n return null;\r\n }\r\n return `${key}=${encodeURIComponent(paramValue)}`;\r\n }).filter(x => x);\r\n this.clientSettings.forwardablequeryparams = availableParams.join(\"&\");\r\n }\r\n\r\n /**\r\n * Initializes the \"newRidNeeded\" value based on the page generation time and last used activity ID timestamp.\r\n * Updates the stored \"last used activity ID\"\r\n */\r\n private initializeLastUsedActivityId() {\r\n // Read the \"last used activity ID\"\r\n const lastUsedAid = this.lastUsedActivityId;\r\n\r\n // The activity ID that the page is currently planning on using. This may have been embedded or it may have been loaded up from stored head data.\r\n const currentAid = this.clientSettings.aid;\r\n const pageGenTimeDate: Date = parseISO(this.clientSettings.pageGenTime);\r\n const pageGenTimestamp: number = pageGenTimeDate.getTime();\r\n\r\n // Three conditions need to be met to generate a new RID\r\n // 1) The user has stored a previously used activity ID\r\n // 2) We have a valid page generation timestamp from PCS. PCS embeds pageGenTimestamp in the client settings to tell us\r\n // when it ran and generated the page. This will not be the case for localhost requests because they do not use PCS and instead\r\n // use a static App.html file. For localhost we do not need to generate a new RID.\r\n // 3) The current ActivityId matches the previously used one\r\n this.newRidNeeded = !!(lastUsedAid && pageGenTimestamp && lastUsedAid.id === currentAid);\r\n\r\n // If we have a proper timestamp and it's more recent than the last stored one\r\n if (pageGenTimestamp && (!lastUsedAid || pageGenTimestamp > lastUsedAid.ts)) {\r\n // Store the current activity ID as last used.\r\n this.lastUsedActivityId = { id: currentAid, ts: pageGenTimestamp };\r\n }\r\n }\r\n\r\n /**\r\n * Parses flights from provided string (if in proper format of f:{flights})\r\n * and sets it to the headData object\r\n */\r\n private setFlights(flightString: string): void {\r\n // The comma separated list of flights enabled in current request\r\n this.currentFlights = ((/f:\\s*([^;]+)/i.exec(flightString) || {})[1] || \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Determines if we are in the blended Enterprise version based on clientSettings and currentFlights\r\n */\r\n private setIsBlendedEnterprise(): void {\r\n // We know we are in the Enterprise version of the page when both the audience mode is set to Enterprise\r\n // & the browser is edgeChromium, version >= 87\r\n this.IsBlendedEnterprise = this.clientSettings &&\r\n this.clientSettings.audienceMode === AudienceModeType.Enterprise &&\r\n this.clientSettings.browser &&\r\n this.clientSettings.browser.browserType === BrowserType.EdgeChromium &&\r\n parseInt(this.clientSettings.browser.version as string) >= eNtpChromiumVersion;\r\n }\r\n\r\n /**\r\n * Determines if we are in Www content version based on clientSettings and currentFlights\r\n */\r\n private setIsMmxWwwContentRequest(): void {\r\n this.isMmxWwwContentRequest = this.currentFlights && this.currentFlights.includes(MmxWwwContentFlightId);\r\n }\r\n\r\n /**\r\n * Read query items to determine the headdata variable values.\r\n */\r\n private setQueryItemProvidedValues(): void {\r\n // This only finds multiples of item=key:value qsp. If keys are the same, first given will be used (similar to UrlSearchParamsHelper).\r\n const queryItems = UrlUtility.getParamsWithItems(getLocationSearch());\r\n const cmsItem = queryItems.find(item => item.key === \"cms\");\r\n this.enableCMSPPEConfigs = (cmsItem && cmsItem.value === \"ppe\");\r\n\r\n // Test override to add flights for scope purposes\r\n this.setCurrentFlightsTestOverride(queryItems);\r\n }\r\n\r\n /**\r\n * Overrides currentFlights when hostname is localhost. Used for testing.\r\n */\r\n private setCurrentFlightsTestOverride(queryItems: KeyValueArray): void {\r\n if (getLocationHostname().toLowerCase().includes(\"localhost\") && queryItems) {\r\n const flights = queryItems.find(item => item.key === \"flights\");\r\n if (flights) {\r\n this.currentFlights = flights.value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the local storage key for the head data.\r\n */\r\n private getStoredActivityIdKey(): string {\r\n return \"sai_\" + this.clientSettings.pagetype;\r\n }\r\n\r\n /**\r\n * Prefix for headdata logs. Server side add the head and html elements.\r\n * @returns the prefix string for logger message.\r\n */\r\n private logPrefix(): string {\r\n // Request Id is only available on server side.\r\n return `HeadData:${(canUseDOM() ? \"\" : ` [Head:${this.headElement}] and [Html:${this.htmlElement}]`)}`;\r\n }\r\n\r\n /**\r\n * Updates AppError property bag with document visibility and adds event listener for visibility change\r\n */\r\n private logDocumentVisibility(): void {\r\n if (!canUseDOM()) {\r\n return;\r\n }\r\n\r\n updateAppErrorsPropertyBag({ isVisible: document.visibilityState === \"visible\" });\r\n\r\n document.addEventListener(\"visibilitychange\", () => {\r\n updateAppErrorsPropertyBag({ isVisible: document.visibilityState === \"visible\" });\r\n });\r\n }\r\n}\r\n\r\nexport const getHeadData = HeadData.getInstance;\r\n\r\n// headData can be reinitialized through resetHeadData.\r\nexport let headData = HeadData.getInstance();\r\n\r\n/**\r\n * Export function to reset headData based on WebClientData\r\n */\r\nexport const resetHeadData = HeadData.resetInstance;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nconst pageTimings = canUseDOM() ? (window._pageTimings || (window._pageTimings = {})) : {};\r\nconst secondaryPageTimings = canUseDOM() ? (window._secondaryPageTimings || (window._secondaryPageTimings = {})) : {};\r\n\r\n/**\r\n * Gets current window._pageTimings object\r\n */\r\nexport function getPageTimings(): object {\r\n return pageTimings;\r\n}\r\n\r\n/**\r\n * Gets current window._secondaryPageTimings object\r\n */\r\nexport function getSecondaryPageTimings(): object {\r\n return secondaryPageTimings;\r\n}\r\n\r\n/**\r\n * Creates or updates a new counter under the page timings\r\n * @param counterName - the name of the counter to increment.\r\n */\r\nexport function incrementCounter(counterName: string): void {\r\n if (counterName && pageTimings) {\r\n const existingCount = pageTimings[counterName] || (pageTimings[counterName] = 0);\r\n pageTimings[counterName] = existingCount + 1;\r\n }\r\n}\r\n\r\n/**\r\n * Reset pageTimings object\r\n */\r\nexport function resetPageTimings(): void {\r\n Object.keys(pageTimings).forEach(key => delete pageTimings[key]);\r\n Object.keys(secondaryPageTimings).forEach(key => delete secondaryPageTimings[key]);\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ExceptionCallingAuthenticatorApi, logException } from \"@msnews/diagnostics\";\r\nimport { IWidgetAuthenticator, IWidgetInstance, widgetApiVersion } from \"@msnews/core\";\r\n\r\n/**\r\n * Returns the account type of the user ie. \"consumers\" or \"organizations\"\r\n * @param widgetInstance The current widget's instance\r\n */\r\nexport async function getWindowsWidgetAccountType(widgetInstance: IWidgetInstance): Promise {\r\n if (!widgetInstance) {\r\n return null;\r\n }\r\n\r\n try {\r\n const authenticatorApi = widgetInstance.tryGetApi(\"authenticator\", widgetApiVersion, widgetApiVersion);\r\n const accountType = await authenticatorApi.getProperty(\"ProviderAuthority\");\r\n return accountType;\r\n } catch (error) {\r\n logException(error, ExceptionCallingAuthenticatorApi, \"Exception fetching ProviderAuthority\", JSON.stringify(error));\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetches Windows Widget token for requested params\r\n * @param widgetInstance The current widget's instance\r\n * @param clientId The client id of the AAD application requesting access\r\n * @param scope The scope to request access for\r\n * @param resource The resource to request access for\r\n * @param apiVersion\r\n */\r\nexport async function getWindowsWidgetToken(widgetInstance: IWidgetInstance, clientId: string, scope: string, resource: string, apiVersion = \"\"): Promise {\r\n if (!widgetInstance) {\r\n return null;\r\n }\r\n\r\n try {\r\n const authenticatorApi = widgetInstance.tryGetApi(\"authenticator\", widgetApiVersion, widgetApiVersion);\r\n const token = await authenticatorApi.getToken(clientId, scope, resource, apiVersion);\r\n return token;\r\n } catch (error) {\r\n logException(error, ExceptionCallingAuthenticatorApi, \"Exception calling GetToken\", JSON.stringify(error));\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetches MUID from Windows\r\n * @param widgetInstance The current widget's instance\r\n * @returns MUID value\r\n */\r\nexport async function getWindowsWidgetMuid(widgetInstance: IWidgetInstance): Promise {\r\n if (!widgetInstance) {\r\n return null;\r\n }\r\n\r\n try {\r\n const authenticatorApi = widgetInstance.tryGetApi(\"authenticator\", widgetApiVersion, widgetApiVersion);\r\n const muid = await authenticatorApi.getProperty(\"MUID\");\r\n return muid;\r\n } catch (error) {\r\n logException(error, ExceptionCallingAuthenticatorApi, \"Exception fetching MUID\", JSON.stringify(error));\r\n return null;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Imported from Windows team\r\n// https://microsoft.visualstudio.com/Universal%20Store/_git/MEE.Shell.Dashboard?path=%2Fsrc%2FApp%2FClientApp%2Fapp%2FwidgetRuntime%2Fapis%2Fapi.interfaces.ts&_a=contents&version=GBmaster\r\n// All \"public\" types visible to widgets\r\n// TODO: Import from npm once available as package\r\n\r\n// API names\r\nexport type ApiName =\r\n \"settings\" // IWidgetSettings\r\n | \"status\" // IWidgetStatus\r\n | \"visibility\" // IWidgetVisibility\r\n | \"authenticator\" // IWidgetAuthenticator\r\n | \"lifecycle\" // IWidgetLifecycle\r\n | \"properties\" // IWidgetProperties\r\n | \"sizes\"; // IWidgetSize\r\n\r\n// Global version of this set of api contracts, use this in the target version of all tryGetApi requests\r\nexport const widgetApiVersion = 1;\r\nexport interface IWidgetStatus {\r\n showLastUpdated(date: Date): void;\r\n hideLastUpdated(): void;\r\n}\r\n\r\nexport type WidgetSettingsEvent =\r\n \"onShowSettingsStart\" // Widgets is starting the show settings experience\r\n | \"onShowSettingsEnd\" // Widgets show settings experience completed\r\n | \"onHideSettingsStart\" // Widgets is starting the hide settings experience\r\n | \"onHideSettingsEnd\"; // Widgets hide settings experience completed\r\n\r\nexport interface IWidgetSettings {\r\n showSettings(): void;\r\n hideSettings(): void;\r\n\r\n addEventListener(listener: (eventName: WidgetSettingsEvent) => void): void;\r\n removeEventListener(listener: (eventName: WidgetSettingsEvent) => void): void;\r\n}\r\n\r\nexport interface IWidgetAuthenticator {\r\n // Props available are values such as:\r\n // AccountId, UPN, DisplayName, OID, Authority, FirstName, LastName, MUID, ProviderAuthority (i.e. \"consumers\"|\"organizations\")\r\n getProperty(name: string): Promise;\r\n getToken(clientId: string, scope: string, resource: string, apiVersion: string): Promise;\r\n}\r\n\r\nexport type WidgetVisibilityEvent =\r\n \"visible\" // The widget has become visible in the viewport\r\n | \"notvisible\"; // The widget was visible and is now not visible in the viewport.\r\n\r\nexport interface IWidgetVisibility {\r\n addEventListener(listener: (eventName: WidgetVisibilityEvent) => void): void;\r\n removeEventListener(listener: (eventName: WidgetVisibilityEvent) => void): void;\r\n\r\n isVisible(): boolean;\r\n}\r\n\r\nexport type WidgetLifecycleEvent = \"removing\"; // The widget is about to be removed from the users widget grid.\r\n\r\nexport interface IWidgetLifecycle {\r\n addEventListener(listener: (eventName: WidgetLifecycleEvent) => Promise): void;\r\n removeEventListener(listener: (eventName: WidgetLifecycleEvent) => Promise): void;\r\n}\r\n\r\nexport type WidgetProperty =\r\n \"sessionId\" // string: unique id changed for each user session\r\n | \"title\" // string: displayed in upper left corner of widget attribution area\r\n | \"attribution\" // string: \"Powered By\" statement\r\n | \"hostVersion\" // string: host version\r\n | \"animationsEnabled\" // boolean: Settings->Display->Show Animations on Windows\r\n | \"advancedEffectsEnabled\" // boolean: Settings->Display->Show transparency on Windows\r\n | \"autohideScrollbars\" // boolean: Settings->Display->auto hide scrollbars\r\n | \"colorMode\" // string: light | dark\r\n | \"accentColor\" // string: six digit hex \"0a0a0a\"\r\n | \"region\" // string: Two digit ISO 3166-2 Windows region code\r\n | \"activationUrl\" // string: URI to activate when widget attribution area is clicked\r\n | \"displayLocale\" // string: Full Windows display locale\r\n | \"accentColorRamp\";\r\n\r\nexport interface IWidgetProperties {\r\n title: string; // Settable by the widget to dynamically alter the widget title.\r\n attribution: string; // Settable by the widget for the \"Powered by\" statement.\r\n activationUrl: string | null; // Settable by the widget for activation link\r\n\r\n getProperty(name: WidgetProperty): any;\r\n\r\n addPropertyChangeListener(listener: (name: WidgetProperty) => void): void;\r\n removePropertyChangeListener(listener: (name: WidgetProperty) => void): void;\r\n}\r\n\r\nexport type WidgetSizeEvent = \"onSizeChangeStart\" | \"onSizeChangeEnd\";\r\nexport type WidgetSize = \"large\" | \"medium\" | \"small\";\r\n\r\nexport interface IWidgetSize {\r\n getSize(): WidgetSize;\r\n\r\n addEventListener(listener: (eventName: WidgetSizeEvent, size: WidgetSize) => void): void;\r\n removeEventListener(listener: (eventName: WidgetSizeEvent) => void): void;\r\n}\r\n\r\nexport interface IWidgetInstance {\r\n readonly widgetId: string;\r\n readonly instanceId: number;\r\n\r\n // When calling this method, specify both minVersion and targetVersion to be \"widgetApiVersion\"\r\n // minVersion may be specified to be an earlier version if there is a behavior\r\n // dependency that is known and supported on the api object requested.\r\n tryGetApi(apiName: ApiName, minVersion: number, targetVersion: number): T | null;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n ITrackInfo,\r\n IWidgetInstance,\r\n KeyValueArray,\r\n KeyValuePair,\r\n UrlSearchParamsHelper,\r\n Utility,\r\n clientId,\r\n getAppEnvironment,\r\n getHeadData,\r\n getMuidCookie,\r\n oneServiceFriendlyName,\r\n oneServiceHeaders,\r\n oneServiceQueryStringKeys,\r\n oneServiceScope,\r\n setMuidCookie,\r\n winWidClientIdAad,\r\n winWidClientIdMsa,\r\n winWidResourceAad,\r\n winWidResourceMsa,\r\n winWidScopeAad,\r\n winWidScopeMsa\r\n} from \"@msnews/core\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getAadData, getWindowsWidgetMuid, getWindowsWidgetToken, isGccModUser, isUserSignedIn, useEnterpriseCompliance } from \"@msnews/auth\";\r\nimport { canUseDOM, getRequestData } from \"@msnews/isomorphic-util\";\r\n\r\nimport { AudienceModeType } from \"@msnews/experiences-constants\";\r\nimport { isString } from \"lodash-es\";\r\n\r\n/**\r\n * A namespace that provides OneService utility functionality\r\n */\r\nexport namespace OneServiceUtility {\r\n\r\n /**\r\n * Authentication ticket type - Header value required by back-end service\r\n * Specifies what type of authentication to do\r\n */\r\n export const authenticationTicketType = \"10\";\r\n\r\n /**\r\n * Header name that holds which ANON cookie to use\r\n */\r\n export const signedInCookieNameHeader = \"signedInCookieName\";\r\n\r\n /**\r\n * Header name that holds the user-location value.\r\n */\r\n export const userLocationHeader = \"user-location\";\r\n\r\n /**\r\n * MUID returned from Windows api.\r\n */\r\n let windowsMuid: string;\r\n\r\n /**\r\n * Executes a callback on completing of a service request\r\n *\r\n * @param {() => Promise} serviceRequest - The service request\r\n * @param {() => void} callbackMethod - The callback method\r\n * @return {Promise} - A promise of the service response\r\n */\r\n export async function serviceRequestOnComplete(serviceRequest: () => Promise, callbackMethod: () => void): Promise {\r\n try {\r\n const result = await serviceRequest();\r\n callbackMethod();\r\n\r\n return result;\r\n } catch (error) {\r\n callbackMethod();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Gets common parameters used in service requests to OneService, when there is no personalization involved\r\n * @param {string} userId - The user id for the request\r\n * @param {string} ocidSpecifier - The OCID\r\n * @param {string} addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n * @param {string} flightData - Additional flight ExPs to send to OneService. e.g. to tell OneService to return Bing Image urls.\r\n * NOTE: make sure WW uses the same\r\n * @param {boolean} useEntCompliance - Should we use enterprise compliant params.\r\n * @returns {KeyValueArray}\r\n */\r\n export function getOneServiceParamsWithoutAuth(\r\n userId: string = null,\r\n ocidSpecifier: string,\r\n addPageInfoToOcid = true,\r\n flightData: string = null,\r\n overwriteFlightData = false,\r\n useEntCompliance = useEnterpriseCompliance()): KeyValueArray {\r\n const appEnvironment = getAppEnvironment();\r\n const params = [\r\n {\r\n key: oneServiceQueryStringKeys.apiKey,\r\n value: appEnvironment.OneServiceApiKey\r\n },\r\n {\r\n // TODO Bug 22266910: clarify use of activityId vs rid in this spot\r\n key: oneServiceQueryStringKeys.activityId,\r\n value: appEnvironment.ActivityId\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.ocid,\r\n value: addPageInfoToOcid ? getOneServiceOCID(appEnvironment.TrackInfo, ocidSpecifier) : ocidSpecifier\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.market,\r\n value: appEnvironment.CurrentMarket\r\n }\r\n ];\r\n\r\n // 21527208 - remove this after upgrading experiences to use shared lib.\r\n if (userId) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.user,\r\n value: userId\r\n });\r\n }\r\n\r\n let runningExperiments = getHeadData().CurrentFlights;\r\n if (flightData) {\r\n runningExperiments = !runningExperiments ? flightData : `${runningExperiments},${flightData}`;\r\n\r\n const bingImageResizerFlight = \"prg-bngimg-t\";\r\n if (runningExperiments.indexOf(bingImageResizerFlight) === -1) {\r\n runningExperiments += \",\" + bingImageResizerFlight;\r\n }\r\n\r\n if (overwriteFlightData === true) {\r\n runningExperiments = flightData; // Overwrites when flag is on.\r\n }\r\n }\r\n if (runningExperiments) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.fdhead,\r\n value: runningExperiments\r\n });\r\n }\r\n\r\n if (useEntCompliance) {\r\n params.push({\r\n key: aadTokenQsKey,\r\n value: aadTokenQsVal\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Returns the params which are static in nature and don't change.\r\n * @param ocidSpecifier - The OCID\r\n * @param addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n */\r\n export function getOneServiceNonDynamicParamsWithoutAuth(ocidSpecifier: string, addPageInfoToOcid = true): KeyValueArray {\r\n const appEnvironment = getAppEnvironment();\r\n const params = [\r\n {\r\n key: oneServiceQueryStringKeys.apiKey,\r\n value: appEnvironment.OneServiceApiKey\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.ocid,\r\n value: addPageInfoToOcid ? getOneServiceOCID(appEnvironment.TrackInfo, ocidSpecifier) : ocidSpecifier\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.market,\r\n value: appEnvironment.CurrentMarket\r\n }\r\n ];\r\n\r\n if (useEnterpriseCompliance()) {\r\n params.push({\r\n key: aadTokenQsKey,\r\n value: aadTokenQsVal\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Gets common parameters used in service requests to OneService,\r\n * plus authentication params in the form of the sign in cookie name\r\n * Note: This should only be called if the user is known to be signed in, else use getOneServiceParamsWithoutAuth\r\n *\r\n * @export\r\n * @param {string} userId - The user id for the request\r\n * @param {string} ocidSpecifier - The OCID\r\n * @param {string} addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n * @param {string} flightData - Additional flight ExPs to send to OneService. e.g. to tell OneService to return Bing Image urls.\r\n * @returns {KeyValueArray}\r\n */\r\n export function getOneServiceParamsWithAuth(userId: string = null, ocidSpecifier: string, addPageInfoToOcid = true,\r\n flightData: string = null, overwriteFlightData = false): KeyValueArray {\r\n const appEnvironment = getAppEnvironment();\r\n const authCookieName: string = appEnvironment.AuthCookieName as string;\r\n const params = [...getOneServiceParamsWithoutAuth(userId, ocidSpecifier, addPageInfoToOcid, flightData, overwriteFlightData)];\r\n if (authCookieName) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.signInCookieName, // sign-in cookie name\r\n value: authCookieName.toUpperCase()\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Gets common headers used in service requests to OneService\r\n * @returns The headers to use on the OneService call.\r\n */\r\n export async function getOneServiceHeaders(useEntCompliance = useEnterpriseCompliance()): Promise> {\r\n const headers: Record = {};\r\n\r\n if (useEntCompliance && !await isGccModUser()) {\r\n const aadData = await getAadData(clientId, oneServiceScope, oneServiceFriendlyName);\r\n if (aadData && aadData.token) {\r\n headers[oneServiceHeaders.authorization] = `Bearer ${aadData.token}`;\r\n }\r\n }\r\n\r\n // For SSR, pass cookies and referer from the original request to the OneService request\r\n // Both cookie and referer will use for feed call to evaluate the sign-in status and get the personalized river.\r\n if (!canUseDOM()) {\r\n const cookieString = getRequestData().cookie;\r\n if (cookieString) {\r\n headers.Cookie = cookieString;\r\n }\r\n const refererString = getRequestData().referer;\r\n if (refererString) {\r\n headers.Referer = refererString;\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gets common headers used in service requests to OneService in Windows Widget\r\n * @param widgetInstance Instance of widget\r\n * @param useAadHeaders Indicates whether AAD headers should be added for an AAD user\r\n * @returns The headers to use on the OneService call.\r\n */\r\n export async function getWinWidgetOneServiceHeaders(widgetInstance: IWidgetInstance, useAadHeaders = false): Promise> {\r\n const appEnvironment = getAppEnvironment();\r\n const audienceMode = appEnvironment?.CurrentRequestTargetScope?.audienceMode;\r\n const isAadUser = audienceMode === AudienceModeType.Enterprise;\r\n\r\n const headers: Record = {};\r\n\r\n if (!widgetInstance) {\r\n return headers;\r\n }\r\n\r\n let authToken: string | undefined;\r\n\r\n const widgetTokenPromise = getWindowsWidgetToken(\r\n widgetInstance,\r\n isAadUser ? winWidClientIdAad : winWidClientIdMsa,\r\n isAadUser ? winWidScopeAad : winWidScopeMsa,\r\n isAadUser ? winWidResourceAad : winWidResourceMsa\r\n );\r\n\r\n if (windowsMuid) {\r\n authToken = await widgetTokenPromise;\r\n } else {\r\n [authToken, windowsMuid] = await Promise.all([widgetTokenPromise, getWindowsWidgetMuid(widgetInstance)]);\r\n }\r\n\r\n if (authToken) {\r\n // AAD\r\n if (isAadUser && useAadHeaders) {\r\n headers[oneServiceHeaders.entAuthorization] = authToken;\r\n }\r\n\r\n // MSA\r\n if (!isAadUser) {\r\n headers[oneServiceHeaders.rpsToken] = authToken;\r\n }\r\n }\r\n\r\n const muidCookie = getMuidCookie();\r\n if (windowsMuid) {\r\n headers[oneServiceHeaders.muid] = windowsMuid;\r\n if (windowsMuid !== muidCookie) {\r\n // Sync the cookie with MUID from Windows\r\n setMuidCookie(windowsMuid);\r\n }\r\n } else if (muidCookie) {\r\n headers[oneServiceHeaders.muid] = muidCookie;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gets headers specifically used in service requests to OneService /feed endpoint\r\n * @export\r\n * @returns The headers to use for the call.\r\n */\r\n export async function getOneServiceFeedCallHeaders(useEntCompliance?: boolean): Promise> {\r\n const headers = await getOneServiceHeaders(useEntCompliance);\r\n const appEnvironment = getAppEnvironment();\r\n const activityId = appEnvironment.ActivityId;\r\n\r\n if (appEnvironment.SendFeedCallActivityIdInHeader && activityId) {\r\n headers[oneServiceHeaders.activityId] = activityId;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gets the location query string parameters based on lat/long from paramaters or AppEnvironment.\r\n * @param customizedLatitude The customized latitude\r\n * @param customizedLongitude The customized Longitude\r\n * @returns The key value pair of location query string parameters.\r\n */\r\n export function getLocationParams(customizedLatitude?: string, customizedLongitude?: string): KeyValuePair {\r\n const appEnvironment = getAppEnvironment();\r\n const latitude = customizedLatitude || appEnvironment.Latitude;\r\n const longitude = customizedLongitude || appEnvironment.Longitude;\r\n\r\n if (latitude && longitude) {\r\n return { key: oneServiceQueryStringKeys.location, value: `${latitude}|${longitude}` };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the OCID generated from the telemetry TrackInfo if it is valid, otherwise returns the ocid specifier\r\n * @param trackInfo The track info\r\n * @param ocidSpecifier The OCID\r\n * @returns The OCID to use.\r\n */\r\n export function getOneServiceOCID(trackInfo: ITrackInfo, ocidSpecifier: string): string {\r\n if (Utility.isNonNullObject(trackInfo) &&\r\n Utility.isNonNullObject(trackInfo.sitePage) &&\r\n isString(trackInfo.sitePage.page_product) &&\r\n isString(trackInfo.sitePage.page_type)) {\r\n return trackInfo.sitePage.page_product + \"-\" + trackInfo.sitePage.page_type + (ocidSpecifier ? \"-\" + ocidSpecifier : \"\");\r\n } else {\r\n return ocidSpecifier;\r\n }\r\n }\r\n\r\n /**\r\n * Sets up base request data for One Service calls\r\n * @param method\r\n * @returns - RequestInit\r\n */\r\n export async function getBaseRequestData(method): Promise {\r\n const requestObj: RequestInit = {\r\n headers: await OneServiceUtility.getOneServiceHeaders(),\r\n method\r\n };\r\n\r\n return requestObj;\r\n }\r\n\r\n /**\r\n * Prefer to use 'getCommonParams2'\r\n * Populates the request init and return commonParams\r\n * @param ocid -- the ocid for this request\r\n * @param {boolean} addBingImageExP - If true, adds the fdhead to ExP list that tells OneService to return Bing Image urls . Defaults to false\r\n * @returns {KeyValueArray} - parameters as a key/value array\r\n */\r\n export function getCommonParams(ocid: string, addBingImageExP = false): KeyValueArray {\r\n // TODO: this is buggy, UserIsSignedIn always undefined for Peregrine experience\r\n // so all calls flow to 'getOneServiceParamsWithoutAuth'\r\n // need an effort to clean up these usage\r\n // need to verify the difference between sign-in & non-sign-in\r\n if (getHeadData().UserIsSignedIn) {\r\n return this.getOneServiceParamsWithAuth(getAppEnvironment().UserId, ocid, addBingImageExP);\r\n }\r\n\r\n return this.getOneServiceParamsWithoutAuth(getAppEnvironment().UserId, ocid, addBingImageExP);\r\n }\r\n\r\n /**\r\n * Populates the request init and return commonParams\r\n * @param ocid -- the ocid for this request\r\n * @param {string} addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n * @param {boolean} addBingImageExP - If true, adds the fdhead to ExP list that tells OneService to return Bing Image urls . Defaults to false\r\n * @returns {KeyValueArray} - parameters as a key/value array\r\n */\r\n export function getCommonParams2(ocid: string, addPageInfoToOcid = true, addBingImageExP = false): KeyValueArray {\r\n if (isUserSignedIn()) {\r\n return this.getOneServiceParamsWithAuth(getAppEnvironment().UserId, ocid, addPageInfoToOcid, addBingImageExP);\r\n }\r\n\r\n return this.getOneServiceParamsWithoutAuth(getAppEnvironment().UserId, ocid, addPageInfoToOcid, addBingImageExP);\r\n }\r\n\r\n /**\r\n * Get whether a given url has an ocid query param\r\n * @param url url to check for ocid query param\r\n * @returns boolean indicating whether the given url has an ocid query param\r\n */\r\n export function urlContainsOcidParam(url: string): boolean {\r\n if (!url) {\r\n return false;\r\n }\r\n\r\n const split = url.split(\"?\");\r\n\r\n if (split.length < 2) {\r\n return false;\r\n }\r\n\r\n const searchString = split[1].split(\"#\")[0];\r\n const queryParms = new UrlSearchParamsHelper(searchString);\r\n return !!queryParms.get(\"ocid\");\r\n }\r\n\r\n /**\r\n * Remove ocid param from a url\r\n * @param url url to remove query param from\r\n * @returns new url without an ocid query param\r\n */\r\n export function removeOcidFromUrl(url: string): string {\r\n if (!url) {\r\n return url;\r\n }\r\n\r\n const split = url.split(\"?\");\r\n\r\n if (split.length < 2) {\r\n return url;\r\n }\r\n\r\n // If there is a #, remove everything after.\r\n const searchString = split[1].split(\"#\")[0];\r\n const queryParams = new UrlSearchParamsHelper(searchString);\r\n\r\n if (queryParams.get(\"ocid\")) {\r\n queryParams.delete(\"ocid\");\r\n let result = url.replace(searchString, queryParams.toString());\r\n\r\n if (result.charAt(result.length - 1) === \"?\") {\r\n // remove question mark if it's the last character\r\n result = result.substring(0, result.length - 1);\r\n }\r\n\r\n return result;\r\n } else {\r\n return url;\r\n }\r\n }\r\n\r\n /**\r\n * Remove ocid's from card urls, so telemetry can append a specified ocid\r\n * @param response - reponse from OneService for River\r\n * @returns the given reponse with ocid query params removed from each card's destination url\r\n */\r\n export function removeOcidFromRiverCardProviderResponse(response: any) {\r\n if (!response || !response.cardMetadata || !response.cardMetadata.length) {\r\n return;\r\n }\r\n\r\n response.cardMetadata.forEach((card) => {\r\n if (card.cardContent && card.cardContent.destinationUrl) {\r\n card.cardContent.destinationUrl = OneServiceUtility.removeOcidFromUrl(card.cardContent.destinationUrl);\r\n } else if (card.subItems && card.subItems.length) {\r\n card.subItems.forEach(subItem => {\r\n if (subItem.cardContent && subItem.cardContent.destinationUrl) {\r\n subItem.cardContent.destinationUrl = OneServiceUtility.removeOcidFromUrl(subItem.cardContent.destinationUrl);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove ocid's from card urls, so telemetry can append a specified ocid\r\n * @param response - reponse from OneService for Windows\r\n * @returns the given reponse with ocid query params removed from each card's url\r\n */\r\n export function removeOcidFromWindowsOneServiceResponse(response: any) {\r\n if (!response || !response.cards) {\r\n return;\r\n }\r\n\r\n response.cards.forEach((card) => {\r\n card.subCards.forEach((subCard) => {\r\n if (subCard.url) {\r\n subCard.url = OneServiceUtility.removeOcidFromUrl(subCard.url);\r\n } else if (subCard.subCards) {\r\n subCard.subCards.forEach(subSubCard => {\r\n if (subSubCard.url) {\r\n subSubCard.url = OneServiceUtility.removeOcidFromUrl(subSubCard.url);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { setRequireFunctionalCookie } from \"../utilities/CookieUtility\";\r\nimport { headData } from \"./HeadData\";\r\n\r\n/** Windows Widget client id used for auth token generation (MSA) */\r\nexport const winWidClientIdMsa = \"00000000400F9D16\";\r\n\r\n/** Windows Widget client id used for auth token generation (AAD) */\r\nexport const winWidClientIdAad = \"3a4d129e-7f50-4e0d-a7fd-033add0a29f4\";\r\n\r\n/** Scope for msa/rps token request */\r\nexport const winWidScopeMsa = \"service::www.msn.com::MBI_SSL\";\r\n\r\n/** Scope for aad token request */\r\nexport const winWidScopeAad = \"User.Read Userinfo.ReadWrite\";\r\n\r\n/** MSA/RPS auth token is issued against this resource */\r\nexport const winWidResourceMsa =\"https://www.api.msn.com/\";\r\n\r\n/** AAD auth token is issued against this resource */\r\nexport const winWidResourceAad = \"https://enterprisenews.microsoft.com/\";\r\n\r\n/**\r\n * Sets the MUID cookie\r\n * @param muid MUID value to set\r\n */\r\nexport function setMuidCookie(muid: string): void {\r\n if (muid) {\r\n setRequireFunctionalCookie(\"MUID\", muid, 365, headData?.Locale?.toLowerCase() === \"zh-cn\" ? \".msn.cn\" : \".msn.com\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum ErrorBehavior {\r\n /** This app error can trigger exceptional behavior */\r\n Exceptional,\r\n\r\n /** This app error can trigger fallback behavior */\r\n Fallback\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ExperienceMilestoneEventTypes, MilestonePlugin } from \"./data-model\";\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { ExperienceDeferralInfo } from \"./data-model/ExperienceDeferralInfo\";\r\nimport { ExperienceLoadingState } from \"./data-model/ExperienceLoadingState\";\r\n\r\n/**\r\n * Base arguments for all experience milestone updates\r\n */\r\nexport interface UpdateArgsBase {\r\n /** Experience Type - Defines an experience */\r\n experienceType: string;\r\n\r\n /** Associated Experience Group */\r\n experienceGroup?: string;\r\n\r\n /** Defines an instance of the Experience */\r\n experienceInstance?: string;\r\n}\r\n\r\nexport interface UpdateExperiencePublicStateArgs extends UpdateArgsBase {\r\n /** Current Milestone eventType of the experience e.g loaded, staleRevalidationComplete etc */\r\n eventType: ExperienceMilestoneEventTypes;\r\n}\r\n\r\nexport interface UpdateExperienceCurrentStateArgs extends UpdateArgsBase {\r\n /** Current Milestone of the experience e.g initialized, loaded, deferred etc */\r\n currentState: ExperienceLoadingState;\r\n}\r\n\r\nexport interface UpdateExperienceDeferralArgs extends UpdateArgsBase {\r\n /** Tracks deferral information used by an experience to determine when it should load/render */\r\n deferralInfo: ExperienceDeferralInfo;\r\n}\r\n\r\nexport interface UpdateTimingArgs extends UpdateArgsBase {\r\n /** start time fo the milestone e.g. startTime of loaded milestone */\r\n startTime?: number;\r\n\r\n /** end time fo the milestone e.g. endTime of loaded milestone */\r\n endTime?: number;\r\n}\r\n\r\nexport type UpdateExperienceCurrentStateSignature = (info: Array) => void;\r\n\r\nexport type UpdateExperiencePublicStateSignature = (args: UpdateExperiencePublicStateArgs) => void;\r\n\r\nexport type UpdateExperienceDeferralSignature = (info: Array) => void;\r\n\r\nexport type UpdateTimingSignature = (args: UpdateTimingArgs) => void;\r\n\r\nexport type UpdatePluginSignature = (\r\n /** Plugins to add additional behaviors in page lifecycle events */\r\n plugins: MilestonePlugin[]\r\n) => void;\r\n\r\nexport type UpdatePageTimingSignature = (time?: number) => void;\r\n\r\nexport type UpdatePageRevealStartSignature = (startTimeMs: number, wasHidden: boolean, visuallyReadyDependencies: string[]) => void;\r\n\r\nexport type UpdateBelowTheFoldTransitionSignature = (start?: boolean) => void;\r\n\r\ntype UpdateHydrationCompleteSignature = () => void;\r\n\r\ntype UpdateRiverHydrationCompleteSignature = () => void;\r\n\r\n/**\r\n * Actions for the Milestone Data Connector\r\n * @class\r\n */\r\nexport class MilestoneDataActionsImpl {\r\n\r\n /** Action to trigger hydration timing updates */\r\n public updateHydrationComplete: ActionMap\r\n = new ActionMap(\"updateHydrationRenderComplete\");\r\n\r\n /** Action to trigger River hydration timing updates */\r\n public updateRiverHydrationComplete: ActionMap\r\n = new ActionMap(\"updateRiverHydrationRenderComplete\");\r\n\r\n /** Action to trigger above the fold timing updates */\r\n public updateAboveTheFoldVisuallyReady: ActionMap\r\n = new ActionMap(\"updateAboveTheFoldVisuallyReady\");\r\n\r\n /** Action to trigger below the fold transition updates */\r\n public updateBelowTheFoldTransitionStart: ActionMap\r\n = new ActionMap(\"updateBelowTheFoldTransitionStart\");\r\n\r\n /** Action to trigger when deferring an experience load */\r\n public updateExperienceLoadDeferralState: ActionMap\r\n = new ActionMap(\"updateExperienceLoadDeferralState\");\r\n\r\n /** Action to trigger when updating current state of experience in load/render life-cycle */\r\n public updateExperienceCurrentState: ActionMap\r\n = new ActionMap(\"updateExperienceCurrentState\");\r\n\r\n /** Action to trigger when updating current state of experience through publicly exposed MilestoneExperienceEventTypes */\r\n public updateExperiencePublicState: ActionMap\r\n = new ActionMap(\"updateExperiencePublicState\");\r\n\r\n /** Action to trigger when deferring an experience render */\r\n public updateExperienceRenderDeferralState: ActionMap\r\n = new ActionMap(\"updateExperienceRenderDeferralState\");\r\n\r\n /** Action to trigger when experience load initiates */\r\n public updateInitTiming: ActionMap\r\n = new ActionMap(\"UpdateInitTiming\");\r\n\r\n /** Action to trigger page complete timing updates */\r\n public updatePageComplete: ActionMap\r\n = new ActionMap(\"updatePageCompleteTiming\");\r\n\r\n /** Action to trigger page complete timing updates */\r\n public updatePageRevealStart: ActionMap\r\n = new ActionMap(\"updatePageRevealStart\");\r\n\r\n /** Action to trigger page complete timing updates */\r\n public updatePageRevealComplete: ActionMap\r\n = new ActionMap(\"updatePageRevealComplete\");\r\n\r\n /** Action to trigger when experience instance completed render */\r\n public updateRenderTiming: ActionMap\r\n = new ActionMap(\"UpdateRenderTiming\");\r\n\r\n /** Action to trigger when experience instance is visually ready */\r\n public updateVisuallyReadyTiming: ActionMap\r\n = new ActionMap(\"UpdateVisuallyReadyTiming\");\r\n\r\n /** Action to trigger when experience instance starts loading */\r\n public updateStartLoadingTiming: ActionMap\r\n = new ActionMap(\"UpdateStartLoadingTiming\");\r\n\r\n /** Action to trigger when experience instance is DOM complete */\r\n public updateDomCompleteTiming: ActionMap\r\n = new ActionMap(\"UpdateDomCompleteTiming\");\r\n\r\n /** Action to trigger when adding/updating milestone plugin */\r\n public updateMilestonePlugins: ActionMap\r\n = new ActionMap(\"updateMilestonePlugin\");\r\n\r\n /** Reset the static instance. Useful when server side rendering. */\r\n public resetInstance(): void {\r\n\r\n this.updateHydrationComplete.unregisterObservers();\r\n this.updateRiverHydrationComplete.unregisterObservers();\r\n this.updateAboveTheFoldVisuallyReady.unregisterObservers();\r\n this.updateBelowTheFoldTransitionStart.unregisterObservers();\r\n this.updateExperienceLoadDeferralState.unregisterObservers();\r\n this.updateExperienceCurrentState.unregisterObservers();\r\n this.updateExperiencePublicState.unregisterObservers();\r\n this.updateExperienceRenderDeferralState.unregisterObservers();\r\n this.updateInitTiming.unregisterObservers();\r\n this.updatePageComplete.unregisterObservers();\r\n this.updatePageRevealStart.unregisterObservers();\r\n this.updatePageRevealComplete.unregisterObservers();\r\n this.updateRenderTiming.unregisterObservers();\r\n this.updateVisuallyReadyTiming.unregisterObservers();\r\n this.updateDomCompleteTiming.unregisterObservers();\r\n this.updateMilestonePlugins.unregisterObservers();\r\n\r\n MilestoneDataActions = new MilestoneDataActionsImpl();\r\n }\r\n}\r\n\r\n/** The singleton instance */\r\nexport let MilestoneDataActions = new MilestoneDataActionsImpl();","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Defines valid loading states for an experience\r\n * The state has been defined as it happens. Please do not update the ordering or the numeric value of states.\r\n * If the numeric value of the state is updated this will break internal logic.\r\n */\r\nexport enum ExperienceLoadingState {\r\n\r\n /**\r\n * The experience has not been started yet\r\n */\r\n notStarted = 1,\r\n\r\n /**\r\n * The experience loading has been deferred\r\n */\r\n loadDeferred = 2,\r\n\r\n /**\r\n * The experience is coming out of loadDeferred state and is now resolved to be loaded.\r\n */\r\n resolvedForLoad = 3,\r\n\r\n /**\r\n * The experience has been loaded (i.e. the bundle has been downloaded and parsed, and the connector created)\r\n */\r\n loaded = 4,\r\n\r\n /**\r\n * The experience initialized milestone has been reached\r\n */\r\n initialized = 5,\r\n\r\n /**\r\n * The experience render has been deferred\r\n */\r\n renderDeferred = 6,\r\n\r\n /**\r\n * The experience is coming out of renderDeferred state and is now resolved to be rendered.\r\n */\r\n resolvedForRender = 7,\r\n\r\n /**\r\n * The experience rendered milestone has been reached (render function has been completed)\r\n */\r\n rendered = 8,\r\n\r\n /**\r\n * The experience DOM complete milestone has been reached\r\n */\r\n domComplete = 10,\r\n\r\n /**\r\n * The initial render of the experience has completed. All initial DOM elements have been created, and the browser has completed all render\r\n * task (applying styles, animations, etc)\r\n */\r\n visuallyReady = 11,\r\n\r\n /**\r\n * The experience encountered an error during loading\r\n */\r\n error = 12,\r\n\r\n /**\r\n * The experience has completed the revalidation of stale state.\r\n */\r\n staleRevalidationComplete = 13,\r\n\r\n /**\r\n * The experience starts loading\r\n */\r\n startLoading = 14,\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Captures time elapsed since browser start\r\n */\r\nexport const fromBrowserStart = \"E2E\";\r\n\r\n/**\r\n * Time To Functional\r\n */\r\nexport const timeToFunctional = \"TTF\";\r\n\r\n/**\r\n * Time To Page Visible\r\n */\r\nexport const timeToPageVisible = \"TTPV\";\r\n\r\n/**\r\n * Time To Visually Ready\r\n */\r\nexport const timeToVisuallyReady = \"TTVR\";\r\n\r\n/**\r\n * Time To Video Start\r\n */\r\nexport const timeToVideoStart = \"TTVS\";\r\n\r\n/**\r\n * pageTiming cacheKey for html cached state\r\n */\r\nexport const htmlCachedKey = \"htmlCached\";\r\n\r\n/**\r\n * Page reveal start performance marker\r\n */\r\nexport const pageRevealStartMarker = \"pageRevealStart\";\r\n\r\n/**\r\n * Page reveal complete performance marker\r\n */\r\nexport const pageRevealCompleteMarker = \"pageRevealComplete\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, WebWorkerErrors, logger, stringifyError, tryGetPerfTimeline, getAppErrorsPropertyBag } from \"@msnews/diagnostics\";\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\ndeclare global {\r\n /** Adding webWorker to Window */\r\n interface Window {\r\n /** Global flag indicating if web worker is present */\r\n _isWebWorkerPresent: boolean;\r\n\r\n /** Web worker instance */\r\n webWorker?: Worker;\r\n\r\n /** Web worker runtime errors */\r\n webWorkerErrors?: any[];\r\n\r\n /** Web worker messages */\r\n webWorkerMessages?: any[];\r\n }\r\n}\r\n\r\n/** Web worker request interface. */\r\nexport interface WebWorkerRequest {\r\n /** The message id. */\r\n id: string;\r\n\r\n /** The type of message. */\r\n type?: string;\r\n\r\n /** The additional message payload */\r\n payload?: any;\r\n}\r\n\r\n/** Web worker response interface. */\r\nexport interface WebWorkerResponse {\r\n /** The message id. */\r\n id: string;\r\n\r\n /** The item fetched status. */\r\n fetched: boolean;\r\n\r\n /** The item payload. */\r\n payload: T;\r\n}\r\n\r\n/**\r\n * Reports web worker presence.\r\n *\r\n * **NOTE**: Make sure to update the **_window._isWebWorkerPresent_** flag as well\r\n * while updating this, since the diagnostics lib doesn't have access to the core lib.\r\n */\r\nexport let isWebWorkerPresent: boolean;\r\n\r\n/** Web-worker message-map entry */\r\nexport interface WebWorkerMessageMapEntry {\r\n /** The message type (default is \"data\") */\r\n type: string;\r\n\r\n /** The callback, if any, that receives the data payload for the message */\r\n callback: (data: any) => void;\r\n}\r\n\r\n/** The message map from message id to the WebWorkerMessageMapEntry */\r\nconst messages = new Map();\r\n\r\nlet logAppError: (data: AppError) => void;\r\n\r\n/** The perf timeline for the web-worker interface */\r\nconst perfTimeline = tryGetPerfTimeline(\"WebWorkerUtility\", \"WebWorkerUtility\", true);\r\n\r\n/** Map to save messages that were sent from web worker but were not requested by main thread */\r\nconst standbyMessages = new Map();\r\n\r\n/**\r\n * Initialize isWebWorkerPresent. And this function also serve as test hook.\r\n * @param override - The test override\r\n */\r\nexport function init(override?: boolean): void {\r\n isWebWorkerPresent = false;\r\n if (canUseDOM()) {\r\n isWebWorkerPresent = (typeof override !== \"undefined\" ? override : !!window.webWorker);\r\n window._isWebWorkerPresent = isWebWorkerPresent;\r\n }\r\n\r\n if (!isWebWorkerPresent) {\r\n return;\r\n }\r\n\r\n window.webWorker.onmessage = (event: MessageEvent) => {\r\n const { data: response } = event;\r\n const pendingMessage = messages.get(response.id);\r\n\r\n if (!pendingMessage) {\r\n standbyMessages.set(response.id, response);\r\n return;\r\n }\r\n\r\n if (pendingMessage.type === \"data\") {\r\n messages.delete(response.id);\r\n }\r\n\r\n const callback = pendingMessage.callback;\r\n if (callback) {\r\n callback(response);\r\n }\r\n };\r\n\r\n // Process messages received before main thread initialized\r\n setTimeout(() => {\r\n if (window.webWorkerMessages && Array.isArray(window.webWorkerMessages)) {\r\n window.webWorkerMessages.forEach((response: WebWorkerResponse) => {\r\n if (!response.id) {\r\n return;\r\n }\r\n standbyMessages.set(response.id, response);\r\n });\r\n\r\n delete window.webWorkerMessages;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * This function utility is converting web worker's postMessage communication into an async function.\r\n * It's sends given request to web worker, returns a promise, and promise is resolved when response is received from web worker.\r\n * @param request - The message to send\r\n * @param timeoutInMs(optional) - Timeout in milliseconds after which the promise will resolve with the default(failed) web worker response\r\n * @returns A promise to return WebWorkerResponse\r\n */\r\nexport function getFromWebWorker(request: WebWorkerRequest, timeoutInMs?: number): Promise> {\r\n const defaultResponse = {\r\n id: (request && request.id) || \"\",\r\n fetched: false,\r\n payload: null\r\n };\r\n\r\n if (!isWebWorkerPresent || !request || !request.id) {\r\n return Promise.resolve(defaultResponse);\r\n }\r\n\r\n const endGetFromWebWorker = perfTimeline && perfTimeline.startMeasure(request.id).endMeasure;\r\n\r\n // Check if web worker already sent the message with data and return it.\r\n const standbyMessageData = standbyMessages.get(request.id);\r\n\r\n if (standbyMessageData) {\r\n // Delete the message to avoid returning the same data for future requests\r\n standbyMessages.delete(request.id);\r\n\r\n if (endGetFromWebWorker) {\r\n endGetFromWebWorker(\"standbymessage\");\r\n }\r\n\r\n return Promise.resolve(standbyMessageData);\r\n }\r\n\r\n let promiseTimeout;\r\n let timeOutPromise;\r\n\r\n // If timeout is provided, create a promise that will resolve after the timeout expires\r\n if (timeoutInMs) {\r\n timeOutPromise = new Promise(resolve => {\r\n promiseTimeout = setTimeout(\r\n () => {\r\n // Request timed out, we need not process the response if it's returned later, remove from messages map\r\n messages.delete(request.id);\r\n\r\n const errorMessage = `Web worker request timed out after ${timeoutInMs}ms for request id: [${request.id}]`;\r\n\r\n if (logAppError) {\r\n logAppError({\r\n ...WebWorkerErrors.MessageTimeout,\r\n message: \"Web worker request timed out\",\r\n pb: {\r\n ...WebWorkerErrors.MessageTimeout.pb,\r\n customMessage: errorMessage\r\n }\r\n });\r\n } else {\r\n logger.logError(errorMessage);\r\n }\r\n\r\n if (endGetFromWebWorker) {\r\n endGetFromWebWorker(\"timeout\");\r\n }\r\n\r\n resolve(defaultResponse);\r\n },\r\n timeoutInMs);\r\n });\r\n }\r\n\r\n const webWorkerPromise: Promise = new Promise(\r\n resolve => {\r\n const onMessage = (response: WebWorkerResponse) => {\r\n // We got a response from web worker, clear the promise timeout if it exists.\r\n if (promiseTimeout) {\r\n clearTimeout(promiseTimeout);\r\n }\r\n\r\n if (endGetFromWebWorker) {\r\n endGetFromWebWorker();\r\n }\r\n\r\n resolve(response);\r\n };\r\n\r\n messages.set(request.id, {\r\n type: request.type || \"data\",\r\n callback: onMessage\r\n });\r\n }\r\n );\r\n\r\n window.webWorker.postMessage({\r\n id: request.id,\r\n type: request.type || \"data\",\r\n payload: request.payload\r\n });\r\n\r\n return timeoutInMs\r\n ? Promise.race([webWorkerPromise, timeOutPromise])\r\n : webWorkerPromise;\r\n}\r\n\r\n/**\r\n * Sends given request to the web worker.\r\n * @param request - The message to send\r\n */\r\nexport function sendToWebWorker(request: WebWorkerRequest): void {\r\n if (!isWebWorkerPresent || !request || !request.id) {\r\n return;\r\n }\r\n\r\n window.webWorker.postMessage({\r\n id: request.id,\r\n type: request.type || \"command\",\r\n payload: request.payload || null\r\n });\r\n}\r\n\r\n/**\r\n * Subscribes to web worker notification\r\n * @param request subscription request\r\n * @param callback the callback to execute when notification is received\r\n */\r\nexport function subscribeWebWorkerNotification(request: WebWorkerRequest, callback: (payload: any) => void): void {\r\n if (!isWebWorkerPresent || !request || request.type !== \"subscription\" || !callback) {\r\n return;\r\n }\r\n\r\n messages.set(request.id, { type: \"subscription\", callback });\r\n window.webWorker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Sets the AppError logging function and adds event listener for web worker errors.\r\n * @param handler - Error tracker function\r\n */\r\nexport function trackWebWorkerErrors(trackAppErrorEvent: (data: AppError) => void): void {\r\n if (!isWebWorkerPresent || !trackAppErrorEvent || typeof trackAppErrorEvent !== \"function\") {\r\n return;\r\n }\r\n\r\n logAppError = function (data: AppError): void {\r\n try {\r\n trackAppErrorEvent(data);\r\n } catch (ex) {\r\n logger.logError(`Failed to log web worker AppError. Error: ${stringifyError(ex)}`);\r\n }\r\n };\r\n\r\n // callback for unhandled runtime exceptions\r\n window.webWorker.onerror = onWebWorkerRuntimeError;\r\n\r\n // Callback for handled errors(logger.error) in web worker\r\n const onWorkerErrorMessage = (response: WebWorkerResponse) => {\r\n if (response.payload && typeof response.payload === \"object\") {\r\n const wwAppError = response.payload as AppError;\r\n\r\n // Since web worker is not aware of certain property bag values, merge it with current values.\r\n wwAppError.pb = {\r\n ...wwAppError.pb,\r\n ...getAppErrorsPropertyBag()\r\n };\r\n\r\n logAppError(wwAppError);\r\n } else {\r\n logAppError({\r\n ...WebWorkerErrors.HandledError,\r\n message: \"Web worker error\",\r\n pb: {\r\n ...WebWorkerErrors.HandledError.pb,\r\n customMessage: JSON.stringify(response.payload || \"\")\r\n }\r\n });\r\n }\r\n };\r\n\r\n subscribeWebWorkerNotification({ id: \"WebWorkerError\", type: \"subscription\" }, onWorkerErrorMessage);\r\n\r\n // Skip the thread to capture any errors in the queue\r\n setTimeout(() => {\r\n // Read and log web worker errors that were reported before the main thread initialized.\r\n if (window.webWorkerErrors && Array.isArray(window.webWorkerErrors)) {\r\n window.webWorkerErrors.forEach(error => {\r\n onWebWorkerRuntimeError(error);\r\n });\r\n\r\n delete window.webWorkerErrors;\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Handler for web worker error events\r\n * @param event web worker ErrorEvent\r\n */\r\nfunction onWebWorkerRuntimeError(event: ErrorEvent): void {\r\n // If ErrorEvent does not contain the filename, only possible reason could be that the web worker script 404ed.\r\n if (!event.filename) {\r\n isWebWorkerPresent = false;\r\n window._isWebWorkerPresent = isWebWorkerPresent;\r\n window.webWorker.terminate();\r\n\r\n logAppError({\r\n ...WebWorkerErrors.FileNotFound,\r\n message: \"Web worker script not found\",\r\n pb: {\r\n ...WebWorkerErrors.FileNotFound.pb,\r\n customMessage: JSON.stringify(getErrorDetails(event))\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n logAppError({\r\n ...WebWorkerErrors.RuntimeError,\r\n message: \"Web worker runtime error\",\r\n pb: {\r\n ...WebWorkerErrors.RuntimeError.pb,\r\n customMessage: JSON.stringify(getErrorDetails(event))\r\n }\r\n });\r\n}\r\n\r\n/** Extracts properties from error event. Direct JSON.stringify removes all properties except `isTrusted` */\r\nfunction getErrorDetails(error: ErrorEvent): any {\r\n return JSON.stringify({\r\n filename: error.filename,\r\n message: error.message,\r\n lineno: error.lineno\r\n });\r\n}\r\n\r\ninit();\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration of global / fixed connector namespaces\r\n * Only name spaces that are constant (i.e. not instanced) for the entire SPA lifetime should be listed here\r\n * NOTE: Keep this list alphabetical\r\n * NOTE: Left/Right side need to match\r\n */\r\nexport enum ConnectorNamespaces {\r\n AdminPortalData = \"AdminPortalData\",\r\n AdService = \"AdService\",\r\n AdsManager = \"AdsManager\",\r\n BingImageData = \"BingImageData\",\r\n CategoryData = \"CategoryData\",\r\n ChromiumPageSettings = \"ChromiumPageSettings\",\r\n CoachmarkData = \"CoachmarkData\",\r\n ConditionalBannerData = \"ConditionalBannerData\",\r\n DailyBriefServiceClient = \"DailyBriefServiceClient\",\r\n DisplayAdsManager = \"DisplayAdsManager\",\r\n ExperienceLoadedData = \"ExperienceLoadedData\",\r\n ExperienceLoadedDataConnector = \"ExperienceLoadedDataConnector\",\r\n ExperienceTrackerCommunityData = \"ExperienceTrackerCommunityData\",\r\n ExperienceTrackerData = \"ExperienceTrackerData\",\r\n ExperienceTrackerEdgeData = \"ExperienceTrackerEdgeData\",\r\n ExperienceTrackerEdgeNextData = \"ExperienceTrackerEdgeNextData\",\r\n ExperienceTrackerFinanceData = \"ExperienceTrackerFinanceData\",\r\n ExperienceTrackerFirstPartyData = \"ExperienceTrackerFirstPartyData\",\r\n ExperienceTrackerHomePageData = \"ExperienceTrackerHomePageData\",\r\n ExperienceTrackerHubData = \"ExperienceTrackerHubData\",\r\n ExperienceTrackerMicrosoftNewsData = \"ExperienceTrackerMicrosoftNewsData\",\r\n ExperienceTrackerMMXData = \"ExperienceTrackerMMXData\",\r\n ExperienceTrackerOfficeData = \"ExperienceTrackerOfficeData\",\r\n ExperienceTrackerQnaData = \"ExperienceTrackerQnaData\",\r\n ExperienceTrackerRecipesData = \"ExperienceTrackerRecipesData\",\r\n ExperienceTrackerShoppingData = \"ExperienceTrackerShoppingData\",\r\n ExperienceTrackerTrafficData = \"ExperienceTrackerTrafficData\",\r\n ExperienceTrackerUgcData = \"ExperienceTrackerUgcData\",\r\n ExperienceTrackerViewsData = \"ExperienceTrackerViewsData\",\r\n ExperienceTrackerWeatherData = \"ExperienceTrackerWeatherData\",\r\n ExperienceTrackerWeatherDataConnector = \"ExperienceTrackerWeatherDataConnector\",\r\n ExperienceTrackerWindowsNewsAndInterestsData = \"ExperienceTrackerWindowsNewsAndInterestsData\",\r\n ExperienceTrackerWindowsData = \"ExperienceTrackerWindowsData\",\r\n ExperienceTrackerWindowsShellData = \"ExperienceTrackerWindowsShellData\",\r\n FeedbackData = \"FeedbackData\",\r\n HubPageSettings = \"HubPageSettings\",\r\n IrisData = \"IrisData\",\r\n LayoutPreferenceData = \"LayoutPreferenceData\",\r\n LocationFeed = \"LocationFeed\",\r\n MarketSelector = \"MarketSelector\",\r\n MilestoneData = \"MilestoneData\",\r\n MsccCookieBannerData = \"MsccCookieBannerData\",\r\n MsNewsPageSettings = \"MsNewsPageSettings\",\r\n NavigationData = \"NavigationData\",\r\n OfficeSharedData = \"OfficeSharedData\",\r\n OneTrustCookieConsentData = \"OneTrustCookieConsentData\",\r\n PageClickTrackerData = \"PageClickTrackerData\",\r\n PageLayout = \"PageLayout\",\r\n PageSettingsData = \"PageSettingsData\",\r\n PlacementManager = \"PlacementManager\",\r\n PoweredByData = \"PoweredByData\",\r\n Preload = \"Preload\",\r\n QnaFeedService = \"QnaFeedService\",\r\n RewardsData = \"RewardsData\",\r\n SharedState = \"SharedState\",\r\n SportsData = \"SportsData\",\r\n Telemetry = \"Telemetry\",\r\n ShellNewTabData = \"ShellNewTabData\",\r\n SmartListSharedData = \"SmartListSharedData\",\r\n TelemetryData = \"TelemetryData\",\r\n TelemetryDataEdgeChromium = \"TelemetryDataEdgeChromium\",\r\n TelemetryEdgeChromium = \"TelemetryEdgeChromium\",\r\n TopicData = \"TopicData\",\r\n TopSitesLayoutData = \"TopSitesLayoutData\",\r\n VerticalPropertyData = \"VerticalPropertyData\",\r\n VideoDataManager = \"VideoDataManager\",\r\n ViewsNativeAd = \"ViewsNativeAdConnector\",\r\n ViewsFullPage = \"ViewsFullPage\",\r\n WeatherData = \"WeatherData\",\r\n FinanceData = \"FinanceData\",\r\n SocialData = \"SocialData\",\r\n WindowsNewsAndInterestsData = \"WindowsNewsAndInterestsData\",\r\n WindowsShellData = \"WindowsShellData\",\r\n WindowsPageSettings = \"WindowsPageSettings\"\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { UrlSearchParamsHelper, UrlUtility } from \"../utilities\";\r\nimport { canUseDOM, getLocationHost, getLocationSearch } from \"@msnews/isomorphic-util\";\r\n\r\nimport { headData } from \"../app/HeadData\";\r\n\r\n// See https://webpack.js.org/guides/public-path/#on-the-fly for the details of __webpack_public_path__\r\ndeclare let __webpack_public_path__: string;\r\n\r\n// This is the statics path defined on server side.\r\ndeclare let __WEBPACK_LOCAL_STATICS_PATH__: string;\r\n\r\nconst prodAssets = \"//assets.msn.com\";\r\nconst cnProdAssets = \"//assets.msn.cn\";\r\n\r\nconst localHost = \"localhost.msn.com:8080\";\r\n\r\nconst renderWidgetQS = \"renderWidget\";\r\nconst useDeployedBundlesQS = \"useDeployedBundles\";\r\nconst bingMarketQS = \"setmkt\";\r\n\r\nconst ENV = {\r\n \"int.msn.cn\": cnProdAssets,\r\n \"int1.msn.cn\": cnProdAssets,\r\n \"localhost.msn.com:8080\": `//${localHost}`,\r\n \"microsoftnews-int.msn.cn\": cnProdAssets,\r\n \"microsoftnews-int1.msn.cn\": cnProdAssets,\r\n \"microsoftnews.msn.cn\": cnProdAssets,\r\n \"ntp.msn.cn\": cnProdAssets,\r\n \"owa-int.msn.cn\": cnProdAssets,\r\n \"owa-int1.msn.cn\": cnProdAssets,\r\n \"owa.msn.cn\": cnProdAssets,\r\n \"superapp-int.msn.cn\": cnProdAssets,\r\n \"superapp-int1.msn.cn\": cnProdAssets,\r\n \"superapp.msn.cn\": cnProdAssets,\r\n \"windows-int.msn.cn\": cnProdAssets,\r\n \"windows-int1.msn.cn\": cnProdAssets,\r\n \"windows.msn.cn\": cnProdAssets,\r\n \"www.msn.cn\": cnProdAssets\r\n};\r\n\r\nexport const getPublicPath = (locationSearch: string, locationHost: string, webpackPublicPath: string): string => {\r\n const search = new URLSearchParams(locationSearch);\r\n\r\n // Extend logic for rendering individual experiences (widgets)\r\n const renderWidgets = search.get(renderWidgetQS) === \"true\";\r\n\r\n // Special arrangement for local render service server\r\n // since it could support either assets.msn.com or local static path.\r\n const useDeployedBundles = search.get(useDeployedBundlesQS) === \"true\";\r\n\r\n // use prodAssets when we render widgets or use flag useDeployedBundles\r\n const useProdAssets = renderWidgets || useDeployedBundles;\r\n\r\n // https://www.bing.com/?setmkt=zh-cn this how Bing uses CN.\r\n // When we use widgets on this page, we would like to use cnProdAssets in Peregrine.\r\n const useCnProdAssets = (locationHost === \"www.bing.com\" || locationHost === \"www.staging-bing-int.com\")\r\n && search.get(bingMarketQS) === \"zh-cn\"\r\n && renderWidgets;\r\n\r\n // If useProdAssets is false, look up from ENV and then use the appropriate asset\r\n // if not found in ENV, use prodAssets\r\n const assetHost: string = useCnProdAssets\r\n ? cnProdAssets\r\n : (!useProdAssets && ENV[locationHost] || prodAssets);\r\n\r\n const isLocalHost = locationHost === localHost;\r\n if (search.has(\"entry\")) {\r\n const segments = search.get(\"entry\").split(\"/\").slice(0, -1).join(\"/\") + \"/\";\r\n\r\n if (assetHost) {\r\n return assetHost + segments;\r\n }\r\n } else if (assetHost && isLocalHost && !useDeployedBundles) {\r\n\r\n if (!canUseDOM()) {\r\n // Use direct static path on local dev server.\r\n const path = __WEBPACK_LOCAL_STATICS_PATH__;\r\n return assetHost + path;\r\n } else if (webpackPublicPath) {\r\n return assetHost + webpackPublicPath;\r\n } else {\r\n return webpackPublicPath;\r\n }\r\n } else {\r\n if (assetHost) {\r\n\r\n // Combine query string params from HeadData with current query string param\r\n // to figure out what is the supported qsp is.\r\n // This is to solve qsp rewritten to PCS but client side have no qsp in address.\r\n const headDataQsp = headData.ClientSettings && headData.ClientSettings.queryparams;\r\n const searchParamStringLocation = (locationSearch || \"\").substring(1);\r\n const searchParamStringHeadData = (headDataQsp || \"\").substring(1);\r\n\r\n // Current query string param from client side has higher priority\r\n let combinedString = \"?\" + searchParamStringHeadData ? searchParamStringLocation + \"&\" + searchParamStringHeadData : searchParamStringLocation;\r\n combinedString = decodeURIComponent(combinedString);\r\n\r\n // For duplicate qsp keys, UrlSearchParamsHelper assumes first given, and other duplicates are ignored.\r\n const search = new UrlSearchParamsHelper(combinedString);\r\n const bundlesValue = search.get(\"bundles\");\r\n\r\n // Item qsp supports multiple items. First value of the same key will be used.\r\n // Example, spalinkValue is rolling when qsp is item=test&item=spalink:rolling&item=spalink:123.45\r\n const itemParams = UrlUtility.getParamsWithItems(combinedString);\r\n const spalinkItem = itemParams.find(item => item.key === \"spalink\");\r\n\r\n // Take care of potential spalink:/rolling\r\n let spalinkValues = spalinkItem && spalinkItem.value && spalinkItem.value.split(\"/\");\r\n if (spalinkValues && spalinkValues[0] === \"\") {\r\n spalinkValues = spalinkValues.slice(1);\r\n }\r\n const spalinkDir = spalinkValues && spalinkValues[0];\r\n\r\n if (webpackPublicPath) {\r\n\r\n // in order to have the lazy chunk pointing to latest with a stable path, the build number will be overridden on runtime\r\n // PATHNAME: /bundles/v1/mmx/buildNumber/\r\n // PATHNAME.split(\"/\"): [\"\", \"bundles\", \"v1\", \"mmx\", \"buildNumber\", \"\"]\r\n //\r\n // Example,\r\n // Query string param: item=spalink:123.45/debug\r\n // webpackPublicPath before: /bundles/v1/mmx/buildNumber/debug\r\n // webpackPublicPath after: /bundles/v1/mmx/123.45/debug\r\n const segments = webpackPublicPath.split(\"/\");\r\n if (spalinkDir) {\r\n segments[4] = spalinkDir;\r\n } else if (bundlesValue) {\r\n segments[4] = bundlesValue;\r\n } else {\r\n segments[4] = \"latest\";\r\n }\r\n return assetHost + segments.join(\"/\");\r\n }\r\n }\r\n }\r\n\r\n return webpackPublicPath;\r\n};\r\n\r\nexport const initializePublicPath = () => {\r\n __webpack_public_path__ = getPublicPath(getLocationSearch(), getLocationHost(), __webpack_public_path__);\r\n};\r\n\r\nexport const initializeHybridPublicPath = () => {\r\n const search = decodeURIComponent(window.location.search);\r\n if (search.indexOf(\"item=spa_env:localdev\") > -1) {\r\n // Use active prime instance SPA directory for localdev\r\n __webpack_public_path__ = `//${window.location.host}/spa/`;\r\n return;\r\n }\r\n\r\n const host = ENV[window.location.host] || prodAssets;\r\n\r\n // Item qsp supports multiple items. First value of the same key will be used.\r\n // Example, spalinkValue is rolling when qsp is item=test&item=spalink:rolling&item=spalink:123.45\r\n const itemParams = UrlUtility.getParamsWithItems(search);\r\n const spalinkItem = itemParams.find(item => item.key === \"spalink\");\r\n\r\n // Take care of potential spalink:/rolling\r\n let spalinkValues = spalinkItem && spalinkItem.value && spalinkItem.value.split(\"/\");\r\n if (spalinkValues && spalinkValues[0] === \"\") {\r\n spalinkValues = spalinkValues.slice(1);\r\n }\r\n const spalinkDir = spalinkValues && spalinkValues[0];\r\n\r\n // in order to have the lazy chunk pointing to latest with a stable path, the build number will be overridden on runtime\r\n // PATHNAME: /bundles/v1/mmx/buildNumber/\r\n // PATHNAME.split(\"/\"): [\"\", \"bundles\", \"v1\", \"mmx\", \"buildNumber\", \"\"]\r\n //\r\n // Example,\r\n // Query string param: item=spalink:123.45/debug\r\n // webpackPublicPath before: /bundles/v1/mmx/buildNumber/debug\r\n // webpackPublicPath after: /bundles/v1/mmx/123.45/debug\r\n const segments = __webpack_public_path__.split(\"/\");\r\n segments[4] = (spalinkDir) ? spalinkDir : \"latest\";\r\n __webpack_public_path__ = host + segments.join(\"/\");\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { initializeHybridPublicPath } from \"@msnews/core\";\r\n\r\ninitializeHybridPublicPath();","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Helper to promisify the Prime 'require' AMD helper to resolve a single module with no dependencies.\r\n * @param moduleName {string} - the name of the module to resolve\r\n * @param defaultModule {TModule} - the default module implementation if require is not available.\r\n * @returns {Promise{TModule}} a promise that will resolve the module when it's available.\r\n * @description Note that this version only resolves a single module with no dependencies.\r\n */\r\nexport async function requireAsync(moduleName: string, defaultModule?: TModule): Promise {\r\n return new Promise((resolve: (module: TModule) => void, reject) => {\r\n\r\n if (typeof window.require === \"function\") {\r\n window.require([moduleName], resolve);\r\n } else if (defaultModule) {\r\n console.error(`require was not available. Returning default implementation for ${moduleName}`);\r\n resolve(defaultModule);\r\n } else {\r\n reject(\"require is not available\");\r\n }\r\n });\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { CookieConsentStatus as CookieConsentStatusInfo } from \"@msnews/experiences-constants\";\r\nimport { OneTrustCookieCategory } from \"@msnews/cookie-consent-common\";\r\nimport { SignedInStatus as SignedInStatusInfo } from \"@msnews/experiences-constants\";\r\nimport { Location } from \"./ExperiencesSharedState.state\";\r\n\r\ntype SignedInStatus = (signedIn: SignedInStatusInfo) => boolean;\r\ntype CookieConsentStatus = (consentStatus: CookieConsentStatusInfo) => void;\r\ntype OneTrustActiveCookieCategories = (activeCategories: Array) => void;\r\ntype UseEnterpriseCompliance = (useEnterpriseCompliance: boolean) => void;\r\ntype UseEnterpriseDomain = (useEnterpriseDomain: boolean) => void;\r\ntype UseHistory = (useHistory: boolean) => void;\r\ntype UpdateLocation = (location: Location) => void;\r\n\r\n/**\r\n * Class containing actions that apply to the ExperiencesSharedState connector\r\n * @class\r\n */\r\nexport class ExperiencesSharedStateActions {\r\n /**\r\n * Action for signed-in status state update\r\n */\r\n public static signedInStatus: ActionMap = new ActionMap(\"SignedInStatus\");\r\n\r\n /**\r\n * Action for cookie consent status state update\r\n */\r\n public static cookieConsentStatus: ActionMap = new ActionMap(\"CookieConsentStatus\");\r\n\r\n /**\r\n * Action for useEnterpriseCompliance state update\r\n */\r\n public static oneTrustActiveCookieCategories: ActionMap = new ActionMap(\"OneTrustActiveCookieCategories\");\r\n\r\n /**\r\n * Action for useEnterpriseCompliance state update\r\n */\r\n public static useEnterpriseCompliance: ActionMap = new ActionMap(\"UseEnterpriseCompliance\");\r\n\r\n /**\r\n * Action for useEnterpriseDomain state update\r\n */\r\n public static useEnterpriseDomain: ActionMap = new ActionMap(\"UseEnterpriseDomain\");\r\n\r\n /**\r\n * Action for useHistory state update\r\n */\r\n public static useHistory: ActionMap = new ActionMap(\"UseHistory\");\r\n\r\n /**\r\n * Action for update location\r\n */\r\n public static updateLocation: ActionMap = new ActionMap(\"UpdateLocation\");\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// TODO: This should be considered for moving it to the Interests experience wrapper, once that\r\n// code arrives, since this is specific to that experience\r\n\r\n/**\r\n * Tab Names\r\n * @export\r\n * @type {object}\r\n */\r\nexport const SubnavTabName = {\r\n Interests: \"cinterests\",\r\n MyFeed: \"newsfeed\",\r\n XFeed: \"xfeed\"\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActionPayload, IDataConnector } from \"@msnews/experiences-redux-contracts\";\r\n\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\n\r\n/**\r\n * Helper function to create an action payload\r\n * @param connector The connector (if applicable) where the action will be dispatched\r\n * @param type The Action Type (name of the action)\r\n * @param args Arguments to be passed to the action\r\n * @param experienceInstanceId If defined, the id of an experience instance, that will be used by action receiver\r\n */\r\nexport function getActionPayload(connector: IDataConnector, type: string, args: any[], experienceInstanceId: string): IActionPayload {\r\n let stateKey: string = undefined;\r\n if (connector) {\r\n if (!connector.parentNamespace) {\r\n stateKey = connector.namespace;\r\n } else {\r\n stateKey = connector.parentNamespace + \".\" + connector.namespace;\r\n }\r\n }\r\n\r\n return {\r\n key: stateKey,\r\n experienceInstanceId: experienceInstanceId,\r\n type: type,\r\n params: args\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to dispatch an action either to a connector's namespaced store, or to the root store for the entire app.\r\n * @param connector The connector (if applicable) where the action will be dispatched\r\n * @param payload The action payload\r\n */\r\nexport function dispatchAction(connector: IDataConnector, payload: IActionPayload): any {\r\n\r\n // Dispatch the action\r\n if (connector) {\r\n return connector.store.dispatch(payload);\r\n } else {\r\n return PageBase.getInstance().store.dispatch(payload);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { IActionPayload, IDataConnector, ConnectorConstants } from \"@msnews/experiences-redux-contracts\";\r\nimport { Observer } from \"./ActionObserver\";\r\nimport { PerfTimeline } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Class that wraps the sending of a action to a connector (i.e. dispatch) with an explicit method, so that in the consuming code\r\n * it is obvious that the action is being \"sent\"\r\n * @class\r\n */\r\nexport abstract class ActionSenderBase {\r\n /**\r\n * Property which is a function that will send an action to the connector.\r\n */\r\n public get send(): TActionSignature {\r\n return (this.dispatchAction());\r\n }\r\n\r\n /**\r\n * Creates an instance of the `ActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {Observer[]} observers Array of registered action observers\r\n * @param {IDataConnector} connector Optional connector to send the action to\r\n */\r\n constructor(\r\n protected type: string,\r\n private observers: Observer[],\r\n protected connector?: IDataConnector) { }\r\n\r\n /**\r\n * Method to get dispatcher and payload\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected abstract getDispatchResult(args: any[]): { payload: IActionPayload, result: any };\r\n\r\n /**\r\n * Gets the perf timeline object if applicable\r\n */\r\n protected abstract tryGetPerfTimeline(): PerfTimeline;\r\n\r\n /**\r\n * Method that returns an action sender function to send the action.\r\n * @method\r\n * @return {TActionSignature} return value is a function to send to action.\r\n */\r\n private dispatchAction(): TActionSignature {\r\n return function (...args: unknown[]): unknown {\r\n const perfTimeline = this.tryGetPerfTimeline();\r\n const actionEndMeasure = perfTimeline && perfTimeline.startMeasure(\"action\", this.type).endMeasure;\r\n\r\n const { payload, result } = this.getDispatchResult(args);\r\n\r\n // Call any observers\r\n this.observers.forEach(o => {\r\n try {\r\n if (!o.filterConnector\r\n || this.connector === o.filterConnector) {\r\n\r\n // Call the observer\r\n o.observer(payload);\r\n }\r\n } catch (error) {\r\n console.log(`Error calling observer: ${JSON.stringify(o.observer)}, with error: ${error}`);\r\n }\r\n\r\n // If there is a dispatch connector, dispatch an action to it, forcing it to re-render\r\n if (o.dispatchConnector) {\r\n const renderActionPayload = getActionPayload(o.dispatchConnector, ConnectorConstants.renderAction, [], undefined);\r\n dispatchAction(o.dispatchConnector, renderActionPayload);\r\n }\r\n });\r\n\r\n if (actionEndMeasure) {\r\n actionEndMeasure();\r\n }\r\n\r\n // Return the dispatch result\r\n return result;\r\n };\r\n }\r\n\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActionPayload, IDataConnector } from \"@msnews/experiences-redux-contracts\";\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { ActionSenderBase } from \"./ActionSenderBase\";\r\nimport { Observer } from \"./ActionObserver\";\r\nimport { PerfTimeline } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Class that wraps the sending of a action to a connector (i.e. dispatch) with an explicit method, so that in the consuming code\r\n * it is obvious that the action is being \"sent\"\r\n * @class\r\n */\r\nexport class ActionSender extends ActionSenderBase {\r\n\r\n /**\r\n * Creates an instance of the `ActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {IDataConnector} connector The connector instance to dispatch the action to.\r\n */\r\n constructor(\r\n type: string,\r\n observers: Observer[],\r\n connector: IDataConnector) {\r\n\r\n super(type, observers, connector);\r\n }\r\n\r\n /**\r\n * Core dispatch implementation for {GlobalActionSender}\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected getDispatchResult(args: any[]): { payload: IActionPayload, result: any } {\r\n const payload = getActionPayload(this.connector, this.type, args, undefined);\r\n const result = dispatchAction(this.connector, payload);\r\n return { payload, result };\r\n }\r\n\r\n /**\r\n * Gets the perf timeline if applicable\r\n */\r\n protected tryGetPerfTimeline(): PerfTimeline {\r\n return this.connector.perfTimeline;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PerfTimeline, tryGetPerfTimeline } from \"@msnews/diagnostics\";\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { ActionSenderBase } from \"./ActionSenderBase\";\r\nimport { IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { Observer } from \"./ActionObserver\";\r\n\r\n/**\r\n * Class that wraps the sending of a action globally to all connectors\r\n * @export\r\n * @class\r\n */\r\nexport class GlobalActionSender extends ActionSenderBase {\r\n\r\n /**\r\n * Creates an instance of the `GlobalActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {string} experienceInstanceId Optional experienceInstanceId of the experience that is originating the action.\r\n */\r\n constructor(\r\n type: string,\r\n observers: Observer[],\r\n private experienceInstanceId?: string) {\r\n\r\n super(type, observers, null);\r\n }\r\n\r\n /**\r\n * Core dispatch implementation for {GlobalActionSender}\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected getDispatchResult(args: any[]): { payload: IActionPayload, result: any } {\r\n const payload = getActionPayload(undefined, this.type, args, this.experienceInstanceId);\r\n const result = dispatchAction(undefined, payload);\r\n return { payload, result };\r\n }\r\n\r\n /**\r\n * Gets the perf timeline if applicable\r\n */\r\n protected tryGetPerfTimeline(): PerfTimeline {\r\n return tryGetPerfTimeline(\"GlobalActionSender\", this.experienceInstanceId || \"unknown\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionObserver, Observer } from \".\";\r\nimport { IActionMap, IDataConnector } from \"@msnews/experiences-redux-contracts\";\r\n\r\nimport { ActionSender } from \"./ActionSender\";\r\nimport { GlobalActionSender } from \"./GlobalActionSender\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\n\r\n/**\r\n * Class that maps Action to its callback function type.\r\n * Provides the method to get action creator which returns callback function to send to action.\r\n * Callback function dispatches the action payload.\r\n * @class\r\n */\r\nexport class ActionMap implements IActionMap {\r\n\r\n /**\r\n * An array of registered action observers\r\n */\r\n private observers: Observer[] = [];\r\n\r\n /**\r\n * Creates an instance of the `ActionMap` class.\r\n * @constructor\r\n * @param {string} type The action type, which is part of the IActionMap contract.\r\n */\r\n constructor(public type: string) {\r\n }\r\n\r\n /**\r\n * Method that returns an action sender function that can be used to send/dispatch the action to a specific connector\r\n * @method\r\n * @param {IDataConnector | string} connector The connector instance to send the action to, or the connector namespace. If the param type\r\n * is string, then the connector instance will be looked up, and used if found.\r\n * @return {TActionSignature} return value is an object with a send method, which is used to send the action.\r\n */\r\n public getActionSender(connector: IDataConnector | string): ActionSender | undefined {\r\n let connectorInstance: IDataConnector = undefined;\r\n if (typeof (connector) === \"string\") {\r\n // Find the connector with the matching namespace\r\n connectorInstance = PageBase.getInstance().rootReducer.connector(connector);\r\n } else {\r\n connectorInstance = connector;\r\n }\r\n\r\n if (connectorInstance) {\r\n return new ActionSender(this.type, this.observers, connectorInstance);\r\n }\r\n }\r\n\r\n /**\r\n * Method that returns an action sender function that can be used to send/dispatch the action globally to all connectors\r\n * @method\r\n * @param {string} experienceInstanceId An optional experienceInstanceId, that will get passed along in the action payload.\r\n * It can then be used by the receiving reducer to determine if the action should be handled.\r\n * @return {TActionSignature} return value is an object with a send method, which is used to send the action.\r\n */\r\n public getGlobalActionSender(experienceInstanceId?: string): GlobalActionSender {\r\n return new GlobalActionSender(this.type, this.observers, experienceInstanceId);\r\n }\r\n\r\n /**\r\n * Method that registers a new observer for this action. The observer will be called after the action is dispatched\r\n * @method\r\n * @param {ActionObserver} observer The observer to be added to the list of observers that will be called when the action completes\r\n * @param {Object} connectors Option connectors associated to the observer that will be called by the observer\r\n */\r\n public registerObserver(observer: ActionObserver, connectors?: { dispatchConnector?: IDataConnector, filterConnector?: IDataConnector }): void {\r\n const { dispatchConnector, filterConnector } = (connectors || {});\r\n\r\n this.observers.push({ observer, dispatchConnector, filterConnector });\r\n }\r\n\r\n /**\r\n * Method that remove observer for this action.\r\n * @method\r\n * @param {ActionObserver} observer The observer to be removed to from the list of observers\r\n */\r\n public unregisterObserver(\r\n observer: ActionObserver): void {\r\n\r\n const indexToRemove: number = this.observers.findIndex((existObserver) => {\r\n return existObserver.observer === observer;\r\n });\r\n\r\n if (indexToRemove > -1) {\r\n this.observers.splice(indexToRemove, 1);\r\n }\r\n }\r\n\r\n /**\r\n * Method that unregisters all the observers for this action. Called on the server side to clean up observers between requests.\r\n */\r\n public unregisterObservers(): void {\r\n this.observers = [];\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const enums = {\r\n selectPpeParameter: \"oneservice_enable_ppe\",\r\n externalUrls: {\r\n api: \"https://api.msn.com/community/\",\r\n ppeApi: \"https://ppe-api.msn.com/community/\",\r\n guidelinePage: \"https://www.msn.com/en-us/community/guideline\",\r\n profilePage: \"https://www.msn.com/en-us/community/profile/\",\r\n privacySettings: \"https://www.msn.com/en-us/settings\",\r\n profileSettings: \"https://account.microsoft.com/profile\",\r\n feedbackForm: \"https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR-V3gf69zQlBm1dJVuXA8mtURVI4UlFHMDRIR0VCWDFWNUQyQU5HVzJJQi4u\",\r\n copyrightReportForm: \"https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbRziAYhqL1o9IrEi_GLF4l4hUQVFUVldIVFRCSzQ3NEVOTURNQ01BTE9YSi4u\",\r\n moderationEmail: \"Appealsprocessor@microsoft.com\",\r\n newPost: \"https://www.msn.com/en-us/community/post/new\"\r\n },\r\n userStateType: {\r\n existingUser: \"existingUser\",\r\n anonymous: \"anonymous\",\r\n newUser: \"newUser\"\r\n },\r\n userNameStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAvatarStatusType: {\r\n normal: \"Normal\",\r\n notAllow: \"NotAllow\",\r\n inReview: \"InReview\",\r\n unknown: \"Unknown\"\r\n },\r\n userAgeGroup: {\r\n under18: \"Under18\",\r\n above18: \"Above18\"\r\n },\r\n activityType: {\r\n follow: \"Follow\",\r\n reply: \"Reply\",\r\n reaction: \"Reaction\",\r\n badge: \"Achievement\",\r\n moderation: \"Moderation\",\r\n commentDeleteAlert: \"CommentDeleteAlert\",\r\n profileBannedAlert: \"ProfileBannedAlert\",\r\n profileErrorAlert: \"ProfileErrorAlert\"\r\n },\r\n moderationErrorType: {\r\n takedown: \"Takedown\",\r\n ban: \"Ban\",\r\n notAllowName: \"NotAllowName\",\r\n notAllowPicture: \"NotAllowPicture\",\r\n approveUserAppeal: \"ApproveUserAppeal\",\r\n rejectUserAppeal: \"RejectUserAppeal\",\r\n approveProfilePicAppeal: \"ApproveProfilePicAppeal\",\r\n rejectProfilePicAppeal: \"RejectProfilePicAppeal\",\r\n approveCommentAppeal: \"ApproveCommentAppeal\",\r\n rejectCommentAppeal: \"RejectCommentAppeal\"\r\n },\r\n visibleStatusType: {\r\n Normal: \"Normal\",\r\n DeletedByUser: \"DeletedByUser\",\r\n DeletedByAI: \"DeletedByAI\",\r\n DeletedByHI: \"DeletedByHI\",\r\n InReview: \"InReview\"\r\n },\r\n visibleStatusMap: {\r\n DeletedByUser: \"VisibleStatusDeletedByUser\",\r\n DeletedByAI: \"VisibleStatusDeletedByAI\",\r\n DeletedByHI: \"VisibleStatusDeletedByHI\",\r\n InReview: \"VisibleStatusInReview\",\r\n Default: \"VisibleStatusOther\"\r\n },\r\n commentReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Copyright: \"ReportOptCopyright\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n userNameReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n userPictureReportMap: {\r\n Spam: \"ReportOptSpam\",\r\n Profanity: \"ReportOptProfanity\",\r\n Abuse: \"ReportOptAbuse\",\r\n RiskyLowAuthority: \"ReportOptRiskyLowAuthority\",\r\n TechnicalAttack: \"ReportOptTechnicalAttack\",\r\n Copyright: \"ReportOptCopyright\",\r\n Trademark: \"ReportOptTrademark\",\r\n ChildRelated: \"ReportOptChildRelated\",\r\n Violent: \"ReportOptViolent\",\r\n Danger: \"ReportOptDanger\",\r\n PublicThreats: \"ReportOptPublicThreats\",\r\n Illegal: \"ReportOptIllegal\",\r\n Terrorism: \"ReportOptTerrorism\",\r\n Privacy: \"ReportOptPrivacy\",\r\n Nudity: \"ReportOptNudity\",\r\n NonConsensualIntimateImagery: \"ReportOptNonConsensualIntimateImagery\",\r\n Inappropriate: \"ReportOptInappropriate\"\r\n },\r\n reactionOrder: [\r\n \"like\", \"love\", \"surprised\", \"thinking\", \"sad\", \"angry\"\r\n ],\r\n profileReportItemMap: {\r\n UserName: \"ReportUserName\",\r\n ProfilePicture: \"ReportProfilePicture\"\r\n },\r\n profilePageEmptyStates: {\r\n NoUser: \"NoUser\",\r\n NotSocialUser: \"NotSocialUser\"\r\n },\r\n reactionIconMap: {\r\n like: \"emj_like\",\r\n love: \"emj_love\",\r\n thinking: \"emj_thinking\",\r\n surprised: \"emj_surprised\",\r\n sad: \"emj_sad\",\r\n angry: \"emj_angry\"\r\n },\r\n reactions: {\r\n like: \"like\",\r\n love: \"love\",\r\n thinking: \"thinking\",\r\n surprised: \"surprised\",\r\n sad: \"sad\",\r\n angry: \"angry\"\r\n },\r\n responsiveLevels: {\r\n L0: \"cwtl-0\",\r\n MobilePopup: \"cwt-mobile-popup\"\r\n },\r\n newCommentErrorCodeMap: {\r\n 400: \"NewPostDeniedMsg\",\r\n 403: \"NewPostSessionExpiredMsg\",\r\n 500: \"NewPostWentWrongMsg\",\r\n bodyTooLong: \"NewPostTooLongMsg\",\r\n other: \"NewPostWentWrongMsg\",\r\n 0: \"NewPostWentWrongMsg\",\r\n 1: \"NewPostSessionExpiredMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 6: \"NewPostWentWrongMsg\",\r\n 7: \"NewPostWentWrongMsg\",\r\n 8: \"NewPostWentWrongMsg\",\r\n 9: \"NewPostWentWrongMsg\",\r\n 10: \"NewPostWentWrongMsg\",\r\n 11: \"NewPostWentWrongMsg\",\r\n 12: \"NewPostTooManyCommentsMsg\",\r\n 20: \"NewPostTooLongMsg\",\r\n 21: \"NewPostMentionMsg\",\r\n 22: \"NewPostWentWrongMsg\",\r\n 23: \"NewPostWentWrongMsg\",\r\n 24: \"NewPostDeniedMsg\",\r\n 25: \"NewPostWentWrongMsg\",\r\n 26: \"NewPostWentWrongMsg\",\r\n 27: \"NewPostWentWrongMsg\",\r\n 28: \"NewPostDeniedMsg\",\r\n 29: \"NewPostDeniedMsg\",\r\n 30: \"NewPostDeniedMsg\",\r\n 31: \"NewPostDeniedMsg\",\r\n 32: {\r\n 1: \"NewPostDuplicatedMsg\",\r\n 2: \"NewPostDeniedMsg\",\r\n 3: \"NewPostDeniedMsg\",\r\n 4: \"NewPostDeniedMsg\",\r\n 5: \"NewPostDeniedMsg\",\r\n 6: \"NewPostDeniedMsg\",\r\n 7: \"NewPostDeniedMsg\",\r\n 8: \"NewPostDeniedMsg\",\r\n 9: \"NewPostDeniedMsg\",\r\n 10: \"NewPostDeniedMsg\",\r\n 11: \"NewPostDeniedMsg\",\r\n 12: \"NewPostDeniedMsg\",\r\n 13: \"NewPostDeniedMsg\",\r\n 14: \"NewPostDeniedMsg\",\r\n 15: \"NewPostDeniedMsg\",\r\n 16: \"NewPostDeniedMsg\",\r\n 17: \"NewPostLanguageErrorMsg\",\r\n 18: \"NewPostURLMsg\"\r\n }\r\n\r\n },\r\n theme: {\r\n default: {\r\n name: \"default\",\r\n disabledComponents: []\r\n },\r\n superappBase: {\r\n name: \"superapp\",\r\n disabledComponents: []\r\n },\r\n windowsBase: {\r\n name: \"windows\",\r\n disabledComponents: []\r\n },\r\n superappEmbed: {\r\n name: \"superapp-embed\",\r\n disabledComponents: [\"profilepage\", \"multiloginpage\", \"reactionbreakdowncomment\", \"reactionbreakdowncontent\", \"onboardingpage\", \"onboardingthirdpartypage\", \"onboardingunderagepage\", \"notificationtray\"]\r\n },\r\n superappFullpage: {\r\n name: \"superapp-fullpage\",\r\n disabledComponents: [\"profilepage\"]\r\n }\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"../reducers\";\r\nimport { ConnectorConstants } from \"@msnews/experiences-redux-contracts\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\n\r\n/**\r\n * Action signature to trigger an experience to render\r\n */\r\ntype RenderExperienceSignature = () => void;\r\n\r\n/**\r\n * Action signature to initialize data connector state merge.\r\n */\r\ntype DataConnectorMergeInitSignature = (dataConnectorName: ConnectorNamespaces) => void;\r\n\r\n/**\r\n * Actions that are common to all experiences\r\n * @class\r\n */\r\nexport class CommonActions {\r\n /**\r\n * Definition for an action that can be dispatched to any experience causing it to render\r\n */\r\n public static renderExperience: ActionMap = new ActionMap(ConnectorConstants.renderAction);\r\n\r\n /**\r\n * Definition for an action that initializes shared data connector state on an experience.\r\n */\r\n public static dataConnectorMergeInit: ActionMap = new ActionMap(ConnectorConstants.dataConnectorMergeInitAction);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum ExperienceState {\r\n /**\r\n * State when experience has not started its lifecycle events\r\n */\r\n NotStarted = 0,\r\n\r\n /**\r\n * This state is when experience is waiting to load its bundles\r\n */\r\n WaitingToLoad = 1,\r\n\r\n /**\r\n * Bundles loaded for experience and connector has been initialized\r\n */\r\n LoadedWaitingToRender = 2,\r\n\r\n /**\r\n * All milestone dependencies have been resolved for this experience and its ready to render\r\n */\r\n ReadyToRender = 3,\r\n\r\n /**\r\n * Experience failed to load\r\n */\r\n Failed = 4,\r\n\r\n /**\r\n * Experience state is not known, probably when timeout happened before dependency is resolved or dependency is on some UI event.\r\n */\r\n Unknown = 5\r\n}","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum ChildExperiencesDeferRenderType {\r\n /**\r\n * Wait for all child experinces milestone load dependecies to be resolved, once all child experiences are loaded and available\r\n * triggers parent re-render. Best from perfomance standpoint as it does a single re-render of parent\r\n */\r\n batch = \"batch\",\r\n\r\n /**\r\n * Render every child experince as soon as its available after milestone load dependecies has been resolved, This is less performant as it triggers\r\n * parent re-render multiple times for each delay loaded child experience\r\n */\r\n renderWhenAvailable = \"renderWhenAvailable\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ExperienceMilestoneEventTypes, MilestoneDataActions, getMilestoneDataConnector } from \"@msnews/milestone-data\";\r\nimport { PrerenderRevalidateException, logException, markTtprRaf } from \"@msnews/diagnostics\";\r\n\r\nimport { IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { hasExperiencePersistentDataUpdated } from \"./PageVisibilityActionHelpers\";\r\nimport { registerResetCallback } from \"@msnews/core\";\r\n\r\n/**\r\n * Base class for callback information for when an experience may be stale.\r\n */\r\ninterface StaleCallbackBase {\r\n /** The experience type */\r\n experienceType: string,\r\n\r\n /** If the page reveal delay is above this, invoke the callback. */\r\n thresholdMinutes?: number;\r\n}\r\n\r\n/**\r\n * Callback information for when an experience may be stale for React.\r\n */\r\nexport interface StaleCallbackReact extends StaleCallbackBase {\r\n /** Called when an experience is stale. Returns true if the experience took action to refresh itself. */\r\n callback: () => boolean;\r\n}\r\n\r\n/**\r\n * Callback information for when an experience may be stale for Web Components.\r\n */\r\nexport interface StaleCallbackWC extends StaleCallbackBase {\r\n /** Called when an experience is stale. Promise resolves when the refresh is complete. */\r\n asyncCallback: () => Promise;\r\n}\r\n\r\ntype StaleCallback = StaleCallbackReact | StaleCallbackWC;\r\n\r\n/** List of callbacks to potentially invoke on page reveal. */\r\nlet staleCallbacks: StaleCallback[] = [];\r\n\r\n/**\r\n * Register a callback to reset the pageRevealDependencyMap.\r\n * The callback is registered once when the module is loaded and invoked once on the server side at the beginning of each request.\r\n */\r\nregisterResetCallback(() => {\r\n staleCallbacks = [];\r\n});\r\n\r\n/**\r\n * Initializes the page reveal tracker.\r\n */\r\nexport function initializePageRevealTracker(): void {\r\n MilestoneDataActions.updatePageRevealStart.registerObserver((actionPayload: IActionPayload) => {\r\n const wasPageHidden: boolean = actionPayload.params[1];\r\n if (!wasPageHidden) {\r\n // return if page was not in a hidden or prerendered state.\r\n return;\r\n }\r\n\r\n const pageRevealStartTimeMs: DOMHighResTimeStamp = actionPayload.params[0];\r\n\r\n const visuallyReadyDependencies: string[] = actionPayload.params[2];\r\n\r\n const milestoneConnector = getMilestoneDataConnector();\r\n const visuallyReadyEndTime = milestoneConnector.getCurrentState().aboveTheFoldVisuallyReady.endTime;\r\n\r\n const invokedExperiences: Set = new Set();\r\n\r\n for (const staleCallback of staleCallbacks) {\r\n const { experienceType } = staleCallback;\r\n const markedAsInvalid: boolean = hasExperiencePersistentDataUpdated(experienceType);\r\n const stale: boolean = (staleCallback.thresholdMinutes > 0) && (pageRevealStartTimeMs - visuallyReadyEndTime > staleCallback.thresholdMinutes * 60000);\r\n if (markedAsInvalid || stale) {\r\n if (\"callback\" in staleCallback) {\r\n // This is a React registration. We can fire and forget: BaseExperience will know when the component updates and mark the reveal as complete.\r\n try {\r\n // If the callback took no action, mark reveal as complete right away.\r\n if (!staleCallback.callback()) {\r\n markRevealComplete(experienceType);\r\n }\r\n } catch (error) {\r\n logException(\r\n error,\r\n PrerenderRevalidateException,\r\n \"Exception when running stale revalidate callback\",\r\n \"Experience: \" + experienceType);\r\n }\r\n } else {\r\n // This is a Web Component registration. We'll log completion after the callback is fulfilled.\r\n // Do not await the callback, each will be invoked in parallel.\r\n invokeWebComponentStaleCallback(staleCallback);\r\n }\r\n } else {\r\n // If the callback doesn't need to be invoked, mark reveal complete.\r\n markRevealComplete(experienceType);\r\n }\r\n\r\n invokedExperiences.add(experienceType);\r\n }\r\n\r\n // Experiences that are required for visually ready should have reveal marked complete at some point, even if they are not stale liable\r\n // This is required for ExperienceTracker to declare the whole page as revealed.\r\n for (const visuallyReadyDependency of visuallyReadyDependencies) {\r\n if (!invokedExperiences.has(visuallyReadyDependency)) {\r\n markRevealComplete(visuallyReadyDependency);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Invoke the stale callback for the Web Component experience.\r\n * @param staleCallbackWC The callback to invoke.\r\n */\r\nasync function invokeWebComponentStaleCallback(staleCallbackWC: StaleCallbackWC) {\r\n try {\r\n await staleCallbackWC.asyncCallback();\r\n markRevealComplete(staleCallbackWC.experienceType);\r\n } catch (error) {\r\n logException(\r\n error,\r\n PrerenderRevalidateException,\r\n \"Exception when running stale revalidate callback\",\r\n \"Experience: \" + staleCallbackWC.experienceType);\r\n }\r\n}\r\n\r\n/**\r\n * Mark the page reveal as complete for the given experience type.\r\n * @param experienceType The experience type to mark as complete.\r\n */\r\nfunction markRevealComplete(experienceType: string) {\r\n markTtprRaf(experienceType);\r\n MilestoneDataActions.updateExperiencePublicState.getActionSender(getMilestoneDataConnector()).send({\r\n eventType: ExperienceMilestoneEventTypes.staleRevalidationComplete,\r\n experienceType\r\n });\r\n}\r\n\r\n/**\r\n * Registers a callback to run and update stale data when appropriate. This registers the callback for the React rendering mode, where BaseExperience will take care of the post-refresh reporting.\r\n * @param staleCallback Information about the callback to register.\r\n */\r\nexport function registerStaleRevealReact(staleCallback: StaleCallbackReact) {\r\n staleCallbacks.push(staleCallback);\r\n}\r\n\r\n/**\r\n * Registers a callback to run and update stale data when appropriate. This registers the callback for the Web Component rendering mode, and will automatically log completion when the\r\n * callback promise is fulfilled.\r\n * @param staleCallback Information about the callback to register.\r\n */\r\nexport function registerStaleRevealWC(staleCallback: StaleCallbackWC) {\r\n staleCallbacks.push(staleCallback);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PageMeasure, PerfTimeline } from \"./PerfTimeline\";\r\n\r\nimport { getPageTimings } from \"./PageTimings\";\r\nimport { logger } from \"../logging\";\r\n\r\nconst pageTimings = getPageTimings();\r\n\r\n/**\r\n * Utility class to keep track of how many times a key has appeared in order to\r\n * get a uniquely qualified name back to be used in a dictionary.\r\n */\r\nclass KeyCounter {\r\n\r\n /** Lookup of counts for the given key */\r\n private timelineCount: { [name: string]: number } = {};\r\n\r\n /** Gets the qualified key name */\r\n public qualifyKey(timelineName: string): string {\r\n\r\n // get the previous count\r\n const count = this.getCount(timelineName);\r\n\r\n // if we've called it previously append the count as suffix\r\n // to identify it uniquely.\r\n if (count <= 1) {\r\n return timelineName;\r\n }\r\n\r\n return timelineName + count;\r\n }\r\n\r\n /** Resets the counter state to initial values */\r\n public reset(): void {\r\n this.timelineCount = {};\r\n }\r\n\r\n /** Gets the key's appearence count */\r\n private getCount(timelineName: string): number {\r\n\r\n // get the previous count\r\n const count = this.timelineCount[timelineName] || 0;\r\n\r\n // update the new count\r\n return this.timelineCount[timelineName] = count + 1;\r\n }\r\n}\r\n\r\n/**\r\n * Unique key qualifier for distinctly identifying instances of perf timelines\r\n * across multiple instances of the same or different experience types.\r\n * For example, ContentPreview, ContentPreview2, ContentPreview3, etc.\r\n */\r\nconst timelineKeyCount = new KeyCounter();\r\n\r\n/** Suffix for start markers */\r\nconst startSuffix = \"-start\";\r\n\r\n/** Suffix for end markers */\r\nconst endSuffix = \"-end\";\r\n\r\n/**\r\n * This class can be used to aggregate a list of perf markers and their transitions.\r\n */\r\nexport class PerfTimelineImpl implements PerfTimeline {\r\n\r\n /**\r\n * Unique key qualifier for metric names that appear multiple times.\r\n * For example, render, render2, render3, etc.\r\n */\r\n private readonly markerCount: KeyCounter = new KeyCounter();\r\n\r\n /**\r\n * List of in-memory logged markers for this perf-timeline object\r\n */\r\n private readonly measures: Array> = [];\r\n\r\n /**\r\n * Constructor of a {PerfTimeline} instance\r\n * @param timelineName - the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n * @param instanceId - this specific instance's ID. Used during a renaming operation to idenfity any previous isntance.\r\n * @param addPerfMarks - Flag to indicate whether to log perf marks with the native performance API.\r\n * @param addPageTimings - Flag to indicate whether to log the perf marks into the _pageTimings object.\r\n * @param async - Flag to mark this timeline as an async timeline, so by default all measures under\r\n * this timeline will show under a new process line.\r\n */\r\n public constructor(\r\n public timelineName: string,\r\n public readonly instanceId: string,\r\n private readonly addPerfMarks: boolean,\r\n private readonly addPageTimings: boolean,\r\n private readonly async?: boolean\r\n ) {\r\n this.timelineName = timelineKeyCount.qualifyKey(timelineName);\r\n }\r\n\r\n /**\r\n * Renames this instances of the timeline to the new given name.\r\n * This is useful when the timeline name is not known until after some asynchronous operation is completed,\r\n * but the measuring operation required to be started before the name was known.\r\n * @param timelineName - the new name of the timeline.\r\n */\r\n public rename(timelineName: string): void {\r\n\r\n if (this.timelineName === timelineName) {\r\n return;\r\n }\r\n\r\n if (this.addPageTimings) {\r\n // if we're adding page timings, then make sure we delete the measures under the old name and add the new ones\r\n this.measures.forEach(measure => {\r\n const oldMeasureName = this.qualifyMeasureName(measure.measureName);\r\n delete pageTimings[oldMeasureName + startSuffix];\r\n delete pageTimings[oldMeasureName];\r\n });\r\n }\r\n\r\n this.timelineName = timelineName;\r\n\r\n if (this.addPageTimings) {\r\n // add back the page timings under the new timeline name\r\n this.measures.forEach(measure => {\r\n const newMeasureName = this.qualifyMeasureName(measure.measureName);\r\n pageTimings[newMeasureName + startSuffix] = measure.from;\r\n pageTimings[newMeasureName] = measure.to - measure.from;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Marks the start of a timeline measurement.\r\n * @param coreMarkerName - the name of the core marker. This value is usually invariant\r\n * from instance to instance (i.e., init, config, render)\r\n * @param dynamicMeasureName - the optional additional identifying name to give for the measure.\r\n * This value can be used to identify dynamic values across instances. For example the\r\n * HREF of the config. This can also later be updated to a new name when calling the 'endMeasure'\r\n * method.\r\n * @param async - flag to indicate whether this is an async measure or not.\r\n * @returns An object with the following properties:\r\n * - endMeasure - method that should be used to mark the end the measure.\r\n */\r\n public startMeasure(coreMarkerName: string, dynamicMeasureName?: string, async?: boolean): { endMeasure: (updatedDynamicMeasureName?: string) => void } {\r\n\r\n const startTime = performance.now();\r\n\r\n const timelineNameAtStart = this.timelineName;\r\n let measureNameCore = this.formatMeasureName(coreMarkerName, dynamicMeasureName);\r\n let measureName = this.qualifyMeasureName(measureNameCore);\r\n\r\n const startMarkerName = measureName + startSuffix;\r\n this.singleMark(startMarkerName);\r\n\r\n if (this.addPageTimings) {\r\n pageTimings[startMarkerName] = startTime;\r\n }\r\n\r\n return {\r\n /**\r\n * Ends the given measure we started\r\n */\r\n endMeasure: (updatedDynamicMeasureName?: string) => {\r\n\r\n const endTime = performance.now();\r\n\r\n // flag to indicate whether we need to re-qualify the measure name based on frequency. Note that we only\r\n // set this to true if the timeline name has changed since start, or we have a new dynamic name at the end.\r\n const requalifyMeasureName = updatedDynamicMeasureName\r\n || (timelineNameAtStart !== this.timelineName);\r\n\r\n if (requalifyMeasureName) {\r\n // if by the time we're ending the measure, we have a new dynamic name for the measurement, use that as the final measure name.\r\n measureNameCore = this.formatMeasureName(coreMarkerName, updatedDynamicMeasureName);\r\n measureName = this.qualifyMeasureName(measureNameCore);\r\n }\r\n\r\n const endMarkerName = measureName + endSuffix;\r\n\r\n this.singleMark(endMarkerName);\r\n this.measure(measureName, startMarkerName, endMarkerName);\r\n\r\n // Note we only save the partial metric without the timeline name, so we can use the final timeline name\r\n // if any rename operations happen while initial measurements have started without the final timeline name\r\n this.measures.push({\r\n measureName: measureNameCore,\r\n async: (async != null) ? async : this.async,\r\n from: startTime,\r\n to: endTime\r\n });\r\n\r\n if (this.addPageTimings) {\r\n pageTimings[measureName] = endTime - startTime;\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Returns the list of page measures for this timeline object\r\n * @returns {Array} containing the fully qualified list of metric names for this perf timeline.\r\n */\r\n public getPageMeasures(): Array {\r\n return this.measures.map(measure => ({\r\n ...measure,\r\n timelineName: this.timelineName\r\n }));\r\n }\r\n\r\n /**\r\n * Instruments the start/begin for the given function with a given binding context\r\n * @param funcName - the identifying name of the function\r\n * @param func - the function instance to measure\r\n * @param bindingContext - the optional context from which to invoke the function\r\n * @returns the instrumented function that will track the start/end of the given function.\r\n */\r\n public instrumentFunc(funcName: string, func: TFunc, bindingContext?: Object): TFunc {\r\n const wrapper = (...args: unknown[]): unknown => {\r\n const endMeasure = this.startMeasure(funcName).endMeasure;\r\n try {\r\n return func.apply(bindingContext, args);\r\n } finally {\r\n endMeasure();\r\n }\r\n };\r\n\r\n return wrapper as unknown as TFunc;\r\n }\r\n\r\n /**\r\n * Instruments the start/begin for the given async-style function\r\n * @param promiseName - the identifying name of the promise\r\n * @param getPromise - the promise getter that returns the promise to measure. This is needed\r\n * so that the start measurement can occur before the promise starts executing.\r\n * @param async - flag to indicate whether to measure this promise as an async timeline\r\n * or a synchronous one. Please note that if you specify this as true, and other measurements\r\n * in the timeline are synchronous, the async measurements will appear as a separate timeline\r\n * and will not be next to the synchronous one. If unsure, leave undefined.\r\n * @returns the wrapped promise that tracks the start/end of the promise execution.\r\n */\r\n public async instrumentPromise(promiseName: string, getPromise: () => Promise, async?: boolean): Promise {\r\n\r\n const endMeasure = this.startMeasure(promiseName, null, async).endMeasure;\r\n try {\r\n return await getPromise();\r\n } finally {\r\n endMeasure();\r\n }\r\n }\r\n\r\n /**\r\n * Prefixes the given measure name with the current timeline name\r\n * @param measureName - the measure name to qualify\r\n * @returns the timeline name prefixed measure name.\r\n */\r\n private qualifyMeasureName(measureName: string): string {\r\n return `${this.timelineName}-${measureName}`;\r\n }\r\n\r\n /**\r\n * Returns the formatted measure name with it's constiuent parts\r\n * @param coreMeasureName - the core marker name\r\n * @param dynamicMeasureName - optional dynamic measure name\r\n * @returns the formatted marker name\r\n */\r\n private formatMeasureName(coreMeasureName: string, dynamicMeasureName?: string): string {\r\n const dynamicMeasureSuffix = dynamicMeasureName ? (\"-\" + dynamicMeasureName) : \"\";\r\n return this.markerCount.qualifyKey(`${coreMeasureName}${dynamicMeasureSuffix}`);\r\n }\r\n\r\n /**\r\n * Helper to add a single mark with the performance API\r\n * @param markerName - the name of the marker to add.\r\n */\r\n private singleMark(markerName: string): void {\r\n if (this.addPerfMarks) {\r\n performance.mark(markerName);\r\n }\r\n }\r\n\r\n /**\r\n * Helper to calculate a performance measurement against the performance API\r\n * @param measureName - the name of the measure\r\n * @param startMarker - the name of the start marker\r\n * @param endMarker - the name of the end marker\r\n */\r\n private measure(measureName: string, startMarker: string, endMarker: string): void {\r\n if (this.addPerfMarks) {\r\n try {\r\n // this can throw if start/end markers were not available for some reason\r\n performance.measure(measureName, startMarker, endMarker);\r\n } catch (ex) {\r\n logger.logError(ex);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Test export for resetting the timeline name counter\r\n */\r\nexport function _resetTimelineKeyCounter(): void {\r\n timelineKeyCount.reset();\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppPerfTraceConfig, tryParseAppTraceConfig } from \"./AppPerfTraceConfig\";\r\nimport { PageMeasure, PerfTimeline, TryGetPerfTimelineFunc, createPerfTimeline, setTryGetPerfTimelineFunc } from \"./PerfTimeline\";\r\n\r\nimport { PerfTimelineImpl } from \"./PerfTimelineImpl\";\r\nimport { logger } from \"../logging\";\r\n\r\nlet configOverrides: AppPerfTraceConfig;\r\n\r\n/**\r\n * The configuration for app trace switches. This will be updated with the\r\n * config in the CMS and any properties from URL overrides.\r\n */\r\nconst config: AppPerfTraceConfig = {};\r\n\r\n/**\r\n * Dictionary containing the unique {PerfTimeline} object instances across the app.\r\n * When related measurements on the same perf timeline is required across unrelated parts\r\n * of the code, this will guarantee you're tracking those measurements under the same\r\n * perf timeline using a combination of the experience name and instance id.\r\n */\r\nlet perfTimelineInstances: { [instanceId: string]: PerfTimeline };\r\n\r\n/**\r\n * Initializes experience perf diagnostic specific state.\r\n * @param locationHref - the value of window.location.href from which to parse options.\r\n * @param tryGetPerfTimelineFunc - the injected dependency for perf timeline factory method.\r\n */\r\nexport function initExperienceDiagnosticsCore(locationHref: string, tryGetPerfTimelineFunc: TryGetPerfTimelineFunc): void {\r\n perfTimelineInstances = {};\r\n\r\n // Use the actual function to get perf timeline when initExperienceDiagnostics is called.\r\n setTryGetPerfTimelineFunc(tryGetPerfTimelineFunc);\r\n\r\n setAppPerfTraceConfigOverrides(locationHref);\r\n}\r\n\r\n/**\r\n * Returns the app trace config.\r\n */\r\nexport function getAppPerfTraceConfig(): AppPerfTraceConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Helper to set the app trace config dynamically. Useful when the app trace config\r\n * has been loaded via a configuration (such as entry point config), and we want to use\r\n * that as the default/base config instead. Note that we still apply higher precedence\r\n * to the location parsed config since we want to make sure to use those if specified.\r\n * @param baseConfig the base configuration to apply.\r\n */\r\nexport function setAppPerfTraceBaseConfig(baseConfig: Partial): void {\r\n if (!baseConfig) {\r\n return;\r\n }\r\n\r\n // Use the config from URL last, so we have highest precedence on QSPs\r\n Object.assign(config, baseConfig, configOverrides);\r\n\r\n // forcefully disable for some options we never want enabled in upload scenario\r\n if (config.uploadTrace) {\r\n\r\n // don't bloat page timings with app trace related timings\r\n config.addPageTimings = false;\r\n\r\n // don't emit performance marks that show up on F12\r\n config.addPerformanceMarks = false;\r\n\r\n // if sample rate has not been set, set to 0, or does not pass\r\n // the random value test, we need to:\r\n // 1. disable app trace collection completely\r\n // 2. disable upload flag, so that when we try to get the app trace for upload\r\n // it will simply return an empty trace, and prevent the upload.\r\n //\r\n if (!config.sampleRate\r\n || Math.random() > config.sampleRate) {\r\n\r\n config.enablePerfTimeline = false;\r\n config.uploadTrace = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initializes experience perf diagnostic specific state\r\n * Note: this method should not be called explicitly (other than from UTs.)\r\n * It is already called by default at the beginning of module initialization.\r\n * @param locationHref - the value of window.location.href from which to parse options\r\n */\r\nfunction setAppPerfTraceConfigOverrides(locationHref: string): void {\r\n Object.assign(config, configOverrides = tryParseAppTraceConfig(locationHref));\r\n}\r\n\r\n/**\r\n * Gets or creates a perf timeline object for the given experience instance if perf measurements are enabled\r\n * for the given experience.\r\n * @param experienceName - the name of the experience for which to create the timeline.\r\n * @param instanceId - the ID that will uniquely identify this timeline across multiple instances.\r\n */\r\nexport const tryGetPerfTimelineImpl: TryGetPerfTimelineFunc = (experienceName: string, instanceId: string, async?: boolean): PerfTimeline => {\r\n return shouldTrackPerfTimeline(experienceName)\r\n ? getPerfTimeline(experienceName, instanceId, async)\r\n : undefined;\r\n};\r\n\r\n/**\r\n * Gets or creates a perf timeline object for the given experience instance. This should only be used in special\r\n * circumstances where we may not know in advance whether perf timeline should be enabled for an experience, but\r\n * still want to start the measurements as not to miss anything in case collection is enabled at a later time.\r\n * This is usually used in entry point to collect intialization measurements before the config is loaded with\r\n * more parameters for app perf trace collection in order to upload trace logs in production.\r\n * @param experienceName - the name of the experience for which to get the perf timeline.\r\n * @param instanceId - the instance specific ID that will uniquely identify this instance from other instances.\r\n */\r\nexport function getPerfTimeline(experienceName: string, instanceId: string, async?: boolean): PerfTimeline {\r\n const instanceKey = getInstanceKeyCore(experienceName, instanceId);\r\n\r\n const perfTimeline = perfTimelineInstances[instanceKey];\r\n if (perfTimeline) {\r\n return perfTimeline;\r\n }\r\n\r\n return perfTimelineInstances[instanceKey] = createPerfTimeline(\r\n PerfTimelineImpl,\r\n experienceName,\r\n instanceId,\r\n config.addPerformanceMarks,\r\n config.addPageTimings,\r\n async\r\n );\r\n}\r\n\r\n/**\r\n * Renames the given perf timeline object and moves the lookup dictionary reference under the new key\r\n * @param perfTimeline - the perf timeline to rename\r\n * @param newExperienceName - the new name for the perf timeline\r\n */\r\nexport function renamePerfTimeline(perfTimeline: PerfTimeline, newExperienceName: string): void {\r\n\r\n const oldInstanceKey = getInstanceKey(perfTimeline);\r\n\r\n if (perfTimelineInstances[oldInstanceKey] !== perfTimeline) {\r\n logger.logError(`Attempted to rename a perf timeline object with mismatching instance key ${oldInstanceKey}`);\r\n return;\r\n }\r\n\r\n // rename the perf timeline to the new name\r\n perfTimeline.rename(newExperienceName);\r\n\r\n // delete the old reference\r\n delete perfTimelineInstances[oldInstanceKey];\r\n\r\n // ...and add the new instance under the new key\r\n const newInstanceKey = getInstanceKey(perfTimeline);\r\n perfTimelineInstances[newInstanceKey] = perfTimeline;\r\n}\r\n\r\n/**\r\n * Returns the list of page measures from all the perf timeline objects being tracked\r\n */\r\nexport function getExperienceMeasures(): Array {\r\n const pageMeasures: Array = [];\r\n Object.keys(perfTimelineInstances).forEach(instanceKey =>\r\n pageMeasures.push(...perfTimelineInstances[instanceKey].getPageMeasures())\r\n );\r\n return pageMeasures;\r\n}\r\n\r\n/**\r\n * Helper to check whether we should track perf timeline for the given experience\r\n * @param experienceName - the name of the experience to check\r\n * @returns {boolean} indicating whether the given experience should be tracked for perf\r\n */\r\nfunction shouldTrackPerfTimeline(experienceName: string): boolean {\r\n if (!config.enablePerfTimeline) {\r\n return false;\r\n }\r\n\r\n // if inclusion list is present, it will supercede the exclusion list,\r\n // so return true early if a match is found here.\r\n const { experiencesForPerf } = config;\r\n if (experiencesForPerf && experiencesForPerf[experienceName]) {\r\n return true;\r\n }\r\n\r\n // check for exclusion list\r\n const { experiencesExcludedForPerf } = config;\r\n if (experiencesExcludedForPerf && experiencesExcludedForPerf[experienceName]) {\r\n return false;\r\n }\r\n\r\n // otherwise the final fallback will be the track all flag.\r\n return config.trackAllExp;\r\n}\r\n\r\n/**\r\n * Gets the instance key to store the experience timeline\r\n * @param perfTimeline - the timeline object from which to get the instance key.\r\n * @returns the cache key that represents the location to which to store the perf timeline.\r\n */\r\nfunction getInstanceKey(perfTimeline: PerfTimeline): string {\r\n const { timelineName, instanceId } = perfTimeline;\r\n return getInstanceKeyCore(timelineName, instanceId);\r\n}\r\n\r\n/**\r\n * Gets the instance key to store the experience timeline\r\n * @param experienceName - the name of the experience\r\n * @param instanceId - the instance ID for the perf timeline.\r\n * @returns the cache key that represents the location to which to store the perf timeline.\r\n */\r\nfunction getInstanceKeyCore(experienceName: string, instanceId: string): string {\r\n return `${experienceName}-${instanceId || \"0\"}`;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n evalGitOrCmsExperienceInfo,\r\n getConfigHref,\r\n getConfigId,\r\n getConfigIdString,\r\n getExperienceType,\r\n resolver,\r\n ChildExperienceUniversalConfigInfo,\r\n DynamicBundles,\r\n ExperienceConfigWrapper\r\n} from \"@msnews/core\";\r\nimport { ChildExperienceConfigInfo, IRequestContext } from \"@msnews/core\";\r\nimport { ConnectComponentFailureError, createError, ExperienceLoaderAppErrors, LoadComponentFailureError, renamePerfTimeline, stringifyError, tryGetPerfTimeline } from \"@msnews/diagnostics\";\r\nimport { ExperienceLoadingState, MilestoneDataActions, createExperienceStateUpdate, getExperienceLoadDelegate, getMilestoneDataConnector } from \"@msnews/milestone-data\";\r\n\r\nimport { ConfigProcessor } from \"@msnews/config-validator\";\r\nimport { ExperienceIds } from \"@msnews/experiences-constants\";\r\nimport { IComponentConnector } from \"../\";\r\nimport { reportDataConnectorStateChange } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport React from \"react\";\r\nimport { Store } from \"react-redux\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { uniqueId } from \"lodash-es\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * An experience loader class that encapsulates the dynamic loading of an experience.\r\n * Give an experience config href, this class will determine the bundle to be loaded, load the bundle, and then enable the caller to get\r\n * the connected render component for the experience.\r\n * The loading/initialization of the experience connector and the connecting are separate methods, so that the caller can control when each is done\r\n */\r\nexport class ExperienceLoader {\r\n /**\r\n * The connector for this instance of the experience loader. It is undefined until after loadConnector is called\r\n */\r\n private experienceConnector: IComponentConnector = undefined;\r\n\r\n /**\r\n * The experience rendering Component for this instance of the experience loader. It is undefined until after loadConnector is called\r\n */\r\n private experienceComponent: any = undefined;\r\n\r\n /**\r\n * The experience Type of the experience being loaded. It is undefined until after loadConnector is called\r\n */\r\n private $experienceType: string;\r\n\r\n /**\r\n * The unique ID that identifes this loading experience instance.\r\n */\r\n private readonly instanceId?: string;\r\n\r\n /**\r\n * Gets the experience Type for this instance of the experience loader. It is undefined until after loadConnector is called\r\n */\r\n public get experienceType(): string { return this.$experienceType; }\r\n\r\n /**\r\n * Gets the current Connector for this experience loader instance\r\n */\r\n public get connector(): IComponentConnector { return this.experienceConnector; }\r\n\r\n /**\r\n * When we want to load bundles preemptively with earlyLoadBundles, we'll store their promises here. Mapping from experienceType\r\n * string to the promise for loading its bundle.\r\n */\r\n public static earlyLoadBundlePromises: Map> = new Map>();\r\n\r\n /**\r\n * Creates an experience loader.\r\n * @param {ChildExperienceUniversalConfigInfo} configIndexId The config index ID for the config to load\r\n * @param {string} instanceId The instanceId of the experience\r\n * @param {string} parentNamespace The namespace of the parent experience, if it is known\r\n * @param {Store} parentStore The parent experience redux store\r\n * @param {string} type The experienceType of the experience being loaded. If provided, this type will be used to load the bundle\r\n */\r\n public constructor(\r\n private readonly configIndexId: ChildExperienceUniversalConfigInfo,\r\n instanceId?: string | undefined,\r\n private readonly parentNamespace?: string | undefined,\r\n private readonly parentStore?: Store | undefined,\r\n private readonly requestContext?: IRequestContext | undefined,\r\n experienceType?: string | undefined) {\r\n\r\n this.$experienceType = experienceType || ((typeof configIndexId !== \"string\") && getExperienceType(configIndexId));\r\n this.instanceId = instanceId || evalGitOrCmsExperienceInfo(\r\n this.configIndexId,\r\n gitConfigInfo => gitConfigInfo.instanceId,\r\n cmsConfigInfo => cmsConfigInfo.instanceId,\r\n _ => instanceId,\r\n \"\"\r\n );\r\n }\r\n /**\r\n * Given a child config, recursively find bundles that we can load immediately. If we find a bundle to load immediately, we'll\r\n * create a promise and store it in earlyLoadBundlePromises. The loadConnector method should check the earlyLoadBundlePromises\r\n * before creating new promises to a load bundle.\r\n * @param config child config of an experience config\r\n */\r\n public static async earlyLoadBundles(config: ChildExperienceConfigInfo) {\r\n\r\n const experienceType = getExperienceType(config);\r\n\r\n if (config\r\n && experienceType\r\n && !getExperienceLoadDelegate(experienceType)) {\r\n // Do not early load experiences with delegates. They should have specific events triggering loading.\r\n\r\n if (experienceType === ExperienceIds.river) {\r\n // We should not traverse to the River when early loading bundles because it may have children disabled.\r\n return;\r\n }\r\n\r\n if (!ExperienceLoader.earlyLoadBundlePromises.has(experienceType)) {\r\n ExperienceLoader.earlyLoadBundlePromises.set(experienceType, DynamicBundles.loadExperience(experienceType));\r\n }\r\n\r\n const configId = getConfigId(config);\r\n const fullConfig = await resolver.getConfig(configId);\r\n\r\n ConfigProcessor.getChildrenDataConnectorConfigInfos(fullConfig.properties).forEach(async (childConfig) => {\r\n ExperienceLoader.earlyLoadBundles(childConfig);\r\n });\r\n\r\n ConfigProcessor.getChildrenExperienceConfigInfos(fullConfig.properties).forEach(async (childConfig) => {\r\n ExperienceLoader.earlyLoadBundles(childConfig);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Dynamically loads and experience bundle, and creates the experience connector\r\n */\r\n public async loadConnector(isDataConnector = false): Promise {\r\n let linesRunUntilFailure = \"start;\";\r\n try {\r\n // Log an app error, if we didn't get either a configIndexHref NOR an experienceType\r\n if (!this.configIndexId && !this.$experienceType) {\r\n // Log an app error if the loader failed to load for whatever reason\r\n Telemetry.sendAppErrorEvent({\r\n ...ExperienceLoaderAppErrors.InsufficientLoadArgs,\r\n message: \"Failed loading experience bundle due to missing configIndexId and experienceType\",\r\n pb: {\r\n ...ExperienceLoaderAppErrors.InsufficientLoadArgs.pb,\r\n customMessage: `Details: \" ${JSON.stringify({ instanceId: this.instanceId, parentNamespace: this.parentNamespace })}`\r\n }\r\n\r\n });\r\n throw new Error(\"Cannot load a connector bundle without either the experienceType, or configIndexId\");\r\n }\r\n linesRunUntilFailure += \"nullCheck;\";\r\n\r\n const perfTimeline = tryGetPerfTimeline(this.$experienceType || uniqueId(), this.instanceId);\r\n linesRunUntilFailure += \"perfTimeline;\";\r\n\r\n // the loaded config result\r\n let configResult: ExperienceConfigWrapper;\r\n\r\n // Get a promise for the resolved config of the experience that is being initialized. If not configIndexHref is supplied,\r\n // then assume the experience has no config, so just create a resolved promise the returns an empty config\r\n let configPromise: any;\r\n const configId = this.configIndexId && getConfigId(this.configIndexId);\r\n if (configId) {\r\n configPromise = perfTimeline\r\n ? perfTimeline.instrumentPromise(\"config\", () => resolver.getConfig(configId))\r\n : resolver.getConfig(configId);\r\n } else {\r\n configPromise = Promise.resolve({\r\n experienceType: this.$experienceType,\r\n properties: {}\r\n });\r\n }\r\n\r\n linesRunUntilFailure += \"configPromise;\";\r\n\r\n // The async promises for loading the config and loading the bundles\r\n const loaderPromises: Promise[] = [configPromise];\r\n\r\n // If we don't know the experienceType, then we need to wait for the config to load and get it from the child config\r\n if (!this.$experienceType) {\r\n\r\n configResult = await configPromise;\r\n\r\n // Note that Git configs do not return experience type with the config yet,\r\n // however, the experience type will be derived from the config id in the ctor.\r\n this.$experienceType = configResult.experienceType;\r\n\r\n linesRunUntilFailure += \"awaitConfigPromise;\";\r\n\r\n // if we didn't have $experienceType at construction time, then we would've used uniqueId() to create this\r\n // temporary timeline. Now that we have the proper type, rename the timeline to the known value.\r\n if (perfTimeline) {\r\n renamePerfTimeline(perfTimeline, this.$experienceType);\r\n linesRunUntilFailure += \"renamePerfTimeline;\";\r\n }\r\n }\r\n\r\n let bundlePromise: Promise;\r\n if (!ExperienceLoader.earlyLoadBundlePromises.has(this.$experienceType)) {\r\n\r\n // Get a promise for loading in the experience bundle\r\n bundlePromise = perfTimeline\r\n ? perfTimeline.instrumentPromise(\"scripts\", () => DynamicBundles.loadExperience(this.$experienceType))\r\n : DynamicBundles.loadExperience(this.$experienceType);\r\n\r\n loaderPromises.push(bundlePromise);\r\n linesRunUntilFailure += \"loadExperienceBundle;\";\r\n }\r\n\r\n // Wait for all of the promises to complete. This will either be both the config and bundle promises,\r\n // or the bundle promise with the pre-resolved config promise to the empty config object.\r\n await Promise.all(loaderPromises);\r\n linesRunUntilFailure += \"waitForLoaderPromises;\";\r\n\r\n // If we don't have the config result yet, get it from the completed promises.\r\n if (!configResult) {\r\n configResult = await configPromise;\r\n linesRunUntilFailure += \"awaitConfigPromise;\";\r\n }\r\n\r\n // Get the bundle from the completed promises\r\n const bundleModule = ExperienceLoader.earlyLoadBundlePromises.has(this.$experienceType)\r\n ? await ExperienceLoader.earlyLoadBundlePromises.get(this.$experienceType)\r\n : await bundlePromise;\r\n linesRunUntilFailure += \"getBundleModule;\";\r\n\r\n const initMeasureEnd = perfTimeline && perfTimeline.startMeasure(\"init\").endMeasure;\r\n\r\n // update experience current state to loaded\r\n this.updateExperienceLoadedMilestone(this.$experienceType);\r\n linesRunUntilFailure += \"updateExperienceLoadedMilestone;\";\r\n\r\n // Extract config object from result\r\n const config = configResult.properties;\r\n\r\n // Get the Connector/Reducer/Component via naming convention\r\n const ExperienceConnector = bundleModule[this.$experienceType + \"Connector\"];\r\n const ExperienceReducer = bundleModule[this.$experienceType + \"Reducer\"];\r\n\r\n // Store the experience rendering component as a class member, for use later when it is connected\r\n this.experienceComponent = bundleModule[this.$experienceType];\r\n\r\n // Create the experience connector. The namespace is a combination of the experienceType and its instance ID (in case there are multiple of them on a page)\r\n const app = PageBase.getInstance();\r\n\r\n let experienceNamespace: string = null;\r\n if (this.configIndexId == null) {\r\n // configRef or HREF is not specified\r\n experienceNamespace = getExperienceNamespace({ instanceId: this.instanceId, configRef: { experienceType: this.$experienceType, instanceSrc: \"NA\" } });\r\n } else {\r\n experienceNamespace = typeof this.configIndexId === \"string\"\r\n ? getExperienceNamespace({ experienceType: this.$experienceType, instanceId: this.instanceId, href: this.configIndexId })\r\n : getExperienceNamespace(this.configIndexId, this.instanceId);\r\n }\r\n\r\n linesRunUntilFailure += \"getExperienceNamespace;\";\r\n\r\n const experienceParentNamespace = this.parentNamespace ? this.parentNamespace : \"\";\r\n const experienceStore = this.parentStore ? this.parentStore : app.store;\r\n\r\n // Data connectors are singletons, and so their registered namespace is only their experienceType. This allows\r\n // data connectors to be found by using the constants in the ExperienceIds enum\r\n this.experienceConnector = new ExperienceConnector(\r\n isDataConnector ? this.$experienceType : experienceNamespace,\r\n experienceParentNamespace,\r\n app.rootReducer,\r\n new ExperienceReducer(config),\r\n experienceStore,\r\n config,\r\n this.requestContext\r\n );\r\n linesRunUntilFailure += \"newExperienceConnector;\";\r\n\r\n // Report initial data connector state when loaded.\r\n if (isDataConnector && canUseDOM()) {\r\n reportDataConnectorStateChange(this.$experienceType, this.experienceConnector.getCurrentState());\r\n }\r\n\r\n // Set the experience config index href property on the connector.\r\n this.experienceConnector.configHref = getConfigHref(this.configIndexId);\r\n\r\n if (initMeasureEnd) {\r\n initMeasureEnd();\r\n }\r\n\r\n } catch (error) {\r\n\r\n Telemetry.sendAppErrorEvent(createError(\r\n LoadComponentFailureError,\r\n \"loadComponent failed\",\r\n `Details: ${JSON.stringify({\r\n error: stringifyError(error, true),\r\n instanceId: this.instanceId,\r\n parentNamespace: this.parentNamespace,\r\n configIndex: this.configIndexId,\r\n linesRunUntilFailure\r\n })}`\r\n ));\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Creates and returns the connected rendering component for the experience\r\n * @param connectorProps Any initial props that should be passed to the connector in its onComponentConnect() method\r\n * @returns The Connected component for the experience\r\n */\r\n public async getConnectedExperience(connectorProps?: any): Promise {\r\n // If the connector has not been loaded yet, then load it first\r\n if (!this.experienceConnector) {\r\n await this.loadConnector();\r\n }\r\n\r\n // Return a promise that will resolve to the connected component, ready to render.\r\n try {\r\n return this.experienceConnector.connectComponent(this.experienceComponent, connectorProps);\r\n } catch (error) {\r\n Telemetry.sendAppErrorEvent({\r\n ...ConnectComponentFailureError,\r\n message: \"connectComponent failed\",\r\n pb: {\r\n ...ConnectComponentFailureError.pb,\r\n customMessage: `Details: \" ${JSON.stringify({\r\n error,\r\n connectorProps,\r\n instanceId: this.instanceId,\r\n parentNamespace: this.parentNamespace,\r\n configIndex: this.configIndexId\r\n })}`\r\n }\r\n });\r\n\r\n throw new Error(\"ExperienceLoader connectComponent failed\");\r\n }\r\n }\r\n\r\n /**\r\n * update loaded milestone for the experience\r\n * @param experienceType - Experience Type to update\r\n */\r\n private updateExperienceLoadedMilestone(experienceType: string): void {\r\n const milestoneDataConnector = getMilestoneDataConnector();\r\n if (milestoneDataConnector) {\r\n MilestoneDataActions.updateExperienceCurrentState.getActionSender(milestoneDataConnector)\r\n .send([createExperienceStateUpdate(experienceType, ExperienceLoadingState.loaded, null, null)]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a namespace based on the passed in experience config info\r\n * @param experienceConfigInfo\r\n */\r\nexport function getExperienceNamespace(experienceConfigInfo: ChildExperienceConfigInfo, instanceIdOverride?: string): string {\r\n const instanceId = instanceIdOverride || (experienceConfigInfo && experienceConfigInfo.instanceId) || \"\";\r\n return getConfigIdString(experienceConfigInfo, instanceId);\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap, CommonActions, DataConnector } from \"@msnews/experiences-redux\";\r\nimport {\r\n AppError,\r\n ExperienceInitialPositionProps,\r\n ExperienceInitialProps\r\n} from \"@msnews/experiences-base\";\r\nimport {\r\n BaseExperienceConfig,\r\n ChildArrangementMetadata,\r\n ChildExperienceConfigInfo,\r\n ChildExperiencesDeferRenderType,\r\n ExperienceState,\r\n IRequestContext,\r\n appEnvironment,\r\n getConfigId,\r\n getExperienceType,\r\n resolver,\r\n tryAddOrderedTelemetryChild,\r\n tryStringifyJson\r\n} from \"@msnews/core\";\r\nimport { ChildWithInvalidExperience, ComponentConnectorAppErrors, LoadDataConnectorConfigFailed, LoadDataConnectorFailed, createError, logger, stringifyError } from \"@msnews/diagnostics\";\r\nimport { ConnectorNamespaces, ExperienceIds } from \"@msnews/experiences-constants\";\r\nimport { DeferralEventType, ExperienceMilestoneEventTypes, MilestoneDataActions, MilestoneDataConnector, UpdateTimingSignature, createTimingUpdate, getExperienceLoadDelegate, getExperienceRenderDelegate, pageRevealStartedObserver, requestPageRevealCompletedAsync, requestPageRevealStartedAsync, shouldTrackExperience } from \"@msnews/milestone-data\";\r\nimport { Dispatch, Store } from \"redux\";\r\nimport { DynamicReducer, dataConnectorInjector } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { IActionPayload, IReducer } from \"@msnews/experiences-redux-contracts\";\r\nimport { ObjectTelemetryContract, Telemetry, TelemetryContext, TelemetryObjectBase, TelemetryTags, TelemetryType } from \"@msnews/telemetry-contracts\";\r\nimport { PageInvalidationReasons, registerStaleRevealReact, trackExpWithPersistentDataUpdate, trackPageInvalidation } from \"@msnews/page-lifecycle-helpers\";\r\nimport { TelemetryObject, trackComponent } from \"@msnews/telemetry-core\";\r\nimport { canUseDOM, getLocationHref, getLocationSearch } from \"@msnews/isomorphic-util\";\r\n\r\nimport { ConfigProcessor } from \"@msnews/config-validator\";\r\nimport { ExperienceLoadInfo } from \"./ExperienceLoadInfo\";\r\nimport { ExperienceLoader } from \"../experience-loader/ExperienceLoader\";\r\nimport { IComponentConnector } from \"./IComponentConnector\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { getMilestoneDataConnector } from \"@msnews/milestone-data\";\r\nimport { instrumentPerf } from \"./ExperiencePerfTimeline\";\r\nimport { isEmpty } from \"lodash-es\";\r\nimport { isFunction } from \"util\";\r\nimport { networkErrorString } from \"./ComponentConnector.constants\";\r\nimport { subspaced } from \"react-redux-subspace\";\r\n\r\nexport type mapToPropsSignature = (state: TState, ownProps?: TProps) => TProps;\r\nexport type mapStateToPropsReturnType = TProps | mapToPropsSignature;\r\nexport type mapDispatchToPropsReturnType = TProps | mapToPropsSignature;\r\n\r\n/**\r\n * Map for making config-less data connectors faster to load\r\n *\r\n * HACK: HACK: HACK: This is a temporary hack until we can update CMS configs to remove\r\n * the HREF requirement for config-less connectors, so that we can opt out\r\n * of loading configs without having this special check. Need to do in phases\r\n * so that we're not breaking PROD users with old scripts.\r\n */\r\nexport const ConfiglessConnectors = {\r\n [ConnectorNamespaces.BingImageData]: true,\r\n [ConnectorNamespaces.TelemetryData]: true,\r\n [ConnectorNamespaces.TopSitesLayoutData]: true,\r\n [ConnectorNamespaces.PageClickTrackerData]: true,\r\n [ConnectorNamespaces.OfficeSharedData]: true,\r\n [ExperienceIds.pivotContentV2]: true\r\n};\r\n\r\n/**\r\n * Base class for a component connector. Every connected component in an app has a connector that inherits from this class\r\n * @class\r\n */\r\nexport abstract class ComponentConnector\r\n extends DataConnector\r\n implements IComponentConnector {\r\n\r\n /**\r\n * A map of child connectors. The key to the map is a concatenation: ExperienceType_ExperienceInstanceId.\r\n * The ExperienceType is the the same as the ExperienceId in the @msnews/experiences-constants ExperienceIds enum (i.e. River)\r\n * The ExperienceInstanceId is set in config, as part of the parent experience config. Which children get created and rendered\r\n * by a parent experience will be specific to that experience, so it will be up to the parent experience to determine the\r\n * instanceId of the children to be rendered by looking in its config object.\r\n * @type Map>\r\n */\r\n protected childMap?: Map> = new Map();\r\n\r\n /**\r\n * Telemetry object of the component. It is automatically populated by this class when experience calls onComponentConnect().\r\n */\r\n protected telemetryObject: TelemetryObjectBase;\r\n\r\n /**\r\n * All telemetry objects of all subcomponent\r\n * It constitutes an object that provides access to each of the telemetry object children of a provided telemetryObject\r\n * attribute that is passed to its contructor. Particularly useful when there are many telemetry object children that need to be accessed\r\n * anywhere in the experience, for example, to update their contracts or to render them within a particular DOM element.\r\n * A great example of how it could be used can be found in the Feedback dialog experience:\r\n * FeedbackDialog.telemetry.ts: https://microsoft.visualstudio.com/ICE/_git/msnews-experiences/pullrequest/4063110?_a=files&path=%2Fexperiences%2Ffeedback-dialog%2Fsrc%2FFeedbackDialog.telemetry.ts\r\n * Feedbackdialog.tsx: https://microsoft.visualstudio.com/ICE/_git/msnews-experiences/pullrequest/4063110?_a=files&path=%2Fexperiences%2Ffeedback-dialog%2Fsrc%2FFeedbackDialog.tsx\r\n */\r\n protected telemetryContext: TelemetryContext = undefined;\r\n\r\n /**\r\n * The telemetry tags to pass along as unhandled props for rendering\r\n */\r\n protected telemetryTags: TelemetryTags = null;\r\n\r\n /**\r\n * The group the experience belongs to, if applicable. This property is to be set as needed in the specific experience connectors\r\n */\r\n protected $experienceGroup: string = undefined;\r\n\r\n /**\r\n * The connected rendering component for the experience connector\r\n */\r\n private $connectedComponent: React.ComponentClass = undefined;\r\n\r\n /**\r\n * The connected rendering component ReactElement instance for the experience connector\r\n */\r\n private $componentInstance: React.ReactElement = undefined;\r\n\r\n /**\r\n * The connector props used to connect this connector to an experience\r\n */\r\n private $connectorProps: ExperienceInitialProps;\r\n\r\n /**\r\n * flag indicating if we should render when offline. Default is false\r\n */\r\n private $renderIfOffline = false;\r\n\r\n /**\r\n * flag indicating if experience is liable to be stale\r\n */\r\n private $isStale = false;\r\n\r\n /**\r\n * The experience type\r\n */\r\n private $experienceType: string = undefined;\r\n\r\n /**\r\n * failsafe timeout(ms) to render child experiences based on milestone batch load strategy\r\n */\r\n private $maxWaitToBatchRenderChildExperiences = 4000;\r\n\r\n /**\r\n * The milestone data connector (if it exists)\r\n */\r\n private $milestoneDataConnector: MilestoneDataConnector = undefined;\r\n\r\n /**\r\n * Gets the connected component for this experience\r\n */\r\n public get connectedComponent(): React.ComponentClass { return this.$connectedComponent; }\r\n\r\n /**\r\n * Gets the component instance for this experience. This is used for rendering the experience\r\n */\r\n public get componentInstance(): React.ReactElement { return this.$componentInstance; }\r\n\r\n /**\r\n * Sets the component instance for this experience\r\n */\r\n public set componentInstance(value: React.ReactElement) { this.$componentInstance = value; }\r\n\r\n /**\r\n * Gets the experience type for this experience.\r\n */\r\n public get experienceType(): string { return this.$experienceType; }\r\n\r\n /**\r\n * Sets the renderIfOffline flag\r\n */\r\n public set renderIfOffline(value: boolean) { this.$renderIfOffline = value; }\r\n\r\n /**\r\n * Gets the staleLiable flag\r\n */\r\n public get isStale(): boolean { return this.$isStale; }\r\n\r\n /**\r\n * Gets the staleLiable flag\r\n */\r\n public set isStale(value: boolean) { this.$isStale = value; }\r\n\r\n /**\r\n * Get a map of the child experience component instances, which is appropriate for passing into the\r\n * inspector function as part of mapStateToProps\r\n */\r\n public get childComponentInstanceList(): { [instanceId: string]: React.ReactElement; } {\r\n const childComponentList: { [instanceId: string]: React.ReactElement; } = {};\r\n this.childMap.forEach((connector, key) => {\r\n childComponentList[key] = connector.componentInstance;\r\n });\r\n return childComponentList;\r\n }\r\n\r\n /**\r\n * Construct a new Component connector\r\n * @constructor\r\n * @param { string } namespace The redux subspace namespace for the connector\r\n * @param { string } parentNamespace The redux subspace namespace for the parent connector, if it exists\r\n * @param { DynamicReducer } rootReducer The root reducer for the Application\r\n * @param { IReducer } reducer The reducer for this connector instance\r\n * @param { Store} parentStore The parent store (or redux subspace) that this connector will be a subspace within\r\n * @param { TConfig } config Param containing the config for the connector\r\n * @param { IRequestContext } requestContext The injected request context\r\n */\r\n public constructor(\r\n namespace: string,\r\n parentNamespace: string,\r\n rootReducer: DynamicReducer,\r\n reducer: IReducer,\r\n parentStore: Store,\r\n config: TConfig,\r\n requestContext: IRequestContext\r\n ) {\r\n super(namespace, parentNamespace, rootReducer, reducer, parentStore, config, requestContext);\r\n this.selectComponentState = this.selectComponentState.bind(this);\r\n\r\n // To get the experience type, split the namespace at the first \"_\" and use the first substring\r\n // as the type. The convention for namespace is: ExperienceType_configHref_InstanceId. If there is no instanceId, then then namespace is just: ExperienceType\r\n const namespaceArray = namespace.split(\"_\");\r\n this.$experienceType = namespaceArray[0];\r\n // configNamespace includes experienceType + index path\r\n const configNamespace = (namespaceArray.length > 1) ? this.$experienceType + namespaceArray[1] : this.$experienceType;\r\n\r\n this.config = ConfigProcessor.processConfig(this.config, configNamespace) as TConfig;\r\n\r\n // update if experience is staleable\r\n this.setupForPageReveal();\r\n }\r\n\r\n /**\r\n * Redux mapper used to map the current state to props the component use to render itself.\r\n * @method\r\n * @param {TState} state The current state of the component.\r\n * @param {any} ownProps The set of properties that is passed in from where the component is created.\r\n * This parameter should be not nil only when the component is supposed to have part of its properties coming from a parent component.\r\n * It can be omitted when the entire set of props is derived from the state.\r\n * @returns {mapStateToPropsReturnType} It can either return the set of mapped props as an object of type TProps derived from a state\r\n * object of type TState or a function that will be used to map the state to the props.\r\n */\r\n public abstract mapStateToProps(state: TState, ownProps?: any): mapStateToPropsReturnType;\r\n\r\n /**\r\n * Inject into props redux action creators.\r\n * @method\r\n * @param {Dispatch} dispatch The redux dispatch function.\r\n * @param {any} ownProps The set of properties that is passed from where the component is created.\r\n * This parameter should be not nil only when the component is supposed to have part of its properties coming from a parent component.\r\n * It can be omitted when the entire set of props is derived from the state.\r\n * @returns {TProps} An enriched set of props.\r\n */\r\n public mapDispatchToProps(dispatch: Dispatch, ownProps?: any): mapDispatchToPropsReturnType {\r\n return {} as TProps;\r\n }\r\n\r\n /**\r\n * Overrides the default redux mergeProps function that will add a callback function for reporting experience milestone timing\r\n * @method\r\n * @param {TState} stateProps The set of properties from mapStateToProps.\r\n * @param {TProps} dispatchProps The set of properties from mapDispatchToProps.\r\n * @param {any} ownProps The set of properties that is passed from where the component is created.\r\n * @returns {TProps} The merged set of props.\r\n */\r\n public mergeProps(stateProps: TProps, dispatchProps: TProps, ownProps: any): TProps {\r\n // WARNING WARNING WARNING. Some render engines, like preact will take dependencies on some props that may be set to undefined, so the\r\n // merge must preserve properties that are undefined in the source (i.e stateProps) in the result.\r\n // Specific to preact depends on the constructor property being explicity set to undefined. When an element is created by preact\r\n // the constructor property is set to undefined, and that must be preserved by this merge function.\r\n // Avoid using lodash merge, as it does not preserve the undefined properties\r\n\r\n // If we are in Mns Creator Dashboard mode, then set props for the config href, and experience type. These will get rendered\r\n // on each experience as unhandled props\r\n let mnsDashBoardProps = {};\r\n if (appEnvironment.ShowMnsCreatorDashboard) {\r\n mnsDashBoardProps = {\r\n \"data-config-href\": this.configHref,\r\n \"data-experience-type\": this.experienceType\r\n };\r\n }\r\n\r\n // The onExperienceMilestoneTimingUpdate and isStale prop is set here, so that it is injected into the resulting properties for all experiences.\r\n return {\r\n onExperienceMilestoneTimingUpdate: this.onExperienceMilestoneTimingUpdate,\r\n isStale: this.isStale,\r\n ...mnsDashBoardProps,\r\n ...ownProps,\r\n ...stateProps,\r\n ...dispatchProps,\r\n ...(this.requestContext && { requestContext: this.requestContext } || {})\r\n };\r\n }\r\n\r\n /**\r\n * Connects the passed in component to the redux store/state of the connector\r\n * @method\r\n * @param {React.ComponentType} componentToConnect The react element to connect.\r\n * @param {any} connectorProps Optional connector props to pass to the onComponentConnect call.\r\n * @returns {React.ComponentClass} The Redux connected component.\r\n */\r\n public async connectComponent(componentToConnect: React.ComponentType, connectorProps?: ExperienceInitialProps): Promise> {\r\n\r\n // If we are not online, and we should not render offline, then just return undefined. This will prevent the experience from ever\r\n // rendering\r\n if (canUseDOM() && !navigator.onLine && !this.$renderIfOffline) {\r\n if (connectorProps && connectorProps.onAppErrorCallback) {\r\n connectorProps.onAppErrorCallback(\r\n {\r\n id: 404,\r\n message: networkErrorString,\r\n source: \"ComponentConnector.ts\",\r\n severity: 0\r\n }\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n const connectMeasureEnd = this.perfTimeline && this.perfTimeline.startMeasure(\"connect\").endMeasure;\r\n\r\n // Call the onComponentConnect method. This is done first, so that the connector can see the initialProps before mapStateToProps is called\r\n // onComponentConnect is async, so we need to wait for it to complete first\r\n await this.onComponentConnect(connectorProps);\r\n\r\n if (this.telemetryObject) {\r\n componentToConnect = trackComponent(componentToConnect, this.telemetryObject);\r\n }\r\n\r\n // if this experience should be instrumented for perf, do so and get the perf HOC\r\n if (this.perfTimeline) {\r\n componentToConnect = instrumentPerf(componentToConnect, this.perfTimeline);\r\n this.mapStateToProps = this.perfTimeline.instrumentFunc(\"mapStateToProps\", this.mapStateToProps, this);\r\n this.mapDispatchToProps = this.perfTimeline.instrumentFunc(\"mapDispatchToProps\", this.mapDispatchToProps, this);\r\n this.mergeProps = this.perfTimeline.instrumentFunc(\"mergeProps\", this.mergeProps, this);\r\n }\r\n\r\n // Connect the component to redux (will cause mapStateToProps to be called)\r\n const connectedComponent: React.ComponentClass = connect(\r\n this.mapStateToProps.bind(this),\r\n this.mapDispatchToProps.bind(this),\r\n this.mergeProps.bind(this),\r\n { pure: true }\r\n )(componentToConnect);\r\n\r\n // Wrap the redux connected component in a Subspace Provider, and set that as the connectedComponent for this connector\r\n this.$connectedComponent = subspaced(this.selectComponentState, this.namespace)(connectedComponent);\r\n\r\n if (connectMeasureEnd) {\r\n connectMeasureEnd();\r\n }\r\n\r\n return this.$connectedComponent;\r\n }\r\n\r\n /**\r\n * This method reads the experience config and adds any ordinal(index) based child experiences specified in the config to the input\r\n * ChildExperienceConfigInfo array at the specified ordinal position defined in config.\r\n * @method\r\n * @param {ExperienceLoadInfo[]} ExperienceLoadInfoList Array of ChildExperienceConfigInfo objects\r\n * @param {number} mergeStartPosition MergeStartPosition represents the start position for the merge. If your experience only need to call this once,\r\n * it should be 1. For deep river kind of scenario, you would need to pass the updated merge start position. StartPosition = lastEndPosition + 1\r\n * @returns {ExperienceLoadInfo[]}\r\n */\r\n public mergeOrdinalChildExperiences(\r\n experienceInfoList: ExperienceLoadInfo[],\r\n mergeStartPosition: number,\r\n callback?: (experienceInfo: ExperienceLoadInfo) => void\r\n ): ExperienceLoadInfo[] {\r\n\r\n if (!experienceInfoList) {\r\n return null;\r\n }\r\n\r\n if (mergeStartPosition < 1) {\r\n Telemetry.sendAppErrorEvent({\r\n ...ComponentConnectorAppErrors.ListStartPositionInvalid,\r\n message: \"listStartFrom must be greater than 0.\"\r\n });\r\n\r\n return experienceInfoList;\r\n }\r\n\r\n const config = this.config as BaseExperienceConfig;\r\n\r\n if (!config.additionalChildExperiences || config.additionalChildExperiences.length === 0) {\r\n return experienceInfoList;\r\n }\r\n\r\n const ordinalBlockForCurrentColumn = ConfigProcessor.getOrdinalObjectForCurrentBreakpoint(config.additionalChildExperiences);\r\n let mergeEndPos = mergeStartPosition + experienceInfoList.length;\r\n\r\n // Following code loops through the ChildArrangementMetadata array and inserts an additional child experience if startPosition provided in config is greater than mergeStartPosition\r\n // and less than mergeEndPos which is mergeStartPosition + length of the input childConfigInfoList\r\n ordinalBlockForCurrentColumn.children.forEach((childArrangementMetadata) => {\r\n const childExpArrangement = childArrangementMetadata.arrangement;\r\n\r\n // TS requires to define this explicitly and then assign it in line 234.\r\n const positionProps: ExperienceInitialPositionProps = { experienceArrangement: childExpArrangement };\r\n\r\n if (childExpArrangement && childExpArrangement.startPosition >= mergeStartPosition && childExpArrangement.startPosition <= mergeEndPos) {\r\n const insertAt = childExpArrangement.startPosition - mergeStartPosition;\r\n const experienceInfo: ExperienceLoadInfo = {\r\n configInfo: childArrangementMetadata.childExperienceConfigInfo,\r\n initialProps: positionProps\r\n };\r\n\r\n experienceInfoList.splice(insertAt, 0, experienceInfo);\r\n mergeEndPos++;\r\n\r\n if (typeof callback === \"function\") {\r\n callback(experienceInfo);\r\n }\r\n }\r\n });\r\n\r\n return experienceInfoList;\r\n }\r\n\r\n /**\r\n * This method is called when a component is connected to the connectors' store.\r\n * This method can be overridden and used by connectors to perform one time initialization functions\r\n * @method\r\n * @param {any} connectorProps Optional initial props passed into the onComponentConnect call.\r\n * @returns {void}\r\n */\r\n public async onComponentConnect(connectorProps?: ExperienceInitialProps): Promise {\r\n\r\n // save the last connected connector props\r\n this.$connectorProps = connectorProps;\r\n\r\n // Setup telemetry props for this experience.\r\n if (connectorProps) {\r\n // ExperienceTelemetry is passed as an initial prop when the parent has precreated the telemetry object for this component.\r\n // This allows the parent to create all its child components' telemetry objects in a deterministic order, thus ensuring the\r\n // telemetry ordinalIDs are always generated in a deterministic manner. This is important for hydrating prerendered pages.\r\n this.telemetryObject = this.telemetryObject || connectorProps.experienceTelemetry;\r\n\r\n if (!this.telemetryObject) {\r\n const telemetryContract = {\r\n type: TelemetryType.Module,\r\n name: this.$experienceType,\r\n content: {}\r\n } as ObjectTelemetryContract;\r\n\r\n if (connectorProps.parentTelemetry && !isEmpty(connectorProps.parentTelemetry)) {\r\n this.telemetryObject = connectorProps.parentTelemetry.addOrUpdateChild(telemetryContract, this.telemetryObject);\r\n } else {\r\n this.telemetryObject = new TelemetryObject(telemetryContract);\r\n }\r\n }\r\n\r\n // generate the telemetry tags to pass along for rendering\r\n this.telemetryTags = this.telemetryObject.render();\r\n\r\n // Override the onAppError function if passed one.\r\n if (isFunction(connectorProps.onAppErrorCallback)) {\r\n this.onAppError = connectorProps.onAppErrorCallback;\r\n }\r\n }\r\n\r\n // load data connectors\r\n // Experiences relying on looking up data connectors need await here. Data Connectors should not have any blocking calls\r\n // in the constructor.\r\n await this.loadDataConnectors();\r\n\r\n for (const injectedDataConnector of this.injectedDataConnectors) {\r\n // Setup the initial state\r\n CommonActions.dataConnectorMergeInit.getActionSender(this).send(injectedDataConnector);\r\n\r\n // Register the merge so we get updates\r\n dataConnectorInjector.registerInjection(this.fullNamespace, injectedDataConnector);\r\n }\r\n\r\n // load up child experiences\r\n await this.onLoadChildExperiences();\r\n }\r\n\r\n /**\r\n * Gets a new instance of a ReactElement for the connected Component for this connector, that can be used to render\r\n * the experience.\r\n * This method will replace any existing ReactElement instance that has been previously created.\r\n * @param ownProps optional props to be passed into the connected components' mapStateToProps method\r\n */\r\n public getNewComponentInstance(ownProps?: TProps): React.ReactElement {\r\n // If there is a connected component for this connector, then create an instance of it.\r\n if (this.$connectedComponent) {\r\n const newProps = { ...ownProps, key: this.namespace };\r\n this.$componentInstance = React.createElement(this.$connectedComponent, newProps);\r\n }\r\n\r\n return this.$componentInstance;\r\n }\r\n\r\n /**\r\n * Report a milestone timing event\r\n * @param milestoneType The type of milestone timing is being reported for\r\n * @param startTime The start time (if defined)\r\n * @param endTime The end time (if defined)\r\n */\r\n protected onExperienceMilestoneTimingUpdate = (\r\n milestoneType: ExperienceMilestoneEventTypes,\r\n startTime?: number,\r\n endTime?: number\r\n ) => {\r\n\r\n if (!shouldTrackExperience(this.experienceType)) {\r\n return;\r\n }\r\n\r\n // Do a onetime check to get the Milestone Data Connector instance\r\n if (this.$milestoneDataConnector === undefined) {\r\n this.$milestoneDataConnector = getMilestoneDataConnector() || null;\r\n }\r\n\r\n // Skip the Milestone update if we don't have a Milestone Data connector\r\n if (!this.$milestoneDataConnector) {\r\n return;\r\n }\r\n\r\n switch (milestoneType) {\r\n case ExperienceMilestoneEventTypes.domComplete:\r\n this.updateTiming(MilestoneDataActions.updateDomCompleteTiming, startTime, endTime);\r\n break;\r\n\r\n case ExperienceMilestoneEventTypes.initialized:\r\n this.updateTiming(MilestoneDataActions.updateInitTiming, startTime, endTime);\r\n break;\r\n\r\n case ExperienceMilestoneEventTypes.rendered:\r\n this.updateTiming(MilestoneDataActions.updateRenderTiming, startTime, endTime);\r\n break;\r\n\r\n case ExperienceMilestoneEventTypes.visuallyReady:\r\n this.updateTiming(MilestoneDataActions.updateVisuallyReadyTiming, startTime, endTime);\r\n break;\r\n\r\n case ExperienceMilestoneEventTypes.startLoading:\r\n this.updateTiming(MilestoneDataActions.updateStartLoadingTiming, startTime, endTime);\r\n break;\r\n\r\n case ExperienceMilestoneEventTypes.staleRevalidationComplete:\r\n MilestoneDataActions.updateExperiencePublicState.getActionSender(this.$milestoneDataConnector).send({\r\n experienceType: this.$experienceType,\r\n experienceGroup: this.$experienceGroup,\r\n experienceInstance: this.namespace,\r\n eventType: ExperienceMilestoneEventTypes.staleRevalidationComplete\r\n });\r\n break;\r\n\r\n default:\r\n // do nothing for the default cause, since there is no default timing that can be updated\r\n logger.log(`Milestone timing update was attempted for an unknown milestone type: ${milestoneType}`);\r\n break;\r\n }\r\n };\r\n\r\n /**\r\n * This method reads the experience config and returns child experiences placed using index based position.\r\n * @method\r\n * @returns {ExperienceLoadInfo[]}\r\n */\r\n protected getOrdinalChildExperiences(): ExperienceLoadInfo[] {\r\n const config = this.config as BaseExperienceConfig;\r\n\r\n if (!config.additionalChildExperiences || config.additionalChildExperiences.length === 0) {\r\n return null;\r\n }\r\n\r\n const result: ExperienceLoadInfo[] = [];\r\n const ordinalBlockForCurrentColumn = ConfigProcessor.getOrdinalObjectForCurrentBreakpoint(config.additionalChildExperiences);\r\n\r\n ordinalBlockForCurrentColumn.children.forEach((childArrangementMetadata) => {\r\n const childExpArrangement = childArrangementMetadata.arrangement;\r\n\r\n // TS requires to define this explicitly and then assign it in line 234.\r\n const positionProps: ExperienceInitialPositionProps = { experienceArrangement: childExpArrangement };\r\n result.push({\r\n configInfo: childArrangementMetadata.childExperienceConfigInfo,\r\n initialProps: positionProps\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Loads all the children experiences defined under the configuration in parallel.\r\n * @returns {Promise{void}[]} - an array of promises that loads all the children experiences.\r\n */\r\n protected async onLoadChildExperiences(): Promise {\r\n // Load all the children.\r\n // TODO: passing in the parent's connector props to children verbatim seems wrong.\r\n // However experiences such as spotlight seems to be loading it using this method by\r\n // passing child specific initial props from all the way from the top level page experience,\r\n // so need to resolve that before removing the this.$connectorProps parameter.\r\n await this.loadChildrenExperiences(ConfigProcessor.getChildrenExperienceConfigInfos(this.config, this.$connectorProps), this.$connectorProps);\r\n }\r\n\r\n /**\r\n * Load a list of child experiences\r\n * @param children - The list (array) of child experiences to be loaded\r\n * @param childConnectorProps - The connector props to pass to each child experience as it is loaded\r\n * @returns {Promise{void}} - the async operation that denotes loading of all the children.\r\n */\r\n protected async loadChildrenExperiences(children: ChildExperienceConfigInfo[], childConnectorProps?: ExperienceInitialProps): Promise {\r\n if (!children || children.length === 0) {\r\n return;\r\n }\r\n\r\n const childExpsToLoadImmediately = [];\r\n\r\n const reRenderCallback = () => {\r\n this.readyExperienceToRender(children);\r\n };\r\n\r\n for (const child of children) {\r\n // Call tryAddOrderedTelemetryChild to ensure child telemetry is constructed in order and thus the child telemetry\r\n // ordinal IDs are deterministic. Otherwise ordinal IDs can differ between server side renders and client side hydration.\r\n const promiseDependency = this.startProcessingChildExperience(child, reRenderCallback, {\r\n ...childConnectorProps,\r\n experienceTelemetry: tryAddOrderedTelemetryChild(this.telemetryObject, getExperienceType(child))\r\n });\r\n childExpsToLoadImmediately.push(promiseDependency);\r\n }\r\n\r\n // NOTE: In order to make sure that the fail-fast behavior of Promise.all doesn't kick in, we're wrapping the individual promises\r\n // with a catch block and ensuring that they always resolve (never reject/throw error). If we don't do this, then\r\n // even if one child promise gets rejected early, then the parent experience might fail to load the remaining children.\r\n // childExpsToLoadImmediately.map(async childExp => await childExp());\r\n await Promise.all(childExpsToLoadImmediately);\r\n }\r\n\r\n /**\r\n * Gets the list of data connectors to inject into this experience.\r\n */\r\n protected get injectedDataConnectors(): ConnectorNamespaces[] {\r\n return [];\r\n }\r\n\r\n /**\r\n * Load a list of data connectors provided in the experience config\r\n * @returns {Promise{void}} - the async operation that denotes loading of all the children.\r\n */\r\n protected async loadDataConnectors(): Promise {\r\n await Promise.all(\r\n ConfigProcessor.getChildrenDataConnectorConfigInfos(this.config).map(connector =>\r\n this.loadDataConnector(connector)));\r\n }\r\n\r\n /**\r\n * Loads a single child experience with the given connector initial props.\r\n * @param configInfo - the child experience config info\r\n * @param childConnectorProps - optional initial props to pass to connector.\r\n * @returns {Promise{void}} - the async operation that denotes loading of the child.\r\n */\r\n protected async loadChildExperience(\r\n configInfo: ChildExperienceConfigInfo,\r\n childConnectorProps?: ExperienceInitialProps\r\n ): Promise {\r\n // If the experience is delay loaded, load it through the same flow as composition ones so that MilestoneData deferred loading logic is intact.\r\n const milestoneDependencyToLoadChildExp = getExperienceLoadDelegate(getExperienceType(configInfo));\r\n if (milestoneDependencyToLoadChildExp) {\r\n await this.loadChildrenExperiences([configInfo], childConnectorProps);\r\n return;\r\n }\r\n\r\n const childConnector = await this.getChildExperienceConnector(configInfo, childConnectorProps);\r\n if (!childConnector) {\r\n configInfo.state = ExperienceState.Failed;\r\n return;\r\n }\r\n\r\n this.addConnectorToChildMap(configInfo, childConnector);\r\n }\r\n\r\n /**\r\n * Provides the connector props to be passed into the onComponentConnect method for any children that are created for this\r\n * experience connector\r\n * @param childExperienceType The experience Type of the child experience being loaded\r\n * @param childExperienceInstanceId The experienceInstance Id of the child experience being loaded\r\n */\r\n protected getChildExperienceConnectorProps(childExperienceType: string, childExperienceInstanceId: string): ExperienceInitialProps {\r\n return (\r\n {\r\n parentTelemetry: this.telemetryObject,\r\n context: this.$connectorProps && this.$connectorProps.context,\r\n onAppErrorCallback: this.onAppError,\r\n requestContext: this.requestContext\r\n });\r\n }\r\n\r\n /**\r\n * function to call an action to reRender experience\r\n */\r\n protected reRenderExperience(): void {\r\n CommonActions.renderExperience.getActionSender(this).send();\r\n }\r\n\r\n /**\r\n * function to re-initialize experience state, re-fetch data if stale.\r\n */\r\n protected reInitExperienceState(): void {\r\n CommonActions.renderExperience.getActionSender(this).send();\r\n }\r\n\r\n /**\r\n * The optional function for Experiences to call use when an error occurs.\r\n * Defined as empty function so clients don't need to check it.\r\n * Passed to child experiences. Used mainly outside of Peregrine. e.g. Office page.\r\n * NOTE: we need to default to track.trackAppErrorEvent for PH components.\r\n */\r\n protected onAppError: ((error: AppError) => void) = (err) => Telemetry.sendAppErrorEvent(err);\r\n\r\n /**\r\n * Invoked when the experience is stale and needs to be updated. Override this method to refresh the experience\r\n * if it can get stale.\r\n * @returns True if the experience took an action on being stale.\r\n */\r\n protected revalidateExperienceStaleState(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Revalidate the experience if needed and store outcome in isStale.\r\n */\r\n private revalidateIfNeeded = () => {\r\n this.isStale = this.revalidateExperienceStaleState();\r\n return this.isStale;\r\n };\r\n\r\n /**\r\n * track experience changes for pageReveal\r\n * @param expType - experience type to be revalidated\r\n */\r\n protected trackExperienceChangesForPageReveal(expType?: string): void {\r\n // track changes in persistent store to be used on pageReveal\r\n trackExpWithPersistentDataUpdate(expType ? expType : this.experienceType);\r\n }\r\n\r\n /**\r\n * track experience changes for pageReveal\r\n * @param invalidationReason - page invalidation reason\r\n */\r\n protected trackPageInvalidationOnReveal(invalidationReason: PageInvalidationReasons): void {\r\n // track changes in persistent store for page invalidation on pageReveal\r\n trackPageInvalidation(invalidationReason);\r\n }\r\n\r\n /**\r\n * Base implementation for page visible, resolves when page moves from hidden to visible.\r\n * This is currently used for Prerender PageReveal scenario.\r\n * In future this can be extended for page lifecycle api events.\r\n */\r\n protected async requestPageVisibleAsync(): Promise {\r\n return await requestPageRevealStartedAsync();\r\n }\r\n\r\n /**\r\n * Base implementation for page visible complete, resolves when page is ready to be revealed\r\n * This is currently used for Prerender PageReveal scenario.\r\n * In future this can be extended for page lifecycle api events.\r\n */\r\n protected async requestPageVisibleCompleteAsync(): Promise {\r\n return await requestPageRevealCompletedAsync();\r\n }\r\n\r\n /**\r\n * Initial setup for page reveal\r\n */\r\n private setupForPageReveal() {\r\n const experienceConfig = this.config as BaseExperienceConfig;\r\n // mock config for staleness if url override is provided\r\n this.mockStalenessConfig(experienceConfig);\r\n\r\n if (experienceConfig && experienceConfig.stalenessInfo && experienceConfig.stalenessInfo.isStaleCheckRequired) {\r\n registerStaleRevealReact({ experienceType: this.$experienceType, thresholdMinutes: experienceConfig.stalenessInfo.staleThreshold, callback: this.revalidateIfNeeded });\r\n }\r\n }\r\n\r\n /**\r\n * Common helper to send a milestone timing update for a specific action.\r\n */\r\n private updateTiming(actionMap: ActionMap, startTime?: number, endTime?: number): void {\r\n actionMap.getActionSender(this.$milestoneDataConnector)\r\n .send(createTimingUpdate(this.$experienceType, this.$experienceGroup, this.namespace, startTime, endTime));\r\n }\r\n\r\n /**\r\n * Initializes connector and connected component for a given child experience.\r\n * @param configInfo - the child experience config info\r\n * @param childConnectorProps - optional initial props to pass to connector.\r\n * @returns {Promise>} - the async operation that returns the connector for child experience.\r\n */\r\n private async getChildExperienceConnector(\r\n configInfo: ChildExperienceConfigInfo,\r\n childConnectorProps?: ExperienceInitialProps): Promise> {\r\n\r\n const experienceType = getExperienceType(configInfo);\r\n\r\n try {\r\n // Get an experience loader instance for the child experience\r\n const loader = new ExperienceLoader(configInfo, null, this.fullNamespace, this.store, this.requestContext, experienceType);\r\n\r\n // Get the connector for the child experience, and add it to the child connector map\r\n await loader.loadConnector();\r\n const { connector: childConnector } = loader;\r\n\r\n // Get the connected component for the child experience.\r\n await loader.getConnectedExperience({\r\n // get core connector props\r\n ...this.getChildExperienceConnectorProps(experienceType, configInfo.instanceId),\r\n // add any override props\r\n ...(childConnectorProps || {})\r\n });\r\n\r\n // Get the initial component instance for the child. The experience connector can get a new instance if it needs to do special\r\n // processing (i.e. passing in OwnProps)\r\n childConnector.getNewComponentInstance();\r\n\r\n return childConnector;\r\n } catch (error) {\r\n // Remove this config from cache.\r\n const configId = getConfigId(configInfo);\r\n if (typeof configId === \"string\") {\r\n resolver.removeCachedConfig(configId);\r\n }\r\n // TODO: else Git Configs\r\n\r\n // On server side we need to rethrow error so client side rendering takes over, this is to prevent rendering a mismatched page\r\n if (!canUseDOM()) {\r\n throw error;\r\n }\r\n\r\n // Log an app error if the loader failed to load for whatever reason\r\n /// NOTE: DO NOT throw Error or reject promise here, or else the parent might not load the remaining child experiences.\r\n Telemetry.sendAppErrorEvent({\r\n ...ComponentConnectorAppErrors.BundleLoadError,\r\n message: `Failed to load experience ${experienceType || \"\"}`,\r\n pb: {\r\n ...ComponentConnectorAppErrors.BundleLoadError.pb,\r\n customMessage: `${JSON.stringify(configInfo)}, with error: ${error}`\r\n }\r\n });\r\n\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Load a single data connector\r\n * @param configInfo - data connector config info object\r\n * @returns {Promise{void}} - the async operation that denotes loading of all the children.\r\n */\r\n protected async loadDataConnector(configInfo: ChildExperienceConfigInfo): Promise {\r\n\r\n // Get an experience loader instance for the child experience\r\n const configId = getConfigId(configInfo);\r\n if (!configId) {\r\n\r\n // Log an app error if the loader failed to load for whatever reason\r\n Telemetry.sendAppErrorEvent({\r\n ...LoadDataConnectorConfigFailed,\r\n message: \"configInfo or Href is null while loading data connector\",\r\n pb: {\r\n ...LoadDataConnectorConfigFailed.pb,\r\n customMessage: tryStringifyJson(configInfo)\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const experienceType = getExperienceType(configInfo);\r\n\r\n try {\r\n const loader = new ExperienceLoader(\r\n // if it's a config-less experience type, do not pass in the HREF to prevent loading the config.\r\n // TODO: after deployment, we need to update configs of config-less connectors so that we don't need\r\n // a special check like this, and instead the empty HREF can be directly set in the config.\r\n // Need to do this in a phased approach so that we don't break PROD users with old scripts.\r\n experienceType && ConfiglessConnectors[experienceType]\r\n ? null\r\n : configInfo,\r\n \"\",\r\n \"\",\r\n PageBase.getInstance().store,\r\n this.requestContext,\r\n experienceType\r\n );\r\n\r\n // Get the connector for the child experience, and add it to the child connector map\r\n await loader.loadConnector(true);\r\n } catch (error) {\r\n // Log an app error if the loader failed to load for whatever reason\r\n /// NOTE: DO NOT throw Error or reject promise here, or else the parent might not load the remaining child experiences.\r\n Telemetry.sendAppErrorEvent(createError(\r\n LoadDataConnectorFailed,\r\n `Data connector loading failed for ${experienceType || \"\"}`,\r\n `${tryStringifyJson(configInfo)}, with error: ${error}`\r\n ));\r\n }\r\n }\r\n\r\n /**\r\n * Select and return the proper inner state for the component. The base DataConnector manages the wrapping of the state\r\n * and so it's getCurrentState() method is used to get the inner state (TState) for the connected component\r\n * NOTE: The signature of this component requires a state parameter, so that it can be passed into the subspaced()\r\n * method that is used to connect the component to state\r\n * @param state For this implementation, this parameter is ignored, since the actual state is managed by the base DataConnector\r\n */\r\n private selectComponentState(state: TParentState): TState {\r\n return (this.getCurrentState());\r\n }\r\n\r\n /**\r\n * Start lifecycle of a child experience\r\n * @param configInfo - the child experience config info\r\n * @param reRenderCallback - Render callback to call when dependencies are resolved\r\n * @param childConnectorProps - child experience connector props\r\n * @returns {Promise{void}} - the async operation that denotes loading of the child.\r\n */\r\n private async startProcessingChildExperience(\r\n configInfo: ChildExperienceConfigInfo,\r\n reRenderCallback: () => void,\r\n childConnectorProps?: ExperienceInitialProps\r\n ): Promise {\r\n\r\n const milestoneDependencyToLoadChildExp = getExperienceLoadDelegate(getExperienceType(configInfo));\r\n\r\n if (milestoneDependencyToLoadChildExp && milestoneDependencyToLoadChildExp.shouldResolve) {\r\n // Don't load delayed children on server side to avoid HTML mismatches\r\n if (canUseDOM()) {\r\n let addTimeout = true;\r\n\r\n if (milestoneDependencyToLoadChildExp.deferralType === DeferralEventType.CustomEventBasedDeferral) {\r\n addTimeout = false;\r\n configInfo.state = ExperienceState.Unknown;\r\n }\r\n\r\n this.resolveDependency(\r\n configInfo,\r\n milestoneDependencyToLoadChildExp.shouldResolve,\r\n () => this.loadAndRenderExperience(configInfo, reRenderCallback, true, childConnectorProps),\r\n addTimeout\r\n );\r\n }\r\n } else {\r\n await this.loadAndRenderExperience(configInfo, reRenderCallback, false, childConnectorProps);\r\n }\r\n }\r\n\r\n /**\r\n * load and render experience\r\n * @param childExpInfo - the child experience config info\r\n * @param reRenderCallback - Render callback to call when dependencies are resolved\r\n * @param delayLoaded - whether this experience is delay loaded or not\r\n * @param childConnectorProps - child experience connector props\r\n * @returns {Promise{void}} - the async operation that denotes loading of the child.\r\n */\r\n private async loadAndRenderExperience(\r\n childExpInfo: ChildExperienceConfigInfo,\r\n reRenderCallback: () => void,\r\n delayLoaded: boolean,\r\n childConnectorProps?: ExperienceInitialProps\r\n ): Promise {\r\n\r\n const experienceType = getExperienceType(childExpInfo);\r\n const configId = getConfigId(childExpInfo);\r\n\r\n // Get an experience loader instance for the child experience\r\n if (!childExpInfo\r\n || (!configId && !ConfiglessConnectors[experienceType])\r\n || !childExpInfo.instanceId) {\r\n\r\n // Log an app error if the loader failed to load for whatever reason\r\n Telemetry.sendAppErrorEvent({\r\n ...ChildWithInvalidExperience,\r\n message: `Attempted to load child with invalid experience ${experienceType || \"\"}`,\r\n pb: {\r\n ...ChildWithInvalidExperience.pb,\r\n customMessage: tryStringifyJson(childExpInfo)\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n try {\r\n const connector = await this.getChildExperienceConnector(childExpInfo, childConnectorProps);\r\n\r\n if (!connector) {\r\n childExpInfo.state = ExperienceState.Failed;\r\n return;\r\n }\r\n\r\n const milestoneDependencyToRenderChildExp = getExperienceRenderDelegate(experienceType);\r\n\r\n if (milestoneDependencyToRenderChildExp && milestoneDependencyToRenderChildExp.shouldResolve) {\r\n this.resolveDependency(\r\n childExpInfo,\r\n milestoneDependencyToRenderChildExp.shouldResolve, () => {\r\n childExpInfo.state = ExperienceState.ReadyToRender;\r\n this.addConnectorToChildMap(childExpInfo, connector);\r\n reRenderCallback();\r\n },\r\n true\r\n );\r\n } else {\r\n childExpInfo.state = ExperienceState.ReadyToRender;\r\n this.addConnectorToChildMap(childExpInfo, connector);\r\n if (delayLoaded) {\r\n reRenderCallback();\r\n }\r\n }\r\n } catch (error) {\r\n // On server side we need to rethrow error so client side rendering takes over, this is to prevent rendering a mismatched page\r\n if (!canUseDOM()) {\r\n throw error;\r\n }\r\n\r\n childExpInfo.state = ExperienceState.Failed;\r\n\r\n // Log an app error if the loader failed to delayload\r\n Telemetry.sendAppErrorEvent(\r\n createError(\r\n ComponentConnectorAppErrors.ChildDelayLoadError,\r\n `Attempted to delay load child ${experienceType} and failed as associated deferral promise returned an error`,\r\n stringifyError(error)\r\n )\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * add connector to child map\r\n * @param configInfo - the child experience config info\r\n * @param childConnector - child experience connector\r\n */\r\n private addConnectorToChildMap(configInfo: ChildExperienceConfigInfo, childConnector: IComponentConnector): void {\r\n // If the experience loaded, and we got the connected component, then add it to the child map,\r\n // as long as we have not seen this child before\r\n if (!this.childMap.has(configInfo.instanceId)) {\r\n this.childMap.set(configInfo.instanceId, childConnector);\r\n } else {\r\n // Log an app error\r\n Telemetry.sendAppErrorEvent({\r\n ...ComponentConnectorAppErrors.DuplicateChildInstanceFound,\r\n message: `Duplicate child instance found: ${childConnector.namespace}`,\r\n pb: {\r\n ...ComponentConnectorAppErrors.DuplicateChildInstanceFound.pb,\r\n customMessage: `href: ${getLocationHref()}, parentNamespace: ${this.fullNamespace}`\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if delay loaded experiences are ready to be rendered\r\n * @param children - the child experience config info array\r\n */\r\n private readyExperienceToRender(children: ChildExperienceConfigInfo[]): void {\r\n const config = this.config as BaseExperienceConfig;\r\n\r\n if (!config.childExperiencesRenderType || config.childExperiencesRenderType === ChildExperiencesDeferRenderType.batch) {\r\n for (const child of children) {\r\n if (child.state !== ExperienceState.ReadyToRender && child.state !== ExperienceState.Failed && child.state !== ExperienceState.Unknown) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.reRenderExperience();\r\n }\r\n\r\n /**\r\n * Resolves promise dependency with applicable timeout strategy\r\n * @param dependency - Delegate Promise to resolve dependency\r\n * @param callback - callback function to call when dependency is resolved\r\n */\r\n private resolveDependency(\r\n configInfo: ChildExperienceConfigInfo,\r\n dependency: () => Promise,\r\n callback: () => void,\r\n addTimeout: boolean\r\n ): void {\r\n\r\n let pending = true;\r\n let timer: NodeJS.Timer = null;\r\n\r\n if (addTimeout) {\r\n timer = setTimeout(\r\n () => {\r\n if (pending) {\r\n pending = false;\r\n callback();\r\n }\r\n },\r\n this.$maxWaitToBatchRenderChildExperiences\r\n );\r\n }\r\n\r\n dependency().then(() => {\r\n if (addTimeout) {\r\n clearTimeout(timer);\r\n }\r\n\r\n if (pending) {\r\n pending = false;\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * mock experience config through url override\r\n * @param experienceConfig - experience config\r\n */\r\n private mockStalenessConfig(experienceConfig: BaseExperienceConfig) {\r\n\r\n const searchParams = new URLSearchParams(getLocationSearch());\r\n const enableMockStalenessConfig = searchParams.get(\"debugstalerevalidation\");\r\n\r\n if (enableMockStalenessConfig) {\r\n if (this.experienceType === ExperienceIds.moneyCard) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true, staleThreshold: 3 };\r\n }\r\n if (this.experienceType === ExperienceIds.weatherCard) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true, staleThreshold: 2 };\r\n }\r\n if (this.experienceType === ExperienceIds.river) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true, staleThreshold: 1 };\r\n }\r\n if (this.experienceType === ExperienceIds.topSitesEdgeNext) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true };\r\n }\r\n if (this.experienceType === ExperienceIds.backgroundImageEdgeNext) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true };\r\n }\r\n if (this.experienceType === ExperienceIds.searchBoxEdgeNext) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true };\r\n }\r\n if (this.experienceType === ExperienceIds.headerEdgeNext) {\r\n experienceConfig.stalenessInfo = { isStaleCheckRequired: true };\r\n }\r\n }\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Network err string\r\n */\r\nexport const networkErrorString = \"No network\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Telemetry, TelemetryAttrName, TelemetryObjectBase } from \"@msnews/telemetry-contracts\";\r\n\r\nimport React from \"react\";\r\n\r\n/**\r\n * Returns an HOC for tracking telemetry of a React.Component.\r\n * @param WrappedComponent - the component to track telemetry.\r\n * @param telemetryObject - the telemetry object of the component.\r\n */\r\nexport function trackComponent(\r\n WrappedComponent: React.ComponentType,\r\n telemetryObject: TelemetryObjectBase\r\n): React.ComponentClass {\r\n\r\n return class ComponentTracker extends React.Component {\r\n /** Telemetry object for the component. */\r\n private telemetryObject: TelemetryObjectBase;\r\n\r\n constructor(props: TProps, context?: any) {\r\n super(props, context);\r\n this.telemetryObject = telemetryObject;\r\n }\r\n\r\n /** React render lifecycle handler */\r\n public render(): JSX.Element {\r\n return ;\r\n }\r\n };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PerfTimeline } from \"@msnews/diagnostics\";\r\nimport React from \"react\";\r\n\r\n/**\r\n * Returns an HOC for tracking perf timeline of a React.Component\r\n * @param WrappedComponent - the component to instrument perf for\r\n * @param perfTimeline - the {PerfTimeline} object to use for tracking perf.\r\n * This is normally created in the parent context when instantating the component\r\n * and passed down to the HOC.\r\n */\r\nexport function instrumentPerf(\r\n WrappedComponent: React.ComponentType,\r\n perfTimeline: PerfTimeline\r\n): React.ComponentClass {\r\n\r\n return class ComponentPerfTimeline extends React.Component {\r\n\r\n /**\r\n * The last render action's endMeasure method to be used to mark the end of the render\r\n * cycle when mount or update happens next\r\n */\r\n private lastRenderEndMeasure: () => void;\r\n\r\n /** React render lifecycle handler */\r\n public render(): JSX.Element {\r\n this.lastRenderEndMeasure = perfTimeline.startMeasure(\"render\").endMeasure;\r\n return ;\r\n }\r\n\r\n /** React componentDidMount lifecycle handler */\r\n public componentDidMount(): void {\r\n this.lastRenderEndMeasure();\r\n }\r\n\r\n /** React componentDidUpdate lifecycle handler */\r\n public componentDidUpdate(): void {\r\n this.lastRenderEndMeasure();\r\n }\r\n };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum Environment {\r\n prod = \"prod\",\r\n int1 = \"int1\",\r\n int = \"int\",\r\n intpr = \"intPR\",\r\n intpef = \"intPef\"\r\n}\r\n\r\n/**\r\n * Parses from string to Environment enum.\r\n * Defaults to null\r\n *\r\n * @export\r\n * @param {(string | null | undefined)} environment - string being parsed\r\n * @returns {(Environment | null)} - the parsed Environment enum, or null.\r\n */\r\nexport function getEnvironmentFromString(environment: string | null | undefined): Environment | null {\r\n switch (environment) {\r\n case Environment.prod:\r\n return Environment.prod;\r\n case Environment.int1:\r\n return Environment.int1;\r\n case Environment.int:\r\n case Environment.intpr:\r\n case Environment.intpef:\r\n return Environment.int;\r\n default:\r\n return null;\r\n }\r\n}","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum to describe screen width(column types)\r\n */\r\nexport enum ScreenWidth {\r\n OneColumn = \"OneColumn\",\r\n TwoColumn = \"TwoColumn\",\r\n ThreeColumn = \"ThreeColumn\",\r\n FourColumn = \"FourColumn\",\r\n FiveColumn = \"FiveColumn\",\r\n Any = \"Any\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BreakpointManager, BreakpointManagerCallback, ColumnArrangement, columnArrangements, updateColumnArrangementsForFiveCol } from \"./BreakpointManager\";\r\nimport { BreakpointTracker, BreakpointTrackerCallback, defaultBreakpoints } from \"@microsoft/fast-layouts-react\";\r\nimport { IRequestContext, getContextData } from \"@msnews/core\";\r\n\r\nimport { Breakpoint } from \"@microsoft/fast-layouts-react\";\r\nimport { BreakpointOutOfBoundWarning } from \"@msnews/diagnostics\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { pull as _pull } from \"lodash-es\";\r\n\r\n/**\r\n * This class establishes a standard breakpoint scheme that can be used by all experiences\r\n * to achieve a unified breakpoint strategy. The implementation is a glorified wrapper around\r\n * the FAST BreakpointTracker that standardizes on a set of specific number of column arrangements\r\n * that will then be exposed to clients via the {ColumnArrangement} enum.\r\n */\r\nexport class FastBreakpointManager implements BreakpointManager {\r\n\r\n /**\r\n * Map of BreakpointManager callbacks to Breakpoint Tracker callback.\r\n * Required to quickly get Breakpoint callback on unsubscribe.\r\n */\r\n private callbackMap: Map = new Map();\r\n\r\n /**\r\n * Gets the {ColumnArrangement} enum that maps to the current viewport width.\r\n */\r\n public get currentColumnArrangement(): ColumnArrangement {\r\n return this.indexToStandardConverter(BreakpointTracker.currentBreakpoint());\r\n }\r\n\r\n /**\r\n * Set a new default breakpoint, default to 0 if no requestContext provided\r\n * @param requestContext: used to access the current request's breakpoint\r\n */\r\n public constructor(requestContext: IRequestContext) {\r\n this.refreshBreakpoints(requestContext);\r\n }\r\n\r\n /**\r\n * Refreshes breakpoints from current column arrangements.\r\n */\r\n public refreshBreakpoints(requestContext: IRequestContext): void {\r\n const breakpoints: number[] = [0];\r\n updateColumnArrangementsForFiveCol();\r\n for (let i = 1; i < columnArrangements.length; i++) {\r\n breakpoints.push(columnArrangements[i].minViewportWidthPx);\r\n }\r\n\r\n BreakpointTracker.breakpoints = breakpoints;\r\n BreakpointTracker.defaultBreakpoint = requestContext !== undefined ?\r\n getContextData(requestContext.data.breakpoint, \"breakpoint\") : 0;\r\n }\r\n\r\n /** breakpoint values */\r\n public set breakpoints(breakpoints: number[]) {\r\n BreakpointTracker.breakpoints = breakpoints;\r\n\r\n // TODO: Remove this when https://github.com/microsoft/fast-dna/issues/2602 is solved\r\n if (defaultBreakpoints && Array.isArray(defaultBreakpoints)) {\r\n const count = defaultBreakpoints.length;\r\n for (let i = 0; i < count; i++) {\r\n defaultBreakpoints.pop();\r\n }\r\n breakpoints.forEach(breakpoint => defaultBreakpoints.push(breakpoint));\r\n }\r\n }\r\n\r\n public get breakpoints(): number[] {\r\n return BreakpointTracker.breakpoints;\r\n }\r\n\r\n /**\r\n * Clear all callbacks. Useful when handling multiple requests when server side rendering to prevent memory leak.\r\n */\r\n public static resetCallbacks(): void {\r\n if (_fastBreakpointManager && _fastBreakpointManager.callbackMap.size > 0) {\r\n for (const [key, _] of _fastBreakpointManager.callbackMap) {\r\n _fastBreakpointManager.unsubscribe(key);\r\n _fastBreakpointManager.callbackMap.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add a subscription to the breakpoint tracker changed notification list\r\n * @param callback - the callback to invoke when the breakpoint changes\r\n */\r\n public subscribe(callback: BreakpointManagerCallback): void {\r\n\r\n // Create callback with breakpoint value conversion.\r\n const managerCallback = (breakpoint: Breakpoint) => {\r\n callback(this.indexToStandardConverter(breakpoint));\r\n };\r\n\r\n this.callbackMap.set(callback, managerCallback);\r\n\r\n BreakpointTracker.subscribe(managerCallback);\r\n }\r\n\r\n /**\r\n * Removes an existing subscription from the breakpoint tracker notification list\r\n * @param callback - the callback to remove from the notification list\r\n */\r\n public unsubscribe(callback: BreakpointManagerCallback): void {\r\n BreakpointTracker.unsubscribe(this.callbackMap.get(callback));\r\n this.callbackMap.delete(callback);\r\n }\r\n\r\n /**\r\n * Converts an index-based breakpoint to a column arrangement.\r\n * @param breakpoint The breakpoint index to convert.\r\n * @returns The corresponding column arrangement.\r\n */\r\n private indexToStandardConverter(breakpoint: Breakpoint): ColumnArrangement {\r\n if (!columnArrangements || !columnArrangements[breakpoint]) {\r\n Telemetry.sendAppErrorEvent({\r\n ...BreakpointOutOfBoundWarning,\r\n message: \"Cannot read property arrangement of undefined\",\r\n pb: {\r\n ...BreakpointOutOfBoundWarning.pb,\r\n customMessage: \"columnArrangements[\" + breakpoint + \"] is undefined.\" +\r\n \"columnArrangements: \" + JSON.stringify(columnArrangements) +\r\n \"; breakpoints: \" + JSON.stringify(this.breakpoints)\r\n }\r\n });\r\n\r\n // if out of bound, return the max available breakpoint\r\n if (columnArrangements && breakpoint >= columnArrangements.length && columnArrangements[columnArrangements.length - 1]) {\r\n return columnArrangements[columnArrangements.length - 1].arrangement;\r\n }\r\n\r\n // by default, return 1 column arrangement\r\n return ColumnArrangement.c1;\r\n }\r\n\r\n return columnArrangements[breakpoint].arrangement;\r\n }\r\n}\r\n\r\nlet _fastBreakpointManager: FastBreakpointManager;\r\n\r\n/**\r\n * Default instance of fastBreakpointManager\r\n * @param requestContext - The current request context\r\n * @param recreate - Flag specifying if we should create a new instance of fastBreakpointManager\r\n */\r\nexport const fastBreakpointManager = (requestContext?: IRequestContext, recreate?: boolean) => {\r\n if (!_fastBreakpointManager || recreate) {\r\n // First clear any subscribed to events from the callback map\r\n FastBreakpointManager.resetCallbacks();\r\n _fastBreakpointManager = new FastBreakpointManager(requestContext);\r\n }\r\n\r\n return _fastBreakpointManager;\r\n};\r\n\r\nlet viewType: string = null;\r\n\r\n/**\r\n * To get view type for Edgenext based on river column view\r\n */\r\nexport const viewTypeForEdgeNext = () => {\r\n switch (fastBreakpointManager().currentColumnArrangement) {\r\n case ColumnArrangement.c1:\r\n case ColumnArrangement.c2:\r\n viewType = \"size2column\";\r\n break;\r\n case ColumnArrangement.c3:\r\n viewType = \"size3column\";\r\n break;\r\n case ColumnArrangement.c4:\r\n viewType = \"size4column\";\r\n break;\r\n case ColumnArrangement.c5:\r\n viewType = \"size5column\";\r\n break;\r\n default:\r\n // leave EdgeNextTelemetry.viewType unchanged\r\n break;\r\n }\r\n return viewType;\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Contract related to local dev workflow\r\n */\r\nexport enum ConfigOrigin {\r\n // Configs are fetched from remote\r\n Production = 0,\r\n\r\n // Configs are fetched from local file system\r\n Local = 1\r\n}\r\n\r\n/**\r\n * Contract related to local dev workflow\r\n */\r\nexport interface ConfigOrigins {\r\n /** feature config */\r\n feature: ConfigOrigin;\r\n\r\n /** localization config origin*/\r\n loc: ConfigOrigin;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { registerResetCallback } from \"@msnews/core\";\r\n\r\n/**\r\n * Experiences being tracked for milestone data updates. This normally includes all experience\r\n * types being tracked under various trackers such as DOM, Visual Readiness & Deferral trackers.\r\n * It is used to prevent firing of certain general milestone events from base classes so that\r\n * we're not wasting CPU cycles processing unnecessary redux actions.\r\n */\r\nlet trackingExperiences: { [experienceType: string]: boolean } = {};\r\n\r\n/**\r\n * Helper to check whether we're tracking milestone events for the given experience and the event type\r\n */\r\nexport function shouldTrackExperience(experienceType: string, shouldTrack?: boolean): boolean {\r\n return shouldTrack != null\r\n ? trackingExperiences[experienceType] = shouldTrack\r\n : trackingExperiences[experienceType];\r\n}\r\n\r\n/**\r\n * Register a callback to reset the trackingExperiences.\r\n * The callback is registered once when the module is loaded and invoked once on the server side at the beginning of each request.\r\n */\r\nregisterResetCallback(() => {\r\n trackingExperiences = {};\r\n});\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PerfTimeline, logger, tryGetPerfTimeline } from \"@msnews/diagnostics\";\r\nimport { getIndexedDB, getLocationSearch, canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nimport { UrlUtility } from \"./UrlUtility\";\r\n\r\n/**\r\n * Provides utility functions to get and set data from IndexedDB.\r\n * If dbName is not provied, this class creates a db with name MicrosoftNews.\r\n * If storeName is not provied, this class creates a table/store with name Default.\r\n * Recommended to create a new table for your feature to separate and iterate through entries quickly.\r\n * IndexedDB utility does not require stringify and json parsing so more efficient! Just store your object as value.\r\n */\r\nexport class IndexedDb {\r\n\r\n /** IndexedDb object */\r\n private idb: IDBFactory = getIndexedDB();\r\n\r\n /** IndexedDb store name */\r\n /** DO NOT PUT DOT IN THE STORE NAME. */\r\n private storeName: string;\r\n\r\n /** IndexedDb promise. Sets when IndexedDB is initialized. */\r\n private idbPromise: Promise;\r\n\r\n /** The perf timeline for this IDB instance */\r\n private perfTimeline: PerfTimeline;\r\n\r\n /**\r\n * Returns if IndexedDb is supported.\r\n * @returns true if supported else false.\r\n */\r\n public get supported(): boolean {\r\n if (!this.idb) {\r\n if (canUseDOM() && logger) {\r\n logger.log(\"window.indexedDB is not supported.\");\r\n }\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n public get isCachingAllowed(): boolean {\r\n const searchObj = getLocationSearch();\r\n if (searchObj) {\r\n const param = UrlUtility.getQueryParameterByName(\"enableIndexedDbOperation\", searchObj);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n public get isGetAllAllowed(): boolean {\r\n const searchObj = getLocationSearch();\r\n if (searchObj) {\r\n const param = UrlUtility.getQueryParameterByName(\"allowGetAllOverCursor\", searchObj);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n if (IDBObjectStore.prototype && IDBObjectStore.prototype.getAll) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @param {IDBFactory} idb - IndexedDB object to override.\r\n */\r\n public _setIndexedDb(idb: IDBFactory): void {\r\n this.idb = idb;\r\n }\r\n\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @return {Promise} existing promise.\r\n */\r\n public _getIdbPromise(): Promise {\r\n return this.idbPromise;\r\n }\r\n\r\n /**\r\n * Returns object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @returns Promise\r\n */\r\n public async getObject(key: IDBValidKey): Promise {\r\n let req: IDBRequest;\r\n\r\n await this.withIdbStore(\"readonly\", \"getObject\", storeCallback => {\r\n req = storeCallback.get(key);\r\n });\r\n return req.result;\r\n }\r\n\r\n /**\r\n * Return all objects from IndexedDB using getAll implementation.\r\n * @public\r\n * @returns Promise\r\n */\r\n public async getAll(): Promise {\r\n let req: IDBRequest;\r\n await this.withIdbStore(\"readonly\", \"getAll\", storeCallback => {\r\n req = storeCallback.getAll();\r\n });\r\n return req.result;\r\n }\r\n\r\n /**\r\n * Returns all objects from IndexedDB.\r\n * if getAll is supported, call it else fallback to Cursor implementation that exists on wide range of devices.\r\n * @public\r\n * @returns Promise\r\n */\r\n public async getAllObjects(): Promise {\r\n if (this.isGetAllAllowed) {\r\n return this.getAll();\r\n }\r\n\r\n const returnArray: Type[] = [];\r\n await this.withIdbStore(\"readonly\", \"getAllObjects\", storeCallback => {\r\n storeCallback.openCursor().onsuccess = function (event: any): void {\r\n const cursor = event.target && event.target.result ? event.target.result : undefined;\r\n if (cursor && cursor.value) {\r\n returnArray.push(cursor.value);\r\n cursor.continue();\r\n }\r\n };\r\n });\r\n return returnArray;\r\n }\r\n\r\n /**\r\n * Sets object into IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @param {any} value - Any typed value you want to insert into IndexedDB.\r\n */\r\n public async setObject(key: IDBValidKey, value: any): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"setObject\", storeCallback => {\r\n storeCallback.put(value, key);\r\n });\r\n }\r\n\r\n /**\r\n * Removes object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n */\r\n public async removeObject(key: IDBValidKey): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"removeObject\", storeCallback => {\r\n storeCallback.delete(key);\r\n });\r\n }\r\n\r\n /**\r\n * Removes all objects from IndexedDB\r\n * @public\r\n */\r\n public async clearObjects(): Promise {\r\n return await this.withIdbStore(\"readwrite\", \"clearObjects\", storeCallback => {\r\n storeCallback.clear();\r\n });\r\n }\r\n\r\n /**\r\n * Initialize IndexedDb.\r\n * @param idbStoreName {string} - IndexedDB store name\r\n * @param dbName {string} - Database name\r\n * @param preInitializedIdbPromise {Promise} - Optional pre-initialized promise that is fetching the {IDBDatabase} object.\r\n * Used to optimize/prime the IDB connection cost so it can be started as early as possible in the page without incurring additional cost\r\n * later when lot more things are happening on the page.\r\n */\r\n public async initializeIndexedDb(\r\n idbVersion = 1,\r\n idbStoreName = \"Default\",\r\n dbName = \"MicrosoftNews\",\r\n preInitializedIdbPromise: Promise = null\r\n ): Promise {\r\n\r\n this.storeName = idbStoreName;\r\n this.perfTimeline = tryGetPerfTimeline(`IndexedDB-${idbStoreName}`, idbStoreName);\r\n\r\n this.idbPromise = preInitializedIdbPromise || new Promise((resolve, reject) => {\r\n\r\n const endOpen = this.perfTimeline && this.perfTimeline.startMeasure(\"open\").endMeasure;\r\n const openreq = this.idb.open(dbName, idbVersion);\r\n\r\n openreq.onerror = () => {\r\n if (endOpen) { endOpen(\"error\"); }\r\n reject(openreq.error);\r\n };\r\n\r\n openreq.onsuccess = () => {\r\n if (endOpen) { endOpen(); }\r\n resolve(openreq.result);\r\n };\r\n\r\n openreq.onupgradeneeded = () => {\r\n openreq.result.createObjectStore(idbStoreName);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Private function to set transaction.\r\n * @param type - IDB read/write mode\r\n * @param operationName - readable name to use in the app trace logging\r\n * @param callback - the callback to invoke with the IDB objectStore.\r\n * @returns {Promise} async operation that ends when the IDB transaction is complete.\r\n */\r\n private async withIdbStore(\r\n type: IDBTransactionMode,\r\n operationName: string,\r\n callback: ((store: IDBObjectStore) => void)\r\n ): Promise {\r\n\r\n return this.idbPromise.then(db => new Promise((resolve, reject) => {\r\n const endOperation = this.perfTimeline && this.perfTimeline.startMeasure(operationName).endMeasure;\r\n const transaction = db.transaction(this.storeName, type);\r\n\r\n transaction.oncomplete = () => {\r\n if (endOperation) { endOperation(); }\r\n resolve();\r\n };\r\n\r\n transaction.onabort = transaction.onerror = () =>\r\n reject(transaction.error);\r\n\r\n callback(transaction.objectStore(this.storeName));\r\n }));\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** Flag to keep track of service worker \"enabled\" status */\r\nlet serviceWorkerEnabled = false;\r\n\r\n/**\r\n * Purge caches with the given cache name.\r\n * @param cacheNameToPurge The name of the cache to purge.\r\n */\r\nasync function purgeCacheAsync(cacheNameToPurge: ServiceWorkerCacheName): Promise {\r\n if (this.isServiceWorkerActive()) {\r\n const cacheNames = await caches.keys();\r\n const cacheNamesToDelete = cacheNames.filter(cacheName => cacheName.includes(cacheNameToPurge));\r\n await Promise.all(cacheNamesToDelete.map((cacheName) => caches.delete(cacheName)));\r\n }\r\n}\r\n\r\n/**\r\n * Purge cache entry for given storage and request\r\n * @param store Cache storage that entry is being purged from\r\n * @param url Url of request to delete from cache storage\r\n * @param method Method of request to delete from cache storage\r\n */\r\nasync function purgeEntryInCache(store: string, url: string, method: string): Promise {\r\n if (this.isServiceWorkerActive()) {\r\n const cacheStorage = await caches.open(store);\r\n const cacheEntries = await cacheStorage.keys();\r\n const cacheEntriesToDelete = cacheEntries.filter((cacheEntry) => {\r\n return cacheEntry.url.startsWith(url) && cacheEntry.method === method;\r\n });\r\n await Promise.all(cacheEntriesToDelete.map((cacheEntry) => cacheStorage.delete(cacheEntry)));\r\n }\r\n}\r\n\r\n/**\r\n * Updates service worker enabled status\r\n */\r\nfunction setIsServiceWorkerEnabled(enabled: boolean) {\r\n serviceWorkerEnabled = enabled;\r\n}\r\n\r\n/**\r\n * Checks whether service worker is \"enabled\"\r\n */\r\nfunction getIsServiceWorkerEnabled(): boolean {\r\n return serviceWorkerEnabled;\r\n}\r\n\r\n/**\r\n * Check if serviceWorker is in \"activated\" state\r\n */\r\nfunction isServiceWorkerActive(): boolean {\r\n const { navigator } = window;\r\n\r\n // Get the latest instance of controller\r\n const serviceWorkerController = navigator\r\n && navigator.serviceWorker\r\n && navigator.serviceWorker.controller;\r\n\r\n return serviceWorkerController && serviceWorkerController.state === \"activated\";\r\n}\r\n\r\n/** Helper methods for service worker cache. */\r\nexport const serviceWorkerCacheHelper = {\r\n purgeCacheAsync: purgeCacheAsync,\r\n purgeEntryInCache: purgeEntryInCache,\r\n isServiceWorkerActive: isServiceWorkerActive,\r\n getIsServiceWorkerEnabled: getIsServiceWorkerEnabled,\r\n setIsServiceWorkerEnabled: setIsServiceWorkerEnabled\r\n};\r\n\r\nexport enum ServiceWorkerCacheName {\r\n base = \"base\",\r\n followedTopics = \"followedTopics\",\r\n river = \"river\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different auth cookie names\r\n * @enum\r\n */\r\nexport enum AuthCookieName {\r\n Anon = \"ANON\",\r\n AppAnon = \"APP_ANON\",\r\n Unknown = \"\"\r\n}\r\n\r\n/**\r\n * List of http-readable cookies that indicate the presence of an auth cookie\r\n */\r\nexport enum AuthCookieExistsCookieName {\r\n AnonCookieExists = \"ace\",\r\n AppAnonCookieExists = \"aace\"\r\n}\r\n\r\n/**\r\n * Original source is Constants.ts\r\n * Child cookie name, used to signal if rpsUser is child account.\r\n */\r\nexport const childCookieName = \"child\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IsForceTimestampExpired, getRenderCacheKeys } from \"./PersistHelpers\";\r\nimport { RenderCache, RenderCacheKeys } from \"./RenderCache\";\r\nimport { RenderCacheErrors, logger } from \"@msnews/diagnostics\";\r\nimport { appEnvironment, getLocalStorage } from \"@msnews/core\";\r\nimport { batchCSS, renderCacheKeyOfNormalizedKeys, scrapeDom, windowAvailable } from \"./Helper\";\r\nimport { defaultExpirationTimeMs, expirationPrefix, forceTimestampPrefix, jssMapSuffix, keysPrefix, storagePrefix } from \"./Constants\";\r\n\r\nimport { RenderCacheConfig } from \"./RenderCacheConfig\";\r\nimport { Telemetry } from \"@msnews/telemetry-contracts\";\r\nimport { userInteractionHappened } from \"./UserInteractionWatcher\";\r\n\r\nconst jssGeneratedClassesMap: { [instanceId: string]: Array } = {};\r\nlet jssCaptureCompleted = false;\r\n\r\n/**\r\n * Persist the complete render state (DOM and Styles) necessary to restore the rendered Peregrine SPA page, without needing to\r\n * first load all of the Peregrine experience bundles.\r\n * This is the equivalent of using Server Side Rendering to generate the initial DOM, though in this case the initial DOM elements and styles\r\n * are persisted and loaded locally on the client.\r\n * @param config Render cache configuration.\r\n * @param stateJson The state to persist in JSON form.\r\n * @param markers List of performance markers, which will be fired upon cache restore.\r\n * @param invokeFallback Canvas specific fallback function to be executed on jss exception.\r\n */\r\nexport function persistRenderCache(config: RenderCacheConfig, stateJson?: string, markers?: string[], invokeFallback?: (message: string) => void): void {\r\n jssCaptureCompleted = true;\r\n\r\n if (!config || !getLocalStorage().supported || !window.renderCacheEnabled) {\r\n return;\r\n }\r\n\r\n // Get normalized render cache keys\r\n const renderCacheKeys: RenderCacheKeys = getRenderCacheKeys(config && config.normalizeKeyParamsList);\r\n\r\n // Check if we need to refresh cache by force. Used as Failsafe if user stuck in broken render cache loop.\r\n if (IsForceTimestampExpired(config && config.forceExpirationTime)) {\r\n removeRenderCache();\r\n logger.log(\"[RC Info] Force timestamp expired: removing render cache\");\r\n return;\r\n }\r\n\r\n // Found an issue with User interaction check. Its inconsistent and as we are not deleting RC on this,\r\n // users may get stuck in this state.\r\n if (userInteractionHappened()) {\r\n return;\r\n }\r\n\r\n // When critical jss mismatch is detected - do not persist and based on config decide to purge and fallback\r\n if (criticalJssMismatchDetected(config, invokeFallback)) {\r\n return;\r\n }\r\n\r\n let { includeNewsFeed, expirationTime, newsFeedExpirationTime } = config;\r\n\r\n // Persist build version recorded for the page being render cached\r\n const buildVersion = appEnvironment.BuildVersion || \"\";\r\n\r\n // Form Cache Object\r\n const renderCacheStorageObj: RenderCache = {\r\n dom: scrapeDom(includeNewsFeed),\r\n batch_css: batchCSS(),\r\n build_version: buildVersion,\r\n markers,\r\n state: stateJson\r\n };\r\n\r\n expirationTime = (includeNewsFeed ? newsFeedExpirationTime : expirationTime)\r\n || defaultExpirationTimeMs;\r\n\r\n // Try to persist Render Cache and Timestamp\r\n const expiresOn: number = new Date().getTime() + expirationTime;\r\n\r\n getLocalStorage().setObject(renderCacheKeys.expn, expiresOn);\r\n getLocalStorage().setObject(renderCacheKeys.keyn, renderCacheStorageObj);\r\n}\r\n\r\n/**\r\n * Deletes render cache local storage for all domains\r\n */\r\nexport function removeRenderCache(): void {\r\n if (!getLocalStorage().supported) {\r\n return;\r\n }\r\n\r\n // The render cache Urls are currently not normalized, so we have different render\r\n // cache saved for DHP and NTP page. But, some of the properties (example: market)\r\n // is shared between those pages. To ensure a purge on render cache on one page,\r\n // does purge the other render cache as well, and avoid breaking the page layout,\r\n // we remove all render cache keys on removeRenderCache\r\n getLocalStorage().removeSubstringKeys(storagePrefix);\r\n getLocalStorage().removeSubstringKeys(expirationPrefix);\r\n getLocalStorage().removeSubstringKeys(forceTimestampPrefix);\r\n getLocalStorage().removeSubstringKeys(keysPrefix);\r\n getLocalStorage().removeSubstringKeys(jssMapSuffix);\r\n}\r\n\r\n/**\r\n * Deletes render cache local storage only for current href\r\n */\r\nexport function removeCurrentRenderCache(): void {\r\n if (!getLocalStorage().supported) {\r\n return;\r\n }\r\n\r\n const renderCacheKeys: RenderCacheKeys = getRenderCacheKeys();\r\n getLocalStorage().removeObject(renderCacheKeys.keyn);\r\n getLocalStorage().removeObject(renderCacheKeys.frcn);\r\n getLocalStorage().removeObject(renderCacheKeys.expn);\r\n getLocalStorage().removeObject(renderCacheKeys.jssn);\r\n getLocalStorage().removeObject(renderCacheKeyOfNormalizedKeys);\r\n}\r\n\r\n/**\r\n * Capture class names generated by JSS and maintain inside a dictionary.\r\n * @param key key for class name\r\n * @param val JSS val for class name\r\n */\r\nexport function captureJssGeneratedClasses(key: string, val: string): void {\r\n if (jssCaptureCompleted || !(windowAvailable && window.renderCacheEnabled)) {\r\n return;\r\n }\r\n\r\n if (jssGeneratedClassesMap[key]) {\r\n jssGeneratedClassesMap[key].push(val);\r\n } else {\r\n jssGeneratedClassesMap[key] = [val];\r\n }\r\n}\r\n\r\n/**\r\n * Compares stored JSS Map with current JSS Map and log corresponding app errors\r\n * @param config Render cache configuration.\r\n * @param invokeFallback Canvas specific fallback function to be executed on jss exception.\r\n * @returns boolean - returns true when there is critical jss mismatch, otherwise false\r\n */\r\nexport function criticalJssMismatchDetected(config: RenderCacheConfig, invokeFallback?: (message: string) => void): boolean {\r\n // if we haven't captured any generated classes log an app error and return\r\n if (Object.keys(jssGeneratedClassesMap).length === 0) {\r\n logJssMismatchAppError(RenderCacheErrors.JssStyleMismatchWarning, \"Generated classes map is empty. \");\r\n return false;\r\n }\r\n\r\n const { isJssIdentical, isCriticalJssIdentical, jssWarningMessage, jssErrorMessage } = compareJssMap(config);\r\n\r\n // in case of non critical JSS mismatch we just log an app warning\r\n if (!isJssIdentical) {\r\n if (config && config.enableJssMismatchWarningLogs) {\r\n logJssMismatchAppError(RenderCacheErrors.JssStyleMismatchWarning, jssWarningMessage);\r\n }\r\n } else {\r\n // in case there are no mismatches - write back the newly generated class map back to localstorage\r\n Object.keys(jssGeneratedClassesMap).length && getLocalStorage().setObject(getRenderCacheKeys().jssn, jssGeneratedClassesMap);\r\n logger.log(\"[RC Info] No style mismatch found\");\r\n }\r\n\r\n // in case of critical JSS mismatch, log an app error and based on config\r\n // decide to purge and invoke canvas specific fallback\r\n if (!isCriticalJssIdentical) {\r\n logJssMismatchAppError(RenderCacheErrors.JssStyleCriticalMismatchError, jssErrorMessage);\r\n\r\n if (config && config.enablePurgeOnJssMismatch) {\r\n removeRenderCache();\r\n\r\n if (config && config.enableFallbackOnJssMismatch && invokeFallback && typeof invokeFallback === \"function\") {\r\n invokeFallback(jssErrorMessage);\r\n }\r\n }\r\n }\r\n\r\n return !isCriticalJssIdentical;\r\n}\r\n\r\n/**\r\n * Compares stored JSS Map with current JSS Map and identifies if those are critical vs non critical error message with corresponding error message\r\n * @param config Render cache configuration.\r\n * @returns object - returns mismatch and error information\r\n */\r\nfunction compareJssMap(config: RenderCacheConfig): { isJssIdentical: boolean, isCriticalJssIdentical: boolean, jssWarningMessage: string, jssErrorMessage: string } {\r\n let jssErrorMessage = \"\";\r\n let jssWarningMessage = \"\";\r\n let isCriticalJssIdentical = true;\r\n let isJssIdentical = true;\r\n\r\n const jssCriticalClassListMap: { [className: string]: boolean } = getJssCriticalClassListMap(config && config.jssCriticalClassList || []);\r\n\r\n const storedMap = getLocalStorage().getObject(getRenderCacheKeys().jssn);\r\n if (storedMap && typeof storedMap === \"object\" && Object.keys(storedMap).length) {\r\n // this for loop compares every item in stored Map of Css class names to the current page instance map\r\n for (const key in storedMap) {\r\n const storedClasses = storedMap[key];\r\n\r\n // if stored class isn't correctly set, log a non critical app app warning and return\r\n if (!Array.isArray(storedClasses)) {\r\n return { isJssIdentical: false, isCriticalJssIdentical: true, jssWarningMessage: `Stored classes expected to be an array, but received something else. stored val: ${storedClasses}. `, jssErrorMessage: \"\" };\r\n }\r\n\r\n /*\r\n We only care about extra classes being present in the stored classes. If the current page\r\n instance has new class names not present in the stored map, we do not consider this a mismatch\r\n since the render cache snapshot won't be broken due to this scenario. Also if there are no\r\n classes corresponding to a key in the current map, detect that as a mismatch as well.\r\n\r\n --- Scenario 1: (detect as a mismatch) ---\r\n storedClasses : k1: { [c1, c2, c3] }\r\n currentClasses: k1: { [c1, c2] }\r\n\r\n --- Scenario 2: (do not detect as a mismatch) ---\r\n storedClasses : k1: { [c1, c2] }\r\n currentClasses: k1: { [c1, c2, c3] }\r\n\r\n --- Scenario 3: (detect as a mismatch) ---\r\n storedClasses : k1: { [c1, c2] }\r\n currentClasses: k2: { [c3, c4, c5] }\r\n */\r\n const currentClasses = jssGeneratedClassesMap[key];\r\n if (currentClasses) {\r\n if (storedClasses.some(className => currentClasses.indexOf(className) === -1)) {\r\n const errorMessage = `JSSError: val mismatch for key: ${key}, val stored: ${storedClasses}, new val: ${currentClasses}. `;\r\n if (jssCriticalClassListMap[key]) {\r\n jssErrorMessage += errorMessage;\r\n isCriticalJssIdentical = false;\r\n }\r\n\r\n jssWarningMessage += errorMessage;\r\n isJssIdentical = false;\r\n }\r\n } else {\r\n const errorMessage = `JSSError: val mismatch for key: ${key}, val stored: ${storedClasses}, new val: '' (empty). `;\r\n if (jssCriticalClassListMap[key]) {\r\n jssErrorMessage += errorMessage;\r\n isCriticalJssIdentical = false;\r\n }\r\n\r\n jssWarningMessage += errorMessage;\r\n isJssIdentical = false;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n isJssIdentical: isJssIdentical,\r\n isCriticalJssIdentical: isCriticalJssIdentical,\r\n jssWarningMessage: jssWarningMessage,\r\n jssErrorMessage: jssErrorMessage\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to log render cache jss mismatch app errors\r\n * @param errorParams The error params.\r\n * @param customMessage The custom message to be logged.\r\n */\r\nfunction logJssMismatchAppError(errorParams: any, customMessage: string): void {\r\n Telemetry.sendAppErrorEvent({\r\n ...errorParams,\r\n message: \"RC JSS mismatch issue\",\r\n pb: {\r\n ...errorParams.pb,\r\n customMessage: customMessage\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Helper function to generate critical class list map\r\n * @param jssCriticalClassList The critical class list array\r\n * @returns jssCriticalClassListMap The map of critical class list\r\n */\r\nfunction getJssCriticalClassListMap(jssCriticalClassList: [string?]) {\r\n const jssCriticalClassListMap: { [className: string]: boolean } = {};\r\n jssCriticalClassList.forEach((key) => {\r\n jssCriticalClassListMap[key] = true;\r\n jssCriticalClassListMap[key + \" - jssStyleSheet\"] = true;\r\n });\r\n\r\n return jssCriticalClassListMap;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/// \r\n\r\nimport { MockLRUCache } from \"./ServerCacheMock\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * Clustered cache.\r\n * @type {LRUCache}\r\n */\r\nlet serverCache: LRUCache;\r\n\r\n/**\r\n * Initializes the serverCache with the LRUCache instance provided by the Render Service.\r\n * For testing it is initialized with a mock instance.\r\n * This needs to be called once on the server side.\r\n * @param cache\r\n */\r\nfunction initialize(cache: LRUCache): void {\r\n serverCache = cache;\r\n}\r\n\r\n/**\r\n * Reset the serverCache, clearing all data from the cache.\r\n * Currently only used for unit tests.\r\n * @returns {ServerCache}\r\n */\r\nasync function reset(): Promise {\r\n await serverCache.reset();\r\n}\r\n\r\n/**\r\n * Set cache. Update the \"recently used\"-ness of the key.\r\n * @param key Cache key to set.\r\n * @param value Cache value to set.\r\n * @param maxAge Optional maximum age in milliseconds.\r\n */\r\nasync function set(key: string, value: any, maxAge?: number): Promise {\r\n await serverCache.set(key, value, maxAge);\r\n}\r\n\r\n/**\r\n * Get cache. Update the \"recently used\"-ness of the key.\r\n * @param key Cache key to get.\r\n * @returns Cached object. If not found, return undefined.\r\n */\r\nasync function get(key: string): Promise {\r\n return await serverCache.get(key);\r\n}\r\n\r\n/**\r\n * Check if a key is in the cache, without updating the recent-ness or deleting it for being stale.\r\n * @param key Cache key to check.\r\n * @returns True if key exists.\r\n */\r\nasync function has(key: string): Promise {\r\n return await serverCache.has(key);\r\n}\r\n\r\n/**\r\n * Removes a value from the cache.\r\n * @param key Cache key to delete.\r\n * @returns Promise for completing the task\r\n */\r\nasync function del(key: string): Promise {\r\n return await serverCache.del(key);\r\n}\r\n\r\n/**\r\n * Return total quantity of objects currently in cache. Note, that stale (see options) items are returned as part of this item count.\r\n * @returns Total quantity of objects currently in cache.\r\n */\r\nasync function itemCount(): Promise {\r\n return await serverCache.itemCount();\r\n}\r\n\r\n/**\r\n * ServerCache is server side only data cache.\r\n * More detailed docs are in the following links\r\n * https://github.com/isaacs/node-lru-cache#readme\r\n * https://github.com/doublesharp/lru-cache-for-clusters-as-promised\r\n */\r\nexport const ServerCache = (!canUseDOM()) ? {\r\n initialize,\r\n reset,\r\n set,\r\n get,\r\n has,\r\n del,\r\n itemCount\r\n} : null;\r\n\r\n// Initialize ServerCache using mock cache for tests, we do it here so it works for relative imports\r\nif (global[\"TEST_ENV\"] && !canUseDOM()) {\r\n // MockLRUCache implements only a subset of LRUCache; it implements only the functions currently being used.\r\n // This was simply to avoid exhaustively reimplementing the whole API.\r\n // If more functions are utilized from the API a mock implmenting will need provided for in the MockServerCache class.\r\n // @ts-ignore\r\n ServerCache.initialize(new MockLRUCache());\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport Agent from \"agentkeepalive\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n// Keep alive agents will automatically keep outbound connections open to reduce resource usage.\r\nlet httpAgent: Agent;\r\nlet httpsAgent: Agent;\r\n\r\n/**\r\n * Augment fetch options that contains node-fetch extensions\r\n */\r\ndeclare interface RequestInit {\r\n\r\n // A string to set request's method\r\n method?: string;\r\n\r\n // whatwg/fetch standard options\r\n signal?: AbortSignal | null;\r\n\r\n // node-fetch extensions\r\n agent?: Agent | ((parsedUrl: URL) => Agent); // =null http.Agent instance, allows custom proxy, certificate etc.\r\n}\r\n\r\n/**\r\n * Wrapper class for cancelling fetch.\r\n * This is meant so AbortController is not exposed for browsers that doesn't support it.\r\n */\r\nexport class FetchAbortToken {\r\n\r\n private controller?: AbortController;\r\n\r\n /** Create controller if supported. */\r\n public constructor() {\r\n // Check browser support for AbortController. Create if supported.\r\n if (typeof AbortController !== \"undefined\") {\r\n this.controller = new AbortController();\r\n }\r\n }\r\n\r\n /** Abort fetch only if controller is available. If browser do not support AbortController then this is noop. */\r\n public abort(): boolean {\r\n if (this.controller) {\r\n this.controller.abort();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** Set AbortSignal here since no one else has access to the controller */\r\n public setAbortSignal(init: RequestInit) {\r\n if (this.controller) {\r\n init.signal = this.controller.signal;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * On server side, initialize abortable fetch with the custom http agents as soon as possible (in node.index.ts)\r\n * @param inHttpAgent the input http agent\r\n * @param inHttpsAgent the input https agent\r\n */\r\nexport function abortableFetchInitialize(inHttpAgent: Agent, inHttpsAgent: Agent) {\r\n if (httpAgent && httpsAgent) {\r\n return;\r\n }\r\n\r\n if (inHttpAgent && inHttpsAgent) {\r\n httpAgent = inHttpAgent;\r\n httpsAgent = inHttpsAgent;\r\n } else {\r\n httpAgent = new Agent();\r\n httpsAgent = new Agent.HttpsAgent();\r\n }\r\n}\r\n\r\n/**\r\n * Fetch with timeout and close connection\r\n * @param url fetch url\r\n * @param timeoutMs timeout in miliseconds before rejecting the fetch. If 0, the fetch will not timeout.\r\n * @param init fetch options\r\n * @param abortToken client provides FetchAbortToken object so it could be cancelled.\r\n */\r\nexport async function abortableFetch(url: string, timeoutMs: number, init?: RequestInit, abortToken?: FetchAbortToken): Promise {\r\n\r\n if (!abortToken) {\r\n abortToken = new FetchAbortToken();\r\n }\r\n\r\n // Setup fetch timeout if timeoutMs value is positive\r\n let timeout = null;\r\n if (timeoutMs > 0) {\r\n timeout = setTimeout(() => {\r\n const aborted = abortToken.abort();\r\n if (!aborted) {\r\n throw new Error(`Fetch for ${url} aborted due to timeout of ${timeoutMs} ms. AbortController is not supported.`);\r\n }\r\n }, timeoutMs);\r\n }\r\n\r\n if (!init) {\r\n init = {\r\n method: \"GET\"\r\n };\r\n }\r\n\r\n // Insert default http agents with keep-alive if not defined (server only)\r\n if (!canUseDOM() && !init.agent && httpAgent && httpsAgent) {\r\n const agentFunc = function (_parsedURL) {\r\n if (_parsedURL.protocol === \"http:\") {\r\n return httpAgent;\r\n } else {\r\n return httpsAgent;\r\n }\r\n };\r\n\r\n init.agent = agentFunc;\r\n }\r\n\r\n // Insert default abort controller if not defined\r\n if (!init.signal) {\r\n abortToken.setAbortSignal(init);\r\n }\r\n\r\n const requestStart = performance.now();\r\n let errorObj;\r\n let statusCode = 0;\r\n\r\n return fetch(url, init)\r\n .then((response) => {\r\n statusCode = response.status;\r\n return response;\r\n })\r\n .catch(err => {\r\n errorObj = err;\r\n if (err.name === \"AbortError\") {\r\n throw new Error(`Fetch for ${url} aborted due to timeout of ${timeoutMs} ms.`);\r\n }\r\n throw new Error(err);\r\n })\r\n .finally(() => {\r\n if (!canUseDOM()) {\r\n const serverFetchInfo = {\r\n abortableFetch: {\r\n url: url,\r\n statusCode: statusCode,\r\n timeElapsed: (performance.now() - requestStart).toFixed(2),\r\n timeOut: timeoutMs.toFixed(2),\r\n errorMessage: errorObj && errorObj.message,\r\n errorName: errorObj && errorObj.name,\r\n errorCode: errorObj && errorObj.code,\r\n errorType: errorObj && errorObj.type\r\n }\r\n };\r\n logger.logObjects(serverFetchInfo);\r\n }\r\n\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n });\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration of all experiences ID.\r\n * By convention the experience ID ***MUST*** match exactly (including case) the class name for the experience.\r\n * NOTE: Keep this list alphabetical\r\n */\r\nexport enum ExperienceIds {\r\n animator = \"Animator\",\r\n articlePage = \"ArticlePage\",\r\n autosCard = \"AutosCard\",\r\n backgroundGradient = \"BackgroundGradient\",\r\n backgroundImageCommon = \"BackgroundImageCommon\",\r\n backgroundImageEdge = \"BackgroundImageEdge\",\r\n backgroundImageEdgeNext = \"BackgroundImageEdgeNext\",\r\n backgroundImageWC = \"BackgroundImageWC\",\r\n bannerManager = \"BannerManager\",\r\n baseHeader = \"BaseHeader\",\r\n bingAnswers = \"BingAnswers\",\r\n bingCards = \"BingCardsExperience\",\r\n bingHealth = \"BingHealth\",\r\n bingHealthCard = \"BingHealthCard\",\r\n bingShopping = \"BingShopping\",\r\n bingShoppingLifestyleCard = \"BingShoppingLifestyleCard\",\r\n bingShoppingMeStripe = \"BingShoppingMeStripe\",\r\n bingMiniShopping = \"BingMiniShopping\",\r\n bingVideoCard = \"BingVideoCard\",\r\n bingVideoCarousel = \"BingVideoCarousel\",\r\n bingWebSSO = \"BingWebSSO\",\r\n blowout = \"Blowout\",\r\n breakingNews = \"BreakingNews\",\r\n calendarCard = \"CalendarCard\",\r\n breakingNewsWC = \"BreakingNewsWC\",\r\n cardAction = \"CardAction\",\r\n cardActionV2 = \"CardActionV2\",\r\n cardActionWC = \"CardActionWC\",\r\n coachmark = \"Coachmark\",\r\n coachmarkWC = \"CoachmarkWC\",\r\n coldStart = \"ColdStart\",\r\n coldStartWC = \"ColdStartWC\",\r\n coldStartUpsellCard = \"ColdStartUpsellCard\",\r\n clarity = \"Clarity\",\r\n comments = \"Comments\",\r\n commonHeader = \"CommonHeader\",\r\n complexContentPreview = \"ComplexContentPreview\",\r\n conditionalBanner = \"ConditionalBanner\",\r\n conditionalBannerWC = \"ConditionalBannerWC\",\r\n contentPreview = \"ContentPreview\",\r\n contentProvider = \"ContentProvider\",\r\n contentRelated = \"ContentRelated\",\r\n contentActionsToolbar = \"ContentActionsToolbar\",\r\n contentSharingToolbar = \"ContentSharingToolbar\",\r\n cookieWall = \"CookieWall\",\r\n covidChatBot = \"CovidChatBot\",\r\n dailyBrief = \"DailyBrief\",\r\n dailyBriefWC = \"DailyBriefWC\",\r\n dashboardFallback = \"DashboardFallback\",\r\n dashboardSettings = \"DashboardSettings\",\r\n denseCard = \"DenseCard\",\r\n desktopFeed = \"DesktopFeed\",\r\n desktopFeedEdgeNext = \"DesktopFeedEdgeNext\",\r\n desktopFeedEdgeNextWC = \"DesktopFeedEdgeNextWC\",\r\n desktopFeedSingleColumn = \"DesktopFeedSingleColumn\",\r\n desktopFeedWC = \"DesktopFeedWC\",\r\n displayAds = \"DisplayAds\",\r\n displayAdsWC = \"DisplayAdsWC\",\r\n displayAdsWithContentFallback = \"DisplayAdsWithContentFallback\",\r\n edgeChromiumPage = \"EdgeChromiumPage\",\r\n edgeHeader = \"EdgeHeader\",\r\n edgeNextPage = \"EdgeNextPage\",\r\n edgePage = \"EdgePage\",\r\n edgePageSettings = \"PageSettings\",\r\n editorsChoicePromoCard = \"EditorsChoicePromoCard\",\r\n electionDelegateCounter = \"ElectionDelegateCounter\",\r\n electionEditorsNote = \"ElectionEditorsNote\",\r\n electionResultMap = \"ElectionResultMap\",\r\n electionResultsCard = \"ElectionResultsCard\",\r\n elections = \"Elections\",\r\n electionVisualizer = \"ElectionVisualizer\",\r\n enterpriseComplianceBanner = \"EnterpriseComplianceBanner\",\r\n enterpriseFeedContainer = \"EnterpriseFeedContainer\",\r\n enterpriseRightRail = \"EnterpriseRightRail\",\r\n enterpriseWaffle = \"EnterpriseWaffle\",\r\n entertainmentCard = \"EntertainmentCard\",\r\n entryPoint = \"EntryPoint\",\r\n entryPointEdgeNext = \"EntryPointEdgeNext\",\r\n entryPointOffice = \"EntryPointOffice\",\r\n esportsCard = \"EsportsCard\",\r\n esportsLivestreamCarouselWC = \"EsportsLivestreamCarouselWC\",\r\n eventHubHeroNav = \"EventHubHeroNav\",\r\n eventHubPage = \"EventHubPage\",\r\n externalContentPreview = \"ExternalContentPreview\",\r\n externalNativeAd = \"ExternalNativeAd\",\r\n familyCard = \"FamilyCard\",\r\n feedbackCard = \"FeedbackCard\",\r\n feedToggle = \"FeedToggle\",\r\n feedToggleWC = \"FeedToggleWC\",\r\n feedNavigationHp = \"FeedNavigationHp\",\r\n feedVisualizer = \"FeedVisualizer\",\r\n financeCurrencyConverter = \"FinanceCurrencyConverter\",\r\n firstPartyPage = \"FirstPartyPage\",\r\n flyoutCard = \"FlyoutCard\",\r\n feedbackDialog = \"FeedbackDialog\",\r\n feedbackDialogWC = \"FeedbackDialogWC\",\r\n feedbackLink = \"FeedbackLink\",\r\n feedEdgeNext = \"FeedEdgeNext\",\r\n financeCardCommon = \"FinanceCardCommon\",\r\n financeCompanyProfileCard = \"FinanceCompanyProfileCard\",\r\n financeDetailHeader = \"FinanceDetailHeader\",\r\n financeDetailComposition = \"FinanceDetailComposition\",\r\n financeDetailNavigation = \"FinanceDetailNavigation\",\r\n financeDetailPageV2 = \"FinanceDetailPageV2\",\r\n financeDiscoverySection = \"FinanceDiscoverySection\",\r\n financeFeeds = \"FinanceFeeds\",\r\n financeFinancialsCard = \"FinanceFinancialsCard\",\r\n financeKeyFactsCard = \"FinanceKeyFactsCard\",\r\n financeLandingPageV2 = \"FinanceLandingPageV2\",\r\n financeListLandingPage = \"FinanceListLandingPage\",\r\n financeMarketCard = \"FinanceMarketCard\",\r\n financeMarketStatus = \"FinanceMarketStatus\",\r\n financeNewsCard = \"FinanceNewsCard\",\r\n financeNewsContent = \"FinanceNewsContent\",\r\n financeDetailsCard = \"FinanceDetailsCard\",\r\n financeDetailsCardV2 = \"FinanceDetailsCardV2\",\r\n financeEarningsCalendarCard = \"FinanceEarningsCalendarCard\",\r\n financeEventsCalendarCard = \"FinanceEventsCalendarCard\",\r\n financeIndicesCard = \"FinanceIndicesCard\",\r\n financeMarketMoversCard = \"FinanceMarketMoversCard\",\r\n financePortfolioList = \"FinancePortfolioList\",\r\n financeRecentlyViewedCard = \"FinanceRecentlyViewedCard\",\r\n financeRecommendationCard = \"FinanceRecommendationCard\",\r\n financeRecommendationCardV2 = \"FinanceRecommendationCardV2\",\r\n financeWatchlistCard = \"FinanceWatchlistCard\",\r\n financeWatchlistMiniView = \"FinanceWatchlistMiniView\",\r\n financeWatchlistListView = \"FinanceWatchlistListView\",\r\n financeWatchlistManagement = \"FinanceWatchlistManagement\",\r\n financeWatchlistPage = \"FinanceWatchlistPage\",\r\n financeWatchlistPageV2 = \"FinanceWatchlistPageV2\",\r\n financeSearchBox = \"FinanceSearchBox\",\r\n financeFollowButton = \"FinanceFollowButton\",\r\n financeTrendCard = \"FinanceTrendCard\",\r\n footerWindowsShell = \"FooterWindowsShell\",\r\n freMarketSelector = \"FreMarketSelector\",\r\n frequentSitesCard = \"FrequentSitesCard\",\r\n frequentSitesCardWC = \"FrequentSitesCardWC\",\r\n galleryPage = \"GalleryPage\",\r\n generalElections = \"GeneralElections\",\r\n gmailEmailPreview = \"GmailEmailPreview\",\r\n headerEdgeNext = \"HeaderEdgeNext\",\r\n headerNavigationLogo = \"HeaderNavigationLogo\",\r\n headerWindowsShell = \"HeaderWindowsShell\",\r\n hiddenContent = \"HiddenContent\",\r\n homePage = \"HomePage\",\r\n horoscopeAnswerCard = \"HoroscopeAnswerCard\",\r\n horoscopeAnswerCardWC = \"HoroscopeAnswerCardWC\",\r\n iframe = \"IFrame\",\r\n imageSearch = \"ImageSearch\",\r\n industryNewsCard = \"IndustryNewsCard\",\r\n infopane = \"Infopane\",\r\n interests = \"Interests\",\r\n interestsLeftRail = \"InterestsLeftRail\",\r\n interestsSearch = \"InterestsSearch\",\r\n interestsV1Wrapper = \"InterestsV1Wrapper\",\r\n interestsV2 = \"InterestsV2\",\r\n interestsV3 = \"InterestsV3\",\r\n interestsWC = \"InterestsWC\",\r\n languageToggle = \"LanguageToggle\",\r\n layoutSwitcher = \"LayoutSwitcher\",\r\n layoutToggle = \"LayoutToggle\",\r\n legacySharingToolbar = \"LegacySharingToolbar\",\r\n localNews = \"LocalNews\",\r\n localNewsViewCard = \"LocalNewsViewCard\",\r\n locationContentCard = \"LocationContentCard\",\r\n locationSelector = \"LocationSelector\",\r\n locationTime = \"LocationTime\",\r\n lottery = \"Lottery\",\r\n marketAggregator = \"MarketAggregator\",\r\n marketSelector = \"MarketSelector\",\r\n meControl = \"MeControl\",\r\n meStripe = \"MeStripe\",\r\n meStripeWC = \"MeStripeWC\",\r\n meetNow = \"MeetNow\",\r\n microsoftFeedCard = \"MicrosoftFeedCard\",\r\n microsoftEdgeWidget = \"MicrosoftEdgeWidget\",\r\n microsoftLogo = \"MicrosoftLogo\",\r\n microsoftNewsPage = \"MicrosoftNewsPage\",\r\n migrationConsent = \"MigrationConsent\",\r\n miniApps = \"miniApps\",\r\n mmxPage = \"MMXPage\",\r\n mnsCreatorDashboard = \"MnsCreatorDashboard\",\r\n modernRightRail = \"ModernRightRail\",\r\n moneyCard = \"MoneyCard\",\r\n moneyInfoCard = \"MoneyInfoCard\",\r\n moneyInfoCardWC = \"MoneyInfoCardWC\",\r\n mobileFeed = \"MobileFeed\",\r\n msnSettingMenu = \"MsnSettingMenu\",\r\n msRewards = \"MsRewards\",\r\n msRewardsWC = \"MsRewardsWC\",\r\n myBriefRiverCard = \"MyBriefRiverCard\",\r\n nativeAd = \"NativeAd\",\r\n newsbarFeed = \"NewsbarFeed\",\r\n notificationBell = \"NotificationBell\",\r\n notificationBellWC = \"NotificationBellWC\",\r\n office = \"Office\",\r\n officeContainer = \"OfficeContainer\",\r\n officeDocumentCard = \"OfficeDocumentCard\",\r\n officeDocumentsTable = \"OfficeDocumentsTable\",\r\n officeDocumentsTableWC = \"OfficeDocumentsTableWC\",\r\n officeLeftRail = \"OfficeLeftRail\",\r\n oneFooter = \"OneFooter\",\r\n overlay = \"Overlay\",\r\n outlookEmailPreview = \"OutlookEmailPreview\",\r\n onThisDayCard = \"OnThisDayCard\",\r\n onThisDayCardWC = \"OnThisDayCardWC\",\r\n pageRefresh = \"PageRefresh\",\r\n partnerWidget = \"PartnerWidget\",\r\n personalizeNavButton = \"PersonalizeNavButton\",\r\n photoCard = \"PhotoCard\",\r\n pivotContent = \"PivotContent\",\r\n pivotContentV2 = \"PivotContentV2\",\r\n pivotsNav = \"PivotsNav\",\r\n pivotsNavV2 = \"PivotsNavV2\",\r\n pivotsNavEdgeNext = \"PivotsNavEdgeNext\",\r\n pollsCard = \"PollsCard\",\r\n pollsCardWC = \"PollsCardWC\",\r\n portugueseElectionExperience = \"PortugueseElectionExperience\",\r\n poweredByLegend = \"PoweredbyLegend\",\r\n poweredByLegendWC = \"PoweredbyLegendWC\",\r\n proactiveCanvas = \"ProactiveCanvas\",\r\n productivityHub = \"ProductivityHub\",\r\n productivityHubContainer = \"ProductivityHubContainer\",\r\n promoBanner = \"PromoBanner\",\r\n publisherCarousel = \"PublisherCarousel\",\r\n publishersManagement = \"PublishersManagement\",\r\n qna = \"Qna\",\r\n qnaFeedPage = \"QnaFeedPage\",\r\n qnaFeedCard = \"QnaFeedCard\",\r\n qnaFeedCardMenu = \"QnaFeedCardMenu\",\r\n qnaFeedCategoriesMenu = \"QnaFeedCategoriesMenu\",\r\n qnaFeedList = \"QnaFeedList\",\r\n qnaFeedMyTopics = \"QnaFeedMyTopics\",\r\n qnaFeedRelatedQuestions = \"QnaFeedRelatedQuestions\",\r\n qnaFeedReportCard = \"QnaFeedReportCard\",\r\n qnaFeedSuggestedTopics = \"QnaFeedSuggestedTopics\",\r\n qnaFeedTopicDetail = \"QnaFeedTopicDetail\",\r\n qnaFeedTrendingQuestions = \"QnaFeedTrendingQuestions\",\r\n recipesCards = \"RecipesCards\",\r\n recipesFeed = \"RecipesFeed\",\r\n recipesSearch = \"RecipesSearch\",\r\n recipesSingleDetail = \"RecipesSingleDetail\",\r\n recipesSingleVideo = \"RecipesSingleVideo\",\r\n recommendedCard = \"RecommendedCard\",\r\n recommendedCardWC = \"RecommendedCardWC\",\r\n recommendedCardFeed = \"RecommendedCardFeed\",\r\n recommendedDocuments = \"RecommendedDocuments\",\r\n recommendedSearch = \"RecommendedSearch\",\r\n recommendedSearchBelowSearchBox = \"RecommendedSearchBelowSearchBox\",\r\n recommendedSearchCarousel = \"RecommendedSearchCarousel\",\r\n recommendedSearchCarouselWC = \"RecommendedSearchCarouselWC\",\r\n recommendedSites = \"RecommendedSites\",\r\n recommendedSitesWC = \"RecommendedSitesWC\",\r\n recommendedTopics = \"RecommendedTopics\",\r\n relatedArticleBlock = \"RelatedArticleBlock\",\r\n relatedSearchesCard = \"RelatedSearchesCard\",\r\n rightRail = \"RightRail\",\r\n rightRailCards = \"RightRailCards\",\r\n rightRailCarousel = \"RightRailCarousel\",\r\n river = \"River\",\r\n riverPlaceholder = \"RiverPlaceholder\",\r\n searchBoxCommon = \"SearchBoxCommon\",\r\n searchBoxEdge = \"SearchBoxEdge\",\r\n searchBoxEdgeNext = \"SearchBoxEdgeNext\",\r\n searchBoxEdgeNextWC = \"SearchBoxEdgeNextWC\",\r\n searchBoxWC = \"SearchBoxWC\",\r\n searchHistoryCommon = \"SearchHistoryCommon\",\r\n searchHistoryEdge = \"SearchHistoryEdge\",\r\n searchHistoryEdgenext = \"SearchHistoryEdgenext\",\r\n searchHistoryEdgeNextWC = \"SearchHistoryEdgeNextWC\",\r\n seeMoreButtonWindowsShell = \"SeeMoreButtonWindowsShell\",\r\n selectCarousel = \"SelectCarousel\",\r\n sentimentBarChart = \"SentimentBarChart\",\r\n sentimentLineChart = \"SentimentLineChart\",\r\n sentimentMap = \"SentimentMap\",\r\n sentimentResultCard = \"SentimentResultCard\",\r\n serviceWaffle = \"ServiceWaffle\",\r\n settingsDialogEdgeNext = \"SettingsDialogEdgeNext\",\r\n settingsDialogEdgeNextWC = \"SettingsDialogEdgeNextWC\",\r\n settingsDialogMsNews = \"SettingsDialogMsNews\",\r\n sharedLinksCard = \"SharedLinksCard\",\r\n sharedState = \"SharedState\",\r\n sharePointSitesTable = \"SharePointSitesTable\",\r\n shopContentCarousel = \"ShopContentCarousel\",\r\n shoppingCarousel = \"ShoppingCarousel\",\r\n shoppingCarouselWC = \"ShoppingCarouselWC\",\r\n shoppingContentCard = \"ShoppingContentCard\",\r\n shoppingGrid = \"ShoppingGrid\",\r\n shoppingPage = \"ShoppingPage\",\r\n shoppingPageContent = \"ShoppingPageContent\",\r\n shoppingSmartList = \"ShoppingSmartList\",\r\n shoppingSmartListWC = \"ShoppingSmartListWC\",\r\n showFeed = \"ShowFeed\",\r\n simpleBanner = \"SimpleBanner\",\r\n slideShow = \"SlideShow\",\r\n smartList = \"SmartList\",\r\n social = \"Social\",\r\n socialBar = \"SocialBar\",\r\n socialBarWC = \"SocialBarWC\",\r\n socialComment = \"SocialComment\",\r\n socialProfile = \"SocialProfile\",\r\n sportsCard = \"SportsCard\",\r\n sportsCardWC = \"SportsCardWC\",\r\n sportsMatchupCard = \"SportsMatchupCard\",\r\n spotlight = \"Spotlight\",\r\n spotlightPreview = \"SpotlightPreview\",\r\n starterKit = \"StarterKit\",\r\n starterKitWC = \"StarterKitWC\",\r\n storyPage = \"StoryPage\",\r\n storySnippet = \"StorySnippet\",\r\n stripe = \"Stripe\",\r\n stripeFeed = \"StripeFeed\",\r\n stripeView = \"StripeView\",\r\n summaryCard = \"SummaryCard\",\r\n summaryCardWC = \"SummaryCardWC\",\r\n superAppPage = \"SuperAppHomepage\",\r\n superappHeaderData = \"SuperappHeaderData\",\r\n tabbedInfopane = \"TabbedInfopane\",\r\n tabbedInfopaneTabPreview = \"TabbedInfopaneTabPreview\",\r\n taboolaRiver = \"TaboolaRiver\",\r\n tasksCard = \"TasksCard\",\r\n themePicker = \"ThemePicker\",\r\n themePickerWC = \"ThemePickerWC\",\r\n tipsCard = \"TipsCard\",\r\n toast = \"Toast\",\r\n toastWC = \"ToastWC\",\r\n todaysEventsCard = \"TodaysEventsCard\",\r\n todoCard = \"TodoCard\",\r\n todoCardWC = \"TodoCardWC\",\r\n topicsHub = \"TopicsHub\",\r\n topSites = \"TopSites\",\r\n topSitesCommon = \"TopSitesCommon\",\r\n topSitesEdge = \"TopSitesEdge\",\r\n topSitesEdgeNext = \"TopSitesEdgeNext\",\r\n topSitesEdgeNextWC = \"TopSitesEdgeNextWC\",\r\n trafficCard = \"TrafficCard\",\r\n trafficCardWC = \"TrafficCardWC\",\r\n trafficMap = \"TrafficMap\",\r\n trafficPage = \"TrafficPage\",\r\n trendingNews = \"TrendingNews\",\r\n trendingNow = \"TrendingNow\",\r\n trendingNowWC = \"TrendingNowWC\",\r\n tripleCard = \"TripleCard\",\r\n userInitiatedPageRefresh = \"UserInitiatedPageRefresh\",\r\n userProfileDisplay = \"UserProfileDisplay\",\r\n verticalLeftNav = \"VerticalLeftNav\",\r\n videoCard = \"VideoCard\",\r\n videoCardWC = \"VideoCardWC\",\r\n videoContent = \"VideoContent\",\r\n videoList = \"VideoList\",\r\n viewsArticle = \"ViewsArticle\",\r\n viewsContentHeader = \"ViewsContentHeader\",\r\n viewsGallery = \"ViewsGallery\",\r\n viewsNativeAd = \"ViewsNativeAd\",\r\n viewsPaddles = \"ViewsPaddles\",\r\n voiceSearch = \"VoiceSearch\",\r\n voiceSearchWC = \"VoiceSearchWC\",\r\n waffleWC = \"WaffleWC\",\r\n watch = \"Watch\",\r\n watchlistCard = \"WatchlistCard\",\r\n watchlistView = \"WatchlistView\",\r\n weatherCard = \"WeatherCard\",\r\n weatherCardWC = \"WeatherCardWC\",\r\n weatherCarousel = \"WeatherCarousel\",\r\n weatherData = \"WeatherData\",\r\n weatherLocationSearch = \"WeatherLocationSearch\",\r\n weatherMap = \"WeatherMap\",\r\n weatherMapMini = \"WeatherMapMini\",\r\n weatherOverview = \"WeatherOverview\",\r\n weatherPage = \"WeatherPage\",\r\n weatherPageV2 = \"WeatherPageV2\",\r\n weatherInfoCard = \"WeatherInfoCard\",\r\n weatherToast = \"WeatherToast\",\r\n weatherTodayCard = \"WeatherTodayCard\",\r\n weatherTodayMini = \"WeatherTodayMini\",\r\n welcomeGreeting = \"WelcomeGreeting\",\r\n welcomeGreetingWC = \"WelcomeGreetingWC\",\r\n widgets = \"Widgets\",\r\n windowsPage = \"WindowsPage\",\r\n windowsShellContentPreview = \"WindowsShellContentPreview\",\r\n windowsShellRiver = \"WindowsShellRiver\",\r\n ugcCreator = \"UgcCreator\",\r\n xfeed = \"Xfeed\",\r\n xfeedWC = \"XfeedWC\"\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { DynamicReducer, initializeDataConnectorTracker } from \"@msnews/experiences-dynamic-reducer\";\r\nimport { IDataConnector, IReducer, ConnectorConstants } from \"@msnews/experiences-redux-contracts\";\r\nimport { PerfTimeline, tryGetPerfTimeline } from \"@msnews/diagnostics\";\r\nimport { Subspace, subspace } from \"redux-subspace\";\r\nimport { merge as _merge, set as _set } from \"lodash-es\";\r\n\r\nimport { IRequestContext } from \"@msnews/core\";\r\nimport { Store } from \"redux\";\r\nimport { tryGetDataConnector } from \"../reducers/GetDataConnector\";\r\n\r\n// Inject DataConnectorTracker with tryGetDataConnector function to avoid a dependency cycle.\r\ninitializeDataConnectorTracker(tryGetDataConnector);\r\n\r\n/**\r\n * Base class for data connectors.\r\n * A Data connector is a the base for all connectors in a msnews-experiences-redux application. The data connector has\r\n * the methods and properties that manage a state object, which can either be a sub-state within the app, or the full\r\n * application state tree\r\n * @class\r\n */\r\nexport class DataConnector implements IDataConnector {\r\n /**\r\n * The Redux subspace store for this connector\r\n * @type {Subspace}\r\n */\r\n protected _subspace: Subspace;\r\n\r\n /**\r\n * The full namespace, including all of the ancestors, in dotted notation:\r\n * i.e.: parent.child.grandchild\r\n */\r\n private _fullNamespace: string;\r\n\r\n /**\r\n * The perf timeline object for this connector\r\n */\r\n private _perfTimeline: PerfTimeline;\r\n\r\n /**\r\n * The config href for the connector\r\n */\r\n private _configHref: string;\r\n\r\n /**\r\n * Gets the Redux store for this data connector instance, which is a subspace within the parent state\r\n * @property\r\n * @returns {Store} The state subspace for this connector, which looks like a Redux Store\r\n */\r\n public get store(): Store {\r\n return this._subspace;\r\n }\r\n\r\n /**\r\n * Gets the full namespace for this connector\r\n * @property\r\n * @returns {string} The connector's full namespace\r\n */\r\n public get fullNamespace(): string {\r\n return this._fullNamespace;\r\n }\r\n\r\n /**\r\n * The perf timeline object for this connector\r\n */\r\n public get perfTimeline(): PerfTimeline {\r\n return this._perfTimeline;\r\n }\r\n\r\n /**\r\n * Get the config href for the connector\r\n */\r\n public get configHref(): string {\r\n return this._configHref;\r\n }\r\n /**\r\n * Set the config href for the connector\r\n */\r\n public set configHref(href: string) {\r\n this._configHref = href;\r\n }\r\n\r\n /**\r\n * Construct a new Data connector\r\n * @constructor\r\n * @param { string } namespace The redux subspace namespace for the connector\r\n * @param { string } parentNamespace The redux subspace namespace for the parent connector, if it exists\r\n * @param { DynamicReducer } rootReducer The root reducer for the Application\r\n * @param { IReducer } reducer The reducer for this connector instance\r\n * @param { Store} parentStore The parent store (or redux subspace) that this connector will be a subspace within\r\n * @param { TConfig } config Param containing the config for the connector\r\n * @param { IRequestContext } requestContext The request context\r\n * @param { boolean } isGlobal Optional param to set if the connector should be global or not. Defaults to false\r\n */\r\n public constructor(\r\n public readonly namespace: string,\r\n public readonly parentNamespace: string,\r\n public readonly rootReducer: DynamicReducer,\r\n public readonly reducer: IReducer,\r\n parentStore: Store,\r\n public config: TConfig,\r\n public requestContext: IRequestContext,\r\n public readonly isGlobal: boolean = false) {\r\n // Setup the full namespace. This namespace will be used as the parentNamespace to any connectors created as children of this\r\n // connector. It is the \"dotted\" concatenation of the parentNamespace + namespace, which represents the key into the state tree for the child connectors\r\n this._fullNamespace = (typeof parentNamespace !== \"undefined\" && parentNamespace !== \"\") ? parentNamespace + \".\" + namespace : namespace;\r\n\r\n // setup the sub-spaced store with a state selector that is bound to this connector's instance, and returns the inner state object (TState) for this connector\r\n this.selectState = this.selectState.bind(this);\r\n this._subspace = subspace(this.selectState, this.namespace)(parentStore);\r\n\r\n // try to create a perf timeline for this connector\r\n this._perfTimeline = this.tryGetPerfTimeline(namespace);\r\n\r\n rootReducer.addSubReducerForConnector(this);\r\n }\r\n\r\n /**\r\n * Gets the current state of the connector. The connector's state (TState) is the sub-portion of the returned state object with the postfix \"State\"\r\n * This is because the overall subspace state for the connector will contain the children states as well\r\n * @method\r\n * @returns {TState} The current state of the component.\r\n */\r\n public getCurrentState(): TState {\r\n // Get the subspace state for this connector. It will be something like:\r\n // { _@STATE@_ : { TState }}, where the subspace selector will already have been used to get the namespaced substate\r\n const wrappedState: TState = this.store.getState();\r\n\r\n // Get the currentState, that will be returned. By default it wil be just the state for this controller\r\n const connectorState = wrappedState[ConnectorConstants.connectorStateKey];\r\n\r\n // If the connector's state is not global, then check to see if there are any global connectors it needs to be merged with\r\n // If the connector is global, then its state is just returned, otherwise we would have an infinte loop merging a global connectors's\r\n // state with itself.\r\n if (!this.isGlobal) {\r\n // Get the list of global connectors\r\n const globalConnectors = this.rootReducer.globalConnectors();\r\n\r\n // See if there are any global connectors that need to be merged in.\r\n if (globalConnectors.length !== 0) {\r\n // For each global connector, merge it's state into the final result, using the global connector's namespace\r\n // So the resulting state will be:\r\n // { globalConnectorNamespace: { state }, TSTATE }}\r\n globalConnectors.forEach(globalConnector => {\r\n _set(connectorState, globalConnector.namespace, globalConnector.getCurrentState());\r\n });\r\n }\r\n }\r\n return connectorState;\r\n }\r\n\r\n /**\r\n * The method is called as the application is starting up, components are created.\r\n * The method can be used by connectors to perform one time initialization functions\r\n * This method needs to be overridden if your connector has specific startup needs\r\n * @method\r\n * @returns void\r\n */\r\n public onApplicationStart(): void { /** no-op */ }\r\n\r\n /**\r\n * The subspace selector that gets the portion of the state tree that is for this connector\r\n * @param state The parent state object that contains the subspace\r\n */\r\n private selectState(state: TParentState): TState {\r\n return (state[this.namespace]);\r\n }\r\n\r\n /**\r\n * Attempts to create the {PerfTimeline} object for this connector\r\n */\r\n private tryGetPerfTimeline(namespace: string): PerfTimeline {\r\n\r\n const namespaceParts = namespace.split(\"_\");\r\n const [connectorType] = namespaceParts;\r\n\r\n // there may not be any instance id -- in which case this would simply be the connector type.\r\n const instanceId = namespaceParts[namespaceParts.length - 1];\r\n\r\n // get the perf timeline object if applicable to the current experience\r\n return tryGetPerfTimeline(connectorType, instanceId);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * The \"DeferralHandlerSignature\" is a callback signature is called used when an experience is deferred on the callback to be resolved.\r\n * This callback should return a Promise that resolves with a boolean.\r\n */\r\nexport type DeferralHandlerSignature = () => Promise;\r\n\r\n/**\r\n * Deferral type of an experience\r\n */\r\nexport enum DeferralEventType {\r\n /**\r\n * Standard Deferral Event Type based on page/experience lifecycle based events like AboveTheFoldReady or other experience available\r\n */\r\n StandardEventBasedDeferral = 0,\r\n\r\n /**\r\n * Custom Deferral Event Type based like belowTheFoldTransitionStart which hoooked to work with UI events like intersectionObserver.\r\n */\r\n CustomEventBasedDeferral = 1\r\n}\r\n\r\n/**\r\n * Type to resolve deferral info to calling code\r\n */\r\nexport interface ExperienceDeferralMetadata {\r\n /**\r\n * Deferral type of an experience\r\n */\r\n deferralType: DeferralEventType;\r\n\r\n /**\r\n * A callback that resolves with a bool to specify when the experience is ready to load/render\r\n */\r\n shouldResolve: DeferralHandlerSignature\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\n\r\ntype DataConnectorStateCallback = (newState: any) => void;\r\n\r\nconst callbackMap: { [dataConnectorName: string]: DataConnectorStateCallback[] } = {};\r\nlet getDataConnector: (dataConnectorName: ConnectorNamespaces) => any;\r\n\r\n/**\r\n * Sets up the data connector tracker. Needed to avoid a dependency cycle.\r\n * @param tryGetDataConnector The method to use to get the data connector.\r\n */\r\nexport function initializeDataConnectorTracker(tryGetDataConnector: (dataConnectorName: ConnectorNamespaces) => any) {\r\n getDataConnector = tryGetDataConnector;\r\n}\r\n\r\n/**\r\n * Subscribes to changes in data connector state.\r\n * @param dataConnectorName The name of the data connector to subscribe to.\r\n * @param callback The callback function to invoke when the state changes.\r\n * @param fireForInitialState True to fire the callback immediately when the data connector is already initialized. Defaults to true.\r\n */\r\nexport function subscribeDataConnectorState(dataConnectorName: ConnectorNamespaces, callback: (newState: TState) => void, fireForInitialState = true) {\r\n let callbackList = callbackMap[dataConnectorName];\r\n if (!callbackList) {\r\n callbackList = [];\r\n callbackMap[dataConnectorName] = callbackList;\r\n }\r\n\r\n callbackList.push(callback);\r\n\r\n if (fireForInitialState) {\r\n const dataConnector = getDataConnector(dataConnectorName);\r\n if (dataConnector) {\r\n const initialState = dataConnector.getCurrentState();\r\n if (initialState) {\r\n callback(initialState);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Reports a state change for a data connector to interested parties.\r\n * @param dataConnectorName The name of the data connector whose state changed.\r\n * @param newState The new state.\r\n */\r\nexport function reportDataConnectorStateChange(dataConnectorName: string, newState: any) {\r\n const callbacks: DataConnectorStateCallback[] = callbackMap[dataConnectorName];\r\n if (callbacks && newState) {\r\n for (const callback of callbacks) {\r\n callback(newState);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Defines valid milestone event types\r\n */\r\nexport enum ExperienceMilestoneEventTypes {\r\n /**\r\n * Fired when all the initial DOM elements for the experience have been added (i.e. onComponentDidMount)\r\n * The DOM may not be completely rendered by the browser when then milestone is reached\r\n */\r\n domComplete,\r\n\r\n /**\r\n * Fired if the experience hits an unrecoverable error\r\n */\r\n error,\r\n\r\n /**\r\n * Fired when the experience is initialized\r\n */\r\n initialized,\r\n\r\n /**\r\n * Fired when the experience is initially rendered. This is after the browser has processed all of the DOM elements that were\r\n * added in the experience render function.\r\n */\r\n rendered,\r\n\r\n /**\r\n * Fired when the experience's stale state revalidation completes.\r\n */\r\n staleRevalidationComplete,\r\n\r\n /**\r\n * Fired when the experience is visually ready, which is a business metric and defined in the MSNews Performance Metrics documentation.\r\n */\r\n visuallyReady,\r\n\r\n /**\r\n * Fired when the experience starts loading\r\n */\r\n startLoading\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum ExperienceCompositionTypes {\r\n grid = \"grid\",\r\n horizontalStack = \"horizontalStack\",\r\n layout = \"layout\",\r\n verticalStack = \"verticalStack\",\r\n customExperience = \"customExperience\"\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration of possible children types that can be rendered into a layout column\r\n */\r\nexport enum ChildrenTypes {\r\n /**\r\n * A Fast DNA ActionTrigger component\r\n */\r\n actionTrigger = \"ActionTrigger\",\r\n /**\r\n * A Fast DNA Button component\r\n */\r\n button = \"Button\",\r\n\r\n /**\r\n * A Fast DNA Heading component\r\n */\r\n heading = \"Heading\",\r\n\r\n /**\r\n * A React Peregrine Experience\r\n */\r\n peregrineExperience = \"PeregrineExperience\",\r\n\r\n /**\r\n * A Fast DNA Typography component\r\n */\r\n typography = \"Typography\",\r\n\r\n /**\r\n * A Web Component Experience\r\n */\r\n webComponentExperience = \"WebComponentExperience\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ObjectTelemetryContract, Telemetry, TelemetryObjectBase, TelemetryType } from \"@msnews/telemetry-contracts\";\r\n\r\n/**\r\n * Try creating and adding a child telemetry object to the parent object.\r\n * This is useful when you you have a list of children that will be loaded asynchronously.\r\n * Loading children asynchronously has the detrimental effect that telemetry ordinal IDs will\r\n * be non deterministically generated (as they are usually generated via in increment on the number\r\n * of existing children, and that is incremented when the child's onComponentConnect is called, which\r\n * could be at any time).\r\n * @returns the created child telemetry object.\r\n */\r\nexport function tryAddOrderedTelemetryChild(parent: TelemetryObjectBase, childExperienceType: string): TelemetryObjectBase | null {\r\n if (parent) {\r\n const telemetryContract = {\r\n type: TelemetryType.Module,\r\n name: childExperienceType,\r\n content: {}\r\n } as ObjectTelemetryContract;\r\n\r\n return parent.addOrUpdateChild(telemetryContract);\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Helper to get the ocid for the page\r\n * @returns - the ocid if avaliable, else undefined\r\n */\r\nexport function getOcid(): string | undefined {\r\n if (!Telemetry) {\r\n return;\r\n }\r\n\r\n const pageMetadata = Telemetry.getPageMetadata();\r\n\r\n if (!pageMetadata || !pageMetadata.contract || !pageMetadata.contract.page) {\r\n return;\r\n }\r\n\r\n return pageMetadata.contract.page.ocid;\r\n}\r\n\r\n/**\r\n * Appends page ocid into given URL\r\n * @param url - destination URL\r\n * @returns the modified URL if ocid not added\r\n */\r\nexport function appendOcid(url: string): string {\r\n const ocid = getOcid();\r\n const lowerCaseUrl = url.toLowerCase();\r\n if (!ocid || lowerCaseUrl.indexOf(\"?ocid=\") != -1 || lowerCaseUrl.indexOf(\"&ocid=\") != -1) {\r\n return url;\r\n }\r\n const token = (url.indexOf(\"?\") == -1) ? \"?\" : \"&\";\r\n return `${url}${token}ocid=${encodeURIComponent(ocid)}`;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { pageRevealStartMarker, timeToVideoStart, timeToVisuallyReady } from \"./PerfMarkerConstants\";\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { getPageTimings } from \"./PageTimings\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { perfMarker } from \"./PerfMarker\";\r\n\r\n/** Collection of marker names grouped by marker type */\r\nexport interface MarkerNames {\r\n /** Array of timeToFunctional names */\r\n TTF?: string[];\r\n\r\n /** Array of timeToVisualReady names */\r\n TTVR?: string[];\r\n\r\n /** Array of timeToPageReveal names */\r\n TTPR?: string[];\r\n}\r\n\r\n/** Enum for PerfMarkersGroup */\r\nexport enum PerfMarkersGroup {\r\n Primary = \"primary\",\r\n Secondary = \"secondary\"\r\n}\r\n\r\nlet remainingMarkers: Set;\r\nlet remainingSecondaryMarkers: Set;\r\nlet remainingTtvrMarkers: Set;\r\nlet remainingTtprMarkers: Set;\r\nlet ttvrMarkers: Set;\r\n\r\nlet ttvrPromise: Promise<[string, number][]>;\r\nlet resolveTtvrCallback: (markers: [string, number][]) => void;\r\n\r\nlet perfMarkerPromise: Promise<[string, number][]>;\r\nlet perfMarkerResolveCallback: (markers: [string, number][]) => void;\r\nlet secondaryPerfMarkerPromise: Promise<[string, number][]>;\r\nlet secondaryPerfMarkerResolveCallback: (markers: [string, number][]) => void;\r\n\r\nlet ttvsMarkerPromise: Promise<[string, number][]>;\r\nlet resolveTtvsCallback: (ttvs: [string, number][]) => void;\r\n\r\nlet ttprMarkerPromise: Promise<[string, number][]>;\r\nlet resolveTtprCallback: (ttpr: [string, number][]) => void;\r\n\r\n/** The markers map. Key is the experience name, e.g. \"River\". Value is the number of milliseconds it took to reach that marker. */\r\nlet primaryMarkers: Map = new Map();\r\n\r\n/** The secondary markers map. Key is the experience name, e.g. \"TTS.NativeAd\". Value is the number of milliseconds it took to reach that marker. */\r\nlet secondaryMarkers: Map = new Map();\r\n\r\nconst ttfPrefix = \"TTF.\";\r\nconst ttvrPrefix = \"TTVR.\";\r\nconst ttvsPrefix = \"TTVS.\";\r\nconst ttprPrefix = \"TTPR.\";\r\nconst ttslPrefix = \"TTSL.\";\r\n\r\nlet isSetMarkersCalled = false;\r\n\r\n/**\r\n * Saves the Time To Functional timestamp for the given marker and also marks the performance timeline.\r\n * If the same marker is added again, it overrides with the original marker.\r\n * @param name - The marker name\r\n * @param markTimeNA - To set -1 mark time for the TTF to resolve the dependency.\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nexport function markTtf(name = \"\", markTimeNA = false, time?: number): void {\r\n if (canUseDOM()) {\r\n time = time || window.performance.now();\r\n return setMark(ttfPrefix, name, markTimeNA, time);\r\n }\r\n}\r\n\r\n/**\r\n * Saves the Time To Visually Ready timestamp for the given marker and also marks the performance timeline.\r\n * If the same marker is added again, it overrides with the original marker.\r\n * @param name - The marker name\r\n * @param markTimeNA - To set -1 mark time for the TTVR to resolve the dependency.\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nexport function markTtvr(name = \"\", markTimeNA = false, time?: number): void {\r\n if (canUseDOM()) {\r\n time = time || window.performance.now();\r\n return setMark(ttvrPrefix, name, markTimeNA, time);\r\n }\r\n}\r\n\r\n/**\r\n * Helper that wraps the markTtvr call inside a request animation frame and setTimeout\r\n * with the idea that this will allow the experience time to render before setting the mark\r\n * @param name The marker name\r\n * @param markTimeNA To set -1 mark time for the TTVR to resolve the dependency\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nexport function markTtvrRaf(name = \"\", markTimeNA = false, time?: number): void {\r\n if (canUseDOM()) {\r\n time = time || window.performance.now();\r\n window.requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n markTtvr(name, markTimeNA, time);\r\n }, 0);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Saves the Time To Page Reveal timestamp for the given marker.\r\n * The call is inside a request animation frame and setTimeout,\r\n * with the idea that this will allow the experience time to render before setting the mark.\r\n * @param name The marker name\r\n */\r\nexport function markTtprRaf(name = \"\"): void {\r\n window.requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n const startMarker = getSinglePerfMarkStartTimeByName(pageRevealStartMarker);\r\n const time = startMarker === -1\r\n ? -1\r\n : performance.now() - startMarker;\r\n\r\n setMark(ttprPrefix, name, false, time);\r\n }, 0);\r\n });\r\n\r\n if (!ttprMarkerPromise) {\r\n // add the promise\r\n waitForTtprMarkers();\r\n }\r\n}\r\n\r\n/**\r\n * Saves the Time to Video Start timestamp for the given marker and also marks the performance timeline.\r\n * If the same marker is added again, it overrides with the original marker.\r\n * @param name - The marker name\r\n * @param markTimeNA - To set -1 mark time for the TTVR to resolve the dependency.\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nexport function markTtvs(name = \"\", markTimeNA = false, time?: number): void {\r\n if (canUseDOM()) {\r\n time = time || window.performance.now();\r\n return setMark(ttvsPrefix, name, markTimeNA, time);\r\n }\r\n}\r\n\r\n/**\r\n * Saves the Time To Start Loading timestamp for the given marker and also marks the performance timeline.\r\n * If the same marker is added again, it overrides with the original marker.\r\n * @param name - The marker name\r\n * @param markTimeNA - To set -1 mark time for the TTVR to resolve the dependency.\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nexport function markTtsl(name = \"\", markTimeNA = false, time?: number): void {\r\n if (canUseDOM()) {\r\n time = time || window.performance.now();\r\n return setMark(ttslPrefix, name, markTimeNA, time);\r\n }\r\n}\r\n\r\n/**\r\n * Saves the time stamp for a given secondary perf marker.\r\n * @param markerName - The marker name\r\n * @param time - Time in milliseconds\r\n */\r\nexport function setSecondaryPerfMarkerTime(markerName: string, time?: number) {\r\n // return if the marker already exists.\r\n if (secondaryMarkers.get(markerName)) {\r\n return;\r\n }\r\n\r\n const existingMarker = performance.getEntriesByName && performance.getEntriesByName(markerName);\r\n const isMarkerSet = Boolean(existingMarker && existingMarker.length);\r\n\r\n if (!isMarkerSet) {\r\n perfMarker.singleMark(markerName);\r\n\r\n if (isNullOrUndefined(time)) {\r\n secondaryMarkers.set(markerName, -1);\r\n } else {\r\n secondaryMarkers.set(markerName, Math.round(time));\r\n }\r\n } else {\r\n secondaryMarkers.set(markerName, Math.round(existingMarker[0].startTime));\r\n }\r\n\r\n // Notify any callers waiting for reports\r\n if (remainingSecondaryMarkers && remainingSecondaryMarkers.delete(markerName) && remainingSecondaryMarkers.size === 0 && secondaryPerfMarkerResolveCallback) {\r\n secondaryPerfMarkerResolveCallback(getSecondaryMarkers());\r\n }\r\n}\r\n\r\n/**\r\n * Saves the timestamp for the given marker and also marks the performance timeline.\r\n * If the same marker is added again, it overrides with the original marker.\r\n * @param name - The marker name\r\n * @param markTimeNA - To set -1 mark time for the ttvr to resolve the dependency.\r\n * @param time - The elapsed time since window.performance.timing.navigationStart\r\n */\r\nfunction setMark(prefix: string, name: string, markTimeNA: boolean, time: number): void {\r\n if (!(name && name.length)) {\r\n return;\r\n }\r\n\r\n if (!(prefix && prefix.length)) {\r\n return;\r\n }\r\n\r\n const markerFullName = prefix + name;\r\n\r\n // To check if the marker exists then return.\r\n if (primaryMarkers.get(markerFullName)) {\r\n return;\r\n }\r\n\r\n const existingMarker = performance.getEntriesByName && performance.getEntriesByName(markerFullName);\r\n const isMarkerSet = Boolean(existingMarker && existingMarker.length);\r\n\r\n if (!isMarkerSet) {\r\n perfMarker.singleMark(markerFullName);\r\n\r\n if (markTimeNA) {\r\n primaryMarkers.set(markerFullName, -1);\r\n } else {\r\n primaryMarkers.set(markerFullName, Math.round(time));\r\n }\r\n } else {\r\n primaryMarkers.set(markerFullName, Math.round(existingMarker[0].startTime));\r\n }\r\n\r\n // Notify any callers waiting for TTVR reports\r\n if (remainingTtvrMarkers && remainingTtvrMarkers.delete(markerFullName) && remainingTtvrMarkers.size === 0 && resolveTtvrCallback) {\r\n resolveTtvrCallback(getTtvrMarkers());\r\n }\r\n\r\n // Notify any callers waiting for reports\r\n if (remainingMarkers && remainingMarkers.delete(markerFullName) && remainingMarkers.size === 0 && perfMarkerResolveCallback) {\r\n perfMarkerResolveCallback(getMarkers());\r\n }\r\n\r\n // Resolve TTVS if this is ttvs. TTVS only need one time to mark instead of multiple markers.\r\n if (prefix === ttvsPrefix && resolveTtvsCallback) {\r\n resolveTtvsCallback(getTtvsMarkers());\r\n }\r\n\r\n // Notify any callers waiting for TTPR reports\r\n if (prefix === ttprPrefix\r\n && remainingTtprMarkers\r\n && remainingTtprMarkers.delete(markerFullName)\r\n && remainingTtprMarkers.size === 0 && resolveTtprCallback) {\r\n resolveTtprCallback(getMarkers());\r\n }\r\n}\r\n\r\n/**\r\n * Sets the collection of primary perf markers to use for waitForAllPerfMarkers, waitForTtvr .\r\n * @param markerNames The collection of primary TTF and TTVR perf markers.\r\n */\r\nexport function setMarkers(markerNames: MarkerNames): void {\r\n remainingMarkers = getRemainingMarkers(markerNames);\r\n remainingTtvrMarkers = getRemainingMarkers(markerNames, \"TTVR\");\r\n remainingTtprMarkers = getRemainingMarkers(markerNames, \"TTPR\");\r\n ttvrMarkers = new Set(flattenMarkerNames(markerNames, \"TTVR\"));\r\n\r\n if (resolveTtvrCallback && remainingTtvrMarkers.size === 0) {\r\n perfMarkerResolveCallback(getTtvrMarkers());\r\n }\r\n\r\n if (perfMarkerResolveCallback && remainingMarkers.size === 0) {\r\n perfMarkerResolveCallback(getMarkers());\r\n }\r\n\r\n isSetMarkersCalled = true;\r\n}\r\n\r\n/**\r\n * Sets the collection of secondary perf markers to use for waitForAllSecondaryPerfMarkers. Should be called only once.\r\n * @param markerNames The collection of secondary perf markers that are required.\r\n */\r\nexport function setRequiredSecondaryMarkers(markerNames: string[]): void {\r\n // Return if remainingSecondaryMarkers is already set. This means setRequiredSecondaryMarkers was already called.\r\n if (remainingSecondaryMarkers) {\r\n return;\r\n }\r\n\r\n remainingSecondaryMarkers = new Set();\r\n\r\n markerNames.forEach(markerName => {\r\n if (!secondaryMarkers.get(markerName)) {\r\n remainingSecondaryMarkers.add(markerName);\r\n }\r\n });\r\n\r\n // If there are no required secondary perf markers, immediately resolve the promise\r\n if (remainingSecondaryMarkers.size === 0 && secondaryPerfMarkerResolveCallback) {\r\n secondaryPerfMarkerResolveCallback(getSecondaryMarkers());\r\n }\r\n}\r\n\r\n/**\r\n * Determines whether setMarkers has been called.\r\n */\r\nexport function setMarkersCalled(): boolean {\r\n return isSetMarkersCalled;\r\n}\r\n\r\n/**\r\n * Adds marker to the remainingTtvrMarkers\r\n * Here for the case where the marker cannot be added in experience tracker\r\n * Example: Stripe layout - since we don't know if user has that layout selected\r\n * until later (in layoutPreferenceData connector)\r\n *\r\n * @export\r\n * @param {string} markerName\r\n * @returns {void}\r\n */\r\nexport function addTtvrMarker(markerName: string): void {\r\n if (!markerName || !isSetMarkersCalled || !remainingMarkers || !remainingTtvrMarkers) {\r\n return;\r\n }\r\n\r\n remainingMarkers.add(markerName);\r\n remainingTtvrMarkers.add(markerName);\r\n}\r\n\r\n/**\r\n * Waits for the all perf markers supplied to setMarkers() to be logged.\r\n * @returns A promise with all of the TTF and TTVR perf markers, including the overall page marker\r\n */\r\nexport function waitForAllPerfMarkers(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n return waitForPerfMarkers();\r\n}\r\n\r\n/**\r\n * Waits for the all perf markers supplied to setMarkers() to be logged.\r\n * @returns A promise with all of the TTF and TTVR perf markers, including the overall page marker\r\n */\r\nexport function waitForAllSecondaryPerfMarkers(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n // If we have a promise, return it. It may already be completed.\r\n if (secondaryPerfMarkerPromise) {\r\n return secondaryPerfMarkerPromise;\r\n }\r\n\r\n if (!remainingSecondaryMarkers || remainingSecondaryMarkers.size === 0) {\r\n return Promise.resolve(getSecondaryMarkers());\r\n }\r\n\r\n // If the markers are not yet declared or are incomplete, set up a promise to resolve when they are all done.\r\n secondaryPerfMarkerPromise = new Promise<[string, number][]>(resolve => {\r\n secondaryPerfMarkerResolveCallback = resolve;\r\n });\r\n\r\n return secondaryPerfMarkerPromise;\r\n}\r\n\r\n/**\r\n * Waits for the TTVR markers supplied to setMarkers() to be logged.\r\n * @returns A promise with the TTVR perf markers, including the overall page TTVR marker\r\n */\r\nexport function waitForTtvr(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n // If we have a promise, return it. It may already be completed.\r\n if (ttvrPromise) {\r\n return ttvrPromise;\r\n }\r\n\r\n if (remainingTtvrMarkers && remainingTtvrMarkers.size === 0) {\r\n return Promise.resolve(getTtvrMarkers());\r\n }\r\n\r\n // If the markers are not yet declared or are incomplete, set up a promise to resolve when they are all done.\r\n ttvrPromise = new Promise<[string, number][]>(resolve => {\r\n resolveTtvrCallback = resolve;\r\n });\r\n\r\n return ttvrPromise;\r\n}\r\n\r\n/**\r\n * Waits for the perf markers supplied to setMarkers() to be logged.\r\n * @returns A promise with all of the TTF and TTVR perf markers, including the overall page marker\r\n */\r\nfunction waitForPerfMarkers(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n // If we have a promise, return it. It may already be completed.\r\n if (perfMarkerPromise) {\r\n return perfMarkerPromise;\r\n }\r\n\r\n if (remainingMarkers && remainingMarkers.size === 0) {\r\n return Promise.resolve(getMarkers());\r\n }\r\n\r\n // If the markers are not yet declared or are incomplete, set up a promise to resolve when they are all done.\r\n perfMarkerPromise = new Promise<[string, number][]>(resolve => {\r\n perfMarkerResolveCallback = resolve;\r\n });\r\n\r\n return perfMarkerPromise;\r\n}\r\n\r\n/**\r\n * Wait for the ttvs marker to be logged\r\n * @returns A promise with TTVS perf time in ms\r\n */\r\nexport function waitForTtvsMarker(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n if (ttvsMarkerPromise) {\r\n return ttvsMarkerPromise;\r\n }\r\n\r\n ttvsMarkerPromise = new Promise<[string, number][]>(resolve => {\r\n resolveTtvsCallback = resolve;\r\n });\r\n\r\n return ttvsMarkerPromise;\r\n}\r\n\r\n/**\r\n * Wait for the ttpr marker to be logged\r\n * @returns A promise with TTPR perf time in ms\r\n */\r\nexport function waitForTtprMarkers(): Promise<[string, number][]> {\r\n\r\n // Perf marker promises not supported on server side.\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n if (ttprMarkerPromise) {\r\n return ttprMarkerPromise;\r\n }\r\n\r\n ttprMarkerPromise = new Promise<[string, number][]>(resolve => {\r\n resolveTtprCallback = resolve;\r\n });\r\n\r\n return ttprMarkerPromise;\r\n}\r\n\r\n/**\r\n * Returns TTVR of given entry if exists in markers array\r\n * @param entryName the entry name for the marker eg. \"TTVR.xx\" or just \"TTVR\"\r\n * @returns the TTVR value for that entry name OR undefined if entry does not exist\r\n */\r\nexport function getTtvrOfEntry(entryName: string): number {\r\n const ttvrMarkers = getTtvrMarkers();\r\n const marker = ttvrMarkers.find((mark) => mark[0] === entryName) || [];\r\n\r\n return marker[1];\r\n}\r\n\r\n/**\r\n * Returns array of markers, including the page-level marker. For example:\r\n * Note: didn't add TTVS in getMarkers because TTVS only applies to specific page type and special cases.\r\n * It could be fired way after in the page cycle.\r\n * [[\"TTVR.Search\", 100], [\"TTVR.TopSites\", 100.123], [\"TTVR.River\", 100.504], [\"TTVR\", 100.504]]\r\n * @returns The array of markers\r\n */\r\nexport function getMarkers(): [string, number][] {\r\n const ttvrResults = getTtvrMarkers();\r\n const ttfResults = getTtfMarkers();\r\n const result: [string, number][] = [...ttvrResults, ...ttfResults];\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns array of markers as they are available. Do not write page level markers here.\r\n * This is used when waiting for remaining markers timed out.\r\n * [[\"TTVR.Search\", 100], [\"TTVR.TopSites\", 100.123]]\r\n * @returns The array of markers\r\n */\r\nexport function getAvailableMarkers(): [string, number][] {\r\n // Do not mark page TTVR as not all remaining markers have been satisfied.\r\n const ttvrResults = getTtvrMarkers(false);\r\n const ttfResults = getTtfMarkers();\r\n const result: [string, number][] = [...ttvrResults, ...ttfResults];\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns array of secondary markers. E.g.:\r\n * [[\"TTS.NativeAd\", 3300], [\"TTS.SearchHistory\", 2100]]\r\n * @returns The array of secondary markers\r\n */\r\nexport function getSecondaryMarkers(): [string, number][] {\r\n const result: [string, number][] = [];\r\n\r\n secondaryMarkers.forEach((value: number, key: string) => {\r\n result.push([key, value]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns array of markers that are yet to be completed.\r\n * @returns The array of incomplete markers\r\n */\r\nexport function getIncompleteMarkers(perfMarkersGroup: PerfMarkersGroup): string[] {\r\n return perfMarkersGroup === PerfMarkersGroup.Primary\r\n ? Array.from(remainingMarkers || [])\r\n : Array.from(remainingSecondaryMarkers || []);\r\n}\r\n\r\n/**\r\n * Returns markers yet to be set\r\n * @param markerNames The names of the markers to check. e.g. { TTVR: [\"River\", \"TopSites\"], TTF: [\"SearchBox\"] }\r\n * @param markerType The type of markers to return \"TTVR\", \"TTF\", or if undefined all\r\n * @returns The set of markers that have not yet been set.\r\n */\r\nfunction getRemainingMarkers(markerNames: MarkerNames, markerType?: string): Set {\r\n const result: Set = new Set();\r\n for (const markerName of flattenMarkerNames(markerNames, markerType)) {\r\n if (!primaryMarkers.get(markerName)) {\r\n result.add(markerName);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n* Returns TTPR of given entry if exists in markers array\r\n* @param expType - key for experience\r\n* @returns the TTVR value for that entry name OR undefined if entry does not exist\r\n*/\r\nexport function getExperienceTtpr(expType: string): number {\r\n const ttprMarkers = getTtprMarkers();\r\n const marker = ttprMarkers.find((mark) => mark[0].includes(expType)) || [];\r\n\r\n return marker[1];\r\n}\r\n\r\n/**\r\n* Returns array of TTPR markers, time to page reveal. For example:\r\n* [[\"TTPR.SearchBoxEdgeNext\", 120], [\"BackgroundImageEdgeNext\", 120]]\r\n* @returns The array of markers\r\n*/\r\nexport function getTtprMarkers(): [string, number][] {\r\n return getMarkersWithType(ttprPrefix);\r\n}\r\n\r\n/**\r\n * Returns array of TTF markers, including the page-level marker. For example:\r\n * [[\"TTF.Search\", 100], [\"TTF\", 100]]\r\n * @returns The array of markers\r\n */\r\nfunction getTtfMarkers(): [string, number][] {\r\n return getMarkersWithType(ttfPrefix);\r\n}\r\n\r\n/**\r\n * Returns array of TTVR markers, including the page-level marker. For example:\r\n * [[\"TTVR.Search\", 100], [\"TTVR.TopSites\", 100.123], [\"TTVR.River\", 100.504], [\"TTVR\", 100.504]]\r\n * @param markPageTTVR flag to mark overall TTVR marker based on max TTVR markers\r\n * @returns The array of markers\r\n */\r\nfunction getTtvrMarkers(markPageTTVR = true): [string, number][] {\r\n return getMarkersWithType(ttvrPrefix, markPageTTVR ? timeToVisuallyReady : null, markPageTTVR /* include refresh delay */);\r\n}\r\n\r\n/**\r\n * Returns array of TTVS markers, including the page-level marker. For example:\r\n * [[\"TTVS.VideoContent\", 1200], [\"TTVS\", 1200]]\r\n * @returns The array of markers\r\n */\r\nfunction getTtvsMarkers(): [string, number][] {\r\n return getMarkersWithType(ttvsPrefix, timeToVideoStart);\r\n}\r\n\r\n/**\r\n * Returns array of a provided markers based on markerName, optionally including the page-level marker.\r\n * @param markerPrefix the marker prefix for the markers\r\n * @param markerName the optional page-level markerName\r\n * @param includeTTVRWithRefreshDelay flag to include TTVR.WithRefreshDelay metric, which tracks TTVR + any refresh delay\r\n * @returns The array of markers\r\n */\r\nfunction getMarkersWithType(markerPrefix: string, markerName?: string, includeTTVRWithRefreshDelay?: boolean) {\r\n const result: [string, number][] = [];\r\n let maxValue = 0;\r\n primaryMarkers.forEach((value: number, key: string) => {\r\n if (key.startsWith(markerPrefix)) {\r\n result.push([key, value]);\r\n\r\n // Only include value in max TTVR when added to ttvrMarkers in setMarkers()\r\n if (value > maxValue && (!key.startsWith(\"TTVR\") || ttvrMarkers.has(key))) {\r\n maxValue = value;\r\n }\r\n }\r\n });\r\n\r\n // Add the max, overall marker at the end\r\n if (markerName) {\r\n result.push([markerName, maxValue]);\r\n }\r\n\r\n // For TTVR with refresh delay, add the TTVR.WithRefreshDelay metric\r\n if (includeTTVRWithRefreshDelay && markerName === timeToVisuallyReady) {\r\n const pageTimings = getPageTimings();\r\n const refreshDelay: number = pageTimings[\"refreshDelay\"] || 0;\r\n result.push([\"TTVR.WithRefreshDelay\", maxValue + refreshDelay]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Put marker names into a expanded/flattened array [ \"TTVR.River\", \"TTVR.TopSites\", \"TTF.SearchBox\" ]\r\n * @param markerNames The names of the markers to check. e.g. { TTVR: [ \"River\", \"TopSites\" ], TTF: [ \"SearchBox\" ] }\r\n * @param markerType The type of markers to return \"TTVR\", \"TTF\", or if undefined all\r\n */\r\nfunction flattenMarkerNames(markerNames: MarkerNames, markerType: string): string[] {\r\n let ttvr: string[] = [];\r\n let ttpr: string[] = [];\r\n let ttf: string[] = [];\r\n\r\n if (markerNames && markerNames.TTVR && (!markerType || markerType === \"TTVR\")) {\r\n ttvr = markerNames.TTVR.map((n) => { return ttvrPrefix + n; });\r\n }\r\n\r\n if (markerNames && markerNames.TTF && (!markerType || markerType === \"TTF\")) {\r\n ttf = markerNames.TTF.map((n) => { return ttfPrefix + n; });\r\n }\r\n\r\n if (markerNames && markerNames.TTPR && markerType === \"TTPR\") {\r\n ttpr = markerNames.TTPR.map((n) => { return ttprPrefix + n; });\r\n }\r\n\r\n return [...ttvr, ...ttf, ...ttpr];\r\n}\r\n\r\n/**\r\n * helper method to get performance mark name.\r\n * @param markerName - performance mark name\r\n */\r\nexport function getSinglePerfMarkStartTimeByName(markerName: string): number {\r\n const perfMarks = window.performance.getEntriesByName(markerName);\r\n if (perfMarks && perfMarks[0] && perfMarks[0].startTime) {\r\n return perfMarks[0].startTime;\r\n }\r\n\r\n return -1;\r\n}\r\n\r\n/**\r\n * Reset the markers object singleton for test environments\r\n */\r\nexport function resetMarkersForTest(): void {\r\n primaryMarkers = new Map();\r\n secondaryMarkers = new Map();\r\n isSetMarkersCalled = false;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ExperienceLoadingState } from \"./ExperienceLoadingState\";\r\n\r\n/**\r\n * Defines custom deferral event types which is not part of page/experience lifecycle event types\r\n */\r\nexport enum CustomDeferralEventTypes {\r\n\r\n /**\r\n * The page level milestone when experiences outside the viewport are transitioning into viewport\r\n */\r\n belowTheFoldTransitionStart\r\n}\r\n\r\n/**\r\n * Defines valid deferral events used during milestone tracking\r\n * The event types should be mapped with loading types so that they have the exact same numeric value.\r\n */\r\nexport enum ExperienceDeferralEventTypes {\r\n /**\r\n * The startLoading milestone of dependent experience\r\n */\r\n startLoading = ExperienceLoadingState.startLoading,\r\n /**\r\n * The loaded milestone of dependent experience\r\n */\r\n loaded = ExperienceLoadingState.loaded,\r\n /**\r\n * The rendered milestone of dependent experience\r\n */\r\n rendered = ExperienceLoadingState.rendered,\r\n /**\r\n * The domComplete milestone of dependent experience\r\n */\r\n domComplete = ExperienceLoadingState.domComplete,\r\n /**\r\n * The visuallyReady milestone of dependent experience\r\n */\r\n visuallyReady = ExperienceLoadingState.visuallyReady,\r\n /**\r\n * The page level milestone when experiences in viewport are visuallyReady\r\n */\r\n aboveTheFoldVisuallyReady,\r\n /**\r\n * The page level milestone when experiences outside the viewport are transitioning into viewport\r\n */\r\n belowTheFoldTransitionStart = CustomDeferralEventTypes.belowTheFoldTransitionStart,\r\n /**\r\n * The page level milestone when hydration has completed\r\n */\r\n hydrationComplete\r\n}\r\n\r\n/**\r\n * Helper to lookup the equivalent deferrel event type given the experience loadings state\r\n */\r\nexport const ExperienceLoadingStateToDeferralEventType = new Map([\r\n [ExperienceLoadingState.loaded, ExperienceDeferralEventTypes.loaded],\r\n [ExperienceLoadingState.rendered, ExperienceDeferralEventTypes.rendered],\r\n [ExperienceLoadingState.domComplete, ExperienceDeferralEventTypes.domComplete],\r\n [ExperienceLoadingState.visuallyReady, ExperienceDeferralEventTypes.visuallyReady]\r\n]);","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ExperienceDeferralEventTypes, ExperienceLoadingState } from \"../data-model\";\r\n\r\nimport { registerResetCallback } from \"@msnews/core\";\r\n\r\n/**\r\n * Identifies a referenced experience and its dependents\r\n */\r\nexport interface ExperienceDependents {\r\n /**\r\n * Determines the state of deferral identifier experience.\r\n */\r\n currentState: ExperienceLoadingState;\r\n\r\n /**\r\n * The dependent set of experiences and its associated state mapped to a deferred event type.\r\n * An experience moves from deferred to resolvedForLoad or resolvedForRender state when deferral identifier experienceType/Group currentState matches deferred state.\r\n */\r\n referencedDependentsDeferralMap: Map>\r\n}\r\n\r\n// Keeps track of Experience Identifier to its referenced dependents mapping for loadAfter/renderAfter scenario\r\n// Experience Identifier, acts as a reference to resolve its dependents.\r\n// The key (experienceIdentifier) should be either experienceType or experienceGroup\r\nexport let experienceDeferralDependencyMap: Map = new Map();\r\n\r\n/**\r\n * Register a callback to reset the experienceDeferralDependencyMap.\r\n * The callback is registered once when the module is loaded and invoked once on the server side at the beginning of each request.\r\n */\r\nregisterResetCallback(() => {\r\n experienceDeferralDependencyMap = new Map();\r\n});\r\n\r\n/**\r\n * Checks if experience's dependency is resolved\r\n * @returns true if dependent experience has been resolved.\r\n * @param experienceDependency - dependent experience\r\n * @param deferralEventType - deferral EventType\r\n */\r\nexport function isExperienceDependencyResolved(experienceDependency: string, deferralEventType: ExperienceDeferralEventTypes): boolean {\r\n\r\n const dependents = experienceDeferralDependencyMap.get(experienceDependency);\r\n return !dependents\r\n || dependents.currentState >= deferralEventType;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CustomDeferralEventTypes, DeferralEventType, ExperienceDeferralEventTypes, ExperienceDeferralInfo, ExperienceDeferralMetadata, ExperienceLoadingState, ExperienceMilestoneEventTypes } from \"./data-model\";\r\nimport { MilestoneDataActions, UpdateExperienceCurrentStateArgs, UpdateExperienceDeferralArgs, UpdateTimingArgs } from \"./MilestoneData.actions\";\r\nimport { defaultInstanceKeyName, defaultTimeValue } from \"./MilestoneData.constants\";\r\n\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { ExperienceInstanceMilestoneModel } from \"./data-model/ExperienceInstanceMilestoneModel\";\r\nimport { IActionPayload } from \"@msnews/experiences-redux-contracts\";\r\nimport { MilestoneDataConnector } from \"./MilestoneData.connector\";\r\nimport { MilestonePluginEvents } from \"./data-model/MilestonePluginEvents\";\r\nimport { PageBase } from \"@msnews/experiences-page-base\";\r\nimport { headData } from \"@msnews/core\";\r\nimport { isExperienceDependencyResolved } from \"./data-management/ExperienceDeferralDependencyTrackerState\";\r\nimport { pluginUtils } from \"./utils/MilestonePluginUtils\";\r\n\r\n/**\r\n * Helper method to get the milestone data connector instance.\r\n * @returns Milestone data connector promise.\r\n */\r\nexport function getMilestoneDataConnector(): MilestoneDataConnector {\r\n return PageBase.getInstance().rootReducer.connector(\r\n ConnectorNamespaces.MilestoneData\r\n ) as MilestoneDataConnector;\r\n}\r\n\r\n/**\r\n * Helper method to get default instance of an experience.\r\n * @returns Experience Milestone instance data.\r\n */\r\nexport function getDefaultExperienceInstance(\r\n experienceType: string\r\n): ExperienceInstanceMilestoneModel {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return;\r\n }\r\n\r\n const milestones = connector.getCurrentState().perExperienceMilestones;\r\n const experience = milestones && milestones.get(experienceType);\r\n let instance: ExperienceInstanceMilestoneModel;\r\n\r\n if (experience) {\r\n instance = experience.perInstanceMilestones.get(defaultInstanceKeyName);\r\n }\r\n\r\n return instance;\r\n}\r\n\r\n/**\r\n * returns promise based experience load delegate, which resolves when experience dependent event is fired.\r\n * @returns A callback promise which resolves to boolean when associated experience is ready to be loaded\r\n * If null is returned experience is not deferred and should be loaded/rendered right away.\r\n */\r\nexport function getExperienceLoadDelegate(\r\n experienceType: string\r\n): ExperienceDeferralMetadata {\r\n\r\n const instance: ExperienceInstanceMilestoneModel = getDefaultExperienceInstance(experienceType);\r\n\r\n // return null if dependent deferral event has already been fired\r\n if (!instance || getDeferralLoadEventReadyState(instance)) {\r\n return null;\r\n }\r\n\r\n if (instance.shouldLoad && instance.loadAfter) {\r\n\r\n const deferralEventType = getDeferralEventMetadata(instance.loadAfter);\r\n return { deferralType: deferralEventType, shouldResolve: instance.shouldLoad };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * returns a promise that is resolved when\r\n * Milestone data connector was not initialized\r\n * Milestone data connector has already fired the above the fold visual ready action\r\n * Milestone data connector hasn't fired above the fold visual ready action so an observer is\r\n * set on the action to resolve the promise when that callback is invoked\r\n */\r\nexport function waitForAboveTheFoldVisuallyReadyAsync(): Promise {\r\n const milestoneDataConnector = getMilestoneDataConnector();\r\n\r\n if (!milestoneDataConnector) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (isAboveTheFoldVisuallyReady()) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise(resolve => {\r\n MilestoneDataActions.updateAboveTheFoldVisuallyReady.registerObserver(((actionPayload: IActionPayload) => {\r\n resolve();\r\n }));\r\n });\r\n}\r\n\r\n/**\r\n * returns a promise that is resolved when\r\n * Milestone data connector was not initialized\r\n * Milestone data connector has already fired the page reveal started action\r\n * Milestone data connector hasn't fired page reveal started action so an observer is\r\n * set on the action to resolve the promise when that callback is invoked\r\n */\r\nexport function requestPageRevealStartedAsync(): Promise {\r\n const milestoneDataConnector = getMilestoneDataConnector();\r\n\r\n if (!headData.IsPrerender || !milestoneDataConnector) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (isPageRevealStarted()) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise(resolve => {\r\n MilestoneDataActions.updatePageRevealStart.registerObserver(((actionPayload: IActionPayload) => {\r\n resolve();\r\n }));\r\n });\r\n}\r\n\r\n/**\r\n * returns a promise that is resolved when\r\n * Milestone data connector was not initialized\r\n * Milestone data connector has already fired the page reveal completed action\r\n * Milestone data connector hasn't fired page reveal completed action so an observer is\r\n * set on the action to resolve the promise when that callback is invoked\r\n */\r\nexport function requestPageRevealCompletedAsync(): Promise {\r\n const milestoneDataConnector = getMilestoneDataConnector();\r\n\r\n if (!headData.IsPrerender || !milestoneDataConnector) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (isPageRevealCompleted()) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise(resolve => {\r\n MilestoneDataActions.updatePageRevealComplete.registerObserver(((actionPayload: IActionPayload) => {\r\n resolve();\r\n }));\r\n });\r\n}\r\n\r\n/**\r\n * returns a promise that is resolved when\r\n * Milestone data connector was not initialized\r\n * Milestone data connector hasn't fired page reveal started action so an observer is\r\n * set on the action to resolve the promise when that callback is invoked\r\n */\r\nexport function pageRevealStartedObserver(): Promise {\r\n const milestoneDataConnector = getMilestoneDataConnector();\r\n\r\n if (!milestoneDataConnector) {\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise(resolve => {\r\n MilestoneDataActions.updatePageRevealStart.registerObserver(((actionPayload: IActionPayload) => {\r\n resolve();\r\n }));\r\n });\r\n}\r\n\r\n/**\r\n * returns promise based experience render delegate, which resolves when experience dependent event is fired.\r\n * @returns A callback promise which resolves to boolean when associated experience is ready to be rendered.\r\n * If null is returned experience is not deferred and should be loaded/rendered right away.\r\n */\r\nexport function getExperienceRenderDelegate(\r\n experienceType: string\r\n): ExperienceDeferralMetadata {\r\n\r\n const instance: ExperienceInstanceMilestoneModel = getDefaultExperienceInstance(experienceType);\r\n\r\n // return null if dependent deferral event has already been fired\r\n if (!instance || getDeferralRenderEventReadyState(instance)) {\r\n return null;\r\n }\r\n\r\n if (instance.shouldRender && instance.renderAfter) {\r\n\r\n const deferralEventType = getDeferralEventMetadata(instance.renderAfter);\r\n return { deferralType: deferralEventType, shouldResolve: instance.shouldRender };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Execute milestone event hooks\r\n */\r\nexport async function executeMilestoneEventPlugins(eventType: MilestonePluginEvents): Promise {\r\n\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return;\r\n }\r\n\r\n const plugins = connector.getCurrentState().plugins;\r\n\r\n if (!plugins || plugins.length === 0) {\r\n return;\r\n }\r\n\r\n const filteredPlugins = pluginUtils.filter(plugins, eventType);\r\n\r\n for (const plugin of filteredPlugins) {\r\n if (plugin[eventType] !== undefined) {\r\n await plugin[eventType].call(plugin);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Return dependent deferral event ready state\r\n * @param instance - Experience instance\r\n */\r\nfunction getDeferralLoadEventReadyState(instance: ExperienceInstanceMilestoneModel): boolean {\r\n\r\n let deferralEventReady: boolean;\r\n\r\n switch (instance.loadAfter.eventType) {\r\n case ExperienceDeferralEventTypes.aboveTheFoldVisuallyReady:\r\n deferralEventReady = isAboveTheFoldVisuallyReady();\r\n break;\r\n\r\n case ExperienceDeferralEventTypes.belowTheFoldTransitionStart:\r\n deferralEventReady = isBelowTheFoldTransitionStarted();\r\n break;\r\n\r\n case ExperienceDeferralEventTypes.hydrationComplete:\r\n deferralEventReady = isHydrationComplete();\r\n break;\r\n\r\n default:\r\n deferralEventReady = isExperienceDependencyResolved(instance.loadAfter.experienceType, instance.loadAfter.eventType);\r\n }\r\n\r\n return deferralEventReady;\r\n}\r\n\r\n/**\r\n * Return dependent deferral event ready state\r\n * @param instance - Experience instance\r\n */\r\nfunction getDeferralRenderEventReadyState(instance: ExperienceInstanceMilestoneModel): boolean {\r\n\r\n let deferralEventReady: boolean;\r\n\r\n switch (instance.renderAfter.eventType) {\r\n case ExperienceDeferralEventTypes.aboveTheFoldVisuallyReady:\r\n deferralEventReady = isAboveTheFoldVisuallyReady();\r\n break;\r\n\r\n case ExperienceDeferralEventTypes.belowTheFoldTransitionStart:\r\n deferralEventReady = isBelowTheFoldTransitionStarted();\r\n break;\r\n\r\n case ExperienceDeferralEventTypes.hydrationComplete:\r\n deferralEventReady = isHydrationComplete();\r\n break;\r\n\r\n default:\r\n deferralEventReady = isExperienceDependencyResolved(instance.loadAfter.experienceType, instance.renderAfter.eventType);\r\n }\r\n\r\n return deferralEventReady;\r\n}\r\n\r\n/**\r\n * Returns true if above the fold is ready\r\n */\r\nfunction isAboveTheFoldVisuallyReady(): boolean {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return false;\r\n }\r\n\r\n const { aboveTheFoldVisuallyReady } = connector.getCurrentState();\r\n return Boolean(\r\n aboveTheFoldVisuallyReady\r\n && aboveTheFoldVisuallyReady.endTime !== defaultTimeValue\r\n );\r\n}\r\n\r\n/**\r\n * Returns true if page reveal has started\r\n */\r\nfunction isPageRevealStarted(): boolean {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return false;\r\n }\r\n\r\n const { pageReveal } = connector.getCurrentState();\r\n return Boolean(\r\n pageReveal\r\n && pageReveal.startTime!== defaultTimeValue\r\n );\r\n}\r\n\r\n/**\r\n * Returns true if page reveal has completed\r\n */\r\nfunction isPageRevealCompleted(): boolean {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return false;\r\n }\r\n\r\n const { pageReveal } = connector.getCurrentState();\r\n return Boolean(\r\n pageReveal\r\n && pageReveal.endTime!== defaultTimeValue\r\n );\r\n}\r\n\r\n/**\r\n * Returns true if below the fold transition has started\r\n */\r\nfunction isBelowTheFoldTransitionStarted(): boolean {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return false;\r\n }\r\n\r\n return connector.getCurrentState().belowTheFoldTransitionStart;\r\n}\r\n\r\n/**\r\n * Update deferral event metadata\r\n * @param deferralInfo - Tracks deferral information used by an experience to determine when it should load/render\r\n * @returns - DeferralEventType, this can be either standard or custom depending upon what type of deferral has been used for experience deferral\r\n */\r\nfunction getDeferralEventMetadata(deferralInfo: ExperienceDeferralInfo): DeferralEventType {\r\n return deferralInfo.eventType in CustomDeferralEventTypes\r\n ? DeferralEventType.CustomEventBasedDeferral\r\n : DeferralEventType.StandardEventBasedDeferral;\r\n}\r\n\r\n/**\r\n * Return trues if hydration of SSR response is complete\r\n */\r\nfunction isHydrationComplete(): boolean {\r\n const connector = getMilestoneDataConnector();\r\n\r\n if (!connector) {\r\n return false;\r\n }\r\n\r\n return connector.getCurrentState().hydrationComplete;\r\n}\r\n\r\n/**\r\n * Helper to create deferral info\r\n * @param deferralInfo - Tracks deferral information used by an experience to determine when it should load/render\r\n * @param experienceType - Experience Type - Defines an experience\r\n * @param experienceGroup - Associated Experience Group\r\n * @param experienceInstance - Defines an instance of the Experience\r\n */\r\nexport function createDeferralInfo(\r\n deferralInfo: ExperienceDeferralInfo,\r\n experienceType: string,\r\n experienceGroup?: string,\r\n experienceInstance?: string\r\n): UpdateExperienceDeferralArgs {\r\n\r\n return {\r\n deferralInfo,\r\n experienceType,\r\n experienceGroup,\r\n experienceInstance\r\n };\r\n}\r\n\r\n/**\r\n * Helper to create experience state update arguments.\r\n * @param experienceType - Experience Type - Defines an experience\r\n * @param currentState - Current Milestone of the experience e.g initialized, loaded, deferred etc\r\n * @param experienceGroup - Associated Experience Group\r\n * @param experienceInstance - Defines an instance of the Experience\r\n */\r\nexport function createExperienceStateUpdate(\r\n experienceType: string,\r\n currentState: ExperienceLoadingState,\r\n experienceGroup?: string,\r\n experienceInstance?: string\r\n): UpdateExperienceCurrentStateArgs {\r\n\r\n return {\r\n experienceType,\r\n currentState,\r\n experienceGroup,\r\n experienceInstance\r\n };\r\n}\r\n\r\n/**\r\n * Creates a timing update arguments\r\n * @param experienceType - Experience Type - Defines an experience\r\n * @param experienceGroup - Associated Experience Group\r\n * @param experienceInstance - Defines an instance of the Experience\r\n * @param startTime - start time fo the milestone e.g. startTime of loaded milestone\r\n * @param endTime - end time fo the milestone e.g. endTime of loaded milestone\r\n */\r\nexport function createTimingUpdate(\r\n experienceType: string,\r\n experienceGroup?: string,\r\n experienceInstance?: string,\r\n startTime?: number,\r\n endTime?: number\r\n): UpdateTimingArgs {\r\n\r\n return {\r\n experienceType,\r\n experienceGroup,\r\n experienceInstance,\r\n startTime,\r\n endTime\r\n };\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Default key value for looking up experience instances\r\n */\r\nexport const defaultInstanceKeyName = \"default\";\r\n\r\n/**\r\n * Default time value for start/end time\r\n */\r\nexport const defaultTimeValue = -1;\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * class defining perf trackers.\r\n */\r\nexport class PerfTracker {\r\n\r\n /** The perf tracker end time. */\r\n private endTime = -1;\r\n\r\n /** The perf tracker start time. */\r\n private startTime = -1;\r\n\r\n /**\r\n * Get perf tracker time duration\r\n */\r\n public getDuration(): number {\r\n let result = -1;\r\n if (this.startTime !== -1 && this.endTime !== -1) {\r\n result = this.endTime - this.startTime;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * get perf tracker end time\r\n */\r\n public getEnd(): number {\r\n return this.endTime;\r\n }\r\n\r\n /**\r\n * get perf tracker start time\r\n */\r\n public getStart(): number {\r\n return this.startTime;\r\n }\r\n\r\n /**\r\n * set perf tracker end time\r\n */\r\n public setEnd(): void {\r\n this.endTime = performance.now();\r\n }\r\n\r\n /**\r\n * set perf tracker start time\r\n */\r\n public setStart(): void {\r\n this.startTime = performance.now();\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport Foundation, { FoundationProps } from \"@microsoft/fast-components-foundation-react\";\r\nimport { IRequestContext, appEnvironment, headData } from \"@msnews/core\";\r\nimport { PerfTracker, getPageTimings, incrementCounter, logger, markTtf, markTtprRaf, markTtvr, markTtvrRaf } from \"@msnews/diagnostics\";\r\n\r\nimport { ExperienceMilestoneEventTypes } from \"@msnews/milestone-data\";\r\nimport { MnsCreatorDashboardAttributes } from \"./MnsCreatorDashboard.attributes\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\ndeclare global {\r\n interface Window {\r\n /**\r\n * Boolean flag to indicate if render cache hydration is happening\r\n */\r\n needsHydrate?: boolean;\r\n }\r\n}\r\n\r\n/** Type definition for the onExperienceMilestoneTimingUpdate callback */\r\nexport type ExperienceMilestoneTimingUpdate = (milestoneType: ExperienceMilestoneEventTypes,\r\n startTime?: number,\r\n endTime?: number) => void;\r\n\r\nconst pageTimings = getPageTimings();\r\n\r\n/** Type definition for the onExperienceMilestoneTimingUpdate callback */\r\nexport type ExperienceStaleRevalidationUpdate = (milestoneType: ExperienceMilestoneEventTypes) => void;\r\n\r\n/**\r\n * Internal interface used for detecting render counter related static properties\r\n * in Experience components. We use this to cast the object's constructor to see\r\n * if the custom render counter prefix is available to use to emit custom page timings.\r\n * Note that this interface is not meant to be explicitly extended, since we're trying to\r\n * to leverage static properties from the Experience component classes and interfaces are\r\n * not supported on static properties. This purely serves as a type definition so we can\r\n * access the static `renderCounterPrefix` property without typescript complaining about it.\r\n */\r\ninterface ExperienceStaticConstructor {\r\n /**\r\n * Optional custom render count marker prefix to use to log an additional count metric\r\n * in addition to the default render counters. Useful when you want to count a group of\r\n * similar experiences under a custom render counter group. Currently used by content\r\n * experiences to log the total number of content card renders before TTVR. This value\r\n * is used as an prefix value to form the final marker name. For example, a value of\r\n * \"XYZ\" would end up logging \"XYZExpRenderCount\" in addition to the default \"ExpRenderCount\"\r\n */\r\n renderCounterPrefix: string;\r\n}\r\n\r\n/**\r\n * Common props for all experiences\r\n */\r\nexport interface CommonExperienceProps {\r\n /** The experience name. */\r\n experienceName?: string;\r\n\r\n /** Custom Field per experience when sending beacon to Cosmos. */\r\n customField?: string;\r\n\r\n /** Request specific context */\r\n requestContext?: IRequestContext;\r\n\r\n /**\r\n * Handler function for Experience Milestone timing updates\r\n */\r\n onExperienceMilestoneTimingUpdate?: ExperienceMilestoneTimingUpdate;\r\n\r\n /**\r\n * boolean to indicate if experience is stale\r\n */\r\n isStale?: boolean;\r\n}\r\n\r\n/**\r\n * Helper to spread the default values for common experience props to all handled props fields.\r\n */\r\nexport const InitialCommonExperienceProps = {\r\n experienceName: undefined,\r\n customField: undefined,\r\n requestContext: undefined,\r\n onExperienceMilestoneTimingUpdate: undefined,\r\n isStale: undefined\r\n};\r\n\r\n/**\r\n * TODO: This class may need to be sampled collecting and sending Perf timings if the traffic goes beyond a certain reach.\r\n * Assessment will be performed later after analyzing the data.\r\n */\r\nexport class BaseExperience extends Foundation {\r\n /** Perf marker for tracking Visually Reading timing */\r\n protected visuallyReadyTracker: PerfTracker = new PerfTracker();\r\n\r\n protected componentRef: any;\r\n\r\n /** Perf marker for tracking Initialization timing */\r\n protected initializedTracker: PerfTracker = new PerfTracker();\r\n\r\n /** Perf marker for tracking DomComplete timing */\r\n protected domCompleteTracker: PerfTracker = new PerfTracker();\r\n\r\n /** boolean to indicate if stale state has been revalidated */\r\n private isStaleRevalidated = false;\r\n\r\n /**\r\n * The constructor.\r\n * @param props - The props\r\n * @param context - The context\r\n */\r\n constructor(props: H & U & CommonExperienceProps & FoundationProps, context?: any) {\r\n super(props);\r\n\r\n this.startInitializeMilestone();\r\n this.startVisuallyReadyMilestone();\r\n this.startDomCompleteMilestone();\r\n\r\n // This tracks the # of experiences that got instantiated on the page before TTVR marker happens.\r\n this.incrementExpCount(\"\");\r\n }\r\n\r\n /**\r\n * Default react hook.\r\n */\r\n public componentDidMount(): void {\r\n // End the domComplete milestone\r\n this.endDomCompleteMilestone();\r\n }\r\n\r\n /**\r\n * Default react hook.\r\n *\r\n * note: don't delete it, as it has different arity than the original react hook, and some components call it\r\n * with arity=0\r\n *\r\n * @param prevProps - previous component props\r\n * @param prevState - previous component state\r\n * @param snapshot - \"snapshot\" returned by getSnapshotBeforeUpdate() in React life cycle\r\n */\r\n public componentDidUpdate(\r\n prevProps: Readonly = undefined,\r\n prevState: Readonly = undefined,\r\n snapshot: any = undefined\r\n ): void {\r\n\r\n // End the domComplete milestone\r\n this.endDomCompleteMilestone();\r\n\r\n // complete stale revalidation\r\n this.completeStaleRevalidation();\r\n }\r\n\r\n /**\r\n * Default render function\r\n *\r\n * note: don't delete it, even if empty, as a bunch of code calls super.render()\r\n */\r\n public render(): any {\r\n if (canUseDOM()) {\r\n const needsHydrateLogString: string = \"\" + window.needsHydrate;\r\n logger.log(`Rendering ${(this.props as CommonExperienceProps).experienceName}. needsHydrate: ${needsHydrateLogString}`);\r\n }\r\n\r\n // End the initialized milestone, and start the domComplete milestone\r\n this.endInitializeMilestone();\r\n this.startDomCompleteMilestone();\r\n\r\n // This tracks the # of times all experiences on the page render before TTVR marker happens.\r\n this.incrementExpCount(\"Render\");\r\n }\r\n\r\n /**\r\n * Marks the Time To Visually Ready and optionally mark perf ttvr for telemetry.\r\n * @param shouldMarkTelemetryTtvr - Flag to opt out from from telemetry ttvr marker\r\n * @param time - Optional ttvr marker value, default value is current time\r\n * @param aliasName - Optional alias for TTVR marker name, default is no alias\r\n */\r\n public markTimeToVisuallyReady(shouldMarkTelemetryTtvr: boolean, time?: number, aliasName?: string): void {\r\n if (shouldMarkTelemetryTtvr) {\r\n if (time == undefined) {\r\n time = window.performance.now();\r\n }\r\n markTtvr(this.props.experienceName, false, time);\r\n if (aliasName) {\r\n markTtvr(aliasName, false, time);\r\n }\r\n }\r\n\r\n this.endVisuallyReadyMilestone();\r\n }\r\n\r\n /**\r\n * Mark perf ttf for telemetry.\r\n * @param aliasName - Optional alias for TTF marker name\r\n */\r\n public markTimeToFunctional(aliasName?: string): void {\r\n const t = window.performance.now();\r\n markTtf((this.props as CommonExperienceProps).experienceName, false, t);\r\n if (aliasName) {\r\n markTtf(aliasName, false, t);\r\n }\r\n }\r\n\r\n /**\r\n * Generate attributes for the mnsDashboard\r\n */\r\n protected mnsDashAttributes(): MnsCreatorDashboardAttributes {\r\n if (appEnvironment.ShowMnsCreatorDashboard) {\r\n const msnCreatorDashAttributes = {\r\n \"data-config-href\": this.props[\"data-config-href\"],\r\n \"data-experience-type\": this.props[\"data-experience-type\"]\r\n };\r\n return msnCreatorDashAttributes;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /** Start the initialized perf timer, and mark the Initialized milestone start time */\r\n protected startInitializeMilestone(): void {\r\n this.initializedTracker.setStart();\r\n this.updateStartTiming(this.initializedTracker, ExperienceMilestoneEventTypes.initialized);\r\n }\r\n\r\n /** End the initialized perf timer, and mark the Initialized milestone end time */\r\n protected endInitializeMilestone(): void {\r\n this.updateEndTiming(this.initializedTracker, ExperienceMilestoneEventTypes.initialized);\r\n }\r\n\r\n /** Start the Visually Reader perf timer, and mark the VisuallyReady milestone start time */\r\n protected startVisuallyReadyMilestone(): void {\r\n this.updateStartTiming(this.visuallyReadyTracker, ExperienceMilestoneEventTypes.visuallyReady);\r\n }\r\n\r\n /** Complete Stale Revalidation */\r\n protected completeStaleRevalidation(): void {\r\n const { isStale } = this.props;\r\n if (isStale && !this.isStaleRevalidated) {\r\n this.isStaleRevalidated = true;\r\n this.markTimeToRevalidateStaleState();\r\n\r\n const { onExperienceMilestoneTimingUpdate } = this.props;\r\n if (onExperienceMilestoneTimingUpdate) {\r\n onExperienceMilestoneTimingUpdate(ExperienceMilestoneEventTypes.staleRevalidationComplete);\r\n }\r\n }\r\n }\r\n\r\n /** End the Visually Reader perf timer, and mark the VisuallyReady milestone end time */\r\n protected endVisuallyReadyMilestone(): void {\r\n this.updateEndTiming(this.visuallyReadyTracker, ExperienceMilestoneEventTypes.visuallyReady);\r\n }\r\n\r\n /** Start the DomComplete perf timer, and mark the DomComplete milestone start time */\r\n protected startDomCompleteMilestone(): void {\r\n this.updateStartTiming(this.domCompleteTracker, ExperienceMilestoneEventTypes.domComplete);\r\n }\r\n\r\n /** End the DomComplete perf timer, and mark the DomComplete milestone end time */\r\n protected endDomCompleteMilestone(): void {\r\n this.updateEndTiming(this.domCompleteTracker, ExperienceMilestoneEventTypes.domComplete);\r\n }\r\n\r\n /**\r\n * Mark perf pageReveal ttvr\r\n * @param aliasName - Optional alias for TTF marker name\r\n */\r\n private markTimeToRevalidateStaleState(shouldMarkPageReveal = true): void {\r\n if (shouldMarkPageReveal) {\r\n markTtprRaf(this.props.experienceName);\r\n }\r\n }\r\n\r\n /**\r\n * Helper to update the start timing for a given tracker & event type\r\n * @param tracker - the {PerfTracker} to update the start time\r\n * @param eventType - the milestone event type\r\n */\r\n private updateStartTiming(tracker: PerfTracker, eventType: ExperienceMilestoneEventTypes): void {\r\n\r\n tracker.setStart();\r\n\r\n const { onExperienceMilestoneTimingUpdate } = this.props;\r\n if (onExperienceMilestoneTimingUpdate) {\r\n onExperienceMilestoneTimingUpdate(eventType, tracker.getStart());\r\n }\r\n }\r\n\r\n /**\r\n * Helper to update end timing for a given tracker & event type\r\n * @param tracker - the {PerfTracker} to update the start time\r\n * @param eventType - the milestone event type\r\n */\r\n private updateEndTiming(tracker: PerfTracker, eventType: ExperienceMilestoneEventTypes): void {\r\n\r\n if (tracker.getEnd() !== -1) {\r\n return;\r\n }\r\n\r\n tracker.setEnd();\r\n\r\n const { onExperienceMilestoneTimingUpdate } = this.props;\r\n if (onExperienceMilestoneTimingUpdate) {\r\n onExperienceMilestoneTimingUpdate(eventType, undefined, tracker.getEnd());\r\n }\r\n }\r\n\r\n /**\r\n * Helper to increment render counter statistics on the _pageTimings object for a given marker name\r\n * Note that if the `renderCounterPrefix` static property is present on the Experience's component class,\r\n * this method will update the render counters for that custom counter name as well.\r\n * @param markerPrefix - the prefix of the marker to increment.\r\n */\r\n protected incrementExpCount(markerPrefix: string): void {\r\n\r\n // prevent counting in post-TTVR scenarios\r\n if (!pageTimings || pageTimings[\"TTVR\"]) {\r\n return;\r\n }\r\n\r\n incrementCounter(`Exp.${markerPrefix}Count`);\r\n\r\n const renderCounterPrefix = (this.constructor as unknown as ExperienceStaticConstructor).renderCounterPrefix;\r\n if (renderCounterPrefix) {\r\n incrementCounter(`Exp.${renderCounterPrefix}${markerPrefix}Count`);\r\n }\r\n }\r\n\r\n /**\r\n * Helper to add masking props for clarity.microsoft.com analytics tool\r\n * for elements containing personally identifiable info\r\n */\r\n protected clarityProps(): Object {\r\n\r\n // only add clarity mask props if clarity script is enabled and user is not signed in and there is no cookie wall banner\r\n if (appEnvironment.ClarityEnabled && !headData.UserIsSignedIn && !headData.ClientSettings.functionalonly_cookie_experience) {\r\n return {\r\n \"data-clarity-mask\": true\r\n };\r\n }\r\n return {};\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ChildExperienceConfigInfo } from \"./ChildExperienceConfigInfo\";\r\n\r\n/**\r\n * Specifies validator for child experience\r\n * @export\r\n * @interface\r\n */\r\nexport interface ChildExperienceValidator {\r\n /**\r\n * section name from where child element should be removed\r\n */\r\n sectionName: ValidatorSectionName;\r\n\r\n /**\r\n * ChildExperienceConfigInfo object to be removed\r\n */\r\n childExperienceConfigInfo: ChildExperienceConfigInfo;\r\n\r\n /**\r\n * Optional validation arguments\r\n */\r\n validationArgs?: ValidationArgs;\r\n}\r\n\r\n/**\r\n * section name from where child element should be removed. We can add more support in this list as additionalChildExperiences\r\n * or childExperienceMap. The current design and approach support that.\r\n */\r\nexport enum ValidatorSectionName {\r\n /**\r\n * Section name for River Grid children, positioned by row/column syntax\r\n */\r\n riverGridChildren = \"riverGridChildren\"\r\n}\r\n\r\n/**\r\n * Validation arguments to determine experience enable / disable\r\n * @export\r\n * @interface\r\n */\r\nexport interface ValidationArgs {\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n BaseExperienceConfig,\r\n ChildExperienceConfigInfo,\r\n ChildExperienceValidator,\r\n ChildInfo,\r\n ChildrenTypes,\r\n CustomCompositionConfig,\r\n ExperienceCompositionTypes,\r\n GridCompositionConfig,\r\n HorizontalStackConfig,\r\n LayoutConfig,\r\n PeregrineChildInfo,\r\n ScreenTypeMetadata,\r\n ScreenWidth,\r\n ValidationArgs,\r\n ValidatorSectionName,\r\n VerticalStackConfig,\r\n getExperienceType\r\n} from \"@msnews/core\";\r\nimport {\r\n ColumnArrangement,\r\n ExperienceInitialProps,\r\n fastBreakpointManager\r\n} from \"@msnews/experiences-base\";\r\n\r\nimport { AppValidator } from \"./AppValidator\";\r\nimport { cloneDeep } from \"lodash-es\";\r\nimport { isFunction } from \"util\";\r\n\r\n/**\r\n * Config Processor class to filter config\r\n * @class\r\n */\r\nexport class ConfigProcessor {\r\n /**\r\n * experience validator map to be provided by app type. Each entry has a validator name and a validator function associated\r\n * with that.\r\n */\r\n static expValidatorMap: Map boolean> = new Map();\r\n\r\n /**\r\n * config map that keeps track of original configs which are modified by ConfigProcessor.\r\n * This is required for partial page refresh scenarios where original config is required for refernce like ReAdding previously removed SD cards\r\n */\r\n static expConfigMap: Map> = new Map();\r\n\r\n /**\r\n * Registers apptype validators\r\n * @method\r\n * @param {AppValidator} apptypeValidator Validator for a specific app type\r\n * @returns {void}\r\n */\r\n public static registerAppValidator(apptypeValidator: AppValidator): void {\r\n this.expValidatorMap = apptypeValidator.getAllValidators();\r\n }\r\n\r\n /**\r\n * process config based on registered validators for current app-type and removes child experience from\r\n * section defined in CMS condig\r\n * @method\r\n * @param {BaseExperienceConfig} expConfig Experience config object\r\n * @returns {BaseExperienceConfig} returns filtered experience config\r\n */\r\n public static processConfig(expConfig: BaseExperienceConfig, namespace: string): BaseExperienceConfig {\r\n if (!this.expValidatorMap || this.expValidatorMap.size < 1 || !expConfig || !expConfig.childExpValidatorMap) {\r\n return expConfig;\r\n }\r\n\r\n const expMap: { [instanceId: string]: ChildExperienceValidator } = expConfig.childExpValidatorMap;\r\n let originalConfig: BaseExperienceConfig = null;\r\n let tempConfig: BaseExperienceConfig = null;\r\n\r\n for (const validatorName in expMap) {\r\n const childExpValidator = expMap[validatorName];\r\n if (this.expValidatorMap.has(validatorName)) {\r\n const validator = this.expValidatorMap.get(validatorName);\r\n const removeChildExp = validator(childExpValidator.validationArgs);\r\n\r\n if (removeChildExp) {\r\n if (tempConfig === null) {\r\n // always use saved config if exists\r\n tempConfig = this.expConfigMap.get(namespace) || expConfig;\r\n }\r\n\r\n // keep a copy of original config\r\n if (originalConfig === null) {\r\n originalConfig = cloneDeep(tempConfig);\r\n }\r\n\r\n expConfig = this.filterConfig(childExpValidator, tempConfig);\r\n }\r\n }\r\n }\r\n\r\n if (originalConfig) {\r\n this.expConfigMap.set(namespace, originalConfig);\r\n } else if (tempConfig === null && this.expConfigMap.has(namespace)) {\r\n // if tempConfig is null, none of the validators returned true.\r\n // restore expConfig with originalConfig for this case\r\n expConfig = this.expConfigMap.get(namespace);\r\n }\r\n\r\n return expConfig;\r\n }\r\n\r\n /**\r\n * remove child experience based on the response from registerd validator and config.\r\n * @method\r\n * @param {ChildExperienceValidator} childExpValidator Experience config object\r\n * @param {BaseExperienceConfig} expConfig Experience config object\r\n * @returns {BaseExperienceConfig} returns filtered experience config\r\n */\r\n private static removeFromRiverGridChildren(childExpValidator: ChildExperienceValidator, expConfig: any): BaseExperienceConfig {\r\n // TODO: River config is in experiences and we should not take dependency of experiences in this project.\r\n // We should move RiverConfig to core config project or expConfig has to be of type any\r\n const riverGridChildren = expConfig.riverGridChildren;\r\n if (riverGridChildren) {\r\n riverGridChildren.forEach(element => {\r\n const childElems = element.children;\r\n if (childElems) {\r\n const validatorConfigInfo = childExpValidator.childExperienceConfigInfo as ChildExperienceConfigInfo;\r\n const validatorConfigExperienceType = getExperienceType(validatorConfigInfo);\r\n element.children = childElems.filter((childExp) => {\r\n const configInfo = childExp.childExperienceConfigInfo as ChildExperienceConfigInfo;\r\n return !configInfo\r\n || !validatorConfigInfo\r\n || validatorConfigInfo.instanceId !== configInfo.instanceId\r\n || validatorConfigExperienceType !== getExperienceType(configInfo);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return expConfig;\r\n }\r\n\r\n /**\r\n * Given a experience config, get a list of child experience configs for child data connectors\r\n * @method\r\n * @param {BaseExperienceConfig} baseExperienceConfig experience config to find child data connectors configs\r\n * @returns {ChildExperienceConfigInfo[]} - child data connectors configs\r\n */\r\n public static getChildrenDataConnectorConfigInfos(baseExperienceConfig: BaseExperienceConfig): ChildExperienceConfigInfo[] {\r\n const childrenConfigInfo: ChildExperienceConfigInfo[] = [];\r\n\r\n if (baseExperienceConfig && baseExperienceConfig.dataConnectors && baseExperienceConfig.dataConnectors.length > 0) {\r\n const dataConnectorForCurrentScreenType = ConfigProcessor.getOrdinalObjectForCurrentBreakpoint(baseExperienceConfig.dataConnectors);\r\n\r\n if (dataConnectorForCurrentScreenType && dataConnectorForCurrentScreenType.children && dataConnectorForCurrentScreenType.children.length > 0) {\r\n dataConnectorForCurrentScreenType.children.forEach(connector => {\r\n childrenConfigInfo.push(connector);\r\n });\r\n }\r\n }\r\n\r\n return childrenConfigInfo;\r\n }\r\n\r\n /**\r\n * Helper function to match screenWidth and return the correct ScreenTypeMetadata object\r\n * @method\r\n * @param {ScreenWidth} screenWidth - screenWidth to match\r\n * @param {ScreenTypeMetadata[]} screenTypeObjList - Array of ScreenTypeMetadata objects\r\n * @returns {ScreenTypeMetadata} returns the matching ScreenTypeMetadata object for given screenWidth.\r\n */\r\n public static getMetadataByScreenWidth(screenWidth: ScreenWidth, screenTypeObjList: ScreenTypeMetadata[]): ScreenTypeMetadata {\r\n const result =\r\n screenTypeObjList.find(obj =>\r\n obj.screenWidth === screenWidth\r\n )\r\n || screenTypeObjList.find(obj =>\r\n obj.screenWidth === ScreenWidth.Any\r\n );\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * This method returns the ScreenTypeMetadata for current breakpoint.\r\n * @method\r\n * @param {ScreenTypeMetadata[]} screenTypeObjList Array of ScreenTypeMetadata objects\r\n * @returns {ScreenTypeMetadata} returns the matching ScreenTypeMetadata object for current breakpoint.\r\n */\r\n public static getOrdinalObjectForCurrentBreakpoint(screenTypeObjList: ScreenTypeMetadata[]): ScreenTypeMetadata {\r\n switch (fastBreakpointManager().currentColumnArrangement) {\r\n case ColumnArrangement.c1: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.OneColumn, screenTypeObjList);\r\n }\r\n case ColumnArrangement.c2: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.TwoColumn, screenTypeObjList);\r\n }\r\n case ColumnArrangement.c3: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.ThreeColumn, screenTypeObjList);\r\n }\r\n case ColumnArrangement.c4: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.FourColumn, screenTypeObjList);\r\n }\r\n case ColumnArrangement.c5: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.FiveColumn, screenTypeObjList);\r\n }\r\n default: {\r\n return ConfigProcessor.getMetadataByScreenWidth(ScreenWidth.Any, screenTypeObjList);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Composition resolver. It will return the composition value based on any possible overrides.\r\n * @method\r\n * @param {BaseExperienceConfig} baseExperienceConfig Array of ScreenTypeMetadata objects\r\n * @param {ExperienceInitialProps} connectorProps initial props for connector\r\n * @returns { GridCompositionConfig | LayoutConfig | HorizontalStackConfig | VerticalStackConfig | CustomCompositionConfig } returns composition from config or given override\r\n */\r\n public static compositionOverrideResolver(baseExperienceConfig: BaseExperienceConfig, connectorProps?: ExperienceInitialProps): GridCompositionConfig | LayoutConfig | HorizontalStackConfig | VerticalStackConfig | CustomCompositionConfig {\r\n const { getCompositionIdOverride } = connectorProps || {};\r\n const { composition, compositionOverrides } = baseExperienceConfig;\r\n return compositionOverrides && isFunction(getCompositionIdOverride) && compositionOverrides[getCompositionIdOverride()] || composition;\r\n }\r\n\r\n /**\r\n * Give an experience config, get a list of child experience configs.\r\n * @method\r\n * @param {BaseExperienceConfig} baseExperienceConfig experience config to find child data connectors configs\r\n * @param {ExperienceInitialProps} connectorProps connector props for given experience\r\n * @returns {ChildExperienceConfigInfo[]} - child data connectors configs\r\n */\r\n public static getChildrenExperienceConfigInfos(baseExperienceConfig: BaseExperienceConfig, connectorProps?: ExperienceInitialProps): ChildExperienceConfigInfo[] {\r\n const childrenConfigInfo: ChildExperienceConfigInfo[] = [];\r\n\r\n // Determine if there are any children in the composition portion of the config document.\r\n if (baseExperienceConfig && baseExperienceConfig.composition) {\r\n\r\n const composition = ConfigProcessor.compositionOverrideResolver(baseExperienceConfig, connectorProps);\r\n\r\n switch (composition.type) {\r\n case ExperienceCompositionTypes.horizontalStack:\r\n case ExperienceCompositionTypes.layout: {\r\n\r\n // Iterate over the composition config to find the children\r\n const layoutConfig = composition as LayoutConfig;\r\n\r\n // Iterate over the composition config to find the children\r\n layoutConfig.page.children.forEach(grid => {\r\n\r\n // If the grid does not contain children, then there are no child experiences\r\n if (grid.children === undefined) {\r\n return;\r\n }\r\n\r\n // Iterate over the grid children (each one is a column) and see if there is a child experience\r\n grid.children.forEach((column) => {\r\n\r\n // If the columnProps does not contain children, then there are no child experiences\r\n if (!column.children) {\r\n return;\r\n }\r\n\r\n // If the column.children is a legacy ColumnChildInfo, or of type PeregrineExperience, then\r\n // add the child to the list\r\n const { childType } = column.children as ChildInfo;\r\n if (!childType) {\r\n childrenConfigInfo.push(column.children as ChildExperienceConfigInfo);\r\n } else if (childType === ChildrenTypes.peregrineExperience) {\r\n childrenConfigInfo.push((column.children as PeregrineChildInfo).child);\r\n }\r\n });\r\n });\r\n break;\r\n }\r\n\r\n case ExperienceCompositionTypes.grid: {\r\n\r\n // Iterate over the grid composition config to find the peregrine child experiences to load\r\n const gridRows = (composition as GridCompositionConfig).grid.rows;\r\n gridRows.forEach(row => {\r\n\r\n // If the row does not contain columns, then there are no child experiences\r\n if (row.columns === undefined) {\r\n return;\r\n }\r\n\r\n // Iterate over the grid columns and see if there are any items\r\n row.columns.forEach((column) => {\r\n // If the column.item is a PeregrineExperience, then add the child to the list of children experiences to load\r\n const { itemType } = column.item;\r\n if (itemType && itemType === ChildrenTypes.peregrineExperience) {\r\n childrenConfigInfo.push(column.item.child as ChildExperienceConfigInfo);\r\n }\r\n });\r\n });\r\n break;\r\n }\r\n\r\n case ExperienceCompositionTypes.customExperience: {\r\n const customConfig = composition as CustomCompositionConfig;\r\n childrenConfigInfo.push(customConfig.experience);\r\n\r\n break;\r\n }\r\n\r\n // No children to load, if we do not know what type of composition this experience has\r\n default:\r\n }\r\n }\r\n\r\n return childrenConfigInfo;\r\n }\r\n\r\n /**\r\n * Verify if the section provided in CMS schema is supported for removal of child experiences.\r\n * Currently only riverGridChildren is supported. Support will be extended to other sections.\r\n * @method\r\n * @param {ChildExperienceValidator} childExpValidator Experience config object\r\n * @param {BaseExperienceConfig} expConfig Experience config object\r\n * @returns {BaseExperienceConfig} returns filtered experience config\r\n */\r\n private static filterConfig(childExpValidator: ChildExperienceValidator, expConfig: BaseExperienceConfig): BaseExperienceConfig {\r\n if (childExpValidator && typeof childExpValidator.sectionName === \"string\" && childExpValidator.sectionName.toLowerCase() === ValidatorSectionName.riverGridChildren.toLowerCase()) {\r\n return this.removeFromRiverGridChildren(childExpValidator, expConfig);\r\n }\r\n\r\n return expConfig;\r\n }\r\n\r\n /** Resets validator map, needed to handle multiple requests for SSR */\r\n public static resetValidatorMap(): void {\r\n this.expValidatorMap.clear();\r\n }\r\n\r\n /** Resets config map, needed to handle multiple requests for SSR */\r\n public static resetConfigMap(): void {\r\n this.expConfigMap.clear();\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n// IF YOU UPDATE THIS FILE PLEASE UPDATE THE ONE IN WebWorker\r\n// DUE TO TREE SHAKING ISSUES WHEN IN DEBUG WE CAN'T USE COMMON CODE\r\n// WITHOUT CAUSING ISSUES IN WebWorker\r\n\r\n/** Helper class to work on URL search params */\r\nexport class UrlSearchParamsHelper {\r\n /** Object that contains all the query strings */\r\n private searchParams: { [index: string]: string } = Object.create(null);\r\n\r\n constructor(search?: string) {\r\n this.parseQueryString(search);\r\n }\r\n\r\n /**\r\n * Sets the query string value\r\n * @param name query string name\r\n * @param value query string value\r\n */\r\n public set(name: string, value: string): UrlSearchParamsHelper {\r\n if (value !== undefined && value !== null) {\r\n this.searchParams[name] = value;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the query string value\r\n * @param name query string name\r\n */\r\n public get(name: string): string {\r\n return this.searchParams[name];\r\n }\r\n\r\n /**\r\n * Deletes the query string value\r\n * @param name query string name\r\n */\r\n public delete(name: string): void {\r\n delete this.searchParams[name];\r\n }\r\n\r\n /**\r\n * Returns the query parameters as a string\r\n */\r\n public toString(): string {\r\n const keys = Object.keys(this.searchParams);\r\n\r\n if (!keys.length) {\r\n return \"\";\r\n }\r\n\r\n return keys.sort().map((key: string) => {\r\n return `${key}=${this.searchParams[key]}`;\r\n }).join(\"&\");\r\n }\r\n\r\n /** Parses the query string and adds the values to searchParams */\r\n private parseQueryString(queryString?: string): void {\r\n if (!queryString) {\r\n return;\r\n }\r\n\r\n if (queryString.charAt(0) === \"?\") {\r\n queryString = queryString.substring(1);\r\n }\r\n\r\n queryString.split(\"&\").forEach((keyValuePairs) => {\r\n const query = keyValuePairs.split(\"=\");\r\n\r\n const name = query[0];\r\n\r\n if (!this.get(name)) {\r\n this.searchParams[name] = query[1];\r\n }\r\n });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Constants used for Prime Integration\r\n */\r\nexport const PrimeIntegrationConstants = {\r\n\r\n /**\r\n * Default value we use for the name of the cookie that holds the ANID\r\n */\r\n AnonCookieName: \"APP_ANON\",\r\n\r\n /** The ID of the coachmark to show for when a user performed follow/unfollow action fails */\r\n userActionErrorCoachMarkId: \"cm-spafeedsapp-user-action-error\"\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { MediatorEventNames } from \"./MediatorEventNames\";\r\nimport { PrimeIntegrationConstants } from \"./Constants\";\r\nimport { SubnavTabId } from \"./SubnavTabId\";\r\nimport { TabsHelper } from \"./SubnavTabHelper\";\r\nimport { getMediator } from \"mediator-integration\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\nexport namespace Mediator {\r\n /**\r\n * API to listen for tab change event from Prime\r\n *\r\n * @export\r\n * @param callback {(tabId: number) => void} - A callback method to handle the event\r\n * @param shouldCallTabChangeEventImmediately {Boolean} - if we should immediately call the callback in order to capture any changes between initialization and registration.\r\n * @return Promise\r\n */\r\n export async function registerForTabChangeEvent(callback: (tabId: number) => void, shouldCallCallbackImmediately = false): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n\r\n function sendActiveTabToCallback(data: PrimeGlobal.INavigateEventData): void {\r\n let activeTab: SubnavTabId = getActiveTabValue();\r\n\r\n // This is only used if the caller of the mediator event neglected to set window.navigation and if the caller decides to use \"tab\" instead of \"tabId\"\r\n if (activeTab === SubnavTabId.None && data && data.tab) {\r\n activeTab = data.tab;\r\n }\r\n\r\n if (window._perfMarker) {\r\n window._perfMarker(\"TimeToTabClick_\" + TabsHelper.tabIdToTabName(activeTab), true);\r\n }\r\n\r\n callback(activeTab);\r\n }\r\n\r\n mediator.sub(MediatorEventNames.TabNavigation, sendActiveTabToCallback);\r\n if (shouldCallCallbackImmediately) {\r\n sendActiveTabToCallback(null);\r\n }\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for content actions updates from Prime\r\n *\r\n * @export\r\n * @param callback {()) => void} - A callback method to handle the event\r\n * @return Promise\r\n */\r\n export async function registerContentActionsUpdatedEvent(callback: () => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.ContentActionsUpdated, callback);\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for card action enable event from Prime\r\n *\r\n * @export\r\n * @param callback {(initData PrimeGlobal.ICardActionInitEventData)) => void} - A callback method to handle the event\r\n * @return Promise\r\n */\r\n export async function registerCardActionEnableEvent(callback: (initData: PrimeGlobal.ICardActionInitEventData) => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.CardActionInit, (initData: PrimeGlobal.ICardActionInitEventData): void => {\r\n callback(initData);\r\n });\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for card action post event from Prime\r\n *\r\n * @export\r\n * @param callback {(initData PrimeGlobal.ICardActionPostEventData)) => void} - A callback method to handle the event\r\n * @return Promise\r\n */\r\n export async function registerCardActionPostEvent(callback: (postData: PrimeGlobal.ICardActionPostEventData) => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.CardActionPost, (postData: PrimeGlobal.ICardActionPostEventData): void => {\r\n callback(postData);\r\n });\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for follow button click event from Prime\r\n *\r\n * @export\r\n * @param callback {(topicId: string, isFollowed: boolean) => void} - A callback method to handle the event\r\n * @return Promise\r\n */\r\n export async function registerForFollowButtonClickEvent(callback: (topicId: string, isFollowed: boolean) => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.TopicAction, function (followButtonData: PrimeGlobal.IFollowButtonClickData): void {\r\n if (followButtonData && followButtonData.topicId) {\r\n callback(followButtonData.topicId, followButtonData.isFollowed);\r\n }\r\n });\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for Interests render complete event.\r\n *\r\n * @export\r\n * @return Promise\r\n */\r\n export async function registerForInterestsRenderCompleteEvent(callback: () => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.InterestsRenderComplete, function (): void {\r\n callback();\r\n });\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * API to listen for social actions updates from Prime\r\n *\r\n * @export\r\n * @param callback {()) => void} - A callback method to handle the event\r\n * @return Promise\r\n */\r\n export async function registerSocialActionsUpdatedEvent(callback: () => void): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.sub(MediatorEventNames.SocialActionsUpdated, callback);\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object.\");\r\n }\r\n }\r\n\r\n /**\r\n * Returns the active tab\r\n * @public\r\n * @return {SubnavTabId}\r\n */\r\n export function getActiveTabValue(): SubnavTabId {\r\n let activeTabValue = \"\";\r\n\r\n if (window.navigation && typeof window.navigation.activeTab === \"string\") {\r\n activeTabValue = window.navigation.activeTab.toLowerCase();\r\n }\r\n\r\n return TabsHelper.tabNameToTabId(activeTabValue);\r\n }\r\n\r\n /**\r\n * API to publish the event to Prime.\r\n *\r\n * @export\r\n * @param event - the mediator event name string\r\n * @param data - the event data\r\n * @return Promise\r\n */\r\n export async function publishEventForPrime(event: string, data?: any): Promise {\r\n try {\r\n const mediator = await getMediator();\r\n mediator.pub(event, data);\r\n } catch {\r\n logger.logError(\"Couldn't load the mediator object in publishEventForPrime.\");\r\n }\r\n }\r\n\r\n /**\r\n * Publishes a message to trigger rendering of a mediated coach mark from Prime page\r\n * @param refElement {Element} - the reference element next to which the coachmark should be rendered. This is optional for Overlay type of coachmarks\r\n * @param hideCoachMark {boolean} - flag to indicate whether to hide the coachmark. Default value of false indicates that the coachmark should be shown.\r\n * @returns Promise{void} - The promise that will return after the action has been completed.\r\n */\r\n export async function renderUserActionErrorCoachmark(\r\n args: { refElement?: Element, hideCoachMark?: boolean } = {}): Promise {\r\n\r\n args = {\r\n refElement: undefined,\r\n hideCoachMark: false,\r\n ...args\r\n };\r\n\r\n const mediator = await getMediator();\r\n mediator.pub(\r\n MediatorEventNames.MediatedCoachMark,\r\n {\r\n coachMarkId: PrimeIntegrationConstants.userActionErrorCoachMarkId,\r\n refElement: args.refElement,\r\n hideCoachMark: args.hideCoachMark\r\n });\r\n }\r\n}","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\n// TODO: This should be considered for moving it to the Interests experience wrapper, once that\r\n// code arrives, since this is specific to that experience\r\n\r\nimport { SubnavTabId } from \"./SubnavTabId\";\r\nimport { SubnavTabName } from \"./SubnavTabName\";\r\n\r\nexport namespace TabsHelper {\r\n /**\r\n * Converts from the tab enum to the tab names\r\n *\r\n * @export\r\n * @param {SubnavTabId} tabId - The tabId being converted\r\n * @return The tab name\r\n */\r\n export function tabIdToTabName(tabId: SubnavTabId): string {\r\n switch (tabId) {\r\n case SubnavTabId.Interests:\r\n return SubnavTabName.Interests;\r\n\r\n case SubnavTabId.MyFeed:\r\n return SubnavTabName.MyFeed;\r\n\r\n case SubnavTabId.XFeed:\r\n return SubnavTabName.XFeed;\r\n\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Converts from the tab name to the tab enum\r\n *\r\n * @export\r\n * @param {string} tabName - The tabName being converted\r\n * @return The tabId\r\n */\r\n export function tabNameToTabId(tabName: string): SubnavTabId {\r\n switch (tabName) {\r\n\r\n case SubnavTabName.MyFeed:\r\n return SubnavTabId.MyFeed;\r\n\r\n case SubnavTabName.XFeed:\r\n return SubnavTabId.XFeed;\r\n\r\n case SubnavTabName.Interests:\r\n return SubnavTabId.Interests;\r\n\r\n default:\r\n return SubnavTabId.None;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getLocalStorage } from \"@msnews/core\";\r\nimport { getLocationHref } from \"@msnews/isomorphic-util\";\r\nimport { MY_REACTION_PREFIX } from \"../Constants\";\r\nimport { ActivityData, Comment, CommentSummary, enums, OneServiceReactionCommentMetadata, ReactionBreakdownReactionCounts, ReactionSummary, SocialBarData, SocialReactions, TopCommentData } from \"../schema\";\r\nimport { getExternalURL } from \"../utils/UrlHelper\";\r\n\r\nexport class SocialServiceMapper {\r\n public static convertContent(contentData) {\r\n const reactionCounts = {};\r\n enums.reactionOrder.map(key => {\r\n if (contentData) {\r\n if (contentData.reactionSummary) {\r\n reactionCounts[key] = (contentData.reactionSummary.subReactionSummaries.find(x => x.type.toLowerCase() == key) || { totalCount: 0 }).totalCount;\r\n } else {\r\n reactionCounts[key] = 0;\r\n }\r\n }\r\n });\r\n return !contentData ?\r\n null :\r\n {\r\n comments: {\r\n skip: 0,\r\n top: 0,\r\n moreCount: 0,\r\n list: []\r\n },\r\n ...contentData,\r\n ...{\r\n totalCommentCount: contentData.commentSummary ? contentData.commentSummary.totalCount : 0,\r\n reactionCounts\r\n }\r\n };\r\n }\r\n public static convertUser(userData) {\r\n if (!userData) {\r\n return {\r\n state: enums.userStateType.anonymous\r\n };\r\n } else {\r\n let state: string;\r\n if (userData.isSocialUser) {\r\n state = enums.userStateType.existingUser;\r\n } else if (userData.id && !userData.id.startsWith(\"m-\")) {\r\n state = enums.userStateType.newUser;\r\n } else {\r\n state = enums.userStateType.anonymous;\r\n }\r\n\r\n let nameStatus: string = userData.nameStatus || enums.userNameStatusType.normal;\r\n if (state == enums.userStateType.newUser && (userData.primaryName == null || userData.primaryName.trim() === \"\")) {\r\n nameStatus = enums.userNameStatusType.notAllow;\r\n }\r\n\r\n return {\r\n ...userData,\r\n ...{\r\n name: userData.primaryName,\r\n avatarUrl: userData.notUseAvatar || !userData.primaryAvatar ?\r\n undefined :\r\n userData.primaryAvatar,\r\n likesCount: userData.reactionSummary ? userData.reactionSummary.totalCount : 0,\r\n postsCount: userData.commentSummary ? userData.commentSummary.totalCount : 0,\r\n followersCount: (userData.followSummary && userData.followSummary.subFollowSummaries.find(x => x.type == \"FollowBy\") || { totalCount: 0 }).totalCount,\r\n followingCount: (userData.followSummary && userData.followSummary.subFollowSummaries.find(x => x.type == \"Follow\") || { totalCount: 0 }).totalCount,\r\n reactionsCount: (userData.reactionSummary && userData.reactionSummary.totalCount) || 0,\r\n badge: \"Commenter\",\r\n state: state,\r\n avatarStatus: userData.avatarStatus || enums.userAvatarStatusType.normal,\r\n nameStatus,\r\n ageGroup: userData.ageGroup || enums.userAgeGroup.above18\r\n }\r\n };\r\n }\r\n }\r\n public static convertUserList(userListData) {\r\n if (!userListData) {\r\n return null;\r\n }\r\n return {\r\n skip: userListData.skip,\r\n top: userListData.top,\r\n hasMore: userListData.hasMore,\r\n moreCount: userListData.totalCount - (userListData.top + userListData.skip),\r\n totalCount: userListData.totalCount,\r\n list: userListData.items.map(item => this.convertUser(item.links.find(x => x.type == \"User\").item || null))\r\n };\r\n }\r\n\r\n public static convertComment(commentData) {\r\n if (!commentData) {\r\n return null;\r\n }\r\n\r\n let owner = null;\r\n let content = null;\r\n if (commentData.links) {\r\n const foundUser = commentData.links.find((link) => link.type == \"User\" && link.item.id == commentData.createdBy);\r\n owner = foundUser ? SocialServiceMapper.convertUser(foundUser.item) : null;\r\n\r\n const foundContent = commentData.links.find((link) => link.type == \"Content\");\r\n content = foundContent ? SocialServiceMapper.convertContent(foundContent.item) : null;\r\n }\r\n\r\n const isHidden = commentData.visibleStatus != enums.visibleStatusType.Normal;\r\n const isInReview = commentData.visibleStatus == enums.visibleStatusType.InReview;\r\n const isDeleted = [enums.visibleStatusType.DeletedByAI, enums.visibleStatusType.DeletedByHI, enums.visibleStatusType.DeletedByUser].includes(commentData.visibleStatus);\r\n // TODO: Remove this flag when API no longer show this\r\n const skipRender = isInReview;\r\n const reactionCounts = {};\r\n enums.reactionOrder.map(key => {\r\n if (commentData.reactionSummary) {\r\n reactionCounts[key] = (commentData.reactionSummary.subReactionSummaries.find(x => x.type.toLowerCase() == key) || { totalCount: 0 }).totalCount;\r\n } else {\r\n reactionCounts[key] = 0;\r\n }\r\n });\r\n\r\n return {\r\n ...commentData,\r\n ...{\r\n ownerId: commentData.createdBy,\r\n text: commentData.body.replace(/(?:\\r\\n|\\r|\\n)/g, \"
    \"),\r\n createDatetime: commentData.createdTime,\r\n reactionCounts,\r\n user: owner,\r\n content: content,\r\n isHidden: isHidden,\r\n isInReview: isInReview,\r\n isDeleted: isDeleted,\r\n skipRender: skipRender,\r\n replies: [],\r\n replyCount: commentData.commentSummary ? commentData.commentSummary.totalCount : 0\r\n }\r\n };\r\n }\r\n public static convertCommentList(commentListData) {\r\n if (!commentListData) {\r\n return null;\r\n }\r\n return {\r\n commentStatus: \"On\",\r\n skip: commentListData.skip,\r\n top: commentListData.top,\r\n hasMore: commentListData.hasMore,\r\n hasPrevious: commentListData.hasPrevious,\r\n asc: commentListData.asc,\r\n moreCount: commentListData.totalCount - (commentListData.top - 1 + commentListData.skip - 1 + 2),\r\n totalCount: commentListData.totalCount,\r\n list: commentListData.items.map((item) => SocialServiceMapper.convertComment(item))\r\n };\r\n }\r\n public static convertReactionsResponseToReactionBreakdownData(reactionsResponse) {\r\n if (!reactionsResponse) {\r\n return null;\r\n }\r\n\r\n const reactionDetails = reactionsResponse.items;\r\n let reactionSummary;\r\n try {\r\n reactionSummary = reactionsResponse.links.find(x => x.type == \"Content\" || x.type == \"Comment\").item.reactionSummary.subReactionSummaries;\r\n } catch (e) {\r\n reactionSummary = null;\r\n }\r\n const reactionBreakdownData = { reactionCounts: { all: 0 }, items: { all: [] } };\r\n enums.reactionOrder.map(key => {\r\n reactionBreakdownData.reactionCounts[key] = 0;\r\n reactionBreakdownData.items[key] = [];\r\n });\r\n\r\n if (reactionSummary) {\r\n reactionSummary.map(x => {\r\n reactionBreakdownData.reactionCounts[x.type.toLowerCase()] = x.totalCount;\r\n reactionBreakdownData.reactionCounts.all += x.totalCount;\r\n });\r\n }\r\n\r\n if (reactionDetails) {\r\n reactionDetails.map(x => {\r\n const rateValue = x.subType.toLowerCase();\r\n const user = x.links.find(x => x.type == \"User\") ? x.links.find(x => x.type == \"User\").item : { state: enums.userStateType.anonymous, primaryName: \"You\" };\r\n user.isFollowingFetched = true;\r\n user.isFollowing = !!x.links.find(x => x.type == \"Follow\");\r\n reactionBreakdownData.items[x.subType.toLowerCase()].push({ user: user, rateValue });\r\n reactionBreakdownData.items.all.push({ user: user, rateValue });\r\n });\r\n }\r\n\r\n return reactionBreakdownData;\r\n }\r\n public static convertRatingToRateValue(ratingData) {\r\n if (ratingData && ratingData.items) {\r\n ratingData = ratingData.items[0];\r\n }\r\n const type = (ratingData && ratingData.subType) ? ratingData.subType.toLowerCase() : null;\r\n return type;\r\n }\r\n public static convertUserActivities(userActivitiesData) {\r\n if (!userActivitiesData) {\r\n return null;\r\n }\r\n return {\r\n skip: userActivitiesData.skip,\r\n top: userActivitiesData.top,\r\n hasMore: userActivitiesData.hasMore,\r\n moreCount: userActivitiesData.totalCount - (userActivitiesData.top - 1 + userActivitiesData.skip - 1 + 2),\r\n totalCount: userActivitiesData.totalCount,\r\n list: userActivitiesData.items.map(activity => this.convertUserActivity(activity))\r\n };\r\n }\r\n public static convertUserActivity(activity): ActivityData {\r\n if (!activity) {\r\n return null;\r\n }\r\n\r\n const baseActivity = {\r\n id: activity.id,\r\n type: activity.type,\r\n datetime: activity.createdDateTime,\r\n isSeen: activity.read,\r\n notification: activity.notification\r\n };\r\n switch (activity.type) {\r\n case enums.activityType.follow: {\r\n const userLink = activity.links.find(x => x.type == \"User\");\r\n return {\r\n ...baseActivity,\r\n user: this.convertUser(userLink && userLink.item)\r\n };\r\n }\r\n case enums.activityType.badge: {\r\n const achievementLink = activity.links.find(x => x.type == \"Achievement\");\r\n return {\r\n ...baseActivity,\r\n badgeType: achievementLink && achievementLink.item.subType\r\n };\r\n }\r\n case enums.activityType.reply: {\r\n const userLink = activity.links.find(x => x.type == \"User\");\r\n const contentLink = activity.links.find(x => x.type == \"Content\");\r\n const commentLink = activity.links.find(x => x.type == \"Comment\");\r\n return {\r\n ...baseActivity,\r\n user: this.convertUser(userLink && userLink.item),\r\n target: {\r\n url: contentLink && contentLink.item.url,\r\n body: commentLink && commentLink.item.body.replace(/(?:\\r\\n|\\r|\\n)/g, \"
    \"),\r\n comment: commentLink && this.convertComment(commentLink.item)\r\n }\r\n };\r\n }\r\n case enums.activityType.reaction: {\r\n const userLink = activity.links.find(x => x.type == \"User\");\r\n const contentLink = activity.links.find(x => x.type == \"Content\");\r\n const commentLink = activity.links.find(x => x.type == \"Comment\");\r\n const reactionLink = activity.links.find(x => x.type == \"Reaction\");\r\n\r\n const targetReactionCounts = reactionLink && reactionLink.item.targetType == \"Comment\" ?\r\n this.convertSubReactionSummariesToReactionCounts(commentLink && commentLink.item.reactionSummary && commentLink.item.reactionSummary.subReactionSummaries) :\r\n this.convertSubReactionSummariesToReactionCounts(contentLink && contentLink.item.reactionSummary && contentLink.item.reactionSummary.subReactionSummaries);\r\n\r\n const targetBody = reactionLink && reactionLink.item.targetType == \"Comment\" ?\r\n commentLink && commentLink.item.body :\r\n contentLink && contentLink.item.title;\r\n\r\n return {\r\n ...baseActivity,\r\n user: this.convertUser(userLink && userLink.item),\r\n target: {\r\n url: contentLink && contentLink.item.url,\r\n reactionCounts: targetReactionCounts,\r\n body: targetBody.replace(/(?:\\r\\n|\\r|\\n)/g, \"
    \"),\r\n comment: commentLink && this.convertComment(commentLink.item)\r\n }\r\n };\r\n }\r\n case enums.activityType.moderation: {\r\n const commentLink = activity.links.find(x => x.type == \"Comment\");\r\n const moderationRecordLink = activity.links.find(x => x.type == \"ModerationRecord\");\r\n const moderationErrorType = moderationRecordLink && moderationRecordLink.item.subType;\r\n let message: string;\r\n switch (moderationErrorType) {\r\n case enums.moderationErrorType.takedown:\r\n message = \"This comment was removed because it didn't meet our guidelines.\"; break;\r\n case enums.moderationErrorType.ban:\r\n message = \"You've been banned due to violations of our guidelines.\"; break;\r\n case enums.moderationErrorType.notAllowName:\r\n message = \"Your profile name didn't meet our guidelines.\"; break;\r\n case enums.moderationErrorType.notAllowPicture:\r\n message = \"Your profile picture didn't meet our guidelines.\"; break;\r\n case enums.moderationErrorType.approveUserAppeal:\r\n message = \"At your request, we've reviewed your case and reversed the prior decision. You should be able to post again soon. Thank you.\"; break;\r\n case enums.moderationErrorType.approveCommentAppeal:\r\n message = \"At your request, we've reviewed your post and reversed the decision to remove it. This post will be restored shortly. Thank you.\"; break;\r\n case enums.moderationErrorType.approveProfilePicAppeal:\r\n message = \"At your request, we've reviewed your profile picture and reversed the decision to remove it. Your profile picture will be restored shortly. Thank you.\"; break;\r\n case enums.moderationErrorType.rejectUserAppeal:\r\n message = \"At your request, we've reviewed your case and found that your posts violated our community guidelines.\"; break;\r\n case enums.moderationErrorType.rejectCommentAppeal:\r\n message = \"At your request, we've reviewed your post that was removed and found it violated our community guidelines.\"; break;\r\n case enums.moderationErrorType.rejectProfilePicAppeal:\r\n message = \"At your request, we've reviewed your case and found that your profile picture violated our community guidelines.\"; break;\r\n default:\r\n message = \"\";\r\n }\r\n return {\r\n ...baseActivity,\r\n moderationErrorType: moderationErrorType,\r\n message: message,\r\n target: commentLink && {\r\n id: commentLink.item.id,\r\n body: commentLink.item.body\r\n }\r\n };\r\n }\r\n }\r\n\r\n return baseActivity;\r\n }\r\n private static convertSubReactionSummariesToReactionCounts(subReactionSummaries): ReactionBreakdownReactionCounts {\r\n if (!subReactionSummaries) { return null; }\r\n const reactionCounts = { all: 0 };\r\n enums.reactionOrder.map(key => {\r\n reactionCounts[key] = 0;\r\n });\r\n subReactionSummaries.map(x => {\r\n reactionCounts[x.type.toLowerCase()] = x.totalCount;\r\n });\r\n return reactionCounts;\r\n }\r\n public static mapFeedResponseToSocialBarData(id: string, myReaction: string, reactionSummary: ReactionSummary, commentSummary: CommentSummary, topComments?: Array, localStorageGet?: (id: string) => string): SocialBarData {\r\n\r\n // test hook for injecting mock social reactions\r\n const locationHref = getLocationHref();\r\n if (locationHref && locationHref.indexOf(\"reactionstest\") > -1) {\r\n try {\r\n reactionSummary = { totalCount: 0, subReactionSummaries: [] };\r\n commentSummary = { totalCount: 0, subCommentSummaries: [] };\r\n reactionSummary.totalCount = Math.floor(Math.random() * 10000);\r\n commentSummary.totalCount = Math.floor(Math.random() * 10000);\r\n const reactionTypes = [\"angry\", \"like\", \"love\", \"sad\", \"surprised\", \"thinking\"].sort(() => 0.5 - Math.random()).slice(0, Math.floor(Math.random() * 3));\r\n reactionTypes.forEach(type => reactionSummary.subReactionSummaries.push({ totalCount: Math.floor(Math.random() * 10), type: type }));\r\n } catch {\r\n // noop\r\n }\r\n\r\n // test hook for injecting mock top comments\r\n if (commentSummary.totalCount > 0) {\r\n try {\r\n const sampleComments = [\r\n { id: \"82ccfa9b-56ac-41ca-9546-9f3910ec3cec\"},\r\n { id: \"f21a5f91-a6a9-4e80-bb59-3839e296773f\"},\r\n { id: \"c400d1c0-2f0d-469f-986c-8bebe2de1060\"},\r\n { id: \"1be1cb2b-6210-43b4-b962-ce1df9b524d0\"},\r\n { id: \"4e19e02f-f6fc-405d-8f99-1f007ce7f5df\"}\r\n ];\r\n const randomIndex = Math.floor(Math.random() * 5);\r\n topComments = sampleComments.slice(randomIndex, randomIndex+1);\r\n } catch {\r\n // noop\r\n }\r\n }\r\n }\r\n\r\n const subReactionSummaries: OneServiceReactionCommentMetadata[] = reactionSummary && reactionSummary.subReactionSummaries ? reactionSummary.subReactionSummaries : [];\r\n\r\n const getSubReactionCounts = (reactionType: SocialReactions) => {\r\n if (Array.isArray(subReactionSummaries)) {\r\n const result = subReactionSummaries.filter(value => value.type === (reactionType as string));\r\n return result && (result.length > 0) ? result[0].totalCount : 0;\r\n }\r\n };\r\n\r\n const reactionCounts = {\r\n angry: getSubReactionCounts(SocialReactions.angry),\r\n like: getSubReactionCounts(SocialReactions.like),\r\n love: getSubReactionCounts(SocialReactions.love),\r\n sad: getSubReactionCounts(SocialReactions.sad),\r\n surprised: getSubReactionCounts(SocialReactions.surprised),\r\n thinking: getSubReactionCounts(SocialReactions.thinking)\r\n };\r\n\r\n const myLocalReaction = !myReaction && SocialServiceMapper.getLocalContentReaction(id, localStorageGet);\r\n if (myLocalReaction) {\r\n myReaction = myLocalReaction;\r\n reactionCounts[myReaction]++;\r\n }\r\n\r\n return {\r\n myReaction,\r\n id,\r\n totalCommentsCount: commentSummary && commentSummary.totalCount,\r\n reactionCounts,\r\n topComments\r\n };\r\n }\r\n\r\n public static getLocalContentReaction(id: string, localStorageGet?: (id: string) => string): string {\r\n if (localStorageGet) {\r\n return localStorageGet(id);\r\n }\r\n\r\n if (getLocalStorage().supported && getLocalStorage().getItem(`${MY_REACTION_PREFIX}${id}`)) {\r\n return getLocalStorage().getItem(`${MY_REACTION_PREFIX}${id}`);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static convertCommentToTopCommentData (comment: Comment, contentUrl: string, market: string): TopCommentData {\r\n return !comment || !comment.user ? null :\r\n {\r\n market: market,\r\n username: comment.user.primaryName,\r\n avatarUrl: comment.user.notUseAvatar || !comment.user.primaryAvatar ? undefined : comment.user.primaryAvatar,\r\n profileUrl: getExternalURL(`${enums.externalUrls.profilePage}${comment.user.id}`, market),\r\n commentUrl: getExternalURL(contentUrl, market, comment.id),\r\n commentBody: comment.text,\r\n replyCount: comment.replyCount,\r\n reactionCounts: comment.reactionCounts,\r\n createDatetime: comment.createDatetime\r\n };\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Constants for Cookie wall experience & helpers.\r\n/**\r\n * Latest cookie statement document version. If the version of the cookie stamped on the client does not match this version,\r\n * the user is prompted again for consent.\r\n * IMPORTANT: Update this version whenever the cookie statement document gets updated.\r\n */\r\nexport const cookieStatementDocumentVersion = \"v1\";\r\n\r\n/** Cookie name to store user's consent for cookie wall. The cookie gets dropped when user gives consent */\r\nexport const cacCookieName = \"cac\";\r\n\r\n/**\r\n * CAC cookie domain.\r\n * Setting cookie domain to \"msn.com\" will cause the user agent\r\n * to send the cookie when making requests to \"msn.com\",\"www.msn.com\" and \"ntp.msn.com\"\r\n * Reference: RFC spec: https://tools.ietf.org/html/rfc6265 \"Domain\" attribute section\r\n */\r\nexport const cacCookieDomain = \"msn.com\";\r\n\r\n/** CAC cookie duration in days */\r\nexport const cacCookieDuration = 360;\r\n\r\n/**\r\n * Id of mscc cookie banner container element.\r\n */\r\nexport const msccConsentBannerContainer = \"consent-banner-container\";\r\n\r\n/** Cookie name to store user's consent for MSCC cookie banner. The cookie gets dropped by MSCC framework when user gives consent */\r\nexport const msccCookieName = \"MSCC\";\r\n\r\n/**\r\n * The id of the