From 38a46256b071dbf87d5ee9de39982649673eb1bb Mon Sep 17 00:00:00 2001
From: Ella <4710635+ellatrix@users.noreply.github.com>
Date: Tue, 4 Feb 2025 18:04:03 +0100
Subject: [PATCH] MU WPCOM: fix admin menu upsell layout shift (#41480)
---
.../changelog/fix-admin-menu-notice-jank | 4 +
.../wpcom-sidebar-notice.js | 74 +++----------------
.../wpcom-sidebar-notice.php | 55 ++++++++------
.../wpcom-sidebar-notice.scss | 36 ++-------
4 files changed, 54 insertions(+), 115 deletions(-)
create mode 100644 projects/packages/jetpack-mu-wpcom/changelog/fix-admin-menu-notice-jank
diff --git a/projects/packages/jetpack-mu-wpcom/changelog/fix-admin-menu-notice-jank b/projects/packages/jetpack-mu-wpcom/changelog/fix-admin-menu-notice-jank
new file mode 100644
index 0000000000000..2f9c3fb2e3d77
--- /dev/null
+++ b/projects/packages/jetpack-mu-wpcom/changelog/fix-admin-menu-notice-jank
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fixed
+
+Fix admin menu jank
diff --git a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.js b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.js
index 5252fdc77dffc..a5ca14392df24 100644
--- a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.js
+++ b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.js
@@ -1,4 +1,4 @@
-/* global wp, wpcomSidebarNoticeConfig */
+/* global wp, wpcomSidebarNoticeData */
import { wpcomTrackEvent } from '../../common/tracks';
import './wpcom-sidebar-notice.scss';
@@ -15,50 +15,15 @@ const wpcomSidebarNoticeRecordEvent = ( event, wpcomSidebarNoticeData ) => {
);
};
-const wpcomShowSidebarNotice = wpcomSidebarNoticeData => {
- const adminMenu = document.querySelector( '#adminmenu' );
- if ( ! adminMenu || ! wpcomSidebarNoticeData ) {
+const wpcomShowSidebarNotice = () => {
+ const sidebarNotice = document.querySelector( '#toplevel_page_site-notices' );
+ if ( ! sidebarNotice || ! wpcomSidebarNoticeData ) {
return;
}
- // Render notice.
- adminMenu.insertAdjacentHTML(
- 'afterbegin',
- `
-
- `
- );
-
// Record impression event in Tracks.
- wpcomSidebarNoticeRecordEvent( wpcomSidebarNoticeData.tracks?.display );
+ wpcomSidebarNoticeRecordEvent( wpcomSidebarNoticeData.tracks?.display, wpcomSidebarNoticeData );
- const sidebarNotice = adminMenu.firstElementChild;
sidebarNotice.addEventListener( 'click', event => {
if (
event.target.classList.contains( 'upsell_banner__dismiss' ) ||
@@ -74,32 +39,15 @@ const wpcomShowSidebarNotice = wpcomSidebarNoticeData => {
sidebarNotice.remove();
// Record dismiss event in Tracks.
- wpcomSidebarNoticeRecordEvent( wpcomSidebarNoticeData.tracks?.dismiss );
+ wpcomSidebarNoticeRecordEvent(
+ wpcomSidebarNoticeData.tracks?.dismiss,
+ wpcomSidebarNoticeData
+ );
} else {
// Record click event in Tracks.
- wpcomSidebarNoticeRecordEvent( wpcomSidebarNoticeData.tracks?.click );
+ wpcomSidebarNoticeRecordEvent( wpcomSidebarNoticeData.tracks?.click, wpcomSidebarNoticeData );
}
} );
};
-const wpcomFetchSidebarNotice = async () => {
- try {
- const response = await fetch(
- `${ wpcomSidebarNoticeConfig.ajaxUrl }?action=wpcom_fetch_sidebar_notice&nonce=${ wpcomSidebarNoticeConfig.nonce }`
- );
-
- if ( response.status !== 200 ) {
- return;
- }
-
- const res = await response.json();
-
- if ( res.success && res.data ) {
- wpcomShowSidebarNotice( res.data );
- }
- } catch {
- // End silently
- }
-};
-
-document.addEventListener( 'DOMContentLoaded', wpcomFetchSidebarNotice );
+document.addEventListener( 'DOMContentLoaded', wpcomShowSidebarNotice );
diff --git a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.php b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.php
index ada1b6fc1383d..bdc74bfa1ce94 100644
--- a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.php
+++ b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.php
@@ -22,6 +22,11 @@
* Enqueue assets needed by the WordPress.com sidebar notice.
*/
function wpcom_enqueue_sidebar_notice_assets() {
+ $data = wpcom_get_sidebar_notice_data();
+ if ( ! $data ) {
+ return;
+ }
+
$asset_file = include Jetpack_Mu_Wpcom::BASE_DIR . 'build/wpcom-sidebar-notice/wpcom-sidebar-notice.asset.php';
wp_enqueue_script(
@@ -42,11 +47,7 @@ function wpcom_enqueue_sidebar_notice_assets() {
$asset_file['version'] ?? filemtime( Jetpack_Mu_Wpcom::BASE_DIR . 'build/wpcom-sidebar-notice/wpcom-sidebar-notice.css' )
);
- $data = array(
- 'ajaxUrl' => admin_url( 'admin-ajax.php' ),
- 'nonce' => wp_create_nonce( 'wpcom_fetch_sidebar_notice' ),
- );
- $inline_script = 'const wpcomSidebarNoticeConfig = ' . wp_json_encode( $data ) . ';';
+ $inline_script = 'const wpcomSidebarNoticeData = ' . wp_json_encode( $data ) . ';';
wp_add_inline_script( 'wpcom-sidebar-notice', $inline_script, 'before' );
}
add_action( 'admin_enqueue_scripts', 'wpcom_enqueue_sidebar_notice_assets' );
@@ -93,15 +94,12 @@ function wpcom_get_sidebar_notice() {
}
/**
- * Fetch sidebar notice data asynchronously via AJAX.
+ * Get sidebar notice data.
*/
-function wpcom_fetch_sidebar_notice_data() {
- check_ajax_referer( 'wpcom_fetch_sidebar_notice', 'nonce' );
-
+function wpcom_get_sidebar_notice_data() {
$notice = wpcom_get_sidebar_notice();
if ( ! $notice ) {
- status_header( 204 );
- wp_die();
+ return;
}
$link = ! empty( $notice['link'] ) ? $notice['link'] : '';
@@ -125,14 +123,7 @@ function wpcom_fetch_sidebar_notice_data() {
}
}
- $data = array(
- 'url' => esc_url( $link ),
- 'text' => wp_kses( $notice['content'] ?? '', array() ),
- 'action' => wp_kses( $notice['cta'] ?? '', array() ),
- 'dismissible' => $notice['dismissible'] ?? false,
- 'dismissLabel' => esc_html__( 'Dismiss', 'jetpack-mu-wpcom' ),
- 'id' => $notice['id'] ?? '',
- 'featureClass' => $notice['feature_class'] ?? '',
+ return array(
'dismissNonce' => wp_create_nonce( 'wpcom_dismiss_sidebar_notice' ),
'tracks' => $notice['tracks'] ?? null,
'user' => array(
@@ -140,10 +131,32 @@ function wpcom_fetch_sidebar_notice_data() {
'username' => $user_login,
),
);
+}
+
+/**
+ * Add a menu page to the admin menu.
+ */
+function wpcom_add_sidebar_notice_menu_page() {
+ $notice = wpcom_get_sidebar_notice();
+ if ( ! $notice ) {
+ return;
+ }
+
+ $link = ! empty( $notice['link'] ) ? $notice['link'] : '';
+ if ( str_starts_with( $link, '/' ) ) {
+ $link = 'https://wordpress.com' . $link;
+ }
- wp_send_json_success( $data );
+ echo '';
+ echo '';
+ echo '';
+ echo '';
}
-add_action( 'wp_ajax_wpcom_fetch_sidebar_notice', 'wpcom_fetch_sidebar_notice_data' );
+add_action( 'adminmenu', 'wpcom_add_sidebar_notice_menu_page' );
/**
* Handle AJAX requests to dismiss a sidebar notice.
diff --git a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.scss b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.scss
index 884fa91b11d6d..62ccc5968d21f 100644
--- a/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.scss
+++ b/projects/packages/jetpack-mu-wpcom/src/features/wpcom-sidebar-notice/wpcom-sidebar-notice.scss
@@ -38,15 +38,8 @@
/**
* Sidebar notice
*/
-#adminmenu li.menu-top.toplevel_page_site-notices {
- &:hover,
- &:focus {
- background-color: inherit;
- }
-
+#adminmenu li.toplevel_page_site-notices {
a {
- cursor: default;
-
&:hover,
&:focus {
box-shadow: none;
@@ -54,9 +47,7 @@
}
}
- .wp-menu-name {
- padding: 0 8px 8px 8px;
- }
+ padding: 0 8px 8px 8px;
.upsell_banner {
border-radius: 2px;
@@ -66,34 +57,17 @@
gap: 6px;
}
- .upsell_banner__icon {
- display: none;
-
- &:before {
- content: '\f534';
- font-family: 'dashicons';
- background-color: #a7aaad;
- color: white;
- border-radius: 50%;
- }
- }
-
.upsell_banner__text {
font-size: 12px;
line-height: 16px;
}
.upsell_banner__action {
- width: 100%;
- font-size: 13px;
- line-height: 20px;
- cursor: pointer;
- min-height: 32px;
- margin-bottom: 0;
- border: 0;
+ text-align: center;
+ line-height: 2;
}
- .upsell_banner__dismiss {
+ .upsell_banner__dismiss.button-link {
background-color: transparent;
color: inherit;
min-height: 0;