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

Commit dc6d774

Browse files
authored
Merge pull request #520 from wordpress-mobile/try/navigation
Partially expose navigation logic to clients of WPAuthenticator
2 parents 098405e + ca65b3d commit dc6d774

File tree

12 files changed

+186
-16
lines changed

12 files changed

+186
-16
lines changed

WordPressAuthenticator.podspec

Lines changed: 1 addition & 1 deletion
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.30.0-beta.1"
3+
s.version = "1.30.0-beta.2"
44
s.summary = "WordPressAuthenticator implements an easy and elegant way to authenticate your WordPress Apps."
55

66
s.description = <<-DESC

WordPressAuthenticator.xcodeproj/project.pbxproj

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@
154154
CEDE0D93242011E000CB3345 /* NSObject+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDE0D92242011E000CB3345 /* NSObject+Helpers.swift */; };
155155
CEDE0D952420121D00CB3345 /* UIStoryboard+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDE0D942420121D00CB3345 /* UIStoryboard+Helpers.swift */; };
156156
CEDE0D972420126900CB3345 /* UIViewController+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDE0D962420126900CB3345 /* UIViewController+Helpers.swift */; };
157+
D85C3653256DEDA900D56E34 /* WordPressAuthenticatorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85C3652256DEDA900D56E34 /* WordPressAuthenticatorResult.swift */; };
158+
D85C36E6256E0DDE00D56E34 /* NavigationToEnterSiteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85C36E5256E0DDE00D56E34 /* NavigationToEnterSiteTests.swift */; };
159+
D85C36EC256E10EA00D56E34 /* MockNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85C36EB256E10EA00D56E34 /* MockNavigationController.swift */; };
160+
D85C36F0256E118D00D56E34 /* NavigationToEnterAccountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85C36EF256E118D00D56E34 /* NavigationToEnterAccountTests.swift */; };
161+
D881A30D256B5A7900FE5605 /* NavigationCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = D881A30C256B5A7900FE5605 /* NavigationCommand.swift */; };
162+
D881A311256B5B4700FE5605 /* NavigateToEnterSite.swift in Sources */ = {isa = PBXBuildFile; fileRef = D881A310256B5B4700FE5605 /* NavigateToEnterSite.swift */; };
163+
D881A315256B5B5800FE5605 /* NavigateToEnterAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = D881A314256B5B5800FE5605 /* NavigateToEnterAccount.swift */; };
157164
D85C3882256E3FEC00D56E34 /* WordPressComSiteInfoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85C3881256E3FEC00D56E34 /* WordPressComSiteInfoTests.swift */; };
158165
E8AF6B9EF50902F2117DFAF9 /* Pods_WordPressAuthenticatorTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A441EC80D2B8D2209C2E228 /* Pods_WordPressAuthenticatorTests.framework */; };
159166
F12F9FB424D8A68E00771BCE /* AuthenticatorAnalyticsTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12F9FB324D8A68E00771BCE /* AuthenticatorAnalyticsTracker.swift */; };
@@ -354,6 +361,13 @@
354361
CEDE0D92242011E000CB3345 /* NSObject+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSObject+Helpers.swift"; sourceTree = "<group>"; };
355362
CEDE0D942420121D00CB3345 /* UIStoryboard+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStoryboard+Helpers.swift"; sourceTree = "<group>"; };
356363
CEDE0D962420126900CB3345 /* UIViewController+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Helpers.swift"; sourceTree = "<group>"; };
364+
D85C3652256DEDA900D56E34 /* WordPressAuthenticatorResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressAuthenticatorResult.swift; sourceTree = "<group>"; };
365+
D85C36E5256E0DDE00D56E34 /* NavigationToEnterSiteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationToEnterSiteTests.swift; sourceTree = "<group>"; };
366+
D85C36EB256E10EA00D56E34 /* MockNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNavigationController.swift; sourceTree = "<group>"; };
367+
D85C36EF256E118D00D56E34 /* NavigationToEnterAccountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationToEnterAccountTests.swift; sourceTree = "<group>"; };
368+
D881A30C256B5A7900FE5605 /* NavigationCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationCommand.swift; sourceTree = "<group>"; };
369+
D881A310256B5B4700FE5605 /* NavigateToEnterSite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigateToEnterSite.swift; sourceTree = "<group>"; };
370+
D881A314256B5B5800FE5605 /* NavigateToEnterAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigateToEnterAccount.swift; sourceTree = "<group>"; };
357371
D85C3881256E3FEC00D56E34 /* WordPressComSiteInfoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressComSiteInfoTests.swift; sourceTree = "<group>"; };
358372
E9414A95E29F3297555AC92B /* Pods-WordPressAuthenticator.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WordPressAuthenticator.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WordPressAuthenticator/Pods-WordPressAuthenticator.debug.xcconfig"; sourceTree = "<group>"; };
359373
F12F9FB324D8A68E00771BCE /* AuthenticatorAnalyticsTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticatorAnalyticsTracker.swift; sourceTree = "<group>"; };
@@ -622,6 +636,7 @@
622636
CE1B18D120EEC44400BECC3F /* WordPressAuthenticatorStyles.swift */,
623637
020BE74923B0BD2E007FE54C /* WordPressAuthenticatorDisplayImages.swift */,
624638
CE16177421B6D82200B82A47 /* WordPressAuthenticatorDisplayStrings.swift */,
639+
D85C3652256DEDA900D56E34 /* WordPressAuthenticatorResult.swift */,
625640
);
626641
path = Authenticator;
627642
sourceTree = "<group>";
@@ -710,6 +725,7 @@
710725
B5ED78F6207E976500A8FD8C /* WordPressAuthenticator */ = {
711726
isa = PBXGroup;
712727
children = (
728+
D881A307256B5A6900FE5605 /* Navigation */,
713729
F12F9FB624D8A7E800771BCE /* Analytics */,
714730
CE1B18CA20EEC31000BECC3F /* Credentials */,
715731
B5609099208A4EAF00399AE4 /* Authenticator */,
@@ -734,6 +750,7 @@
734750
B5ED7901207E976500A8FD8C /* WordPressAuthenticatorTests */ = {
735751
isa = PBXGroup;
736752
children = (
753+
D85C36E4256E0DAF00D56E34 /* Navigation */,
737754
F18DF0E32525009200D83AFE /* SupportingFiles */,
738755
BA53D64924DFE06C001F1ABF /* Mocks */,
739756
BA53D64424DFDE0B001F1ABF /* Credentials */,
@@ -786,6 +803,7 @@
786803
BA53D64E24DFE981001F1ABF /* MockOnePasswordFacade.swift */,
787804
BA53D64C24DFE4E6001F1ABF /* ModalViewControllerPresentingSpy.swift */,
788805
BA53D64A24DFE07D001F1ABF /* WordpressAuthenticatorProvider.swift */,
806+
D85C36EB256E10EA00D56E34 /* MockNavigationController.swift */,
789807
);
790808
path = Mocks;
791809
sourceTree = "<group>";
@@ -861,6 +879,25 @@
861879
path = "Site Address";
862880
sourceTree = "<group>";
863881
};
882+
D85C36E4256E0DAF00D56E34 /* Navigation */ = {
883+
isa = PBXGroup;
884+
children = (
885+
D85C36E5256E0DDE00D56E34 /* NavigationToEnterSiteTests.swift */,
886+
D85C36EF256E118D00D56E34 /* NavigationToEnterAccountTests.swift */,
887+
);
888+
path = Navigation;
889+
sourceTree = "<group>";
890+
};
891+
D881A307256B5A6900FE5605 /* Navigation */ = {
892+
isa = PBXGroup;
893+
children = (
894+
D881A30C256B5A7900FE5605 /* NavigationCommand.swift */,
895+
D881A310256B5B4700FE5605 /* NavigateToEnterSite.swift */,
896+
D881A314256B5B5800FE5605 /* NavigateToEnterAccount.swift */,
897+
);
898+
path = Navigation;
899+
sourceTree = "<group>";
900+
};
864901
F12F9FB524D8A7DB00771BCE /* Analytics */ = {
865902
isa = PBXGroup;
866903
children = (
@@ -1193,6 +1230,7 @@
11931230
B560910F208A54F800399AE4 /* SafariCredentialsService.swift in Sources */,
11941231
B5CDBED420B4714500BC1EF2 /* UIImage+Assets.swift in Sources */,
11951232
B5609116208A555600399AE4 /* LoginTextField.swift in Sources */,
1233+
D85C3653256DEDA900D56E34 /* WordPressAuthenticatorResult.swift in Sources */,
11961234
F1C96669250BF53400EB529D /* UIViewController+Dismissal.swift in Sources */,
11971235
CE811D6724EDC0FB00F4CCD6 /* LoginMagicLinkViewController.swift in Sources */,
11981236
B56090E2208A4F9D00399AE4 /* WPNUXSecondaryButton.m in Sources */,
@@ -1234,6 +1272,7 @@
12341272
CE1B18CE20EEC3CB00BECC3F /* WordPressAuthenticatorDelegateProtocol.swift in Sources */,
12351273
B5609110208A54F800399AE4 /* OnePasswordFacade.swift in Sources */,
12361274
F180B82424F59263000A01F5 /* StoredCredentialsPicker.swift in Sources */,
1275+
D881A311256B5B4700FE5605 /* NavigateToEnterSite.swift in Sources */,
12371276
B5609109208A54F800399AE4 /* SignupService.swift in Sources */,
12381277
B560913D208A563800399AE4 /* LoginProloguePageViewController.swift in Sources */,
12391278
B5609117208A555600399AE4 /* SearchTableViewCell.swift in Sources */,
@@ -1242,6 +1281,7 @@
12421281
B56090F1208A527000399AE4 /* String+Underline.swift in Sources */,
12431282
B56052A42090B2ED001B91FD /* CircularImageView.swift in Sources */,
12441283
B5609141208A563800399AE4 /* LoginPrologueViewController.swift in Sources */,
1284+
D881A315256B5B5800FE5605 /* NavigateToEnterAccount.swift in Sources */,
12451285
B56090EB208A51D000399AE4 /* LoginFields.swift in Sources */,
12461286
B56090FB208A533200399AE4 /* WordPressSupportSourceTag.swift in Sources */,
12471287
F1AF1BEF24E4A80F00BA453E /* LoginFacade.swift in Sources */,
@@ -1258,6 +1298,7 @@
12581298
B56090CB208A4F5400399AE4 /* NUXNavigationController.swift in Sources */,
12591299
B560911F208A555E00399AE4 /* SignupGoogleViewController.swift in Sources */,
12601300
B5609142208A563800399AE4 /* LoginNavigationController.swift in Sources */,
1301+
D881A30D256B5A7900FE5605 /* NavigationCommand.swift in Sources */,
12611302
CE9C5B4E24E31E03005A8BCF /* SignupMagicLinkViewController.swift in Sources */,
12621303
B56090E4208A4F9D00399AE4 /* WPNUXMainButton.m in Sources */,
12631304
3FFF2FC323D7F53200D38C77 /* AppSelector.swift in Sources */,
@@ -1284,11 +1325,14 @@
12841325
BA53D64824DFDF97001F1ABF /* WordPressSourceTagTests.swift in Sources */,
12851326
BA53D64D24DFE4E6001F1ABF /* ModalViewControllerPresentingSpy.swift in Sources */,
12861327
BA53D64624DFDE1D001F1ABF /* CredentialsTests.swift in Sources */,
1328+
D85C36EC256E10EA00D56E34 /* MockNavigationController.swift in Sources */,
12871329
BA53D64F24DFE981001F1ABF /* MockOnePasswordFacade.swift in Sources */,
12881330
3F550D4E23DA429B007E5897 /* AppSelectorTests.swift in Sources */,
12891331
BA53D64B24DFE07D001F1ABF /* WordpressAuthenticatorProvider.swift in Sources */,
12901332
CE16177821B70C1A00B82A47 /* WordPressAuthenticatorDisplayTextTests.swift in Sources */,
12911333
B501C048208FC79C00D1E58F /* LoginFacadeTests.m in Sources */,
1334+
D85C36F0256E118D00D56E34 /* NavigationToEnterAccountTests.swift in Sources */,
1335+
D85C36E6256E0DDE00D56E34 /* NavigationToEnterSiteTests.swift in Sources */,
12921336
D85C3882256E3FEC00D56E34 /* WordPressComSiteInfoTests.swift in Sources */,
12931337
F12F9FB824D8A7FC00771BCE /* AnalyticsTrackerTests.swift in Sources */,
12941338
B501C046208FC6A700D1E58F /* WordPressAuthenticatorTests.swift in Sources */,

WordPressAuthenticator/Authenticator/WordPressAuthenticatorDelegateProtocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public protocol WordPressAuthenticatorDelegate: class {
4848
/// - site: passes in the site information to the delegate method.
4949
/// - onCompletion: Closure to be executed on completion.
5050
///
51-
func shouldPresentUsernamePasswordController(for siteInfo: WordPressComSiteInfo?, onCompletion: @escaping (Error?, Bool) -> Void)
51+
func shouldPresentUsernamePasswordController(for siteInfo: WordPressComSiteInfo?, onCompletion: @escaping (WordPressAuthenticatorResult) -> Void)
5252

5353
/// Presents the Login Epilogue, in the specified NavigationController.
5454
///
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Foundation
2+
3+
4+
/// Provides options for clients of WordPressAuthenticator
5+
/// to signal what they expect WPAuthenticator to do in response to
6+
/// `shouldPresentUsernamePasswordController`
7+
///
8+
/// @see WordPressAuthenticatorDelegate.shouldPresentUsernamePasswordController
9+
public enum WordPressAuthenticatorResult {
10+
11+
/// An error
12+
///
13+
case error(value: Error)
14+
15+
/// Boolean flag to indicate if UI providing entry for username and passsword
16+
/// should be presented
17+
///
18+
case presentPasswordController(value: Bool)
19+
20+
/// A view controller to be inserted into the navigation stack
21+
///
22+
case injectViewController(value: UIViewController)
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Foundation
2+
3+
/// Navigates to the unified "Continue with WordPress.com" flow.
4+
///
5+
public struct NavigateToEnterAccount: NavigationCommand {
6+
public init() {}
7+
public func execute(from: UIViewController?) {
8+
continueWithDotCom(navigationController: from?.navigationController)
9+
}
10+
}
11+
12+
13+
private extension NavigateToEnterAccount {
14+
private func continueWithDotCom(navigationController: UINavigationController?) {
15+
guard let vc = GetStartedViewController.instantiate(from: .getStarted) else {
16+
DDLogError("Failed to navigate from LoginPrologueViewController to GetStartedViewController")
17+
return
18+
}
19+
20+
navigationController?.pushViewController(vc, animated: true)
21+
}
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
import Foundation
3+
4+
5+
/// Navigates to the unified site address login flow.
6+
///
7+
public struct NavigateToEnterSite: NavigationCommand {
8+
public init() {}
9+
public func execute(from: UIViewController?) {
10+
presentUnifiedSiteAddressView(navigationController: from?.navigationController)
11+
}
12+
}
13+
14+
private extension NavigateToEnterSite {
15+
func presentUnifiedSiteAddressView(navigationController: UINavigationController?) {
16+
guard let vc = SiteAddressViewController.instantiate(from: .siteAddress) else {
17+
DDLogError("Failed to navigate from LoginViewController to SiteAddressViewController")
18+
return
19+
}
20+
21+
navigationController?.pushViewController(vc, animated: true)
22+
}
23+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
import Foundation
3+
4+
/// NavigationCommand abstracts logic necessary provide clients of this library
5+
/// with a way to navigate to a particular location in the UL navigation flow.
6+
///
7+
/// Concrete implementations of this protocol will decide what that means
8+
///
9+
public protocol NavigationCommand {
10+
func execute(from: UIViewController?)
11+
}

WordPressAuthenticator/Signin/LoginSiteAddressViewController.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,19 +226,21 @@ class LoginSiteAddressViewController: LoginViewController, NUXKeyboardResponder
226226
}
227227

228228
func presentNextControllerIfPossible(siteInfo: WordPressComSiteInfo?) {
229-
WordPressAuthenticator.shared.delegate?.shouldPresentUsernamePasswordController(for: siteInfo, onCompletion: { (error, isSelfHosted) in
230-
guard let originalError = error else {
231-
229+
WordPressAuthenticator.shared.delegate?.shouldPresentUsernamePasswordController(for: siteInfo, onCompletion: { (result) in
230+
switch result {
231+
case let .error(error):
232+
self.displayError(message: error.localizedDescription)
233+
case let .presentPasswordController(isSelfHosted):
232234
if isSelfHosted {
233235
self.showSelfHostedUsernamePassword()
234-
return
235236
}
236237

237238
self.showWPUsernamePassword()
238-
return
239-
}
240239

241-
self.displayError(message: originalError.localizedDescription)
240+
case .injectViewController(_):
241+
// This case is only used for UL&S
242+
break
243+
}
242244
})
243245
}
244246

WordPressAuthenticator/Unified Auth/View Related/Site Address/SiteAddressViewController.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -468,19 +468,20 @@ private extension SiteAddressViewController {
468468
return
469469
}
470470

471-
WordPressAuthenticator.shared.delegate?.shouldPresentUsernamePasswordController(for: siteInfo, onCompletion: { (error, isSelfHosted) in
472-
guard let originalError = error else {
473-
471+
WordPressAuthenticator.shared.delegate?.shouldPresentUsernamePasswordController(for: siteInfo, onCompletion: { (result) in
472+
switch result {
473+
case let .error(error):
474+
self.displayError(message: error.localizedDescription)
475+
case let .presentPasswordController(isSelfHosted):
474476
if isSelfHosted {
475477
self.showSelfHostedUsernamePassword()
476478
return
477479
}
478-
480+
479481
self.showWPUsernamePassword()
480-
return
482+
case let .injectViewController(customUI):
483+
self.navigationController?.pushViewController(customUI, animated: true)
481484
}
482-
483-
self.displayError(message: originalError.localizedDescription)
484485
})
485486
}
486487

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import UIKit
2+
3+
final class MockNavigationController: UINavigationController {
4+
var pushedViewController: UIViewController?
5+
6+
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
7+
pushedViewController = viewController
8+
super.pushViewController(viewController, animated: true)
9+
}
10+
}

0 commit comments

Comments
 (0)