Skip to content

Commit af6879f

Browse files
Merge pull request #12935 from woocommerce/issue/12918-support-account-creation-ui-changes
Issue/12918 support account creation UI changes
2 parents a0e116b + e425df2 commit af6879f

12 files changed

+94
-28
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsTracker.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ class AnalyticsTracker private constructor(
525525
// -- Jetpack Setup
526526
const val KEY_JETPACK_SETUP_IS_ALREADY_CONNECTED = "is_already_connected"
527527
const val KEY_JETPACK_SETUP_REQUIRES_CONNECTION_ONLY = "requires_connection_only"
528+
const val KEY_IS_SIGN_UP = "is_signup"
528529
const val VALUE_JETPACK_SETUP_STEP_EMAIL_ADDRESS = "email_address"
529530
const val VALUE_JETPACK_SETUP_STEP_PASSWORD = "password"
530531
const val VALUE_JETPACK_SETUP_STEP_MAGIC_LINK = "magic_link"

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/WPComLoginRepository.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,18 @@ class WPComLoginRepository @Inject constructor(
7676
}
7777
}
7878

79-
suspend fun requestMagicLink(emailOrUsername: String, flow: MagicLinkFlow, source: MagicLinkSource): Result<Unit> {
79+
suspend fun requestMagicLink(
80+
emailOrUsername: String,
81+
flow: MagicLinkFlow,
82+
source: MagicLinkSource,
83+
isSignup: Boolean
84+
): Result<Unit> {
8085
WooLog.i(WooLog.T.LOGIN, "Submitting a Magic Link request")
8186

8287
val action = AuthenticationActionBuilder.newSendAuthEmailAction(
8388
AuthEmailPayload(
8489
emailOrUsername,
85-
false,
90+
isSignup,
8691
flow,
8792
source,
8893
AuthEmailPayloadScheme.WOOCOMMERCE
@@ -98,6 +103,7 @@ class WPComLoginRepository @Inject constructor(
98103
)
99104
Result.failure(OnChangedException(event.error))
100105
}
106+
101107
else -> {
102108
WooLog.i(WooLog.T.LOGIN, "Magic Link request sent successfully")
103109
Result.success(Unit)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationMagicLinkRequestScreen.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,19 @@ private fun MagicLinkSentContent(
172172
style = MaterialTheme.typography.subtitle1,
173173
textAlign = TextAlign.Center
174174
)
175+
Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.minor_50)))
175176
Text(
176177
text = viewState.email,
177178
style = MaterialTheme.typography.subtitle1,
178179
fontWeight = FontWeight.Bold,
179180
textAlign = TextAlign.Center
180181
)
182+
Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.major_100)))
183+
Text(
184+
text = stringResource(id = R.string.login_magic_links_email_sent_double_check_email),
185+
style = MaterialTheme.typography.body2,
186+
textAlign = TextAlign.Center
187+
)
181188
} else {
182189
Text(
183190
text = stringResource(id = R.string.login_magic_links_email_sent_to_unknown_email),
@@ -208,7 +215,8 @@ private fun MagicLinkRequestPreview() {
208215
avatarUrl = "avatar",
209216
isJetpackInstalled = false,
210217
allowPasswordLogin = true,
211-
isLoadingDialogShown = false
218+
isLoadingDialogShown = false,
219+
isNewWpComAccount = false
212220
)
213221
)
214222
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationMagicLinkRequestViewModel.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
4646
avatarUrl = avatarUrlFromEmail(navArgs.emailOrUsername),
4747
isJetpackInstalled = navArgs.jetpackStatus.isJetpackInstalled,
4848
allowPasswordLogin = !navArgs.isAccountPasswordless,
49-
isLoadingDialogShown = false
49+
isLoadingDialogShown = false,
50+
isNewWpComAccount = navArgs.isNewWpComAccount
5051
)
5152
)
5253
val viewState = _viewState.asLiveData()
@@ -72,7 +73,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
7273
JETPACK_SETUP_LOGIN_FLOW,
7374
mapOf(
7475
AnalyticsTracker.KEY_STEP to AnalyticsTracker.VALUE_JETPACK_SETUP_STEP_MAGIC_LINK,
75-
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_DISMISS
76+
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_DISMISS,
77+
AnalyticsTracker.KEY_IS_SIGN_UP to navArgs.isNewWpComAccount
7678
)
7779
)
7880
}
@@ -82,7 +84,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
8284
JETPACK_SETUP_LOGIN_FLOW,
8385
mapOf(
8486
AnalyticsTracker.KEY_STEP to AnalyticsTracker.VALUE_JETPACK_SETUP_STEP_MAGIC_LINK,
85-
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_SUBMIT
87+
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_SUBMIT,
88+
AnalyticsTracker.KEY_IS_SIGN_UP to navArgs.isNewWpComAccount
8689
)
8790
)
8891

@@ -91,7 +94,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
9194
avatarUrl = avatarUrlFromEmail(navArgs.emailOrUsername),
9295
isJetpackInstalled = navArgs.jetpackStatus.isJetpackInstalled,
9396
allowPasswordLogin = !navArgs.isAccountPasswordless,
94-
isLoadingDialogShown = true
97+
isLoadingDialogShown = true,
98+
isNewWpComAccount = navArgs.isNewWpComAccount
9599
)
96100
val source = when {
97101
!navArgs.jetpackStatus.isJetpackInstalled -> MagicLinkSource.JetpackInstallation
@@ -101,7 +105,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
101105
wpComLoginRepository.requestMagicLink(
102106
emailOrUsername = navArgs.emailOrUsername,
103107
flow = MagicLinkFlow.SiteCredentialsToWPCom,
104-
source = source
108+
source = source,
109+
isSignup = navArgs.isNewWpComAccount
105110
).fold(
106111
onSuccess = {
107112
_viewState.value = ViewState.MagicLinkSentState(
@@ -118,7 +123,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
118123
JETPACK_SETUP_LOGIN_FLOW,
119124
mapOf(
120125
AnalyticsTracker.KEY_STEP to AnalyticsTracker.VALUE_JETPACK_SETUP_STEP_MAGIC_LINK,
121-
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_SUBMIT
126+
AnalyticsTracker.KEY_TAP to AnalyticsTracker.VALUE_SUBMIT,
127+
AnalyticsTracker.KEY_IS_SIGN_UP to navArgs.isNewWpComAccount
122128
)
123129
)
124130
}
@@ -145,7 +151,8 @@ class JetpackActivationMagicLinkRequestViewModel @Inject constructor(
145151
val avatarUrl: String,
146152
override val isJetpackInstalled: Boolean,
147153
override val allowPasswordLogin: Boolean,
148-
val isLoadingDialogShown: Boolean
154+
val isLoadingDialogShown: Boolean,
155+
val isNewWpComAccount: Boolean
149156
) : ViewState
150157

151158
@Parcelize

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationWPComEmailFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ class JetpackActivationWPComEmailFragment : BaseFragment() {
7979
.actionJetpackActivationWPComEmailFragmentToJetpackActivationMagicLinkRequestFragment(
8080
emailOrUsername = event.emailOrUsername,
8181
jetpackStatus = event.jetpackStatus,
82-
isAccountPasswordless = true
82+
isAccountPasswordless = true,
83+
isNewWpComAccount = event.isNewWpComAccount
8384
)
8485
)
8586
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationWPComEmailScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import androidx.compose.material.icons.Icons.Filled
1818
import androidx.compose.material.icons.filled.Clear
1919
import androidx.compose.runtime.Composable
2020
import androidx.compose.runtime.livedata.observeAsState
21-
import androidx.compose.ui.ExperimentalComposeUiApi
2221
import androidx.compose.ui.Modifier
2322
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
2423
import androidx.compose.ui.res.dimensionResource
@@ -47,7 +46,6 @@ fun JetpackActivationWPComEmailScreen(viewModel: JetpackActivationWPComEmailView
4746
}
4847
}
4948

50-
@OptIn(ExperimentalComposeUiApi::class)
5149
@Composable
5250
fun JetpackActivationWPComEmailScreen(
5351
viewState: JetpackActivationWPComEmailViewModel.ViewState,
@@ -115,6 +113,11 @@ fun JetpackActivationWPComEmailScreen(
115113
}
116114
)
117115
)
116+
Spacer(modifier = Modifier.height(dimensionResource(id = R.dimen.major_100)))
117+
Text(
118+
style = MaterialTheme.typography.body2,
119+
text = stringResource(id = R.string.login_jetpack_connection_create_account)
120+
)
118121
}
119122

120123
Spacer(modifier = Modifier.weight(1f))

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationWPComEmailViewModel.kt

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import androidx.lifecycle.SavedStateHandle
44
import androidx.lifecycle.asLiveData
55
import androidx.lifecycle.viewModelScope
66
import com.woocommerce.android.OnChangedException
7+
import com.woocommerce.android.R
78
import com.woocommerce.android.analytics.AnalyticsEvent.JETPACK_SETUP_LOGIN_FLOW
89
import com.woocommerce.android.analytics.AnalyticsTracker
910
import com.woocommerce.android.analytics.AnalyticsTrackerWrapper
1011
import com.woocommerce.android.model.JetpackStatus
1112
import com.woocommerce.android.ui.login.WPComLoginRepository
13+
import com.woocommerce.android.util.FeatureFlag
14+
import com.woocommerce.android.util.StringUtils
1215
import com.woocommerce.android.viewmodel.MultiLiveEvent
1316
import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit
1417
import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.ShowSnackbar
@@ -21,7 +24,6 @@ import kotlinx.coroutines.flow.combine
2124
import kotlinx.coroutines.launch
2225
import org.wordpress.android.fluxc.store.AccountStore.AuthOptionsError
2326
import org.wordpress.android.fluxc.store.AccountStore.AuthOptionsErrorType
24-
import org.wordpress.android.login.R
2527
import javax.inject.Inject
2628

2729
@HiltViewModel
@@ -90,17 +92,36 @@ class JetpackActivationWPComEmailViewModel @Inject constructor(
9092
wpComLoginRepository.fetchAuthOptions(emailOrUsername).fold(
9193
onSuccess = {
9294
if (it.isPasswordless) {
93-
triggerEvent(ShowMagicLinkScreen(emailOrUsername, navArgs.jetpackStatus))
95+
triggerEvent(
96+
ShowMagicLinkScreen(emailOrUsername, navArgs.jetpackStatus, isNewWpComAccount = false)
97+
)
9498
} else {
9599
triggerEvent(ShowPasswordScreen(emailOrUsername, navArgs.jetpackStatus))
96100
}
97101
},
98102
onFailure = {
99103
val failure = (it as? OnChangedException)?.error as? AuthOptionsError
104+
var isSignup = false
100105

101106
when (failure?.type) {
102107
AuthOptionsErrorType.UNKNOWN_USER -> {
103-
errorMessage.value = R.string.email_not_registered_wpcom
108+
when {
109+
!StringUtils.isValidEmail(emailOrUsername) ->
110+
errorMessage.value = R.string.username_not_registered_wpcom
111+
112+
FeatureFlag.JETPACK_FLOW_ACCOUNT_CREATION.isEnabled() -> {
113+
triggerEvent(
114+
ShowMagicLinkScreen(
115+
emailOrUsername,
116+
navArgs.jetpackStatus,
117+
isNewWpComAccount = true
118+
)
119+
)
120+
isSignup = true
121+
}
122+
123+
else -> errorMessage.value = R.string.email_not_registered_wpcom
124+
}
104125
}
105126

106127
AuthOptionsErrorType.EMAIL_LOGIN_NOT_ALLOWED -> {
@@ -113,18 +134,26 @@ class JetpackActivationWPComEmailViewModel @Inject constructor(
113134
}
114135
}
115136

116-
analyticsTrackerWrapper.track(
117-
JETPACK_SETUP_LOGIN_FLOW,
118-
mapOf(
119-
AnalyticsTracker.KEY_STEP to AnalyticsTracker.VALUE_JETPACK_SETUP_STEP_EMAIL_ADDRESS,
120-
AnalyticsTracker.KEY_FAILURE to (failure?.type?.name ?: "Unknown error")
121-
)
122-
)
137+
trackLoginFlowAuthOptionError(failure, isSignup)
123138
}
124139
)
125140
isLoadingDialogShown.value = false
126141
}
127142

143+
private fun trackLoginFlowAuthOptionError(
144+
failure: AuthOptionsError?,
145+
isSignup: Boolean
146+
) {
147+
analyticsTrackerWrapper.track(
148+
JETPACK_SETUP_LOGIN_FLOW,
149+
mapOf(
150+
AnalyticsTracker.KEY_STEP to AnalyticsTracker.VALUE_JETPACK_SETUP_STEP_EMAIL_ADDRESS,
151+
AnalyticsTracker.KEY_FAILURE to (failure?.type?.name ?: "Unknown error"),
152+
AnalyticsTracker.KEY_IS_SIGN_UP to isSignup
153+
)
154+
)
155+
}
156+
128157
data class ViewState(
129158
val emailOrUsername: String,
130159
val isJetpackInstalled: Boolean,
@@ -141,6 +170,7 @@ class JetpackActivationWPComEmailViewModel @Inject constructor(
141170

142171
data class ShowMagicLinkScreen(
143172
val emailOrUsername: String,
144-
val jetpackStatus: JetpackStatus
173+
val jetpackStatus: JetpackStatus,
174+
val isNewWpComAccount: Boolean,
145175
) : MultiLiveEvent.Event()
146176
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/jetpack/wpcom/JetpackActivationWPComPasswordFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ class JetpackActivationWPComPasswordFragment : BaseFragment() {
9898
.actionJetpackActivationWPComPasswordFragmentToJetpackActivationMagicLinkRequestFragment(
9999
emailOrUsername = event.emailOrUsername,
100100
jetpackStatus = event.jetpackStatus,
101-
isAccountPasswordless = false
101+
isAccountPasswordless = false,
102+
isNewWpComAccount = false
102103
)
103104
)
104105
}

WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ enum class FeatureFlag {
1919
CUSTOM_FIELDS,
2020
REVAMP_WOO_SHIPPING,
2121
OBJECTIVE_SECTION,
22-
POS_NON_SIMPLE_PRODUCT_TYPES;
22+
POS_NON_SIMPLE_PRODUCT_TYPES,
23+
JETPACK_FLOW_ACCOUNT_CREATION;
2324

2425
fun isEnabled(context: Context? = null): Boolean {
2526
return when (this) {
@@ -32,7 +33,8 @@ enum class FeatureFlag {
3233
ORDER_CREATION_AUTO_TAX_RATE,
3334
WOO_POS_PAYMENTS_ONBOARDING,
3435
REVAMP_WOO_SHIPPING,
35-
POS_NON_SIMPLE_PRODUCT_TYPES -> PackageUtils.isDebugBuild()
36+
POS_NON_SIMPLE_PRODUCT_TYPES,
37+
JETPACK_FLOW_ACCOUNT_CREATION -> PackageUtils.isDebugBuild()
3638

3739
NEW_SHIPPING_SUPPORT,
3840
INBOX,

WooCommerce/src/main/res/navigation/nav_graph_jetpack_activation.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@
146146
<argument
147147
android:name="isAccountPasswordless"
148148
app:argType="boolean" />
149+
<argument
150+
android:name="isNewWpComAccount"
151+
app:argType="boolean" />
149152
</fragment>
150153
<fragment
151154
android:id="@+id/jetpackActivationMagicLinkHandlerFragment"

0 commit comments

Comments
 (0)