Skip to content
This repository was archived by the owner on Feb 5, 2025. It is now read-only.

Commit 95c269b

Browse files
authored
Merge pull request #117 from wordpress-mobile/feature/siwa_create_account_epilogue
[SIWA] Show new account epilogue
2 parents d0f6bda + c9a2398 commit 95c269b

File tree

8 files changed

+108
-24
lines changed

8 files changed

+108
-24
lines changed

Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def wordpress_authenticator_pods
1212
##
1313
pod 'Gridicons', '~> 0.15'
1414
pod 'WordPressUI', '~> 1.3'
15-
pod 'WordPressKit', '~> 4.5.0-beta.1'
15+
pod 'WordPressKit', '~> 4.5.0-beta.2'
1616
pod 'WordPressShared', '~> 1.8'
1717

1818
## Third party libraries

Podfile.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ PODS:
4444
- Specta (1.0.7)
4545
- SVProgressHUD (2.2.5)
4646
- UIDeviceIdentifier (1.1.4)
47-
- WordPressKit (4.5.0-beta.1):
47+
- WordPressKit (4.5.0-beta.2):
4848
- Alamofire (~> 4.7.3)
4949
- CocoaLumberjack (~> 3.4)
5050
- NSObject-SafeExpectations (= 0.0.3)
@@ -71,7 +71,7 @@ DEPENDENCIES:
7171
- OHHTTPStubs/Swift (= 8.0.0)
7272
- Specta (= 1.0.7)
7373
- SVProgressHUD (= 2.2.5)
74-
- WordPressKit (~> 4.5.0-beta.1)
74+
- WordPressKit (~> 4.5.0-beta.2)
7575
- WordPressShared (~> 1.8)
7676
- WordPressUI (~> 1.3)
7777

@@ -117,11 +117,11 @@ SPEC CHECKSUMS:
117117
Specta: 3e1bd89c3517421982dc4d1c992503e48bd5fe66
118118
SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6
119119
UIDeviceIdentifier: 8f8a24b257a4d978c8d40ad1e7355b944ffbfa8c
120-
WordPressKit: bfb5e77a32e66b19ee304bdffd5b7128a7fe4ede
120+
WordPressKit: 6fb3101e9542398c895517d64ac435d3a4e83e25
121121
WordPressShared: 34f7a1386d28d7e4650c1a225c554ee024401ca3
122122
WordPressUI: 0ea6df25bf6e63f0619376fa23870177cb37646f
123123
wpxmlrpc: 6ba55c773cfa27083ae4a2173e69b19f46da98e2
124124

125-
PODFILE CHECKSUM: e2a10fcbbc81f9e30af60797f89b8315a6819211
125+
PODFILE CHECKSUM: 066779a8741fbd6f8205a5d3469e19c8c80682b7
126126

127127
COCOAPODS: 1.6.1

WordPressAuthenticator.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "WordPressAuthenticator"
3-
s.version = "1.8.0-beta.6"
3+
s.version = "1.8.0-beta.7"
44
s.summary = "WordPressAuthenticator implements an easy and elegant way to authenticate your WordPress Apps."
55

66
s.description = <<-DESC
@@ -39,6 +39,6 @@ Pod::Spec.new do |s|
3939
s.dependency 'Gridicons', '~> 0.15'
4040
s.dependency 'GoogleSignIn', '~> 4.4'
4141
s.dependency 'WordPressUI', '~> 1.3'
42-
s.dependency 'WordPressKit', '~> 4.5.0-beta.1'
42+
s.dependency 'WordPressKit', '~> 4.5.0-beta.2'
4343
s.dependency 'WordPressShared', '~> 1.8'
4444
end

WordPressAuthenticator/Model/LoginFields.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,6 @@ public class LoginFieldsMeta: NSObject {
116116
@objc public var socialServiceIDToken: String?
117117

118118
var googleUser: GIDGoogleUser?
119+
120+
var appleUser: AppleUser?
119121
}

WordPressAuthenticator/Services/SocialService.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,14 @@ public enum SocialService {
77
/// Google's Signup Linked Account
88
///
99
case google(user: GIDGoogleUser)
10+
11+
/// Apple's Signup Linked Account
12+
///
13+
case apple(user: AppleUser)
14+
}
15+
16+
// Struct to contain information relevant to an Apple ID account.
17+
public struct AppleUser {
18+
public var email: String
19+
public var fullName: String
1020
}

WordPressAuthenticator/Services/WordPressComAccountService.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,20 @@ class WordPressComAccountService {
2121

2222
/// Connects a WordPress.com account with the specified Social Service.
2323
///
24-
func connect(wpcomAuthToken: String, serviceName: SocialServiceName, serviceToken: String, success: @escaping () -> Void, failure: @escaping (Error) -> Void) {
24+
func connect(wpcomAuthToken: String,
25+
serviceName: SocialServiceName,
26+
serviceToken: String,
27+
connectParameters: [String:AnyObject]? = nil,
28+
success: @escaping () -> Void,
29+
failure: @escaping (Error) -> Void) {
2530
let loggedAPI = WordPressComRestApi(oAuthToken: wpcomAuthToken,
2631
userAgent: configuration.userAgent,
2732
baseUrlString: configuration.wpcomAPIBaseURL)
2833
let remote = AccountServiceRemoteREST(wordPressComRestApi: loggedAPI)
2934

3035
remote.connectToSocialService(serviceName,
3136
serviceIDToken: serviceToken,
37+
connectParameters: connectParameters,
3238
oAuthClientID: configuration.wpcomClientId,
3339
oAuthClientSecret: configuration.wpcomSecret,
3440
success: success,

WordPressAuthenticator/Signin/AppleAuthenticator.swift

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
import AuthenticationServices
3+
import WordPressKit
34

45
#if XCODE11
56

@@ -10,10 +11,19 @@ class AppleAuthenticator: NSObject {
1011
static var sharedInstance: AppleAuthenticator = AppleAuthenticator()
1112
private override init() {}
1213
private var showFromViewController: UIViewController?
14+
private let loginFields = LoginFields()
1315

16+
private var authenticationDelegate: WordPressAuthenticatorDelegate {
17+
guard let delegate = WordPressAuthenticator.shared.delegate else {
18+
fatalError()
19+
}
20+
return delegate
21+
}
22+
1423
// MARK: - Start Authentication
1524

1625
func showFrom(viewController: UIViewController) {
26+
loginFields.meta.socialService = SocialServiceName.apple
1727
showFromViewController = viewController
1828
requestAuthorization()
1929
}
@@ -47,17 +57,54 @@ private extension AppleAuthenticator {
4757
return
4858
}
4959

60+
let token = identityToken.base64EncodedString()
61+
let name = fullName(from: appleCredentials.fullName)
62+
63+
updateLoginFields(email: email, fullName: name, token: token)
64+
5065
let service = SignupService()
51-
service.createWPComUserWithApple(token: identityToken.base64EncodedString(),
52-
email: email,
53-
fullName: fullName(from: appleCredentials.fullName),
66+
service.createWPComUserWithApple(token: token, email: email, fullName: name,
5467
success: { [weak self] accountCreated, wpcomUsername, wpcomToken in
55-
NSLog("Apple Authenticator: createWPComUserWithApple success. accountCreated: ", accountCreated)
68+
69+
let wpcom = WordPressComCredentials(authToken: wpcomToken, isJetpackLogin: false, multifactor: false, siteURL: self?.loginFields.siteAddress ?? "")
70+
let credentials = AuthenticatorCredentials(wpcom: wpcom)
71+
72+
// New Account
73+
if accountCreated {
74+
self?.authenticationDelegate.createdWordPressComAccount(username: wpcomUsername, authToken: wpcomToken)
75+
self?.signupSuccessful(with: credentials)
76+
return
77+
}
78+
// TODO: handle Existing Account.
79+
5680
}, failure: { [weak self] error in
57-
DDLogError("Apple Authenticator: createWPComUserWithApple failure. error: \(error)")
81+
self?.signupFailed(with: error)
5882
})
5983
}
6084

85+
func signupSuccessful(with credentials: AuthenticatorCredentials) {
86+
WordPressAuthenticator.track(.createdAccount, properties: ["source": "apple"])
87+
WordPressAuthenticator.track(.signupSocialSuccess)
88+
showSignupEpilogue(for: credentials)
89+
}
90+
91+
func showSignupEpilogue(for credentials: AuthenticatorCredentials) {
92+
guard let navigationController = showFromViewController?.navigationController else {
93+
fatalError()
94+
}
95+
96+
let service = loginFields.meta.appleUser.flatMap {
97+
return SocialService.apple(user: $0)
98+
}
99+
100+
authenticationDelegate.presentSignupEpilogue(in: navigationController, for: credentials, service: service)
101+
}
102+
103+
func signupFailed(with error: Error) {
104+
WPAnalytics.track(.signupSocialFailure)
105+
DDLogError("Apple Authenticator: signup failed. error: \(error)")
106+
}
107+
61108
// MARK: - Helpers
62109

63110
func fullName(from components: PersonNameComponents?) -> String {
@@ -66,6 +113,13 @@ private extension AppleAuthenticator {
66113
}
67114
return PersonNameComponentsFormatter().string(from: name)
68115
}
116+
117+
func updateLoginFields(email: String, fullName: String, token: String) {
118+
loginFields.emailAddress = email
119+
loginFields.username = email
120+
loginFields.meta.socialServiceIDToken = token
121+
loginFields.meta.appleUser = AppleUser(email: email, fullName: fullName)
122+
}
69123

70124
}
71125

WordPressAuthenticator/Signin/LoginViewController.swift

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -262,22 +262,34 @@ extension LoginViewController {
262262
guard let serviceName = loginFields.meta.socialService, let serviceToken = loginFields.meta.socialServiceIDToken else {
263263
return
264264
}
265-
266-
linkSocialService(serviceName: serviceName, serviceToken: serviceToken, wpcomAuthToken: wpcomAuthToken)
265+
266+
let appleConnectParameters:[String:AnyObject]? = {
267+
if let appleUser = loginFields.meta.appleUser {
268+
return AccountServiceRemoteREST.appleSignInParameters(email: appleUser.email, fullName: appleUser.fullName)
269+
}
270+
return nil
271+
}()
272+
273+
linkSocialService(serviceName: serviceName,
274+
serviceToken: serviceToken,
275+
wpcomAuthToken: wpcomAuthToken,
276+
appleConnectParameters: appleConnectParameters)
267277
}
268278

269279
/// Links the current WordPress Account to a Social Service.
270280
///
271-
func linkSocialService(serviceName: SocialServiceName, serviceToken: String, wpcomAuthToken: String) {
272-
guard serviceName == .google else {
273-
DDLogError("Error: Unsupported Social Service")
274-
return
275-
}
276-
281+
func linkSocialService(serviceName: SocialServiceName,
282+
serviceToken: String,
283+
wpcomAuthToken: String,
284+
appleConnectParameters: [String:AnyObject]? = nil) {
277285
let service = WordPressComAccountService()
278-
service.connect(wpcomAuthToken: wpcomAuthToken, serviceName: serviceName, serviceToken: serviceToken, success: {
279-
WordPressAuthenticator.track(.loginSocialConnectSuccess)
280-
WordPressAuthenticator.track(.loginSocialSuccess)
286+
service.connect(wpcomAuthToken: wpcomAuthToken,
287+
serviceName: serviceName,
288+
serviceToken: serviceToken,
289+
connectParameters: appleConnectParameters,
290+
success: {
291+
WordPressAuthenticator.track(.loginSocialConnectSuccess)
292+
WordPressAuthenticator.track(.loginSocialSuccess)
281293
}, failure: { error in
282294
DDLogError("Social Link Error: \(error)")
283295
WordPressAuthenticator.track(.loginSocialConnectFailure, error: error)

0 commit comments

Comments
 (0)