From f5388ef43545114bec839f5b6e5620ecf7e3441b Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 10:03:46 +0800 Subject: [PATCH 01/59] Remove rendering of WidgetNull. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 2fe794c42b0..762a6b7a90f 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -65,7 +65,7 @@ import { } from '../../../../components/AdminMenuTooltip'; import useViewContext from '../../../../hooks/useViewContext'; -function ReaderRevenueManagerSetupCTABanner( { Widget, WidgetNull } ) { +function ReaderRevenueManagerSetupCTABanner( { Widget } ) { const viewContext = useViewContext(); const breakpoint = useBreakpoint(); const isMobileBreakpoint = breakpoint === BREAKPOINT_SMALL; @@ -153,7 +153,6 @@ function ReaderRevenueManagerSetupCTABanner( { Widget, WidgetNull } ) { if ( isTooltipVisible ) { return ( - ; - } - return (
From 5fa92aa982df179fac618fe060a48667b29d9877 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 10:11:49 +0800 Subject: [PATCH 02/59] Wrap RRM notification registration with a feature flag check. --- .../modules/reader-revenue-manager/index.js | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 9367ad5d4f7..9eb9d0d13c8 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -39,6 +39,7 @@ import { RRMSetupSuccessSubtleNotification } from './components/dashboard'; import { NOTIFICATION_AREAS } from '../../googlesitekit/notifications/datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../googlesitekit/constants'; import { CORE_MODULES } from '../../googlesitekit/modules/datastore/constants'; +import { isFeatureEnabled } from '../../features'; export { registerStore } from './datastore'; @@ -77,38 +78,45 @@ export const registerModule = ( modules ) => { }; export const registerNotifications = ( notifications ) => { - notifications.registerNotification( 'setup-success-notification-rrm', { - Component: RRMSetupSuccessSubtleNotification, - priority: 10, - areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, - viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], - checkRequirements: async ( { select, resolveSelect } ) => { - const rrmConnected = await resolveSelect( - CORE_MODULES - ).isModuleConnected( READER_REVENUE_MANAGER_MODULE_SLUG ); + if ( isFeatureEnabled( 'rrmModule' ) ) { + notifications.registerNotification( 'setup-success-notification-rrm', { + Component: RRMSetupSuccessSubtleNotification, + priority: 10, + areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + checkRequirements: async ( { select, resolveSelect } ) => { + const rrmConnected = await resolveSelect( + CORE_MODULES + ).isModuleConnected( READER_REVENUE_MANAGER_MODULE_SLUG ); - if ( ! rrmConnected ) { - return false; - } + if ( ! rrmConnected ) { + return false; + } - const notification = getQueryArg( location.href, 'notification' ); - const slug = getQueryArg( location.href, 'slug' ); + const notification = getQueryArg( + location.href, + 'notification' + ); + const slug = getQueryArg( location.href, 'slug' ); - await resolveSelect( MODULES_READER_REVENUE_MANAGER ).getSettings(); - const publicationOnboardingState = await select( - MODULES_READER_REVENUE_MANAGER - ).getPublicationOnboardingState(); + await resolveSelect( + MODULES_READER_REVENUE_MANAGER + ).getSettings(); + const publicationOnboardingState = await select( + MODULES_READER_REVENUE_MANAGER + ).getPublicationOnboardingState(); - if ( - notification === 'authentication_success' && - slug === READER_REVENUE_MANAGER_MODULE_SLUG && - publicationOnboardingState !== undefined - ) { - return true; - } + if ( + notification === 'authentication_success' && + slug === READER_REVENUE_MANAGER_MODULE_SLUG && + publicationOnboardingState !== undefined + ) { + return true; + } - return false; - }, - isDismissible: false, - } ); + return false; + }, + isDismissible: false, + } ); + } }; From f3f92c277527d0c0e2ff5594aa0905b182a6161d Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 10:17:48 +0800 Subject: [PATCH 03/59] Register RRM Setup CTA notification to the setup CTAs queue. --- .../js/modules/reader-revenue-manager/index.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 9eb9d0d13c8..8cdb42d944f 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -35,8 +35,14 @@ import { SetupMain } from './components/setup'; import { SettingsEdit, SettingsView } from './components/settings'; import ReaderRevenueManagerIcon from '../../../svg/graphics/reader-revenue-manager.svg'; import { isURLUsingHTTPS } from './utils/validation'; -import { RRMSetupSuccessSubtleNotification } from './components/dashboard'; -import { NOTIFICATION_AREAS } from '../../googlesitekit/notifications/datastore/constants'; +import { + ReaderRevenueManagerSetupCTABanner, + RRMSetupSuccessSubtleNotification, +} from './components/dashboard'; +import { + NOTIFICATION_AREAS, + NOTIFICATION_GROUPS, +} from '../../googlesitekit/notifications/datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../googlesitekit/constants'; import { CORE_MODULES } from '../../googlesitekit/modules/datastore/constants'; import { isFeatureEnabled } from '../../features'; @@ -79,6 +85,14 @@ export const registerModule = ( modules ) => { export const registerNotifications = ( notifications ) => { if ( isFeatureEnabled( 'rrmModule' ) ) { + notifications.registerNotification( 'rrm-setup-notification', { + Component: ReaderRevenueManagerSetupCTABanner, + priority: 50, + areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, + groupID: NOTIFICATION_GROUPS.SETUP_CTAS, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + isDismissible: true, + } ); notifications.registerNotification( 'setup-success-notification-rrm', { Component: RRMSetupSuccessSubtleNotification, priority: 10, From 64e66e5d37bad384e7c23fdeb5d73263946d7444 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 10:20:13 +0800 Subject: [PATCH 04/59] Remove direct rendering of RRM Setup CTA banner. --- assets/js/components/DashboardMainApp.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/assets/js/components/DashboardMainApp.js b/assets/js/components/DashboardMainApp.js index ce4aa3a1757..007a28fe437 100644 --- a/assets/js/components/DashboardMainApp.js +++ b/assets/js/components/DashboardMainApp.js @@ -46,7 +46,6 @@ import { AudienceSegmentationSetupCTAWidget, AudienceSelectionPanel, } from '../modules/analytics-4/components/audience-segmentation/dashboard'; -import ReaderRevenueManagerSetupCTABanner from '../modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner'; import EntitySearchInput from './EntitySearchInput'; import DateRangeSelector from './DateRangeSelector'; import HelpMenu from './help/HelpMenu'; @@ -88,7 +87,6 @@ import { export default function DashboardMainApp() { const audienceSegmentationEnabled = useFeature( 'audienceSegmentation' ); - const readerRevenueManagerEnabled = useFeature( 'rrmModule' ); const [ showSurveyPortal, setShowSurveyPortal ] = useState( false ); @@ -276,14 +274,6 @@ export default function DashboardMainApp() { ) } - { ! viewOnlyDashboard && ( - - { readerRevenueManagerEnabled && ( - - ) } - - ) } - Date: Mon, 23 Dec 2024 10:58:27 +0800 Subject: [PATCH 05/59] Move canActivateModule check to notification registration. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 12 +----------- assets/js/modules/reader-revenue-manager/index.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 762a6b7a90f..faaf982a1aa 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -46,7 +46,6 @@ import { import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; import whenInactive from '../../../../util/when-inactive'; import { withWidgetComponentProps } from '../../../../googlesitekit/widgets/util'; -import { CORE_MODULES } from '../../../../googlesitekit/modules/datastore/constants'; import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants'; import { READER_REVENUE_MANAGER_MODULE_SLUG, @@ -128,16 +127,7 @@ function ReaderRevenueManagerSetupCTABanner( { Widget } ) { const readerRevenueManagerDocumentationURL = 'https://readerrevenue.withgoogle.com'; - const canActivateRRMModule = useSelect( ( select ) => - select( CORE_MODULES ).canActivateModule( - READER_REVENUE_MANAGER_MODULE_SLUG - ) - ); - - const showBanner = - isDismissed === false && - canActivateRRMModule && - dismissedPromptsLoaded === true; + const showBanner = isDismissed === false && dismissedPromptsLoaded === true; useEffect( () => { if ( showBanner ) { diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 8cdb42d944f..8b0b59c5356 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -91,6 +91,17 @@ export const registerNotifications = ( notifications ) => { areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, groupID: NOTIFICATION_GROUPS.SETUP_CTAS, viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + checkRequirements: async ( { resolveSelect } ) => { + const canActivateRRMModule = await resolveSelect( + CORE_MODULES + ).canActivateModule( READER_REVENUE_MANAGER_MODULE_SLUG ); + + if ( canActivateRRMModule ) { + return true; + } + + return false; + }, isDismissible: true, } ); notifications.registerNotification( 'setup-success-notification-rrm', { From 3c2169d035a3ad90a1c9854b77cc57ad5a7bbca5 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 12:35:04 +0800 Subject: [PATCH 06/59] Refactor the RRM Setup CTA Component to use the new notification components. --- .../ReaderRevenueManagerSetupCTABanner.js | 185 ++++++------------ 1 file changed, 59 insertions(+), 126 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index faaf982a1aa..42a643ee826 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -25,19 +25,13 @@ import PropTypes from 'prop-types'; * WordPress dependencies */ import { compose } from '@wordpress/compose'; -import { - createInterpolateElement, - Fragment, - useCallback, - useEffect, -} from '@wordpress/element'; +import { Fragment, useCallback, useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ import { useDispatch, useSelect } from 'googlesitekit-data'; -import { Button } from 'googlesitekit-components'; import { BREAKPOINT_SMALL, BREAKPOINT_TABLET, @@ -51,11 +45,9 @@ import { READER_REVENUE_MANAGER_MODULE_SLUG, READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, } from '../../datastore/constants'; -import { Cell, Grid, Row } from '../../../../material-components'; import SetupSVG from '../../../../../svg/graphics/reader-revenue-manager-setup.svg'; import SetupTabletSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-tablet.svg'; import SetupMobileSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-mobile.svg'; -import Link from '../../../../components/Link'; import { trackEvent, WEEK_IN_SECONDS } from '../../../../util'; import { AdminMenuTooltip, @@ -63,12 +55,14 @@ import { useTooltipState, } from '../../../../components/AdminMenuTooltip'; import useViewContext from '../../../../hooks/useViewContext'; +import NotificationWithSVG from '../../../../googlesitekit/notifications/components/layout/NotificationWithSVG'; +import Description from '../../../../googlesitekit/notifications/components/common/Description'; +import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; +import ActionsCTALinkDismiss from '../../../../googlesitekit/notifications/components/common/ActionsCTALinkDismiss'; -function ReaderRevenueManagerSetupCTABanner( { Widget } ) { +function ReaderRevenueManagerSetupCTABanner( { id, Notification } ) { const viewContext = useViewContext(); const breakpoint = useBreakpoint(); - const isMobileBreakpoint = breakpoint === BREAKPOINT_SMALL; - const isTabletBreakpoint = breakpoint === BREAKPOINT_TABLET; const onSetupActivate = useActivateModuleCallback( READER_REVENUE_MANAGER_MODULE_SLUG @@ -158,121 +152,60 @@ function ReaderRevenueManagerSetupCTABanner( { Widget } ) { ); } - return ( -
- - - - - - - -

- { __( - 'Grow your revenue and deepen reader engagement', - 'google-site-kit' - ) } -

-
-

- { createInterpolateElement( - __( - 'Turn casual visitors into loyal readers and earn more from your content with voluntary contributions, surveys, newsletter sign-ups and reader insight tools. Learn more', - 'google-site-kit' - ), - { - a: ( - - ), - } - ) } -
-
- { __( - '* Support for subscriptions coming soon', - 'google-site-kit' - ) } -

-
+ const getBannerSVG = () => { + if ( breakpoint === BREAKPOINT_SMALL ) { + return SetupMobileSVG; + } -
- - -
-
- { ! isMobileBreakpoint && - ! isTabletBreakpoint && ( - - - - ) } - { isTabletBreakpoint && ( - - - - ) } - { isMobileBreakpoint && ( - - - - ) } -
-
-
-
-
-
-
+ if ( breakpoint === BREAKPOINT_TABLET ) { + return SetupTabletSVG; + } + + return SetupSVG; + }; + + return ( + + Learn more

* Support for subscriptions coming soon', + 'google-site-kit' + ) } + learnMoreLink={ + + } + /> + } + actions={ + + } + SVG={ getBannerSVG() } + /> +
); } From 1a249424e6acae00c4282e70d9867138bb0e70fa Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 12:40:30 +0800 Subject: [PATCH 07/59] Add propTypes and remove HOC. --- .../ReaderRevenueManagerSetupCTABanner.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 42a643ee826..3099b45522d 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -24,7 +24,6 @@ import PropTypes from 'prop-types'; /** * WordPress dependencies */ -import { compose } from '@wordpress/compose'; import { Fragment, useCallback, useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; @@ -38,8 +37,6 @@ import { useBreakpoint, } from '../../../../hooks/useBreakpoint'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; -import whenInactive from '../../../../util/when-inactive'; -import { withWidgetComponentProps } from '../../../../googlesitekit/widgets/util'; import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants'; import { READER_REVENUE_MANAGER_MODULE_SLUG, @@ -60,7 +57,10 @@ import Description from '../../../../googlesitekit/notifications/components/comm import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; import ActionsCTALinkDismiss from '../../../../googlesitekit/notifications/components/common/ActionsCTALinkDismiss'; -function ReaderRevenueManagerSetupCTABanner( { id, Notification } ) { +export default function ReaderRevenueManagerSetupCTABanner( { + id, + Notification, +} ) { const viewContext = useViewContext(); const breakpoint = useBreakpoint(); @@ -210,13 +210,6 @@ function ReaderRevenueManagerSetupCTABanner( { id, Notification } ) { } ReaderRevenueManagerSetupCTABanner.propTypes = { - Widget: PropTypes.elementType.isRequired, - WidgetNull: PropTypes.elementType.isRequired, + id: PropTypes.string, + Notification: PropTypes.elementType, }; - -export default compose( - whenInactive( { - moduleName: READER_REVENUE_MANAGER_MODULE_SLUG, - } ), - withWidgetComponentProps( 'readerRevenueManagerSetupCTABanner' ) -)( ReaderRevenueManagerSetupCTABanner ); From 1bfffcbfe617f2c0ecc81bfcff20fb22688795a8 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 12:41:31 +0800 Subject: [PATCH 08/59] Remove duplicated confirm GA tracking event. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 3099b45522d..2ca9a4d774e 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -68,15 +68,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { READER_REVENUE_MANAGER_MODULE_SLUG ); - const onSetupCallback = useCallback( () => { - trackEvent( - `${ viewContext }_rrm-setup-notification`, - 'confirm_notification' - ).finally( () => { - onSetupActivate(); - } ); - }, [ onSetupActivate, viewContext ] ); - const showTooltip = useShowTooltip( READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ); @@ -195,7 +186,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'Set up Reader Revenue Manager', 'google-site-kit' ) } - onCTAClick={ onSetupCallback } + onCTAClick={ onSetupActivate } dismissLabel={ __( 'Maybe later', 'google-site-kit' ) } onDismiss={ onDismiss } dismissOptions={ { From 5f61c3adf935d71c6522105af9336aee06f047aa Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 13:19:50 +0800 Subject: [PATCH 09/59] Remove redundant dismissal logic and GA tracking view event. --- .../ReaderRevenueManagerSetupCTABanner.js | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 2ca9a4d774e..339f03ab537 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -75,22 +75,12 @@ export default function ReaderRevenueManagerSetupCTABanner( { READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ); - const isDismissed = useSelect( ( select ) => - select( CORE_USER ).isPromptDismissed( - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY - ) - ); - const dismissCount = useSelect( ( select ) => select( CORE_USER ).getPromptDismissCount( READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ) ); - const dismissedPromptsLoaded = useSelect( ( select ) => - select( CORE_USER ).hasFinishedResolution( 'getDismissedPrompts', [] ) - ); - const { dismissPrompt, triggerSurvey } = useDispatch( CORE_USER ); const onDismiss = useCallback( () => { @@ -112,18 +102,9 @@ export default function ReaderRevenueManagerSetupCTABanner( { const readerRevenueManagerDocumentationURL = 'https://readerrevenue.withgoogle.com'; - const showBanner = isDismissed === false && dismissedPromptsLoaded === true; - useEffect( () => { - if ( showBanner ) { - trackEvent( - `${ viewContext }_rrm-setup-notification`, - 'view_notification' - ); - - triggerSurvey( 'view_reader_revenue_manager_cta' ); - } - }, [ showBanner, triggerSurvey, viewContext ] ); + triggerSurvey( 'view_reader_revenue_manager_cta' ); + }, [ triggerSurvey ] ); if ( isTooltipVisible ) { return ( From accf8e20b6835813b16c2b8b112771b0fdcb48e0 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 13:25:48 +0800 Subject: [PATCH 10/59] Remove all common dismissal logic. --- .../ReaderRevenueManagerSetupCTABanner.js | 33 +++---------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 339f03ab537..9816d92f25a 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -24,13 +24,13 @@ import PropTypes from 'prop-types'; /** * WordPress dependencies */ -import { Fragment, useCallback, useEffect } from '@wordpress/element'; +import { Fragment, useEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ -import { useDispatch, useSelect } from 'googlesitekit-data'; +import { useDispatch } from 'googlesitekit-data'; import { BREAKPOINT_SMALL, BREAKPOINT_TABLET, @@ -45,13 +45,11 @@ import { import SetupSVG from '../../../../../svg/graphics/reader-revenue-manager-setup.svg'; import SetupTabletSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-tablet.svg'; import SetupMobileSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-mobile.svg'; -import { trackEvent, WEEK_IN_SECONDS } from '../../../../util'; import { AdminMenuTooltip, useShowTooltip, useTooltipState, } from '../../../../components/AdminMenuTooltip'; -import useViewContext from '../../../../hooks/useViewContext'; import NotificationWithSVG from '../../../../googlesitekit/notifications/components/layout/NotificationWithSVG'; import Description from '../../../../googlesitekit/notifications/components/common/Description'; import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; @@ -61,7 +59,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { id, Notification, } ) { - const viewContext = useViewContext(); const breakpoint = useBreakpoint(); const onSetupActivate = useActivateModuleCallback( @@ -75,29 +72,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ); - const dismissCount = useSelect( ( select ) => - select( CORE_USER ).getPromptDismissCount( - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY - ) - ); - - const { dismissPrompt, triggerSurvey } = useDispatch( CORE_USER ); - - const onDismiss = useCallback( () => { - trackEvent( - `${ viewContext }_rrm-setup-notification`, - 'dismiss_notification' - ).finally( () => { - const expirationInSeconds = - dismissCount < 1 ? 2 * WEEK_IN_SECONDS : 0; - - showTooltip(); - - dismissPrompt( READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, { - expiresInSeconds: expirationInSeconds, - } ); - } ); - }, [ dismissCount, dismissPrompt, showTooltip, viewContext ] ); + const { triggerSurvey } = useDispatch( CORE_USER ); const readerRevenueManagerDocumentationURL = 'https://readerrevenue.withgoogle.com'; @@ -169,7 +144,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { ) } onCTAClick={ onSetupActivate } dismissLabel={ __( 'Maybe later', 'google-site-kit' ) } - onDismiss={ onDismiss } + onDismiss={ showTooltip } dismissOptions={ { skipHidingFromQueue: true, } } From 5aec9ef2a146f827bfc709aab1cfe1d156c4b39e Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 13:35:54 +0800 Subject: [PATCH 11/59] Fix incorrect title. --- .../components/dashboard/ReaderRevenueManagerSetupCTABanner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 9816d92f25a..672b61e1fc4 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -116,7 +116,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { Date: Mon, 23 Dec 2024 18:58:26 +0800 Subject: [PATCH 12/59] Add support to dismiss and redisplay a notification. --- .../notifications/datastore/notifications.js | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 3176e087fc4..634167a5ef4 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -191,6 +191,7 @@ export const actions = { * @param {Object} options Dismiss notification options. * @param {number} [options.expiresInSeconds] Optional. An integer number of seconds for expiry. 0 denotes permanent dismissal. Default 0. * @param {number} [options.skipHidingFromQueue] Optional. A boolean value if notification should not be removed from the queue immediately. + * @param {number} [options.dismissRetries] Optional. An integer number denoting how many times a notification should be shown again on dismissal. * @return {Object} Generator instance. */ dismissNotification: createValidatedAction( @@ -199,14 +200,18 @@ export const actions = { id, 'A notification id is required to dismiss a notification.' ); - const { expiresInSeconds = 0 } = options; + const { expiresInSeconds = 0, dismissRetries = 0 } = options; invariant( Number.isInteger( expiresInSeconds ), 'expiresInSeconds must be an integer.' ); + invariant( + Number.isInteger( dismissRetries ), + 'dismissRetries must be an integer.' + ); }, function* ( id, options = {} ) { - const { expiresInSeconds = 0 } = options; + const { expiresInSeconds = 0, dismissRetries = 0 } = options; const registry = yield commonActions.getRegistry(); if ( ! options.skipHidingFromQueue ) { @@ -226,6 +231,23 @@ export const actions = { return; } + // Use prompts if a notification should be shown again until it + // is dismissed for a certain number of retries. + if ( dismissRetries > 0 ) { + const dismissCount = registry + .select( CORE_USER ) + .getPromptDismissCount( id ); + + const expirationInSeconds = + dismissCount < dismissRetries ? expiresInSeconds : 0; + + return yield commonActions.await( + registry.dispatch( CORE_USER ).dismissPrompt( id, { + expiresInSeconds: expirationInSeconds, + } ) + ); + } + return yield commonActions.await( registry .dispatch( CORE_USER ) From 20cc27edfea8357e239d73b3206e487256463473 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 19:00:21 +0800 Subject: [PATCH 13/59] Check prompts and dismissed items to determine notification dismissal state. --- .../googlesitekit/notifications/datastore/notifications.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 634167a5ef4..f1211b1b124 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -440,7 +440,10 @@ export const selectors = { */ isNotificationDismissed: createRegistrySelector( ( select ) => ( state, id ) => { - return select( CORE_USER ).isItemDismissed( id ); + return ( + select( CORE_USER ).isItemDismissed( id ) || + select( CORE_USER ).isPromptDismissed( id ) + ); } ), }; From 007a69db70df59f47a155fdb58ab6f275de0c3e2 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 19:01:37 +0800 Subject: [PATCH 14/59] Use new notification prompt dismissal in RRM CTA component. --- .../components/dashboard/ReaderRevenueManagerSetupCTABanner.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 672b61e1fc4..1f62b1b66e9 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -54,6 +54,7 @@ import NotificationWithSVG from '../../../../googlesitekit/notifications/compone import Description from '../../../../googlesitekit/notifications/components/common/Description'; import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; import ActionsCTALinkDismiss from '../../../../googlesitekit/notifications/components/common/ActionsCTALinkDismiss'; +import { WEEK_IN_SECONDS } from '../../../../util'; export default function ReaderRevenueManagerSetupCTABanner( { id, @@ -147,7 +148,9 @@ export default function ReaderRevenueManagerSetupCTABanner( { onDismiss={ showTooltip } dismissOptions={ { skipHidingFromQueue: true, + dismissRetries: 1, } } + dismissExpires={ 2 * WEEK_IN_SECONDS } /> } SVG={ getBannerSVG() } From 12ccc055ca75a894116fa196ff7a9d6b90a91fa6 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 19:29:41 +0800 Subject: [PATCH 15/59] Prevent notification from showing after tooltip is rendered. --- .../ReaderRevenueManagerSetupCTABanner.js | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 1f62b1b66e9..169f5e11603 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -30,7 +30,7 @@ import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ -import { useDispatch } from 'googlesitekit-data'; +import { useDispatch, useSelect } from 'googlesitekit-data'; import { BREAKPOINT_SMALL, BREAKPOINT_TABLET, @@ -50,6 +50,7 @@ import { useShowTooltip, useTooltipState, } from '../../../../components/AdminMenuTooltip'; +import { CORE_NOTIFICATIONS } from '../../../../googlesitekit/notifications/datastore/constants'; import NotificationWithSVG from '../../../../googlesitekit/notifications/components/layout/NotificationWithSVG'; import Description from '../../../../googlesitekit/notifications/components/common/Description'; import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; @@ -82,6 +83,14 @@ export default function ReaderRevenueManagerSetupCTABanner( { triggerSurvey( 'view_reader_revenue_manager_cta' ); }, [ triggerSurvey ] ); + // See TODO note below. + const isCTADismissed = useSelect( ( select ) => + select( CORE_NOTIFICATIONS ).isNotificationDismissed( id ) + ); + const dismissedPromptsLoaded = useSelect( ( select ) => + select( CORE_USER ).hasFinishedResolution( 'getDismissedPrompts', [] ) + ); + if ( isTooltipVisible ) { return ( @@ -100,6 +109,15 @@ export default function ReaderRevenueManagerSetupCTABanner( { ); } + // TODO Remove this hack + // We "incorrectly" pass true to the `skipHidingFromQueue` option when dismissing this banner. + // This is because we don't want the component removed from the DOM as we have to still render + // the `AdminMenuTooltip` in this component. This means that we have to rely on manually + // checking for the dismissal state here. + if ( isCTADismissed || ! dismissedPromptsLoaded ) { + return null; + } + const getBannerSVG = () => { if ( breakpoint === BREAKPOINT_SMALL ) { return SetupMobileSVG; From 51fbdb1fac3a8737e740ade7b2eea80f034d5c79 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 23 Dec 2024 20:13:32 +0800 Subject: [PATCH 16/59] Fix styles to match the legacy component. --- .../notifications/components/layout/NotificationWithSVG.js | 5 ++++- .../_googlesitekit-rrm-setup-cta-banner.scss | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js index f35af34fa5b..507168858d9 100644 --- a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js +++ b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js @@ -81,7 +81,10 @@ export default function NotificationWithSVG( { diff --git a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss index 31c02e91ec0..b089a107110 100644 --- a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss +++ b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss @@ -17,7 +17,7 @@ */ .googlesitekit-plugin { - .googlesitekit-reader-revenue-manager-setup-cta-widget { + .googlesitekit-setup-cta-banner--rrm-setup-notification { .googlesitekit-setup-cta-banner__primary-cell { padding: $grid-gap-desktop - 4 $grid-gap-phone 0; @@ -66,7 +66,7 @@ } } - .googlesitekit-setup-cta-banner__svg-wrapper { + .googlesitekit-setup-cta-banner__svg-wrapper--rrm-setup-notification { svg { flex: 1; From 48a16cd870f261fc08fcb30c2e5bef2438025d8b Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 01:39:36 +0800 Subject: [PATCH 17/59] Add the dismissRetries option to notification registration. --- .../googlesitekit/notifications/datastore/notifications.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index f1211b1b124..51ab8c29bdc 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -64,10 +64,11 @@ export const actions = { * @param {WPComponent} [settings.Component] React component used to display the contents of this notification. * @param {number} [settings.priority] Notification's priority for ordering (lower number is higher priority, like WordPress hooks). Ideally in increments of 10. Default 10. * @param {string} [settings.areaSlug] The slug of the area where the notification should be rendered, e.g. notification-area-banners-above-nav. - * @param {string} [settings.groupID] The ID of the group of notifications that should be rendered in their own individual queue. + * @param {string} [settings.groupID] Optional. The ID of the group of notifications that should be rendered in their own individual queue. * @param {Array.} [settings.viewContexts] Array of Site Kit contexts, e.g. VIEW_CONTEXT_MAIN_DASHBOARD. * @param {Function} [settings.checkRequirements] Optional. Callback function to determine if the notification should be queued. - * @param {boolean} [settings.isDismissible] Flag to check if the notification should be queued and is not dismissed. + * @param {boolean} [settings.isDismissible] Optional. Flag to check if the notification should be queued and is not dismissed. + * @param {number} [settings.dismissRetries] Optional. An integer number denoting how many times a notification should be shown again on dismissal. * @return {Object} Redux-style action. */ registerNotification( @@ -80,6 +81,7 @@ export const actions = { viewContexts, checkRequirements, isDismissible, + dismissRetries, } ) { invariant( @@ -117,6 +119,7 @@ export const actions = { viewContexts, checkRequirements, isDismissible, + dismissRetries, }, }, type: REGISTER_NOTIFICATION, From d10597fe956f562a84bb723f3d024c7295f88f4f Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 02:44:48 +0800 Subject: [PATCH 18/59] Use dismissRetries property from notification property instead of passing itto the action. --- .../notifications/datastore/notifications.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 51ab8c29bdc..44876dde792 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -194,7 +194,6 @@ export const actions = { * @param {Object} options Dismiss notification options. * @param {number} [options.expiresInSeconds] Optional. An integer number of seconds for expiry. 0 denotes permanent dismissal. Default 0. * @param {number} [options.skipHidingFromQueue] Optional. A boolean value if notification should not be removed from the queue immediately. - * @param {number} [options.dismissRetries] Optional. An integer number denoting how many times a notification should be shown again on dismissal. * @return {Object} Generator instance. */ dismissNotification: createValidatedAction( @@ -203,18 +202,14 @@ export const actions = { id, 'A notification id is required to dismiss a notification.' ); - const { expiresInSeconds = 0, dismissRetries = 0 } = options; + const { expiresInSeconds = 0 } = options; invariant( Number.isInteger( expiresInSeconds ), 'expiresInSeconds must be an integer.' ); - invariant( - Number.isInteger( dismissRetries ), - 'dismissRetries must be an integer.' - ); }, function* ( id, options = {} ) { - const { expiresInSeconds = 0, dismissRetries = 0 } = options; + const { expiresInSeconds = 0 } = options; const registry = yield commonActions.getRegistry(); if ( ! options.skipHidingFromQueue ) { @@ -236,13 +231,15 @@ export const actions = { // Use prompts if a notification should be shown again until it // is dismissed for a certain number of retries. - if ( dismissRetries > 0 ) { + if ( notification.dismissRetries > 0 ) { const dismissCount = registry .select( CORE_USER ) .getPromptDismissCount( id ); const expirationInSeconds = - dismissCount < dismissRetries ? expiresInSeconds : 0; + dismissCount < notification.dismissRetries + ? expiresInSeconds + : 0; return yield commonActions.await( registry.dispatch( CORE_USER ).dismissPrompt( id, { From 7c12db9b7cb15d98aecc1864d171182584dfbef9 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 02:51:42 +0800 Subject: [PATCH 19/59] Move dismissRetries for RRM setup banner from react component to notification registration. --- .../components/dashboard/ReaderRevenueManagerSetupCTABanner.js | 1 - assets/js/modules/reader-revenue-manager/index.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 169f5e11603..6870defd9f3 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -166,7 +166,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { onDismiss={ showTooltip } dismissOptions={ { skipHidingFromQueue: true, - dismissRetries: 1, } } dismissExpires={ 2 * WEEK_IN_SECONDS } /> diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 8b0b59c5356..264d6a85823 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -103,6 +103,7 @@ export const registerNotifications = ( notifications ) => { return false; }, isDismissible: true, + dismissRetries: 1, } ); notifications.registerNotification( 'setup-success-notification-rrm', { Component: RRMSetupSuccessSubtleNotification, From 91eed680023c1bb851869eee8c8a62faec130ac7 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 03:10:46 +0800 Subject: [PATCH 20/59] Only check for prompts if dismissRetries exists as a property. --- .../notifications/datastore/notifications.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 44876dde792..8f89020a7b9 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -440,10 +440,14 @@ export const selectors = { */ isNotificationDismissed: createRegistrySelector( ( select ) => ( state, id ) => { - return ( - select( CORE_USER ).isItemDismissed( id ) || - select( CORE_USER ).isPromptDismissed( id ) - ); + const notification = + select( CORE_NOTIFICATIONS ).getNotification( id ); + + if ( notification.dismissRetries > 0 ) { + return select( CORE_USER ).isPromptDismissed( id ); + } + + return select( CORE_USER ).isItemDismissed( id ); } ), }; From 7465e6909a36066ff207ef46aaf67f0b140bf81b Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 04:14:39 +0800 Subject: [PATCH 21/59] Add a default value to dismissExpires to prevent undefined checks. --- .../js/googlesitekit/notifications/datastore/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 8f89020a7b9..3c91a8e763c 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -81,7 +81,7 @@ export const actions = { viewContexts, checkRequirements, isDismissible, - dismissRetries, + dismissRetries = 0, } ) { invariant( From 010e78b3dc8f46a40e9f6e05cd2eacf077ca9bd2 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 04:15:10 +0800 Subject: [PATCH 22/59] Improve notification dismissed selecter docs. --- .../js/googlesitekit/notifications/datastore/notifications.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 3c91a8e763c..2e42653205a 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -429,8 +429,8 @@ export const selectors = { /** * Determines whether a notification is dismissed or not. * - * Currently, this selector simply forwards the call to the dismissed items API. - * We can potentially add more notification-specific logic here in the future. + * If the notification should appear again for a certain number of times after dismissal, + * then we store them as prompts. So we check for dismissed prompts instead of dismissed items. * * @since 1.132.0 * From 1570baece2a79551a388da6dae9ccd0413aa1665 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 04:15:56 +0800 Subject: [PATCH 23/59] Add a selector to fetch if a notification is on its final retry. --- .../notifications/datastore/notifications.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 2e42653205a..61f2ec5e007 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -450,6 +450,36 @@ export const selectors = { return select( CORE_USER ).isItemDismissed( id ); } ), + /** + * Determines whether a notification that can reappear again for a fixed number of times + * on dismissal is at its final appearance. + * + * @since n.e.x.t + * + * @param {Object} state Data store's state. + * @param {string} id Notification id. + * @return {(boolean|undefined)} TRUE if notification is on its final retry, otherwise FALSE, `undefined` if not resolved yet. + */ + isNotificationRetryFinal: createRegistrySelector( + ( select ) => ( state, id ) => { + const notification = + select( CORE_NOTIFICATIONS ).getNotification( id ); + + // If a notification does not have retries, it always will be on its final render. + if ( notification.dismissRetries === 0 ) { + return true; + } + + const dismissCount = + select( CORE_USER ).getPromptDismissCount( id ); + + if ( dismissCount >= notification.dismissRetries ) { + return true; + } + + return false; + } + ), }; export default { From 2775ad54b8e338795b5b7a9ec201706e09dfd0c1 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 04:16:41 +0800 Subject: [PATCH 24/59] Add support for multiple dismiss labels. --- .../components/common/ActionsCTALinkDismiss.js | 2 ++ .../notifications/components/common/Dismiss.js | 9 +++++++-- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 9 ++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js b/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js index 0cc4c2e66ee..07721f54bcd 100644 --- a/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js +++ b/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js @@ -34,6 +34,7 @@ export default function ActionsCTALinkDismiss( { ctaLabel, onCTAClick, onDismiss = () => {}, + dismissLabelInitial, dismissLabel = __( 'OK, Got it!', 'google-site-kit' ), dismissExpires = 0, dismissOptions = {}, @@ -57,6 +58,7 @@ export default function ActionsCTALinkDismiss( { + select( CORE_NOTIFICATIONS ).isNotificationRetryFinal( id ) + ); + const handleDismiss = async ( event ) => { await onDismiss?.( event ); trackEvents.dismiss( @@ -67,7 +72,7 @@ export default function Dismiss( { onClick={ handleDismiss } disabled={ disabled } > - { dismissLabel } + { isDismissalFinal ? dismissLabel : dismissLabelInitial } ); } diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 6870defd9f3..9cba9a099eb 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -162,7 +162,14 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'google-site-kit' ) } onCTAClick={ onSetupActivate } - dismissLabel={ __( 'Maybe later', 'google-site-kit' ) } + dismissLabelInitial={ __( + 'Maybe later', + 'google-site-kit' + ) } + dismissLabel={ __( + 'Don’t show again', + 'google-site-kit' + ) } onDismiss={ showTooltip } dismissOptions={ { skipHidingFromQueue: true, From e4c4f28102059521265016d2bf817dfcd78830b4 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Tue, 24 Dec 2024 04:42:39 +0800 Subject: [PATCH 25/59] Fix undefined map select errors. --- .../notifications/datastore/notifications.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 61f2ec5e007..2f0e5b020eb 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -443,6 +443,10 @@ export const selectors = { const notification = select( CORE_NOTIFICATIONS ).getNotification( id ); + if ( notification === undefined ) { + return undefined; + } + if ( notification.dismissRetries > 0 ) { return select( CORE_USER ).isPromptDismissed( id ); } @@ -465,6 +469,10 @@ export const selectors = { const notification = select( CORE_NOTIFICATIONS ).getNotification( id ); + if ( notification === undefined ) { + return undefined; + } + // If a notification does not have retries, it always will be on its final render. if ( notification.dismissRetries === 0 ) { return true; From cec66b7c983f5324642716f79b25438ff00a9e5b Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 26 Dec 2024 17:59:35 +0800 Subject: [PATCH 26/59] Move multiple dismiss labels out of common component. --- .../components/common/ActionsCTALinkDismiss.js | 2 -- .../notifications/components/common/Dismiss.js | 9 ++------- .../ReaderRevenueManagerSetupCTABanner.js | 17 +++++++++-------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js b/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js index 07721f54bcd..0cc4c2e66ee 100644 --- a/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js +++ b/assets/js/googlesitekit/notifications/components/common/ActionsCTALinkDismiss.js @@ -34,7 +34,6 @@ export default function ActionsCTALinkDismiss( { ctaLabel, onCTAClick, onDismiss = () => {}, - dismissLabelInitial, dismissLabel = __( 'OK, Got it!', 'google-site-kit' ), dismissExpires = 0, dismissOptions = {}, @@ -58,7 +57,6 @@ export default function ActionsCTALinkDismiss( { - select( CORE_NOTIFICATIONS ).isNotificationRetryFinal( id ) - ); - const handleDismiss = async ( event ) => { await onDismiss?.( event ); trackEvents.dismiss( @@ -72,7 +67,7 @@ export default function Dismiss( { onClick={ handleDismiss } disabled={ disabled } > - { isDismissalFinal ? dismissLabel : dismissLabelInitial } + { dismissLabel } ); } diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 9cba9a099eb..a9175a11b0d 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -83,6 +83,10 @@ export default function ReaderRevenueManagerSetupCTABanner( { triggerSurvey( 'view_reader_revenue_manager_cta' ); }, [ triggerSurvey ] ); + const isDismissalFinal = useSelect( ( select ) => + select( CORE_NOTIFICATIONS ).isNotificationRetryFinal( id ) + ); + // See TODO note below. const isCTADismissed = useSelect( ( select ) => select( CORE_NOTIFICATIONS ).isNotificationDismissed( id ) @@ -162,14 +166,11 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'google-site-kit' ) } onCTAClick={ onSetupActivate } - dismissLabelInitial={ __( - 'Maybe later', - 'google-site-kit' - ) } - dismissLabel={ __( - 'Don’t show again', - 'google-site-kit' - ) } + dismissLabel={ + isDismissalFinal + ? __( 'Don’t show again', 'google-site-kit' ) + : __( 'Maybe later', 'google-site-kit' ) + } onDismiss={ showTooltip } dismissOptions={ { skipHidingFromQueue: true, From af84a830b4af792d79a07806054f6d9e76aa62ca Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 26 Dec 2024 18:22:10 +0800 Subject: [PATCH 27/59] Refactor breakpoint SVG rendering for RRM banner. --- .../ReaderRevenueManagerSetupCTABanner.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index a9175a11b0d..13f05d1151d 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -122,16 +122,9 @@ export default function ReaderRevenueManagerSetupCTABanner( { return null; } - const getBannerSVG = () => { - if ( breakpoint === BREAKPOINT_SMALL ) { - return SetupMobileSVG; - } - - if ( breakpoint === BREAKPOINT_TABLET ) { - return SetupTabletSVG; - } - - return SetupSVG; + const breakpointSVGMap = { + [ BREAKPOINT_SMALL ]: SetupMobileSVG, + [ BREAKPOINT_TABLET ]: SetupTabletSVG, }; return ( @@ -178,7 +171,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { dismissExpires={ 2 * WEEK_IN_SECONDS } /> } - SVG={ getBannerSVG() } + SVG={ breakpointSVGMap[ breakpoint ] || SetupSVG } /> ); From a0a4c64b183662eb1406a0a1ae3a2d85e536ddca Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 26 Dec 2024 18:22:29 +0800 Subject: [PATCH 28/59] Refactor breakpoint SVG rendering for FPM banner. --- .../notifications/FirstPartyModeSetupBanner.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/assets/js/components/notifications/FirstPartyModeSetupBanner.js b/assets/js/components/notifications/FirstPartyModeSetupBanner.js index 8b8d2e5bbb9..ade9ce64500 100644 --- a/assets/js/components/notifications/FirstPartyModeSetupBanner.js +++ b/assets/js/components/notifications/FirstPartyModeSetupBanner.js @@ -116,16 +116,9 @@ export default function FirstPartyModeSetupBanner( { id, Notification } ) { return null; } - const getBannerSVG = () => { - if ( breakpoint === BREAKPOINT_SMALL ) { - return FPMSetupCTASVGMobile; - } - - if ( breakpoint === BREAKPOINT_TABLET ) { - return FPMSetupCTASVGTablet; - } - - return FPMSetupCTASVGDesktop; + const breakpointSVGMap = { + [ BREAKPOINT_SMALL ]: FPMSetupCTASVGMobile, + [ BREAKPOINT_TABLET ]: FPMSetupCTASVGTablet, }; return ( @@ -167,7 +160,7 @@ export default function FirstPartyModeSetupBanner( { id, Notification } ) { } } /> } - SVG={ getBannerSVG() } + SVG={ breakpointSVGMap[ breakpoint ] || FPMSetupCTASVGDesktop } /> ); From 3d2b8f300ef2ee6b0b6d858febcca6e9be239b72 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 26 Dec 2024 19:13:11 +0800 Subject: [PATCH 29/59] Rename selector. --- .../js/googlesitekit/notifications/datastore/notifications.js | 2 +- .../components/dashboard/ReaderRevenueManagerSetupCTABanner.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 2f0e5b020eb..a85210210fc 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -464,7 +464,7 @@ export const selectors = { * @param {string} id Notification id. * @return {(boolean|undefined)} TRUE if notification is on its final retry, otherwise FALSE, `undefined` if not resolved yet. */ - isNotificationRetryFinal: createRegistrySelector( + isNotificationDismissalFinal: createRegistrySelector( ( select ) => ( state, id ) => { const notification = select( CORE_NOTIFICATIONS ).getNotification( id ); diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 13f05d1151d..b1ba0ee0024 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -84,7 +84,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { }, [ triggerSurvey ] ); const isDismissalFinal = useSelect( ( select ) => - select( CORE_NOTIFICATIONS ).isNotificationRetryFinal( id ) + select( CORE_NOTIFICATIONS ).isNotificationDismissalFinal( id ) ); // See TODO note below. From 80bd3d5f5bcd6380570dbd140105d02c75265ed2 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 26 Dec 2024 19:46:28 +0800 Subject: [PATCH 30/59] Check if notification isDismissible before checking number of retries. --- .../googlesitekit/notifications/datastore/notifications.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index a85210210fc..5a2b25ac283 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -473,6 +473,11 @@ export const selectors = { return undefined; } + invariant( + notification.isDismissible, + 'Notification should be dismissible to check if a notification is on its final dismissal.' + ); + // If a notification does not have retries, it always will be on its final render. if ( notification.dismissRetries === 0 ) { return true; From a17cb06cf5bad79eef7cbd8c1530d84486bc95a0 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Sat, 28 Dec 2024 14:32:00 +0800 Subject: [PATCH 31/59] Provide FPM notification data for isDismissed check. --- .../js/modules/analytics-4/datastore/settings.test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/assets/js/modules/analytics-4/datastore/settings.test.js b/assets/js/modules/analytics-4/datastore/settings.test.js index 7a1d8d665a7..359002743e3 100644 --- a/assets/js/modules/analytics-4/datastore/settings.test.js +++ b/assets/js/modules/analytics-4/datastore/settings.test.js @@ -518,6 +518,17 @@ describe( 'modules/analytics-4 settings', () => { FPM_SETUP_CTA_BANNER_NOTIFICATION, ] ); + provideNotifications( + registry, + { + [ FPM_SETUP_CTA_BANNER_NOTIFICATION ]: + DEFAULT_NOTIFICATIONS[ + FPM_SETUP_CTA_BANNER_NOTIFICATION + ], + }, + { overwrite: true } + ); + const validSettings = { accountID: fixtures.createProperty._accountID, propertyID: fixtures.createProperty._id, From 06b4c4758a5afd93528fd1a6087dcc690df1376b Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Sat, 28 Dec 2024 14:44:41 +0800 Subject: [PATCH 32/59] Provide FPM Notification data for isDismissed check in Ads settings. --- assets/js/modules/ads/datastore/settings.test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/assets/js/modules/ads/datastore/settings.test.js b/assets/js/modules/ads/datastore/settings.test.js index 0596b514cbb..fd6ae6fafaa 100644 --- a/assets/js/modules/ads/datastore/settings.test.js +++ b/assets/js/modules/ads/datastore/settings.test.js @@ -106,6 +106,17 @@ describe( 'modules/ads settings', () => { FPM_SETUP_CTA_BANNER_NOTIFICATION, ] ); + provideNotifications( + registry, + { + [ FPM_SETUP_CTA_BANNER_NOTIFICATION ]: + DEFAULT_NOTIFICATIONS[ + FPM_SETUP_CTA_BANNER_NOTIFICATION + ], + }, + { overwrite: true } + ); + fetchMock.postOnce( settingsEndpoint, ( url, opts ) => ( { body: JSON.parse( opts.body )?.data, status: 200, From 45015c35c8085aa3c0211fcca9e1683aea6b5234 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Sat, 28 Dec 2024 15:24:15 +0800 Subject: [PATCH 33/59] Separate out section of tests for isNotificationDismissed using dismissedItems. --- .../datastore/notifications.test.js | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.test.js b/assets/js/googlesitekit/notifications/datastore/notifications.test.js index 5834c641977..29bc5850ffc 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.test.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.test.js @@ -21,6 +21,7 @@ */ import { createTestRegistry, + provideNotifications, untilResolved, } from '../../../../../tests/js/utils'; import { render } from '../../../../../tests/js/test-utils'; @@ -576,30 +577,47 @@ describe( 'core/notifications Notifications', () => { } ); describe( 'isNotificationDismissed', () => { - let isNotificationDismissed; - beforeEach( () => { - ( { isNotificationDismissed } = - registry.select( CORE_NOTIFICATIONS ) ); - } ); + describe( 'when using dismissed items', () => { + let isNotificationDismissed; + beforeEach( () => { + // Register the Gathering Data Notification as a test + provideNotifications( registry ); - it( 'should return undefined if getDismissedItems selector is not resolved yet', async () => { - fetchMock.getOnce( fetchGetDismissedItems, { body: [] } ); - expect( isNotificationDismissed( 'foo' ) ).toBeUndefined(); - await untilResolved( registry, CORE_USER ).getDismissedItems(); - } ); + ( { isNotificationDismissed } = + registry.select( CORE_NOTIFICATIONS ) ); + } ); - it( 'should return TRUE if the notification is dismissed', () => { - registry - .dispatch( CORE_USER ) - .receiveGetDismissedItems( [ 'foo', 'bar' ] ); - expect( isNotificationDismissed( 'foo' ) ).toBe( true ); - } ); + it( 'should return undefined if getDismissedItems selector is not resolved yet', async () => { + fetchMock.getOnce( fetchGetDismissedItems, { body: [] } ); + expect( + isNotificationDismissed( 'gathering-data-notification' ) + ).toBeUndefined(); + await untilResolved( + registry, + CORE_USER + ).getDismissedItems(); + } ); - it( 'should return FALSE if the notification is not dismissed', () => { - registry - .dispatch( CORE_USER ) - .receiveGetDismissedItems( [ 'foo', 'bar' ] ); - expect( isNotificationDismissed( 'baz' ) ).toBe( false ); + it( 'should return TRUE if the notification is dismissed', () => { + registry + .dispatch( CORE_USER ) + .receiveGetDismissedItems( [ + 'gathering-data-notification', + 'some-other-notification', + ] ); + expect( + isNotificationDismissed( 'gathering-data-notification' ) + ).toBe( true ); + } ); + + it( 'should return FALSE if the notification is not dismissed', () => { + registry + .dispatch( CORE_USER ) + .receiveGetDismissedItems( [ 'foo', 'bar' ] ); + expect( + isNotificationDismissed( 'gathering-data-notification' ) + ).toBe( false ); + } ); } ); } ); } ); From 42f8b1b9c92e2fc763296c22174857300961a230 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Sat, 28 Dec 2024 16:24:08 +0800 Subject: [PATCH 34/59] Add tests for the isItemDismissed selector when using prompts. --- .../datastore/notifications.test.js | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.test.js b/assets/js/googlesitekit/notifications/datastore/notifications.test.js index 29bc5850ffc..7bb56a94a01 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.test.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.test.js @@ -43,6 +43,9 @@ describe( 'core/notifications Notifications', () => { const fetchDismissItem = new RegExp( '^/google-site-kit/v1/core/user/data/dismiss-item' ); + const fetchGetDismissedPrompts = new RegExp( + '^/google-site-kit/v1/core/user/data/dismissed-prompts' + ); let registry; let store; @@ -619,6 +622,64 @@ describe( 'core/notifications Notifications', () => { ).toBe( false ); } ); } ); + describe( 'when using dismissed prompts', () => { + let isNotificationDismissed; + beforeEach( () => { + provideNotifications( registry, { + 'test-notification-using-prompts': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + priority: 11, + checkRequirements: () => true, + isDismissible: false, + dismissRetries: 1, + }, + } ); + + ( { isNotificationDismissed } = + registry.select( CORE_NOTIFICATIONS ) ); + } ); + + it( 'should return undefined if getDismissedPrompts selector is not resolved yet', async () => { + fetchMock.getOnce( fetchGetDismissedPrompts, { body: [] } ); + expect( + isNotificationDismissed( + 'test-notification-using-prompts' + ) + ).toBeUndefined(); + await untilResolved( + registry, + CORE_USER + ).getDismissedPrompts(); + } ); + + it( 'should return TRUE if the notification is dismissed', () => { + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { + 'test-notification-using-prompts': { + expires: 0, + count: 1, + }, + 'some-other-notification': { expires: 0, count: 2 }, + } ); + expect( + isNotificationDismissed( + 'test-notification-using-prompts' + ) + ).toBe( true ); + } ); + + it( 'should return FALSE if the notification is not dismissed', () => { + registry + .dispatch( CORE_USER ) + .receiveGetDismissedPrompts( [ 'foo', 'bar' ] ); + expect( + isNotificationDismissed( + 'test-notification-using-prompts' + ) + ).toBe( false ); + } ); + } ); } ); } ); } ); From 9217fed29683366edb97304b881fc917aef34364 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 2 Jan 2025 17:53:10 +0000 Subject: [PATCH 35/59] Update rendering of RRM notification component in JS tests. --- ...ReaderRevenueManagerSetupCTABanner.test.js | 54 +++++-------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 29af046eac3..429f8a6375f 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -34,7 +34,7 @@ import { waitFor, provideUserAuthentication, } from '../../../../../../tests/js/test-utils'; -import { getWidgetComponentProps } from '../../../../googlesitekit/widgets/util'; +import { withNotificationComponentProps } from '../../../../googlesitekit/notifications/util/component-props'; import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants'; import { CORE_MODULES } from '../../../../googlesitekit/modules/datastore/constants'; import { @@ -60,9 +60,10 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { let registry; let activateModuleMock; - const { Widget, WidgetNull } = getWidgetComponentProps( - 'readerRevenueManagerSetupCTABanner' - ); + const ReaderRevenueManagerSetupCTABannerComponent = + withNotificationComponentProps( 'rrm-setup-notification' )( + ReaderRevenueManagerSetupCTABanner + ); beforeEach( () => { mockTrackEvent.mockClear(); @@ -91,10 +92,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { mockSurveyEndpoints(); const { getByText, waitForRegistry } = render( - , + , { registry, viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, @@ -121,10 +119,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { }, } ); const { container, waitForRegistry } = render( - , + , { registry, viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, @@ -147,10 +142,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ); const { container, getByRole, waitForRegistry } = render( - , + , { registry, viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, @@ -202,10 +194,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { Settings
- + , , { registry, @@ -254,10 +243,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ] ); const { container, waitForRegistry } = render( - , + , { registry, viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, @@ -276,10 +262,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { .startResolution( 'getDismissedPrompts', [] ); const { container, waitForRegistry } = render( - , + , { registry, } @@ -313,10 +296,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { Settings - + , , { registry, @@ -382,10 +362,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { Settings - + , , { registry, @@ -419,10 +396,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { mockSurveyEndpoints(); const { waitForRegistry } = render( - , + , { registry, viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, From f6ac09f5e3b7048f960ff5026b1aa07759476777 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 2 Jan 2025 17:57:32 +0000 Subject: [PATCH 36/59] Remove redundant trackEvent tests for RRM setup notification. --- ...ReaderRevenueManagerSetupCTABanner.test.js | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 429f8a6375f..bc49ee76d2b 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -43,7 +43,6 @@ import { READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, } from '../../datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../../../googlesitekit/constants'; -import * as tracking from '../../../../util/tracking'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; import { WEEK_IN_SECONDS } from '../../../../util'; import { @@ -51,9 +50,6 @@ import { surveyTriggerEndpoint, } from '../../../../../../tests/js/mock-survey-endpoints'; -const mockTrackEvent = jest.spyOn( tracking, 'trackEvent' ); -mockTrackEvent.mockImplementation( () => Promise.resolve() ); - jest.mock( '../../../../hooks/useActivateModuleCallback' ); describe( 'ReaderRevenueManagerSetupCTABanner', () => { @@ -66,7 +62,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ); beforeEach( () => { - mockTrackEvent.mockClear(); registry = createTestRegistry(); activateModuleMock = jest.fn( () => jest.fn() ); @@ -101,11 +96,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { await waitForRegistry(); - expect( mockTrackEvent ).toHaveBeenCalledWith( - `${ VIEW_CONTEXT_MAIN_DASHBOARD }_rrm-setup-notification`, - 'view_notification' - ); - expect( getByText( /Grow your revenue and deepen reader engagement/ ) ).toBeInTheDocument(); @@ -129,7 +119,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { await waitForRegistry(); expect( container ).toBeEmptyDOMElement(); - expect( mockTrackEvent ).not.toHaveBeenCalled(); } ); it( 'should call the "useActivateModuleCallback" hook when the setup CTA is clicked', async () => { @@ -160,18 +149,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ); expect( activateModuleMock ).toHaveBeenCalledTimes( 1 ); - - expect( mockTrackEvent ).toHaveBeenNthCalledWith( - 1, - `${ VIEW_CONTEXT_MAIN_DASHBOARD }_rrm-setup-notification`, - 'view_notification' - ); - - expect( mockTrackEvent ).toHaveBeenNthCalledWith( - 2, - `${ VIEW_CONTEXT_MAIN_DASHBOARD }_rrm-setup-notification`, - 'confirm_notification' - ); } ); it( 'should call the dismiss item endpoint when the banner is dismissed', async () => { @@ -211,18 +188,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { // 3 fetches: 1 for the survey trigger, 1 for the survey timeout, 1 for the dismiss prompt. expect( fetchMock ).toHaveFetchedTimes( 3 ); - - expect( mockTrackEvent ).toHaveBeenNthCalledWith( - 1, - `${ VIEW_CONTEXT_MAIN_DASHBOARD }_rrm-setup-notification`, - 'view_notification' - ); - - expect( mockTrackEvent ).toHaveBeenNthCalledWith( - 2, - `${ VIEW_CONTEXT_MAIN_DASHBOARD }_rrm-setup-notification`, - 'dismiss_notification' - ); } ); it( 'should not render the Reader Revenue Manager setup CTA banner when the module requirements do not meet', async () => { @@ -253,7 +218,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { await waitForRegistry(); expect( container ).toBeEmptyDOMElement(); - expect( mockTrackEvent ).not.toHaveBeenCalled(); } ); it( 'should not render the banner when the dismissed prompts selector is not resolved', async () => { From fa4d52d42104de28a68a32a97043eb5163d9ea77 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 2 Jan 2025 18:00:46 +0000 Subject: [PATCH 37/59] Update test description. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index bc49ee76d2b..9dd12edc8af 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -83,7 +83,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { useActivateModuleCallback.mockImplementation( activateModuleMock ); } ); - it( 'should render the Reader Revenue Manager setup CTA banner when not dismissed', async () => { + it( 'should render the Reader Revenue Manager setup CTA banner', async () => { mockSurveyEndpoints(); const { getByText, waitForRegistry } = render( From ac4fe55eae00adfea2c4a215ddd7f5a2ea175424 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 2 Jan 2025 18:39:17 +0000 Subject: [PATCH 38/59] Refactor RRM notification registration to use an object of notifications for easier testing. --- .../modules/reader-revenue-manager/index.js | 110 +++++++++--------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 264d6a85823..51fd2d19f70 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -83,66 +83,70 @@ export const registerModule = ( modules ) => { } ); }; -export const registerNotifications = ( notifications ) => { - if ( isFeatureEnabled( 'rrmModule' ) ) { - notifications.registerNotification( 'rrm-setup-notification', { - Component: ReaderRevenueManagerSetupCTABanner, - priority: 50, - areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, - groupID: NOTIFICATION_GROUPS.SETUP_CTAS, - viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], - checkRequirements: async ( { resolveSelect } ) => { - const canActivateRRMModule = await resolveSelect( - CORE_MODULES - ).canActivateModule( READER_REVENUE_MANAGER_MODULE_SLUG ); +export const NOTIFICATIONS = { + 'rrm-setup-notification': { + Component: ReaderRevenueManagerSetupCTABanner, + priority: 50, + areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, + groupID: NOTIFICATION_GROUPS.SETUP_CTAS, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + checkRequirements: async ( { resolveSelect } ) => { + const canActivateRRMModule = await resolveSelect( + CORE_MODULES + ).canActivateModule( READER_REVENUE_MANAGER_MODULE_SLUG ); - if ( canActivateRRMModule ) { - return true; - } + if ( canActivateRRMModule ) { + return true; + } + return false; + }, + isDismissible: true, + dismissRetries: 1, + }, + 'setup-success-notification-rrm': { + Component: RRMSetupSuccessSubtleNotification, + priority: 10, + areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + checkRequirements: async ( { select, resolveSelect } ) => { + const rrmConnected = await resolveSelect( + CORE_MODULES + ).isModuleConnected( READER_REVENUE_MANAGER_MODULE_SLUG ); + + if ( ! rrmConnected ) { return false; - }, - isDismissible: true, - dismissRetries: 1, - } ); - notifications.registerNotification( 'setup-success-notification-rrm', { - Component: RRMSetupSuccessSubtleNotification, - priority: 10, - areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, - viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], - checkRequirements: async ( { select, resolveSelect } ) => { - const rrmConnected = await resolveSelect( - CORE_MODULES - ).isModuleConnected( READER_REVENUE_MANAGER_MODULE_SLUG ); + } - if ( ! rrmConnected ) { - return false; - } + const notification = getQueryArg( location.href, 'notification' ); + const slug = getQueryArg( location.href, 'slug' ); - const notification = getQueryArg( - location.href, - 'notification' - ); - const slug = getQueryArg( location.href, 'slug' ); + await resolveSelect( MODULES_READER_REVENUE_MANAGER ).getSettings(); + const publicationOnboardingState = await select( + MODULES_READER_REVENUE_MANAGER + ).getPublicationOnboardingState(); - await resolveSelect( - MODULES_READER_REVENUE_MANAGER - ).getSettings(); - const publicationOnboardingState = await select( - MODULES_READER_REVENUE_MANAGER - ).getPublicationOnboardingState(); + if ( + notification === 'authentication_success' && + slug === READER_REVENUE_MANAGER_MODULE_SLUG && + publicationOnboardingState !== undefined + ) { + return true; + } - if ( - notification === 'authentication_success' && - slug === READER_REVENUE_MANAGER_MODULE_SLUG && - publicationOnboardingState !== undefined - ) { - return true; - } + return false; + }, + isDismissible: false, + }, +}; - return false; - }, - isDismissible: false, - } ); +export const registerNotifications = ( notificationsAPI ) => { + if ( isFeatureEnabled( 'rrmModule' ) ) { + for ( const notificationID in NOTIFICATIONS ) { + notificationsAPI.registerNotification( + notificationID, + NOTIFICATIONS[ notificationID ] + ); + } } }; From dd8277f31160d3f07771655b9ec94a14d778ae37 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 2 Jan 2025 18:42:21 +0000 Subject: [PATCH 39/59] Fix onCTAClick test. --- ...ReaderRevenueManagerSetupCTABanner.test.js | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 9dd12edc8af..dd082a65156 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -49,6 +49,8 @@ import { mockSurveyEndpoints, surveyTriggerEndpoint, } from '../../../../../../tests/js/mock-survey-endpoints'; +import { CORE_NOTIFICATIONS } from '../../../../googlesitekit/notifications/datastore/constants'; +import { NOTIFICATIONS } from '../..'; jest.mock( '../../../../hooks/useActivateModuleCallback' ); @@ -61,6 +63,8 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ReaderRevenueManagerSetupCTABanner ); + const notification = NOTIFICATIONS[ 'rrm-setup-notification' ]; + beforeEach( () => { registry = createTestRegistry(); activateModuleMock = jest.fn( () => jest.fn() ); @@ -80,6 +84,10 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { }, ] ); + registry + .dispatch( CORE_NOTIFICATIONS ) + .registerNotification( 'rrm-setup-notification', notification ); + useActivateModuleCallback.mockImplementation( activateModuleMock ); } ); @@ -124,6 +132,14 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { it( 'should call the "useActivateModuleCallback" hook when the setup CTA is clicked', async () => { mockSurveyEndpoints(); + fetchMock.postOnce( + RegExp( '^/google-site-kit/v1/core/user/data/dismiss-prompt' ), + { + body: JSON.stringify( [ 'rrm-setup-notification' ] ), + status: 200, + } + ); + registry .dispatch( CORE_MODULES ) .receiveCheckRequirementsSuccess( @@ -142,11 +158,14 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { expect( container ).not.toBeEmptyDOMElement(); - fireEvent.click( - getByRole( 'button', { - name: /Set up Reader Revenue Manager/i, - } ) - ); + // eslint-disable-next-line require-await + await act( async () => { + fireEvent.click( + getByRole( 'button', { + name: /Set up Reader Revenue Manager/i, + } ) + ); + } ); expect( activateModuleMock ).toHaveBeenCalledTimes( 1 ); } ); From 0d2376893df9b616f38a78e153a1e3ca02da9b4d Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 10:59:32 +0000 Subject: [PATCH 40/59] Prevent triggering survey when component is not rendered. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index b1ba0ee0024..8f48245b9b3 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -79,10 +79,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { const readerRevenueManagerDocumentationURL = 'https://readerrevenue.withgoogle.com'; - useEffect( () => { - triggerSurvey( 'view_reader_revenue_manager_cta' ); - }, [ triggerSurvey ] ); - const isDismissalFinal = useSelect( ( select ) => select( CORE_NOTIFICATIONS ).isNotificationDismissalFinal( id ) ); @@ -94,6 +90,13 @@ export default function ReaderRevenueManagerSetupCTABanner( { const dismissedPromptsLoaded = useSelect( ( select ) => select( CORE_USER ).hasFinishedResolution( 'getDismissedPrompts', [] ) ); + const hideCTABanner = isCTADismissed || ! dismissedPromptsLoaded; + + useEffect( () => { + if ( ! hideCTABanner ) { + triggerSurvey( 'view_reader_revenue_manager_cta' ); + } + }, [ hideCTABanner, triggerSurvey ] ); if ( isTooltipVisible ) { return ( @@ -118,7 +121,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { // This is because we don't want the component removed from the DOM as we have to still render // the `AdminMenuTooltip` in this component. This means that we have to rely on manually // checking for the dismissal state here. - if ( isCTADismissed || ! dismissedPromptsLoaded ) { + if ( hideCTABanner ) { return null; } From 523073e0c3044aba8ff21b8743c0e38149e0fb5c Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 11:00:12 +0000 Subject: [PATCH 41/59] Fix all remaining tests for the RRM setup banner component. --- ...ReaderRevenueManagerSetupCTABanner.test.js | 120 +++++++++--------- 1 file changed, 63 insertions(+), 57 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index dd082a65156..29983e53979 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -109,26 +109,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ).toBeInTheDocument(); } ); - it( 'should not render the Reader Revenue Manager setup CTA banner when dismissed', async () => { - registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { - expires: Date.now() / 1000 + WEEK_IN_SECONDS, - count: 1, - }, - } ); - const { container, waitForRegistry } = render( - , - { - registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, - } - ); - - await waitForRegistry(); - - expect( container ).toBeEmptyDOMElement(); - } ); - it( 'should call the "useActivateModuleCallback" hook when the setup CTA is clicked', async () => { mockSurveyEndpoints(); @@ -209,23 +189,36 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { expect( fetchMock ).toHaveFetchedTimes( 3 ); } ); - it( 'should not render the Reader Revenue Manager setup CTA banner when the module requirements do not meet', async () => { - // Throw error from checkRequirements to simulate non-HTTPS site error. - provideModules( registry, [ + it( 'should trigger a survey when the banner is displayed', async () => { + mockSurveyEndpoints(); + + const { waitForRegistry } = render( + , { - slug: READER_REVENUE_MANAGER_MODULE_SLUG, - active: false, - checkRequirements: () => { - throw { - code: ERROR_CODE_NON_HTTPS_SITE, - message: - 'The site should use HTTPS to set up Reader Revenue Manager', - data: null, - }; + registry, + viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, + } + ); + + await waitForRegistry(); + + // The survey trigger endpoint should be called with the correct trigger ID. + await waitFor( () => + expect( fetchMock ).toHaveFetched( surveyTriggerEndpoint, { + body: { + data: { triggerID: 'view_reader_revenue_manager_cta' }, }, - }, - ] ); + } ) + ); + } ); + it( 'should not render the Reader Revenue Manager setup CTA banner when dismissed', async () => { + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { + 'rrm-setup-notification': { + expires: Date.now() / 1000 + WEEK_IN_SECONDS, + count: 1, + }, + } ); const { container, waitForRegistry } = render( , { @@ -263,8 +256,8 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { RegExp( '^/google-site-kit/v1/core/user/data/dismiss-prompt' ), { body: { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { - expires: 2 * WEEK_IN_SECONDS, // Expiry of 0 permanently dismisses the prompt. + 'rrm-setup-notification': { + expires: 2 * WEEK_IN_SECONDS, count: 1, }, }, @@ -300,7 +293,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { expect( fetchMock ).toHaveFetched( dismissPromptEndpoint, { body: { data: { - slug: READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, + slug: 'rrm-setup-notification', expiration: WEEK_IN_SECONDS * 2, }, }, @@ -322,7 +315,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { RegExp( '^/google-site-kit/v1/core/user/data/dismiss-prompt' ), { body: { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { + 'rrm-setup-notification': { expires: 0, // Expiry of 0 permanently dismisses the prompt. count: 2, }, @@ -332,7 +325,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { ); registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { + 'rrm-setup-notification': { expires: Date.now() / 1000 - 2 * WEEK_IN_SECONDS + 1, count: 1, }, @@ -366,7 +359,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { expect( fetchMock ).toHaveFetched( dismissPromptEndpoint, { body: { data: { - slug: READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, + slug: 'rrm-setup-notification', expiration: 0, }, }, @@ -375,26 +368,39 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { } ); } ); - it( 'should trigger a survey when the banner is displayed', async () => { - mockSurveyEndpoints(); - - const { waitForRegistry } = render( - , - { + describe( 'checkRequirements', () => { + it( 'is active when all required conditions are met', async () => { + const isActive = await notification.checkRequirements( registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, - } - ); + VIEW_CONTEXT_MAIN_DASHBOARD + ); - await waitForRegistry(); + expect( isActive ).toBe( true ); + } ); - // The survey trigger endpoint should be called with the correct trigger ID. - await waitFor( () => - expect( fetchMock ).toHaveFetched( surveyTriggerEndpoint, { - body: { - data: { triggerID: 'view_reader_revenue_manager_cta' }, + it( 'is not active when the module requirements do not meet', async () => { + // Throw error from checkRequirements to simulate non-HTTPS site error. + provideModules( registry, [ + { + slug: READER_REVENUE_MANAGER_MODULE_SLUG, + active: false, + checkRequirements: () => { + throw { + code: ERROR_CODE_NON_HTTPS_SITE, + message: + 'The site should use HTTPS to set up Reader Revenue Manager', + data: null, + }; + }, }, - } ) - ); + ] ); + + const isActive = await notification.checkRequirements( + registry, + VIEW_CONTEXT_MAIN_DASHBOARD + ); + + expect( isActive ).toBe( false ); + } ); } ); } ); From 1d99a463368e1badf818e19e353000e1dd1657db Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 11:03:54 +0000 Subject: [PATCH 42/59] Remove unnecessary use of view context when rendering the setup component. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.test.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 29983e53979..3a510dddb11 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -98,7 +98,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { , { registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, } ); @@ -130,7 +129,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { , { registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, } ); @@ -174,7 +172,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { , { registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, } ); @@ -196,7 +193,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { , { registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, } ); @@ -223,7 +219,6 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { , { registry, - viewContext: VIEW_CONTEXT_MAIN_DASHBOARD, } ); From 0fe3b7d8ad1b28521abd24355e0231b779026d9e Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 11:20:09 +0000 Subject: [PATCH 43/59] Update dismissed key to use notification ID. --- .../ReaderRevenueManagerSetupCTABanner.js | 17 ++++------------- .../ReaderRevenueManagerSetupCTABanner.test.js | 5 +---- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 8f48245b9b3..8b214bf9888 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -38,10 +38,7 @@ import { } from '../../../../hooks/useBreakpoint'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants'; -import { - READER_REVENUE_MANAGER_MODULE_SLUG, - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, -} from '../../datastore/constants'; +import { READER_REVENUE_MANAGER_MODULE_SLUG } from '../../datastore/constants'; import SetupSVG from '../../../../../svg/graphics/reader-revenue-manager-setup.svg'; import SetupTabletSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-tablet.svg'; import SetupMobileSVG from '../../../../../svg/graphics/reader-revenue-manager-setup-mobile.svg'; @@ -67,12 +64,8 @@ export default function ReaderRevenueManagerSetupCTABanner( { READER_REVENUE_MANAGER_MODULE_SLUG ); - const showTooltip = useShowTooltip( - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY - ); - const { isTooltipVisible } = useTooltipState( - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY - ); + const showTooltip = useShowTooltip( id ); + const { isTooltipVisible } = useTooltipState( id ); const { triggerSurvey } = useDispatch( CORE_USER ); @@ -108,9 +101,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'google-site-kit' ) } dismissLabel={ __( 'Got it', 'google-site-kit' ) } - tooltipStateKey={ - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY - } + tooltipStateKey={ id } />
); diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 3a510dddb11..2fc4fdda445 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -40,7 +40,6 @@ import { CORE_MODULES } from '../../../../googlesitekit/modules/datastore/consta import { ERROR_CODE_NON_HTTPS_SITE, READER_REVENUE_MANAGER_MODULE_SLUG, - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, } from '../../datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../../../googlesitekit/constants'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; @@ -154,9 +153,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { fetchMock.postOnce( RegExp( '^/google-site-kit/v1/core/user/data/dismiss-prompt' ), { - body: JSON.stringify( [ - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, - ] ), + body: 'rrm-setup-notification', status: 200, } ); From 99f56bcbd529a79cc29fd808d0dfdaaa2c5ab07e Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 11:20:59 +0000 Subject: [PATCH 44/59] Update storybook. --- ...derRevenueManagerSetupCTABanner.stories.js | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.stories.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.stories.js index e7762125eba..b6ebf1c5ebd 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.stories.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.stories.js @@ -25,22 +25,19 @@ import fetchMock from 'fetch-mock'; * Internal dependencies */ import { provideModules } from '../../../../../../tests/js/utils'; -import { withWidgetComponentProps } from '../../../../googlesitekit/widgets/util'; +import { withNotificationComponentProps } from '../../../../googlesitekit/notifications/util/component-props'; import WithRegistrySetup from '../../../../../../tests/js/WithRegistrySetup'; import ReaderRevenueManagerSetupCTABanner from './ReaderRevenueManagerSetupCTABanner'; -import { - READER_REVENUE_MANAGER_MODULE_SLUG, - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, -} from '../../datastore/constants'; +import { READER_REVENUE_MANAGER_MODULE_SLUG } from '../../datastore/constants'; import { CORE_USER } from '../../../../googlesitekit/datastore/user/constants'; import { WEEK_IN_SECONDS } from '../../../../util'; -const WidgetWithComponentProps = withWidgetComponentProps( - 'readerRevenueManagerSetupCTABanner' +const NotificationWithComponentProps = withNotificationComponentProps( + 'rrm-setup-notification' )( ReaderRevenueManagerSetupCTABanner ); function Template() { - return ; + return ; } export const Default = Template.bind( {} ); @@ -60,6 +57,10 @@ export default { ] ); registry.dispatch( CORE_USER ).receiveGetDismissedItems( [] ); + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( [] ); + registry + .dispatch( CORE_USER ) + .finishResolution( 'getDismissedPrompts', [] ); fetchMock.postOnce( new RegExp( @@ -67,12 +68,10 @@ export default { ), { body: { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: - { - expires: - Date.now() / 1000 + WEEK_IN_SECONDS, - count: 1, - }, + 'rrm-setup-notification': { + expires: Date.now() / 1000 + WEEK_IN_SECONDS, + count: 1, + }, }, status: 200, } From 49527b54e8cb6a534969bd2bf2241c6199ace0c0 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Fri, 3 Jan 2025 11:22:57 +0000 Subject: [PATCH 45/59] Fix JSON response in test. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 2fc4fdda445..3d229897077 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -153,7 +153,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { fetchMock.postOnce( RegExp( '^/google-site-kit/v1/core/user/data/dismiss-prompt' ), { - body: 'rrm-setup-notification', + body: JSON.stringify( [ 'rrm-setup-notification' ] ), status: 200, } ); From 1af899dd2f021576d4cec7b9aeed26afb8aaf2dd Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Sun, 5 Jan 2025 23:42:14 +0000 Subject: [PATCH 46/59] Revert adding common setup banner svg wrapper styles. --- .../notifications/components/layout/NotificationWithSVG.js | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js index 507168858d9..db6c749c712 100644 --- a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js +++ b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js @@ -82,7 +82,6 @@ export default function NotificationWithSVG( { Date: Mon, 6 Jan 2025 00:08:13 +0000 Subject: [PATCH 47/59] Duplicate Setup CTA styles for SVG wrapper just for RMM module. --- .../_googlesitekit-rrm-setup-cta-banner.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss index b089a107110..152316d06ce 100644 --- a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss +++ b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss @@ -67,6 +67,12 @@ } .googlesitekit-setup-cta-banner__svg-wrapper--rrm-setup-notification { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + overflow: hidden; + position: relative; svg { flex: 1; @@ -75,12 +81,16 @@ // Increase the SVG size via scale in order to achieve the desired clipping effect // in conjunction with the parent's overflow: hidden. scale: 1; + transform-origin: center 2px; @media (min-width: $bp-nonTablet) { + height: 100%; max-height: 272px; + position: absolute; right: 70px; scale: 1.6; top: 10px; + transform-origin: initial; width: 65%; } From 72de7b0f415f2cc0b43238f8c35eb9ef50cd5fbe Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Mon, 6 Jan 2025 01:02:23 +0000 Subject: [PATCH 48/59] Revert description to be exactly same as before. --- .../ReaderRevenueManagerSetupCTABanner.js | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 8b214bf9888..9d606f29a49 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -24,7 +24,11 @@ import PropTypes from 'prop-types'; /** * WordPress dependencies */ -import { Fragment, useEffect } from '@wordpress/element'; +import { + createInterpolateElement, + Fragment, + useEffect, +} from '@wordpress/element'; import { __ } from '@wordpress/i18n'; /** @@ -49,7 +53,6 @@ import { } from '../../../../components/AdminMenuTooltip'; import { CORE_NOTIFICATIONS } from '../../../../googlesitekit/notifications/datastore/constants'; import NotificationWithSVG from '../../../../googlesitekit/notifications/components/layout/NotificationWithSVG'; -import Description from '../../../../googlesitekit/notifications/components/common/Description'; import LearnMoreLink from '../../../../googlesitekit/notifications/components/common/LearnMoreLink'; import ActionsCTALinkDismiss from '../../../../googlesitekit/notifications/components/common/ActionsCTALinkDismiss'; import { WEEK_IN_SECONDS } from '../../../../util'; @@ -130,19 +133,37 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'google-site-kit' ) } description={ - Learn more

* Support for subscriptions coming soon', - 'google-site-kit' - ) } - learnMoreLink={ - - } - /> +
+

+ { ' ' } + { createInterpolateElement( + __( + 'Turn casual visitors into loyal readers and earn more from your content with voluntary contributions, surveys, newsletter sign-ups and reader insight tools. Learn more', + 'google-site-kit' + ), + { + a: ( + + ), + } + ) } +
+
+ { __( + '* Support for subscriptions coming soon', + 'google-site-kit' + ) } +

+
} actions={ Date: Thu, 9 Jan 2025 14:05:14 +0000 Subject: [PATCH 49/59] Prevent RRM notification if it was dismissed before refactoring. --- assets/js/modules/reader-revenue-manager/index.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 51fd2d19f70..c5c3f3a4581 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -30,6 +30,7 @@ import { MODULES_READER_REVENUE_MANAGER, ERROR_CODE_NON_HTTPS_SITE, READER_REVENUE_MANAGER_MODULE_SLUG, + READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, } from './datastore/constants'; import { SetupMain } from './components/setup'; import { SettingsEdit, SettingsView } from './components/settings'; @@ -46,6 +47,7 @@ import { import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../googlesitekit/constants'; import { CORE_MODULES } from '../../googlesitekit/modules/datastore/constants'; import { isFeatureEnabled } from '../../features'; +import { CORE_USER } from '../../googlesitekit/datastore/user/constants'; export { registerStore } from './datastore'; @@ -90,12 +92,19 @@ export const NOTIFICATIONS = { areaSlug: NOTIFICATION_AREAS.BANNERS_BELOW_NAV, groupID: NOTIFICATION_GROUPS.SETUP_CTAS, viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], - checkRequirements: async ( { resolveSelect } ) => { + checkRequirements: async ( { select, resolveSelect } ) => { + // Check if the prompt with the legacy key used before the banner was refactored + // to use the `notification ID` as the dismissal key, is dismissed. + await resolveSelect( CORE_USER ).getDismissedPrompts(); + const isDismissed = select( CORE_USER ).isPromptDismissed( + READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY + ); + const canActivateRRMModule = await resolveSelect( CORE_MODULES ).canActivateModule( READER_REVENUE_MANAGER_MODULE_SLUG ); - if ( canActivateRRMModule ) { + if ( isDismissed === false && canActivateRRMModule ) { return true; } From aefd8e06fd7ecc4fb4759ba0f6fb8846a6e8e898 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 14:13:45 +0000 Subject: [PATCH 50/59] Inline variable. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index 9d606f29a49..d9abf517db3 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -72,9 +72,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { const { triggerSurvey } = useDispatch( CORE_USER ); - const readerRevenueManagerDocumentationURL = - 'https://readerrevenue.withgoogle.com'; - const isDismissalFinal = useSelect( ( select ) => select( CORE_NOTIFICATIONS ).isNotificationDismissalFinal( id ) ); @@ -149,9 +146,7 @@ export default function ReaderRevenueManagerSetupCTABanner( { 'Learn more', 'google-site-kit' ) } - url={ - readerRevenueManagerDocumentationURL - } + url="https://readerrevenue.withgoogle.com" /> ), } From f1ca9bf6f81e44d7d10fe41e47578b7e42fd8284 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 14:15:17 +0000 Subject: [PATCH 51/59] Remove unnecessary white space before description. --- .../components/dashboard/ReaderRevenueManagerSetupCTABanner.js | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js index d9abf517db3..24f0fec2b64 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.js @@ -132,7 +132,6 @@ export default function ReaderRevenueManagerSetupCTABanner( { description={

- { ' ' } { createInterpolateElement( __( 'Turn casual visitors into loyal readers and earn more from your content with voluntary contributions, surveys, newsletter sign-ups and reader insight tools. Learn more', From 1e1afa44f3af4d77179f39343748af0d793e6218 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 14:25:41 +0000 Subject: [PATCH 52/59] Standardise RRM banner heading. --- .../_googlesitekit-rrm-setup-cta-banner.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss index 152316d06ce..0ae15e30c8c 100644 --- a/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss +++ b/assets/sass/components/reader-revenue-manager/_googlesitekit-rrm-setup-cta-banner.scss @@ -27,10 +27,6 @@ } .googlesitekit-setup-cta-banner__title { - @media (min-width: $width-tablet + 1 + px) { - font-weight: $fw-medium; - } - @media (min-width: $bp-nonMobile) { font-size: $fs-headline-sm; line-height: $lh-headline-sm; From 00b207ac15b1f67ceb11448d7cddffc5b432f0fa Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 16:15:04 +0000 Subject: [PATCH 53/59] Remove unnecessary className change. --- .../notifications/components/layout/NotificationWithSVG.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js index db6c749c712..f35af34fa5b 100644 --- a/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js +++ b/assets/js/googlesitekit/notifications/components/layout/NotificationWithSVG.js @@ -81,9 +81,7 @@ export default function NotificationWithSVG( { From 56b727d701fcf25234adaf3a21244ac30f883cf8 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 16:16:55 +0000 Subject: [PATCH 54/59] Add default values in documentation. --- .../js/googlesitekit/notifications/datastore/notifications.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.js b/assets/js/googlesitekit/notifications/datastore/notifications.js index 5a2b25ac283..53a7a3d7ea5 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.js @@ -64,11 +64,11 @@ export const actions = { * @param {WPComponent} [settings.Component] React component used to display the contents of this notification. * @param {number} [settings.priority] Notification's priority for ordering (lower number is higher priority, like WordPress hooks). Ideally in increments of 10. Default 10. * @param {string} [settings.areaSlug] The slug of the area where the notification should be rendered, e.g. notification-area-banners-above-nav. - * @param {string} [settings.groupID] Optional. The ID of the group of notifications that should be rendered in their own individual queue. + * @param {string} [settings.groupID] Optional. The ID of the group of notifications that should be rendered in their own individual queue. Default 'default'. * @param {Array.} [settings.viewContexts] Array of Site Kit contexts, e.g. VIEW_CONTEXT_MAIN_DASHBOARD. * @param {Function} [settings.checkRequirements] Optional. Callback function to determine if the notification should be queued. * @param {boolean} [settings.isDismissible] Optional. Flag to check if the notification should be queued and is not dismissed. - * @param {number} [settings.dismissRetries] Optional. An integer number denoting how many times a notification should be shown again on dismissal. + * @param {number} [settings.dismissRetries] Optional. An integer number denoting how many times a notification should be shown again on dismissal. Default 0. * @return {Object} Redux-style action. */ registerNotification( From 2de7739b6c2e554745653231a70c1f8676c48bfe Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 20:44:21 +0000 Subject: [PATCH 55/59] Add unit tests for isNotificationDismissalFinal selector. --- .../datastore/notifications.test.js | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/assets/js/googlesitekit/notifications/datastore/notifications.test.js b/assets/js/googlesitekit/notifications/datastore/notifications.test.js index 7bb56a94a01..15ea9c54590 100644 --- a/assets/js/googlesitekit/notifications/datastore/notifications.test.js +++ b/assets/js/googlesitekit/notifications/datastore/notifications.test.js @@ -681,5 +681,115 @@ describe( 'core/notifications Notifications', () => { } ); } ); } ); + + describe( 'isNotificationDismissalFinal', () => { + let isNotificationDismissalFinal; + beforeEach( () => { + ( { isNotificationDismissalFinal } = + registry.select( CORE_NOTIFICATIONS ) ); + } ); + + it( 'should return undefined if notification is undefined', () => { + expect( + isNotificationDismissalFinal( 'test-notification' ) + ).toBeUndefined(); + } ); + + it( 'requires notification to be dismissible', () => { + provideNotifications( registry, { + 'test-notification': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + dismissRetries: 1, + }, + } ); + + expect( () => + isNotificationDismissalFinal( 'test-notification' ) + ).toThrow( + 'Notification should be dismissible to check if a notification is on its final dismissal.' + ); + } ); + + it( 'returns true if notification does not have retries', () => { + provideNotifications( registry, { + 'test-notification': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + isDismissible: true, + }, + } ); + + expect( + isNotificationDismissalFinal( 'test-notification' ) + ).toBe( true ); + } ); + + it( 'returns true if notification is on the final retry', () => { + provideNotifications( registry, { + 'test-notification': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + isDismissible: true, + dismissRetries: 2, + }, + } ); + + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { + 'test-notification': { + expires: 0, + count: 2, + }, + 'some-other-notification': { expires: 0, count: 2 }, + } ); + + expect( + isNotificationDismissalFinal( 'test-notification' ) + ).toBe( true ); + } ); + + it( 'returns false if notification has never been dismissed', () => { + provideNotifications( registry, { + 'test-notification': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + isDismissible: true, + dismissRetries: 1, + }, + } ); + + expect( + isNotificationDismissalFinal( 'test-notification' ) + ).toBe( false ); + } ); + + it( 'returns false if notification is not on the final retry', () => { + provideNotifications( registry, { + 'test-notification': { + Component: () => {}, + areaSlug: NOTIFICATION_AREAS.BANNERS_ABOVE_NAV, + viewContexts: [ VIEW_CONTEXT_MAIN_DASHBOARD ], + isDismissible: true, + dismissRetries: 2, + }, + } ); + + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { + 'test-notification': { + expires: 0, + count: 1, + }, + 'some-other-notification': { expires: 0, count: 2 }, + } ); + + expect( + isNotificationDismissalFinal( 'test-notification' ) + ).toBe( false ); + } ); + } ); } ); } ); From 8f1a8edfd496c31318b717962aef986e70458cd5 Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 20:52:41 +0000 Subject: [PATCH 56/59] Add test for legacy dismissal key check. --- .../ReaderRevenueManagerSetupCTABanner.test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 3d229897077..739d5ac0fc2 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -40,6 +40,7 @@ import { CORE_MODULES } from '../../../../googlesitekit/modules/datastore/consta import { ERROR_CODE_NON_HTTPS_SITE, READER_REVENUE_MANAGER_MODULE_SLUG, + READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, } from '../../datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../../../googlesitekit/constants'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; @@ -370,6 +371,22 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { expect( isActive ).toBe( true ); } ); + it( 'is not active when the banner was dismissed with the legacy dismissal key', async () => { + registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { + [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { + expires: Date.now() / 1000 + WEEK_IN_SECONDS, + count: 1, + }, + } ); + + const isActive = await notification.checkRequirements( + registry, + VIEW_CONTEXT_MAIN_DASHBOARD + ); + + expect( isActive ).toBe( false ); + } ); + it( 'is not active when the module requirements do not meet', async () => { // Throw error from checkRequirements to simulate non-HTTPS site error. provideModules( registry, [ From 2606b6afcb389b0f5d6ced2cc0c6a66e11100f6f Mon Sep 17 00:00:00 2001 From: Jimmy Madon Date: Thu, 9 Jan 2025 21:37:10 +0000 Subject: [PATCH 57/59] Update VRTs to standardise banner title font weight. --- ...pCTABanner_Default_0_document_1_medium.png | Bin 49028 -> 48476 bytes ...upCTABanner_Default_0_document_2_large.png | Bin 61863 -> 61695 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/backstop/reference/google-site-kit_Modules_ReaderRevenueManager_Components_Dashboard_ReaderRevenueManagerSetupCTABanner_Default_0_document_1_medium.png b/tests/backstop/reference/google-site-kit_Modules_ReaderRevenueManager_Components_Dashboard_ReaderRevenueManagerSetupCTABanner_Default_0_document_1_medium.png index d39805a31ffaecd6af407bbb7bf98cc131cf4680..e87f595c887777dfae40eb21bb911f663e281d78 100644 GIT binary patch literal 48476 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 literal 49028 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 MnWbsn9gpY#57?BiPyhe` diff --git a/tests/backstop/reference/google-site-kit_Modules_ReaderRevenueManager_Components_Dashboard_ReaderRevenueManagerSetupCTABanner_Default_0_document_2_large.png b/tests/backstop/reference/google-site-kit_Modules_ReaderRevenueManager_Components_Dashboard_ReaderRevenueManagerSetupCTABanner_Default_0_document_2_large.png index a8eefcd253038f0ac613a21246acdcfb12c4da0a..985a1ba2e98cd2a5ef860ebbc5855ce0f8bfb1ea 100644 GIT binary patch literal 61695 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 QVEZAqmi894hfc=-7d`dE761SM literal 61863 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 From 0889c1b6f4a6eae143537b7b7dfe71f57cac7541 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 10 Jan 2025 17:35:20 -0500 Subject: [PATCH 58/59] Rename RRM dismissal key to be legacy. --- .../dashboard/ReaderRevenueManagerSetupCTABanner.test.js | 4 ++-- .../js/modules/reader-revenue-manager/datastore/constants.js | 2 +- assets/js/modules/reader-revenue-manager/index.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js index 739d5ac0fc2..d5d38cdec47 100644 --- a/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js +++ b/assets/js/modules/reader-revenue-manager/components/dashboard/ReaderRevenueManagerSetupCTABanner.test.js @@ -40,7 +40,7 @@ import { CORE_MODULES } from '../../../../googlesitekit/modules/datastore/consta import { ERROR_CODE_NON_HTTPS_SITE, READER_REVENUE_MANAGER_MODULE_SLUG, - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, + LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY, } from '../../datastore/constants'; import { VIEW_CONTEXT_MAIN_DASHBOARD } from '../../../../googlesitekit/constants'; import useActivateModuleCallback from '../../../../hooks/useActivateModuleCallback'; @@ -373,7 +373,7 @@ describe( 'ReaderRevenueManagerSetupCTABanner', () => { it( 'is not active when the banner was dismissed with the legacy dismissal key', async () => { registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( { - [ READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY ]: { + [ LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY ]: { expires: Date.now() / 1000 + WEEK_IN_SECONDS, count: 1, }, diff --git a/assets/js/modules/reader-revenue-manager/datastore/constants.js b/assets/js/modules/reader-revenue-manager/datastore/constants.js index c4a26d18919..c8a034972ec 100644 --- a/assets/js/modules/reader-revenue-manager/datastore/constants.js +++ b/assets/js/modules/reader-revenue-manager/datastore/constants.js @@ -32,7 +32,7 @@ export const PUBLICATION_ONBOARDING_STATES = { export const UI_KEY_READER_REVENUE_MANAGER_SHOW_PUBLICATION_APPROVED_NOTIFICATION = 'READER_REVENUE_MANAGER_SHOW_PUBLICATION_APPROVED_NOTIFICATION'; -export const READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY = +export const LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY = 'rrm_module_setup_banner_dismissed_key'; export const READER_REVENUE_MANAGER_SETUP_FORM = diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index c5c3f3a4581..15d3c7a1af2 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -30,7 +30,7 @@ import { MODULES_READER_REVENUE_MANAGER, ERROR_CODE_NON_HTTPS_SITE, READER_REVENUE_MANAGER_MODULE_SLUG, - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY, + LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY, } from './datastore/constants'; import { SetupMain } from './components/setup'; import { SettingsEdit, SettingsView } from './components/settings'; @@ -97,7 +97,7 @@ export const NOTIFICATIONS = { // to use the `notification ID` as the dismissal key, is dismissed. await resolveSelect( CORE_USER ).getDismissedPrompts(); const isDismissed = select( CORE_USER ).isPromptDismissed( - READER_REVENUE_MANAGER_SETUP_BANNER_DISMISSED_KEY + LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY ); const canActivateRRMModule = await resolveSelect( From c2172eead8bd9ae4e4256291594055a3c702c378 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 10 Jan 2025 17:41:30 -0500 Subject: [PATCH 59/59] Simplify setup notification check requirements. --- assets/js/modules/reader-revenue-manager/index.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/assets/js/modules/reader-revenue-manager/index.js b/assets/js/modules/reader-revenue-manager/index.js index 15d3c7a1af2..993f97a02f6 100644 --- a/assets/js/modules/reader-revenue-manager/index.js +++ b/assets/js/modules/reader-revenue-manager/index.js @@ -96,19 +96,17 @@ export const NOTIFICATIONS = { // Check if the prompt with the legacy key used before the banner was refactored // to use the `notification ID` as the dismissal key, is dismissed. await resolveSelect( CORE_USER ).getDismissedPrompts(); - const isDismissed = select( CORE_USER ).isPromptDismissed( + const isLegacyDismissed = select( CORE_USER ).isPromptDismissed( LEGACY_RRM_SETUP_BANNER_DISMISSED_KEY ); - const canActivateRRMModule = await resolveSelect( - CORE_MODULES - ).canActivateModule( READER_REVENUE_MANAGER_MODULE_SLUG ); - - if ( isDismissed === false && canActivateRRMModule ) { - return true; + if ( isLegacyDismissed ) { + return false; } - return false; + return await resolveSelect( CORE_MODULES ).canActivateModule( + READER_REVENUE_MANAGER_MODULE_SLUG + ); }, isDismissible: true, dismissRetries: 1,