Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 129
0.00% covered (danger)
0.00%
0 / 5
CRAP
n/a
0 / 0
Automattic\Jetpack\Extensions\Mailchimp\load_assets_implementation
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 1
182
Automattic\Jetpack\Extensions\Mailchimp\verify_connection
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
20
Automattic\Jetpack\Extensions\Mailchimp\get_attributes_with_defaults
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
6
Automattic\Jetpack\Extensions\Mailchimp\render_button
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
Automattic\Jetpack\Extensions\Mailchimp\render_deprecated_button
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 * Mailchimp block render implementation.
4 *
5 * Loaded lazily from mailchimp.php only when the block is rendered, to keep the
6 * render body out of the eager front-end PHP/opcache footprint.
7 *
8 * @package automattic/jetpack
9 */
10
11namespace Automattic\Jetpack\Extensions\Mailchimp;
12
13use Automattic\Jetpack\Blocks;
14use Jetpack_Gutenberg;
15use Jetpack_Options;
16
17if ( ! defined( 'ABSPATH' ) ) {
18    exit( 0 );
19}
20
21/**
22 * Mailchimp block registration/dependency declaration.
23 *
24 * @param array  $attr - Array containing the Mailchimp block attributes.
25 * @param string $content - Mailchimp block content.
26 *
27 * @return string
28 */
29function load_assets_implementation( $attr, $content ) {
30
31    if ( ! verify_connection() ) {
32        return null;
33    }
34
35    $values  = get_attributes_with_defaults( $attr );
36    $blog_id = ( defined( 'IS_WPCOM' ) && IS_WPCOM )
37        ? get_current_blog_id()
38        : Jetpack_Options::get_option( 'id' );
39    Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
40    $wrapper_attributes = \WP_Block_Supports::get_instance()->apply_block_supports();
41    $classes            = ! empty( $wrapper_attributes['class'] ) ? $wrapper_attributes['class'] : '';
42    $amp_form_action    = sprintf( 'https://public-api.wordpress.com/rest/v1.1/sites/%s/email_follow/amp/subscribe/', $blog_id );
43    $is_amp_request     = Blocks::is_amp_request();
44
45    ob_start();
46    ?>
47
48    <div class="<?php echo esc_attr( $classes ); ?>"<?php echo ! empty( $wrapper_attributes['style'] ) ? ' style="' . esc_attr( $wrapper_attributes['style'] ) . '"' : ''; ?> data-blog-id="<?php echo esc_attr( $blog_id ); ?>">
49        <form
50            aria-describedby="wp-block-jetpack-mailchimp_consent-text"
51            <?php if ( $is_amp_request ) : ?>
52                action-xhr="<?php echo esc_url( $amp_form_action ); ?>"
53                method="post"
54                id="mailchimp_form"
55                target="_top"
56                on="submit-success:AMP.setState( { mailing_list_status: 'subscribed', mailing_list_email: event.response.email } )"
57            <?php endif; ?>
58        >
59            <p>
60                <input
61                    aria-label="<?php echo esc_attr( $values['emailPlaceholder'] ); ?>"
62                    placeholder="<?php echo esc_attr( $values['emailPlaceholder'] ); ?>"
63                    required
64                    title="<?php echo esc_attr( $values['emailPlaceholder'] ); ?>"
65                    type="email"
66                    name="email"
67                />
68            </p>
69            <?php foreach ( is_array( $values['interests'] ) ? $values['interests'] : array() as $interest ) : ?>
70                <input
71                    name="interests[<?php echo esc_attr( $interest ); ?>]"
72                    type="hidden"
73                    class="mc-submit-param"
74                    value="1"
75                />
76            <?php endforeach; ?>
77            <?php
78            if (
79                ! empty( $values['signupFieldTag'] )
80                && ! empty( $values['signupFieldValue'] )
81                ) :
82                ?>
83                <input
84                    name="merge_fields[<?php echo esc_attr( $values['signupFieldTag'] ); ?>]"
85                    type="hidden"
86                    class="mc-submit-param"
87                    value="<?php echo esc_attr( $values['signupFieldValue'] ); ?>"
88                />
89            <?php endif; ?>
90            <?php echo render_button( $attr, $content ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
91            <p id="wp-block-jetpack-mailchimp_consent-text">
92                <?php echo wp_kses_post( $values['consentText'] ); ?>
93            </p>
94
95            <?php if ( $is_amp_request ) : ?>
96
97                <div submit-success>
98                    <template type="amp-mustache">
99                        <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_success wp-block-jetpack-mailchimp__is-amp">
100                            <?php echo esc_html( $values['successLabel'] ); ?>
101                        </div>
102                    </template>
103                </div>
104                <div submit-error>
105                    <template type="amp-mustache">
106                        <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_error wp-block-jetpack-mailchimp__is-amp">
107                            <?php echo esc_html( $values['errorLabel'] ); ?>
108                        </div>
109                    </template>
110                </div>
111                <div submitting>
112                    <template type="amp-mustache">
113                        <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_processing wp-block-jetpack-mailchimp__is-amp" role="status">
114                            <?php echo esc_html( $values['processingLabel'] ); ?>
115                        </div>
116                    </template>
117                </div>
118
119            <?php endif; ?>
120
121        </form>
122        <?php if ( ! $is_amp_request ) : ?>
123
124            <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_processing" role="status">
125                <?php echo esc_html( $values['processingLabel'] ); ?>
126            </div>
127            <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_success" role="status">
128                <?php echo esc_html( $values['successLabel'] ); ?>
129            </div>
130            <div class="wp-block-jetpack-mailchimp_notification wp-block-jetpack-mailchimp_error" role="alert">
131                <?php echo esc_html( $values['errorLabel'] ); ?>
132            </div>
133
134        <?php endif; ?>
135    </div>
136    <?php
137    $html = ob_get_clean();
138    return $html;
139}
140
141/**
142 * Mailchimp connection/list selection verification.
143 *
144 * @return boolean
145 */
146function verify_connection() {
147    $option = get_option( 'jetpack_mailchimp' );
148    if ( ! $option ) {
149        return false;
150    }
151    $data = json_decode( $option, true );
152    if ( ! $data ) {
153        return false;
154    }
155    return isset( $data['follower_list_id'] ) && isset( $data['keyring_id'] );
156}
157
158/**
159 * Builds complete set of attributes using default values where needed.
160 *
161 * @param array $attr Saved set of attributes for the Mailchimp block.
162 * @return array
163 */
164function get_attributes_with_defaults( $attr ) {
165    $values   = array();
166    $defaults = array(
167        'emailPlaceholder' => esc_html__( 'Enter your email', 'jetpack' ),
168        'consentText'      => esc_html__( 'By clicking submit, you agree to share your email address with the site owner and Mailchimp to receive marketing, updates, and other emails from the site owner. Use the unsubscribe link in those emails to opt out at any time.', 'jetpack' ),
169        'processingLabel'  => esc_html__( 'Processing…', 'jetpack' ),
170        'successLabel'     => esc_html__( 'Success! You\'re on the list.', 'jetpack' ),
171        'errorLabel'       => esc_html__( 'Whoops! There was an error and we couldn\'t process your subscription. Please reload the page and try again.', 'jetpack' ),
172        'interests'        => array(),
173        'signupFieldTag'   => '',
174        'signupFieldValue' => '',
175    );
176
177    foreach ( $defaults as $id => $default ) {
178        $values[ $id ] = $attr[ $id ] ?? $default;
179    }
180
181    return $values;
182}
183
184/**
185 * Renders the Mailchimp block button using inner block content if available
186 * otherwise generating the HTML button from deprecated attributes.
187 *
188 * @param array  $attr Attributes for the Mailchimp block.
189 * @param string $content Mailchimp block content.
190 *
191 * @return string
192 */
193function render_button( $attr, $content ) {
194    if ( ! empty( $content ) ) {
195        $block_id = wp_unique_id( 'mailchimp-button-block-' );
196        return str_replace( 'mailchimp-widget-id', $block_id, $content );
197    }
198
199    return render_deprecated_button( $attr );
200}
201
202/**
203 * Renders HTML button from deprecated Mailchimp block attributes.
204 *
205 * @param array $attr Mailchimp block attributes.
206 * @return string
207 */
208function render_deprecated_button( $attr ) {
209    $default       = esc_html__( 'Join my email list', 'jetpack' );
210    $text          = empty( $attr['submitButtonText'] ) ? $default : $attr['submitButtonText'];
211    $button_styles = array();
212
213    if ( ! empty( $attr['customBackgroundButtonColor'] ) ) {
214        array_push(
215            $button_styles,
216            sprintf(
217                'background-color: %s',
218                sanitize_hex_color( $attr['customBackgroundButtonColor'] )
219            )
220        );
221    }
222
223    if ( ! empty( $attr['customTextButtonColor'] ) ) {
224        array_push(
225            $button_styles,
226            sprintf(
227                'color: %s',
228                sanitize_hex_color( $attr['customTextButtonColor'] )
229            )
230        );
231    }
232
233    $button_styles  = implode( ';', $button_styles );
234    $button_classes = 'components-button is-button is-primary ';
235
236    if ( ! empty( $attr['submitButtonClasses'] ) ) {
237        $button_classes .= $attr['submitButtonClasses'];
238    }
239
240    return sprintf(
241        '<p><button type="submit" class="%s" style="%s">%s</button></p>',
242        esc_attr( $button_classes ),
243        esc_attr( $button_styles ),
244        wp_kses_post( $text )
245    );
246}