PM-19131 - moved isVisible logic for hidden custom fields to be managed on view side vs model side

This commit is contained in:
Philip Cappelli
2025-03-25 17:21:29 -04:00
parent 22376bfe4b
commit bc76e46185
6 changed files with 20 additions and 31 deletions

View File

@@ -347,21 +347,6 @@ class VaultItemViewModel @Inject constructor(
)
return@onContent
}
mutableStateFlow.update { currentState ->
currentState.copy(
viewState = content.copy(
common = content.common.copy(
customFields = content.common.customFields.map { customField ->
if (customField == action.field) {
action.field.copy(isVisible = action.isVisible)
} else {
customField
}
},
),
),
)
}
if (action.isVisible) {
organizationEventManager.trackEvent(
event = OrganizationEvent.CipherClientToggledHiddenFieldVisible(
@@ -1615,7 +1600,6 @@ data class VaultItemState(
val name: String,
val value: String,
val isCopyable: Boolean,
val isVisible: Boolean,
) : Custom()
/**

View File

@@ -1,6 +1,10 @@
package com.x8bit.bitwarden.ui.vault.feature.item.component
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
@@ -30,6 +34,8 @@ fun CustomField(
cardStyle: CardStyle,
modifier: Modifier = Modifier,
) {
var isVisible by rememberSaveable { mutableStateOf(false) }
when (customField) {
is VaultItemState.ViewState.Content.Common.Custom.BooleanField -> {
BitwardenSwitch(
@@ -47,8 +53,11 @@ fun CustomField(
BitwardenPasswordField(
label = customField.name,
value = customField.value,
showPasswordChange = { onShowHiddenFieldClick(customField, it) },
showPassword = customField.isVisible,
showPasswordChange = {
onShowHiddenFieldClick(customField, it)
isVisible = it
},
showPassword = isVisible,
onValueChange = { },
readOnly = true,
singleLine = false,
@@ -69,8 +78,11 @@ fun CustomField(
BitwardenPasswordField(
label = customField.name,
value = customField.value,
showPasswordChange = { onShowHiddenFieldClick(customField, it) },
showPassword = customField.isVisible,
showPasswordChange = {
onShowHiddenFieldClick(customField, it)
isVisible = it
},
showPassword = isVisible,
onValueChange = { },
readOnly = true,
singleLine = false,

View File

@@ -57,7 +57,9 @@ fun CipherView.toViewState(
name = name,
requiresReprompt = (reprompt == CipherRepromptType.PASSWORD && hasMasterPassword) &&
previousState?.common?.requiresReprompt != false,
customFields = fields.orEmpty().map { it.toCustomField() },
customFields = fields.orEmpty().map { fieldView ->
fieldView.toCustomField()
},
lastUpdated = revisionDate.toFormattedPattern(
pattern = LAST_UPDATED_DATE_TIME_PATTERN,
clock = clock,
@@ -207,7 +209,6 @@ private fun FieldView.toCustomField(): VaultItemState.ViewState.Content.Common.C
name = name.orEmpty(),
value = value.orZeroWidthSpace(),
isCopyable = !value.isNullOrBlank(),
isVisible = false,
)
FieldType.BOOLEAN -> VaultItemState.ViewState.Content.Common.Custom.BooleanField(

View File

@@ -779,7 +779,6 @@ class VaultItemScreenTest : BaseComposeTest() {
name = "hidden",
value = "hidden password",
isCopyable = true,
isVisible = false,
)
EMPTY_VIEW_STATES
@@ -817,7 +816,6 @@ class VaultItemScreenTest : BaseComposeTest() {
name = "hidden",
value = "hidden password",
isCopyable = true,
isVisible = false,
)
EMPTY_VIEW_STATES
@@ -858,7 +856,6 @@ class VaultItemScreenTest : BaseComposeTest() {
name = "hidden",
value = "hidden password",
isCopyable = true,
isVisible = false,
)
EMPTY_VIEW_STATES
@@ -3157,7 +3154,6 @@ private val DEFAULT_COMMON: VaultItemState.ViewState.Content.Common =
name = "hidden",
value = "hidden password",
isCopyable = true,
isVisible = false,
),
VaultItemState.ViewState.Content.Common.Custom.BooleanField(
name = "boolean",

View File

@@ -1073,7 +1073,6 @@ class VaultItemViewModelTest : BaseViewModelTest() {
name = "hidden",
value = "value",
isCopyable = true,
isVisible = false,
)
every {
mockCipherView.toViewState(
@@ -1138,7 +1137,6 @@ class VaultItemViewModelTest : BaseViewModelTest() {
name = "hidden",
value = "value",
isCopyable = true,
isVisible = false,
)
val loginViewState = VaultItemState.ViewState.Content(
common = createCommonContent(
@@ -1182,7 +1180,7 @@ class VaultItemViewModelTest : BaseViewModelTest() {
viewState = loginViewState.copy(
common = createCommonContent(isEmpty = true, isPremiumUser = true).copy(
requiresReprompt = false,
customFields = listOf(hiddenField.copy(isVisible = true)),
customFields = listOf(hiddenField),
),
),
),
@@ -3710,7 +3708,6 @@ class VaultItemViewModelTest : BaseViewModelTest() {
name = "hidden",
value = "value",
isCopyable = true,
isVisible = false,
),
VaultItemState.ViewState.Content.Common.Custom.BooleanField(
name = "boolean",

View File

@@ -197,7 +197,6 @@ fun createCommonContent(
name = "hidden",
value = "value",
isCopyable = true,
isVisible = false,
),
VaultItemState.ViewState.Content.Common.Custom.BooleanField(
name = "boolean",