Completed
Push — update/jitms_register_once ( 730f34...3682d8 )
by
unknown
92:30 queued 81:28
created

JITM::jitms_enabled()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 0
dl 0
loc 20
rs 9.6
c 0
b 0
f 0
1
<?php
2
/**
3
 * Jetpack's JITM class.
4
 *
5
 * @package automattic/jetpack-jitm
6
 */
7
8
namespace Automattic\Jetpack\JITMS;
9
10
use Automattic\Jetpack\Assets;
11
use Automattic\Jetpack\Assets\Logo as Jetpack_Logo;
12
use Automattic\Jetpack\Connection\Manager as Connection_Manager;
13
use Automattic\Jetpack\Status;
14
15
/**
16
 * Jetpack just in time messaging through out the admin
17
 *
18
 * @since 5.6.0
19
 */
20
class JITM {
21
22
	const PACKAGE_VERSION = '1.15.1-alpha';
23
24
	/**
25
	 * Whether the JITMs have been registered.
26
	 *
27
	 * @var bool
28
	 */
29
	private static $jitms_registered = false;
30
31
	/**
32
	 * The configuration method that is called from the jetpack-config package.
33
	 */
34
	public static function configure() {
35
		$jitm = self::get_instance();
36
		if ( ! self::$jitms_registered ) {
37
			$jitm->register();
38
		}
39
	}
40
41
	/**
42
	 * Pre/Post Connection JITM factory metod
43
	 *
44
	 * @return Post_Connection_JITM|Pre_Connection_JITM JITM instance.
45
	 */
46
	public static function get_instance() {
47
		if ( ( new Connection_Manager() )->is_connected() ) {
48
			$jitm = new Post_Connection_JITM();
49
		} else {
50
			$jitm = new Pre_Connection_JITM();
51
		}
52
		return $jitm;
53
	}
54
55
	/**
56
	 * Sets up JITM action callbacks if needed.
57
	 */
58
	private function register() {
59
		self::$jitms_registered = true;
60
61
		if ( ! $this->jitms_enabled() ) {
62
			// Do nothing.
63
			return;
64
		}
65
66
		add_action( 'rest_api_init', array( __NAMESPACE__ . '\\Rest_Api_Endpoints', 'register_endpoints' ) );
67
68
		add_action( 'current_screen', array( $this, 'prepare_jitms' ) );
69
	}
70
71
	/**
72
	 * Checks the jetpack_just_in_time_msgs filters and whether the site
73
	 * is offline to determine whether JITMs are enabled.
74
	 *
75
	 * @return bool True if JITMs are enabled, else false.
76
	 */
77
	public function jitms_enabled() {
78
		/**
79
		 * Filter to turn off all just in time messages
80
		 *
81
		 * @since 3.7.0
82
		 * @since 5.4.0 Correct docblock to reflect default arg value
83
		 *
84
		 * @param bool true Whether to show just in time messages.
85
		 */
86
		if ( ! apply_filters( 'jetpack_just_in_time_msgs', true ) ) {
87
			return false;
88
		}
89
90
		// Folks cannot connect to WordPress.com and won't really be able to act on the pre-connection messages. So bail.
91
		if ( ( new Status() )->is_offline_mode() ) {
92
			return false;
93
		}
94
95
		return true;
96
	}
97
98
	/**
99
	 * Prepare actions according to screen and post type.
100
	 *
101
	 * @since 3.8.2
102
	 *
103
	 * @uses Jetpack_Autoupdate::get_possible_failures()
104
	 *
105
	 * @param \WP_Screen $screen WP Core's screen object.
106
	 */
107
	public function prepare_jitms( $screen ) {
108
		/**
109
		 * Filter to hide JITMs on certain screens.
110
		 *
111
		 * @since 9.5.0
112
		 *
113
		 * @param bool true Whether to show just in time messages.
114
		 * @param string $string->id The ID of the current screen.
115
		 */
116
		if ( apply_filters( 'jetpack_display_jitms_on_screen', true, $screen->id ) ) {
0 ignored issues
show
Unused Code introduced by
The call to apply_filters() has too many arguments starting with $screen->id.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
117
			add_action( 'admin_enqueue_scripts', array( $this, 'jitm_enqueue_files' ) );
118
			add_action( 'admin_notices', array( $this, 'ajax_message' ) );
119
			add_action( 'edit_form_top', array( $this, 'ajax_message' ) );
120
		}
121
	}
122
123
	/**
124
	 * Function to enqueue jitm css and js
125
	 */
126
	public function jitm_enqueue_files() {
127
		if ( $this->is_gutenberg_page() ) {
128
			return;
129
		}
130
		$min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
131
		wp_register_style(
132
			'jetpack-jitm-css',
133
			plugins_url( "css/jetpack-admin-jitm{$min}.css", __FILE__ ),
134
			false,
135
			self::PACKAGE_VERSION .
136
			'-201243242'
137
		);
138
		wp_style_add_data( 'jetpack-jitm-css', 'rtl', 'replace' );
139
		wp_style_add_data( 'jetpack-jitm-css', 'suffix', $min );
140
		wp_enqueue_style( 'jetpack-jitm-css' );
141
142
		wp_enqueue_script(
143
			'jetpack-jitm-new',
144
			Assets::get_file_url_for_environment( 'js/jetpack-jitm.min.js', 'js/jetpack-jitm.js', __FILE__ ),
145
			array( 'jquery' ),
146
			self::PACKAGE_VERSION,
147
			true
148
		);
149
		wp_localize_script(
150
			'jetpack-jitm-new',
151
			'jitm_config',
152
			array(
153
				'api_root'               => esc_url_raw( rest_url() ),
154
				'activate_module_text'   => esc_html__( 'Activate', 'jetpack' ),
155
				'activated_module_text'  => esc_html__( 'Activated', 'jetpack' ),
156
				'activating_module_text' => esc_html__( 'Activating', 'jetpack' ),
157
				'nonce'                  => wp_create_nonce( 'wp_rest' ),
158
			)
159
		);
160
	}
161
162
	/**
163
	 * Is the current page a block editor page?
164
	 *
165
	 * @since 8.0.0
166
	 */
167
	public function is_gutenberg_page() {
168
		$current_screen = get_current_screen();
169
		return ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() );
170
	}
171
172
	/**
173
	 * Get's the current message path for display of a JITM
174
	 *
175
	 * @return string The message path
176
	 */
177
	public function get_message_path() {
178
		$screen = get_current_screen();
179
180
		return 'wp:' . $screen->id . ':' . current_filter();
181
	}
182
183
	/**
184
	 * Injects the dom to show a JITM inside of wp-admin.
185
	 */
186
	public function ajax_message() {
187
		if ( ! is_admin() ) {
188
			return;
189
		}
190
191
		// do not display on Gutenberg pages.
192
		if ( $this->is_gutenberg_page() ) {
193
			return;
194
		}
195
196
		$message_path   = $this->get_message_path();
197
		$query_string   = _http_build_query( $_GET, '', ',' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
198
		$current_screen = wp_unslash( $_SERVER['REQUEST_URI'] );
199
		?>
200
		<div class="jetpack-jitm-message"
201
			data-nonce="<?php echo esc_attr( wp_create_nonce( 'wp_rest' ) ); ?>"
202
			data-ajax-nonce="<?php echo esc_attr( wp_create_nonce( 'wp_ajax_action' ) ); ?>"
203
			data-message-path="<?php echo esc_attr( $message_path ); ?>"
204
			data-query="<?php echo urlencode_deep( $query_string ); ?>"
205
			data-redirect="<?php echo urlencode_deep( $current_screen ); ?>"
206
		></div>
207
		<?php
208
	}
209
210
	/**
211
	 * Generate the icon to display on the JITM
212
	 *
213
	 * @param string $content_icon Icon type name.
214
	 * @param bool   $full_jp_logo_exists Is there a big JP logo already displayed on this screen.
215
	 */
216
	public function generate_icon( $content_icon, $full_jp_logo_exists ) {
217
		switch ( $content_icon ) {
218
			case 'jetpack':
219
				$jetpack_logo = new Jetpack_Logo();
220
				$content_icon = '<div class="jp-emblem">' . ( ( $full_jp_logo_exists ) ? $jetpack_logo->get_jp_emblem() : $jetpack_logo->get_jp_emblem_larger() ) . '</div>';
221
				break;
222
			case 'woocommerce':
223
				$content_icon = '<div class="jp-emblem"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 168 100" xml:space="preserve" enable-background="new 0 0 168 100" width="50" height="30"><style type="text/css">
224
				.st0{clip-path:url(#SVGID_2_);enable-background:new    ;}
225
				.st1{clip-path:url(#SVGID_4_);}
226
				.st2{clip-path:url(#SVGID_6_);}
227
				.st3{clip-path:url(#SVGID_8_);fill:#8F567F;}
228
				.st4{clip-path:url(#SVGID_10_);fill:#FFFFFE;}
229
				.st5{clip-path:url(#SVGID_12_);fill:#FFFFFE;}
230
				.st6{clip-path:url(#SVGID_14_);fill:#FFFFFE;}
231
			</style><g><defs><polygon id="SVGID_1_" points="83.8 100 0 100 0 0.3 83.8 0.3 167.6 0.3 167.6 100 "/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><g class="st0"><g><defs><rect id="SVGID_3_" width="168" height="100"/></defs><clipPath id="SVGID_4_"><use xlink:href="#SVGID_3_" overflow="visible"/></clipPath><g class="st1"><defs><path id="SVGID_5_" d="M15.6 0.3H152c8.6 0 15.6 7 15.6 15.6v52c0 8.6-7 15.6-15.6 15.6h-48.9l6.7 16.4L80.2 83.6H15.6C7 83.6 0 76.6 0 67.9v-52C0 7.3 7 0.3 15.6 0.3"/></defs><clipPath id="SVGID_6_"><use xlink:href="#SVGID_5_" overflow="visible"/></clipPath><g class="st2"><defs><rect id="SVGID_7_" width="168" height="100"/></defs><clipPath id="SVGID_8_"><use xlink:href="#SVGID_7_" overflow="visible"/></clipPath><rect x="-10" y="-9.7" class="st3" width="187.6" height="119.7"/></g></g></g></g></g><g><defs><path id="SVGID_9_" d="M8.4 14.5c1-1.3 2.4-2 4.3-2.1 3.5-0.2 5.5 1.4 6 4.9 2.1 14.3 4.4 26.4 6.9 36.4l15-28.6c1.4-2.6 3.1-3.9 5.2-4.1 3-0.2 4.9 1.7 5.6 5.7 1.7 9.1 3.9 16.9 6.5 23.4 1.8-17.4 4.8-30 9-37.7 1-1.9 2.5-2.9 4.5-3 1.6-0.1 3 0.3 4.3 1.4 1.3 1 2 2.3 2.1 3.9 0.1 1.2-0.1 2.3-0.7 3.3 -2.7 5-4.9 13.2-6.6 24.7 -1.7 11.1-2.3 19.8-1.9 26.1 0.1 1.7-0.1 3.2-0.8 4.5 -0.8 1.5-2 2.4-3.7 2.5 -1.8 0.1-3.6-0.7-5.4-2.5C52.4 66.7 47.4 57 43.7 44.1c-4.4 8.8-7.7 15.3-9.9 19.7 -4 7.7-7.5 11.7-10.3 11.9 -1.9 0.1-3.5-1.4-4.8-4.7 -3.5-9-7.3-26.3-11.3-52C7.1 17.3 7.5 15.8 8.4 14.5"/></defs><clipPath id="SVGID_10_"><use xlink:href="#SVGID_9_" overflow="visible"/></clipPath><rect x="-2.7" y="-0.6" class="st4" width="90.6" height="86.4"/></g><g><defs><path id="SVGID_11_" d="M155.6 25.2c-2.5-4.3-6.1-6.9-11-7.9 -1.3-0.3-2.5-0.4-3.7-0.4 -6.6 0-11.9 3.4-16.1 10.2 -3.6 5.8-5.3 12.3-5.3 19.3 0 5.3 1.1 9.8 3.3 13.6 2.5 4.3 6.1 6.9 11 7.9 1.3 0.3 2.5 0.4 3.7 0.4 6.6 0 12-3.4 16.1-10.2 3.6-5.9 5.3-12.4 5.3-19.4C159 33.4 157.9 28.9 155.6 25.2zM147 44.2c-0.9 4.5-2.7 7.9-5.2 10.1 -2 1.8-3.9 2.5-5.5 2.2 -1.7-0.3-3-1.8-4-4.4 -0.8-2.1-1.2-4.2-1.2-6.2 0-1.7 0.2-3.4 0.5-5 0.6-2.8 1.8-5.5 3.6-8.1 2.3-3.3 4.7-4.8 7.1-4.2 1.7 0.3 3 1.8 4 4.4 0.8 2.1 1.2 4.2 1.2 6.2C147.5 40.9 147.3 42.6 147 44.2z"/></defs><clipPath id="SVGID_12_"><use xlink:href="#SVGID_11_" overflow="visible"/></clipPath><rect x="109.6" y="6.9" class="st5" width="59.4" height="71.4"/></g><g><defs><path id="SVGID_13_" d="M112.7 25.2c-2.5-4.3-6.1-6.9-11-7.9 -1.3-0.3-2.5-0.4-3.7-0.4 -6.6 0-11.9 3.4-16.1 10.2 -3.5 5.8-5.3 12.3-5.3 19.3 0 5.3 1.1 9.8 3.3 13.6 2.5 4.3 6.1 6.9 11 7.9 1.3 0.3 2.5 0.4 3.7 0.4 6.6 0 12-3.4 16.1-10.2 3.5-5.9 5.3-12.4 5.3-19.4C116 33.4 114.9 28.9 112.7 25.2zM104.1 44.2c-0.9 4.5-2.7 7.9-5.2 10.1 -2 1.8-3.9 2.5-5.5 2.2 -1.7-0.3-3-1.8-4-4.4 -0.8-2.1-1.2-4.2-1.2-6.2 0-1.7 0.2-3.4 0.5-5 0.6-2.8 1.8-5.5 3.6-8.1 2.3-3.3 4.7-4.8 7.1-4.2 1.7 0.3 3 1.8 4 4.4 0.8 2.1 1.2 4.2 1.2 6.2C104.6 40.9 104.4 42.6 104.1 44.2z"/></defs><clipPath id="SVGID_14_"><use xlink:href="#SVGID_13_" overflow="visible"/></clipPath><rect x="66.7" y="6.9" class="st6" width="59.4" height="71.4"/></g></svg></div>';
232
				break;
233
			default:
234
				$content_icon = '';
235
				break;
236
		}
237
		return $content_icon;
238
	}
239
240
	/**
241
	 * Stores dismiss data into an option
242
	 *
243
	 * @param string $key Dismiss key.
244
	 */
245
	public function save_dismiss( $key ) {
246
		$hide_jitm = \Jetpack_Options::get_option( 'hide_jitm' );
247
		if ( ! is_array( $hide_jitm ) ) {
248
			$hide_jitm = array();
249
		}
250
251
		if ( ! isset( $hide_jitm[ $key ] ) || ! is_array( $hide_jitm[ $key ] ) ) {
252
			$hide_jitm[ $key ] = array(
253
				'last_dismissal' => 0,
254
				'number'         => 0,
255
			);
256
		}
257
258
		$hide_jitm[ $key ] = array(
259
			'last_dismissal' => time(),
260
			'number'         => $hide_jitm[ $key ]['number'] + 1,
261
		);
262
263
		\Jetpack_Options::update_option( 'hide_jitm', $hide_jitm );
264
	}
265
}
266