Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
81.25% covered (warning)
81.25%
52 / 64
50.00% covered (danger)
50.00%
1 / 2
CRAP
n/a
0 / 0
Automattic\Jetpack\Extensions\AIAssistant\register_block
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
5
Automattic\Jetpack\Extensions\AIAssistant\load_assets
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jetpack AI Assistant Block.
4 *
5 * @since 12.2
6 *
7 * @package automattic/jetpack
8 */
9
10namespace Automattic\Jetpack\Extensions\AIAssistant;
11
12use Automattic\Jetpack\Blocks;
13use Automattic\Jetpack\Status;
14use Automattic\Jetpack\Status\Host;
15use Jetpack_Gutenberg;
16
17if ( ! defined( 'ABSPATH' ) ) {
18    exit( 0 );
19}
20
21// Required directly rather than relying on the plugin bootstrap: on
22// WordPress.com Simple the extension files load through wpcom's own loader
23// and load-jetpack.php never runs.
24// This file loads before PHPUnit starts collecting coverage.
25// @codeCoverageIgnoreStart
26require_once __DIR__ . '/../../../_inc/lib/class-jetpack-ai-settings.php';
27// @codeCoverageIgnoreEnd
28
29/**
30 * Registers our block for use in Gutenberg
31 * This is done via an action so that we can disable
32 * registration if we need to.
33 */
34function register_block() {
35    if ( ! ( new Host() )->is_wpcom_simple() && ( new Status() )->is_offline_mode() ) {
36        return;
37    }
38
39    if ( ! \Jetpack_AI_Settings::is_ai_enabled() ) {
40        Jetpack_Gutenberg::set_extension_unavailable( 'ai-assistant', 'ai_disabled' );
41        return;
42    }
43
44    if ( ! \Jetpack_AI_Settings::is_feature_enabled( 'writing_assistant' ) ) {
45        Jetpack_Gutenberg::set_extension_unavailable( 'ai-assistant', 'ai_disabled', array( 'feature' => 'writing_assistant' ) );
46        return;
47    }
48
49    Blocks::jetpack_register_block(
50        __DIR__,
51        array( 'render_callback' => __NAMESPACE__ . '\load_assets' )
52    );
53}
54add_action( 'init', __NAMESPACE__ . '\register_block' );
55
56/**
57 * Jetpack AI Assistant block registration/dependency declaration.
58 *
59 * @param array  $attr    Array containing the Jetpack AI Assistant block attributes.
60 * @param string $content String containing the Jetpack AI Assistant block content.
61 *
62 * @return string
63 */
64function load_assets( $attr, $content ) {
65    /*
66     * Enqueue necessary scripts and styles.
67     */
68    Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
69
70    return sprintf(
71        '<div class="%1$s">%2$s</div>',
72        esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
73        $content
74    );
75}
76
77/**
78 * Register extensions.
79 */
80add_action(
81    'jetpack_register_gutenberg_extensions',
82    function () {
83        if ( \Jetpack_AI_Settings::is_ai_enabled() ) {
84            // The usage meter reports on every AI feature, so it follows the
85            // master switch alone.
86            Jetpack_Gutenberg::set_extension_available( 'ai-assistant-usage-panel' );
87
88            if ( \Jetpack_AI_Settings::is_feature_enabled( 'writing_assistant' ) ) {
89                Jetpack_Gutenberg::set_extension_available( 'ai-content-lens' );
90                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-support' );
91                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-form-support' );
92                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-backend-prompts' );
93                Jetpack_Gutenberg::set_extension_available( 'ai-title-optimization' );
94                Jetpack_Gutenberg::set_extension_available( 'ai-title-optimization-keywords-support' );
95
96                $site_locale = get_locale();
97                // Only enable Write Brief for sites with an English locale.
98                // Disabled by default; set the 'breve_enabled' filter to true to re-enable.
99                if ( str_starts_with( $site_locale, 'en' ) && apply_filters( 'breve_enabled', false ) ) {
100                    Jetpack_Gutenberg::set_extension_available( 'ai-proofread-breve' );
101                }
102
103                if ( apply_filters( 'ai_correct_spelling_enabled', false ) ) {
104                    Jetpack_Gutenberg::set_extension_available( 'ai-correct-spelling' );
105                }
106            }
107
108            if ( \Jetpack_AI_Settings::is_feature_enabled( 'image_editor' ) ) {
109                Jetpack_Gutenberg::set_extension_available( 'ai-featured-image-generator' );
110                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-experimental-image-generation-support' );
111                Jetpack_Gutenberg::set_extension_available( 'ai-general-purpose-image-generator' );
112                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-site-logo-support' );
113                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-image-extension' );
114            }
115
116            if ( apply_filters( 'ai_seo_enhancer_enabled', true ) ) {
117                Jetpack_Gutenberg::set_availability_for_plan( 'ai-seo-enhancer' );
118            }
119        }
120    }
121);
122
123/**
124 * Register the `ai-list-to-table-transform` extension.
125 */
126add_action(
127    'jetpack_register_gutenberg_extensions',
128    function () {
129        if ( \Jetpack_AI_Settings::is_ai_enabled() &&
130            apply_filters( 'list_to_table_transform_enabled', false )
131        ) {
132            \Jetpack_Gutenberg::set_extension_available( 'ai-list-to-table-transform' );
133        }
134    }
135);
136
137/**
138 * Register the `ai-response-feedback` extension.
139 */
140add_action(
141    'jetpack_register_gutenberg_extensions',
142    function () {
143        if ( \Jetpack_AI_Settings::is_ai_enabled() &&
144            apply_filters( 'ai_response_feedback_enabled', true )
145        ) {
146            \Jetpack_Gutenberg::set_extension_available( 'ai-response-feedback' );
147        }
148    }
149);