BIT-1897-vault-appearing-when-policy-set (#1064)

This commit is contained in:
Ramsey Smith 2024-02-27 10:44:21 -07:00 committed by Álison Fernandes
parent c154da6f46
commit 85faf29c7b
5 changed files with 141 additions and 13 deletions

View file

@ -272,11 +272,10 @@ private fun VaultScreenScaffold(
.fillMaxSize()
.padding(paddingValues)
Column(modifier = outerModifier) {
val vaultFilterData = state.vaultFilterData
if (state.viewState.hasVaultFilter && vaultFilterData != null) {
state.vaultFilterDataWithFilter?.let {
VaultFilter(
selectedVaultFilterType = vaultFilterData.selectedVaultFilterType,
vaultFilterTypes = vaultFilterData.vaultFilterTypes.toImmutableList(),
selectedVaultFilterType = it.selectedVaultFilterType,
vaultFilterTypes = it.vaultFilterTypes.toImmutableList(),
onVaultFilterTypeSelect = vaultHandlers.vaultFilterTypeSelect,
topAppBarScrollBehavior = scrollBehavior,
modifier = Modifier

View file

@ -28,6 +28,7 @@ import com.x8bit.bitwarden.ui.platform.components.model.IconRes
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import com.x8bit.bitwarden.ui.vault.feature.vault.util.vaultFilterDataIfRequired
import com.x8bit.bitwarden.ui.vault.feature.vault.util.initials
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toAccountSummaries
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toActiveAccountSummary
@ -625,6 +626,12 @@ data class VaultState(
val isPullToRefreshEnabled: Boolean
get() = isPullToRefreshSettingEnabled && viewState.isPullToRefreshEnabled
/**
* VaultFilterData that the user has access to.
*/
val vaultFilterDataWithFilter: VaultFilterData?
get() = viewState.vaultFilterDataIfRequired(vaultFilterData = vaultFilterData)
/**
* Represents the specific view states for the [VaultScreen].
*/
@ -637,11 +644,6 @@ data class VaultState(
*/
abstract val hasFab: Boolean
/**
* Determines whether or not the the Vault Filter may be shown (when applicable).
*/
abstract val hasVaultFilter: Boolean
/**
* Indicates the pull-to-refresh feature should be available during the current state.
*/
@ -653,7 +655,6 @@ data class VaultState(
@Parcelize
data object Loading : ViewState() {
override val hasFab: Boolean get() = false
override val hasVaultFilter: Boolean get() = false
override val isPullToRefreshEnabled: Boolean get() = false
}
@ -663,7 +664,6 @@ data class VaultState(
@Parcelize
data object NoItems : ViewState() {
override val hasFab: Boolean get() = true
override val hasVaultFilter: Boolean get() = true
override val isPullToRefreshEnabled: Boolean get() = true
}
@ -676,7 +676,6 @@ data class VaultState(
val message: Text,
) : ViewState() {
override val hasFab: Boolean get() = false
override val hasVaultFilter: Boolean get() = false
override val isPullToRefreshEnabled: Boolean get() = true
}
@ -708,7 +707,6 @@ data class VaultState(
val trashItemsCount: Int,
) : ViewState() {
override val hasFab: Boolean get() = true
override val hasVaultFilter: Boolean get() = true
override val isPullToRefreshEnabled: Boolean get() = true
}

View file

@ -0,0 +1,29 @@
package com.x8bit.bitwarden.ui.vault.feature.vault.util
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
/**
* Converts the given [VaultState.ViewState] to a [VaultFilterData] (if applicable).
*/
fun VaultState.ViewState.vaultFilterDataIfRequired(
vaultFilterData: VaultFilterData?,
): VaultFilterData? =
when (this) {
is VaultState.ViewState.Content,
is VaultState.ViewState.NoItems,
-> vaultFilterData?.let {
if (it.vaultFilterTypes.contains(VaultFilterType.MyVault) ||
it.vaultFilterTypes.size > 2
) {
it
} else {
null
}
}
is VaultState.ViewState.Error,
is VaultState.ViewState.Loading,
-> null
}

View file

@ -122,6 +122,21 @@ class VaultScreenTest : BaseComposeTest() {
composeTestRule.onNodeWithText("Vault: My vault").assertDoesNotExist()
composeTestRule.onNodeWithText("Vault: Test Organization").assertDoesNotExist()
mutableStateFlow.update {
it.copy(
vaultFilterData = VAULT_FILTER_DATA.copy(
vaultFilterTypes = listOf(
VaultFilterType.AllVaults,
ORGANIZATION_VAULT_FILTER,
),
),
)
}
composeTestRule.onNodeWithText("Vault: All").assertDoesNotExist()
composeTestRule.onNodeWithText("Vault: My vault").assertDoesNotExist()
composeTestRule.onNodeWithText("Vault: Test Organization").assertDoesNotExist()
mutableStateFlow.update {
it.copy(
vaultFilterData = VAULT_FILTER_DATA.copy(

View file

@ -0,0 +1,87 @@
package com.x8bit.bitwarden.ui.vault.feature.vault.util
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultState
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class VaultStateExtensionsTest {
@Test
fun `vaultFilterDataIfRequired with my vault should return correct data`() {
val vaultFilterData = createVaultFilterData(hasMyVault = true)
mapOf(
VaultState.ViewState.NoItems to vaultFilterData,
VaultState.ViewState.Loading to null,
VaultState.ViewState.Error(message = "error".asText()) to null,
createContentState() to vaultFilterData,
)
.forEach { (viewState, expected) ->
assertEquals(
expected,
viewState.vaultFilterDataIfRequired(vaultFilterData = vaultFilterData),
)
}
}
@Test
fun `vaultFilterDataIfRequired without my vault should return correct data`() {
val vaultFilterData = createVaultFilterData(hasMyVault = false)
mapOf<VaultState.ViewState, VaultFilterData?>(
VaultState.ViewState.NoItems to null,
VaultState.ViewState.Loading to null,
VaultState.ViewState.Error(message = "error".asText()) to null,
createContentState() to null,
)
.forEach { (viewState, expected) ->
assertEquals(
expected,
viewState.vaultFilterDataIfRequired(vaultFilterData = vaultFilterData),
)
}
}
private fun createVaultFilterData(hasMyVault: Boolean = false): VaultFilterData =
VaultFilterData(
selectedVaultFilterType = VaultFilterType.AllVaults,
vaultFilterTypes = listOfNotNull(
VaultFilterType.AllVaults,
if (hasMyVault) {
VaultFilterType.MyVault
} else {
null
},
VaultFilterType.OrganizationVault(
organizationId = "organizationId-A",
organizationName = "Organization A",
),
),
)
private fun createContentState(): VaultState.ViewState.Content =
VaultState.ViewState.Content(
loginItemsCount = 1,
cardItemsCount = 0,
identityItemsCount = 0,
secureNoteItemsCount = 0,
favoriteItems = listOf(),
folderItems = listOf(
VaultState.ViewState.FolderItem(
id = "mockId-1",
name = "mockName-1".asText(),
itemCount = 1,
),
),
collectionItems = listOf(
VaultState.ViewState.CollectionItem(
id = "mockId-1",
name = "mockName-1",
itemCount = 1,
),
),
noFolderItems = listOf(),
trashItemsCount = 0,
totpItemsCount = 1,
)
}