Skip to content

Commit 6e4523e

Browse files
authored
Merge pull request #192 from woocommerce/feature/33-login-analytics
Adds login analytics
2 parents 02317f8 + 7026acb commit 6e4523e

File tree

7 files changed

+172
-10
lines changed

7 files changed

+172
-10
lines changed

Podfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ target 'WooCommerce' do
1919
pod 'Automattic-Tracks-iOS', :git => 'https://github.com/Automattic/Automattic-Tracks-iOS.git', :tag => '0.2.3'
2020
pod 'Gridicons', '0.15'
2121
pod 'WordPressAuthenticator', '1.0.4'
22+
pod 'WordPressShared', '1.0.8'
2223

2324

2425
# External Libraries

Podfile.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ DEPENDENCIES:
7373
- Gridicons (= 0.15)
7474
- KeychainAccess (~> 3.1)
7575
- WordPressAuthenticator (= 1.0.4)
76+
- WordPressShared (= 1.0.8)
7677

7778
SPEC REPOS:
7879
https://github.com/cocoapods/specs.git:
@@ -132,6 +133,6 @@ SPEC CHECKSUMS:
132133
WordPressUI: af141587ec444f9af753a00605bd0d3f14d8d8a3
133134
wpxmlrpc: bfc572f62ce7ee897f6f38b098d2ba08732ecef4
134135

135-
PODFILE CHECKSUM: bca741aeec025b018771a1e5d22cbc71dfd15f55
136+
PODFILE CHECKSUM: c627b723e165dabc83c6716871f3199190464f2c
136137

137138
COCOAPODS: 1.5.3

WooCommerce/Classes/Analytics/WooAnalytics.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
import Foundation
22

33

4-
public enum WooAnalyticsStat: String {
5-
case applicationOpened = "application_opened"
6-
case applicationClosed = "application_closed"
7-
}
8-
9-
104
public class WooAnalytics {
115

126
// MARK: - Properties
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import WordPressShared
2+
3+
4+
/// This enum contains all of the events we track in the app.
5+
///
6+
public enum WooAnalyticsStat: String {
7+
8+
// Application Events
9+
//
10+
case applicationOpened = "application_opened"
11+
case applicationClosed = "application_closed"
12+
13+
// Authentication Events
14+
//
15+
case signedIn = "signed_in"
16+
case logout = "account_logout"
17+
case openedLogin = "login_accessed"
18+
case loginFailed = "login_failed_to_login"
19+
case loginAutoFillCredentialsFilled = "login_autofill_credentials_filled"
20+
case loginAutoFillCredentialsUpdated = "login_autofill_credentials_updated"
21+
case loginProloguePaged = "login_prologue_paged"
22+
case loginPrologueViewed = "login_prologue_viewed"
23+
case loginEmailFormViewed = "login_email_form_viewed"
24+
case loginMagicLinkOpenEmailClientViewed = "login_magic_link_open_email_client_viewed"
25+
case loginMagicLinkRequestFormViewed = "login_magic_link_request_form_viewed"
26+
case loginMagicLinkExited = "login_magic_link_exited"
27+
case loginMagicLinkFailed = "login_magic_link_failed"
28+
case loginMagicLinkOpened = "login_magic_link_opened"
29+
case loginMagicLinkRequested = "login_magic_link_requested"
30+
case loginMagicLinkSucceeded = "login_magic_link_succeeded"
31+
case loginPasswordFormViewed = "login_password_form_viewed"
32+
case loginURLFormViewed = "login_url_form_viewed"
33+
case loginURLHelpScreenViewed = "login_url_help_screen_viewed"
34+
case loginUsernamePasswordFormViewed = "login_username_password_form_viewed"
35+
case loginTwoFactorFormViewed = "login_two_factor_form_viewed"
36+
case loginEpilogueViewed = "login_epilogue_viewed"
37+
case loginForgotPasswordClicked = "login_forgot_password_clicked"
38+
case loginSocialButtonClick = "login_social_button_click"
39+
case loginSocialButtonFailure = "login_social_button_failure"
40+
case loginSocialConnectSuccess = "login_social_connect_success"
41+
case loginSocialConnectFailure = "login_social_connect_failure"
42+
case loginSocialSuccess = "login_social_login_success"
43+
case loginSocialFailure = "login_social_login_failure"
44+
case loginSocial2faNeeded = "login_social_2fa_needed"
45+
case loginSocialAccountsNeedConnecting = "login_social_accounts_need_connecting"
46+
case loginSocialErrorUnknownUser = "login_social_error_unknown_user"
47+
case onePasswordFailed = "one_password_failed"
48+
case onePasswordLogin = "one_password_login"
49+
case onePasswordSignup = "one_password_signup"
50+
case twoFactorCodeRequested = "two_factor_code_requested"
51+
case twoFactorSentSMS = "two_factor_sent_sms"
52+
}
53+
54+
public extension WooAnalyticsStat {
55+
56+
/// Converts the provided WPAnalyticsStat into a WooAnalyticsStat.
57+
/// This whole process kinda stinks, but we need this for the `WordPressAuthenticatorDelegate`
58+
/// implementation. ☹️ Feel free to refactor later on!
59+
///
60+
/// - Parameter stat: The WPAnalyticsStat to convert
61+
/// - Returns: The corresponding WooAnalyticsStat or nil if it cannot be converted
62+
///
63+
static func valueOf(stat: WPAnalyticsStat) -> WooAnalyticsStat? {
64+
var wooEvent: WooAnalyticsStat? = nil
65+
66+
switch stat {
67+
case .signedIn:
68+
wooEvent = WooAnalyticsStat.signedIn
69+
case .signedInToJetpack:
70+
wooEvent = WooAnalyticsStat.signedIn
71+
case .logout:
72+
wooEvent = WooAnalyticsStat.logout
73+
case .openedLogin:
74+
wooEvent = WooAnalyticsStat.openedLogin
75+
case .loginFailed:
76+
wooEvent = WooAnalyticsStat.loginFailed
77+
case .loginAutoFillCredentialsFilled:
78+
wooEvent = WooAnalyticsStat.loginAutoFillCredentialsFilled
79+
case .loginAutoFillCredentialsUpdated:
80+
wooEvent = WooAnalyticsStat.loginAutoFillCredentialsUpdated
81+
case .loginProloguePaged:
82+
wooEvent = WooAnalyticsStat.loginProloguePaged
83+
case .loginPrologueViewed:
84+
wooEvent = WooAnalyticsStat.loginPrologueViewed
85+
case .loginEmailFormViewed:
86+
wooEvent = WooAnalyticsStat.loginEmailFormViewed
87+
case .loginMagicLinkOpenEmailClientViewed:
88+
wooEvent = WooAnalyticsStat.loginMagicLinkOpenEmailClientViewed
89+
case .loginMagicLinkRequestFormViewed:
90+
wooEvent = WooAnalyticsStat.loginMagicLinkRequestFormViewed
91+
case .loginMagicLinkExited:
92+
wooEvent = WooAnalyticsStat.loginMagicLinkExited
93+
case .loginMagicLinkFailed:
94+
wooEvent = WooAnalyticsStat.loginMagicLinkFailed
95+
case .loginMagicLinkOpened:
96+
wooEvent = WooAnalyticsStat.loginMagicLinkOpened
97+
case .loginMagicLinkRequested:
98+
wooEvent = WooAnalyticsStat.loginMagicLinkRequested
99+
case .loginMagicLinkSucceeded:
100+
wooEvent = WooAnalyticsStat.loginMagicLinkSucceeded
101+
case .loginPasswordFormViewed:
102+
wooEvent = WooAnalyticsStat.loginPasswordFormViewed
103+
case .loginURLFormViewed:
104+
wooEvent = WooAnalyticsStat.loginURLFormViewed
105+
case .loginURLHelpScreenViewed:
106+
wooEvent = WooAnalyticsStat.loginURLHelpScreenViewed
107+
case .loginUsernamePasswordFormViewed:
108+
wooEvent = WooAnalyticsStat.loginUsernamePasswordFormViewed
109+
case .loginTwoFactorFormViewed:
110+
wooEvent = WooAnalyticsStat.loginTwoFactorFormViewed
111+
case .loginEpilogueViewed:
112+
wooEvent = WooAnalyticsStat.loginEpilogueViewed
113+
case .loginForgotPasswordClicked:
114+
wooEvent = WooAnalyticsStat.loginForgotPasswordClicked
115+
case .loginSocialButtonClick:
116+
wooEvent = WooAnalyticsStat.loginSocialButtonClick
117+
case .loginSocialButtonFailure:
118+
wooEvent = WooAnalyticsStat.loginSocialButtonFailure
119+
case .loginSocialConnectSuccess:
120+
wooEvent = WooAnalyticsStat.loginSocialConnectSuccess
121+
case .loginSocialConnectFailure:
122+
wooEvent = WooAnalyticsStat.loginSocialConnectFailure
123+
case .loginSocialSuccess:
124+
wooEvent = WooAnalyticsStat.loginSocialSuccess
125+
case .loginSocialFailure:
126+
wooEvent = WooAnalyticsStat.loginSocialFailure
127+
case .loginSocial2faNeeded:
128+
wooEvent = WooAnalyticsStat.loginSocial2faNeeded
129+
case .loginSocialAccountsNeedConnecting:
130+
wooEvent = WooAnalyticsStat.loginSocialAccountsNeedConnecting
131+
case .loginSocialErrorUnknownUser:
132+
wooEvent = WooAnalyticsStat.loginSocialErrorUnknownUser
133+
case .onePasswordFailed:
134+
wooEvent = WooAnalyticsStat.onePasswordFailed
135+
case .onePasswordLogin:
136+
wooEvent = WooAnalyticsStat.onePasswordLogin
137+
case .onePasswordSignup:
138+
wooEvent = WooAnalyticsStat.onePasswordSignup
139+
case .twoFactorCodeRequested:
140+
wooEvent = WooAnalyticsStat.twoFactorCodeRequested
141+
case .twoFactorSentSMS:
142+
wooEvent = WooAnalyticsStat.twoFactorSentSMS
143+
default:
144+
wooEvent = nil
145+
}
146+
147+
return wooEvent
148+
}
149+
}

WooCommerce/Classes/Authentication/AuthenticationManager.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,18 +190,30 @@ extension AuthenticationManager: WordPressAuthenticatorDelegate {
190190
/// Tracks a given Analytics Event.
191191
///
192192
func track(event: WPAnalyticsStat) {
193-
// TODO: Integrate Tracks
193+
guard let wooEvent = WooAnalyticsStat.valueOf(stat: event) else {
194+
DDLogWarn("⚠️ Could not convert WPAnalyticsStat with value: \(event.rawValue)")
195+
return
196+
}
197+
WooAnalytics.shared.track(wooEvent)
194198
}
195199

196200
/// Tracks a given Analytics Event, with the specified properties.
197201
///
198202
func track(event: WPAnalyticsStat, properties: [AnyHashable: Any]) {
199-
// TODO: Integrate Tracks
203+
guard let wooEvent = WooAnalyticsStat.valueOf(stat: event) else {
204+
DDLogWarn("⚠️ Could not convert WPAnalyticsStat with value: \(event.rawValue)")
205+
return
206+
}
207+
WooAnalytics.shared.track(wooEvent, withProperties: properties)
200208
}
201209

202210
/// Tracks a given Analytics Event, with the specified error.
203211
///
204212
func track(event: WPAnalyticsStat, error: Error) {
205-
// TODO: Integrate Tracks
213+
guard let wooEvent = WooAnalyticsStat.valueOf(stat: event) else {
214+
DDLogWarn("⚠️ Could not convert WPAnalyticsStat with value: \(event.rawValue)")
215+
return
216+
}
217+
WooAnalytics.shared.track(wooEvent, withError: error)
206218
}
207219
}

WooCommerce/Classes/ViewRelated/Dashboard/Settings/SettingsViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ extension SettingsViewController: UITableViewDataSource {
7676
if cell is LogOutTableViewCell {
7777
let logoutCell = cell as! LogOutTableViewCell
7878
logoutCell.didSelectLogout = { [weak self] in
79+
WooAnalytics.shared.track(.logout)
7980
StoresManager.shared.deauthenticate()
8081
self?.navigationController?.popToRootViewController(animated: true)
8182
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
/* Begin PBXBuildFile section */
2424
7403F7E220EC04070097198F /* OrderStatusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7403F7E120EC04070097198F /* OrderStatusViewModel.swift */; };
25+
7421344A210A323C00C13890 /* WooAnalyticsStat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74213449210A323C00C13890 /* WooAnalyticsStat.swift */; };
2526
746791632108D7C0007CF1DC /* WooAnalyticsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 746791622108D7C0007CF1DC /* WooAnalyticsTests.swift */; };
2627
746791662108D87B007CF1DC /* MockupAnalyticsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 746791652108D87B007CF1DC /* MockupAnalyticsProvider.swift */; };
2728
747AA0892107CEC60047A89B /* AnalyticsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 747AA0882107CEC60047A89B /* AnalyticsProvider.swift */; };
@@ -179,6 +180,7 @@
179180
/* Begin PBXFileReference section */
180181
33035144757869DE5E4DC88A /* Pods-WooCommerce.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WooCommerce.release.xcconfig"; path = "../Pods/Target Support Files/Pods-WooCommerce/Pods-WooCommerce.release.xcconfig"; sourceTree = "<group>"; };
181182
7403F7E120EC04070097198F /* OrderStatusViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderStatusViewModel.swift; sourceTree = "<group>"; };
183+
74213449210A323C00C13890 /* WooAnalyticsStat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WooAnalyticsStat.swift; sourceTree = "<group>"; };
182184
746791622108D7C0007CF1DC /* WooAnalyticsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WooAnalyticsTests.swift; sourceTree = "<group>"; };
183185
746791652108D87B007CF1DC /* MockupAnalyticsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockupAnalyticsProvider.swift; sourceTree = "<group>"; };
184186
747AA0882107CEC60047A89B /* AnalyticsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsProvider.swift; sourceTree = "<group>"; };
@@ -342,6 +344,7 @@
342344
isa = PBXGroup;
343345
children = (
344346
CEA16F3920FD0C8C0061B4E1 /* WooAnalytics.swift */,
347+
74213449210A323C00C13890 /* WooAnalyticsStat.swift */,
345348
747AA0882107CEC60047A89B /* AnalyticsProvider.swift */,
346349
747AA08A2107CF8D0047A89B /* TracksProvider.swift */,
347350
);
@@ -1022,6 +1025,7 @@
10221025
B56DB3CA2049BFAA00D4AA8E /* AppDelegate.swift in Sources */,
10231026
B5A82EE7210263460053ADC8 /* UIViewController+Helpers.swift in Sources */,
10241027
CE1F512B206985DF00C6C810 /* PaddedLabel.swift in Sources */,
1028+
7421344A210A323C00C13890 /* WooAnalyticsStat.swift in Sources */,
10251029
CE1EC8D120B6FE39009762BF /* FootnoteView.swift in Sources */,
10261030
B58B4AB82108F14700076FDD /* NoticeNotificationInfo.swift in Sources */,
10271031
B557DA1520979904005962F4 /* CustomerNoteTableViewCell.swift in Sources */,

0 commit comments

Comments
 (0)