diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift index 0a2ee94fb2f..2ac7871b44c 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift @@ -2380,3 +2380,22 @@ extension WooAnalyticsEvent { } } } + + +// MARK: - Privacy Choices Banner +// +extension WooAnalyticsEvent { + enum PrivacyChoicesBanner { + static func bannerPresented() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesBannerPresented, properties: [:]) + } + + static func settingsButtonTapped() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesSettingsButtonTapped, properties: [:]) + } + + static func saveButtonTapped() -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .privacyChoicesSaveButtonTapped, properties: [:]) + } + } +} diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index d08f6935cab..0c83c0a34a4 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -920,6 +920,11 @@ public enum WooAnalyticsStat: String { case jetpackSetupFlow = "jetpack_setup_flow" case jetpackSetupCompleted = "jetpack_setup_completed" case jetpackSetupSynchronizationCompleted = "jetpack_setup_synchronization_completed" + + // MARK: Privacy Banner + case privacyChoicesBannerPresented = "privacy_choices_banner_presented" + case privacyChoicesSettingsButtonTapped = "privacy_choices_banner_settings_button_tapped" + case privacyChoicesSaveButtonTapped = "privacy_choices_banner_save_button_tapped" } public extension WooAnalyticsStat { diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift index f2188502bd9..5f28505d6de 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerPresenter.swift @@ -10,8 +10,13 @@ final class PrivacyBannerPresenter { /// private let defaults: UserDefaults - init(defaults: UserDefaults = UserDefaults.standard) { + /// Analytics manager. + /// + private let analytics: Analytics + + init(defaults: UserDefaults = UserDefaults.standard, analytics: Analytics = ServiceLocator.analytics) { self.defaults = defaults + self.analytics = analytics } /// Present the banner when the appropriate conditions are met. @@ -63,6 +68,8 @@ final class PrivacyBannerPresenter { let bottomSheetViewController = BottomSheetViewController(childViewController: privacyBanner) bottomSheetViewController.show(from: viewController) + + analytics.track(event: .PrivacyChoicesBanner.bannerPresented()) } /// Presents an error notice and provide a retry action to update the analytics setting. diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift index bdebaaf064c..616cdba0dd1 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/Privacy/PrivacyBannerViewModel.swift @@ -57,6 +57,22 @@ final class PrivacyBannerViewModel: ObservableObject { // Revert Loading state isLoading = false isViewEnabled = true + + // Analytics + trackAnalytics(from: destination) + } + + /// Track analytics based on the destination provided by the view. + /// Dismiss ----> Save + /// Settings ----> Settings + /// + private func trackAnalytics(from destination: Destination) { + switch destination { + case .dismiss: + analytics.track(event: .PrivacyChoicesBanner.saveButtonTapped()) + case .settings: + analytics.track(event: .PrivacyChoicesBanner.settingsButtonTapped()) + } } } diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift b/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift index 49df109cd8f..66d55e56b9d 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Settings/Privacy/PrivacyBannerViewModelTest.swift @@ -111,6 +111,32 @@ import TestKit XCTAssertTrue(completionCalled) } + @MainActor func test_tapping_go_to_settings_tracks_analytic_event() async { + // Given + let analytics = WaitingTimeTrackerTests.TestAnalytics() + let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false)) + let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in }) + + // When + await viewModel.submitChanges(destination: .settings) + + // Then + XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSettingsButtonTapped) + } + + @MainActor func test_tapping_go_to_save_tracks_analytic_event() async { + // Given + let analytics = WaitingTimeTrackerTests.TestAnalytics() + let stores = MockStoresManager(sessionManager: .makeForTesting(authenticated: true, isWPCom: false)) + let viewModel = PrivacyBannerViewModel(analytics: analytics, stores: stores, onCompletion: { _ in }) + + // When + await viewModel.submitChanges(destination: .dismiss) + + // Then + XCTAssertEqual(analytics.lastReceivedStat, WooAnalyticsStat.privacyChoicesSaveButtonTapped) + } + override class func tearDown() { super.tearDown() SessionManager.removeTestingDatabase()