11import Foundation
22import 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
0 commit comments