[PM-31081] Added snackbar when items are successfully migrated (#6394)

This commit is contained in:
aj-rosado
2026-01-23 16:51:41 +00:00
committed by GitHub
parent 319872ccf9
commit ec28dde6d2
5 changed files with 28 additions and 0 deletions
@@ -27,4 +27,5 @@ enum class SnackbarRelay {
SEND_DELETED,
SEND_UPDATED,
LEFT_ORGANIZATION,
VAULT_MIGRATED_TO_MY_ITEMS,
}
@@ -7,6 +7,8 @@ import com.bitwarden.core.data.repository.error.MissingPropertyException
import com.bitwarden.network.util.isNoConnectionError
import com.bitwarden.network.util.isTimeoutError
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
@@ -16,6 +18,7 @@ import com.x8bit.bitwarden.data.platform.manager.model.OrganizationEvent
import com.x8bit.bitwarden.data.vault.manager.VaultMigrationManager
import com.x8bit.bitwarden.data.vault.manager.VaultSyncManager
import com.x8bit.bitwarden.data.vault.repository.model.MigratePersonalVaultResult
import com.x8bit.bitwarden.ui.platform.model.SnackbarRelay
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -37,6 +40,7 @@ class MigrateToMyItemsViewModel @Inject constructor(
vaultSyncManager: VaultSyncManager,
savedStateHandle: SavedStateHandle,
private val authRepository: AuthRepository,
private val snackbarRelayManager: SnackbarRelayManager<SnackbarRelay>,
) : BaseViewModel<MigrateToMyItemsState, MigrateToMyItemsEvent, MigrateToMyItemsAction>(
initialState = savedStateHandle[KEY_STATE] ?: run {
val args = savedStateHandle.toMigrateToMyItemsArgs()
@@ -148,6 +152,12 @@ class MigrateToMyItemsViewModel @Inject constructor(
) {
when (val result = action.result) {
is MigratePersonalVaultResult.Success -> {
snackbarRelayManager.sendSnackbarData(
relay = SnackbarRelay.VAULT_MIGRATED_TO_MY_ITEMS,
data = BitwardenSnackbarData(
message = BitwardenString.items_transferred.asText(),
),
)
organizationEventManager.trackEvent(
event = OrganizationEvent.ItemOrganizationAccepted(
organizationId = state.organizationId,
@@ -209,6 +209,7 @@ class VaultViewModel @Inject constructor(
SnackbarRelay.FOLDER_CREATED,
SnackbarRelay.LOGINS_IMPORTED,
SnackbarRelay.LEFT_ORGANIZATION,
SnackbarRelay.VAULT_MIGRATED_TO_MY_ITEMS,
),
)
.map { VaultAction.Internal.SnackbarDataReceive(it) }
@@ -4,6 +4,8 @@ import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.bitwarden.core.data.repository.error.MissingPropertyException
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.components.snackbar.model.BitwardenSnackbarData
import com.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.asText
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
@@ -13,6 +15,7 @@ import com.x8bit.bitwarden.data.platform.manager.model.OrganizationEvent
import com.x8bit.bitwarden.data.vault.manager.VaultMigrationManager
import com.x8bit.bitwarden.data.vault.manager.VaultSyncManager
import com.x8bit.bitwarden.data.vault.repository.model.MigratePersonalVaultResult
import com.x8bit.bitwarden.ui.platform.model.SnackbarRelay
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
@@ -52,6 +55,10 @@ class MigrateToMyItemsViewModelTest : BaseViewModelTest() {
every { userStateFlow } returns mutableUserStateFlow
}
private val mockSnackbarRelayManager: SnackbarRelayManager<SnackbarRelay> = mockk {
every { sendSnackbarData(data = any(), relay = any()) } just runs
}
@BeforeEach
fun setup() {
mockkStatic(SavedStateHandle::toMigrateToMyItemsArgs)
@@ -158,6 +165,13 @@ class MigrateToMyItemsViewModelTest : BaseViewModelTest() {
assertNull(viewModel.stateFlow.value.dialog)
mockSnackbarRelayManager.sendSnackbarData(
relay = SnackbarRelay.LEFT_ORGANIZATION,
data = BitwardenSnackbarData(
message = BitwardenString.you_left_the_organization.asText(),
),
)
verify {
mockOrganizationEventManager.trackEvent(
event = OrganizationEvent.ItemOrganizationAccepted(
@@ -325,6 +339,7 @@ class MigrateToMyItemsViewModelTest : BaseViewModelTest() {
vaultMigrationManager = mockVaultMigrationManager,
vaultSyncManager = mockVaultSyncManager,
authRepository = mockAuthRepository,
snackbarRelayManager = mockSnackbarRelayManager,
savedStateHandle = SavedStateHandle(mapOf("state" to state)),
)
}
+1
View File
@@ -1197,4 +1197,5 @@ Do you want to switch to this account?</string>
<string name="your_premium_subscription_ended">Your Premium subscription ended</string>
<string name="to_regain_access_to_your_archive_restart_your_premium_subscription">To regain access to your archive, restart your Premium subscription. If you edit details for an archived item before restarting, itll be moved back into your vault.</string>
<string name="restart_premium">Restart Premium</string>
<string name="items_transferred">Items transferred</string>
</resources>