diff options
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-jitm/src/class-pre-connection-jitm.php')
-rw-r--r-- | plugins/jetpack/jetpack_vendor/automattic/jetpack-jitm/src/class-pre-connection-jitm.php | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-jitm/src/class-pre-connection-jitm.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-jitm/src/class-pre-connection-jitm.php new file mode 100644 index 00000000..6a779873 --- /dev/null +++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-jitm/src/class-pre-connection-jitm.php @@ -0,0 +1,171 @@ +<?php +/** + * Jetpack's Pre-Connection JITM class. + * + * @package automattic/jetpack-jitm + */ + +namespace Automattic\Jetpack\JITMS; + +/** + * Jetpack pre-connection just in time messaging through out the admin. + */ +class Pre_Connection_JITM extends JITM { + + /** + * Filters and formats the messages for the client-side JS renderer + * + * @param string $message_path Current message path. + * + * @return array Formatted messages. + */ + private function filter_messages( $message_path ) { + /** + * Allows filtering of the pre-connection JITMs. + * + * This filter allows plugins to add pre-connection JITMs that will be + * displayed by the JITM package. + * + * @since 1.14.1 + * + * @param array An array of pre-connection messages. + */ + $messages = apply_filters( 'jetpack_pre_connection_jitms', array() ); + + $messages = $this->validate_messages( $messages ); + + $formatted_messages = array(); + + foreach ( $messages as $message ) { + if ( ! preg_match( $message['message_path'], $message_path ) ) { + continue; + } + + $obj = new \stdClass(); + $obj->CTA = array( // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + 'message' => $message['button_caption'], + 'newWindow' => false, + ); + $obj->url = $message['button_link']; + $obj->id = $message['id']; + $obj->is_dismissible = true; + $obj->content = array( + 'message' => $message['message'], + 'description' => $message['description'], + 'list' => array(), + 'icon' => $this->get_message_icon( $message ), + ); + + $formatted_messages[] = $obj; + } + + return $formatted_messages; + } + + /** + * Validates that each of the messages contains all of the required keys: + * - id + * - message_path + * - message + * - description + * - button_link + * - button_caption + * + * @param array $messages An array of JITM messages. + * + * @return array An array of JITM messages that contain all of the required keys. + */ + private function validate_messages( $messages ) { + if ( ! is_array( $messages ) ) { + return array(); + } + + $expected_keys = array_flip( array( 'id', 'message_path', 'message', 'description', 'button_link', 'button_caption' ) ); + + foreach ( $messages as $index => $message ) { + if ( count( array_intersect_key( $expected_keys, $message ) ) !== count( $expected_keys ) ) { + // Remove any messages that are missing expected keys. + unset( $messages[ $index ] ); + } + } + + return $messages; + } + + /** + * Get the icon for the message. + * + * The message may contain an 'icon' key. If the value of the 'icon' key matches a supported icon (or empty string), the value is used. + * If the message does not contain an icon key or if the value does not match a supported icon, the Jetpack icon is used by default. + * + * @param array $message A pre-connection JITM. + * + * @return string The icon to use in the JITM. + */ + private function get_message_icon( $message ) { + // Default to the Jetpack icon. + $icon = 'jetpack'; + + if ( ! isset( $message['icon'] ) ) { + return $icon; + } + + $supported_icons = $this->get_supported_icons(); + + if ( in_array( $message['icon'], $supported_icons, true ) ) { + // Only use the message icon if it's a supported icon or an empty string (for no icon). + $icon = $message['icon']; + } + + return $icon; + } + + /** + * Retrieve the current message to display keyed on query string and message path + * + * @param string $message_path The message path to ask for. + * @param string $query The query string originally from the front end. Unused in this subclass. + * @param bool $full_jp_logo_exists If there is a full Jetpack logo already on the page. + * + * @return array The JITMs to show, or an empty array if there is nothing to show + */ + public function get_messages( $message_path, $query, $full_jp_logo_exists ) { + if ( ! current_user_can( 'install_plugins' ) ) { + return array(); + } + + $messages = $this->filter_messages( $message_path ); + + if ( empty( $messages ) ) { + return array(); + } + + $hidden_jitms = \Jetpack_Options::get_option( 'hide_jitm' ); + + foreach ( $messages as $idx => &$envelope ) { + $dismissed_feature = isset( $hidden_jitms[ 'pre-connection-' . $envelope->id ] ) && + is_array( $hidden_jitms[ 'pre-connection-' . $envelope->id ] ) ? $hidden_jitms[ 'pre-connection-' . $envelope->id ] : null; + + if ( is_array( $dismissed_feature ) ) { + unset( $messages[ $idx ] ); + continue; + } + + $envelope->content['icon'] = $this->generate_icon( $envelope->content['icon'], $full_jp_logo_exists ); + } + + return $messages; + } + + /** + * Dismisses a JITM ID so that it will no longer be shown. + * + * @param string $id The id of the JITM that was dismissed. + * + * @return bool Always true + */ + public function dismiss( $id ) { + $this->save_dismiss( 'pre-connection-' . $id ); + return true; + } +} |