PluginProbe ʕ •ᴥ•ʔ
Presto Player / 4.3.1
Presto Player v4.3.1
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 / inc / Blocks / PopupMediaBlock.php
presto-player / inc / Blocks Last commit date
AudioBlock.php 9 months ago MediaHubBlock.php 9 months ago PopupBlock.php 10 months ago PopupMediaBlock.php 7 months ago PopupTriggerBlock.php 10 months ago ReusableEditBlock.php 9 months ago ReusableVideoBlock.php 2 weeks ago SelfHostedBlock.php 9 months ago VimeoBlock.php 9 months ago YouTubeBlock.php 9 months ago
PopupMediaBlock.php
143 lines
1 <?php
2 /**
3 * Popup Media block.
4 *
5 * @package PrestoPlayer\Blocks
6 */
7
8 namespace PrestoPlayer\Blocks;
9
10 /**
11 * Popup Media block.
12 */
13 class PopupMediaBlock {
14
15 /**
16 * Register the block type.
17 */
18 public function register() {
19 if ( ! file_exists( PRESTO_PLAYER_PLUGIN_DIR . 'src/admin/blocks/blocks/popup-media' ) ) {
20 return;
21 }
22
23 add_action( 'init', array( $this, 'register_block' ) );
24 add_filter( 'enqueue_empty_block_content_assets', array( $this, 'enqueue_empty_block_content_assets' ), 10, 2 );
25 }
26
27 /**
28 * Registers the popup media block with WordPress.
29 */
30 public function register_block() {
31 register_block_type(
32 PRESTO_PLAYER_PLUGIN_DIR . 'src/admin/blocks/blocks/popup-media',
33 array(
34 'render_callback' => array( $this, 'render_block' ),
35 )
36 );
37 }
38
39 /**
40 * Filters whether to enqueue assets for a block which has no rendered content.
41 *
42 * In WordPress 6.9+, assets enqueued by a block are dequeued again if the block
43 * ultimately renders no content. The popup media block renders its overlay markup
44 * in the footer for accessibility reasons, so its main render callback returns
45 * empty content. Opt this block out so its styles and scripts are preserved.
46 *
47 * @param bool $enqueue Whether to enqueue assets.
48 * @param string $block_name Block name.
49 *
50 * @return bool
51 */
52 public function enqueue_empty_block_content_assets( $enqueue, $block_name ) {
53 if ( 'presto-player/popup-media' === $block_name ) {
54 return true;
55 }
56
57 return $enqueue;
58 }
59
60 /**
61 * Renders the block content for the popup media block.
62 *
63 * @param array $attributes The block attributes.
64 * @param string $content The block content.
65 * @param WP_Block $block The block instance.
66 * @return void
67 */
68 public function render_block( $attributes, $content, $block ) {
69 // We are setting this popup id because we need to be able to target the popup overlay.
70 $popup_id = $block->context['presto-player/popup-id'] ?? null;
71
72 $wrapper_attributes = get_block_wrapper_attributes(
73 array(
74 'class' => 'presto-popup__overlay',
75 'aria-label' => esc_attr__( 'Presto Popup', 'presto-player' ),
76 'data-wp-interactive' => 'presto-player/popup',
77 'data-wp-bind--role' => 'state.roleAttribute',
78 'data-wp-bind--aria-modal' => 'state.ariaModal',
79 'data-wp-class--presto-popup--active' => 'state.overlayEnabled',
80 'data-wp-watch' => 'callbacks.setOverlayFocus',
81 'tabindex' => '-1',
82 )
83 );
84
85 add_action(
86 'wp_footer',
87 function () use ( $content, $popup_id, $wrapper_attributes ) {
88 echo $this->render_overlay( $content, $popup_id, $wrapper_attributes ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
89 },
90 99
91 );
92 }
93
94 /**
95 * Renders the block content for the popup media block.
96 * We are rendering the overlay in footer for accessibility reasons.
97 *
98 * @param string $content The block content.
99 * @param int $id The popup ID.
100 * @param string $wrapper_attributes The wrapper attributes.
101 * @return string The rendered HTML for the block.
102 */
103 public function render_overlay( $content, $id, $wrapper_attributes ) {
104 ob_start();
105 ?>
106 <div <?php echo wp_kses_data( $wrapper_attributes ); ?>
107 <?php
108 echo wp_kses_data(
109 wp_interactivity_data_wp_context(
110 array(
111 'id' => $id,
112 'popupList' => array(),
113 )
114 )
115 );
116 ?>
117 >
118 <button type="button" aria-label="<?php esc_attr_e( 'Close', 'presto-player' ); ?>" class="presto-popup__close-button" data-wp-on--click="actions.hidePopup">
119 <svg
120 xmlns="http://www.w3.org/2000/svg"
121 viewBox="0 0 24 24"
122 width="24"
123 height="24"
124 aria-hidden="true"
125 focusable="false"
126 fill="white"
127 >
128 <path d="m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z"/>
129 </svg>
130 </button>
131 <template data-wp-each="context.popupList" data-wp-watch="callbacks.updatePopupList">
132 <div data-wp-each-key="index" class="presto-popup__content">
133 <?php echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
134 </div>
135 </template>
136 <div data-wp-text="state.screenReaderText" aria-live="polite" aria-atomic="true" class="presto-popup__speak screen-reader-text"></div>
137 <div class="presto-popup__scrim" aria-hidden="true" data-wp-on--click="actions.hidePopup"></div>
138 </div>
139 <?php
140 return ob_get_clean();
141 }
142 }
143