Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HACK Week: Add tracking for filter history #14844

Merged
merged 6 commits into from
Jan 21, 2025
Merged
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
@@ -0,0 +1,25 @@
import Foundation

extension WooAnalyticsEvent {
enum FilterHistory {
private enum Keys {
static let source = "source"
}

static func trackEntryPointTapped(from source: FilterSource) -> WooAnalyticsEvent {
WooAnalyticsEvent(statName: .filterHistoryButtonTapped, properties: [Keys.source: source.rawValue])
}

static func trackPastFilterApplied(source: FilterSource) -> WooAnalyticsEvent {
WooAnalyticsEvent(statName: .filterHistoryPastFilterApplied, properties: [Keys.source: source.rawValue])
}

static func trackPastFilterRemoved(source: FilterSource) -> WooAnalyticsEvent {
WooAnalyticsEvent(statName: .filterHistoryPastFilterRemoved, properties: [Keys.source: source.rawValue])
}

static func trackFilterHistoryCleared(source: FilterSource) -> WooAnalyticsEvent {
WooAnalyticsEvent(statName: .filterHistoryCleared, properties: [Keys.source: source.rawValue])
}
}
}
7 changes: 7 additions & 0 deletions WooCommerce/Classes/Analytics/WooAnalyticsStat.swift
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,13 @@ enum WooAnalyticsStat: String {
//
case orderListViewFilterOptionsTapped = "order_list_view_filter_options_tapped"

// MARK: Filter History
//
case filterHistoryButtonTapped = "filter_history_button_tapped"
case filterHistoryPastFilterApplied = "filter_history_past_filter_applied"
case filterHistoryPastFilterRemoved = "filter_history_past_filter_removed"
case filterHistoryCleared = "filter_history_cleared"

// MARK: Barcode Scanning events
//
case orderCreationProductBarcodeScanningTapped = "order_creation_product_barcode_scanning_tapped"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ import Combine
import UIKit
import Yosemite

enum FilterSource: String {
case orders
case products
}

protocol HumanReadable {
var readableString: String { get }
}
Expand Down Expand Up @@ -29,6 +34,9 @@ protocol FilterListViewModel {
/// Whether to display the entry point to the filter history
var shouldShowHistory: Bool { get }

/// The entry point where the filter was opened
var source: FilterSource { get }

// Navigation & Actions

/// Retrieves past filters
Expand Down Expand Up @@ -210,6 +218,7 @@ final class FilterListViewController<ViewModel: FilterListViewModel>: UIViewCont
}

@objc private func showFilterHistory() {
ServiceLocator.analytics.track(event: .FilterHistory.trackEntryPointTapped(from: viewModel.source))
let controller = FilterHistoryViewHostingController(viewModel: viewModel, onSelection: { [weak self] selectedCriteria in
guard let self else { return }
viewModel.applyPastFilter(selectedCriteria)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import UIKit
import Yosemite
import Experiments
import WooFoundation

/// `FilterListViewModel` for filtering a list of orders.
final class FilterOrderListViewModel: FilterListViewModel {
Expand Down Expand Up @@ -59,13 +60,16 @@ final class FilterOrderListViewModel: FilterListViewModel {

let shouldShowHistory: Bool

let source = FilterSource.orders

private let orderStatusFilterViewModel: FilterTypeViewModel
private let dateRangeFilterViewModel: FilterTypeViewModel
private let productFilterViewModel: FilterTypeViewModel
private let customerFilterViewModel: FilterTypeViewModel

private let siteID: Int64
private let stores: StoresManager
private let analytics: Analytics

/// - Parameters:
/// - filters: the filters to be applied initially.
Expand All @@ -77,14 +81,16 @@ final class FilterOrderListViewModel: FilterListViewModel {
allowedStatuses: [OrderStatus],
siteID: Int64,
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService,
stores: StoresManager = ServiceLocator.stores) {
stores: StoresManager = ServiceLocator.stores,
analytics: Analytics = ServiceLocator.analytics) {
orderStatusFilterViewModel = OrderListFilter.orderStatus.createViewModel(filters: filters, allowedStatuses: allowedStatuses)
dateRangeFilterViewModel = OrderListFilter.dateRange.createViewModel(filters: filters, allowedStatuses: allowedStatuses)
productFilterViewModel = OrderListFilter.product(siteID: siteID).createViewModel(filters: filters, allowedStatuses: allowedStatuses)
customerFilterViewModel = OrderListFilter.customer(siteID: siteID).createViewModel(filters: filters, allowedStatuses: allowedStatuses)

self.siteID = siteID
self.stores = stores
self.analytics = analytics

shouldShowHistory = featureFlagService.isFeatureFlagEnabled(.filterHistoryOnOrderAndProductLists)
filterTypeViewModels = [orderStatusFilterViewModel, dateRangeFilterViewModel, customerFilterViewModel, productFilterViewModel]
Expand Down Expand Up @@ -130,6 +136,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
dateRangeFilterViewModel.selectedValue = filter.dateRange
productFilterViewModel.selectedValue = filter.product
customerFilterViewModel.selectedValue = filter.customer
analytics.track(event: .FilterHistory.trackPastFilterApplied(source: source))
}

func saveSelectedFilterToHistory(_ filter: Criteria) {
Expand All @@ -146,6 +153,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
}

func removeFilterFromHistory(_ filter: Criteria) {
analytics.track(event: .FilterHistory.trackPastFilterRemoved(source: source))
let settings = StoredOrderSettings.Setting(siteID: siteID,
orderStatusesFilter: filter.orderStatus,
dateRangeFilter: filter.dateRange,
Expand All @@ -159,6 +167,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
}

func clearAllFilterHistory() {
analytics.track(event: .FilterHistory.trackFilterHistoryCleared(source: source))
stores.dispatch(AppSettingsAction.resetOrderFilterHistory(siteID: siteID, onCompletion: { error in
if let error {
DDLogError("⛔️ Error clearing all filter history: \(error)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ final class FilterProductListViewModel: FilterListViewModel {

let shouldShowHistory: Bool

let source = FilterSource.products

private let stockStatusFilterViewModel: FilterTypeViewModel
private let productStatusFilterViewModel: FilterTypeViewModel
private let productTypeFilterViewModel: FilterTypeViewModel
Expand All @@ -73,6 +75,7 @@ final class FilterProductListViewModel: FilterListViewModel {
private let siteID: Int64
private let stores: StoresManager
private let featureFlagService: FeatureFlagService
private let analytics: Analytics

/// - Parameters:
/// - filters: the filters to be applied initially.
Expand All @@ -81,7 +84,8 @@ final class FilterProductListViewModel: FilterListViewModel {
init(filters: Filters,
siteID: Int64,
stores: StoresManager = ServiceLocator.stores,
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService) {
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService,
analytics: Analytics = ServiceLocator.analytics) {
self.featureFlagService = featureFlagService
self.stockStatusFilterViewModel = ProductListFilter.stockStatus.createViewModel(filters: filters)
self.productStatusFilterViewModel = ProductListFilter.productStatus.createViewModel(filters: filters)
Expand All @@ -91,6 +95,7 @@ final class FilterProductListViewModel: FilterListViewModel {
self.shouldShowHistory = featureFlagService.isFeatureFlagEnabled(.filterHistoryOnOrderAndProductLists)
self.stores = stores
self.siteID = siteID
self.analytics = analytics

if featureFlagService.isFeatureFlagEnabled(.favoriteProducts) {
self.filterTypeViewModels = [
Expand Down Expand Up @@ -133,6 +138,7 @@ final class FilterProductListViewModel: FilterListViewModel {
productTypeFilterViewModel.selectedValue = filter.promotableProductType
productCategoryFilterViewModel.selectedValue = filter.productCategory
productFavoriteFilterViewModel.selectedValue = filter.favoriteProduct
analytics.track(event: .FilterHistory.trackPastFilterApplied(source: source))
}

@MainActor
Expand Down Expand Up @@ -174,6 +180,7 @@ final class FilterProductListViewModel: FilterListViewModel {
}

func removeFilterFromHistory(_ filter: Filters) {
analytics.track(event: .FilterHistory.trackPastFilterRemoved(source: source))
let productSettings = StoredProductSettings.Setting(siteID: siteID,
sort: nil, // This will be ignored in product filter anyway
stockStatusFilter: filter.stockStatus,
Expand All @@ -189,6 +196,7 @@ final class FilterProductListViewModel: FilterListViewModel {
}

func clearAllFilterHistory() {
analytics.track(event: .FilterHistory.trackFilterHistoryCleared(source: source))
stores.dispatch(AppSettingsAction.resetProductFilterHistory(siteID: siteID, onCompletion: { error in
if let error {
DDLogError("⛔️ Error resetting product filter history: \(error)")
Expand Down
4 changes: 4 additions & 0 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -2707,6 +2707,7 @@
DE86E9272A4BEA2500A89A5B /* FeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE86E9262A4BEA2500A89A5B /* FeedbackView.swift */; };
DE86E9292A4C213A00A89A5B /* WooAnalyticsEvent+AIFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE86E9282A4C213A00A89A5B /* WooAnalyticsEvent+AIFeedback.swift */; };
DE87F4082D2D375E00869522 /* FilterHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE87F4072D2D375E00869522 /* FilterHistoryView.swift */; };
DE87F40E2D30C90B00869522 /* WooAnalyticsEvent+FilterHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE87F40D2D30C90300869522 /* WooAnalyticsEvent+FilterHistory.swift */; };
DE8AA0B12BBE50CF0084D2CC /* DashboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8AA0B02BBE50CF0084D2CC /* DashboardView.swift */; };
DE8AA0B32BBE55E40084D2CC /* DashboardViewHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8AA0B22BBE55E40084D2CC /* DashboardViewHostingController.swift */; };
DE8AA0B52BBEBE590084D2CC /* ViewControllerContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8AA0B42BBEBE590084D2CC /* ViewControllerContainer.swift */; };
Expand Down Expand Up @@ -5843,6 +5844,7 @@
DE86E9262A4BEA2500A89A5B /* FeedbackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackView.swift; sourceTree = "<group>"; };
DE86E9282A4C213A00A89A5B /* WooAnalyticsEvent+AIFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WooAnalyticsEvent+AIFeedback.swift"; sourceTree = "<group>"; };
DE87F4072D2D375E00869522 /* FilterHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterHistoryView.swift; sourceTree = "<group>"; };
DE87F40D2D30C90300869522 /* WooAnalyticsEvent+FilterHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WooAnalyticsEvent+FilterHistory.swift"; sourceTree = "<group>"; };
DE8AA0B02BBE50CF0084D2CC /* DashboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardView.swift; sourceTree = "<group>"; };
DE8AA0B22BBE55E40084D2CC /* DashboardViewHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardViewHostingController.swift; sourceTree = "<group>"; };
DE8AA0B42BBEBE590084D2CC /* ViewControllerContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewControllerContainer.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9792,6 +9794,7 @@
DE6D84A82C3D07850014FBFF /* WooAnalyticsEvent+GoogleAds.swift */,
262562342C52A6410075A8CC /* WooAnalyticsEvent+BackgroudUpdates.swift */,
86EC6EBC2CD3882900D7D2FE /* WooAnalyticsEvent+CustomFields.swift */,
DE87F40D2D30C90300869522 /* WooAnalyticsEvent+FilterHistory.swift */,
);
path = Analytics;
sourceTree = "<group>";
Expand Down Expand Up @@ -16436,6 +16439,7 @@
DE74F2A327E41D650002FE59 /* EnableAnalyticsViewModel.swift in Sources */,
AE77EA5027A47C99006A21BD /* View+AddingDividers.swift in Sources */,
EE5B5BB32AB30C0A009BCBD6 /* ProductCreationAIEligibilityChecker.swift in Sources */,
DE87F40E2D30C90B00869522 /* WooAnalyticsEvent+FilterHistory.swift in Sources */,
B98C6D502B149C3900A243E1 /* UINavigationItem+Configuration.swift in Sources */,
0298430C259351F100979CAE /* ShippingLabelsTopBannerFactory.swift in Sources */,
262EB5AE298C70EF009DCC36 /* SupportFormViewModel.swift in Sources */,
Expand Down
Loading