diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt index ba5d0d3ac2..fe9071b365 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensions.kt @@ -2,7 +2,9 @@ package com.x8bit.bitwarden.data.platform.repository.util import com.x8bit.bitwarden.data.platform.repository.model.DataState import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.transformWhile +import kotlinx.coroutines.flow.update /** * Maps the data inside a [DataState] with the given [transform]. @@ -24,3 +26,15 @@ fun Flow>.takeUntilLoaded(): Flow> = transf emit(it) it !is DataState.Loaded } + +/** + * Updates the [DataState] to [DataState.Pending] if there is data present or [DataState.Loading] + * if no data is present. + */ +fun MutableStateFlow>.updateToPendingOrLoading() { + update { dataState -> + dataState.data + ?.let { data -> DataState.Pending(data = data) } + ?: DataState.Loading + } +} diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 2e6012357b..4ec2094726 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -13,6 +13,7 @@ import com.x8bit.bitwarden.data.platform.datasource.network.util.isNoConnectionE import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager import com.x8bit.bitwarden.data.platform.repository.model.DataState import com.x8bit.bitwarden.data.platform.repository.util.map +import com.x8bit.bitwarden.data.platform.repository.util.updateToPendingOrLoading import com.x8bit.bitwarden.data.platform.util.asSuccess import com.x8bit.bitwarden.data.platform.util.flatMap import com.x8bit.bitwarden.data.platform.util.zip @@ -91,16 +92,8 @@ class VaultRepositoryImpl constructor( override fun sync() { if (!syncJob.isCompleted || willSyncAfterUnlock) return - vaultDataMutableStateFlow.value.data?.let { data -> - vaultDataMutableStateFlow.update { - DataState.Pending(data = data) - } - } - sendDataMutableStateFlow.value.data?.let { data -> - sendDataMutableStateFlow.update { - DataState.Pending(data = data) - } - } + vaultDataMutableStateFlow.updateToPendingOrLoading() + sendDataMutableStateFlow.updateToPendingOrLoading() syncJob = scope.launch { syncService .sync() diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensionsTest.kt index 7d6fe2b455..39624ea025 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/repository/util/DataStateExtensionsTest.kt @@ -23,4 +23,22 @@ class DataStateExtensionsTest { awaitComplete() } } + + @Test + fun `updateToPendingOrLoading should change the DataState to Pending when data is present`() { + val mutableStateFlow = MutableStateFlow>(DataState.Loaded(Unit)) + + mutableStateFlow.updateToPendingOrLoading() + + assertEquals(DataState.Pending(Unit), mutableStateFlow.value) + } + + @Test + fun `updateToPendingOrLoading should change the DataState to Loading when data is absent`() { + val mutableStateFlow = MutableStateFlow>(DataState.Error(Throwable("Fail"))) + + mutableStateFlow.updateToPendingOrLoading() + + assertEquals(DataState.Loading, mutableStateFlow.value) + } }