Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
Block_Editor_Extensions
0.00% covered (danger)
0.00%
0 / 57
0.00% covered (danger)
0.00%
0 / 4
210
0.00% covered (danger)
0.00%
0 / 1
 init
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
30
 get_list
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
6
 is_extension_available
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 enqueue_extensions
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/**
3 * VideoPress Extensions
4 *
5 * @package automattic/jetpack-videopress
6 */
7
8namespace Automattic\Jetpack\VideoPress;
9
10use Automattic\Jetpack\Connection\Initial_State as Connection_Initial_State;
11use Automattic\Jetpack\Constants;
12use Automattic\Jetpack\Status\Host;
13
14/**
15 * VideoPress Extensions class.
16 */
17class Block_Editor_Extensions {
18    /**
19     * What version of the blocks we are loading.
20     *
21     * @var string
22     */
23    public static $blocks_variation = 'production';
24
25    /**
26     * Script handle
27     *
28     * @var string
29     */
30    public static $script_handle = '';
31
32    /**
33     * Initializer
34     *
35     * This method should be called only once by the Block registrar.
36     * Do not call this method again.
37     *
38     * @param string $script_handle - The script handle.
39     */
40    public static function init( $script_handle ) {
41        if ( ! Status::is_registrant_plugin_active() ) {
42            return;
43        }
44
45        /*
46         * Use the videopress/video editor script handle to localize enqueue scripts.
47         * @see https://developer.wordpress.org/reference/functions/generate_block_asset_handle
48         */
49        self::$script_handle = $script_handle;
50
51        /**
52        * Alternative to `JETPACK_BETA_BLOCKS`, set to `true` to load Beta Blocks.
53        *
54        * @since 6.9.0
55        * @deprecated Jetpack 11.8.0 Use jetpack_blocks_variation filter instead.
56        *
57        * @param boolean
58        */
59        if (
60            apply_filters_deprecated(
61                'jetpack_load_beta_blocks',
62                array( false ),
63                'jetpack-11.8.0',
64                'jetpack_blocks_variation'
65            )
66        ) {
67            self::$blocks_variation = 'beta';
68        }
69
70        /*
71         * Get block variation, from the new constant or the old one.
72         */
73        if ( Constants::is_true( 'JETPACK_BETA_BLOCKS' ) ) {
74            self::$blocks_variation = 'beta';
75        }
76
77        $blocks_variation = Constants::get_constant( 'JETPACK_BLOCKS_VARIATION' );
78        if ( ! empty( $blocks_variation ) ) {
79            /**
80             * Allow customizing the variation of blocks in use on a site.
81             * Overwrites any previously set values, whether by constant or filter.
82             *
83             * @since Jetpack 8.1.0
84             *
85             * @param string $block_variation Can be beta, experimental, and production. Defaults to production.
86             */
87            self::$blocks_variation = apply_filters( 'jetpack_blocks_variation', $blocks_variation );
88        }
89
90        // Register the script.
91        add_action( 'enqueue_block_editor_assets', array( __CLASS__, 'enqueue_extensions' ), 1 );
92    }
93
94    /**
95     * Return the extensions list
96     *
97     * @return array The extensions list.
98     */
99    public static function get_list() {
100        $videopress_extensions_file        = __DIR__ . '/../build/block-editor/extensions/index.json';
101        $videopress_extensions_file_exists = file_exists( $videopress_extensions_file );
102        if ( ! $videopress_extensions_file_exists ) {
103            return;
104        }
105
106        $videopress_extensions_data = (array) json_decode(
107            // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
108            file_get_contents( $videopress_extensions_file )
109        );
110
111        $extensions_list = array_map(
112            function ( $extension ) {
113                return array(
114                    'name'      => $extension,
115                    'isBeta'    => true,
116                    'isEnabled' => 'beta' === self::$blocks_variation,
117                );
118            },
119            $videopress_extensions_data['beta']
120        );
121
122        return $extensions_list;
123    }
124
125    /**
126     * Check if the extension is available
127     *
128     * @param string $slug The extension slug.
129     * @return boolean True if the extension is available, false otherwise.
130     */
131    public static function is_extension_available( $slug ) {
132        $extensions_list = self::get_list();
133        foreach ( $extensions_list as $extension ) {
134            if ( $extension['name'] === $slug ) {
135                return $extension['isEnabled'];
136            }
137        }
138
139        return false;
140    }
141
142    /**
143     * Enqueues the extensions script.
144     */
145    public static function enqueue_extensions() {
146        $extensions_list = self::get_list();
147
148        $site_type = 'jetpack';
149        if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
150            $site_type = 'simple';
151        } elseif ( ( new Host() )->is_woa_site() ) {
152            $site_type = 'atomic';
153        }
154
155        $videopress_editor_state = array(
156            'extensions'                  => $extensions_list,
157            'siteType'                    => $site_type,
158            'myJetpackConnectUrl'         => admin_url( 'admin.php?page=my-jetpack#/connection' ),
159            'jetpackVideoPressSettingUrl' => admin_url( 'admin.php?page=jetpack#/settings?term=videopress' ),
160            'isVideoPressModuleActive'    => Status::is_jetpack_plugin_and_videopress_module_active(),
161            'isStandaloneActive'          => Status::is_standalone_plugin_active(),
162            'imagesURLBase'               => plugin_dir_url( __DIR__ ) . 'build/images/',
163            'playerBridgeUrl'             => plugins_url( '../build/lib/player-bridge.js', __FILE__ ),
164        );
165
166        // Expose initial state of site connection
167        Connection_Initial_State::render_script( self::$script_handle );
168
169        // Expose initial state of videoPress editor
170        wp_localize_script( self::$script_handle, 'videoPressEditorState', $videopress_editor_state );
171    }
172}