[PM-36379] fix: Show the item type in the save snackbar (#7308)

This commit is contained in:
André Bispo authored and GitHub committed 2026-08-27 16:13:53 +00:00
1 parent 00066abde7
commit 5fdd0870d1
3 files changed
+105 -7

No files matched your search

@@ -2033,7 +2033,7 @@ class VaultAddEditViewModel @Inject constructor(
sendEvent(event = VaultAddEditEvent.ExitApp)
} else {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
data = BitwardenSnackbarData(state.savedSnackbarMessage),
relay = SnackbarRelay.CIPHER_CREATED,
)
sendEvent(event = VaultAddEditEvent.NavigateBack)
@@ -2066,7 +2066,7 @@ class VaultAddEditViewModel @Inject constructor(
sendEvent(event = VaultAddEditEvent.ExitApp)
} else {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.item_updated.asText()),
data = BitwardenSnackbarData(state.savedSnackbarMessage),
relay = SnackbarRelay.CIPHER_UPDATED,
)
sendEvent(event = VaultAddEditEvent.NavigateBack)
@@ -2810,6 +2810,21 @@ data class VaultAddEditState(
}
}
/**
* Helper to determine the snackbar message shown after the item is successfully saved.
*/
val savedSnackbarMessage: Text
get() = when (cipherType) {
VaultItemCipherType.LOGIN -> BitwardenString.login_saved.asText()
VaultItemCipherType.CARD -> BitwardenString.card_saved.asText()
VaultItemCipherType.IDENTITY -> BitwardenString.identity_saved.asText()
VaultItemCipherType.SECURE_NOTE -> BitwardenString.secure_note_saved.asText()
VaultItemCipherType.SSH_KEY -> BitwardenString.ssh_key_saved.asText()
VaultItemCipherType.BANK_ACCOUNT -> BitwardenString.bank_account_saved.asText()
VaultItemCipherType.DRIVERS_LICENSE -> BitwardenString.license_saved.asText()
VaultItemCipherType.PASSPORT -> BitwardenString.passport_saved.asText()
}
/**
* Whether the cipher is in a collection.
*/
@@ -961,7 +961,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
@@ -1131,7 +1131,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
assertNotNull(specialCircumstanceManager.specialCircumstance)
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
@@ -1514,12 +1514,88 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.new_item_created.asText()),
data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
}
@Suppress("MaxLineLength")
@Test
fun `in add mode with a card, createCipherInOrganization success should send the card saved snackbar`() =
runTest {
val stateWithName = createVaultAddItemState(
vaultItemCipherType = VaultItemCipherType.CARD,
commonContentViewState = createCommonContentViewState(
name = "mockName-1",
),
typeContentViewState = VaultAddEditState.ViewState.Content.ItemType.Card(),
)
mutableVaultDataFlow.value = DataState.Loaded(createVaultData())
val viewModel = createAddVaultItemViewModel(
createSavedStateHandleWithState(
state = stateWithName,
vaultAddEditType = VaultAddEditType.AddItem,
vaultItemCipherType = VaultItemCipherType.CARD,
),
)
coEvery {
vaultRepository.createCipherInOrganization(any(), any())
} returns CreateCipherResult.Success
viewModel.eventFlow.test {
viewModel.trySendAction(VaultAddEditAction.Common.SaveClick)
assertEquals(VaultAddEditEvent.NavigateBack, awaitItem())
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.card_saved.asText()),
relay = SnackbarRelay.CIPHER_CREATED,
)
}
}
@Test
fun `in edit mode with a card, updateCipher success should send the card saved snackbar`() =
runTest {
val cipherView = createMockCipherListView(1)
val stateWithName = createVaultAddItemState(
vaultAddEditType = VaultAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID),
vaultItemCipherType = VaultItemCipherType.CARD,
commonContentViewState = createCommonContentViewState(
name = "mockName-1",
),
typeContentViewState = VaultAddEditState.ViewState.Content.ItemType.Card(),
)
mutableVaultDataFlow.value =
DataState.Loaded(createVaultData(cipherListView = cipherView))
val viewModel = createAddVaultItemViewModel(
createSavedStateHandleWithState(
state = stateWithName,
vaultAddEditType = VaultAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID),
vaultItemCipherType = VaultItemCipherType.CARD,
),
)
coEvery {
vaultRepository.updateCipher(any(), any())
} returns UpdateCipherResult.Success
viewModel.eventFlow.test {
viewModel.trySendAction(VaultAddEditAction.Common.SaveClick)
assertEquals(VaultAddEditEvent.NavigateBack, awaitItem())
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.card_saved.asText()),
relay = SnackbarRelay.CIPHER_UPDATED,
)
}
}
@Test
fun `in edit mode, canDelete should be true when cipher permission is true`() =
runTest {
@@ -1855,7 +1931,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 1) {
snackbarRelayManager.sendSnackbarData(
data = BitwardenSnackbarData(BitwardenString.item_updated.asText()),
data = BitwardenSnackbarData(BitwardenString.login_saved.asText()),
relay = SnackbarRelay.CIPHER_UPDATED,
)
}
+8 -1
View File
@@ -120,7 +120,6 @@
<string name="min_numbers">Minimum numbers</string>
<string name="min_special">Minimum special</string>
<string name="never">Never</string>
<string name="new_item_created">Item added</string>
<string name="no_cards">There are no cards in your vault.</string>
<string name="add_card">Add card</string>
<string name="no_logins">There are no logins in your vault.</string>
@@ -150,6 +149,14 @@
<string name="select">Select</string>
<string name="item_details">Item details</string>
<string name="item_updated">Item saved</string>
<string name="bank_account_saved">Bank account saved</string>
<string name="card_saved">Card saved</string>
<string name="identity_saved">Identity saved</string>
<string name="license_saved">License saved</string>
<string name="login_saved">Login saved</string>
<string name="passport_saved">Passport saved</string>
<string name="secure_note_saved">Secure note saved</string>
<string name="ssh_key_saved">SSH key saved</string>
<string name="submitting">Submitting…</string>
<string name="syncing">Syncing…</string>
<string name="syncing_complete">Syncing complete</string>