summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/masterbar/admin-menu/class-dashboard-switcher-tracking.php')
-rw-r--r--plugins/jetpack/modules/masterbar/admin-menu/class-dashboard-switcher-tracking.php175
1 files changed, 175 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/masterbar/admin-menu/class-dashboard-switcher-tracking.php b/plugins/jetpack/modules/masterbar/admin-menu/class-dashboard-switcher-tracking.php
new file mode 100644
index 00000000..b3fe7cd8
--- /dev/null
+++ b/plugins/jetpack/modules/masterbar/admin-menu/class-dashboard-switcher-tracking.php
@@ -0,0 +1,175 @@
+<?php
+/**
+ * Quick switcher tracking file.
+ *
+ * @package automattic/jetpack
+ */
+
+namespace Automattic\Jetpack\Dashboard_Customizations;
+
+use Automattic\Jetpack\Status\Host;
+use Automattic\Jetpack\Terms_Of_Service;
+use Automattic\Jetpack\Tracking;
+use Jetpack_Plan;
+
+/**
+ * Class Dashboard_Switcher_Tracking
+ */
+class Dashboard_Switcher_Tracking {
+
+ /**
+ * Jetpack Tracking library will prefix the event name with "jetpack_*" automatically.
+ */
+ const JETPACK_EVENT_NAME = 'dashboard_quick_switch_link_clicked';
+
+ const WPCOM_EVENT_NAME = 'wpcom_dashboard_quick_switch_link_clicked';
+ /**
+ * Jetpack tracking object.
+ *
+ * @var Tracking
+ */
+ private $tracking;
+
+ /**
+ * Current site plan.
+ *
+ * @var string
+ */
+ private $plan;
+
+ /**
+ * The wpcom_tracks wrapper function.
+ *
+ * @var callable
+ */
+ private $wpcom_tracking;
+
+ /**
+ * Dashboard_Switcher_Tracking constructor.
+ *
+ * @param Tracking $tracking Jetpack tracking object.
+ * @param callable $wpcom_tracking A wrapper over wpcom event record.
+ * @param string $plan The current site plan.
+ */
+ public function __construct( Tracking $tracking, callable $wpcom_tracking, $plan ) {
+ $this->tracking = $tracking;
+ $this->plan = $plan;
+ $this->wpcom_tracking = $wpcom_tracking;
+ }
+
+ /**
+ * Create an event for the Quick switcher when the user changes it's preferred view.
+ *
+ * @param string $screen The screen page.
+ * @param string $view The new preferred view.
+ */
+ public function record_switch_event( $screen, $view ) {
+ $event_props = array(
+ 'current_page' => $screen,
+ 'destination' => $view,
+ 'plan' => $this->plan,
+ );
+
+ if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
+ $event_props['blog_id'] = get_current_blog_id();
+
+ /**
+ * Callable injected in the constructor with the static::wpcom_tracks_record_event() static method.
+ *
+ * @see wpcom_tracks_record_event A static method from this class that executes the actual WPCOM event record.
+ */
+ $wpcom_tracking = $this->wpcom_tracking;
+ $wpcom_tracking( $event_props );
+ } else {
+ $this->record_jetpack_event( $event_props );
+ }
+ }
+
+ /**
+ * Get the current site plan or 'N/A' when we cannot determine site's plan.
+ *
+ * @todo: This method can be reused as a wrapper over WPCOM and Atomic as way to get site's current plan (display name).
+ *
+ * @return string
+ */
+ public static function get_plan() {
+ if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
+ if ( class_exists( '\WPCOM_Store_API' ) ) {
+ // @todo: Maybe introduce a wrapper for this since we are duplicating it from WPCOM_Admin_Menu:253
+ $products = \WPCOM_Store_API::get_current_plan( \get_current_blog_id() );
+ if ( array_key_exists( 'product_name_short', $products ) ) {
+ return $products['product_name_short'];
+ }
+ }
+
+ return 'N/A'; // maybe we should return free or null? At the moment it's safe to return 'N/A' since we use it only for passing it to the event.
+ }
+
+ // @todo: Maybe introduce a helper for this since we are duplicating it from Atomic_Admin_Menu:240
+ $products = Jetpack_Plan::get();
+ if ( array_key_exists( 'product_name_short', $products ) ) {
+ return $products['product_name_short'];
+ }
+
+ return 'N/A'; // maybe we should return free or null? At the moment we use it for passing it to the event.
+ }
+
+ /**
+ * Record the event with Jetpack implementation.
+ *
+ * For Atomic sites we mark the Jetpack ToS option temporary as read.
+ *
+ * @todo Remove the jetpack_options_tos_agreed filter for Atomic sites after the Tracking is properly working for AT sites.
+ *
+ * @param array $event_properties The event properties.
+ */
+ private function record_jetpack_event( $event_properties ) {
+ $woa = ( new Host() )->is_woa_site();
+ if ( $woa ) {
+ add_filter( 'jetpack_options', array( __CLASS__, 'mark_jetpack_tos_as_read' ), 10, 2 );
+ }
+
+ $this->tracking->record_user_event( self::JETPACK_EVENT_NAME, $event_properties );
+
+ if ( $woa ) {
+ \remove_filter( 'jetpack_options', array( __CLASS__, 'mark_jetpack_tos_as_read' ) );
+ }
+ }
+
+ /**
+ * Trigger the WPCOM tracks_record_event.
+ *
+ * @param array $event_props Event props.
+ */
+ public static function wpcom_tracks_record_event( $event_props ) {
+ jetpack_require_lib( 'tracks/client' );
+ \tracks_record_event( \wp_get_current_user(), self::WPCOM_EVENT_NAME, $event_props );
+ }
+
+ /**
+ * Get the tracking product name for the Tracking library.
+ *
+ * The tracking product name is used by the Tracking as a prefix for the event name.
+ *
+ * @return string
+ */
+ public static function get_jetpack_tracking_product() {
+ return ( new Host() )->is_woa_site() ? 'atomic' : 'jetpack';
+ }
+
+ /**
+ * Mark the Jetpack ToS as read for Atomic Sites.
+ *
+ * @param mixed $option_value The value of the Jetpack option.
+ * @param string $option_name The name of the Jetpack option.
+ *
+ * @return bool
+ */
+ public static function mark_jetpack_tos_as_read( $option_value, $option_name ) {
+ if ( Terms_Of_Service::OPTION_NAME === $option_name ) {
+ return true;
+ }
+
+ return $option_value;
+ }
+}