PM-17764 update the email verification to completely match new design. (#4655)

This commit is contained in:
Dave Severns
2025-01-30 16:04:11 -05:00
committed by GitHub
parent 2195d07f78
commit 6f5cb0df96
4 changed files with 8 additions and 153 deletions

View File

@@ -20,7 +20,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.testTag
@@ -92,19 +91,11 @@ fun CheckEmailScreen(
.fillMaxSize()
.verticalScroll(rememberScrollState()),
) {
if (state.showNewOnboardingUi) {
CheckEmailContent(
email = state.email,
onOpenEmailAppClick = handler.onOpenEmailAppClick,
onChangeEmailClick = handler.onChangeEmailClick,
)
} else {
CheckEmailLegacyContent(
email = state.email,
onOpenEmailAppClick = handler.onOpenEmailAppClick,
onChangeEmailClick = handler.onChangeEmailClick,
)
}
CheckEmailContent(
email = state.email,
onOpenEmailAppClick = handler.onOpenEmailAppClick,
onChangeEmailClick = handler.onChangeEmailClick,
)
Spacer(modifier = Modifier.height(12.dp))
Spacer(modifier = Modifier.navigationBarsPadding())
}
@@ -167,7 +158,9 @@ private fun CheckEmailContent(
Spacer(modifier = Modifier.height(16.dp))
@Suppress("MaxLineLength")
Text(
text = stringResource(R.string.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account),
text = stringResource(
R.string.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account,
),
style = BitwardenTheme.typography.bodyMedium,
color = BitwardenTheme.colorScheme.text.primary,
textAlign = TextAlign.Center,
@@ -196,82 +189,6 @@ private fun CheckEmailContent(
}
}
@Suppress("LongMethod")
@Composable
private fun CheckEmailLegacyContent(
email: String,
onOpenEmailAppClick: () -> Unit,
onChangeEmailClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Spacer(modifier = Modifier.height(32.dp))
Image(
painter = rememberVectorPainter(id = R.drawable.email_check),
colorFilter = ColorFilter.tint(BitwardenTheme.colorScheme.icon.secondary),
contentDescription = null,
contentScale = ContentScale.FillHeight,
modifier = Modifier
.standardHorizontalMargin()
.height(112.dp)
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(32.dp))
Text(
text = stringResource(id = R.string.check_your_email),
textAlign = TextAlign.Center,
style = BitwardenTheme.typography.headlineSmall,
color = BitwardenTheme.colorScheme.text.primary,
modifier = Modifier
.standardHorizontalMargin()
.wrapContentHeight()
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(16.dp))
@Suppress("MaxLineLength")
val descriptionAnnotatedString =
R.string.follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account.toAnnotatedString(
args = arrayOf(email),
emphasisHighlightStyle = SpanStyle(
color = BitwardenTheme.colorScheme.text.primary,
fontSize = BitwardenTheme.typography.bodyMedium.fontSize,
fontWeight = FontWeight.Bold,
),
)
Text(
text = descriptionAnnotatedString,
textAlign = TextAlign.Center,
modifier = Modifier
.fillMaxWidth()
.standardHorizontalMargin()
.wrapContentHeight(),
)
Spacer(modifier = Modifier.height(32.dp))
BitwardenFilledButton(
label = stringResource(id = R.string.open_email_app),
onClick = onOpenEmailAppClick,
modifier = Modifier
.testTag("OpenEmailApp")
.standardHorizontalMargin()
.fillMaxWidth(),
)
Spacer(modifier = Modifier.height(12.dp))
BitwardenOutlinedButton(
label = stringResource(R.string.change_email_address),
onClick = onChangeEmailClick,
modifier = Modifier
.fillMaxWidth()
.standardHorizontalMargin(),
)
}
}
@Preview(showBackground = true)
@Composable
private fun CheckEmailScreenNewUi_preview() {
@@ -283,15 +200,3 @@ private fun CheckEmailScreenNewUi_preview() {
)
}
}
@Preview(showBackground = true)
@Composable
private fun CheckEmailScreenLegacy_preview() {
BitwardenTheme {
CheckEmailLegacyContent(
email = "email@fake.com",
onOpenEmailAppClick = { },
onChangeEmailClick = { },
)
}
}

View File

@@ -3,14 +3,10 @@ package com.x8bit.bitwarden.ui.auth.feature.checkemail
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
import com.x8bit.bitwarden.data.platform.manager.model.FlagKey
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import kotlinx.parcelize.Parcelize
import javax.inject.Inject
@@ -21,13 +17,11 @@ private const val KEY_STATE = "state"
*/
@HiltViewModel
class CheckEmailViewModel @Inject constructor(
featureFlagManager: FeatureFlagManager,
savedStateHandle: SavedStateHandle,
) : BaseViewModel<CheckEmailState, CheckEmailEvent, CheckEmailAction>(
initialState = savedStateHandle[KEY_STATE]
?: CheckEmailState(
email = CheckEmailArgs(savedStateHandle).emailAddress,
showNewOnboardingUi = featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow),
),
) {
init {
@@ -35,14 +29,6 @@ class CheckEmailViewModel @Inject constructor(
stateFlow
.onEach { savedStateHandle[KEY_STATE] = it }
.launchIn(viewModelScope)
// Listen for changes on the onboarding feature flag.
featureFlagManager
.getFeatureFlagFlow(FlagKey.OnboardingFlow)
.map {
CheckEmailAction.Internal.OnboardingFeatureFlagUpdated(it)
}
.onEach(::sendAction)
.launchIn(viewModelScope)
}
override fun handleAction(action: CheckEmailAction) {
@@ -50,17 +36,6 @@ class CheckEmailViewModel @Inject constructor(
CheckEmailAction.BackClick -> handleBackClick()
CheckEmailAction.OpenEmailClick -> handleOpenEmailClick()
CheckEmailAction.ChangeEmailClick -> handleChangeEmailClick()
is CheckEmailAction.Internal.OnboardingFeatureFlagUpdated -> {
handleOnboardingFeatureFlagUpdated(action)
}
}
}
private fun handleOnboardingFeatureFlagUpdated(
action: CheckEmailAction.Internal.OnboardingFeatureFlagUpdated,
) {
mutableStateFlow.update {
it.copy(showNewOnboardingUi = action.newValue)
}
}
@@ -77,7 +52,6 @@ class CheckEmailViewModel @Inject constructor(
@Parcelize
data class CheckEmailState(
val email: String,
val showNewOnboardingUi: Boolean,
) : Parcelable
/**
@@ -114,14 +88,4 @@ sealed class CheckEmailAction {
* User clicked open email.
*/
data object OpenEmailClick : CheckEmailAction()
/**
* Denotes an internal action.
*/
sealed class Internal : CheckEmailAction() {
/**
* Indicates updated value for onboarding feature flag.
*/
data class OnboardingFeatureFlagUpdated(val newValue: Boolean) : Internal()
}
}

View File

@@ -79,7 +79,6 @@ class CheckEmailScreenTest : BaseComposeTest() {
@Test
fun `change email button click should send ChangeEmailClick action`() {
mutableStateFlow.value = DEFAULT_STATE.copy(showNewOnboardingUi = true)
composeTestRule
.onNodeWithText("Change email address")
.performScrollTo()
@@ -92,7 +91,6 @@ class CheckEmailScreenTest : BaseComposeTest() {
private const val EMAIL = "test@gmail.com"
private val DEFAULT_STATE = CheckEmailState(
email = EMAIL,
showNewOnboardingUi = false,
)
}
}

View File

@@ -74,19 +74,8 @@ class CheckEmailViewModelTest : BaseViewModelTest() {
}
}
@Test
fun `OnboardingFeatureFlagUpdated should update showNewOnboardingUi in state`() {
val viewModel = createViewModel()
mutableFeatureFlagFlow.value = true
val expectedState = DEFAULT_STATE.copy(
showNewOnboardingUi = true,
)
assertEquals(expectedState, viewModel.stateFlow.value)
}
private fun createViewModel(state: CheckEmailState? = null): CheckEmailViewModel =
CheckEmailViewModel(
featureFlagManager = featureFlagManager,
savedStateHandle = SavedStateHandle().also {
it["email"] = EMAIL
it["state"] = state
@@ -97,7 +86,6 @@ class CheckEmailViewModelTest : BaseViewModelTest() {
private const val EMAIL = "test@gmail.com"
private val DEFAULT_STATE = CheckEmailState(
email = EMAIL,
showNewOnboardingUi = false,
)
}
}