Completed
Push — branch-6.6-built ( d82632...b6ffd7 )
by Jeremy
953:43 queued 913:09
created

Jetpack_Calypsoify::mock_masterbar_activation()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/*
3
 * This is Calypso skin of the wp-admin interface that is conditionally triggered via the ?calypsoify=1 param.
4
 * Portted from an internal Automattic plugin.
5
*/
6
7
class Jetpack_Calypsoify {
8
	static $instance = false;
9
10
	private function __construct() {
11
		add_action( 'wp_loaded', array( $this, 'setup' ) );
12
	}
13
14
	public static function getInstance() {
15
		if ( ! self::$instance ) {
16
			self::$instance = new self();
0 ignored issues
show
Documentation Bug introduced by
It seems like new self() of type object<Jetpack_Calypsoify> is incompatible with the declared type boolean of property $instance.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
17
		}
18
19
		return self::$instance;
20
	}
21
22
	public function setup() {
23
		add_action( 'admin_init', array( $this, 'check_param' ) );
24
		if ( 1 == (int) get_user_meta( get_current_user_id(), 'calypsoify', true ) ) {
25
26
			// Masterbar is currently required for this to work properly. Mock the instance of it
27
			if ( ! Jetpack::is_module_active( 'masterbar' ) ) {
28
				$this->mock_masterbar_activation();
29
			}
30
31
			if ( $this->is_page_gutenberg() ) {
32
				add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_for_gutenberg' ), 100 );
33
				return;
34
			}
35
			add_action( 'admin_init', array( $this, 'check_page' ) );
36
			add_action( 'admin_menu', array( $this, 'remove_core_menus' ), 100 );
37
			add_action( 'admin_menu', array( $this, 'add_plugin_menus' ), 101 );
38
			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 100 );
39
			add_action( 'in_admin_header', array( $this, 'insert_sidebar_html' ) );
40
			add_action( 'wp_before_admin_bar_render', array( $this, 'modify_masterbar' ), 100000 );
41
		}
42
	}
43
44
	public function mock_masterbar_activation() {
45
		include dirname( __FILE__ ) . '/masterbar/masterbar.php';
46
		new A8C_WPCOM_Masterbar;
47
	}
48
49
	public function remove_core_menus() {
50
		remove_menu_page( 'index.php' );
51
		remove_menu_page( 'jetpack' );
52
		remove_menu_page( 'edit.php' );
53
		remove_menu_page( 'edit.php?post_type=feedback' );
54
		remove_menu_page( 'upload.php' );
55
		remove_menu_page( 'edit.php?post_type=page' );
56
		remove_menu_page( 'edit-comments.php' );
57
		remove_menu_page( 'themes.php' );
58
		remove_menu_page( 'plugins.php' );
59
		remove_menu_page( 'users.php' );
60
		remove_menu_page( 'tools.php' );
61
		remove_menu_page( 'link-manager.php' );
62
63
		// Core settings pages
64
		remove_submenu_page( 'options-general.php', 'options-general.php' );
65
		remove_submenu_page( 'options-general.php', 'options-writing.php' );
66
		remove_submenu_page( 'options-general.php', 'options-reading.php' );
67
		remove_submenu_page( 'options-general.php', 'options-discussion.php' );
68
		remove_submenu_page( 'options-general.php', 'options-media.php' );
69
		remove_submenu_page( 'options-general.php', 'options-permalink.php' );
70
		remove_submenu_page( 'options-general.php', 'privacy.php' );
71
		remove_submenu_page( 'options-general.php', 'sharing' );
72
	}
73
74
	public function add_plugin_menus() {
75
		global $menu, $submenu;
76
77
		add_menu_page( __( 'Manage Plugins', 'jetpack' ), __( 'Manage Plugins', 'jetpack' ), 'activate_plugins', 'plugins.php', '', $this->installed_plugins_icon(), 1 );
78
79
		// // Count the settings page submenus, if it's zero then don't show this.
80
		if ( empty( $submenu['options-general.php'] ) ) {
81
			remove_menu_page( 'options-general.php' );
82
		} else {
83
			// Rename and make sure the plugin settings menu is always last.
84
			// Sneaky plugins seem to override this otherwise.
85
			// Settings is always key 80.
86
			$menu[80][0]                            = __( 'Plugin Settings', 'jetpack' );
87
			$menu[ max( array_keys( $menu ) ) + 1 ] = $menu[80];
88
			unset( $menu[80] );
89
		}
90
	}
91
92
	public function enqueue() {
93
		wp_enqueue_style( 'calypsoify_wpadminmods_css', plugin_dir_url( __FILE__ ) . 'calypsoify/style.css', false, JETPACK__VERSION );
94
		wp_style_add_data( 'calypsoify_wpadminmods_css', 'rtl', 'replace' );
95
96
		wp_enqueue_script( 'calypsoify_wpadminmods_js', plugin_dir_url( __FILE__ ) . 'calypsoify/mods.js', false, JETPACK__VERSION );
97
	}
98
99
	public function enqueue_for_gutenberg() {
100
		wp_enqueue_style( 'calypsoify_wpadminmods_css', plugin_dir_url( __FILE__ ) . 'calypsoify/style-gutenberg.css', false, JETPACK__VERSION );
101
		wp_style_add_data( 'calypsoify_wpadminmods_css', 'rtl', 'replace' );
102
103
		wp_enqueue_script( 'calypsoify_wpadminmods_js', plugin_dir_url( __FILE__ ) . 'calypsoify/mods-gutenberg.js', false, JETPACK__VERSION );
104
		wp_localize_script(
105
			'calypsoify_wpadminmods_js',
106
			'calypsoifyGutenberg',
107
			array(
108
				'closeLabel' => __( 'Close', 'jetpack' ),
109
				'closeUrl'   => $this->get_close_gutenberg_url(),
110
			)
111
		);
112
	}
113
114
	public function insert_sidebar_html() { ?>
115
		<a href="<?php echo esc_url( 'https://wordpress.com/stats/day/' . Jetpack::build_raw_urls( home_url() ) ); ?>" id="calypso-sidebar-header">
116
			<svg class="gridicon gridicons-chevron-left" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M14 20l-8-8 8-8 1.414 1.414L8.828 12l6.586 6.586"></path></g></svg>
117
118
			<ul>
119
				<li id="calypso-sitename"><?php bloginfo( 'name' ); ?></li>
120
				<li id="calypso-plugins"><?php esc_html_e( 'Plugins' ); ?></li>
121
			</ul>
122
		</a>
123
		<?php
124
	}
125
126
	public function modify_masterbar() {
127
		global $wp_admin_bar;
128
129
		// Add proper links to masterbar top sections.
130
		$my_sites_node       = $wp_admin_bar->get_node( 'blog' );
131
		$my_sites_node->href = 'https://wordpress.com/stats/day/' . Jetpack::build_raw_urls( home_url() );
132
		$wp_admin_bar->add_node( $my_sites_node );
133
134
		$reader_node       = $wp_admin_bar->get_node( 'newdash' );
135
		$reader_node->href = 'https://wordpress.com';
136
		$wp_admin_bar->add_node( $reader_node );
137
138
		$me_node       = $wp_admin_bar->get_node( 'my-account' );
139
		$me_node->href = 'https://wordpress.com/me';
140
		$wp_admin_bar->add_node( $me_node );
141
	}
142
143
	private function installed_plugins_icon() {
144
		$svg = '<svg class="gridicon gridicons-plugins" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 24"><g><path d="M16 8V3c0-.552-.448-1-1-1s-1 .448-1 1v5h-4V3c0-.552-.448-1-1-1s-1 .448-1 1v5H5v4c0 2.79 1.637 5.193 4 6.317V22h6v-3.683c2.363-1.124 4-3.527 4-6.317V8h-3z" fill="black"></path></g></svg>';
145
146
		return 'data:image/svg+xml;base64,' . base64_encode( $svg );
147
	}
148
149
	public function get_close_gutenberg_url() {
150
		$screen = get_current_screen();
151
152
		// E.g. `posts`, `pages`, or `types/some_custom_post_type`
153
		$post_type = ( 'post' === $screen->post_type || 'page' === $screen->post_type )
154
			? $screen->post_type . 's'
155
			: 'types/' . $screen->post_type;
156
157
		return 'https://wordpress.com/' . $post_type . '/' . Jetpack::build_raw_urls( home_url() );
158
	}
159
160
	public function check_param() {
161
		if ( isset( $_GET['calypsoify'] ) ) {
162
			if ( 1 == (int) $_GET['calypsoify'] ) {
163
				update_user_meta( get_current_user_id(), 'calypsoify', 1 );
164
			} else {
165
				update_user_meta( get_current_user_id(), 'calypsoify', 0 );
166
			}
167
168
			$page = remove_query_arg( 'calypsoify', wp_basename( $_SERVER['REQUEST_URI'] ) );
169
170
			wp_safe_redirect( admin_url( $page ) );
171
		}
172
	}
173
174
	public function check_page() {
175
		// If the user hits plain /wp-admin/ then disable Calypso styles.
176
		$page = wp_basename( esc_url( $_SERVER['REQUEST_URI'] ) );
177
178
		if ( false !== strpos( 'index.php', $page ) || false !== strpos( 'wp-admin', $page ) ) {
179
			update_user_meta( get_current_user_id(), 'calypsoify', 0 );
180
			wp_safe_redirect( admin_url() );
181
			die;
182
		}
183
	}
184
185
	public function is_page_gutenberg() {
186
		$page = wp_basename( esc_url( $_SERVER['REQUEST_URI'] ) );
187
		return Jetpack::is_gutenberg_available() && (
188
				false !== strpos( $page, 'post.php' ) ||
189
				false !== strpos( $page, 'post-new.php' ) ||
190
				false !== strpos( $page, 'revision.php' )
191
			);
192
	}
193
}
194
195
$Jetpack_Calypsoify = Jetpack_Calypsoify::getInstance();
196