Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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()

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

}

/**
* Whether the cipher is in a collection.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
}
Expand Down Expand Up @@ -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,
)
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
)
}
Expand Down
8 changes: 8 additions & 0 deletions ui/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,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>
Comment on lines +153 to +157

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ DEBT: new_item_created is now unreferenced and can be removed.

Details

This PR replaced the only Kotlin usage of new_item_created (VaultAddEditViewModel.kt:2036) with state.savedSnackbarMessage. A search across the repo shows the resource is now only declared in ui/src/main/res/values/strings.xml:123 and its translated variants, with no code references remaining.

Removing the base declaration keeps the translation source clean so translators aren't maintaining dead copy. item_updated is still used (VaultItemListingViewModel.kt:2378, VaultMoveToOrganizationViewModel.kt:342, VaultAddEditViewModel.kt:2457), so only new_item_created is affected.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should remove this if it's not needed

<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>
Expand Down
Loading