-
Notifications
You must be signed in to change notification settings - Fork 382
/
Copy pathindex.js
94 lines (79 loc) · 2.71 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import apiFetch from '@wordpress/api-fetch';
import domReady from '@wordpress/dom-ready';
/**
* Internal dependencies
*/
import './style.css';
/**
* Updates a menu item with its count.
*
* If the count is not a number or is `0`, the element that contains the count is instead removed (as it would be no longer relevant).
*
* @param {HTMLElement} itemEl Menu item element.
* @param {number} count Count to set.
*/
function updateMenuItem( itemEl, count ) {
if ( isNaN( count ) || count === 0 ) {
itemEl.parentNode.removeChild( itemEl );
} else {
itemEl.textContent = count.toLocaleString();
}
}
/**
* Updates the 'Validated URLs' and 'Error Index' menu items with their respective unreviewed count.
*
* @param {Object} counts Counts for menu items.
* @param {number} counts.validated_urls Unreviewed validated URLs count.
* @param {number} counts.errors Unreviewed validation errors count.
*/
function updateMenuItemCounts( counts ) {
const { validated_urls: newValidatedUrlCount, errors: newErrorCount } = counts;
const errorCountEl = document.getElementById( 'new-error-index-count' );
if ( errorCountEl ) {
updateMenuItem( errorCountEl, newErrorCount );
}
const validatedUrlsCountEl = document.getElementById( 'new-validation-url-count' );
if ( validatedUrlsCountEl ) {
updateMenuItem( validatedUrlsCountEl, newValidatedUrlCount );
}
}
/**
* Fetches the validation counts only when the AMP submenu is open for the first time.
*
* @param {HTMLElement} root AMP submenu item.
*/
function createObserver( root ) {
// IntersectionObserver is not available in IE11, so just hide the counts entirely for that browser.
if ( ! ( 'IntersectionObserver' in window ) ) {
updateMenuItemCounts( { validated_urls: 0, errors: 0 } );
return;
}
const target = root.querySelector( 'ul' );
const observer = new IntersectionObserver( ( [ entry ] ) => {
if ( ! entry || ! entry.isIntersecting ) {
return;
}
observer.unobserve( target );
apiFetch( { path: '/amp/v1/unreviewed-validation-counts' } ).then( ( counts ) => {
updateMenuItemCounts( counts );
} ).catch( ( error ) => {
updateMenuItemCounts( { validated_urls: 0, errors: 0 } );
const message = error?.message || __( 'An unknown error occurred while retrieving the validation counts', 'amp' );
// eslint-disable-next-line no-console
console.error( `[AMP Plugin] ${ message }` );
} );
}, { root } );
observer.observe( target );
}
domReady( () => {
const ampMenuItem = document.getElementById( 'toplevel_page_amp-options' );
// Bail if the AMP submenu is not in the DOM.
if ( ! ampMenuItem ) {
return;
}
createObserver( ampMenuItem );
} );