From c4487421d07c3d9224bb30f57f64106a5cf39c9d Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Mon, 20 May 2024 14:42:00 +0600
Subject: [PATCH 001/105] Upgrade `@wordpress/data` to `v4.27.3`.
---
package-lock.json | 178 ++++++++++++++++++----------------------------
package.json | 2 +-
2 files changed, 70 insertions(+), 110 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index aaaba31613e..9ae35d5e3a9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22049,17 +22049,17 @@
}
},
"@wordpress/data": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-4.23.0.tgz",
- "integrity": "sha512-plJZkf4otm8TupoA4B0RSmhdZptJOJshiMS02ihkvj0c2WdDomV5ERjOGBSVtJK30mm5ItOQjRIeH95v+EJURg==",
+ "version": "4.27.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-4.27.3.tgz",
+ "integrity": "sha512-5763NgNV9IIa1CC3Q80dAvrH6108tJtj3IrHfUCZmUk1atSNsOMBCkLdQ7tGTTi2JFejeGEMg1LJI22JD5zM6Q==",
"requires": {
- "@babel/runtime": "^7.9.2",
- "@wordpress/compose": "^3.20.0",
- "@wordpress/deprecated": "^2.9.0",
- "@wordpress/element": "^2.17.0",
- "@wordpress/is-shallow-equal": "^2.2.0",
- "@wordpress/priority-queue": "^1.8.0",
- "@wordpress/redux-routine": "^3.11.0",
+ "@babel/runtime": "^7.13.10",
+ "@wordpress/compose": "^3.25.3",
+ "@wordpress/deprecated": "^2.12.3",
+ "@wordpress/element": "^2.20.3",
+ "@wordpress/is-shallow-equal": "^3.1.3",
+ "@wordpress/priority-queue": "^1.11.2",
+ "@wordpress/redux-routine": "^3.14.2",
"equivalent-key-map": "^0.2.2",
"is-promise": "^4.0.0",
"lodash": "^4.17.19",
@@ -22069,6 +22069,14 @@
"use-memo-one": "^1.1.1"
},
"dependencies": {
+ "@babel/runtime": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
+ "requires": {
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
"@wordpress/compose": {
"version": "3.25.3",
"resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-3.25.3.tgz",
@@ -22087,24 +22095,6 @@
"mousetrap": "^1.6.5",
"react-resize-aware": "^3.1.0",
"use-memo-one": "^1.1.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- },
- "@wordpress/is-shallow-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-3.1.3.tgz",
- "integrity": "sha512-eDLhfC4aaSgklzqwc6F/F4zmJVpTVTAvhqX+q0SP/8LPcP2HuKErPHVrEc75PMWqIutja2wJg98YSNPdewrj1w==",
- "requires": {
- "@babel/runtime": "^7.13.10"
- }
- }
}
},
"@wordpress/i18n": {
@@ -22119,34 +22109,14 @@
"memize": "^1.1.0",
"sprintf-js": "^1.1.1",
"tannin": "^1.2.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- }
}
},
"@wordpress/is-shallow-equal": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-2.3.0.tgz",
- "integrity": "sha512-BUVCYZNDoT5fRJGoam/nI2Sn8QELu5z/pFe7UL+szFqQqNnMibdWqN/KoW/YO7WLJqqqTRhAs/Fa51g4oXRyHQ==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-3.1.3.tgz",
+ "integrity": "sha512-eDLhfC4aaSgklzqwc6F/F4zmJVpTVTAvhqX+q0SP/8LPcP2HuKErPHVrEc75PMWqIutja2wJg98YSNPdewrj1w==",
"requires": {
- "@babel/runtime": "^7.11.2"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- }
+ "@babel/runtime": "^7.13.10"
}
},
"@wordpress/keycodes": {
@@ -22157,32 +22127,22 @@
"@babel/runtime": "^7.13.10",
"@wordpress/i18n": "^3.20.0",
"lodash": "^4.17.19"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- }
}
},
"react-resize-aware": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.2.tgz",
- "integrity": "sha512-sBtMIEy/9oI+Xf2o7IdWdkTokpZSPo9TWn60gqWKPG3BXg44Rg3FCIMiIjmgvRUF4eQptw6pqYTUhYwkeVSxXA=="
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.3.tgz",
+ "integrity": "sha512-dPacJZfDczrGOljY8MBnQRudxjI8+M9qG5GXQzU4wIl5q2T4e8UcrSl2rsEBYn9DBuGflhDnI2uYGGFJ991DfA=="
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"sprintf-js": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
- "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
}
}
},
@@ -22196,17 +22156,17 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "regenerator-runtime": "^0.13.11"
+ "regenerator-runtime": "^0.14.0"
}
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
@@ -22220,17 +22180,17 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "regenerator-runtime": "^0.13.11"
+ "regenerator-runtime": "^0.14.0"
}
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
@@ -22725,17 +22685,17 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "regenerator-runtime": "^0.13.11"
+ "regenerator-runtime": "^0.14.0"
}
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
@@ -23072,17 +23032,17 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "regenerator-runtime": "^0.13.11"
+ "regenerator-runtime": "^0.14.0"
}
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
@@ -23098,17 +23058,17 @@
},
"dependencies": {
"@babel/runtime": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
- "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "regenerator-runtime": "^0.13.11"
+ "regenerator-runtime": "^0.14.0"
}
},
"regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
}
}
},
@@ -45623,9 +45583,9 @@
}
},
"redux": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
- "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
"requires": {
"@babel/runtime": "^7.9.2"
}
diff --git a/package.json b/package.json
index 8d147f3c649..a07e6b38425 100644
--- a/package.json
+++ b/package.json
@@ -120,7 +120,7 @@
"@react-hook/window-size": "^3.0.7",
"@wordpress/api-fetch": "^3.18.0",
"@wordpress/compose": "^3.19.1",
- "@wordpress/data": "^4.23.0",
+ "@wordpress/data": "^4.27.3",
"@wordpress/dom-ready": "^2.10.0",
"@wordpress/element": "^2.20.3",
"@wordpress/i18n": "^3.14.0",
From f5cc00bb67f38a631f74901c4edfc0ae171c41a0 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Mon, 20 May 2024 15:10:39 +0600
Subject: [PATCH 002/105] Replace the usage of `__experimentalResolveSelect`
with `resolveSelect`.
---
.../SettingsActiveModule/index.test.js | 2 +-
.../datastore/site/enable-auto-update.js | 4 +-
.../js/googlesitekit/datastore/site/html.js | 4 +-
.../datastore/user/feature-tours.js | 10 ++--
.../googlesitekit/datastore/user/surveys.js | 6 +-
.../datastore/user/surveys.test.js | 8 +--
.../datastore/user/user-input-settings.js | 5 +-
.../modules/create-info-store.js | 7 +--
.../modules/datastore/modules.js | 21 +++----
.../modules/datastore/modules.test.js | 4 +-
.../datastore/sharing-settings.test.js | 58 +++++++++----------
assets/js/modules/ads/index.js | 2 +-
assets/js/modules/ads/pax/services.js | 2 +-
assets/js/modules/adsense/index.js | 2 +-
.../datastore/audience-settings.js | 2 +-
.../datastore/conversion-events.test.js | 4 +-
.../custom-dimensions-gathering-data.js | 19 +++---
.../datastore/custom-dimensions.js | 22 +++----
.../datastore/enhanced-measurement.js | 4 +-
.../datastore/enhanced-measurement.test.js | 4 +-
.../analytics-4/datastore/partial-data.js | 23 +++-----
.../analytics-4/datastore/properties.js | 46 ++++++---------
.../js/modules/analytics-4/datastore/tags.js | 2 +-
.../analytics-4/datastore/webdatastreams.js | 8 +--
24 files changed, 115 insertions(+), 154 deletions(-)
diff --git a/assets/js/components/settings/SettingsActiveModule/index.test.js b/assets/js/components/settings/SettingsActiveModule/index.test.js
index c79d71eca75..80ceb0c9ca3 100644
--- a/assets/js/components/settings/SettingsActiveModule/index.test.js
+++ b/assets/js/components/settings/SettingsActiveModule/index.test.js
@@ -247,7 +247,7 @@ describe( 'SettingsModule', () => {
// Hack to avoid act error due to state change during render.
await act( () =>
registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.canActivateModule( 'tagmanager' )
);
diff --git a/assets/js/googlesitekit/datastore/site/enable-auto-update.js b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
index 02c3d15078a..db8aac08c55 100644
--- a/assets/js/googlesitekit/datastore/site/enable-auto-update.js
+++ b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
@@ -80,10 +80,10 @@ const baseActions = {
const registry = yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- registry.__experimentalResolveSelect( CORE_USER ).getNonces()
+ registry.resolveSelect( CORE_USER ).getNonces()
);
yield Data.commonActions.await(
- registry.__experimentalResolveSelect( CORE_SITE ).getSiteInfo()
+ registry.resolveSelect( CORE_SITE ).getSiteInfo()
);
const nonce = registry.select( CORE_USER ).getNonce( 'updates' );
diff --git a/assets/js/googlesitekit/datastore/site/html.js b/assets/js/googlesitekit/datastore/site/html.js
index 06d01e0101d..7330a5e20c0 100644
--- a/assets/js/googlesitekit/datastore/site/html.js
+++ b/assets/js/googlesitekit/datastore/site/html.js
@@ -146,9 +146,7 @@ const baseControls = {
[ WAIT_FOR_HTML_FOR_URL ]: createRegistryControl(
( registry ) =>
( { payload: { url } } ) =>
- registry
- .__experimentalResolveSelect( CORE_SITE )
- .getHTMLForURL( url )
+ registry.resolveSelect( CORE_SITE ).getHTMLForURL( url )
),
[ CHECK_FOR_SETUP_TAG ]: createRegistryControl(
( registry ) => async () => {
diff --git a/assets/js/googlesitekit/datastore/user/feature-tours.js b/assets/js/googlesitekit/datastore/user/feature-tours.js
index 711400e60d2..4935af236a3 100644
--- a/assets/js/googlesitekit/datastore/user/feature-tours.js
+++ b/assets/js/googlesitekit/datastore/user/feature-tours.js
@@ -198,10 +198,10 @@ const baseActions = {
},
*triggerTourForView( viewContext ) {
- const { select, __experimentalResolveSelect } = yield getRegistry();
+ const { select, resolveSelect } = yield getRegistry();
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getLastDismissedAt()
+ resolveSelect( CORE_USER ).getLastDismissedAt()
);
if ( select( CORE_USER ).areFeatureToursOnCooldown() ) {
@@ -241,7 +241,7 @@ const baseControls = {
// Only tours with a version after a user's initial Site Kit version should qualify.
const initialVersion = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getInitialSiteKitVersion();
if ( ! initialVersion ) {
return false;
@@ -258,7 +258,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
@@ -281,7 +281,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
diff --git a/assets/js/googlesitekit/datastore/user/surveys.js b/assets/js/googlesitekit/datastore/user/surveys.js
index e4673fd7a65..17d6463e0ca 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.js
@@ -182,12 +182,12 @@ const baseActions = {
},
function* ( triggerID, options = {} ) {
const { ttl = 0 } = options;
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield Data.commonActions.getRegistry();
// Wait for user authentication state to be available before selecting.
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -196,7 +196,7 @@ const baseActions = {
// Await for surveys to be resolved before checking timeouts.
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getSurveyTimeouts()
+ resolveSelect( CORE_USER ).getSurveyTimeouts()
);
const isTimedOut =
diff --git a/assets/js/googlesitekit/datastore/user/surveys.test.js b/assets/js/googlesitekit/datastore/user/surveys.test.js
index 60b84e2ec50..6165868f200 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.test.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.test.js
@@ -222,18 +222,14 @@ describe( 'core/user surveys', () => {
provideUserAuthentication( registry );
- await registry
- .__experimentalResolveSelect( CORE_USER )
- .getAuthentication();
+ await registry.resolveSelect( CORE_USER ).getAuthentication();
muteFetch( surveyTriggerEndpoint );
muteFetch( surveyTimeoutEndpoint );
registry.dispatch( CORE_USER ).receiveGetSurveyTimeouts( [] );
- await registry
- .__experimentalResolveSelect( CORE_USER )
- .getSurveyTimeouts();
+ await registry.resolveSelect( CORE_USER ).getSurveyTimeouts();
jest.useFakeTimers();
diff --git a/assets/js/googlesitekit/datastore/user/user-input-settings.js b/assets/js/googlesitekit/datastore/user/user-input-settings.js
index c5308cb1dc2..aab3c7929c8 100644
--- a/assets/js/googlesitekit/datastore/user/user-input-settings.js
+++ b/assets/js/googlesitekit/datastore/user/user-input-settings.js
@@ -162,11 +162,10 @@ const baseActions = {
* @return {Object} Object with `response` and `error`.
*/
*maybeTriggerUserInputSurvey() {
- const { __experimentalResolveSelect, dispatch } =
- yield commonActions.getRegistry();
+ const { resolveSelect, dispatch } = yield commonActions.getRegistry();
const settings = yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getUserInputSettings()
+ resolveSelect( CORE_USER ).getUserInputSettings()
);
const settingsAnsweredOther = Object.keys( settings ).filter( ( key ) =>
diff --git a/assets/js/googlesitekit/modules/create-info-store.js b/assets/js/googlesitekit/modules/create-info-store.js
index 313276f7ece..c3abb40a0ff 100644
--- a/assets/js/googlesitekit/modules/create-info-store.js
+++ b/assets/js/googlesitekit/modules/create-info-store.js
@@ -61,11 +61,10 @@ export const createInfoStore = (
const controls = {
[ WAIT_FOR_REAUTH_RESOLVERS ]: createRegistryControl(
( registry ) => async () => {
- const { __experimentalResolveSelect } = registry;
+ const { resolveSelect } = registry;
const { getAuthentication, getConnectURL } =
- __experimentalResolveSelect( CORE_USER );
- const { getSiteInfo } =
- __experimentalResolveSelect( CORE_SITE );
+ resolveSelect( CORE_USER );
+ const { getSiteInfo } = resolveSelect( CORE_SITE );
await Promise.all( [
// Authentication is needed for checking `needsReauthentication`.
diff --git a/assets/js/googlesitekit/modules/datastore/modules.js b/assets/js/googlesitekit/modules/datastore/modules.js
index 70cfcfaad34..ef9cfcf4f14 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.js
@@ -560,13 +560,11 @@ export const baseControls = {
}
),
[ SELECT_MODULE_REAUTH_URL ]: createRegistryControl(
- ( { select, __experimentalResolveSelect } ) =>
+ ( { select, resolveSelect } ) =>
async ( { payload } ) => {
const { slug } = payload;
// Ensure the module is loaded before selecting the store name.
- await __experimentalResolveSelect( CORE_MODULES ).getModule(
- slug
- );
+ await resolveSelect( CORE_MODULES ).getModule( slug );
const storeName =
select( CORE_MODULES ).getModuleStoreName( slug );
@@ -577,9 +575,7 @@ export const baseControls = {
}
if ( select( storeName )?.getAdminReauthURL ) {
- return await __experimentalResolveSelect(
- storeName
- ).getAdminReauthURL();
+ return await resolveSelect( storeName ).getAdminReauthURL();
}
return select( CORE_SITE ).getAdminURL(
'googlesitekit-dashboard'
@@ -662,11 +658,10 @@ const baseReducer = ( state, { type, payload } ) => {
};
function* waitForModules() {
- const { __experimentalResolveSelect } =
- yield Data.commonActions.getRegistry();
+ const { resolveSelect } = yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModules()
+ resolveSelect( CORE_MODULES ).getModules()
);
}
@@ -683,9 +678,9 @@ const baseResolvers = {
*canActivateModule( slug ) {
const registry = yield Data.commonActions.getRegistry();
- const { select, __experimentalResolveSelect } = registry;
+ const { select, resolveSelect } = registry;
const module = yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModule( slug )
+ resolveSelect( CORE_MODULES ).getModule( slug )
);
// At this point, all modules are loaded so we can safely select getModule below.
@@ -751,7 +746,7 @@ const baseResolvers = {
*getRecoverableModules() {
const registry = yield Data.commonActions.getRegistry();
const modules = yield Data.commonActions.await(
- registry.__experimentalResolveSelect( CORE_MODULES ).getModules()
+ registry.resolveSelect( CORE_MODULES ).getModules()
);
const recoverableModules = Object.entries( modules || {} ).reduce(
diff --git a/assets/js/googlesitekit/modules/datastore/modules.test.js b/assets/js/googlesitekit/modules/datastore/modules.test.js
index fc0a69d86e9..de11d30a3eb 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.test.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.test.js
@@ -2043,7 +2043,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject( {} );
@@ -2056,7 +2056,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject(
diff --git a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
index 43622662155..b097a631d8e 100644
--- a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
+++ b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
@@ -240,7 +240,7 @@ describe( 'core/modules sharing-settings', () => {
);
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
await registry
@@ -368,7 +368,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( console ).toHaveErrored();
@@ -381,7 +381,7 @@ describe( 'core/modules sharing-settings', () => {
};
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( {} );
@@ -391,7 +391,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( sharingSettings );
@@ -403,7 +403,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( console ).toHaveErrored();
@@ -416,7 +416,7 @@ describe( 'core/modules sharing-settings', () => {
};
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( [] );
@@ -426,7 +426,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( shareableRoles );
@@ -444,7 +444,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -459,7 +459,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -472,7 +472,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -494,7 +494,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -509,7 +509,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -522,7 +522,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -545,7 +545,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -592,7 +592,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -607,7 +607,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares select keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -650,7 +650,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'informs whether client-side sharing-settings differ from server-side ones', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// True after updating module's `sharedRoles` on the client.
@@ -686,7 +686,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to TRUE after starting submiting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
freezeFetch(
@@ -707,7 +707,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to FALSE after finishing submitting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
fetchMock.postOnce(
@@ -763,7 +763,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -816,7 +816,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -862,7 +862,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -898,7 +898,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -955,7 +955,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -1024,7 +1024,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -1041,7 +1041,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares selected keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -1099,7 +1099,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( console ).toHaveErrored();
@@ -1114,7 +1114,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
@@ -1128,7 +1128,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
diff --git a/assets/js/modules/ads/index.js b/assets/js/modules/ads/index.js
index b9f6255b612..9b88d735da7 100644
--- a/assets/js/modules/ads/index.js
+++ b/assets/js/modules/ads/index.js
@@ -57,7 +57,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/ads/pax/services.js b/assets/js/modules/ads/pax/services.js
index dc74c7191b5..6306b22f6af 100644
--- a/assets/js/modules/ads/pax/services.js
+++ b/assets/js/modules/ads/pax/services.js
@@ -61,7 +61,7 @@ const restFetchWpPages = async () => {
export function createPaxServices( registry, options = {} ) {
const { onCampaignCreated = null, _global = global } = options;
- const { select, __experimentalResolveSelect: resolveSelect } = registry;
+ const { select, resolveSelect: resolveSelect } = registry;
const accessToken =
_global?._googlesitekitPAXConfig?.authAccess?.oauthTokenAccess?.token;
diff --git a/assets/js/modules/adsense/index.js b/assets/js/modules/adsense/index.js
index 29f38c0cb46..2f7b734145c 100644
--- a/assets/js/modules/adsense/index.js
+++ b/assets/js/modules/adsense/index.js
@@ -68,7 +68,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/analytics-4/datastore/audience-settings.js b/assets/js/modules/analytics-4/datastore/audience-settings.js
index fe3bf40e31c..15071bff614 100644
--- a/assets/js/modules/analytics-4/datastore/audience-settings.js
+++ b/assets/js/modules/analytics-4/datastore/audience-settings.js
@@ -118,7 +118,7 @@ const baseActions = {
const registry = yield Data.commonActions.getRegistry();
const audienceSettings = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getAudienceSettings()
);
diff --git a/assets/js/modules/analytics-4/datastore/conversion-events.test.js b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
index 5e90c7df6bb..80ff5d35fdc 100644
--- a/assets/js/modules/analytics-4/datastore/conversion-events.test.js
+++ b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
@@ -64,7 +64,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
expect( initialConversionEvents ).toBeUndefined();
const conversionEvents = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
@@ -110,7 +110,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
);
await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
index 90809e5fc92..2cf7fd47863 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
@@ -115,11 +115,11 @@ const baseActions = {
* @param {string} customDimension Custom dimension slug.
*/
*checkCustomDimensionDataAvailability( customDimension ) {
- const { select, __experimentalResolveSelect } =
+ const { select, resolveSelect } =
yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
if (
@@ -135,7 +135,7 @@ const baseActions = {
}
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -147,7 +147,7 @@ const baseActions = {
}
const reportArgs = yield Data.commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getDataAvailabilityReportOptions( customDimension )
);
@@ -161,9 +161,7 @@ const baseActions = {
}
const report = yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
- reportArgs
- )
+ resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
);
const hasReportError = !! select(
@@ -242,13 +240,10 @@ const baseResolvers = {
},
*getDataAvailabilityReportOptions() {
- const { __experimentalResolveSelect } =
- yield Data.commonActions.getRegistry();
+ const { resolveSelect } = yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getPropertyCreateTime()
+ resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions.js b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
index 3eda0bcdd8a..8e2db657bd4 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
@@ -115,15 +115,9 @@ const baseActions = {
// Wait for the necessary settings to be loaded before checking.
yield Data.commonActions.await(
Promise.all( [
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getSettings(),
- registry
- .__experimentalResolveSelect( CORE_USER )
- .getKeyMetricsSettings(),
- registry
- .__experimentalResolveSelect( CORE_USER )
- .getUserInputSettings(),
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings(),
+ registry.resolveSelect( CORE_USER ).getKeyMetricsSettings(),
+ registry.resolveSelect( CORE_USER ).getUserInputSettings(),
] )
);
@@ -287,14 +281,12 @@ export const baseReducer = ( state, { type, payload } ) => {
const baseResolvers = {
*getAvailableCustomDimensions() {
- const { select, __experimentalResolveSelect } =
+ const { select, resolveSelect } =
yield Data.commonActions.getRegistry();
const { isAuthenticated, hasCapability } = select( CORE_USER );
const isGA4Connected = yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).isModuleConnected(
- 'analytics-4'
- )
+ resolveSelect( CORE_MODULES ).isModuleConnected( 'analytics-4' )
);
if ( ! isGA4Connected ) {
@@ -303,7 +295,7 @@ const baseResolvers = {
// Wait for settings to be loaded before proceeding.
yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const availableCustomDimensions =
@@ -315,7 +307,7 @@ const baseResolvers = {
// Wait for permissions to be loaded before checking if the user can manage options.
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getCapabilities()
+ resolveSelect( CORE_USER ).getCapabilities()
);
if ( ! hasCapability( PERMISSION_MANAGE_OPTIONS ) ) {
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
index 415f6178a8a..afc439cbd00 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
@@ -224,7 +224,7 @@ const baseActions = {
const currentSettings = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -298,7 +298,7 @@ const baseActions = {
const currentSettings = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
index e1bc176ba60..20d7efd783e 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
@@ -356,7 +356,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialSettings ).toBeUndefined();
const finalSettings = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -488,7 +488,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialStreamEnabled ).toBeUndefined();
const finalStreamEnabled = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.isEnhancedMeasurementStreamAlreadyEnabled(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/partial-data.js b/assets/js/modules/analytics-4/datastore/partial-data.js
index 360d6f6ab90..e4895234e6a 100644
--- a/assets/js/modules/analytics-4/datastore/partial-data.js
+++ b/assets/js/modules/analytics-4/datastore/partial-data.js
@@ -203,7 +203,7 @@ const baseResolvers = {
},
*getResourceDataAvailabilityDate( resourceSlug, resourceType ) {
- const { select, __experimentalResolveSelect } =
+ const { select, resolveSelect } =
yield Data.commonActions.getRegistry();
if (
@@ -216,7 +216,7 @@ const baseResolvers = {
}
const resourceAvailabilityDates = yield Data.commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getResourceDataAvailabilityDates()
);
@@ -227,14 +227,14 @@ const baseResolvers = {
) {
// Ensure the settings are loaded.
yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
// Validate if the resourceSlug is a valid resource.
switch ( resourceType ) {
case RESOURCE_TYPE_AUDIENCE:
yield Data.commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getAvailableAudiences()
);
@@ -272,7 +272,7 @@ const baseResolvers = {
}
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
// Return early if user is not authenticated.
@@ -286,7 +286,7 @@ const baseResolvers = {
}
const reportArgs = yield Data.commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getPartialDataReportOptions( resourceSlug, resourceType )
);
@@ -297,9 +297,7 @@ const baseResolvers = {
}
const report = yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
- reportArgs
- )
+ resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
);
const hasReportError = !! select(
@@ -337,13 +335,10 @@ const baseResolvers = {
},
*getPartialDataReportOptions() {
- const { __experimentalResolveSelect } =
- yield Data.commonActions.getRegistry();
+ const { resolveSelect } = yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getPropertyCreateTime()
+ resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/properties.js b/assets/js/modules/analytics-4/datastore/properties.js
index 860f3491deb..ced9c1ee64a 100644
--- a/assets/js/modules/analytics-4/datastore/properties.js
+++ b/assets/js/modules/analytics-4/datastore/properties.js
@@ -254,7 +254,7 @@ const baseActions = {
if ( propertyID ) {
const property = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
@@ -302,9 +302,7 @@ const baseActions = {
*findMatchedProperty() {
const registry = yield commonActions.getRegistry();
const accounts = yield Data.commonActions.await(
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getAccountSummaries()
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getAccountSummaries()
);
if ( ! Array.isArray( accounts ) || accounts.length === 0 ) {
@@ -408,7 +406,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -424,9 +422,7 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .__experimentalResolveSelect(
- MODULES_ANALYTICS_4
- )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
}
@@ -464,7 +460,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -477,9 +473,7 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .__experimentalResolveSelect(
- MODULES_ANALYTICS_4
- )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
}
@@ -511,7 +505,7 @@ const baseActions = {
* @param {string} measurementID Measurement ID.
*/
*updateSettingsForMeasurementID( measurementID ) {
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield commonActions.getRegistry();
if ( ! measurementID ) {
@@ -528,7 +522,7 @@ const baseActions = {
// Wait for authentication to be resolved to check scopes.
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).hasScope( TAGMANAGER_READ_SCOPE ) ) {
return;
@@ -595,7 +589,7 @@ const baseActions = {
* @since 1.95.0
*/
*syncGoogleTagSettings() {
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield Data.commonActions.getRegistry();
const hasTagManagerReadScope = select( CORE_USER ).hasScope(
@@ -608,7 +602,7 @@ const baseActions = {
// Wait for modules to be available before selecting.
yield Data.commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModules()
+ resolveSelect( CORE_MODULES ).getModules()
);
const { isModuleConnected } = select( CORE_MODULES );
@@ -619,7 +613,7 @@ const baseActions = {
// Wait for module settings to be available before selecting.
yield Data.commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const {
@@ -649,9 +643,9 @@ const baseActions = {
if ( !! googleTagID ) {
const googleTagContainer = yield Data.commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getGoogleTagContainer( measurementID )
+ resolveSelect( MODULES_ANALYTICS_4 ).getGoogleTagContainer(
+ measurementID
+ )
);
if ( ! googleTagContainer ) {
@@ -667,7 +661,7 @@ const baseActions = {
const googleTagContainerID = getGoogleTagContainerID();
const googleTagContainerDestinations = yield Data.commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getGoogleTagContainerDestinations(
googleTagAccountID,
@@ -692,9 +686,9 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_PROPERTY_SUMMARIES ]: createRegistryControl(
- ( { __experimentalResolveSelect } ) => {
+ ( { resolveSelect } ) => {
return async () => {
- await __experimentalResolveSelect(
+ await resolveSelect(
MODULES_ANALYTICS_4
).getAccountSummaries();
};
@@ -751,9 +745,7 @@ const baseResolvers = {
const registry = yield Data.commonActions.getRegistry();
// Ensure settings are available to select.
yield Data.commonActions.await(
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getSettings()
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const propertyID = registry
@@ -784,7 +776,7 @@ const baseResolvers = {
const property = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
diff --git a/assets/js/modules/analytics-4/datastore/tags.js b/assets/js/modules/analytics-4/datastore/tags.js
index 2b6b57fdbb9..310c7673a17 100644
--- a/assets/js/modules/analytics-4/datastore/tags.js
+++ b/assets/js/modules/analytics-4/datastore/tags.js
@@ -47,7 +47,7 @@ existingTagStore.resolvers.getExistingTag = function* () {
if ( existingTag !== null ) {
const container = yield Data.commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getGoogleTagContainer( existingTag )
);
diff --git a/assets/js/modules/analytics-4/datastore/webdatastreams.js b/assets/js/modules/analytics-4/datastore/webdatastreams.js
index c69495fbeea..067a4d0be5a 100644
--- a/assets/js/modules/analytics-4/datastore/webdatastreams.js
+++ b/assets/js/modules/analytics-4/datastore/webdatastreams.js
@@ -213,12 +213,12 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_WEBDATASTREAMS ]: createRegistryControl(
- ( { __experimentalResolveSelect } ) => {
+ ( { resolveSelect } ) => {
return async ( { payload } ) => {
const { propertyID } = payload;
- await __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getWebDataStreams( propertyID );
+ await resolveSelect( MODULES_ANALYTICS_4 ).getWebDataStreams(
+ propertyID
+ );
};
}
),
From 40e47502b9bf0d69330102d123adb78294cd9c92 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Mon, 20 May 2024 17:28:47 +0600
Subject: [PATCH 003/105] Align `@wordpress/compose` versions.
---
package-lock.json | 106 ++++++++++++++++++++++++++++++++--------------
package.json | 2 +-
2 files changed, 76 insertions(+), 32 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9ae35d5e3a9..1fadd5bbfcc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22014,37 +22014,66 @@
"dev": true
},
"@wordpress/compose": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-3.19.1.tgz",
- "integrity": "sha512-D9IoSQJKgQ2Yqz/SDRjoeT26USR7PoTxzyO7Hk2EyolfPoB0sko0LjwbbndfLYYLksAcZ4x1js4cK9+tHkFJNA==",
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-3.25.3.tgz",
+ "integrity": "sha512-tCO2EnJCkCH548OqA0uU8V1k/1skz2QwBlHs8ZQSpimqUS4OWWsAlndCEFe4U4vDTqFt2ow7tzAir+05Cw8MAg==",
"requires": {
- "@babel/runtime": "^7.9.2",
- "@wordpress/element": "^2.16.0",
- "@wordpress/is-shallow-equal": "^2.1.0",
- "@wordpress/priority-queue": "^1.7.0",
+ "@babel/runtime": "^7.13.10",
+ "@wordpress/deprecated": "^2.12.3",
+ "@wordpress/dom": "^2.18.0",
+ "@wordpress/element": "^2.20.3",
+ "@wordpress/is-shallow-equal": "^3.1.3",
+ "@wordpress/keycodes": "^2.19.3",
+ "@wordpress/priority-queue": "^1.11.2",
"clipboard": "^2.0.1",
- "lodash": "^4.17.15",
+ "lodash": "^4.17.19",
+ "memize": "^1.1.0",
"mousetrap": "^1.6.5",
- "react-resize-aware": "^3.0.1"
+ "react-resize-aware": "^3.1.0",
+ "use-memo-one": "^1.1.1"
},
"dependencies": {
- "@wordpress/priority-queue": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-1.10.0.tgz",
- "integrity": "sha512-3ejPX/6ECUN1FAqbL1BvqP77aRrGx5C41HeNZZT9ZzErJWVGfE0NRFfCt7knT0/LumdERApHkswBp3DQ5J18RQ==",
+ "@babel/runtime": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
"requires": {
- "@babel/runtime": "^7.12.5"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.12.5",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
- "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- }
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
+ "@wordpress/i18n": {
+ "version": "3.20.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-3.20.0.tgz",
+ "integrity": "sha512-SIoOJFB4UrrYAScS4H91CYCLW9dX3Ghv8pBKc/yHGculb1AdGr6gRMlmJxZV62Cn3CZ4Ga86c+FfR+GiBu0JPg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@wordpress/hooks": "^2.12.3",
+ "gettext-parser": "^1.3.1",
+ "lodash": "^4.17.19",
+ "memize": "^1.1.0",
+ "sprintf-js": "^1.1.1",
+ "tannin": "^1.2.0"
+ }
+ },
+ "@wordpress/keycodes": {
+ "version": "2.19.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-2.19.3.tgz",
+ "integrity": "sha512-8rNdmP5M1ifTgLIL0dt/N1uTGsq/Rx1ydCXy+gg24WdxBRhyu5sudNVCtascVXo26aIfOH9OJRdqRZZTEORhog==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@wordpress/i18n": "^3.20.0",
+ "lodash": "^4.17.19"
}
+ },
+ "regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
}
}
},
@@ -22750,11 +22779,26 @@
}
},
"@wordpress/is-shallow-equal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-2.1.0.tgz",
- "integrity": "sha512-xCphAZG60mnLhn+LitwfoercNxsPMvc0Yo96kBY7HAZgrPt+jNQ5Rv4M+FTlVnyLrkyxVxNdtGyuyR+Hpgi8Pg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-3.1.3.tgz",
+ "integrity": "sha512-eDLhfC4aaSgklzqwc6F/F4zmJVpTVTAvhqX+q0SP/8LPcP2HuKErPHVrEc75PMWqIutja2wJg98YSNPdewrj1w==",
"requires": {
- "@babel/runtime": "^7.9.2"
+ "@babel/runtime": "^7.13.10"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.24.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
+ "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
+ "requires": {
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ }
}
},
"@wordpress/jest-console": {
@@ -45251,9 +45295,9 @@
"dev": true
},
"react-resize-aware": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.0.1.tgz",
- "integrity": "sha512-HdPzwdcAv+BMFQEgyacFB40G4IxNMO7tSqaMjbnAouot8LXi5/Rx3/Fv+LU2cQekqiivE1LF4sGnwQ7SnoHrpg=="
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.3.tgz",
+ "integrity": "sha512-dPacJZfDczrGOljY8MBnQRudxjI8+M9qG5GXQzU4wIl5q2T4e8UcrSl2rsEBYn9DBuGflhDnI2uYGGFJ991DfA=="
},
"react-router": {
"version": "5.2.0",
diff --git a/package.json b/package.json
index a07e6b38425..39f8676cc4d 100644
--- a/package.json
+++ b/package.json
@@ -119,7 +119,7 @@
"@react-hook/merged-ref": "^1.3.0",
"@react-hook/window-size": "^3.0.7",
"@wordpress/api-fetch": "^3.18.0",
- "@wordpress/compose": "^3.19.1",
+ "@wordpress/compose": "^3.25.3",
"@wordpress/data": "^4.27.3",
"@wordpress/dom-ready": "^2.10.0",
"@wordpress/element": "^2.20.3",
From aa1c42400428df9b24397b831db6b65d17359651 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Mon, 20 May 2024 22:03:18 +0600
Subject: [PATCH 004/105] Fix failing tests.
---
.../modules/create-submit-changes-store.test.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/assets/js/googlesitekit/modules/create-submit-changes-store.test.js b/assets/js/googlesitekit/modules/create-submit-changes-store.test.js
index 829da29e510..3343b725bb7 100644
--- a/assets/js/googlesitekit/modules/create-submit-changes-store.test.js
+++ b/assets/js/googlesitekit/modules/create-submit-changes-store.test.js
@@ -155,11 +155,15 @@ describe( 'createSubmitChangesStore', () => {
] )( '%s', ( selector ) => {
it( 'should use provided validateCanSubmitChanges function', () => {
const validateCanSubmitChanges = jest.fn();
- const { selectors } = createSubmitChangesStore( {
+ const store = createSubmitChangesStore( {
validateCanSubmitChanges,
} );
- selectors[ selector ]();
+ const registry = createRegistry();
+ registry.registerStore( storeName, store );
+
+ store.selectors[ selector ]();
+
expect( validateCanSubmitChanges ).toHaveBeenCalled();
} );
} );
From e52e008113ba3fe5d2d3725e6a6ecfd2d41a808d Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Sun, 26 May 2024 11:17:31 +0600
Subject: [PATCH 005/105] Add `patch-package`.
---
package-lock.json | 308 ++++++++++++++++++++++++++++++++++++++++++++++
package.json | 4 +-
2 files changed, 311 insertions(+), 1 deletion(-)
diff --git a/package-lock.json b/package-lock.json
index 1fadd5bbfcc..066f03d061e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23223,6 +23223,12 @@
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
+ "@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+ "dev": true
+ },
"abab": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
@@ -32502,6 +32508,66 @@
"locate-path": "^3.0.0"
}
},
+ "find-yarn-workspace-root": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
+ "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^4.0.2"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.1.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+ "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
"flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
@@ -38187,6 +38253,70 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "json-stable-stringify": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz",
+ "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.5",
+ "isarray": "^2.0.5",
+ "jsonify": "^0.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "dependencies": {
+ "call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "requires": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
@@ -38223,6 +38353,12 @@
}
}
},
+ "jsonify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
+ "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
+ "dev": true
+ },
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
@@ -38359,6 +38495,15 @@
"is-buffer": "^1.1.5"
}
},
+ "klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
"kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -40963,6 +41108,12 @@
"integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
"dev": true
},
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true
+ },
"overlayscrollbars": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz",
@@ -41215,6 +41366,154 @@
"integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
"dev": true
},
+ "patch-package": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz",
+ "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==",
+ "dev": true,
+ "requires": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^3.7.0",
+ "cross-spawn": "^7.0.3",
+ "find-yarn-workspace-root": "^2.0.0",
+ "fs-extra": "^9.0.0",
+ "json-stable-stringify": "^1.0.2",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.6",
+ "open": "^7.4.2",
+ "rimraf": "^2.6.3",
+ "semver": "^7.5.3",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33",
+ "yaml": "^2.2.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "yaml": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+ "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+ "dev": true
+ }
+ }
+ },
"path": {
"version": "0.12.7",
"resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
@@ -50397,6 +50696,15 @@
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
"tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
diff --git a/package.json b/package.json
index 39f8676cc4d..bce0ef06428 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,8 @@
"lint:css-fix": "stylelint ./assets/sass ./.storybook/assets/sass --fix",
"env:start": "./bin/local-env/start.sh",
"env:stop": "./bin/local-env/stop.sh",
- "env:reset-site": "./bin/local-env/install-wordpress.sh --reset-site"
+ "env:reset-site": "./bin/local-env/install-wordpress.sh --reset-site",
+ "postinstall": "patch-package"
},
"browserslist": [
"extends @wordpress/browserslist-config"
@@ -230,6 +231,7 @@
"lint-staged": "^10.2.11",
"mini-css-extract-plugin": "^1.2.1",
"node-fetch": "^2.6.8",
+ "patch-package": "^8.0.0",
"postcss": "^8.4.31",
"postcss-import-url": "^7.0.0",
"postcss-loader": "^4.0.0",
From 01535fcaf8d40247ee620eef88fb4fe5071d0a9d Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Sun, 26 May 2024 11:21:41 +0600
Subject: [PATCH 006/105] Patch `useSelect` hook of `@wordpress/data` to
restore previous behavior.
---
patches/@wordpress+data+4.27.3.patch | 79 ++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
create mode 100644 patches/@wordpress+data+4.27.3.patch
diff --git a/patches/@wordpress+data+4.27.3.patch b/patches/@wordpress+data+4.27.3.patch
new file mode 100644
index 00000000000..4f05799d196
--- /dev/null
+++ b/patches/@wordpress+data+4.27.3.patch
@@ -0,0 +1,79 @@
+diff --git a/node_modules/@wordpress/data/build-module/components/use-select/index.js b/node_modules/@wordpress/data/build-module/components/use-select/index.js
+index 1c11195..6f8cec8 100644
+--- a/node_modules/@wordpress/data/build-module/components/use-select/index.js
++++ b/node_modules/@wordpress/data/build-module/components/use-select/index.js
+@@ -121,10 +121,7 @@ export default function useSelect(_mapSelect, deps) {
+ var isMountedAndNotUnsubscribing = useRef(); // Keep track of the stores being selected in the mapSelect function,
+ // and only subscribe to those stores later.
+
+- var listeningStores = useRef([]);
+- var trapSelect = useCallback(function (callback) {
+- return registry.__experimentalMarkListeningStores(callback, listeningStores);
+- }, [registry]); // Generate a "flag" for used in the effect dependency array.
++ // Generate a "flag" for used in the effect dependency array.
+ // It's different than just using `mapSelect` since deps could be undefined,
+ // in that case, we would still want to memoize it.
+
+@@ -136,9 +133,7 @@ export default function useSelect(_mapSelect, deps) {
+ if (!isWithoutMapping) {
+ try {
+ if (latestMapSelect.current !== mapSelect || latestMapOutputError.current) {
+- mapOutput = trapSelect(function () {
+- return mapSelect(registry.select, registry);
+- });
++ mapOutput = mapSelect( registry.select, registry );
+ } else {
+ mapOutput = latestMapOutput.current;
+ }
+@@ -183,9 +178,10 @@ export default function useSelect(_mapSelect, deps) {
+ var onStoreChange = function onStoreChange() {
+ if (isMountedAndNotUnsubscribing.current) {
+ try {
+- var newMapOutput = trapSelect(function () {
+- return latestMapSelect.current(registry.select, registry);
+- });
++ var newMapOutput = latestMapSelect.current(
++ registry.select,
++ registry
++ );
+
+ if (isShallowEqual(latestMapOutput.current, newMapOutput)) {
+ return;
+@@ -208,26 +204,22 @@ export default function useSelect(_mapSelect, deps) {
+ onStoreChange();
+ }
+
+- var onChange = function onChange() {
+- if (latestIsAsync.current) {
+- renderQueue.add(queueContext, onStoreChange);
+- } else {
+- onStoreChange();
+- }
+- };
++ var unsubscribe = registry.subscribe( () => {
++ if ( latestIsAsync.current ) {
++ renderQueue.add( queueContext, onStoreChange );
++ } else {
++ onStoreChange();
++ }
++ } );
+
+- var unsubscribers = listeningStores.current.map(function (storeName) {
+- return registry.__experimentalSubscribeStore(storeName, onChange);
+- });
+ return function () {
+ isMountedAndNotUnsubscribing.current = false; // The return value of the subscribe function could be undefined if the store is a custom generic store.
+
+- unsubscribers.forEach(function (unsubscribe) {
+- return unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();
+- });
++ unsubscribe();
++
+ renderQueue.flush(queueContext);
+ };
+- }, [registry, trapSelect, depsChangedFlag, isWithoutMapping]);
++ }, [registry, depsChangedFlag, isWithoutMapping]);
+ return isWithoutMapping ? registry.select(_mapSelect) : mapOutput;
+ }
+ //# sourceMappingURL=index.js.map
+\ No newline at end of file
From a832b5f96fc95f7e62a4de35cb6a91273ef66c58 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Sun, 26 May 2024 11:52:31 +0600
Subject: [PATCH 007/105] Add patch for the build file which is used by jest.
---
patches/@wordpress+data+4.27.3.patch | 79 ++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/patches/@wordpress+data+4.27.3.patch b/patches/@wordpress+data+4.27.3.patch
index 4f05799d196..29cfdc2caa4 100644
--- a/patches/@wordpress+data+4.27.3.patch
+++ b/patches/@wordpress+data+4.27.3.patch
@@ -77,3 +77,82 @@ index 1c11195..6f8cec8 100644
}
//# sourceMappingURL=index.js.map
\ No newline at end of file
+diff --git a/node_modules/@wordpress/data/build/components/use-select/index.js b/node_modules/@wordpress/data/build/components/use-select/index.js
+index 76e8a7a..0992fde 100644
+--- a/node_modules/@wordpress/data/build/components/use-select/index.js
++++ b/node_modules/@wordpress/data/build/components/use-select/index.js
+@@ -137,10 +137,7 @@ function useSelect(_mapSelect, deps) {
+ var isMountedAndNotUnsubscribing = (0, _element.useRef)(); // Keep track of the stores being selected in the mapSelect function,
+ // and only subscribe to those stores later.
+
+- var listeningStores = (0, _element.useRef)([]);
+- var trapSelect = (0, _element.useCallback)(function (callback) {
+- return registry.__experimentalMarkListeningStores(callback, listeningStores);
+- }, [registry]); // Generate a "flag" for used in the effect dependency array.
++ // Generate a "flag" for used in the effect dependency array.
+ // It's different than just using `mapSelect` since deps could be undefined,
+ // in that case, we would still want to memoize it.
+
+@@ -152,9 +149,7 @@ function useSelect(_mapSelect, deps) {
+ if (!isWithoutMapping) {
+ try {
+ if (latestMapSelect.current !== mapSelect || latestMapOutputError.current) {
+- mapOutput = trapSelect(function () {
+- return mapSelect(registry.select, registry);
+- });
++ mapOutput = mapSelect( registry.select, registry );
+ } else {
+ mapOutput = latestMapOutput.current;
+ }
+@@ -199,9 +194,10 @@ function useSelect(_mapSelect, deps) {
+ var onStoreChange = function onStoreChange() {
+ if (isMountedAndNotUnsubscribing.current) {
+ try {
+- var newMapOutput = trapSelect(function () {
+- return latestMapSelect.current(registry.select, registry);
+- });
++ var newMapOutput = latestMapSelect.current(
++ registry.select,
++ registry
++ );
+
+ if ((0, _isShallowEqual.default)(latestMapOutput.current, newMapOutput)) {
+ return;
+@@ -224,26 +220,22 @@ function useSelect(_mapSelect, deps) {
+ onStoreChange();
+ }
+
+- var onChange = function onChange() {
+- if (latestIsAsync.current) {
+- renderQueue.add(queueContext, onStoreChange);
+- } else {
+- onStoreChange();
+- }
+- };
++ var unsubscribe = registry.subscribe( () => {
++ if ( latestIsAsync.current ) {
++ renderQueue.add( queueContext, onStoreChange );
++ } else {
++ onStoreChange();
++ }
++ } );
+
+- var unsubscribers = listeningStores.current.map(function (storeName) {
+- return registry.__experimentalSubscribeStore(storeName, onChange);
+- });
+ return function () {
+ isMountedAndNotUnsubscribing.current = false; // The return value of the subscribe function could be undefined if the store is a custom generic store.
+
+- unsubscribers.forEach(function (unsubscribe) {
+- return unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();
+- });
++ unsubscribe();
++
+ renderQueue.flush(queueContext);
+ };
+- }, [registry, trapSelect, depsChangedFlag, isWithoutMapping]);
++ }, [registry, depsChangedFlag, isWithoutMapping]);
+ return isWithoutMapping ? registry.select(_mapSelect) : mapOutput;
+ }
+ //# sourceMappingURL=index.js.map
+\ No newline at end of file
From 2a04765701b3d3e4b16bab69362a6c75068b0016 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Sun, 26 May 2024 11:59:27 +0600
Subject: [PATCH 008/105] Replace additonal instances of
`__experimentalResolveSelect` with `resolveSelect`.
---
.../js/modules/analytics-4/datastore/audiences.js | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index 28946459364..d377acd9596 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -55,7 +55,7 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
startDate,
endDate
) {
- const { select, __experimentalResolveSelect } = registry;
+ const { select, resolveSelect } = registry;
const reportOptions = {
metrics: [ { name: 'totalUsers' } ],
@@ -67,9 +67,9 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
endDate,
};
- const report = await __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getReport( reportOptions );
+ const report = await resolveSelect( MODULES_ANALYTICS_4 ).getReport(
+ reportOptions
+ );
const error = select( MODULES_ANALYTICS_4 ).getErrorForSelector(
'getReport',
@@ -189,7 +189,7 @@ const baseActions = {
*enableAudienceGroup() {
const registry = yield Data.commonActions.getRegistry();
- const { dispatch, select, __experimentalResolveSelect } = registry;
+ const { dispatch, select, resolveSelect } = registry;
const { response: availableAudiences, error: syncError } =
yield Data.commonActions.await(
@@ -303,9 +303,7 @@ const baseActions = {
// Create custom dimension if it doesn't exist.
yield Data.commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getAvailableCustomDimensions()
+ resolveSelect( MODULES_ANALYTICS_4 ).getAvailableCustomDimensions()
);
if (
From 0afa3c6a7c11e97b9f4874509ed97b0ac22495b0 Mon Sep 17 00:00:00 2001
From: Jimmy Madon
Date: Fri, 31 May 2024 13:23:03 +0100
Subject: [PATCH 009/105] Make user input heading container expand to full
width.
---
.../components/user-input/UserInputPreview.js | 31 +++++++++----------
1 file changed, 14 insertions(+), 17 deletions(-)
diff --git a/assets/js/components/user-input/UserInputPreview.js b/assets/js/components/user-input/UserInputPreview.js
index 2111d7d05cb..61f7c77c412 100644
--- a/assets/js/components/user-input/UserInputPreview.js
+++ b/assets/js/components/user-input/UserInputPreview.js
@@ -50,7 +50,6 @@ import useQueryArg from '../../hooks/useQueryArg';
import ErrorNotice from '../ErrorNotice';
import LoadingWrapper from '../LoadingWrapper';
import CancelUserInputButton from './CancelUserInputButton';
-import { Row, Cell } from '../../material-components';
import { hasErrorForAnswer } from './util/validation';
const { useSelect } = Data;
@@ -129,22 +128,20 @@ export default function UserInputPreview( props ) {
) }
{ settingsView && (
-
-
-
-
- { __(
- 'Edit your answers for more personalized metrics:',
- 'google-site-kit'
- ) }
-
-
- |
-
+
+
+
+ { __(
+ 'Edit your answers for more personalized metrics:',
+ 'google-site-kit'
+ ) }
+
+
+
) }
Date: Wed, 12 Jun 2024 12:53:30 +0530
Subject: [PATCH 010/105] Handle errors.
---
.../analytics-4/datastore/audiences.js | 67 ++++++++++---------
1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index 2f2e0f3ff67..2e3a5b55c1d 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -77,7 +77,6 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
);
if ( error ) {
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
return { error };
}
@@ -185,6 +184,8 @@ const baseActions = {
* If the `googlesitekit_post_type` custom dimension doesn't exist, creates it.
*
* @since 1.128.0
+ *
+ * @return {Object} Object with `response` and `error`.
*/
*enableAudienceGroup() {
const registry = yield Data.commonActions.getRegistry();
@@ -197,8 +198,7 @@ const baseActions = {
);
if ( syncError ) {
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
- return;
+ return { error: syncError };
}
const userAudiences = availableAudiences.filter(
@@ -228,12 +228,13 @@ const baseActions = {
)
);
- if ( ! error ) {
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
- configuredAudiences.push(
- ...audienceResourceNames.slice( 0, MAX_INITIAL_AUDIENCES )
- );
+ if ( error ) {
+ return { error };
}
+
+ configuredAudiences.push(
+ ...audienceResourceNames.slice( 0, MAX_INITIAL_AUDIENCES )
+ );
}
if ( configuredAudiences.length < MAX_INITIAL_AUDIENCES ) {
@@ -284,17 +285,19 @@ const baseActions = {
] )
);
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
- if ( ! newVisitorsResult.error ) {
- configuredAudiences.push( newVisitorsResult.response.name );
+ if ( newVisitorsResult.error ) {
+ return { error: newVisitorsResult.error };
}
- if ( ! returningVisitorsResult.error ) {
- configuredAudiences.push(
- returningVisitorsResult.response.name
- );
+ if ( returningVisitorsResult.error ) {
+ return { error: returningVisitorsResult.error };
}
+ configuredAudiences.push(
+ newVisitorsResult.response.name,
+ returningVisitorsResult.response.name
+ );
+
// Resync available audiences to ensure the newly created audiences are available.
yield Data.commonActions.await(
dispatch( MODULES_ANALYTICS_4 ).syncAvailableAudiences()
@@ -323,24 +326,24 @@ const baseActions = {
);
if ( error ) {
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
- } else {
- // If the custom dimension was created successfully, mark it as gathering
- // data immediately so that it doesn't cause unnecessary report requests.
+ return { error };
+ }
+
+ // If the custom dimension was created successfully, mark it as gathering
+ // data immediately so that it doesn't cause unnecessary report requests.
+ dispatch(
+ MODULES_ANALYTICS_4
+ ).receiveIsCustomDimensionGatheringData(
+ 'googlesitekit_post_type',
+ true
+ );
+
+ // Resync available custom dimensions to ensure the newly created custom dimension is available.
+ yield Data.commonActions.await(
dispatch(
MODULES_ANALYTICS_4
- ).receiveIsCustomDimensionGatheringData(
- 'googlesitekit_post_type',
- true
- );
-
- // Resync available custom dimensions to ensure the newly created custom dimension is available.
- yield Data.commonActions.await(
- dispatch(
- MODULES_ANALYTICS_4
- ).fetchSyncAvailableCustomDimensions()
- );
- }
+ ).fetchSyncAvailableCustomDimensions()
+ );
}
dispatch( MODULES_ANALYTICS_4 ).setConfiguredAudiences(
@@ -352,7 +355,7 @@ const baseActions = {
);
if ( error ) {
- // TODO: Full error handling will be implemented via https://github.com/google/site-kit-wp/issues/8134.
+ return { error };
}
},
};
From f59c18dcca001980b14b1e20a9062f6f6a88e309 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Wed, 12 Jun 2024 14:13:19 +0530
Subject: [PATCH 011/105] Add failedSiteKitAudienceResourceNames param.
---
.../analytics-4/datastore/audiences.js | 104 ++++++++++--------
1 file changed, 56 insertions(+), 48 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index 2e3a5b55c1d..625dd77428f 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -184,10 +184,13 @@ const baseActions = {
* If the `googlesitekit_post_type` custom dimension doesn't exist, creates it.
*
* @since 1.128.0
+ * @since n.e.x.t Added `failedSiteKitAudienceResourceNames` parameter to retry failed Site Kit audience creation.
*
+ * @param {Object} args Arguments for enabling audience group.
+ * @param {Array} args.failedSiteKitAudienceResourceNames List of failed Site Kit audience resource names to retry.
* @return {Object} Object with `response` and `error`.
*/
- *enableAudienceGroup() {
+ *enableAudienceGroup( { failedSiteKitAudienceResourceNames } ) {
const registry = yield Data.commonActions.getRegistry();
const { dispatch, select, __experimentalResolveSelect } = registry;
@@ -207,65 +210,70 @@ const baseActions = {
const configuredAudiences = [];
- if ( userAudiences.length > 0 ) {
- // If there are user audiences, filter and sort them by total users over the last 90 days,
- // and add the top two (MAX_INITIAL_AUDIENCES) which have users to the configured audiences.
+ if ( ! failedSiteKitAudienceResourceNames ) {
+ if ( userAudiences.length > 0 ) {
+ // If there are user audiences, filter and sort them by total users over the last 90 days,
+ // and add the top two (MAX_INITIAL_AUDIENCES) which have users to the configured audiences.
- const endDate = select( CORE_USER ).getReferenceDate();
+ const endDate = select( CORE_USER ).getReferenceDate();
- const startDate = getPreviousDate(
- endDate,
- 90 + DATE_RANGE_OFFSET // Add offset to ensure we have data for the entirety of the last 90 days.
- );
-
- const { audienceResourceNames, error } =
- yield Data.commonActions.await(
- getNonZeroDataAudiencesSortedByTotalUsers(
- registry,
- userAudiences,
- startDate,
- endDate
- )
+ const startDate = getPreviousDate(
+ endDate,
+ 90 + DATE_RANGE_OFFSET // Add offset to ensure we have data for the entirety of the last 90 days.
);
- if ( error ) {
- return { error };
- }
+ const { audienceResourceNames, error } =
+ yield Data.commonActions.await(
+ getNonZeroDataAudiencesSortedByTotalUsers(
+ registry,
+ userAudiences,
+ startDate,
+ endDate
+ )
+ );
- configuredAudiences.push(
- ...audienceResourceNames.slice( 0, MAX_INITIAL_AUDIENCES )
- );
- }
+ if ( error ) {
+ return { error };
+ }
- if ( configuredAudiences.length < MAX_INITIAL_AUDIENCES ) {
- // If there are less than two (MAX_INITIAL_AUDIENCES) configured user audiences, add the Site Kit-created audiences if they exist,
- // up to the limit of two.
+ configuredAudiences.push(
+ ...audienceResourceNames.slice( 0, MAX_INITIAL_AUDIENCES )
+ );
+ }
- const siteKitAudiences = availableAudiences.filter(
- ( { audienceType } ) => audienceType === 'SITE_KIT_AUDIENCE'
- );
+ if ( configuredAudiences.length < MAX_INITIAL_AUDIENCES ) {
+ // If there are less than two (MAX_INITIAL_AUDIENCES) configured user audiences, add the Site Kit-created audiences if they exist,
+ // up to the limit of two.
- // Audience slugs to sort by:
- const sortedSlugs = [ 'new-visitors', 'returning-visitors' ];
+ const siteKitAudiences = availableAudiences.filter(
+ ( { audienceType } ) => audienceType === 'SITE_KIT_AUDIENCE'
+ );
- const sortedSiteKitAudiences = siteKitAudiences.sort(
- ( audienceA, audienceB ) => {
- const indexA = sortedSlugs.indexOf(
- audienceA.audienceSlug
- );
- const indexB = sortedSlugs.indexOf(
- audienceB.audienceSlug
- );
+ // Audience slugs to sort by:
+ const sortedSlugs = [ 'new-visitors', 'returning-visitors' ];
- return indexA - indexB;
- }
- );
+ const sortedSiteKitAudiences = siteKitAudiences.sort(
+ ( audienceA, audienceB ) => {
+ const indexA = sortedSlugs.indexOf(
+ audienceA.audienceSlug
+ );
+ const indexB = sortedSlugs.indexOf(
+ audienceB.audienceSlug
+ );
+
+ return indexA - indexB;
+ }
+ );
- const audienceResourceNames = sortedSiteKitAudiences
- .slice( 0, MAX_INITIAL_AUDIENCES - configuredAudiences.length )
- .map( ( { name } ) => name );
+ const audienceResourceNames = sortedSiteKitAudiences
+ .slice(
+ 0,
+ MAX_INITIAL_AUDIENCES - configuredAudiences.length
+ )
+ .map( ( { name } ) => name );
- configuredAudiences.push( ...audienceResourceNames );
+ configuredAudiences.push( ...audienceResourceNames );
+ }
}
if ( configuredAudiences.length === 0 ) {
From 91bbe568b28012d537b4151152ce5363d31f6bc9 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 13 Jun 2024 11:01:02 +0530
Subject: [PATCH 012/105] Handle retry logic.
---
.../analytics-4/datastore/audiences.js | 47 ++++++++++++-------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index 625dd77428f..55d59a0b1ee 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -188,7 +188,7 @@ const baseActions = {
*
* @param {Object} args Arguments for enabling audience group.
* @param {Array} args.failedSiteKitAudienceResourceNames List of failed Site Kit audience resource names to retry.
- * @return {Object} Object with `response` and `error`.
+ * @return {Object} Object with `failedSiteKitAudienceResourceNames` and `error`.
*/
*enableAudienceGroup( { failedSiteKitAudienceResourceNames } ) {
const registry = yield Data.commonActions.getRegistry();
@@ -277,34 +277,47 @@ const baseActions = {
}
if ( configuredAudiences.length === 0 ) {
+ const audiencesToCreate = failedSiteKitAudienceResourceNames || [
+ 'new-visitors',
+ 'returning-visitors',
+ ];
+
// If there are no configured audiences by this point, create the "new-visitors" and "returning-visitors" audiences,
// and add them to the configured audiences.
const [ newVisitorsResult, returningVisitorsResult ] =
yield Data.commonActions.await(
- Promise.all( [
- dispatch( MODULES_ANALYTICS_4 ).createAudience(
- SITE_KIT_AUDIENCE_DEFINITIONS[ 'new-visitors' ]
- ),
- dispatch( MODULES_ANALYTICS_4 ).createAudience(
- SITE_KIT_AUDIENCE_DEFINITIONS[
- 'returning-visitors'
- ]
- ),
- ] )
+ Promise.all(
+ audiencesToCreate.map( ( audienceSlug ) => {
+ return dispatch(
+ MODULES_ANALYTICS_4
+ ).createAudience(
+ SITE_KIT_AUDIENCE_DEFINITIONS[ audienceSlug ]
+ );
+ } )
+ )
);
+ const failedAudiencesToRetry = [];
+
if ( newVisitorsResult.error ) {
- return { error: newVisitorsResult.error };
+ failedAudiencesToRetry.push( 'new-visitors' );
+ } else {
+ configuredAudiences.push( newVisitorsResult.response.name );
}
if ( returningVisitorsResult.error ) {
- return { error: returningVisitorsResult.error };
+ failedAudiencesToRetry.push( 'returning-visitors' );
+ } else {
+ configuredAudiences.push(
+ returningVisitorsResult.response.name
+ );
}
- configuredAudiences.push(
- newVisitorsResult.response.name,
- returningVisitorsResult.response.name
- );
+ if ( failedAudiencesToRetry.length > 0 ) {
+ return {
+ failedSiteKitAudienceResourceNames: failedAudiencesToRetry,
+ };
+ }
// Resync available audiences to ensure the newly created audiences are available.
yield Data.commonActions.await(
From bbb52a350d616eb43e89be08adb7acf0b6dc8b6a Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Mon, 24 Jun 2024 19:31:58 +0530
Subject: [PATCH 013/105] Add buttonLink prop to ModalDialog.
---
assets/js/components/ModalDialog.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/assets/js/components/ModalDialog.js b/assets/js/components/ModalDialog.js
index 19e30472d07..ff25cc76324 100644
--- a/assets/js/components/ModalDialog.js
+++ b/assets/js/components/ModalDialog.js
@@ -57,6 +57,7 @@ function ModalDialog( {
inProgress = false,
small = false,
medium = false,
+ buttonLink = null,
} ) {
const instanceID = useInstanceId( ModalDialog );
const describedByID = `googlesitekit-dialog-description-${ instanceID }`;
@@ -130,6 +131,8 @@ function ModalDialog( {
danger={ danger }
disabled={ inProgress }
isSaving={ inProgress }
+ href={ buttonLink || undefined }
+ target={ buttonLink ? '_blank' : undefined }
>
{ confirmButton || __( 'Disconnect', 'google-site-kit' ) }
@@ -150,6 +153,7 @@ ModalDialog.propTypes = {
danger: PropTypes.bool,
small: PropTypes.bool,
medium: PropTypes.bool,
+ buttonLink: PropTypes.string,
};
export default ModalDialog;
From d99fbae7d2bd13c9e9b7762c36db5a3d0d31dc18 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 12:32:53 +0530
Subject: [PATCH 014/105] Fix merge conflicts.
---
.../analytics-4/datastore/audiences.js | 223 +++++++++---------
1 file changed, 107 insertions(+), 116 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index b62bc7502d7..2edbce87637 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -241,150 +241,141 @@ const baseActions = {
configuredAudiences.push(
...audienceResourceNames.slice( 0, MAX_INITIAL_AUDIENCES )
);
+ }
- if ( configuredAudiences.length < MAX_INITIAL_AUDIENCES ) {
- // If there are less than two (MAX_INITIAL_AUDIENCES) configured user audiences, add the Site Kit-created audiences if they exist,
- // up to the limit of two.
+ if ( configuredAudiences.length < MAX_INITIAL_AUDIENCES ) {
+ // If there are less than two (MAX_INITIAL_AUDIENCES) configured user audiences, add the Site Kit-created audiences if they exist,
+ // up to the limit of two.
- const siteKitAudiences = availableAudiences.filter(
- ( { audienceType } ) =>
- audienceType === 'SITE_KIT_AUDIENCE'
- );
+ const siteKitAudiences = availableAudiences.filter(
+ ( { audienceType } ) => audienceType === 'SITE_KIT_AUDIENCE'
+ );
- // Audience slugs to sort by:
- const sortedSlugs = [
- 'new-visitors',
- 'returning-visitors',
- ];
+ // Audience slugs to sort by:
+ const sortedSlugs = [ 'new-visitors', 'returning-visitors' ];
- const sortedSiteKitAudiences = siteKitAudiences.sort(
- ( audienceA, audienceB ) => {
- const indexA = sortedSlugs.indexOf(
- audienceA.audienceSlug
- );
- const indexB = sortedSlugs.indexOf(
- audienceB.audienceSlug
- );
+ const sortedSiteKitAudiences = siteKitAudiences.sort(
+ ( audienceA, audienceB ) => {
+ const indexA = sortedSlugs.indexOf(
+ audienceA.audienceSlug
+ );
+ const indexB = sortedSlugs.indexOf(
+ audienceB.audienceSlug
+ );
- return indexA - indexB;
- }
- );
+ return indexA - indexB;
+ }
+ );
- const sortedAudienceResourceNames = sortedSiteKitAudiences
- .slice(
- 0,
- MAX_INITIAL_AUDIENCES - configuredAudiences.length
- )
- .map( ( { name } ) => name );
+ const audienceResourceNames = sortedSiteKitAudiences
+ .slice(
+ 0,
+ MAX_INITIAL_AUDIENCES - configuredAudiences.length
+ )
+ .map( ( { name } ) => name );
- configuredAudiences.push( ...sortedAudienceResourceNames );
- }
+ configuredAudiences.push( ...audienceResourceNames );
}
+ }
- if ( configuredAudiences.length === 0 ) {
- const audiencesToCreate =
- failedSiteKitAudienceResourceNames || [
- 'new-visitors',
- 'returning-visitors',
- ];
-
- // If there are no configured audiences by this point, create the "new-visitors" and "returning-visitors" audiences,
- // and add them to the configured audiences.
- const [ newVisitorsResult, returningVisitorsResult ] =
- yield commonActions.await(
- Promise.all(
- audiencesToCreate.map( ( audienceSlug ) => {
- return dispatch(
- MODULES_ANALYTICS_4
- ).createAudience(
- SITE_KIT_AUDIENCE_DEFINITIONS[
- audienceSlug
- ]
- );
- } )
- )
- );
-
- const failedAudiencesToRetry = [];
+ if ( configuredAudiences.length === 0 ) {
+ const audiencesToCreate = failedSiteKitAudienceResourceNames || [
+ 'new-visitors',
+ 'returning-visitors',
+ ];
- if ( newVisitorsResult.error ) {
- failedAudiencesToRetry.push( 'new-visitors' );
- } else {
- configuredAudiences.push( newVisitorsResult.response.name );
- }
+ // If there are no configured audiences by this point, create the "new-visitors" and "returning-visitors" audiences,
+ // and add them to the configured audiences.
+ const [ newVisitorsResult, returningVisitorsResult ] =
+ yield commonActions.await(
+ Promise.all(
+ audiencesToCreate.map( ( audienceSlug ) => {
+ return dispatch(
+ MODULES_ANALYTICS_4
+ ).createAudience(
+ SITE_KIT_AUDIENCE_DEFINITIONS[ audienceSlug ]
+ );
+ } )
+ )
+ );
- if ( returningVisitorsResult.error ) {
- failedAudiencesToRetry.push( 'returning-visitors' );
- } else {
- configuredAudiences.push(
- returningVisitorsResult.response.name
- );
- }
+ const failedAudiencesToRetry = [];
- if ( failedAudiencesToRetry.length > 0 ) {
- return {
- failedSiteKitAudienceResourceNames:
- failedAudiencesToRetry,
- };
- }
+ if ( newVisitorsResult.error ) {
+ failedAudiencesToRetry.push( 'new-visitors' );
+ } else {
+ configuredAudiences.push( newVisitorsResult.response.name );
+ }
- // Resync available audiences to ensure the newly created audiences are available.
- yield commonActions.await(
- dispatch( MODULES_ANALYTICS_4 ).syncAvailableAudiences()
+ if ( returningVisitorsResult.error ) {
+ failedAudiencesToRetry.push( 'returning-visitors' );
+ } else {
+ configuredAudiences.push(
+ returningVisitorsResult.response.name
);
}
- // Create custom dimension if it doesn't exist.
+ if ( failedAudiencesToRetry.length > 0 ) {
+ return {
+ failedSiteKitAudienceResourceNames: failedAudiencesToRetry,
+ };
+ }
+
+ // Resync available audiences to ensure the newly created audiences are available.
yield commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getAvailableCustomDimensions()
+ dispatch( MODULES_ANALYTICS_4 ).syncAvailableAudiences()
);
+ }
+
+ // Create custom dimension if it doesn't exist.
+ yield commonActions.await(
+ __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getAvailableCustomDimensions()
+ );
- if (
- ! select( MODULES_ANALYTICS_4 ).hasCustomDimensions(
- 'googlesitekit_post_type'
+ if (
+ ! select( MODULES_ANALYTICS_4 ).hasCustomDimensions(
+ 'googlesitekit_post_type'
+ )
+ ) {
+ const propertyID = select( MODULES_ANALYTICS_4 ).getPropertyID();
+
+ const { error } = yield commonActions.await(
+ dispatch( MODULES_ANALYTICS_4 ).fetchCreateCustomDimension(
+ propertyID,
+ CUSTOM_DIMENSION_DEFINITIONS.googlesitekit_post_type
)
- ) {
- const propertyID =
- select( MODULES_ANALYTICS_4 ).getPropertyID();
-
- const { error } = yield commonActions.await(
- dispatch( MODULES_ANALYTICS_4 ).fetchCreateCustomDimension(
- propertyID,
- CUSTOM_DIMENSION_DEFINITIONS.googlesitekit_post_type
- )
- );
+ );
- if ( error ) {
- return { error };
- }
+ if ( error ) {
+ return { error };
+ }
- // If the custom dimension was created successfully, mark it as gathering
- // data immediately so that it doesn't cause unnecessary report requests.
+ // If the custom dimension was created successfully, mark it as gathering
+ // data immediately so that it doesn't cause unnecessary report requests.
+ dispatch(
+ MODULES_ANALYTICS_4
+ ).receiveIsCustomDimensionGatheringData(
+ 'googlesitekit_post_type',
+ true
+ );
+
+ yield commonActions.await(
dispatch(
MODULES_ANALYTICS_4
).receiveIsCustomDimensionGatheringData(
'googlesitekit_post_type',
true
- );
-
- yield commonActions.await(
- dispatch(
- MODULES_ANALYTICS_4
- ).receiveIsCustomDimensionGatheringData(
- 'googlesitekit_post_type',
- true
- )
- );
+ )
+ );
- // Resync available custom dimensions to ensure the newly created custom dimension is available.
- yield commonActions.await(
- dispatch(
- MODULES_ANALYTICS_4
- ).fetchSyncAvailableCustomDimensions()
- );
- }
+ // Resync available custom dimensions to ensure the newly created custom dimension is available.
+ yield commonActions.await(
+ dispatch(
+ MODULES_ANALYTICS_4
+ ).fetchSyncAvailableCustomDimensions()
+ );
}
dispatch( MODULES_ANALYTICS_4 ).setConfiguredAudiences(
From d22d36e18f96dc68acfb68b75b5fad327d03b62b Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 12:41:06 +0530
Subject: [PATCH 015/105] Remove code duplication.
---
assets/js/modules/analytics-4/datastore/audiences.js | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index 2edbce87637..b01c7295e0f 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -361,15 +361,6 @@ const baseActions = {
true
);
- yield commonActions.await(
- dispatch(
- MODULES_ANALYTICS_4
- ).receiveIsCustomDimensionGatheringData(
- 'googlesitekit_post_type',
- true
- )
- );
-
// Resync available custom dimensions to ensure the newly created custom dimension is available.
yield commonActions.await(
dispatch(
From 64caec5b3df38f33c8792b97115a7908b8d571ac Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:33:31 +0530
Subject: [PATCH 016/105] Add AudienceErrorModal component.
---
.../dashboard/AudienceErrorModal.js | 127 ++++++++++++++++++
1 file changed, 127 insertions(+)
create mode 100644 assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
new file mode 100644
index 00000000000..19ed151b945
--- /dev/null
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
@@ -0,0 +1,127 @@
+/**
+ * Audience Segmentation AudienceErrorModal component.
+ *
+ * Site Kit by Google, Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * External dependencies
+ */
+import PropTypes from 'prop-types';
+
+/**
+ * WordPress dependencies
+ */
+import { createInterpolateElement } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import { useSelect } from 'googlesitekit-data';
+import ModalDialog from '../../../../../components/ModalDialog';
+import { isInsufficientPermissionsError } from '../../../../../util/errors';
+import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
+import Link from '../../../../../components/Link';
+import { MODULES_ANALYTICS_4 } from '../../../datastore/constants';
+
+export default function AudienceErrorModal( {
+ hasOAuthError,
+ apiErrors,
+ onRetry = () => {},
+ inProgress,
+} ) {
+ const errors = Array.isArray( apiErrors ) ? apiErrors : [ apiErrors ];
+ const hasInsufficientPermissionsError = errors.some( ( error ) =>
+ isInsufficientPermissionsError( error )
+ );
+
+ const helpLink = useSelect( ( select ) =>
+ select( CORE_SITE ).getErrorTroubleshootingLinkURL( {
+ code: 'analytics-4_insufficient_permissions',
+ } )
+ );
+
+ const requestAccessURL = useSelect( ( select ) =>
+ select( MODULES_ANALYTICS_4 ).getServiceEntityAccessURL()
+ );
+
+ let title, description, confirmButton, buttonLink;
+
+ if ( hasOAuthError ) {
+ title = __( 'Analytics update failed', 'google-site-kit' );
+ description = createInterpolateElement(
+ __(
+ 'Setup was interrupted because you did not grant the necessary permissions. ',
+ 'google-site-kit'
+ ),
+ {
+ HelpLink: (
+
+ { __( 'Get help', 'google-site-kit' ) }
+
+ ),
+ }
+ );
+ confirmButton = __( 'Retry', 'google-site-kit' );
+ } else if ( hasInsufficientPermissionsError ) {
+ title = __( 'Insufficient permissions', 'google-site-kit' );
+ description = createInterpolateElement(
+ __(
+ 'You’ll need to contact your administrator. Trouble getting access? ',
+ 'google-site-kit'
+ ),
+ {
+ HelpLink: (
+
+ { __( 'Get help', 'google-site-kit' ) }
+
+ ),
+ }
+ );
+ confirmButton = __( 'Request access', 'google-site-kit' );
+ buttonLink = requestAccessURL;
+ } else {
+ title = __( 'Failed to set up visitor groups', 'google-site-kit' );
+ description = __(
+ 'Oops! Something went wrong. Retry enabling groups.',
+ 'google-site-kit'
+ );
+ confirmButton = __( 'Retry', 'google-site-kit' );
+ }
+
+ return (
+
+ );
+}
+
+AudienceErrorModal.propTypes = {
+ hasOAuthError: PropTypes.bool,
+ apiErrors: PropTypes.oneOfType( [
+ PropTypes.arrayOf( PropTypes.object ),
+ PropTypes.object,
+ ] ),
+ onRetry: PropTypes.func,
+ inProgress: PropTypes.bool,
+};
From 58470bd8367f34893119a28c0bd0ad50c701e2aa Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:34:02 +0530
Subject: [PATCH 017/105] Render Button component if buttonLink is provided.
---
assets/js/components/ModalDialog.js | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/assets/js/components/ModalDialog.js b/assets/js/components/ModalDialog.js
index ff25cc76324..2a517aceaf4 100644
--- a/assets/js/components/ModalDialog.js
+++ b/assets/js/components/ModalDialog.js
@@ -126,16 +126,25 @@ function ModalDialog( {
>
{ __( 'Cancel', 'google-site-kit' ) }
-
- { confirmButton || __( 'Disconnect', 'google-site-kit' ) }
-
+ { buttonLink ? (
+
+ ) : (
+
+ { confirmButton ||
+ __( 'Disconnect', 'google-site-kit' ) }
+
+ ) }
);
From eeb3242c655cefcb32be2cefb57c447953f96f31 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:34:30 +0530
Subject: [PATCH 018/105] Return null if skipDefaultErrorNotifications
available in ErrorNotifications.
---
assets/js/components/notifications/ErrorNotifications.js | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/assets/js/components/notifications/ErrorNotifications.js b/assets/js/components/notifications/ErrorNotifications.js
index 37c4f45ff76..b3b53e84b76 100644
--- a/assets/js/components/notifications/ErrorNotifications.js
+++ b/assets/js/components/notifications/ErrorNotifications.js
@@ -108,6 +108,12 @@ export default function ErrorNotifications() {
}
}
+ if (
+ temporaryPersistedPermissionsError?.data?.skipDefaultErrorNotifications
+ ) {
+ return null;
+ }
+
return (
From 67744271b27d1d42c5aa8a3d08541f176b93813e Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:34:50 +0530
Subject: [PATCH 019/105] Return null if skipDefaultErrorNotifications
available in SetupErrorNotification.
---
.../notifications/SetupErrorNotification.js | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/assets/js/components/notifications/SetupErrorNotification.js b/assets/js/components/notifications/SetupErrorNotification.js
index 1c3be41aa6d..a74043271b1 100644
--- a/assets/js/components/notifications/SetupErrorNotification.js
+++ b/assets/js/components/notifications/SetupErrorNotification.js
@@ -27,6 +27,8 @@ import { __ } from '@wordpress/i18n';
import { useSelect } from 'googlesitekit-data';
import BannerNotification from './BannerNotification';
import { CORE_SITE } from '../../googlesitekit/datastore/site/constants';
+import { CORE_FORMS } from '../../googlesitekit/datastore/forms/constants';
+import { FORM_TEMPORARY_PERSIST_PERMISSION_ERROR } from '../../googlesitekit/datastore/user/constants';
export default function SetupErrorNotification() {
// These will be `null` if no errors exist.
@@ -37,7 +39,19 @@ export default function SetupErrorNotification() {
select( CORE_SITE ).getSetupErrorRedoURL()
);
- if ( ! setupErrorMessage ) {
+ const { data: permissionsErrorData } = useSelect(
+ ( select ) =>
+ select( CORE_FORMS ).getValue(
+ FORM_TEMPORARY_PERSIST_PERMISSION_ERROR,
+ 'permissionsError'
+ ) || {}
+ );
+
+ // If there's no setup error message or the temporary persisted permissions error has skipDefaultErrorNotifications flag set, return null.
+ if (
+ ! setupErrorMessage ||
+ permissionsErrorData?.skipDefaultErrorNotifications
+ ) {
return null;
}
From ee5986ac4abfad2fbadbef3f5890d75a533a78b0 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:35:15 +0530
Subject: [PATCH 020/105] Add AudienceErrorModal stories - WIP.
---
.../dashboard/AudienceErrorModal.stories.js | 111 ++++++++++++++++++
1 file changed, 111 insertions(+)
create mode 100644 assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
new file mode 100644
index 00000000000..c4ba13e64c5
--- /dev/null
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
@@ -0,0 +1,111 @@
+/**
+ * AudienceErrorModal Component Stories.
+ *
+ * Site Kit by Google, Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Internal dependencies
+ */
+import { ERROR_REASON_INSUFFICIENT_PERMISSIONS } from '../../../../../util/errors';
+import { MODULES_ANALYTICS_4 } from '../../../datastore/constants';
+// import { useSelect } from 'googlesitekit-data';
+import {
+ // WithTestRegistry,
+ // createTestRegistry,
+ provideModules,
+ provideModuleRegistrations,
+ // provideUserInfo,
+ provideSiteInfo,
+} from '../../../../../../../tests/js/test-utils';
+import WithRegistrySetup from '../../../../../../../tests/js/WithRegistrySetup';
+import AudienceErrorModal from './AudienceErrorModal';
+
+function Template( args ) {
+ return ;
+}
+
+export const Default = Template.bind( {} );
+Default.storyName = 'Default';
+Default.args = {
+ onRetry: () => {},
+};
+
+export const WithInsufficientPermissionsError = Template.bind( {} );
+WithInsufficientPermissionsError.storyName = 'Insufficient permissions error';
+WithInsufficientPermissionsError.args = {
+ apiErrors: {
+ code: 'test_error',
+ message: 'Error message.',
+ data: { reason: ERROR_REASON_INSUFFICIENT_PERMISSIONS },
+ },
+};
+WithInsufficientPermissionsError.scenario = {
+ label: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal/WithInsufficientPermissionsError',
+};
+
+export const WithOAuthError = Template.bind( {} );
+WithOAuthError.storyName = 'OAuth error';
+WithOAuthError.args = {
+ hasOAuthError: true,
+ onRetry: () => {},
+};
+WithOAuthError.scenario = {
+ label: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal/WithOAuthError',
+};
+
+// export const AudienceSyncError = Template.bind( {} );
+// AudienceSyncError.storyName = 'Audience sync error';
+// AudienceSyncError.args = {
+// setupRegistry: ( registry ) => {
+// const error = {
+// code: 'test_error',
+// message: 'Error message.',
+// data: {},
+// };
+
+// registry
+// .dispatch( MODULES_ANALYTICS_4 )
+// .receiveError( error, 'syncAvailableAudiences' );
+// },
+// };
+
+export default {
+ title: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal',
+ // component: AudienceErrorModal,
+ decorators: [
+ ( Story ) => {
+ const setupRegistry = ( registry ) => {
+ provideSiteInfo( registry );
+ provideModules( registry );
+ provideModuleRegistrations( registry );
+
+ // This is necessary to populate the service entity access URL.
+ registry.dispatch( MODULES_ANALYTICS_4 ).receiveGetSettings( {
+ accountID: '12345',
+ propertyID: '34567',
+ measurementID: '56789',
+ webDataStreamID: '78901',
+ } );
+ };
+
+ return (
+
+
+
+ );
+ },
+ ],
+};
From 284cf8dbb7fc758a429fd16a648080e617c5f153 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Tue, 25 Jun 2024 21:35:40 +0530
Subject: [PATCH 021/105] Add logic to render AudienceErrorModal in the setup
CTA.
---
.../AudienceSegmentationSetupCTAWidget.js | 123 +++++++++++++-----
1 file changed, 92 insertions(+), 31 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
index 2cda3a19e17..399c0fa13f2 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
@@ -59,6 +59,8 @@ import {
} from '../../../../../components/AdminMenuTooltip';
import { withWidgetComponentProps } from '../../../../../googlesitekit/widgets/util';
import { WEEK_IN_SECONDS } from '../../../../../util';
+import AudienceErrorModal from './AudienceErrorModal';
+import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
export const AUDIENCE_SEGMENTATION_SETUP_CTA_NOTIFICATION =
'audience_segmentation_setup_cta-notification';
@@ -110,43 +112,66 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
notification: 'audience_segmentation',
} );
- const onEnableGroups = useCallback( async () => {
- setIsSaving( true );
+ const [ apiErrors, setApiErrors ] = useState( [] );
+ const [ failedAudiences, setFailedAudiences ] = useState( [] );
+ const onEnableGroups = useCallback(
+ async ( retryFailedAudiences ) => {
+ setIsSaving( true );
+
+ // If scope not granted, trigger scope error right away. These are
+ // typically handled automatically based on API responses, but
+ // this particular case has some special handling to improve UX.
+ if ( ! hasAnalytics4EditScope ) {
+ setValues( AUDIENCE_SEGMENTATION_SETUP_FORM, {
+ autoSubmit: true,
+ } );
+
+ setPermissionScopeError( {
+ code: ERROR_CODE_MISSING_REQUIRED_SCOPE,
+ message: __(
+ 'Additional permissions are required to create new audiences in Analytics.',
+ 'google-site-kit'
+ ),
+ data: {
+ status: 403,
+ scopes: [ EDIT_SCOPE ],
+ skipModal: true,
+ skipDefaultErrorNotifications: true,
+ redirectURL,
+ },
+ } );
+
+ setIsSaving( false );
+ return;
+ }
- // If scope not granted, trigger scope error right away. These are
- // typically handled automatically based on API responses, but
- // this particular case has some special handling to improve UX.
- if ( ! hasAnalytics4EditScope ) {
setValues( AUDIENCE_SEGMENTATION_SETUP_FORM, {
- autoSubmit: true,
+ autoSubmit: false,
} );
- setPermissionScopeError( {
- code: ERROR_CODE_MISSING_REQUIRED_SCOPE,
- message: __(
- 'Additional permissions are required to create new audiences in Analytics.',
- 'google-site-kit'
- ),
- data: {
- status: 403,
- scopes: [ EDIT_SCOPE ],
- skipModal: true,
- redirectURL,
- },
- } );
+ const { error, failedSiteKitAudienceResourceNames } =
+ await enableAudienceGroup( {
+ failedSiteKitAudienceResourceNames: retryFailedAudiences,
+ } );
- return;
- }
+ if ( error ) {
+ setApiErrors( [ error ] );
+ }
- setValues( AUDIENCE_SEGMENTATION_SETUP_FORM, { autoSubmit: false } );
- await enableAudienceGroup();
- }, [
- enableAudienceGroup,
- hasAnalytics4EditScope,
- setPermissionScopeError,
- redirectURL,
- setValues,
- ] );
+ if ( failedSiteKitAudienceResourceNames ) {
+ setFailedAudiences( failedSiteKitAudienceResourceNames );
+ }
+
+ setIsSaving( false );
+ },
+ [
+ enableAudienceGroup,
+ hasAnalytics4EditScope,
+ setPermissionScopeError,
+ redirectURL,
+ setValues,
+ ]
+ );
// If the user ends up back on this component with the required scope granted,
// and already submitted the form, trigger the submit again.
@@ -182,6 +207,12 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
}
};
+ const setupErrorCode = useSelect( ( select ) =>
+ select( CORE_SITE ).getSetupErrorCode()
+ );
+
+ const hasOAuthError = autoSubmit && setupErrorCode;
+
if ( isTooltipVisible ) {
return (
@@ -213,6 +244,36 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
return null;
}
+ if ( hasOAuthError ) {
+ return (
+
+ );
+ }
+
+ if ( apiErrors.length ) {
+ return (
+
+ );
+ }
+
+ if ( failedAudiences.length ) {
+ return (
+ onEnableGroups( failedAudiences ) }
+ inProgress={ isSaving }
+ />
+ );
+ }
+
// TODO: We need to refactor this and the ConsentModeSetupCTAWidget to avoid this duplicate inlining of the widget context and area structure,
// and to ensure only one of these setup CTAs is shown at a time. This will be handled in a subsequent issue.
return (
From 939fe94c696cbbd38d42958b40f6968f085462f0 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Thu, 27 Jun 2024 15:45:53 +0600
Subject: [PATCH 022/105] Revert `__experimentalResolveSelect` replacement.
---
.../SettingsActiveModule/index.test.js | 2 +-
.../datastore/site/enable-auto-update.js | 4 +-
.../js/googlesitekit/datastore/site/html.js | 4 +-
.../datastore/user/feature-tours.js | 10 ++--
.../googlesitekit/datastore/user/surveys.js | 6 +-
.../datastore/user/surveys.test.js | 8 ++-
.../datastore/user/user-input-settings.js | 5 +-
.../modules/create-info-store.js | 7 ++-
.../modules/datastore/modules.js | 21 ++++---
.../modules/datastore/modules.test.js | 4 +-
.../datastore/sharing-settings.test.js | 58 +++++++++----------
assets/js/modules/ads/index.js | 2 +-
assets/js/modules/ads/pax/services.js | 9 ++-
assets/js/modules/adsense/index.js | 2 +-
.../datastore/audience-settings.js | 2 +-
.../analytics-4/datastore/audiences.js | 14 +++--
.../datastore/conversion-events.test.js | 4 +-
.../custom-dimensions-gathering-data.js | 19 +++---
.../datastore/custom-dimensions.js | 22 ++++---
.../datastore/enhanced-measurement.js | 4 +-
.../datastore/enhanced-measurement.test.js | 4 +-
.../analytics-4/datastore/partial-data.js | 23 +++++---
.../analytics-4/datastore/properties.js | 46 +++++++++------
.../js/modules/analytics-4/datastore/tags.js | 2 +-
.../analytics-4/datastore/webdatastreams.js | 8 +--
25 files changed, 167 insertions(+), 123 deletions(-)
diff --git a/assets/js/components/settings/SettingsActiveModule/index.test.js b/assets/js/components/settings/SettingsActiveModule/index.test.js
index 80ceb0c9ca3..c79d71eca75 100644
--- a/assets/js/components/settings/SettingsActiveModule/index.test.js
+++ b/assets/js/components/settings/SettingsActiveModule/index.test.js
@@ -247,7 +247,7 @@ describe( 'SettingsModule', () => {
// Hack to avoid act error due to state change during render.
await act( () =>
registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.canActivateModule( 'tagmanager' )
);
diff --git a/assets/js/googlesitekit/datastore/site/enable-auto-update.js b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
index db8aac08c55..02c3d15078a 100644
--- a/assets/js/googlesitekit/datastore/site/enable-auto-update.js
+++ b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
@@ -80,10 +80,10 @@ const baseActions = {
const registry = yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- registry.resolveSelect( CORE_USER ).getNonces()
+ registry.__experimentalResolveSelect( CORE_USER ).getNonces()
);
yield Data.commonActions.await(
- registry.resolveSelect( CORE_SITE ).getSiteInfo()
+ registry.__experimentalResolveSelect( CORE_SITE ).getSiteInfo()
);
const nonce = registry.select( CORE_USER ).getNonce( 'updates' );
diff --git a/assets/js/googlesitekit/datastore/site/html.js b/assets/js/googlesitekit/datastore/site/html.js
index 7330a5e20c0..06d01e0101d 100644
--- a/assets/js/googlesitekit/datastore/site/html.js
+++ b/assets/js/googlesitekit/datastore/site/html.js
@@ -146,7 +146,9 @@ const baseControls = {
[ WAIT_FOR_HTML_FOR_URL ]: createRegistryControl(
( registry ) =>
( { payload: { url } } ) =>
- registry.resolveSelect( CORE_SITE ).getHTMLForURL( url )
+ registry
+ .__experimentalResolveSelect( CORE_SITE )
+ .getHTMLForURL( url )
),
[ CHECK_FOR_SETUP_TAG ]: createRegistryControl(
( registry ) => async () => {
diff --git a/assets/js/googlesitekit/datastore/user/feature-tours.js b/assets/js/googlesitekit/datastore/user/feature-tours.js
index 4935af236a3..711400e60d2 100644
--- a/assets/js/googlesitekit/datastore/user/feature-tours.js
+++ b/assets/js/googlesitekit/datastore/user/feature-tours.js
@@ -198,10 +198,10 @@ const baseActions = {
},
*triggerTourForView( viewContext ) {
- const { select, resolveSelect } = yield getRegistry();
+ const { select, __experimentalResolveSelect } = yield getRegistry();
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getLastDismissedAt()
+ __experimentalResolveSelect( CORE_USER ).getLastDismissedAt()
);
if ( select( CORE_USER ).areFeatureToursOnCooldown() ) {
@@ -241,7 +241,7 @@ const baseControls = {
// Only tours with a version after a user's initial Site Kit version should qualify.
const initialVersion = await registry
- .resolveSelect( CORE_USER )
+ .__experimentalResolveSelect( CORE_USER )
.getInitialSiteKitVersion();
if ( ! initialVersion ) {
return false;
@@ -258,7 +258,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .resolveSelect( CORE_USER )
+ .__experimentalResolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
@@ -281,7 +281,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .resolveSelect( CORE_USER )
+ .__experimentalResolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
diff --git a/assets/js/googlesitekit/datastore/user/surveys.js b/assets/js/googlesitekit/datastore/user/surveys.js
index 17d6463e0ca..e4673fd7a65 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.js
@@ -182,12 +182,12 @@ const baseActions = {
},
function* ( triggerID, options = {} ) {
const { ttl = 0 } = options;
- const { select, dispatch, resolveSelect } =
+ const { select, dispatch, __experimentalResolveSelect } =
yield Data.commonActions.getRegistry();
// Wait for user authentication state to be available before selecting.
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getAuthentication()
+ __experimentalResolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -196,7 +196,7 @@ const baseActions = {
// Await for surveys to be resolved before checking timeouts.
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getSurveyTimeouts()
+ __experimentalResolveSelect( CORE_USER ).getSurveyTimeouts()
);
const isTimedOut =
diff --git a/assets/js/googlesitekit/datastore/user/surveys.test.js b/assets/js/googlesitekit/datastore/user/surveys.test.js
index 6165868f200..60b84e2ec50 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.test.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.test.js
@@ -222,14 +222,18 @@ describe( 'core/user surveys', () => {
provideUserAuthentication( registry );
- await registry.resolveSelect( CORE_USER ).getAuthentication();
+ await registry
+ .__experimentalResolveSelect( CORE_USER )
+ .getAuthentication();
muteFetch( surveyTriggerEndpoint );
muteFetch( surveyTimeoutEndpoint );
registry.dispatch( CORE_USER ).receiveGetSurveyTimeouts( [] );
- await registry.resolveSelect( CORE_USER ).getSurveyTimeouts();
+ await registry
+ .__experimentalResolveSelect( CORE_USER )
+ .getSurveyTimeouts();
jest.useFakeTimers();
diff --git a/assets/js/googlesitekit/datastore/user/user-input-settings.js b/assets/js/googlesitekit/datastore/user/user-input-settings.js
index aab3c7929c8..c5308cb1dc2 100644
--- a/assets/js/googlesitekit/datastore/user/user-input-settings.js
+++ b/assets/js/googlesitekit/datastore/user/user-input-settings.js
@@ -162,10 +162,11 @@ const baseActions = {
* @return {Object} Object with `response` and `error`.
*/
*maybeTriggerUserInputSurvey() {
- const { resolveSelect, dispatch } = yield commonActions.getRegistry();
+ const { __experimentalResolveSelect, dispatch } =
+ yield commonActions.getRegistry();
const settings = yield commonActions.await(
- resolveSelect( CORE_USER ).getUserInputSettings()
+ __experimentalResolveSelect( CORE_USER ).getUserInputSettings()
);
const settingsAnsweredOther = Object.keys( settings ).filter( ( key ) =>
diff --git a/assets/js/googlesitekit/modules/create-info-store.js b/assets/js/googlesitekit/modules/create-info-store.js
index c3abb40a0ff..313276f7ece 100644
--- a/assets/js/googlesitekit/modules/create-info-store.js
+++ b/assets/js/googlesitekit/modules/create-info-store.js
@@ -61,10 +61,11 @@ export const createInfoStore = (
const controls = {
[ WAIT_FOR_REAUTH_RESOLVERS ]: createRegistryControl(
( registry ) => async () => {
- const { resolveSelect } = registry;
+ const { __experimentalResolveSelect } = registry;
const { getAuthentication, getConnectURL } =
- resolveSelect( CORE_USER );
- const { getSiteInfo } = resolveSelect( CORE_SITE );
+ __experimentalResolveSelect( CORE_USER );
+ const { getSiteInfo } =
+ __experimentalResolveSelect( CORE_SITE );
await Promise.all( [
// Authentication is needed for checking `needsReauthentication`.
diff --git a/assets/js/googlesitekit/modules/datastore/modules.js b/assets/js/googlesitekit/modules/datastore/modules.js
index ef9cfcf4f14..70cfcfaad34 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.js
@@ -560,11 +560,13 @@ export const baseControls = {
}
),
[ SELECT_MODULE_REAUTH_URL ]: createRegistryControl(
- ( { select, resolveSelect } ) =>
+ ( { select, __experimentalResolveSelect } ) =>
async ( { payload } ) => {
const { slug } = payload;
// Ensure the module is loaded before selecting the store name.
- await resolveSelect( CORE_MODULES ).getModule( slug );
+ await __experimentalResolveSelect( CORE_MODULES ).getModule(
+ slug
+ );
const storeName =
select( CORE_MODULES ).getModuleStoreName( slug );
@@ -575,7 +577,9 @@ export const baseControls = {
}
if ( select( storeName )?.getAdminReauthURL ) {
- return await resolveSelect( storeName ).getAdminReauthURL();
+ return await __experimentalResolveSelect(
+ storeName
+ ).getAdminReauthURL();
}
return select( CORE_SITE ).getAdminURL(
'googlesitekit-dashboard'
@@ -658,10 +662,11 @@ const baseReducer = ( state, { type, payload } ) => {
};
function* waitForModules() {
- const { resolveSelect } = yield Data.commonActions.getRegistry();
+ const { __experimentalResolveSelect } =
+ yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- resolveSelect( CORE_MODULES ).getModules()
+ __experimentalResolveSelect( CORE_MODULES ).getModules()
);
}
@@ -678,9 +683,9 @@ const baseResolvers = {
*canActivateModule( slug ) {
const registry = yield Data.commonActions.getRegistry();
- const { select, resolveSelect } = registry;
+ const { select, __experimentalResolveSelect } = registry;
const module = yield Data.commonActions.await(
- resolveSelect( CORE_MODULES ).getModule( slug )
+ __experimentalResolveSelect( CORE_MODULES ).getModule( slug )
);
// At this point, all modules are loaded so we can safely select getModule below.
@@ -746,7 +751,7 @@ const baseResolvers = {
*getRecoverableModules() {
const registry = yield Data.commonActions.getRegistry();
const modules = yield Data.commonActions.await(
- registry.resolveSelect( CORE_MODULES ).getModules()
+ registry.__experimentalResolveSelect( CORE_MODULES ).getModules()
);
const recoverableModules = Object.entries( modules || {} ).reduce(
diff --git a/assets/js/googlesitekit/modules/datastore/modules.test.js b/assets/js/googlesitekit/modules/datastore/modules.test.js
index de11d30a3eb..fc0a69d86e9 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.test.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.test.js
@@ -2043,7 +2043,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject( {} );
@@ -2056,7 +2056,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject(
diff --git a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
index b097a631d8e..43622662155 100644
--- a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
+++ b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
@@ -240,7 +240,7 @@ describe( 'core/modules sharing-settings', () => {
);
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
await registry
@@ -368,7 +368,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const sharingSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
expect( console ).toHaveErrored();
@@ -381,7 +381,7 @@ describe( 'core/modules sharing-settings', () => {
};
const sharingSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( {} );
@@ -391,7 +391,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const sharingSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( sharingSettings );
@@ -403,7 +403,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const shareableRolesObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getShareableRoles();
expect( console ).toHaveErrored();
@@ -416,7 +416,7 @@ describe( 'core/modules sharing-settings', () => {
};
const shareableRolesObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( [] );
@@ -426,7 +426,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const shareableRolesObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( shareableRoles );
@@ -444,7 +444,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -459,7 +459,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -472,7 +472,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -494,7 +494,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -509,7 +509,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -522,7 +522,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -545,7 +545,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -592,7 +592,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -607,7 +607,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares select keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -650,7 +650,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'informs whether client-side sharing-settings differ from server-side ones', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// True after updating module's `sharedRoles` on the client.
@@ -686,7 +686,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to TRUE after starting submiting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
freezeFetch(
@@ -707,7 +707,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to FALSE after finishing submitting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
fetchMock.postOnce(
@@ -763,7 +763,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -816,7 +816,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -862,7 +862,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -898,7 +898,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -955,7 +955,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -1024,7 +1024,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -1041,7 +1041,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares selected keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -1099,7 +1099,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const defaultSharedOwnershipModuleSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( console ).toHaveErrored();
@@ -1114,7 +1114,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
@@ -1128,7 +1128,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .resolveSelect( CORE_MODULES )
+ .__experimentalResolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
diff --git a/assets/js/modules/ads/index.js b/assets/js/modules/ads/index.js
index 09c85f9c45a..e704f53000f 100644
--- a/assets/js/modules/ads/index.js
+++ b/assets/js/modules/ads/index.js
@@ -62,7 +62,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .resolveSelect( CORE_USER )
+ .__experimentalResolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/ads/pax/services.js b/assets/js/modules/ads/pax/services.js
index f1a16ab1cbb..4722260138b 100644
--- a/assets/js/modules/ads/pax/services.js
+++ b/assets/js/modules/ads/pax/services.js
@@ -60,7 +60,8 @@ const restFetchWpPages = async () => {
export function createPaxServices( registry, options = {} ) {
const { onCampaignCreated = null, _global = global } = options;
- const { select, resolveSelect: resolveSelect } = registry;
+ const { select, __experimentalResolveSelect: __experimentalResolveSelect } =
+ registry;
const accessToken =
_global?._googlesitekitPAXConfig?.authAccess?.oauthTokenAccess?.token;
@@ -85,7 +86,7 @@ export function createPaxServices( registry, options = {} ) {
},
businessService: {
getBusinessInfo: async () => {
- await resolveSelect( CORE_SITE ).getSiteInfo();
+ await __experimentalResolveSelect( CORE_SITE ).getSiteInfo();
/* eslint-disable sitekit/acronym-case */
// Disabling rule because businessName and businessUrl are expected by PAX API.
@@ -102,7 +103,9 @@ export function createPaxServices( registry, options = {} ) {
},
conversionTrackingService: {
getSupportedConversionLabels: async () => {
- await resolveSelect( MODULES_ADS ).getModuleData();
+ await __experimentalResolveSelect(
+ MODULES_ADS
+ ).getModuleData();
const conversionEvents =
select( MODULES_ADS ).getSupportedConversionEvents() || [];
diff --git a/assets/js/modules/adsense/index.js b/assets/js/modules/adsense/index.js
index 2f7b734145c..29f38c0cb46 100644
--- a/assets/js/modules/adsense/index.js
+++ b/assets/js/modules/adsense/index.js
@@ -68,7 +68,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .resolveSelect( CORE_USER )
+ .__experimentalResolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/analytics-4/datastore/audience-settings.js b/assets/js/modules/analytics-4/datastore/audience-settings.js
index 15071bff614..fe3bf40e31c 100644
--- a/assets/js/modules/analytics-4/datastore/audience-settings.js
+++ b/assets/js/modules/analytics-4/datastore/audience-settings.js
@@ -118,7 +118,7 @@ const baseActions = {
const registry = yield Data.commonActions.getRegistry();
const audienceSettings = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getAudienceSettings()
);
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index d377acd9596..28946459364 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -55,7 +55,7 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
startDate,
endDate
) {
- const { select, resolveSelect } = registry;
+ const { select, __experimentalResolveSelect } = registry;
const reportOptions = {
metrics: [ { name: 'totalUsers' } ],
@@ -67,9 +67,9 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
endDate,
};
- const report = await resolveSelect( MODULES_ANALYTICS_4 ).getReport(
- reportOptions
- );
+ const report = await __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getReport( reportOptions );
const error = select( MODULES_ANALYTICS_4 ).getErrorForSelector(
'getReport',
@@ -189,7 +189,7 @@ const baseActions = {
*enableAudienceGroup() {
const registry = yield Data.commonActions.getRegistry();
- const { dispatch, select, resolveSelect } = registry;
+ const { dispatch, select, __experimentalResolveSelect } = registry;
const { response: availableAudiences, error: syncError } =
yield Data.commonActions.await(
@@ -303,7 +303,9 @@ const baseActions = {
// Create custom dimension if it doesn't exist.
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getAvailableCustomDimensions()
+ __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getAvailableCustomDimensions()
);
if (
diff --git a/assets/js/modules/analytics-4/datastore/conversion-events.test.js b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
index 80ff5d35fdc..5e90c7df6bb 100644
--- a/assets/js/modules/analytics-4/datastore/conversion-events.test.js
+++ b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
@@ -64,7 +64,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
expect( initialConversionEvents ).toBeUndefined();
const conversionEvents = await registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
@@ -110,7 +110,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
);
await registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
index 2cf7fd47863..90809e5fc92 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
@@ -115,11 +115,11 @@ const baseActions = {
* @param {string} customDimension Custom dimension slug.
*/
*checkCustomDimensionDataAvailability( customDimension ) {
- const { select, resolveSelect } =
+ const { select, __experimentalResolveSelect } =
yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
if (
@@ -135,7 +135,7 @@ const baseActions = {
}
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getAuthentication()
+ __experimentalResolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -147,7 +147,7 @@ const baseActions = {
}
const reportArgs = yield Data.commonActions.await(
- resolveSelect(
+ __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getDataAvailabilityReportOptions( customDimension )
);
@@ -161,7 +161,9 @@ const baseActions = {
}
const report = yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
+ reportArgs
+ )
);
const hasReportError = !! select(
@@ -240,10 +242,13 @@ const baseResolvers = {
},
*getDataAvailabilityReportOptions() {
- const { resolveSelect } = yield Data.commonActions.getRegistry();
+ const { __experimentalResolveSelect } =
+ yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
+ __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions.js b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
index 8e2db657bd4..3eda0bcdd8a 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
@@ -115,9 +115,15 @@ const baseActions = {
// Wait for the necessary settings to be loaded before checking.
yield Data.commonActions.await(
Promise.all( [
- registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings(),
- registry.resolveSelect( CORE_USER ).getKeyMetricsSettings(),
- registry.resolveSelect( CORE_USER ).getUserInputSettings(),
+ registry
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .getSettings(),
+ registry
+ .__experimentalResolveSelect( CORE_USER )
+ .getKeyMetricsSettings(),
+ registry
+ .__experimentalResolveSelect( CORE_USER )
+ .getUserInputSettings(),
] )
);
@@ -281,12 +287,14 @@ export const baseReducer = ( state, { type, payload } ) => {
const baseResolvers = {
*getAvailableCustomDimensions() {
- const { select, resolveSelect } =
+ const { select, __experimentalResolveSelect } =
yield Data.commonActions.getRegistry();
const { isAuthenticated, hasCapability } = select( CORE_USER );
const isGA4Connected = yield Data.commonActions.await(
- resolveSelect( CORE_MODULES ).isModuleConnected( 'analytics-4' )
+ __experimentalResolveSelect( CORE_MODULES ).isModuleConnected(
+ 'analytics-4'
+ )
);
if ( ! isGA4Connected ) {
@@ -295,7 +303,7 @@ const baseResolvers = {
// Wait for settings to be loaded before proceeding.
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const availableCustomDimensions =
@@ -307,7 +315,7 @@ const baseResolvers = {
// Wait for permissions to be loaded before checking if the user can manage options.
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getCapabilities()
+ __experimentalResolveSelect( CORE_USER ).getCapabilities()
);
if ( ! hasCapability( PERMISSION_MANAGE_OPTIONS ) ) {
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
index afc439cbd00..415f6178a8a 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
@@ -224,7 +224,7 @@ const baseActions = {
const currentSettings = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -298,7 +298,7 @@ const baseActions = {
const currentSettings = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
index 20d7efd783e..e1bc176ba60 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
@@ -356,7 +356,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialSettings ).toBeUndefined();
const finalSettings = await registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -488,7 +488,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialStreamEnabled ).toBeUndefined();
const finalStreamEnabled = await registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.isEnhancedMeasurementStreamAlreadyEnabled(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/partial-data.js b/assets/js/modules/analytics-4/datastore/partial-data.js
index e4895234e6a..360d6f6ab90 100644
--- a/assets/js/modules/analytics-4/datastore/partial-data.js
+++ b/assets/js/modules/analytics-4/datastore/partial-data.js
@@ -203,7 +203,7 @@ const baseResolvers = {
},
*getResourceDataAvailabilityDate( resourceSlug, resourceType ) {
- const { select, resolveSelect } =
+ const { select, __experimentalResolveSelect } =
yield Data.commonActions.getRegistry();
if (
@@ -216,7 +216,7 @@ const baseResolvers = {
}
const resourceAvailabilityDates = yield Data.commonActions.await(
- resolveSelect(
+ __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getResourceDataAvailabilityDates()
);
@@ -227,14 +227,14 @@ const baseResolvers = {
) {
// Ensure the settings are loaded.
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
// Validate if the resourceSlug is a valid resource.
switch ( resourceType ) {
case RESOURCE_TYPE_AUDIENCE:
yield Data.commonActions.await(
- resolveSelect(
+ __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getAvailableAudiences()
);
@@ -272,7 +272,7 @@ const baseResolvers = {
}
yield Data.commonActions.await(
- resolveSelect( CORE_USER ).getAuthentication()
+ __experimentalResolveSelect( CORE_USER ).getAuthentication()
);
// Return early if user is not authenticated.
@@ -286,7 +286,7 @@ const baseResolvers = {
}
const reportArgs = yield Data.commonActions.await(
- resolveSelect(
+ __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getPartialDataReportOptions( resourceSlug, resourceType )
);
@@ -297,7 +297,9 @@ const baseResolvers = {
}
const report = yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
+ reportArgs
+ )
);
const hasReportError = !! select(
@@ -335,10 +337,13 @@ const baseResolvers = {
},
*getPartialDataReportOptions() {
- const { resolveSelect } = yield Data.commonActions.getRegistry();
+ const { __experimentalResolveSelect } =
+ yield Data.commonActions.getRegistry();
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
+ __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/properties.js b/assets/js/modules/analytics-4/datastore/properties.js
index ced9c1ee64a..860f3491deb 100644
--- a/assets/js/modules/analytics-4/datastore/properties.js
+++ b/assets/js/modules/analytics-4/datastore/properties.js
@@ -254,7 +254,7 @@ const baseActions = {
if ( propertyID ) {
const property = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
@@ -302,7 +302,9 @@ const baseActions = {
*findMatchedProperty() {
const registry = yield commonActions.getRegistry();
const accounts = yield Data.commonActions.await(
- registry.resolveSelect( MODULES_ANALYTICS_4 ).getAccountSummaries()
+ registry
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .getAccountSummaries()
);
if ( ! Array.isArray( accounts ) || accounts.length === 0 ) {
@@ -406,7 +408,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -422,7 +424,9 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ )
.getProperty( propertyID )
);
}
@@ -460,7 +464,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -473,7 +477,9 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ )
.getProperty( propertyID )
);
}
@@ -505,7 +511,7 @@ const baseActions = {
* @param {string} measurementID Measurement ID.
*/
*updateSettingsForMeasurementID( measurementID ) {
- const { select, dispatch, resolveSelect } =
+ const { select, dispatch, __experimentalResolveSelect } =
yield commonActions.getRegistry();
if ( ! measurementID ) {
@@ -522,7 +528,7 @@ const baseActions = {
// Wait for authentication to be resolved to check scopes.
yield commonActions.await(
- resolveSelect( CORE_USER ).getAuthentication()
+ __experimentalResolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).hasScope( TAGMANAGER_READ_SCOPE ) ) {
return;
@@ -589,7 +595,7 @@ const baseActions = {
* @since 1.95.0
*/
*syncGoogleTagSettings() {
- const { select, dispatch, resolveSelect } =
+ const { select, dispatch, __experimentalResolveSelect } =
yield Data.commonActions.getRegistry();
const hasTagManagerReadScope = select( CORE_USER ).hasScope(
@@ -602,7 +608,7 @@ const baseActions = {
// Wait for modules to be available before selecting.
yield Data.commonActions.await(
- resolveSelect( CORE_MODULES ).getModules()
+ __experimentalResolveSelect( CORE_MODULES ).getModules()
);
const { isModuleConnected } = select( CORE_MODULES );
@@ -613,7 +619,7 @@ const baseActions = {
// Wait for module settings to be available before selecting.
yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const {
@@ -643,9 +649,9 @@ const baseActions = {
if ( !! googleTagID ) {
const googleTagContainer = yield Data.commonActions.await(
- resolveSelect( MODULES_ANALYTICS_4 ).getGoogleTagContainer(
- measurementID
- )
+ __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getGoogleTagContainer( measurementID )
);
if ( ! googleTagContainer ) {
@@ -661,7 +667,7 @@ const baseActions = {
const googleTagContainerID = getGoogleTagContainerID();
const googleTagContainerDestinations = yield Data.commonActions.await(
- resolveSelect(
+ __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getGoogleTagContainerDestinations(
googleTagAccountID,
@@ -686,9 +692,9 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_PROPERTY_SUMMARIES ]: createRegistryControl(
- ( { resolveSelect } ) => {
+ ( { __experimentalResolveSelect } ) => {
return async () => {
- await resolveSelect(
+ await __experimentalResolveSelect(
MODULES_ANALYTICS_4
).getAccountSummaries();
};
@@ -745,7 +751,9 @@ const baseResolvers = {
const registry = yield Data.commonActions.getRegistry();
// Ensure settings are available to select.
yield Data.commonActions.await(
- registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ registry
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .getSettings()
);
const propertyID = registry
@@ -776,7 +784,7 @@ const baseResolvers = {
const property = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
diff --git a/assets/js/modules/analytics-4/datastore/tags.js b/assets/js/modules/analytics-4/datastore/tags.js
index 310c7673a17..2b6b57fdbb9 100644
--- a/assets/js/modules/analytics-4/datastore/tags.js
+++ b/assets/js/modules/analytics-4/datastore/tags.js
@@ -47,7 +47,7 @@ existingTagStore.resolvers.getExistingTag = function* () {
if ( existingTag !== null ) {
const container = yield Data.commonActions.await(
registry
- .resolveSelect( MODULES_ANALYTICS_4 )
+ .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
.getGoogleTagContainer( existingTag )
);
diff --git a/assets/js/modules/analytics-4/datastore/webdatastreams.js b/assets/js/modules/analytics-4/datastore/webdatastreams.js
index 067a4d0be5a..c69495fbeea 100644
--- a/assets/js/modules/analytics-4/datastore/webdatastreams.js
+++ b/assets/js/modules/analytics-4/datastore/webdatastreams.js
@@ -213,12 +213,12 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_WEBDATASTREAMS ]: createRegistryControl(
- ( { resolveSelect } ) => {
+ ( { __experimentalResolveSelect } ) => {
return async ( { payload } ) => {
const { propertyID } = payload;
- await resolveSelect( MODULES_ANALYTICS_4 ).getWebDataStreams(
- propertyID
- );
+ await __experimentalResolveSelect(
+ MODULES_ANALYTICS_4
+ ).getWebDataStreams( propertyID );
};
}
),
From 6d671b78199143722a112ead146e7b7d4fc66c0b Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Thu, 27 Jun 2024 15:53:26 +0600
Subject: [PATCH 023/105] Update package-locl.json.
---
package-lock.json | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/package-lock.json b/package-lock.json
index 91e4e49e3b1..e522be0e865 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33231,6 +33231,12 @@
"@types/glob": "*"
}
},
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
@@ -33345,6 +33351,12 @@
"delegate": "^3.1.2"
}
},
+ "google-pax-sdk": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/google-pax-sdk/-/google-pax-sdk-1.0.9.tgz",
+ "integrity": "sha512-faog5mRUIw0PD8RC5KvPXrw1m//oEDFjzu33A9m044C4+TejO/C0azDxud8BoVY7Dl9FfJ2lOmJPO61t2/rR+A==",
+ "dev": true
+ },
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
From 933a7592aaacd59318a7a80032b09f7a13fb8593 Mon Sep 17 00:00:00 2001
From: Arafat Zahan
Date: Thu, 27 Jun 2024 15:54:32 +0600
Subject: [PATCH 024/105] Replace usage of `__experimentalResolveSelect` with
`resolveSelect`.
---
.../SettingsActiveModule/index.test.js | 2 +-
assets/js/components/setup/ModuleSetup.js | 4 +-
.../datastore/site/enable-auto-update.js | 4 +-
.../js/googlesitekit/datastore/site/html.js | 4 +-
.../datastore/user/feature-tours.js | 10 ++--
.../googlesitekit/datastore/user/surveys.js | 6 +-
.../datastore/user/surveys.test.js | 8 +--
.../datastore/user/user-input-settings.js | 5 +-
.../modules/create-info-store.js | 7 +--
.../modules/datastore/modules.js | 22 +++----
.../modules/datastore/modules.test.js | 4 +-
.../datastore/sharing-settings.test.js | 58 +++++++++----------
.../ads/components/setup/SetupMainPAX.js | 4 +-
assets/js/modules/ads/index.js | 2 +-
assets/js/modules/ads/pax/services.js | 8 +--
assets/js/modules/adsense/index.js | 2 +-
.../datastore/audience-settings.js | 4 +-
.../analytics-4/datastore/audiences.js | 14 ++---
.../datastore/conversion-events.test.js | 4 +-
.../custom-dimensions-gathering-data.js | 20 +++----
.../datastore/custom-dimensions.js | 23 +++-----
.../datastore/enhanced-measurement.js | 4 +-
.../datastore/enhanced-measurement.test.js | 4 +-
.../analytics-4/datastore/partial-data.js | 24 +++-----
.../analytics-4/datastore/properties.js | 48 ++++++---------
.../js/modules/analytics-4/datastore/tags.js | 2 +-
.../analytics-4/datastore/webdatastreams.js | 8 +--
27 files changed, 128 insertions(+), 177 deletions(-)
diff --git a/assets/js/components/settings/SettingsActiveModule/index.test.js b/assets/js/components/settings/SettingsActiveModule/index.test.js
index c79d71eca75..80ceb0c9ca3 100644
--- a/assets/js/components/settings/SettingsActiveModule/index.test.js
+++ b/assets/js/components/settings/SettingsActiveModule/index.test.js
@@ -247,7 +247,7 @@ describe( 'SettingsModule', () => {
// Hack to avoid act error due to state change during render.
await act( () =>
registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.canActivateModule( 'tagmanager' )
);
diff --git a/assets/js/components/setup/ModuleSetup.js b/assets/js/components/setup/ModuleSetup.js
index e1437082525..78c1c76754b 100644
--- a/assets/js/components/setup/ModuleSetup.js
+++ b/assets/js/components/setup/ModuleSetup.js
@@ -71,8 +71,8 @@ export default function ModuleSetup( { moduleSlug } ) {
return;
}
- const { select, __experimentalResolveSelect } = registry;
- await __experimentalResolveSelect( CORE_SITE ).getSiteInfo();
+ const { select, resolveSelect } = registry;
+ await resolveSelect( CORE_SITE ).getSiteInfo();
const adminURL = select( CORE_SITE ).getAdminURL(
'googlesitekit-dashboard',
{
diff --git a/assets/js/googlesitekit/datastore/site/enable-auto-update.js b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
index e286480abb2..b8b39e885bd 100644
--- a/assets/js/googlesitekit/datastore/site/enable-auto-update.js
+++ b/assets/js/googlesitekit/datastore/site/enable-auto-update.js
@@ -83,10 +83,10 @@ const baseActions = {
const registry = yield commonActions.getRegistry();
yield commonActions.await(
- registry.__experimentalResolveSelect( CORE_USER ).getNonces()
+ registry.resolveSelect( CORE_USER ).getNonces()
);
yield commonActions.await(
- registry.__experimentalResolveSelect( CORE_SITE ).getSiteInfo()
+ registry.resolveSelect( CORE_SITE ).getSiteInfo()
);
const nonce = registry.select( CORE_USER ).getNonce( 'updates' );
diff --git a/assets/js/googlesitekit/datastore/site/html.js b/assets/js/googlesitekit/datastore/site/html.js
index bac9069f042..20022da0fda 100644
--- a/assets/js/googlesitekit/datastore/site/html.js
+++ b/assets/js/googlesitekit/datastore/site/html.js
@@ -151,9 +151,7 @@ const baseControls = {
[ WAIT_FOR_HTML_FOR_URL ]: createRegistryControl(
( registry ) =>
( { payload: { url } } ) =>
- registry
- .__experimentalResolveSelect( CORE_SITE )
- .getHTMLForURL( url )
+ registry.resolveSelect( CORE_SITE ).getHTMLForURL( url )
),
[ CHECK_FOR_SETUP_TAG ]: createRegistryControl(
( registry ) => async () => {
diff --git a/assets/js/googlesitekit/datastore/user/feature-tours.js b/assets/js/googlesitekit/datastore/user/feature-tours.js
index 2cdae4a27d7..7ea2fd9b61f 100644
--- a/assets/js/googlesitekit/datastore/user/feature-tours.js
+++ b/assets/js/googlesitekit/datastore/user/feature-tours.js
@@ -204,10 +204,10 @@ const baseActions = {
},
*triggerTourForView( viewContext ) {
- const { select, __experimentalResolveSelect } = yield getRegistry();
+ const { select, resolveSelect } = yield getRegistry();
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getLastDismissedAt()
+ resolveSelect( CORE_USER ).getLastDismissedAt()
);
if ( select( CORE_USER ).areFeatureToursOnCooldown() ) {
@@ -247,7 +247,7 @@ const baseControls = {
// Only tours with a version after a user's initial Site Kit version should qualify.
const initialVersion = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getInitialSiteKitVersion();
if ( ! initialVersion ) {
return false;
@@ -264,7 +264,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
@@ -287,7 +287,7 @@ const baseControls = {
// Check if the tour has already been dismissed.
// Here we need to first await the underlying selector with the asynchronous resolver.
await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.getDismissedFeatureTourSlugs();
if (
registry.select( CORE_USER ).isTourDismissed( tour.slug )
diff --git a/assets/js/googlesitekit/datastore/user/surveys.js b/assets/js/googlesitekit/datastore/user/surveys.js
index a6316310750..102bb8aaef3 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.js
@@ -185,12 +185,12 @@ const baseActions = {
},
function* ( triggerID, options = {} ) {
const { ttl = 0 } = options;
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield commonActions.getRegistry();
// Wait for user authentication state to be available before selecting.
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -199,7 +199,7 @@ const baseActions = {
// Await for surveys to be resolved before checking timeouts.
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getSurveyTimeouts()
+ resolveSelect( CORE_USER ).getSurveyTimeouts()
);
const isTimedOut =
diff --git a/assets/js/googlesitekit/datastore/user/surveys.test.js b/assets/js/googlesitekit/datastore/user/surveys.test.js
index 60b84e2ec50..6165868f200 100644
--- a/assets/js/googlesitekit/datastore/user/surveys.test.js
+++ b/assets/js/googlesitekit/datastore/user/surveys.test.js
@@ -222,18 +222,14 @@ describe( 'core/user surveys', () => {
provideUserAuthentication( registry );
- await registry
- .__experimentalResolveSelect( CORE_USER )
- .getAuthentication();
+ await registry.resolveSelect( CORE_USER ).getAuthentication();
muteFetch( surveyTriggerEndpoint );
muteFetch( surveyTimeoutEndpoint );
registry.dispatch( CORE_USER ).receiveGetSurveyTimeouts( [] );
- await registry
- .__experimentalResolveSelect( CORE_USER )
- .getSurveyTimeouts();
+ await registry.resolveSelect( CORE_USER ).getSurveyTimeouts();
jest.useFakeTimers();
diff --git a/assets/js/googlesitekit/datastore/user/user-input-settings.js b/assets/js/googlesitekit/datastore/user/user-input-settings.js
index 75f46bb9932..fca02182ca0 100644
--- a/assets/js/googlesitekit/datastore/user/user-input-settings.js
+++ b/assets/js/googlesitekit/datastore/user/user-input-settings.js
@@ -165,11 +165,10 @@ const baseActions = {
* @return {Object} Object with `response` and `error`.
*/
*maybeTriggerUserInputSurvey() {
- const { __experimentalResolveSelect, dispatch } =
- yield commonActions.getRegistry();
+ const { resolveSelect, dispatch } = yield commonActions.getRegistry();
const settings = yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getUserInputSettings()
+ resolveSelect( CORE_USER ).getUserInputSettings()
);
const settingsAnsweredOther = Object.keys( settings ).filter( ( key ) =>
diff --git a/assets/js/googlesitekit/modules/create-info-store.js b/assets/js/googlesitekit/modules/create-info-store.js
index a857920dba6..83357383f4b 100644
--- a/assets/js/googlesitekit/modules/create-info-store.js
+++ b/assets/js/googlesitekit/modules/create-info-store.js
@@ -62,11 +62,10 @@ export const createInfoStore = (
const controls = {
[ WAIT_FOR_REAUTH_RESOLVERS ]: createRegistryControl(
( registry ) => async () => {
- const { __experimentalResolveSelect } = registry;
+ const { resolveSelect } = registry;
const { getAuthentication, getConnectURL } =
- __experimentalResolveSelect( CORE_USER );
- const { getSiteInfo } =
- __experimentalResolveSelect( CORE_SITE );
+ resolveSelect( CORE_USER );
+ const { getSiteInfo } = resolveSelect( CORE_SITE );
await Promise.all( [
// Authentication is needed for checking `needsReauthentication`.
diff --git a/assets/js/googlesitekit/modules/datastore/modules.js b/assets/js/googlesitekit/modules/datastore/modules.js
index a637625bb14..2fe618e71b7 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.js
@@ -563,13 +563,11 @@ export const baseControls = {
}
),
[ SELECT_MODULE_REAUTH_URL ]: createRegistryControl(
- ( { select, __experimentalResolveSelect } ) =>
+ ( { select, resolveSelect } ) =>
async ( { payload } ) => {
const { slug } = payload;
// Ensure the module is loaded before selecting the store name.
- await __experimentalResolveSelect( CORE_MODULES ).getModule(
- slug
- );
+ await resolveSelect( CORE_MODULES ).getModule( slug );
const storeName =
select( CORE_MODULES ).getModuleStoreName( slug );
@@ -580,9 +578,7 @@ export const baseControls = {
}
if ( select( storeName )?.getAdminReauthURL ) {
- return await __experimentalResolveSelect(
- storeName
- ).getAdminReauthURL();
+ return await resolveSelect( storeName ).getAdminReauthURL();
}
return select( CORE_SITE ).getAdminURL(
'googlesitekit-dashboard'
@@ -665,11 +661,9 @@ const baseReducer = ( state, { type, payload } ) => {
};
function* waitForModules() {
- const { __experimentalResolveSelect } = yield commonActions.getRegistry();
+ const { resolveSelect } = yield commonActions.getRegistry();
- yield commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModules()
- );
+ yield commonActions.await( resolveSelect( CORE_MODULES ).getModules() );
}
const baseResolvers = {
@@ -685,9 +679,9 @@ const baseResolvers = {
*canActivateModule( slug ) {
const registry = yield commonActions.getRegistry();
- const { select, __experimentalResolveSelect } = registry;
+ const { select, resolveSelect } = registry;
const module = yield commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModule( slug )
+ resolveSelect( CORE_MODULES ).getModule( slug )
);
// At this point, all modules are loaded so we can safely select getModule below.
@@ -753,7 +747,7 @@ const baseResolvers = {
*getRecoverableModules() {
const registry = yield commonActions.getRegistry();
const modules = yield commonActions.await(
- registry.__experimentalResolveSelect( CORE_MODULES ).getModules()
+ registry.resolveSelect( CORE_MODULES ).getModules()
);
const recoverableModules = Object.entries( modules || {} ).reduce(
diff --git a/assets/js/googlesitekit/modules/datastore/modules.test.js b/assets/js/googlesitekit/modules/datastore/modules.test.js
index 3ced06e4be5..1889886fe52 100644
--- a/assets/js/googlesitekit/modules/datastore/modules.test.js
+++ b/assets/js/googlesitekit/modules/datastore/modules.test.js
@@ -2051,7 +2051,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject( {} );
@@ -2064,7 +2064,7 @@ describe( 'core/modules modules', () => {
provideModules( registry, FIXTURES );
const sharedOwnershipModules = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharedOwnershipModules();
expect( sharedOwnershipModules ).toMatchObject(
diff --git a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
index 43622662155..b097a631d8e 100644
--- a/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
+++ b/assets/js/googlesitekit/modules/datastore/sharing-settings.test.js
@@ -240,7 +240,7 @@ describe( 'core/modules sharing-settings', () => {
);
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
await registry
@@ -368,7 +368,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( console ).toHaveErrored();
@@ -381,7 +381,7 @@ describe( 'core/modules sharing-settings', () => {
};
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( {} );
@@ -391,7 +391,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const sharingSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
expect( sharingSettingsObj ).toMatchObject( sharingSettings );
@@ -403,7 +403,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( console ).toHaveErrored();
@@ -416,7 +416,7 @@ describe( 'core/modules sharing-settings', () => {
};
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( [] );
@@ -426,7 +426,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
const shareableRolesObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getShareableRoles();
expect( shareableRolesObj ).toMatchObject( shareableRoles );
@@ -444,7 +444,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -459,7 +459,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -472,7 +472,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharingManagement = registry
@@ -494,7 +494,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -509,7 +509,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -522,7 +522,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
const sharedRoles = registry
@@ -545,7 +545,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -592,7 +592,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -607,7 +607,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares select keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -650,7 +650,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'informs whether client-side sharing-settings differ from server-side ones', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// True after updating module's `sharedRoles` on the client.
@@ -686,7 +686,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to TRUE after starting submiting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
freezeFetch(
@@ -707,7 +707,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'should be set to FALSE after finishing submitting sharing changes', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
fetchMock.postOnce(
@@ -763,7 +763,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -816,7 +816,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -862,7 +862,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -898,7 +898,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -955,7 +955,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Still false after getting the sharing settings from the global variable.
@@ -1024,7 +1024,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares all keys when keys argument is not supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. All values are being checked here.
@@ -1041,7 +1041,7 @@ describe( 'core/modules sharing-settings', () => {
it( 'compares selected keys when keys argument is supplied', async () => {
global[ dashboardSharingDataBaseVar ] = dashboardSharingData;
await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getSharingSettings();
// Update the sharing settings so they differ. Only `search-console` should trigger
@@ -1099,7 +1099,7 @@ describe( 'core/modules sharing-settings', () => {
global[ dashboardSharingDataBaseVar ] = undefined;
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( console ).toHaveErrored();
@@ -1114,7 +1114,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
@@ -1128,7 +1128,7 @@ describe( 'core/modules sharing-settings', () => {
};
const defaultSharedOwnershipModuleSettingsObj = await registry
- .__experimentalResolveSelect( CORE_MODULES )
+ .resolveSelect( CORE_MODULES )
.getDefaultSharedOwnershipModuleSettings();
expect( defaultSharedOwnershipModuleSettingsObj ).toMatchObject(
diff --git a/assets/js/modules/ads/components/setup/SetupMainPAX.js b/assets/js/modules/ads/components/setup/SetupMainPAX.js
index a3548aa174c..e97a5f9fe10 100644
--- a/assets/js/modules/ads/components/setup/SetupMainPAX.js
+++ b/assets/js/modules/ads/components/setup/SetupMainPAX.js
@@ -131,8 +131,8 @@ export default function SetupMainPAX( { finishSetup } ) {
const registry = useRegistry();
const onCompleteSetup = useCallbackOne( async () => {
// Encapsulate dependencies to avoid function changing after launch.
- const { select, __experimentalResolveSelect } = registry;
- await __experimentalResolveSelect( CORE_SITE ).getSiteInfo();
+ const { select, resolveSelect } = registry;
+ await resolveSelect( CORE_SITE ).getSiteInfo();
const redirectURL = select( CORE_SITE ).getAdminURL(
'googlesitekit-dashboard',
{
diff --git a/assets/js/modules/ads/index.js b/assets/js/modules/ads/index.js
index b9f6255b612..9b88d735da7 100644
--- a/assets/js/modules/ads/index.js
+++ b/assets/js/modules/ads/index.js
@@ -57,7 +57,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/ads/pax/services.js b/assets/js/modules/ads/pax/services.js
index d0e4fb61ce0..ed5f24dd70b 100644
--- a/assets/js/modules/ads/pax/services.js
+++ b/assets/js/modules/ads/pax/services.js
@@ -98,7 +98,7 @@ export function createPaxServices( registry, options = {} ) {
const { onCampaignCreated = null, onFinishAndCloseSignUpFlow = null } =
options;
- const { select, __experimentalResolveSelect } = registry;
+ const { select, resolveSelect } = registry;
const getToken = createMemoizedGetToken();
const services = {
@@ -126,7 +126,7 @@ export function createPaxServices( registry, options = {} ) {
},
businessService: {
getBusinessInfo: async () => {
- await __experimentalResolveSelect( CORE_SITE ).getSiteInfo();
+ await resolveSelect( CORE_SITE ).getSiteInfo();
/* eslint-disable sitekit/acronym-case */
// Disabling rule because businessName and businessUrl are expected by PAX API.
@@ -151,9 +151,7 @@ export function createPaxServices( registry, options = {} ) {
},
conversionTrackingService: {
getSupportedConversionLabels: async () => {
- await __experimentalResolveSelect(
- MODULES_ADS
- ).getModuleData();
+ await resolveSelect( MODULES_ADS ).getModuleData();
const conversionEvents =
select( MODULES_ADS ).getSupportedConversionEvents() || [];
diff --git a/assets/js/modules/adsense/index.js b/assets/js/modules/adsense/index.js
index 29f38c0cb46..2f7b734145c 100644
--- a/assets/js/modules/adsense/index.js
+++ b/assets/js/modules/adsense/index.js
@@ -68,7 +68,7 @@ export const registerModule = ( modules ) => {
],
checkRequirements: async ( registry ) => {
const adBlockerActive = await registry
- .__experimentalResolveSelect( CORE_USER )
+ .resolveSelect( CORE_USER )
.isAdBlockerActive();
if ( ! adBlockerActive ) {
diff --git a/assets/js/modules/analytics-4/datastore/audience-settings.js b/assets/js/modules/analytics-4/datastore/audience-settings.js
index 200d96bf8b5..841f8361d1a 100644
--- a/assets/js/modules/analytics-4/datastore/audience-settings.js
+++ b/assets/js/modules/analytics-4/datastore/audience-settings.js
@@ -121,7 +121,7 @@ const baseActions = {
const registry = yield commonActions.getRegistry();
const audienceSettings = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getAudienceSettings()
);
const finalSettings = {
@@ -131,7 +131,7 @@ const baseActions = {
const availableAudiences = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getAvailableAudiences()
);
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index f9548aa9b58..e413b84d032 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -57,15 +57,15 @@ async function getNonZeroDataAudiencesSortedByTotalUsers(
startDate,
endDate
) {
- const { select, __experimentalResolveSelect } = registry;
+ const { select, resolveSelect } = registry;
const reportOptions = select(
MODULES_ANALYTICS_4
).getAudiencesUserCountReportOptions( audiences, { startDate, endDate } );
- const report = await __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getReport( reportOptions );
+ const report = await resolveSelect( MODULES_ANALYTICS_4 ).getReport(
+ reportOptions
+ );
const error = select( MODULES_ANALYTICS_4 ).getErrorForSelector(
'getReport',
@@ -185,7 +185,7 @@ const baseActions = {
*enableAudienceGroup() {
const registry = yield commonActions.getRegistry();
- const { dispatch, select, __experimentalResolveSelect } = registry;
+ const { dispatch, select, resolveSelect } = registry;
const { response: availableAudiences, error: syncError } =
yield commonActions.await(
@@ -298,9 +298,7 @@ const baseActions = {
// Create custom dimension if it doesn't exist.
yield commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getAvailableCustomDimensions()
+ resolveSelect( MODULES_ANALYTICS_4 ).getAvailableCustomDimensions()
);
if (
diff --git a/assets/js/modules/analytics-4/datastore/conversion-events.test.js b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
index 5e90c7df6bb..80ff5d35fdc 100644
--- a/assets/js/modules/analytics-4/datastore/conversion-events.test.js
+++ b/assets/js/modules/analytics-4/datastore/conversion-events.test.js
@@ -64,7 +64,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
expect( initialConversionEvents ).toBeUndefined();
const conversionEvents = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
@@ -110,7 +110,7 @@ describe( 'modules/analytics-4 conversion-events', () => {
);
await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getConversionEvents();
expect( fetchMock ).toHaveFetchedTimes( 1 );
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
index debffe968cf..7dd535bf7cf 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions-gathering-data.js
@@ -117,11 +117,10 @@ const baseActions = {
* @param {string} customDimension Custom dimension slug.
*/
*checkCustomDimensionDataAvailability( customDimension ) {
- const { select, __experimentalResolveSelect } =
- yield commonActions.getRegistry();
+ const { select, resolveSelect } = yield commonActions.getRegistry();
yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
if (
@@ -137,7 +136,7 @@ const baseActions = {
}
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).isAuthenticated() ) {
@@ -149,7 +148,7 @@ const baseActions = {
}
const reportArgs = yield commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getDataAvailabilityReportOptions( customDimension )
);
@@ -163,9 +162,7 @@ const baseActions = {
}
const report = yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
- reportArgs
- )
+ resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
);
const hasReportError = !! select(
@@ -244,13 +241,10 @@ const baseResolvers = {
},
*getDataAvailabilityReportOptions() {
- const { __experimentalResolveSelect } =
- yield commonActions.getRegistry();
+ const { resolveSelect } = yield commonActions.getRegistry();
yield commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getPropertyCreateTime()
+ resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/custom-dimensions.js b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
index 367ba2ae91e..b587eff1254 100644
--- a/assets/js/modules/analytics-4/datastore/custom-dimensions.js
+++ b/assets/js/modules/analytics-4/datastore/custom-dimensions.js
@@ -118,15 +118,9 @@ const baseActions = {
// Wait for the necessary settings to be loaded before checking.
yield commonActions.await(
Promise.all( [
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getSettings(),
- registry
- .__experimentalResolveSelect( CORE_USER )
- .getKeyMetricsSettings(),
- registry
- .__experimentalResolveSelect( CORE_USER )
- .getUserInputSettings(),
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings(),
+ registry.resolveSelect( CORE_USER ).getKeyMetricsSettings(),
+ registry.resolveSelect( CORE_USER ).getUserInputSettings(),
] )
);
@@ -290,14 +284,11 @@ export const baseReducer = ( state, { type, payload } ) => {
const baseResolvers = {
*getAvailableCustomDimensions() {
- const { select, __experimentalResolveSelect } =
- yield commonActions.getRegistry();
+ const { select, resolveSelect } = yield commonActions.getRegistry();
const { isAuthenticated, hasCapability } = select( CORE_USER );
const isGA4Connected = yield commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).isModuleConnected(
- 'analytics-4'
- )
+ resolveSelect( CORE_MODULES ).isModuleConnected( 'analytics-4' )
);
if ( ! isGA4Connected ) {
@@ -306,7 +297,7 @@ const baseResolvers = {
// Wait for settings to be loaded before proceeding.
yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const availableCustomDimensions =
@@ -318,7 +309,7 @@ const baseResolvers = {
// Wait for permissions to be loaded before checking if the user can manage options.
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getCapabilities()
+ resolveSelect( CORE_USER ).getCapabilities()
);
if ( ! hasCapability( PERMISSION_MANAGE_OPTIONS ) ) {
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
index 32fbccd097e..b165a97d7be 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.js
@@ -224,7 +224,7 @@ const baseActions = {
const currentSettings = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -298,7 +298,7 @@ const baseActions = {
const currentSettings = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
index e1bc176ba60..20d7efd783e 100644
--- a/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
+++ b/assets/js/modules/analytics-4/datastore/enhanced-measurement.test.js
@@ -356,7 +356,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialSettings ).toBeUndefined();
const finalSettings = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getEnhancedMeasurementSettings(
propertyID,
webDataStreamID
@@ -488,7 +488,7 @@ describe( 'modules/analytics-4 enhanced-measurement', () => {
expect( initialStreamEnabled ).toBeUndefined();
const finalStreamEnabled = await registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.isEnhancedMeasurementStreamAlreadyEnabled(
propertyID,
webDataStreamID
diff --git a/assets/js/modules/analytics-4/datastore/partial-data.js b/assets/js/modules/analytics-4/datastore/partial-data.js
index 4f5aec4e565..f72853a9c0a 100644
--- a/assets/js/modules/analytics-4/datastore/partial-data.js
+++ b/assets/js/modules/analytics-4/datastore/partial-data.js
@@ -205,8 +205,7 @@ const baseResolvers = {
},
*getResourceDataAvailabilityDate( resourceSlug, resourceType ) {
- const { select, __experimentalResolveSelect } =
- yield commonActions.getRegistry();
+ const { select, resolveSelect } = yield commonActions.getRegistry();
if (
select( MODULES_ANALYTICS_4 ).getResourceDataAvailabilityDate(
@@ -218,7 +217,7 @@ const baseResolvers = {
}
const resourceAvailabilityDates = yield commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getResourceDataAvailabilityDates()
);
@@ -229,14 +228,14 @@ const baseResolvers = {
) {
// Ensure the settings are loaded.
yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
// Validate if the resourceSlug is a valid resource.
switch ( resourceType ) {
case RESOURCE_TYPE_AUDIENCE:
yield commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getAvailableAudiences()
);
@@ -274,7 +273,7 @@ const baseResolvers = {
}
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
// Return early if user is not authenticated.
@@ -288,7 +287,7 @@ const baseResolvers = {
}
const reportArgs = yield commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getPartialDataReportOptions( resourceSlug, resourceType )
);
@@ -299,9 +298,7 @@ const baseResolvers = {
}
const report = yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getReport(
- reportArgs
- )
+ resolveSelect( MODULES_ANALYTICS_4 ).getReport( reportArgs )
);
const hasReportError = !! select(
@@ -339,13 +336,10 @@ const baseResolvers = {
},
*getPartialDataReportOptions() {
- const { __experimentalResolveSelect } =
- yield commonActions.getRegistry();
+ const { resolveSelect } = yield commonActions.getRegistry();
yield commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getPropertyCreateTime()
+ resolveSelect( MODULES_ANALYTICS_4 ).getPropertyCreateTime()
);
},
};
diff --git a/assets/js/modules/analytics-4/datastore/properties.js b/assets/js/modules/analytics-4/datastore/properties.js
index b81893e694e..b6d01cda786 100644
--- a/assets/js/modules/analytics-4/datastore/properties.js
+++ b/assets/js/modules/analytics-4/datastore/properties.js
@@ -287,7 +287,7 @@ const baseActions = {
if ( propertyID ) {
const property = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
@@ -335,9 +335,7 @@ const baseActions = {
*findMatchedProperty() {
const registry = yield commonActions.getRegistry();
const accounts = yield commonActions.await(
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getAccountSummaries()
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getAccountSummaries()
);
if ( ! Array.isArray( accounts ) || accounts.length === 0 ) {
@@ -441,7 +439,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -457,9 +455,7 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .__experimentalResolveSelect(
- MODULES_ANALYTICS_4
- )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
}
@@ -497,7 +493,7 @@ const baseActions = {
);
const webdatastreams = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getWebDataStreamsBatch( chunk )
);
@@ -510,9 +506,7 @@ const baseActions = {
) {
return yield commonActions.await(
registry
- .__experimentalResolveSelect(
- MODULES_ANALYTICS_4
- )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
}
@@ -544,7 +538,7 @@ const baseActions = {
* @param {string} measurementID Measurement ID.
*/
*updateSettingsForMeasurementID( measurementID ) {
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield commonActions.getRegistry();
if ( ! measurementID ) {
@@ -561,7 +555,7 @@ const baseActions = {
// Wait for authentication to be resolved to check scopes.
yield commonActions.await(
- __experimentalResolveSelect( CORE_USER ).getAuthentication()
+ resolveSelect( CORE_USER ).getAuthentication()
);
if ( ! select( CORE_USER ).hasScope( TAGMANAGER_READ_SCOPE ) ) {
return;
@@ -642,7 +636,7 @@ const baseActions = {
* @since 1.95.0
*/
*syncGoogleTagSettings() {
- const { select, dispatch, __experimentalResolveSelect } =
+ const { select, dispatch, resolveSelect } =
yield commonActions.getRegistry();
const hasTagManagerReadScope = select( CORE_USER ).hasScope(
@@ -654,9 +648,7 @@ const baseActions = {
}
// Wait for modules to be available before selecting.
- yield commonActions.await(
- __experimentalResolveSelect( CORE_MODULES ).getModules()
- );
+ yield commonActions.await( resolveSelect( CORE_MODULES ).getModules() );
const { isModuleConnected } = select( CORE_MODULES );
@@ -666,7 +658,7 @@ const baseActions = {
// Wait for module settings to be available before selecting.
yield commonActions.await(
- __experimentalResolveSelect( MODULES_ANALYTICS_4 ).getSettings()
+ resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const {
@@ -698,9 +690,9 @@ const baseActions = {
if ( !! googleTagID ) {
const googleTagContainer = yield commonActions.await(
- __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getGoogleTagContainer( measurementID )
+ resolveSelect( MODULES_ANALYTICS_4 ).getGoogleTagContainer(
+ measurementID
+ )
);
if ( ! googleTagContainer ) {
@@ -716,7 +708,7 @@ const baseActions = {
const googleTagContainerID = getGoogleTagContainerID();
const googleTagContainerDestinations = yield commonActions.await(
- __experimentalResolveSelect(
+ resolveSelect(
MODULES_ANALYTICS_4
).getGoogleTagContainerDestinations(
googleTagAccountID,
@@ -743,9 +735,9 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_PROPERTY_SUMMARIES ]: createRegistryControl(
- ( { __experimentalResolveSelect } ) => {
+ ( { resolveSelect } ) => {
return async () => {
- await __experimentalResolveSelect(
+ await resolveSelect(
MODULES_ANALYTICS_4
).getAccountSummaries();
};
@@ -802,9 +794,7 @@ const baseResolvers = {
const registry = yield commonActions.getRegistry();
// Ensure settings are available to select.
yield commonActions.await(
- registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
- .getSettings()
+ registry.resolveSelect( MODULES_ANALYTICS_4 ).getSettings()
);
const propertyID = registry
@@ -835,7 +825,7 @@ const baseResolvers = {
const property = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getProperty( propertyID )
);
diff --git a/assets/js/modules/analytics-4/datastore/tags.js b/assets/js/modules/analytics-4/datastore/tags.js
index 14358b086d6..6f8bcfec594 100644
--- a/assets/js/modules/analytics-4/datastore/tags.js
+++ b/assets/js/modules/analytics-4/datastore/tags.js
@@ -47,7 +47,7 @@ existingTagStore.resolvers.getExistingTag = function* () {
if ( existingTag !== null ) {
const container = yield commonActions.await(
registry
- .__experimentalResolveSelect( MODULES_ANALYTICS_4 )
+ .resolveSelect( MODULES_ANALYTICS_4 )
.getGoogleTagContainer( existingTag )
);
diff --git a/assets/js/modules/analytics-4/datastore/webdatastreams.js b/assets/js/modules/analytics-4/datastore/webdatastreams.js
index 9481f50bc10..a43b139aadc 100644
--- a/assets/js/modules/analytics-4/datastore/webdatastreams.js
+++ b/assets/js/modules/analytics-4/datastore/webdatastreams.js
@@ -217,12 +217,12 @@ const baseActions = {
const baseControls = {
[ WAIT_FOR_WEBDATASTREAMS ]: createRegistryControl(
- ( { __experimentalResolveSelect } ) => {
+ ( { resolveSelect } ) => {
return async ( { payload } ) => {
const { propertyID } = payload;
- await __experimentalResolveSelect(
- MODULES_ANALYTICS_4
- ).getWebDataStreams( propertyID );
+ await resolveSelect( MODULES_ANALYTICS_4 ).getWebDataStreams(
+ propertyID
+ );
};
}
),
From b511ddd90909fb88cd66313e7dbf17056a7fb03c Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 18:18:40 +0530
Subject: [PATCH 025/105] Add enableAudienceGroup tests coverage for error
handling.
---
.../analytics-4/datastore/audiences.test.js | 282 ++++++++++++++++++
1 file changed, 282 insertions(+)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.test.js b/assets/js/modules/analytics-4/datastore/audiences.test.js
index 0d53eedb37f..9d55ecbcbb1 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.test.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.test.js
@@ -989,6 +989,288 @@ describe( 'modules/analytics-4 audiences', () => {
).toBe( true );
} );
} );
+
+ describe( 'error handling and retrying failed audience creations', () => {
+ const errorResponse = {
+ code: 'internal_server_error',
+ message: 'Internal server error',
+ data: { status: 500 },
+ };
+
+ it( 'should return and dispatch an error if syncing available audiences request fails', async () => {
+ fetchMock.post( syncAvailableAudiencesEndpoint, {
+ body: errorResponse,
+ status: 500,
+ } );
+
+ const { response, error } = await registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .enableAudienceGroup();
+
+ expect( response ).toBeUndefined();
+ expect( error ).toEqual( errorResponse );
+
+ expect(
+ registry
+ .select( MODULES_ANALYTICS_4 )
+ .getErrorForAction( 'syncAvailableAudiences' )
+ ).toEqual( errorResponse );
+
+ expect( console ).toHaveErrored();
+ } );
+
+ it( 'should return failed audience names when creating new visitors and returning visitors audiences fails', async () => {
+ const expectedFailedAudiences = [
+ 'new-visitors',
+ 'returning-visitors',
+ ];
+
+ fetchMock.postOnce( syncAvailableAudiencesEndpoint, {
+ body: [],
+ status: 200,
+ } );
+
+ // Mocking createAudience API call with failure response.
+ fetchMock.post(
+ { url: createAudienceEndpoint, repeat: 2 },
+ {
+ body: errorResponse,
+ status: 500,
+ }
+ );
+
+ const result = await registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .enableAudienceGroup();
+
+ // Verifying the result contains the expected failed audiences.
+ expect( result ).toEqual( {
+ failedSiteKitAudienceResourceNames:
+ expectedFailedAudiences,
+ } );
+
+ // Ensuring no configured audiences are set when all creation attempts fail.
+ expect(
+ registry
+ .select( MODULES_ANALYTICS_4 )
+ .getConfiguredAudiences()
+ ).toBeNull();
+
+ expect( console ).toHaveErrored();
+ expect( console ).toHaveErrored();
+ } );
+
+ it( 'should create one audience and return failed audience names for the other', async () => {
+ const failedAudiencesToRetry = [
+ 'new-visitors',
+ 'returning-visitors',
+ ];
+
+ const createdNewVisitorsAudienceName =
+ 'properties/12345/audiences/888';
+ const expectedFailedAudiences = [ 'returning-visitors' ];
+
+ // Mocking createAudience API call with mixed responses.
+ fetchMock.post(
+ { url: createAudienceEndpoint, repeat: 2 },
+ ( url, opts ) => {
+ if ( opts.body.includes( 'new_visitors' ) ) {
+ return {
+ body: {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'new-visitors'
+ ],
+ name: createdNewVisitorsAudienceName,
+ },
+ status: 200,
+ };
+ }
+ return {
+ body: errorResponse,
+ status: 500,
+ };
+ }
+ );
+
+ fetchMock.postOnce( syncAvailableAudiencesEndpoint, {
+ body: [],
+ status: 200,
+ } );
+
+ const result = await registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .enableAudienceGroup( failedAudiencesToRetry );
+
+ // Verifying the result contains the expected failed audiences.
+ expect( result ).toEqual( {
+ failedSiteKitAudienceResourceNames:
+ expectedFailedAudiences,
+ } );
+
+ // Ensure no configured audiences are set when one creation attempt fails.
+ expect(
+ registry
+ .select( MODULES_ANALYTICS_4 )
+ .getConfiguredAudiences()
+ ).toBeNull();
+
+ // Ensuring the API calls were made as expected
+ expect( fetchMock ).toHaveFetchedTimes(
+ 2,
+ createAudienceEndpoint
+ );
+
+ expect( fetchMock ).toHaveFetchedTimes(
+ 1,
+ syncAvailableAudiencesEndpoint
+ );
+
+ // Ensure conse error is logged only once.
+ expect( console ).toHaveErrored();
+ } );
+
+ it( 'should create provided "failedSiteKitAudienceResourceNames" correctly', async () => {
+ const failedAudiencesToRetry = [
+ 'new-visitors',
+ 'returning-visitors',
+ ];
+
+ const createdNewVisitorsAudienceName =
+ 'properties/12345/audiences/888';
+ const createdReturningVisitorsAudienceName =
+ 'properties/12345/audiences/999';
+
+ const expectedConfiguredAudiences = [
+ createdNewVisitorsAudienceName,
+ createdReturningVisitorsAudienceName,
+ ];
+
+ const finalAvailableAudiences = [
+ [
+ ...availableUserAudiences,
+ {
+ ...availableNewVisitorsAudienceFixture,
+ name: createdNewVisitorsAudienceName,
+ },
+ {
+ ...availableReturningVisitorsAudienceFixture,
+ name: createdReturningVisitorsAudienceName,
+ },
+ ],
+ ];
+
+ fetchMock.post(
+ {
+ url: syncAvailableAudiencesEndpoint,
+ repeat: 2,
+ },
+ () => {
+ const callCount = fetchMock.calls(
+ syncAvailableAudiencesEndpoint
+ ).length;
+
+ return {
+ body:
+ callCount === 1
+ ? availableUserAudiences
+ : finalAvailableAudiences,
+ status: 200,
+ };
+ }
+ );
+
+ fetchMock.postOnce( audienceSettingsEndpoint, {
+ body: {
+ configuredAudiences: expectedConfiguredAudiences,
+ isAudienceSegmentationWidgetHidden,
+ },
+ status: 200,
+ } );
+
+ fetchMock.post(
+ { url: createAudienceEndpoint, repeat: 2 },
+ ( url, opts ) => {
+ return {
+ body: opts.body.includes( 'new_visitors' )
+ ? {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'new-visitors'
+ ],
+ name: createdNewVisitorsAudienceName,
+ }
+ : {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'returning-visitors'
+ ],
+ name: createdReturningVisitorsAudienceName,
+ },
+ status: 200,
+ };
+ }
+ );
+
+ await registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .enableAudienceGroup( failedAudiencesToRetry );
+
+ expect( fetchMock ).toHaveFetchedTimes(
+ 2,
+ syncAvailableAudiencesEndpoint
+ );
+
+ expect( fetchMock ).toHaveFetchedTimes(
+ 1,
+ createAudienceEndpoint,
+ {
+ body: {
+ data: {
+ audience:
+ SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'new-visitors'
+ ],
+ },
+ },
+ }
+ );
+
+ expect( fetchMock ).toHaveFetchedTimes(
+ 1,
+ createAudienceEndpoint,
+ {
+ body: {
+ data: {
+ audience:
+ SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'returning-visitors'
+ ],
+ },
+ },
+ }
+ );
+
+ expect( fetchMock ).toHaveFetchedTimes(
+ 1,
+ audienceSettingsEndpoint,
+ {
+ body: {
+ data: {
+ settings: {
+ configuredAudiences:
+ expectedConfiguredAudiences,
+ isAudienceSegmentationWidgetHidden,
+ },
+ },
+ },
+ }
+ );
+
+ expect(
+ registry
+ .select( MODULES_ANALYTICS_4 )
+ .getConfiguredAudiences()
+ ).toEqual( expectedConfiguredAudiences );
+ } );
+ } );
} );
} );
From 5a5e82f4243ed0182bd46fe8e651abe97017398c Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 18:19:32 +0530
Subject: [PATCH 026/105] Pass failedSiteKitAudienceResourceNames as a non
object param.
---
assets/js/modules/analytics-4/datastore/audiences.js | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/assets/js/modules/analytics-4/datastore/audiences.js b/assets/js/modules/analytics-4/datastore/audiences.js
index b01c7295e0f..0c8988aa75d 100644
--- a/assets/js/modules/analytics-4/datastore/audiences.js
+++ b/assets/js/modules/analytics-4/datastore/audiences.js
@@ -188,11 +188,10 @@ const baseActions = {
* @since 1.128.0
* @since n.e.x.t Added `failedSiteKitAudienceResourceNames` parameter to retry failed Site Kit audience creation.
*
- * @param {Object} args Arguments for enabling audience group.
- * @param {Array} args.failedSiteKitAudienceResourceNames List of failed Site Kit audience resource names to retry.
+ * @param {Array} failedSiteKitAudienceResourceNames List of failed Site Kit audience resource names to retry.
* @return {Object} Object with `failedSiteKitAudienceResourceNames` and `error`.
*/
- *enableAudienceGroup( { failedSiteKitAudienceResourceNames } ) {
+ *enableAudienceGroup( failedSiteKitAudienceResourceNames ) {
const registry = yield commonActions.getRegistry();
const { dispatch, select, __experimentalResolveSelect } = registry;
@@ -279,10 +278,9 @@ const baseActions = {
}
if ( configuredAudiences.length === 0 ) {
- const audiencesToCreate = failedSiteKitAudienceResourceNames || [
- 'new-visitors',
- 'returning-visitors',
- ];
+ const audiencesToCreate = failedSiteKitAudienceResourceNames?.length
+ ? failedSiteKitAudienceResourceNames
+ : [ 'new-visitors', 'returning-visitors' ];
// If there are no configured audiences by this point, create the "new-visitors" and "returning-visitors" audiences,
// and add them to the configured audiences.
From 0ea5b01b48814c9d0167d8bdefe92189672beaff Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 18:26:01 +0530
Subject: [PATCH 027/105] Do not navigate to OAuth flow if
skipDefaultErrorNotifications is available.
---
.../PermissionsModal/AuthenticatedPermissionsModal.js | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/assets/js/components/PermissionsModal/AuthenticatedPermissionsModal.js b/assets/js/components/PermissionsModal/AuthenticatedPermissionsModal.js
index 0f0132f1063..123a1f74556 100644
--- a/assets/js/components/PermissionsModal/AuthenticatedPermissionsModal.js
+++ b/assets/js/components/PermissionsModal/AuthenticatedPermissionsModal.js
@@ -69,7 +69,11 @@ function AuthenticatedPermissionsModal() {
// If we have a datastores to snapshot before navigating away to the
// authorization page, do that first.
await snapshotAllStores( registry );
- navigateTo( connectURL );
+
+ // Navigate to the authorization page.
+ if ( ! permissionsError?.data?.skipDefaultErrorNotifications ) {
+ navigateTo( connectURL );
+ }
}, [ registry, connectURL, navigateTo, permissionsError, setValues ] );
useEffect( () => {
@@ -101,6 +105,10 @@ function AuthenticatedPermissionsModal() {
return null;
}
+ if ( permissionsError?.data?.skipDefaultErrorNotifications ) {
+ return null;
+ }
+
if ( permissionsError?.data?.skipModal ) {
return null;
}
From aa113560f037a188e745a991d8a4ddfd481d9b30 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 18:28:03 +0530
Subject: [PATCH 028/105] Add onCancel prop. Rearrage imports and props.
---
.../dashboard/AudienceErrorModal.js | 38 +++++++++++--------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
index 19ed151b945..c6379177845 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
@@ -31,17 +31,19 @@ import { __ } from '@wordpress/i18n';
* Internal dependencies
*/
import { useSelect } from 'googlesitekit-data';
+import Link from '../../../../../components/Link';
import ModalDialog from '../../../../../components/ModalDialog';
-import { isInsufficientPermissionsError } from '../../../../../util/errors';
+import Portal from '../../../../../components/Portal';
import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
-import Link from '../../../../../components/Link';
import { MODULES_ANALYTICS_4 } from '../../../datastore/constants';
+import { isInsufficientPermissionsError } from '../../../../../util/errors';
export default function AudienceErrorModal( {
- hasOAuthError,
apiErrors,
- onRetry = () => {},
+ hasOAuthError,
inProgress,
+ onCancel = () => {},
+ onRetry = () => {},
} ) {
const errors = Array.isArray( apiErrors ) ? apiErrors : [ apiErrors ];
const hasInsufficientPermissionsError = errors.some( ( error ) =>
@@ -103,25 +105,29 @@ export default function AudienceErrorModal( {
}
return (
-
+
+
+
);
}
AudienceErrorModal.propTypes = {
- hasOAuthError: PropTypes.bool,
apiErrors: PropTypes.oneOfType( [
PropTypes.arrayOf( PropTypes.object ),
PropTypes.object,
] ),
- onRetry: PropTypes.func,
+ hasOAuthError: PropTypes.bool,
inProgress: PropTypes.bool,
+ onCancel: PropTypes.func,
+ onRetry: PropTypes.func,
};
From 5cdc31b17e09fdcd61cfeccb5a0977d8c9d697b7 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 18:31:59 +0530
Subject: [PATCH 029/105] Render AudienceErrorModal. Retry failed audience
creation.
---
.../AudienceSegmentationSetupCTAWidget.js | 80 ++++++++++++-------
1 file changed, 50 insertions(+), 30 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
index 399c0fa13f2..be10c986233 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
@@ -38,7 +38,9 @@ import BannerGraphicsSVGTablet from '../../../../../../svg/graphics/audience-seg
import BannerGraphicsSVGMobile from '../../../../../../svg/graphics/audience-segmentation-setup-mobile.svg';
import whenActive from '../../../../../util/when-active';
import { CORE_FORMS } from '../../../../../googlesitekit/datastore/forms/constants';
+import { CORE_LOCATION } from '../../../../../googlesitekit/datastore/location/constants';
import { CORE_USER } from '../../../../../googlesitekit/datastore/user/constants';
+import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
import {
MODULES_ANALYTICS_4,
EDIT_SCOPE,
@@ -60,7 +62,6 @@ import {
import { withWidgetComponentProps } from '../../../../../googlesitekit/widgets/util';
import { WEEK_IN_SECONDS } from '../../../../../util';
import AudienceErrorModal from './AudienceErrorModal';
-import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
export const AUDIENCE_SEGMENTATION_SETUP_CTA_NOTIFICATION =
'audience_segmentation_setup_cta-notification';
@@ -114,8 +115,9 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
const [ apiErrors, setApiErrors ] = useState( [] );
const [ failedAudiences, setFailedAudiences ] = useState( [] );
+ const [ showErrorModal, setShowErrorModal ] = useState( false );
const onEnableGroups = useCallback(
- async ( retryFailedAudiences ) => {
+ async ( retryFailedAudiences = [] ) => {
setIsSaving( true );
// If scope not granted, trigger scope error right away. These are
@@ -141,6 +143,7 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
},
} );
+ setShowErrorModal( true );
setIsSaving( false );
return;
}
@@ -150,18 +153,22 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
} );
const { error, failedSiteKitAudienceResourceNames } =
- await enableAudienceGroup( {
- failedSiteKitAudienceResourceNames: retryFailedAudiences,
- } );
+ ( await enableAudienceGroup( retryFailedAudiences ) ) || {};
if ( error ) {
setApiErrors( [ error ] );
- }
-
- if ( failedSiteKitAudienceResourceNames ) {
+ setFailedAudiences( [] );
+ } else if ( Array.isArray( failedSiteKitAudienceResourceNames ) ) {
setFailedAudiences( failedSiteKitAudienceResourceNames );
+ setApiErrors( [] );
+ } else {
+ setApiErrors( [] );
+ setFailedAudiences( [] );
}
+ setShowErrorModal(
+ !! error || !! failedSiteKitAudienceResourceNames
+ );
setIsSaving( false );
},
[
@@ -207,6 +214,31 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
}
};
+ const permissionsError = useSelect( ( select ) =>
+ select( CORE_USER ).getPermissionScopeError()
+ );
+
+ const connectURL = useSelect( ( select ) =>
+ select( CORE_USER ).getConnectURL( {
+ additionalScopes: permissionsError?.data?.scopes,
+ redirectURL:
+ permissionsError?.data?.redirectURL || global.location.href,
+ } )
+ );
+
+ const { navigateTo } = useDispatch( CORE_LOCATION );
+ const { clearPermissionScopeError } = useDispatch( CORE_USER );
+
+ const handleOAuthError = useCallback( () => {
+ setIsSaving( true );
+ navigateTo( connectURL );
+ }, [ connectURL, navigateTo ] );
+
+ const onCancel = useCallback( () => {
+ clearPermissionScopeError();
+ setShowErrorModal( false );
+ }, [ clearPermissionScopeError ] );
+
const setupErrorCode = useSelect( ( select ) =>
select( CORE_SITE ).getSetupErrorCode()
);
@@ -244,32 +276,20 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
return null;
}
- if ( hasOAuthError ) {
- return (
-
- );
- }
-
- if ( apiErrors.length ) {
- return (
-
- );
- }
-
- if ( failedAudiences.length ) {
+ if ( showErrorModal ) {
return (
onEnableGroups( failedAudiences ) }
+ onRetry={
+ hasOAuthError
+ ? handleOAuthError
+ : () => onEnableGroups( failedAudiences )
+ }
inProgress={ isSaving }
+ onCancel={
+ hasOAuthError ? onCancel : () => setShowErrorModal( false )
+ }
/>
);
}
From 9772b4d2fbf442bd0f7bd664b208fa10a76f7b81 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 20:46:24 +0530
Subject: [PATCH 030/105] Add AudienceErrorModal tests.
---
.../dashboard/AudienceErrorModal.test.js | 146 ++++++++++++++++++
1 file changed, 146 insertions(+)
create mode 100644 assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
new file mode 100644
index 00000000000..6609d7c73fe
--- /dev/null
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
@@ -0,0 +1,146 @@
+/**
+ * AudienceErrorModal component tests.
+ *
+ * Site Kit by Google, Copyright 2024 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Internal dependencies
+ */
+import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
+import { ERROR_REASON_INSUFFICIENT_PERMISSIONS } from '../../../../../util/errors';
+import { MODULES_ANALYTICS_4 } from '../../../datastore/constants';
+import { availableAudiences } from '../../../datastore/__fixtures__';
+import {
+ createTestRegistry,
+ provideModuleRegistrations,
+ provideModules,
+ provideUserInfo,
+ render,
+} from '../../../../../../../tests/js/test-utils';
+import AudienceErrorModal from './AudienceErrorModal';
+
+describe( 'AudienceErrorModal', () => {
+ let registry;
+
+ beforeEach( () => {
+ registry = createTestRegistry();
+ provideUserInfo( registry );
+ provideModules( registry );
+ provideModuleRegistrations( registry );
+
+ registry.dispatch( MODULES_ANALYTICS_4 ).receiveGetSettings( {
+ accountID: '12345',
+ propertyID: '34567',
+ measurementID: '56789',
+ webDataStreamID: '78901',
+ availableAudiences,
+ } );
+ } );
+
+ it( 'should not render if there are no errors', () => {
+ const { container } = render( , {
+ registry,
+ } );
+
+ expect( container ).toBeEmptyDOMElement();
+ } );
+
+ it( 'should display the error modal when there is an OAuth error', () => {
+ const { getByText, getByRole } = render(
+ ,
+ {
+ registry,
+ }
+ );
+
+ // Verify the error is an OAuth error.
+ expect( getByText( /Analytics update failed/i ) ).toBeInTheDocument();
+
+ // Verify the "Get help" link is displayed and points to the correct URL.
+ expect( getByText( /get help/i ) ).toBeInTheDocument();
+ expect( getByRole( 'link', { name: /get help/i } ) ).toHaveAttribute(
+ 'href',
+ registry.select( CORE_SITE ).getErrorTroubleshootingLinkURL( {
+ code: 'access_denied',
+ } )
+ );
+
+ // Verify the "Retry" button is displayed.
+ expect( getByText( /retry/i ) ).toBeInTheDocument();
+ } );
+
+ it( 'should display the error modal when there is an insufficient permissions error', () => {
+ const error = {
+ code: 'test_error',
+ message: 'Error message.',
+ data: { reason: ERROR_REASON_INSUFFICIENT_PERMISSIONS },
+ };
+
+ const { getByText, getByRole } = render(
+ ,
+ {
+ registry,
+ }
+ );
+
+ // Verify the error is "Insufficient permissions" variant.
+ expect( getByText( /Insufficient permissions/i ) ).toBeInTheDocument();
+
+ // Verify the "Get help" link is displayed and points to the correct URL.
+ expect( getByText( /get help/i ) ).toBeInTheDocument();
+ expect( getByRole( 'link', { name: /get help/i } ) ).toHaveAttribute(
+ 'href',
+ registry.select( CORE_SITE ).getErrorTroubleshootingLinkURL( {
+ code: 'analytics-4_insufficient_permissions',
+ } )
+ );
+
+ // Verify the "Request access" button is displayed and points to the correct URL.
+ expect( getByText( /request access/i ) ).toBeInTheDocument();
+ expect(
+ getByRole( 'button', { name: /request access/i } )
+ ).toHaveAttribute(
+ 'href',
+ registry.select( MODULES_ANALYTICS_4 ).getServiceEntityAccessURL()
+ );
+ } );
+
+ it( 'should display the error modal when there is generic error', () => {
+ const error = {
+ code: 'internal_server_error',
+ message: 'Internal server error',
+ data: { status: 500 },
+ };
+
+ const { queryByText, getByText } = render(
+ ,
+ {
+ registry,
+ }
+ );
+
+ // Verify the error is a generic error.
+ expect(
+ getByText( /Failed to set up visitor groups/i )
+ ).toBeInTheDocument();
+
+ // Verify the "Get help" link is not displayed.
+ expect( queryByText( /get help/i ) ).not.toBeInTheDocument();
+
+ // Verify the "Request access" button is not displayed.
+ expect( queryByText( /request access/i ) ).not.toBeInTheDocument();
+ } );
+} );
From 68611c1bc3c23af67f73c5c33b8aa1261be84b44 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 20:47:04 +0530
Subject: [PATCH 031/105] Don not render the modal if no errors. Pass correct
get help link ot the oauth variant.
---
.../dashboard/AudienceErrorModal.js | 23 +++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
index c6379177845..ef723ec4027 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.js
@@ -46,9 +46,6 @@ export default function AudienceErrorModal( {
onRetry = () => {},
} ) {
const errors = Array.isArray( apiErrors ) ? apiErrors : [ apiErrors ];
- const hasInsufficientPermissionsError = errors.some( ( error ) =>
- isInsufficientPermissionsError( error )
- );
const helpLink = useSelect( ( select ) =>
select( CORE_SITE ).getErrorTroubleshootingLinkURL( {
@@ -60,6 +57,20 @@ export default function AudienceErrorModal( {
select( MODULES_ANALYTICS_4 ).getServiceEntityAccessURL()
);
+ const errorTroubleshootingLinkURL = useSelect( ( select ) =>
+ select( CORE_SITE ).getErrorTroubleshootingLinkURL( {
+ code: 'access_denied',
+ } )
+ );
+
+ if ( ! errors.length && ! hasOAuthError ) {
+ return null;
+ }
+
+ const hasInsufficientPermissionsError = errors.some( ( error ) =>
+ isInsufficientPermissionsError( error )
+ );
+
let title, description, confirmButton, buttonLink;
if ( hasOAuthError ) {
@@ -71,7 +82,11 @@ export default function AudienceErrorModal( {
),
{
HelpLink: (
-
+
{ __( 'Get help', 'google-site-kit' ) }
),
From 81d4c82774d7e4ab06be4c8c46be58930d2271cd Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Thu, 27 Jun 2024 20:47:19 +0530
Subject: [PATCH 032/105] Export default AudienceErrorModal.
---
.../components/audience-segmentation/dashboard/index.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/index.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/index.js
index 1e66d3ebe28..3afd3d3740c 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/index.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/index.js
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+export { default as AudienceErrorModal } from './AudienceErrorModal';
export { default as AudienceTile } from './AudienceTile';
export { default as AudienceSegmentationErrorWidget } from './AudienceSegmentationErrorWidget';
export { default as AudienceSegmentationIntroductoryOverlayNotification } from './AudienceSegmentationIntroductoryOverlayNotification';
From 35a8ed45967ab0a6894e3124cc1027a85c0bf62c Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 01:02:55 +0530
Subject: [PATCH 033/105] Fix existing AudienceSegmentationSetupCTAWidget
tests.
---
...AudienceSegmentationSetupCTAWidget.test.js | 94 +++++++++++++++----
1 file changed, 74 insertions(+), 20 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
index 6bbffea9501..e7d5fdc530e 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
@@ -33,6 +33,7 @@ import {
provideUserAuthentication,
unsubscribeFromAll,
waitForDefaultTimeouts,
+ waitForTimeouts,
} from '../../../../../../../tests/js/utils';
import { CORE_USER } from '../../../../../googlesitekit/datastore/user/constants';
import { CORE_FORMS } from '../../../../../googlesitekit/datastore/forms/constants';
@@ -40,6 +41,7 @@ import {
MODULES_ANALYTICS_4,
EDIT_SCOPE,
AUDIENCE_SEGMENTATION_SETUP_FORM,
+ SITE_KIT_AUDIENCE_DEFINITIONS,
} from '../../../datastore/constants';
import {
availableAudiences as audiencesFixture,
@@ -70,6 +72,10 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
'^/google-site-kit/v1/modules/analytics-4/data/sync-audiences'
);
+ const createAudienceEndpoint = new RegExp(
+ '^/google-site-kit/v1/modules/analytics-4/data/create-audience'
+ );
+
const testPropertyID = propertiesFixture[ 0 ]._id;
beforeEach( () => {
@@ -392,7 +398,7 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
).not.toBeInTheDocument();
} );
- it( 'should show the `Don’t show again` CTA when the dismissCount is 1', () => {
+ it( 'should show the `Don’t show again` CTA when the dismissCount is 1', async () => {
registry.dispatch( CORE_USER ).receiveGetDismissedPrompts( {
[ AUDIENCE_SEGMENTATION_SETUP_CTA_NOTIFICATION ]: {
expires: 1000,
@@ -400,7 +406,7 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
},
} );
- const { getByRole, queryByText } = render(
+ const { getByRole, queryByText, waitForRegistry } = render(
{
}
);
+ await act( waitForRegistry );
+
expect(
getByRole( 'button', { name: /Don’t show again/i } )
).toBeInTheDocument();
@@ -432,24 +440,6 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
.dispatch( MODULES_ANALYTICS_4 )
.receiveGetAudienceSettings( settings );
- const { getByRole } = render(
- ,
- {
- registry,
- }
- );
-
- expect(
- getByRole( 'button', { name: /Enable groups/i } )
- ).toBeInTheDocument();
-
- // eslint-disable-next-line require-await
- await act( async () => {
- fireEvent.click(
- getByRole( 'button', { name: /Enable groups/i } )
- );
- } );
-
fetchMock.post( syncAvailableAudiencesEndpoint, {
status: 200,
body: audiencesFixture,
@@ -468,11 +458,53 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
body: settingsBody,
} );
+ fetchMock.post(
+ { url: createAudienceEndpoint, repeat: 2 },
+ ( url, opts ) => {
+ return {
+ body: opts.body.includes( 'new_visitors' )
+ ? {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'new-visitors'
+ ],
+ name: audiencesFixture[ 2 ].name,
+ }
+ : {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'returning-visitors'
+ ],
+ name: audiencesFixture[ 3 ].name,
+ },
+ status: 200,
+ };
+ }
+ );
+
muteFetch( reportEndpoint );
+ const { getByRole } = render(
+ ,
+ {
+ registry,
+ }
+ );
+
+ expect(
+ getByRole( 'button', { name: /Enable groups/i } )
+ ).toBeInTheDocument();
+
+ // eslint-disable-next-line require-await
+ await act( async () => {
+ fireEvent.click(
+ getByRole( 'button', { name: /Enable groups/i } )
+ );
+ } );
+
expect(
getByRole( 'button', { name: /Enabling groups/i } )
).toBeInTheDocument();
+
+ await act( () => waitForTimeouts( 30 ) );
} );
it( 'should initialise the list of configured audiences when autoSubmit is set to true.', async () => {
@@ -515,6 +547,28 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
body: settingsBody,
} );
+ fetchMock.post(
+ { url: createAudienceEndpoint, repeat: 2 },
+ ( url, opts ) => {
+ return {
+ body: opts.body.includes( 'new_visitors' )
+ ? {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'new-visitors'
+ ],
+ name: audiencesFixture[ 2 ].name,
+ }
+ : {
+ ...SITE_KIT_AUDIENCE_DEFINITIONS[
+ 'returning-visitors'
+ ],
+ name: audiencesFixture[ 3 ].name,
+ },
+ status: 200,
+ };
+ }
+ );
+
muteFetch( reportEndpoint );
const { getByRole, waitForRegistry } = render(
From ffe6c1dd6b37b2894f8c1479f7541117ae0575fb Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 01:52:35 +0530
Subject: [PATCH 034/105] Fix hasOAuthError condition to return bool.
---
.../dashboard/AudienceSegmentationSetupCTAWidget.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
index be10c986233..5048a128b79 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.js
@@ -116,6 +116,7 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
const [ apiErrors, setApiErrors ] = useState( [] );
const [ failedAudiences, setFailedAudiences ] = useState( [] );
const [ showErrorModal, setShowErrorModal ] = useState( false );
+
const onEnableGroups = useCallback(
async ( retryFailedAudiences = [] ) => {
setIsSaving( true );
@@ -243,7 +244,7 @@ function AudienceSegmentationSetupCTAWidget( { Widget, WidgetNull } ) {
select( CORE_SITE ).getSetupErrorCode()
);
- const hasOAuthError = autoSubmit && setupErrorCode;
+ const hasOAuthError = autoSubmit && setupErrorCode === 'access_denied';
if ( isTooltipVisible ) {
return (
From 362778793499815075a7ccb4e7754602c95b7742 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 01:59:35 +0530
Subject: [PATCH 035/105] Add OAuth error modal test.
---
...AudienceSegmentationSetupCTAWidget.test.js | 77 +++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
index e7d5fdc530e..bfddb86b153 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
@@ -24,6 +24,8 @@ import {
act,
fireEvent,
render,
+ screen,
+ waitFor,
} from '../../../../../../../tests/js/test-utils';
import {
createTestRegistry,
@@ -37,6 +39,7 @@ import {
} from '../../../../../../../tests/js/utils';
import { CORE_USER } from '../../../../../googlesitekit/datastore/user/constants';
import { CORE_FORMS } from '../../../../../googlesitekit/datastore/forms/constants';
+import { CORE_SITE } from '../../../../../googlesitekit/datastore/site/constants';
import {
MODULES_ANALYTICS_4,
EDIT_SCOPE,
@@ -586,5 +589,79 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
await act( waitForDefaultTimeouts );
} );
+
+ describe( 'AudienceErrorModal', () => {
+ it( 'should show the OAuth error modal when the required scopes are not granted', async () => {
+ provideSiteInfo( registry, {
+ setupErrorCode: 'access_denied',
+ } );
+
+ provideUserAuthentication( registry, {
+ grantedScopes: [],
+ } );
+
+ const settings = {
+ configuredAudiences: [],
+ isAudienceSegmentationWidgetHidden: false,
+ };
+
+ // Set the data availability on page load to true.
+ registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .receiveIsDataAvailableOnLoad( true );
+
+ registry
+ .dispatch( MODULES_ANALYTICS_4 )
+ .receiveGetAudienceSettings( settings );
+
+ // eslint-disable-next-line require-await
+ await act( async () => {
+ render(
+ ,
+ {
+ registry,
+ }
+ );
+ } );
+
+ expect(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ ).toBeInTheDocument();
+
+ act( () => {
+ fireEvent.click(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ );
+ } );
+
+ // Verify the error is an OAuth error.
+ await waitFor( () => {
+ expect(
+ screen.getByText( /Analytics update failed/i )
+ ).toBeInTheDocument();
+
+ expect(
+ screen.getByText( /get help/i )
+ ).toBeInTheDocument();
+
+ expect(
+ screen.getByRole( 'link', { name: /get help/i } )
+ ).toHaveAttribute(
+ 'href',
+ registry
+ .select( CORE_SITE )
+ .getErrorTroubleshootingLinkURL( {
+ code: 'access_denied',
+ } )
+ );
+
+ expect( screen.getByText( /retry/i ) ).toBeInTheDocument();
+ } );
+
+ await act( waitForDefaultTimeouts );
+ } );
+ } );
} );
} );
From 0af641d32f5e035fdb23819e07469465a913b2e2 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 15:32:34 +0530
Subject: [PATCH 036/105] Add insufficient error variant test.
---
...AudienceSegmentationSetupCTAWidget.test.js | 59 ++++++++++++++++++-
1 file changed, 58 insertions(+), 1 deletion(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
index bfddb86b153..d5d37213787 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
@@ -50,6 +50,7 @@ import {
availableAudiences as audiencesFixture,
properties as propertiesFixture,
} from '../../../datastore/__fixtures__';
+import { ERROR_REASON_INSUFFICIENT_PERMISSIONS } from '../../../../../util/errors';
import { getWidgetComponentProps } from '../../../../../googlesitekit/widgets/util';
import { getAnalytics4MockResponse } from '../../../utils/data-mock';
import AudienceSegmentationSetupCTAWidget, {
@@ -636,12 +637,13 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
);
} );
- // Verify the error is an OAuth error.
+ // Verify the error is an OAuth error variant.
await waitFor( () => {
expect(
screen.getByText( /Analytics update failed/i )
).toBeInTheDocument();
+ // Verify the "Get help" link is displayed.
expect(
screen.getByText( /get help/i )
).toBeInTheDocument();
@@ -657,11 +659,66 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
} )
);
+ // Verify the "Retry" button is displayed.
expect( screen.getByText( /retry/i ) ).toBeInTheDocument();
} );
await act( waitForDefaultTimeouts );
} );
+
+ it( 'should show the insufficient permissio error modal when the user does not have the required permissions', async () => {
+ const errorResponse = {
+ code: 'test_error',
+ message: 'Error message.',
+ data: { reason: ERROR_REASON_INSUFFICIENT_PERMISSIONS },
+ };
+
+ fetchMock.post( syncAvailableAudiencesEndpoint, {
+ body: errorResponse,
+ status: 500,
+ } );
+
+ // eslint-disable-next-line require-await
+ await act( async () => {
+ render(
+ ,
+ {
+ registry,
+ }
+ );
+ } );
+
+ expect(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ ).toBeInTheDocument();
+
+ act( () => {
+ fireEvent.click(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ );
+ } );
+
+ // Verify the error is "Insufficient permissions" variant.
+ await waitFor( () => {
+ expect(
+ screen.getByText( /Insufficient permissions/i )
+ ).toBeInTheDocument();
+
+ // Verify the "Get help" link is displayed.
+ expect(
+ screen.getByText( /get help/i )
+ ).toBeInTheDocument();
+
+ // Verify the "Request access" button is displayed.
+ expect(
+ screen.getByText( /request access/i )
+ ).toBeInTheDocument();
+ } );
+
+ await act( waitForDefaultTimeouts );
+ } );
} );
} );
} );
From e292955888a0bc9b8844a957cde53f46b8dfa2ab Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 15:50:55 +0530
Subject: [PATCH 037/105] Assert missing retry button assertion.
---
.../dashboard/AudienceErrorModal.test.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
index 6609d7c73fe..9bac77eaafc 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.test.js
@@ -125,7 +125,7 @@ describe( 'AudienceErrorModal', () => {
data: { status: 500 },
};
- const { queryByText, getByText } = render(
+ const { getByRole, getByText, queryByText } = render(
,
{
registry,
@@ -137,6 +137,9 @@ describe( 'AudienceErrorModal', () => {
getByText( /Failed to set up visitor groups/i )
).toBeInTheDocument();
+ // Verify the "Retry" button is displayed.
+ expect( getByRole( 'button', { name: /retry/i } ) ).toBeInTheDocument();
+
// Verify the "Get help" link is not displayed.
expect( queryByText( /get help/i ) ).not.toBeInTheDocument();
From e78f06dfcca8e8b322ad1e64956eee3be927ba19 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 15:51:48 +0530
Subject: [PATCH 038/105] Add generic error variant test case.
---
...AudienceSegmentationSetupCTAWidget.test.js | 51 ++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
index d5d37213787..b9d2407357c 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceSegmentationSetupCTAWidget.test.js
@@ -666,7 +666,7 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
await act( waitForDefaultTimeouts );
} );
- it( 'should show the insufficient permissio error modal when the user does not have the required permissions', async () => {
+ it( 'should show the insufficient permission error modal when the user does not have the required permissions', async () => {
const errorResponse = {
code: 'test_error',
message: 'Error message.',
@@ -719,6 +719,55 @@ describe( 'AudienceSegmentationSetupCTAWidget', () => {
await act( waitForDefaultTimeouts );
} );
+
+ it( 'should show the generic error modal when an internal server error occurs', async () => {
+ const errorResponse = {
+ code: 'internal_server_error',
+ message: 'Internal server error',
+ data: { status: 500 },
+ };
+
+ fetchMock.post( syncAvailableAudiencesEndpoint, {
+ body: errorResponse,
+ status: 500,
+ } );
+
+ // eslint-disable-next-line require-await
+ await act( async () => {
+ render(
+ ,
+ {
+ registry,
+ }
+ );
+ } );
+
+ expect(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ ).toBeInTheDocument();
+
+ act( () => {
+ fireEvent.click(
+ screen.getByRole( 'button', { name: /Enable groups/i } )
+ );
+ } );
+
+ // Verify the error is "Insufficient permissions" variant.
+ await waitFor( () => {
+ expect(
+ screen.getByText( /Failed to set up visitor groups/i )
+ ).toBeInTheDocument();
+
+ // Verify the "Retry" button is displayed.
+ expect(
+ screen.getByRole( 'button', { name: /retry/i } )
+ ).toBeInTheDocument();
+ } );
+
+ await act( waitForDefaultTimeouts );
+ } );
} );
} );
} );
From baec29c5aa73f532663321664b80cd08edb81673 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 16:02:55 +0530
Subject: [PATCH 039/105] Add VRT scenario and clean up.
---
.../dashboard/AudienceErrorModal.stories.js | 24 +++----------------
1 file changed, 3 insertions(+), 21 deletions(-)
diff --git a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
index c4ba13e64c5..87ce4adca41 100644
--- a/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
+++ b/assets/js/modules/analytics-4/components/audience-segmentation/dashboard/AudienceErrorModal.stories.js
@@ -21,13 +21,9 @@
*/
import { ERROR_REASON_INSUFFICIENT_PERMISSIONS } from '../../../../../util/errors';
import { MODULES_ANALYTICS_4 } from '../../../datastore/constants';
-// import { useSelect } from 'googlesitekit-data';
import {
- // WithTestRegistry,
- // createTestRegistry,
provideModules,
provideModuleRegistrations,
- // provideUserInfo,
provideSiteInfo,
} from '../../../../../../../tests/js/test-utils';
import WithRegistrySetup from '../../../../../../../tests/js/WithRegistrySetup';
@@ -42,6 +38,9 @@ Default.storyName = 'Default';
Default.args = {
onRetry: () => {},
};
+Default.scenario = {
+ label: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal/Default',
+};
export const WithInsufficientPermissionsError = Template.bind( {} );
WithInsufficientPermissionsError.storyName = 'Insufficient permissions error';
@@ -66,25 +65,8 @@ WithOAuthError.scenario = {
label: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal/WithOAuthError',
};
-// export const AudienceSyncError = Template.bind( {} );
-// AudienceSyncError.storyName = 'Audience sync error';
-// AudienceSyncError.args = {
-// setupRegistry: ( registry ) => {
-// const error = {
-// code: 'test_error',
-// message: 'Error message.',
-// data: {},
-// };
-
-// registry
-// .dispatch( MODULES_ANALYTICS_4 )
-// .receiveError( error, 'syncAvailableAudiences' );
-// },
-// };
-
export default {
title: 'Modules/Analytics4/Components/AudienceSegmentation/Dashboard/AudienceErrorModal',
- // component: AudienceErrorModal,
decorators: [
( Story ) => {
const setupRegistry = ( registry ) => {
From a31c8c119c7893bbb9732a16cf842638d9aba738 Mon Sep 17 00:00:00 2001
From: Hussain Thajutheen
Date: Fri, 28 Jun 2024 16:10:11 +0530
Subject: [PATCH 040/105] Add VRT images for AudienceErrorModal.
---
...nceErrorModal_Default_0_document_0_small.png | Bin 0 -> 22996 bytes
...ceErrorModal_Default_0_document_1_medium.png | Bin 0 -> 25539 bytes
...nceErrorModal_Default_0_document_2_large.png | Bin 0 -> 26949 bytes
...cientPermissionsError_0_document_0_small.png | Bin 0 -> 22095 bytes
...ientPermissionsError_0_document_1_medium.png | Bin 0 -> 27429 bytes
...cientPermissionsError_0_document_2_large.png | Bin 0 -> 28604 bytes
...rModal_WithOAuthError_0_document_0_small.png | Bin 0 -> 22943 bytes
...Modal_WithOAuthError_0_document_1_medium.png | Bin 0 -> 28541 bytes
...rModal_WithOAuthError_0_document_2_large.png | Bin 0 -> 29173 bytes
9 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_Default_0_document_0_small.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_Default_0_document_1_medium.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_Default_0_document_2_large.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithInsufficientPermissionsError_0_document_0_small.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithInsufficientPermissionsError_0_document_1_medium.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithInsufficientPermissionsError_0_document_2_large.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithOAuthError_0_document_0_small.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithOAuthError_0_document_1_medium.png
create mode 100644 tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_WithOAuthError_0_document_2_large.png
diff --git a/tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_Default_0_document_0_small.png b/tests/backstop/reference/google-site-kit_Modules_Analytics4_Components_AudienceSegmentation_Dashboard_AudienceErrorModal_Default_0_document_0_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaa2f55e63cf23aee5384df50d2163a958f85d03
GIT binary patch
literal 22996
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