Skip to content

Commit b1e3bf3

Browse files
authored
Merge pull request #8618 from woocommerce/issue/8493-tracks
Variations: Add track events
2 parents 3a8dcca + caefe40 commit b1e3bf3

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ extension WooAnalyticsEvent {
223223
static let serverTime = "time"
224224
static let errorDescription = "error_description"
225225
static let field = "field"
226+
static let variationsCount = "variations_count"
226227
}
227228

228229
enum BulkUpdateField: String {
@@ -310,6 +311,26 @@ extension WooAnalyticsEvent {
310311
static func bulkUpdateFieldFailed(field: BulkUpdateField, error: Error) -> WooAnalyticsEvent {
311312
WooAnalyticsEvent(statName: .productVariationBulkUpdateFieldFail, properties: [Keys.field: field.rawValue], error: error)
312313
}
314+
315+
static func productVariationGenerationRequested() -> WooAnalyticsEvent {
316+
WooAnalyticsEvent(statName: .productVariationGenerationRequested, properties: [:])
317+
}
318+
319+
static func productVariationGenerationConfirmed(count: Int64) -> WooAnalyticsEvent {
320+
WooAnalyticsEvent(statName: .productVariationGenerationConfirmed, properties: [Keys.variationsCount: count])
321+
}
322+
323+
static func productVariationGenerationLimitReached(count: Int64) -> WooAnalyticsEvent {
324+
WooAnalyticsEvent(statName: .productVariationGenerationLimitReached, properties: [Keys.variationsCount: count])
325+
}
326+
327+
static func productVariationGenerationSuccess() -> WooAnalyticsEvent {
328+
WooAnalyticsEvent(statName: .productVariationGenerationSuccess, properties: [:])
329+
}
330+
331+
static func productVariationGenerationFailure() -> WooAnalyticsEvent {
332+
WooAnalyticsEvent(statName: .productVariationGenerationFailure, properties: [:])
333+
}
313334
}
314335
}
315336

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,12 @@ public enum WooAnalyticsStat: String {
672672
case editProductVariationAttributeOptionsRowTapped = "edit_product_variation_attribute_options_row_tapped"
673673
case editProductVariationAttributeOptionsDoneButtonTapped = "edit_product_variation_attribute_options_done_button_tapped"
674674

675+
case productVariationGenerationRequested = "product_variation_generation_requested"
676+
case productVariationGenerationLimitReached = "product_variation_generation_limit_reached"
677+
case productVariationGenerationConfirmed = "product_variation_generation_confirmed"
678+
case productVariationGenerationSuccess = "product_variation_generation_success"
679+
case productVariationGenerationFailure = "product_variation_generation_failure"
680+
675681
// MARK: What's New Component events
676682
//
677683
case featureAnnouncementShown = "feature_announcement_shown"

WooCommerce/Classes/ViewRelated/Products/Variations/GenerateAllVariationsUseCase.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ final class GenerateAllVariationsUseCase {
99
///
1010
private let stores: StoresManager
1111

12-
init(stores: StoresManager) {
12+
/// Analytics tracker.
13+
///
14+
private let analytics: Analytics
15+
16+
init(stores: StoresManager, analytics: Analytics = ServiceLocator.analytics) {
1317
self.stores = stores
18+
self.analytics = analytics
1419
}
1520

1621
/// Generates all missing variations for a product. Up to 100 variations.
@@ -22,7 +27,7 @@ final class GenerateAllVariationsUseCase {
2227

2328
// Fetch Previous variations
2429
onStateChanged(.fetching)
25-
fetchAllVariations(of: product) { result in
30+
fetchAllVariations(of: product) { [analytics] result in
2631
switch result {
2732
case .success(let existingVariations):
2833

@@ -31,6 +36,7 @@ final class GenerateAllVariationsUseCase {
3136

3237
// Guard for 100 variation limit
3338
guard variationsToGenerate.count <= 100 else {
39+
analytics.track(event: .Variations.productVariationGenerationLimitReached(count: Int64(variationsToGenerate.count)))
3440
return onStateChanged(.error(.tooManyVariations(variationCount: variationsToGenerate.count)))
3541
}
3642

@@ -46,6 +52,8 @@ final class GenerateAllVariationsUseCase {
4652
return onStateChanged(.canceled)
4753
}
4854

55+
analytics.track(event: .Variations.productVariationGenerationConfirmed(count: Int64(variationsToGenerate.count)))
56+
4957
// Create variations remotely
5058
onStateChanged(.creating)
5159
self.createVariationsRemotely(for: product, variations: variationsToGenerate) { result in
@@ -65,7 +73,8 @@ final class GenerateAllVariationsUseCase {
6573

6674
case .failure(let error):
6775
onStateChanged(.error(.unableToFetchVariations))
68-
DDLogError("⛔️ Failed to create variations: \(error)")
76+
DDLogError("⛔️ Failed to fetch variations: \(error)")
77+
analytics.track(event: .Variations.productVariationGenerationFailure())
6978
}
7079
}
7180
}
@@ -88,13 +97,16 @@ private extension GenerateAllVariationsUseCase {
8897
onCompletion: @escaping (Result<[ProductVariation], GenerationError>) -> Void) {
8998
let action = ProductVariationAction.createProductVariations(siteID: product.siteID,
9099
productID: product.productID,
91-
productVariations: variations, onCompletion: { result in
100+
productVariations: variations, onCompletion: { [analytics] result in
92101
switch result {
93102
case .success(let variations):
94103
onCompletion(.success(variations))
104+
analytics.track(event: .Variations.productVariationGenerationSuccess())
105+
95106
case .failure(let error):
96107
onCompletion(.failure(.unableToCreateVariations))
97108
DDLogError("⛔️ Failed to create variations: \(error)")
109+
analytics.track(event: .Variations.productVariationGenerationFailure())
98110
}
99111
})
100112
stores.dispatch(action)

WooCommerce/Classes/ViewRelated/Products/Variations/GenerateVariationsOptionPresenter.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@ final class GenerateVariationsOptionsPresenter {
1616
///
1717
private let baseViewController: UIViewController
1818

19-
init(baseViewController: UIViewController) {
19+
/// Analytics tracker.
20+
///
21+
private let analytics: Analytics
22+
23+
init(baseViewController: UIViewController, analytics: Analytics = ServiceLocator.analytics) {
2024
self.baseViewController = baseViewController
25+
self.analytics = analytics
2126
}
2227

2328
/// Displays a bottom sheet allowing the merchant to choose whether to generate one variation or to generate all variations.
@@ -28,13 +33,14 @@ final class GenerateVariationsOptionsPresenter {
2833
}
2934

3035
let viewProperties = BottomSheetListSelectorViewProperties(title: Localization.addVariationAction)
31-
let command = GenerateVariationsSelectorCommand(selected: nil) { [baseViewController] option in
36+
let command = GenerateVariationsSelectorCommand(selected: nil) { [analytics, baseViewController] option in
3237
baseViewController.dismiss(animated: true)
3338
switch option {
3439
case .single:
3540
onCompletion(.single)
3641
case .all:
3742
onCompletion(.all)
43+
analytics.track(event: .Variations.productVariationGenerationRequested())
3844
}
3945
}
4046
let bottomSheetPresenter = BottomSheetListSelectorPresenter(viewProperties: viewProperties, command: command)

0 commit comments

Comments
 (0)