diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/AddGroupNotice.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/AddGroupNotice.js
index 2c1679f26dd..5efb537fe2a 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/AddGroupNotice.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/AddGroupNotice.js
@@ -24,7 +24,7 @@ import PropTypes from 'prop-types';
/**
* WordPress dependencies
*/
-import { useCallback } from '@wordpress/element';
+import { useState, useCallback, useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
/**
@@ -33,24 +33,35 @@ import { __ } from '@wordpress/i18n';
import { useSelect, useDispatch } from 'googlesitekit-data';
import {
AUDIENCE_ADD_GROUP_NOTICE_SLUG,
- AUDIENCE_SELECTION_CHANGED,
+ AUDIENCE_SELECTED,
AUDIENCE_SELECTION_FORM,
+ AUDIENCE_SELECTION_PANEL_OPENED_KEY,
} from './constants';
import { CORE_FORMS } from '../../../../../../googlesitekit/datastore/forms/constants';
import { CORE_USER } from '../../../../../../googlesitekit/datastore/user/constants';
import InfoIcon from '../../../../../../../svg/icons/info-circle.svg';
import InfoNotice from '../InfoNotice';
+import { CORE_UI } from '../../../../../../googlesitekit/datastore/ui/constants';
+import { MODULES_ANALYTICS_4 } from '../../../../datastore/constants';
+
+export default function AddGroupNotice() {
+ const [ twoOrMoreAudiencesSelected, setTwoOrMoreAudiencesSelected ] =
+ useState( false );
-export default function AddGroupNotice( { savedItemSlugs = [] } ) {
const isDismissed = useSelect( ( select ) =>
select( CORE_USER ).isItemDismissed( AUDIENCE_ADD_GROUP_NOTICE_SLUG )
);
- const selectionChanged = useSelect(
- ( select ) =>
- select( CORE_FORMS ).getValue(
- AUDIENCE_SELECTION_FORM,
- AUDIENCE_SELECTION_CHANGED
- ) || false
+ const isSelectionPanelOpen = useSelect( ( select ) =>
+ select( CORE_UI ).getValue( AUDIENCE_SELECTION_PANEL_OPENED_KEY )
+ );
+ const isLoading = useSelect( ( select ) =>
+ select( MODULES_ANALYTICS_4 ).isFetchingSyncAvailableAudiences()
+ );
+ const selectedAudiences = useSelect( ( select ) =>
+ select( CORE_FORMS ).getValue(
+ AUDIENCE_SELECTION_FORM,
+ AUDIENCE_SELECTED
+ )
);
const { dismissItem } = useDispatch( CORE_USER );
@@ -59,7 +70,38 @@ export default function AddGroupNotice( { savedItemSlugs = [] } ) {
await dismissItem( AUDIENCE_ADD_GROUP_NOTICE_SLUG );
}, [ dismissItem ] );
- if ( isDismissed || savedItemSlugs.length !== 1 || selectionChanged ) {
+ useEffect( () => {
+ if ( ! Array.isArray( selectedAudiences ) ) {
+ return;
+ }
+
+ if ( selectedAudiences.length > 1 ) {
+ setTwoOrMoreAudiencesSelected( true );
+ }
+
+ // If selected items changed to only 1 or less selected audiences
+ // reset the value. Otherwise `twoOrMoreAudiencesSelected` always remains `true`.
+ // We are checking if selection panel is closed to do that, so notice is not re-surfaced
+ // while selection panel is still open.
+ if ( ! isSelectionPanelOpen && selectedAudiences?.length === 1 ) {
+ setTwoOrMoreAudiencesSelected( false );
+ }
+ }, [
+ selectedAudiences,
+ isSelectionPanelOpen,
+ setTwoOrMoreAudiencesSelected,
+ ] );
+
+ if (
+ // Do not render the notice if the slection panel is dismissed.
+ isDismissed ||
+ // Has two or more audiences selected.
+ twoOrMoreAudiencesSelected ||
+ // Items are showing as preview blocks - re-syncing is still in progress.
+ isLoading ||
+ // There is no audience selected.
+ ! selectedAudiences?.length
+ ) {
return null;
}
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.js
index 70d28de939b..2260ec57d62 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.js
@@ -91,7 +91,7 @@ export default function AudienceSelectionPanel() {
>
-
+
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.test.js
index ca675f1ff69..f7f4a373c9f 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSelectionPanel/index.test.js
@@ -464,9 +464,17 @@ describe( 'AudienceSelectionPanel', () => {
describe( 'AddGroupNotice', () => {
it( 'should display notice when there is a saved selection of one group', async () => {
+ const selectedAudiences = [ 'properties/12345/audiences/3' ];
registry
.dispatch( MODULES_ANALYTICS_4 )
- .setConfiguredAudiences( [ 'properties/12345/audiences/3' ] );
+ .setConfiguredAudiences( selectedAudiences );
+
+ registry
+ .dispatch( CORE_FORMS )
+ .setValues( AUDIENCE_SELECTION_FORM, {
+ [ AUDIENCE_SELECTED ]: selectedAudiences,
+ [ AUDIENCE_SELECTION_CHANGED ]: true,
+ } );
const { getByText, waitForRegistry } = render(
,