Skip to content

Commit 6264df5

Browse files
Merge pull request #7956 from woocommerce/issue/7903-navigate-to-store-creation-flow
Simplified login: Launch account creation flow from unrecognized email error screen.
2 parents 1b61a37 + 2a72bf1 commit 6264df5

File tree

4 files changed

+81
-25
lines changed

4 files changed

+81
-25
lines changed

WooCommerce/Classes/Authentication/Navigation Exceptions/NotWPAccountViewModel.swift

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ final class NotWPAccountViewModel: ULErrorViewModel {
1111
// MARK: - Data and configuration
1212
let image: UIImage = .loginNoWordPressError
1313

14-
let text: NSAttributedString = .init(string: Localization.errorMessage)
14+
let text: NSAttributedString = .init(string: Localization.errorMessage, attributes: [.font: UIFont.title3SemiBold])
1515

1616
let isAuxiliaryButtonHidden = false
1717

1818
let auxiliaryButtonTitle = AuthenticationConstants.whatIsWPComLinkTitle
1919

2020
let primaryButtonTitle: String
2121

22+
let isPrimaryButtonHidden: Bool
23+
2224
var secondaryButtonTitle: String {
2325
isSimplifiedLoginI1Enabled ? Localization.tryAnotherAddress : Localization.restartLogin
2426
}
@@ -39,6 +41,7 @@ final class NotWPAccountViewModel: ULErrorViewModel {
3941

4042
private let isSimplifiedLoginI1Enabled: Bool
4143
private let analytics: Analytics
44+
private var storePickerCoordinator: StorePickerCoordinator?
4245

4346
init(error: Error,
4447
analytics: Analytics = ServiceLocator.analytics,
@@ -50,16 +53,24 @@ final class NotWPAccountViewModel: ULErrorViewModel {
5053
source == .wpComSiteAddress {
5154
isSecondaryButtonHidden = true
5255
primaryButtonTitle = Localization.restartLogin
56+
isPrimaryButtonHidden = false
5357
} else {
5458
isSecondaryButtonHidden = false
55-
primaryButtonTitle = isSimplifiedLoginI1Enabled ? Localization.createAnAccount : Localization.loginWithSiteAddress
59+
60+
if isSimplifiedLoginI1Enabled {
61+
primaryButtonTitle = Localization.createAnAccount
62+
isPrimaryButtonHidden = !featureFlagService.isFeatureFlagEnabled(.storeCreationMVP)
63+
} else {
64+
primaryButtonTitle = Localization.loginWithSiteAddress
65+
isPrimaryButtonHidden = false
66+
}
5667
}
5768
}
5869

5970
// MARK: - Actions
6071
func didTapPrimaryButton(in viewController: UIViewController?) {
6172
if isSimplifiedLoginI1Enabled {
62-
createAnAccountButtonTapped()
73+
createAnAccountButtonTapped(in: viewController)
6374
} else {
6475
loginWithSiteAddressButtonTapped()
6576
}
@@ -101,9 +112,24 @@ private extension NotWPAccountViewModel {
101112
popCommand.execute(from: viewController)
102113
}
103114

104-
func createAnAccountButtonTapped() {
105-
// TODO: 7903 - Navigate to create store flow.
106-
// analytics.track(.createAccountOnInvalidEmailScreenTapped)
115+
func createAnAccountButtonTapped(in viewController: UIViewController?) {
116+
analytics.track(.createAccountOnInvalidEmailScreenTapped)
117+
guard let viewController,
118+
let navigationController = viewController.navigationController else {
119+
DDLogWarn("⚠️ Unable to proceed with account creation as view controller/navigation controller is nil.")
120+
return
121+
}
122+
123+
let accountCreationController = AccountCreationFormHostingController(viewModel: .init()) { [weak self] in
124+
guard let self else { return }
125+
self.launchStorePicker(from: navigationController)
126+
}
127+
viewController.show(accountCreationController, sender: self)
128+
}
129+
130+
func launchStorePicker(from navigationController: UINavigationController) {
131+
storePickerCoordinator = StorePickerCoordinator(navigationController, config: .listStores)
132+
storePickerCoordinator?.start()
107133
}
108134
}
109135

WooCommerce/Classes/Authentication/Navigation Exceptions/ULErrorViewController.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,7 @@ private extension ULErrorViewController {
110110
}
111111

112112
func configureErrorMessage() {
113-
errorMessage.adjustsFontForContentSizeCategory = true
114-
errorMessage.font = .title3SemiBold
115-
errorMessage.textColor = .text
113+
errorMessage.applyBodyStyle()
116114
errorMessage.attributedText = viewModel.text
117115
}
118116

WooCommerce/WooCommerceTests/Authentication/NotWPAccountViewModelTests.swift

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ final class NotWPAccountViewModelTests: XCTestCase {
3636
func test_viewmodel_provides_expected_error_message() {
3737
// Given
3838
let viewModel = NotWPAccountViewModel()
39-
let expectation = NSAttributedString(string: Expectations.errorMessage)
39+
let expectation = NSAttributedString(string: Expectations.errorMessage, attributes: [.font: UIFont.title3SemiBold])
4040

4141
// When
4242
let errorMessage = viewModel.text
@@ -129,28 +129,61 @@ final class NotWPAccountViewModelTests: XCTestCase {
129129
XCTAssertEqual(primaryButtonTitle, Expectations.createAnAccountTitle)
130130
}
131131

132+
// MARK: - `isPrimaryButtonHidden`
133+
134+
func test_primary_button_is_not_hidden_for_invalidWPComEmail_from_site_address_error() {
135+
// Given
136+
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpComSiteAddress))
137+
138+
// Then
139+
XCTAssertFalse(viewModel.isPrimaryButtonHidden)
140+
}
141+
142+
func test_primary_button_is_not_hidden_for_invalidWPComEmail_from_wpCom_error_when_simplified_login_feature_flag_is_off() {
143+
// Given
144+
let featureFlagService = MockFeatureFlagService(isSimplifiedLoginFlowI1Enabled: false)
145+
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpCom),
146+
featureFlagService: featureFlagService)
147+
// Then
148+
XCTAssertFalse(viewModel.isPrimaryButtonHidden)
149+
}
150+
151+
func test_primary_button_is_not_hidden_for_invalidWPComEmail_from_wpCom_error_when_simplified_login_is_on_and_store_creation_is_on() {
152+
// Given
153+
let featureFlagService = MockFeatureFlagService(isSimplifiedLoginFlowI1Enabled: true,
154+
isStoreCreationMVPEnabled: true)
155+
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpCom),
156+
featureFlagService: featureFlagService)
157+
// Then
158+
XCTAssertFalse(viewModel.isPrimaryButtonHidden)
159+
}
160+
161+
func test_primary_button_is_hidden_for_invalidWPComEmail_from_wpCom_error_when_simplified_login_is_on_and_store_creation_is_off() {
162+
// Given
163+
let featureFlagService = MockFeatureFlagService(isSimplifiedLoginFlowI1Enabled: true,
164+
isStoreCreationMVPEnabled: false)
165+
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpCom),
166+
featureFlagService: featureFlagService)
167+
// Then
168+
XCTAssertTrue(viewModel.isPrimaryButtonHidden)
169+
}
170+
132171
// MARK: - `isSecondaryButtonHidden`
133172

134173
func test_secondary_button_is_hidden_for_invalidWPComEmail_from_site_address_error() {
135174
// Given
136175
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpComSiteAddress))
137176

138-
// When
139-
let isPrimaryButtonHidden = viewModel.isSecondaryButtonHidden
140-
141177
// Then
142-
XCTAssertTrue(isPrimaryButtonHidden)
178+
XCTAssertTrue(viewModel.isSecondaryButtonHidden)
143179
}
144180

145181
func test_secondary_button_is_not_hidden_for_invalidWPComEmail_from_wpCom_error() {
146182
// Given
147183
let viewModel = NotWPAccountViewModel(error: SignInError.invalidWPComEmail(source: .wpCom))
148184

149-
// When
150-
let isPrimaryButtonHidden = viewModel.isSecondaryButtonHidden
151-
152185
// Then
153-
XCTAssertFalse(isPrimaryButtonHidden)
186+
XCTAssertFalse(viewModel.isSecondaryButtonHidden)
154187
}
155188

156189
// MARK: - `secondaryButtonTitle`
@@ -211,11 +244,6 @@ final class NotWPAccountViewModelTests: XCTestCase {
211244
XCTAssertNotNil(analyticsProvider.receivedEvents.first(where: { $0 == "what_is_wordpress_com_on_invalid_email_screen" }))
212245
}
213246

214-
/*
215-
TODO: 7903 - Navigate to create store flow
216-
217-
Uncomment these tests after added create store navigation and analytics code.
218-
219247
func test_tapping_primary_button_does_not_track_create_account_event_when_simplified_login_feature_flag_is_off() {
220248
// Given
221249
let featureFlagService = MockFeatureFlagService(isSimplifiedLoginFlowI1Enabled: false)
@@ -243,7 +271,6 @@ final class NotWPAccountViewModelTests: XCTestCase {
243271
// Then
244272
XCTAssertNotNil(analyticsProvider.receivedEvents.first(where: { $0 == "create_account_on_invalid_email_screen" }))
245273
}
246-
*/
247274
}
248275

249276

WooCommerce/WooCommerceTests/Mocks/MockFeatureFlagService.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,22 @@ struct MockFeatureFlagService: FeatureFlagService {
88
private let shippingLabelsOnboardingM1: Bool
99
private let isLoginPrologueOnboardingEnabled: Bool
1010
private let isSimplifiedLoginFlowI1Enabled: Bool
11+
private let isStoreCreationMVPEnabled: Bool
1112

1213
init(isInboxOn: Bool = false,
1314
isSplitViewInOrdersTabOn: Bool = false,
1415
isUpdateOrderOptimisticallyOn: Bool = false,
1516
shippingLabelsOnboardingM1: Bool = false,
1617
isLoginPrologueOnboardingEnabled: Bool = false,
17-
isSimplifiedLoginFlowI1Enabled: Bool = false) {
18+
isSimplifiedLoginFlowI1Enabled: Bool = false,
19+
isStoreCreationMVPEnabled: Bool = false) {
1820
self.isInboxOn = isInboxOn
1921
self.isSplitViewInOrdersTabOn = isSplitViewInOrdersTabOn
2022
self.isUpdateOrderOptimisticallyOn = isUpdateOrderOptimisticallyOn
2123
self.shippingLabelsOnboardingM1 = shippingLabelsOnboardingM1
2224
self.isLoginPrologueOnboardingEnabled = isLoginPrologueOnboardingEnabled
2325
self.isSimplifiedLoginFlowI1Enabled = isSimplifiedLoginFlowI1Enabled
26+
self.isStoreCreationMVPEnabled = isStoreCreationMVPEnabled
2427
}
2528

2629
func isFeatureFlagEnabled(_ featureFlag: FeatureFlag) -> Bool {
@@ -37,6 +40,8 @@ struct MockFeatureFlagService: FeatureFlagService {
3740
return isLoginPrologueOnboardingEnabled
3841
case .simplifiedLoginFlowI1:
3942
return isSimplifiedLoginFlowI1Enabled
43+
case .storeCreationMVP:
44+
return isStoreCreationMVPEnabled
4045
default:
4146
return false
4247
}

0 commit comments

Comments
 (0)