Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,16 @@ class StatsPeriodAsyncOperationTests: XCTestCase {

private extension StatsPeriodAsyncOperationTests {
class MockStatsServiceRemoteV2: StatsServiceRemoteV2 {
override func getData<TimeStatsType: StatsTimeIntervalData>(for period: StatsPeriodUnit,
unit: StatsPeriodUnit?,
endingOn: Date,
limit: Int = 10,
completion: @escaping ((TimeStatsType?, Error?) -> Void)) {
override func getData<TimeStatsType>(
for period: StatsPeriodUnit,
unit: StatsPeriodUnit? = nil,
startDate: Date? = nil,
endingOn: Date,
limit: Int = 10,
summarize: Bool? = nil,
parameters: [String: String]? = nil,
completion: @escaping (TimeStatsType?, (any Error)?) -> Void
) where TimeStatsType: StatsTimeIntervalData {
let mockType = TimeStatsType(date: endingOn,
period: period,
unit: unit,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import Foundation
import JetpackStats

extension StatsEvent {
/// Maps JetpackStats events to WordPress analytics events
var wpEvent: WPAnalyticsEvent {
switch self {
// Screen View Events
case .statsMainScreenShown:
return .jetpackStatsMainScreenShown
case .trafficTabShown:
return .jetpackStatsTrafficTabShown
case .realtimeTabShown:
return .jetpackStatsRealtimeTabShown
case .subscribersTabShown:
return .jetpackStatsSubscribersTabShown
case .postDetailsScreenShown:
return .jetpackStatsPostDetailsScreenShown
case .authorStatsScreenShown:
return .jetpackStatsAuthorStatsScreenShown
case .archiveStatsScreenShown:
return .jetpackStatsArchiveStatsScreenShown
case .externalLinkStatsScreenShown:
return .jetpackStatsExternalLinkStatsScreenShown
case .referrerStatsScreenShown:
return .jetpackStatsReferrerStatsScreenShown

// Date Range Events
case .dateRangePresetSelected:
return .jetpackStatsDateRangePresetSelected
case .customDateRangeSelected:
return .jetpackStatsCustomDateRangeSelected

// Card Events
case .cardShown:
return .jetpackStatsCardShown
case .cardAdded:
return .jetpackStatsCardAdded
case .cardRemoved:
return .jetpackStatsCardRemoved

// Chart Events
case .chartTypeChanged:
return .jetpackStatsChartTypeChanged
case .chartMetricSelected:
return .jetpackStatsChartMetricSelected

// List Events
case .topListItemTapped:
return .jetpackStatsTopListItemTapped

// Navigation Events
case .statsTabSelected:
return .jetpackStatsTabSelected

// Error Events
case .errorEncountered:
return .jetpackStatsErrorEncountered
}
}
}

extension WPAnalyticsEvent {
static let isNewStatsKey = "new_stats"
}
102 changes: 102 additions & 0 deletions WordPress/Classes/Utility/Analytics/WPAnalyticsEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,10 @@ import WordPressShared
case statsEmailsViewMoreTapped
case statsSubscribersChartTapped

// New Stats
case statsNewStatsEnabled
case statsNewStatsDisabled

// In-App Updates
case inAppUpdateShown
case inAppUpdateDismissed
Expand All @@ -619,6 +623,42 @@ import WordPressShared

case wpcomWebSignIn

// MARK: - Jetpack Stats

// Screen View Events
case jetpackStatsMainScreenShown
case jetpackStatsTrafficTabShown
case jetpackStatsRealtimeTabShown
case jetpackStatsSubscribersTabShown
case jetpackStatsPostDetailsScreenShown
case jetpackStatsAuthorStatsScreenShown
case jetpackStatsArchiveStatsScreenShown
case jetpackStatsExternalLinkStatsScreenShown
case jetpackStatsReferrerStatsScreenShown

// Date Range Events
case jetpackStatsDateRangePresetSelected
case jetpackStatsCustomDateRangeSelected

// Card Events
case jetpackStatsCardShown
case jetpackStatsCardAdded
case jetpackStatsCardRemoved
case jetpackStatsCardEditMenuOpened

// Chart Events
case jetpackStatsChartTypeChanged
case jetpackStatsChartMetricSelected

// List Events
case jetpackStatsTopListItemTapped

// Navigation Events
case jetpackStatsTabSelected

// Error Events
case jetpackStatsErrorEncountered

/// A String that represents the event
var value: String {
switch self {
Expand Down Expand Up @@ -1664,6 +1704,12 @@ import WordPressShared
case .statsSubscribersChartTapped:
return "stats_subscribers_chart_tapped"

// New Stats
case .statsNewStatsEnabled:
return "stats_new_stats_enabled"
case .statsNewStatsDisabled:
return "stats_new_stats_disabled"

// In-App Updates
case .inAppUpdateShown:
return "in_app_update_shown"
Expand All @@ -1678,6 +1724,62 @@ import WordPressShared

case .wpcomWebSignIn:
return "wpcom_web_sign_in"

// MARK: - Jetpack Stats

// Screen View Events
case .jetpackStatsMainScreenShown:
return "jetpack_stats_main_screen_shown"
case .jetpackStatsTrafficTabShown:
return "jetpack_stats_traffic_tab_shown"
case .jetpackStatsRealtimeTabShown:
return "jetpack_stats_realtime_tab_shown"
case .jetpackStatsSubscribersTabShown:
return "jetpack_stats_subscribers_tab_shown"
case .jetpackStatsPostDetailsScreenShown:
return "jetpack_stats_post_details_screen_shown"
case .jetpackStatsAuthorStatsScreenShown:
return "jetpack_stats_author_stats_screen_shown"
case .jetpackStatsArchiveStatsScreenShown:
return "jetpack_stats_archive_stats_screen_shown"
case .jetpackStatsExternalLinkStatsScreenShown:
return "jetpack_stats_external_link_stats_screen_shown"
case .jetpackStatsReferrerStatsScreenShown:
return "jetpack_stats_referrer_stats_screen_shown"

// Date Range Events
case .jetpackStatsDateRangePresetSelected:
return "jetpack_stats_date_range_preset_selected"
case .jetpackStatsCustomDateRangeSelected:
return "jetpack_stats_custom_date_range_selected"

// Card Events
case .jetpackStatsCardShown:
return "jetpack_stats_card_shown"
case .jetpackStatsCardAdded:
return "jetpack_stats_card_added"
case .jetpackStatsCardRemoved:
return "jetpack_stats_card_removed"
case .jetpackStatsCardEditMenuOpened:
return "jetpack_stats_card_edit_menu_opened"

// Chart Events
case .jetpackStatsChartTypeChanged:
return "jetpack_stats_chart_type_changed"
case .jetpackStatsChartMetricSelected:
return "jetpack_stats_chart_metric_selected"

// List Events
case .jetpackStatsTopListItemTapped:
return "jetpack_stats_top_list_item_tapped"

// Navigation Events
case .jetpackStatsTabSelected:
return "jetpack_stats_tab_selected"

// Error Events
case .jetpackStatsErrorEncountered:
return "jetpack_stats_error_encountered"
} // END OF SWITCH
}

Expand Down
4 changes: 4 additions & 0 deletions WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public enum FeatureFlag: Int, CaseIterable {
case pluginManagementOverhaul
case nativeJetpackConnection
case newsletterSubscribers
case newStats

/// Returns a boolean indicating if the feature is enabled.
///
Expand Down Expand Up @@ -82,6 +83,8 @@ public enum FeatureFlag: Int, CaseIterable {
return BuildConfiguration.current == .debug
case .newsletterSubscribers:
return true
case .newStats:
return false
}
}

Expand Down Expand Up @@ -125,6 +128,7 @@ extension FeatureFlag {
case .readerGutenbergCommentComposer: "Gutenberg Comment Composer"
case .nativeJetpackConnection: "Native Jetpack Connection"
case .newsletterSubscribers: "Newsletter Subscribers"
case .newStats: "New Stats"
}
}
}
Expand Down
5 changes: 2 additions & 3 deletions WordPress/Classes/Utility/ContentCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,8 @@ struct DefaultContentCoordinator: ContentCoordinator {
setTimePeriodForStatsURLIfPossible(url)
}

let statsViewController = StatsViewController()
statsViewController.blog = blog
controller?.navigationController?.pushViewController(statsViewController, animated: true)
let statsVC = StatsHostingViewController.makeStatsViewController(for: blog)
controller?.navigationController?.pushViewController(statsVC, animated: true)
}

private func setTimePeriodForStatsURLIfPossible(_ url: URL) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ final class DashboardQuickActionsCardCell: UICollectionViewCell, Reusable, UITab
parentViewController.show(controller, sender: nil)
case .stats:
trackQuickActionsEvent(.statsAccessed, blog: blog)
StatsViewController.show(for: blog, from: parentViewController)
let statsVC = StatsHostingViewController.makeStatsViewController(for: blog)
parentViewController.show(statsVC, sender: nil)
case .more:
let viewController = BlogDetailsViewController()
viewController.isScrollEnabled = true
Expand All @@ -121,7 +122,14 @@ final class DashboardQuickActionsCardCell: UICollectionViewCell, Reusable, UITab
}

private func trackQuickActionsEvent(_ event: WPAnalyticsStat, blog: Blog) {
WPAppAnalytics.track(event, properties: [WPAppAnalyticsKeyTabSource: "dashboard", WPAppAnalyticsKeyTapSource: "quick_actions"], blog: blog)
var properties: [String: Any] = [
WPAppAnalyticsKeyTabSource: "dashboard",
WPAppAnalyticsKeyTapSource: "quick_actions"
]
if event == .statsAccessed, FeatureFlag.newStats.enabled {
properties[WPAnalyticsEvent.isNewStatsKey] = "1"
}
WPAppAnalytics.track(event, properties: properties, blog: blog)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,12 +265,7 @@ extension BlogDetailsViewController {
guard JetpackFeaturesRemovalCoordinator.jetpackFeaturesEnabled() else {
return MovedToJetpackViewController(source: .stats)
}

let statsVC = StatsViewController()
statsVC.blog = blog
statsVC.hidesBottomBarWhenPushed = true
statsVC.navigationItem.largeTitleDisplayMode = .never
return statsVC
return StatsHostingViewController.makeStatsViewController(for: blog)
}

@objc(showDomainsFromSource:)
Expand Down Expand Up @@ -423,10 +418,14 @@ extension BlogDetailsViewController {

extension BlogDetailsViewController {
@objc public func trackEvent(_ event: WPAnalyticsStat, from source: BlogDetailsNavigationSource) {
WPAppAnalytics.track(event, properties: [
var properties: [String: Any] = [
WPAppAnalyticsKeyTapSource: source.string,
WPAppAnalyticsKeyTabSource: "site_menu"
], blog: blog)
]
if event == .statsAccessed, FeatureFlag.newStats.enabled {
properties[WPAnalyticsEvent.isNewStatsKey] = "1"
}
WPAppAnalytics.track(event, properties: properties, blog: blog)
}
}

Expand Down
12 changes: 12 additions & 0 deletions WordPress/Classes/ViewRelated/Likes/LikesListController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,18 @@ class LikesListController: NSObject {
configureLoadingIndicator()
}

/// Init with siteID and postID
///
init(tableView: UITableView, siteID: NSNumber, postID: NSNumber, delegate: LikesListControllerDelegate? = nil) {
content = .post(id: postID)
self.siteID = siteID
self.tableView = tableView
self.delegate = delegate

super.init()
configureLoadingIndicator()
}

private func configureLoadingIndicator() {
loadingIndicator = UIActivityIndicatorView(style: .medium)
loadingIndicator.frame = CGRect(x: 0, y: 0, width: tableView.bounds.width, height: 44)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid
FeatureFlag.allowApplicationPasswords,
RemoteFeatureFlag.newGutenberg,
FeatureFlag.newGutenbergThemeStyles,
FeatureFlag.newStats,
]

private let flagStore = FeatureFlagOverrideStore()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,10 @@ struct NotificationContentRouter {
}

private func trackStatsRoute() {
let properties: [AnyHashable: Any] = [WPAppAnalyticsKeyTapSource: "notification"]
var properties: [AnyHashable: Any] = [WPAppAnalyticsKeyTapSource: "notification"]
if FeatureFlag.newStats.enabled {
properties[WPAnalyticsEvent.isNewStatsKey] = "1"
}
WPAppAnalytics.track(.statsAccessed, withProperties: properties)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import WordPressFlux
import WordPressUI
import WordPressKit
import Combine
import SwiftUI
import JetpackStats

class AbstractPostListViewController: UIViewController,
WPContentSyncHelperDelegate,
Expand Down Expand Up @@ -740,17 +742,29 @@ class AbstractPostListViewController: UIViewController,
return
}

SiteStatsInformation.sharedInstance.siteTimeZone = blog.timeZone
SiteStatsInformation.sharedInstance.oauth2Token = blog.authToken
SiteStatsInformation.sharedInstance.siteID = blog.dotComID
if FeatureFlag.newStats.enabled {
// Create the view controller
let statsViewController = PostStatsViewController(post: post)

guard let postURL = post.permaLink.flatMap(URL.init) else {
return wpAssertionFailure("permalink missing or invalid")
// Present modally in a navigation controller
let navController = UINavigationController(rootViewController: statsViewController)
navController.modalPresentationStyle = .pageSheet

present(navController, animated: true)
} else {
// Use legacy stats view
SiteStatsInformation.sharedInstance.siteTimeZone = blog.timeZone
SiteStatsInformation.sharedInstance.oauth2Token = blog.authToken
SiteStatsInformation.sharedInstance.siteID = blog.dotComID

guard let postURL = post.permaLink.flatMap(URL.init) else {
return wpAssertionFailure("permalink missing or invalid")
}
let postStatsTableViewController = PostStatsTableViewController.withJPBannerForBlog(postID: postID,
postTitle: post.titleForDisplay(),
postURL: postURL)
navigationController?.pushViewController(postStatsTableViewController, animated: true)
}
let postStatsTableViewController = PostStatsTableViewController.withJPBannerForBlog(postID: postID,
postTitle: post.titleForDisplay(),
postURL: postURL)
navigationController?.pushViewController(postStatsTableViewController, animated: true)
}

@objc func copyPostLink(_ post: AbstractPost) {
Expand Down
Loading