diff --git a/Library/Koala/Koala.swift b/Library/Koala/Koala.swift index 4958bf337e..b5e46c8495 100644 --- a/Library/Koala/Koala.swift +++ b/Library/Koala/Koala.swift @@ -216,6 +216,26 @@ public final class Koala { } } + public enum ManagePledgeMenuCTAType { + case cancelPledge + case changePaymentMethod + case chooseAnotherReward + case contactCreator + case updatePledge + case viewRewards + + var trackingString: String { + switch self { + case .cancelPledge: return "cancel_pledge" + case .changePaymentMethod: return "change_payment_method" + case .chooseAnotherReward: return "choose_another_reward" + case .contactCreator: return "contact_creator" + case .updatePledge: return "update_pledge" + case .viewRewards: return "view_rewards" + } + } + } + /** Describes the buttons the user can click on in the reward pledge screen. @@ -620,6 +640,13 @@ public final class Koala { self.track(event: "Update Pledge Button Clicked", properties: props) } + public func trackManagePledgeOptionClicked(project: Project, managePledgeMenuCTA: ManagePledgeMenuCTAType) { + let props = properties(project: project, loggedInUser: self.loggedInUser) + .withAllValuesFrom(["cta": managePledgeMenuCTA.trackingString]) + + self.track(event: "Manage Pledge Option Clicked", properties: props) + } + public func trackSelectRewardButtonClicked( project: Project, reward: Reward?, diff --git a/Library/Koala/KoalaTests.swift b/Library/Koala/KoalaTests.swift index d3f8f6ba37..37029eab49 100644 --- a/Library/Koala/KoalaTests.swift +++ b/Library/Koala/KoalaTests.swift @@ -642,4 +642,58 @@ final class KoalaTests: TestCase { XCTAssertEqual(["Add New Card Button Clicked"], client.events) } + + func testTrackManagePledgeOptionClicked_CancelPledgeSelected() { + self.assertManagePledgeOptionClickedProperties(of: .cancelPledge, property: "cancel_pledge") + } + + func testTrackManagaPledgeOptionClicked_ChangePaymentMethod() { + self.assertManagePledgeOptionClickedProperties( + of: .changePaymentMethod, + property: "change_payment_method" + ) + } + + func testTrackManagaPledgeOptionClicked_ChooseAnotherReward() { + self.assertManagePledgeOptionClickedProperties( + of: .chooseAnotherReward, + property: "choose_another_reward" + ) + } + + func testTrackManagaPledgeOptionClicked_ContactCreator() { + self.assertManagePledgeOptionClickedProperties( + of: .contactCreator, + property: "contact_creator" + ) + } + + func testTrackManagaPledgeOptionClicked_UpdatePledge() { + self.assertManagePledgeOptionClickedProperties( + of: .updatePledge, + property: "update_pledge" + ) + } + + func testTrackManagaPledgeOptionClicked_ViewRewards() { + self.assertManagePledgeOptionClickedProperties( + of: .viewRewards, + property: "view_rewards" + ) + } + + private func assertManagePledgeOptionClickedProperties( + of type: Koala.ManagePledgeMenuCTAType, + property: String + ) { + let client = MockTrackingClient() + let loggedInUser = User.template + let koala = Koala(client: client, loggedInUser: loggedInUser) + + koala.trackManagePledgeOptionClicked(project: .template, managePledgeMenuCTA: type) + + let properties = client.properties.last + XCTAssertEqual(["Manage Pledge Option Clicked"], client.events) + XCTAssertEqual(property, properties?["cta"] as? String) + } } diff --git a/Library/ViewModels/ManagePledgeViewModel.swift b/Library/ViewModels/ManagePledgeViewModel.swift index 4a586f659f..1bd579503d 100644 --- a/Library/ViewModels/ManagePledgeViewModel.swift +++ b/Library/ViewModels/ManagePledgeViewModel.swift @@ -129,6 +129,16 @@ public final class ManagePledgeViewModel: .takeWhen(cancelPledgeSelected) // swiftlint:disable:next line_length .map { _ in Strings.We_dont_allow_cancelations_that_will_cause_a_project_to_fall_short_of_its_goal_within_the_last_24_hours() } + + let managePledgeMenuType: Signal = self.menuOptionSelectedSignal + .map(managePledgeMenuCTAType(for:)) + + // Tracking + project + .takePairWhen(managePledgeMenuType) + .observeValues { + AppEnvironment.current.koala.trackManagePledgeOptionClicked(project: $0, managePledgeMenuCTA: $1) + } } private let (configureWithProjectSignal, configureWithProjectObserver) = Signal.pipe() @@ -190,3 +200,14 @@ public final class ManagePledgeViewModel: private func navigationBarTitle(with project: Project) -> String { return project.state == .live ? Strings.Manage_your_pledge() : Strings.Your_pledge() } + +private func managePledgeMenuCTAType(for managePledgeAlertAction: ManagePledgeAlertAction) + -> Koala.ManagePledgeMenuCTAType { + switch managePledgeAlertAction { + case .cancelPledge: return .cancelPledge + case .changePaymentMethod: return .changePaymentMethod + case .chooseAnotherReward: return .chooseAnotherReward + case .contactCreator: return .contactCreator + case .updatePledge: return .updatePledge + } +} diff --git a/Library/ViewModels/ManagePledgeViewModelTests.swift b/Library/ViewModels/ManagePledgeViewModelTests.swift index 10293c0fc1..45e5161ce7 100644 --- a/Library/ViewModels/ManagePledgeViewModelTests.swift +++ b/Library/ViewModels/ManagePledgeViewModelTests.swift @@ -488,4 +488,19 @@ internal final class ManagePledgeViewModelTests: TestCase { self.title.assertValueCount(2) } } + + func testTrackingEvents() { + let project = Project.template + |> Project.lens.personalization.backing .~ Backing.template + + self.vm.inputs.configureWith(project) + self.vm.inputs.viewDidLoad() + + XCTAssertEqual([], self.trackingClient.events) + + self.vm.inputs.menuButtonTapped() + self.vm.inputs.menuOptionSelected(with: .updatePledge) + + XCTAssertEqual(["Manage Pledge Option Clicked"], self.trackingClient.events) + } }