PluginProbe ʕ •ᴥ•ʔ
Presto Player / 4.3.3
Presto Player v4.3.3
4.3.3 4.3.2 4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / blocks / scripts / popup.js
presto-player / src / admin / blocks / scripts Last commit date
popup.js 6 days ago
popup.js
117 lines
1 /**
2 * WordPress dependencies
3 */
4 import { store, getContext, getElement } from '@wordpress/interactivity';
5 const { __ } = wp.i18n;
6
7 const { state, actions } = store( 'presto-player/popup', {
8 state: {
9 activePopupId: null,
10 screenReaderText: '',
11 triggerRef: null,
12 inertElements: [],
13 get overlayEnabled() {
14 const ctx = getContext();
15 return state?.activePopupId === ctx?.id;
16 },
17
18 /**
19 * Gets the ARIA role attribute for the popup.
20 *
21 * @return {string|null} 'dialog' if overlay is open, null otherwise.
22 */
23 get roleAttribute() {
24 return state?.overlayEnabled ? 'dialog' : null;
25 },
26
27 /**
28 * Gets the ARIA modal attribute for the popup.
29 *
30 * @return {string|null} 'true' if overlay is open, null otherwise.
31 */
32 get ariaModal() {
33 return state?.overlayEnabled ? 'true' : null;
34 },
35 },
36
37 actions: {
38 showPopup() {
39 const ctx = getContext();
40 const { ref } = getElement();
41
42 // Update the active popup id for the current popup.
43 state.activePopupId = ctx?.id;
44
45 // make all children of the document inert exempt .presto-popup__overlay.
46 document
47 .querySelectorAll( 'body > :not(.presto-popup__overlay)' )
48 .forEach( ( el ) => {
49 if ( ! el?.hasAttribute( 'inert' ) ) {
50 el?.setAttribute( 'inert', '' );
51 state?.inertElements?.push( el );
52 }
53 } );
54
55 // Set the trigger button ref. This is used to focus the trigger button when the popup is closed.
56 state.triggerRef = ref;
57 },
58 hidePopup() {
59 // Clear the active popup id.
60 state.activePopupId = null;
61
62 // remove inert attribute from all children of the document
63 ( state?.inertElements || [] ).forEach( ( el ) => {
64 el?.removeAttribute( 'inert' );
65 } );
66 state.inertElements = [];
67
68 // Focus the trigger button when the popup is closed.
69 setTimeout( () => {
70 state?.triggerRef?.focus();
71 }, 0 );
72
73 // Set the screen reader text to an empty string when the popup is closed.
74 state.screenReaderText = '';
75 },
76 },
77 callbacks: {
78 setOverlayFocus() {
79 if ( ! state?.overlayEnabled ) {
80 return;
81 }
82 // Moves the focus to the dialog when it opens.
83 const { ref } = getElement();
84
85 // Make sure the dialog is rendered and visible before focusing.
86 setTimeout( () => {
87 ref?.focus();
88 }, 0 );
89
90 // If the popup is open, set the screen reader text.
91 state.screenReaderText = __(
92 'Presto Popup dialog opened.',
93 'presto-player'
94 );
95 },
96 handleKeydown( event ) {
97 // Opens the popup when Enter is pressed while the trigger is focused.
98 // Bound to the trigger element only, so Enter elsewhere on the page is ignored.
99 if ( event?.key === 'Enter' && ! state?.overlayEnabled ) {
100 actions.showPopup();
101 }
102 },
103 handleDocumentKeydown( event ) {
104 // Closes the popup when Escape is pressed. Bound to the document because
105 // focus lives inside the dialog while it is open.
106 if ( event?.key === 'Escape' && state?.overlayEnabled ) {
107 actions.hidePopup();
108 }
109 },
110 updatePopupList() {
111 // Update the popup list for the current popup.
112 const ctx = getContext();
113 ctx.popupList = state?.overlayEnabled ? [ ctx?.id ] : [];
114 },
115 },
116 } );
117