PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
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 9 months ago
popup.js
113 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 the user presses the enter key.
98 if (event?.key === "Enter" && !state?.overlayEnabled) {
99 actions.showPopup();
100 }
101 // Closes the popup when the user presses the escape key.
102 if (event?.key === "Escape" && state?.overlayEnabled) {
103 actions.hidePopup();
104 }
105 },
106 updatePopupList() {
107 // Update the popup list for the current popup.
108 const ctx = getContext();
109 ctx.popupList = state?.overlayEnabled ? [ctx?.id] : [];
110 },
111 },
112 });
113