Skip to content

Commit 295d1aa

Browse files
authored
Merge pull request #9810 from woocommerce/issue/9647-banner-analytics
[Privacy Choices] Add Analytics to privacy banner
2 parents 1c2e6b0 + 6f3cf01 commit 295d1aa

File tree

5 files changed

+74
-1
lines changed

5 files changed

+74
-1
lines changed

WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,3 +2386,22 @@ extension WooAnalyticsEvent {
23862386
}
23872387
}
23882388
}
2389+
2390+
2391+
// MARK: - Privacy Choices Banner
2392+
//
2393+
extension WooAnalyticsEvent {
2394+
enum PrivacyChoicesBanner {
2395+
static func bannerPresented() -> WooAnalyticsEvent {
2396+
WooAnalyticsEvent(statName: .privacyChoicesBannerPresented, properties: [:])
2397+
}
2398+
2399+
static func settingsButtonTapped() -> WooAnalyticsEvent {
2400+
WooAnalyticsEvent(statName: .privacyChoicesSettingsButtonTapped, properties: [:])
2401+
}
2402+
2403+
static func saveButtonTapped() -> WooAnalyticsEvent {
2404+
WooAnalyticsEvent(statName: .privacyChoicesSaveButtonTapped, properties: [:])
2405+
}
2406+
}
2407+
}

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,11 @@ public enum WooAnalyticsStat: String {
921921
case jetpackSetupFlow = "jetpack_setup_flow"
922922
case jetpackSetupCompleted = "jetpack_setup_completed"
923923
case jetpackSetupSynchronizationCompleted = "jetpack_setup_synchronization_completed"
924+
925+
// MARK: Privacy Banner
926+
case privacyChoicesBannerPresented = "privacy_choices_banner_presented"
927+
case privacyChoicesSettingsButtonTapped = "privacy_choices_banner_settings_button_tapped"
928+
case privacyChoicesSaveButtonTapped = "privacy_choices_banner_save_button_tapped"
924929
}
925930

926931
public extension WooAnalyticsStat {

WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ final class PrivacyBannerPresenter {
1010
///
1111
private let defaults: UserDefaults
1212

13-
init(defaults: UserDefaults = UserDefaults.standard) {
13+
/// Analytics manager.
14+
///
15+
private let analytics: Analytics
16+
17+
init(defaults: UserDefaults = UserDefaults.standard, analytics: Analytics = ServiceLocator.analytics) {
1418
self.defaults = defaults
19+
self.analytics = analytics
1520
}
1621

1722
/// Present the banner when the appropriate conditions are met.
@@ -63,6 +68,8 @@ final class PrivacyBannerPresenter {
6368

6469
let bottomSheetViewController = BottomSheetViewController(childViewController: privacyBanner)
6570
bottomSheetViewController.show(from: viewController)
71+
72+
analytics.track(event: .PrivacyChoicesBanner.bannerPresented())
6673
}
6774

6875
/// Presents an error notice and provide a retry action to update the analytics setting.

WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,22 @@ final class PrivacyBannerViewModel: ObservableObject {
5757
// Revert Loading state
5858
isLoading = false
5959
isViewEnabled = true
60+
61+
// Analytics
62+
trackAnalytics(from: destination)
63+
}
64+
65+
/// Track analytics based on the destination provided by the view.
66+
/// Dismiss ----> Save
67+
/// Settings ----> Settings
68+
///
69+
private func trackAnalytics(from destination: Destination) {
70+
switch destination {
71+
case .dismiss:
72+
analytics.track(event: .PrivacyChoicesBanner.saveButtonTapped())
73+
case .settings:
74+
analytics.track(event: .PrivacyChoicesBanner.settingsButtonTapped())
75+
}
6076
}
6177
}
6278

WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,32 @@ import TestKit
111111
XCTAssertTrue(completionCalled)
112112
}
113113

114+
@MainActor func test_tapping_go_to_settings_tracks_analytic_event() async {
115+
// Given
116+
let analytics = WaitingTimeTrackerTests.TestAnalytics()
117+
let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false))
118+
let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in })
119+
120+
// When
121+
await viewModel.submitChanges(destination: .settings)
122+
123+
// Then
124+
XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSettingsButtonTapped)
125+
}
126+
127+
@MainActor func test_tapping_go_to_save_tracks_analytic_event() async {
128+
// Given
129+
let analytics = WaitingTimeTrackerTests.TestAnalytics()
130+
let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false))
131+
let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in })
132+
133+
// When
134+
await viewModel.submitChanges(destination: .dismiss)
135+
136+
// Then
137+
XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSaveButtonTapped)
138+
}
139+
114140
override class func tearDown() {
115141
super.tearDown()
116142
SessionManager.removeTestingDatabase()

0 commit comments

Comments
 (0)