Updated on 2026-08-14

This commit is contained in:
Tangem 2024-03-14 19:04:04 +08:00
parent 1da2ca6d1f
commit 364d064faf
4 changed files with 21 additions and 66 deletions

View file

@ -131,16 +131,25 @@ internal class GeneralUserWalletsListManager(
Timber.d("Switch to ${manager::class.java.simpleName}")
implementation.value = manager
clearOldManager(manager)
}
.flowOn(dispatchers.io)
.launchIn(applicationScope)
}
/** Copy data from [old] manager and clean it */
/** Copy data from [old] manager */
private suspend fun UserWalletsListManager.copyFrom(old: UserWalletsListManager): UserWalletsListManager {
old.selectedUserWalletSync?.let { this.save(it) }
old.clear()
return this
}
private suspend fun clearOldManager(current: UserWalletsListManager) {
if (current == biometricUserWalletsListManager) {
runtimeUserWalletsListManager.clear()
} else {
biometricUserWalletsListManager.clear()
}
}
}

View file

@ -17,7 +17,7 @@
},
{
"name": "GENERAL_USER_WALLETS_LIST_MANAGER_ENABLED",
"version": "5.7.0"
"version": "5.8.0"
},
{
"name": "LOCAL_USER_LOGS_ENABLED",

View file

@ -14,7 +14,6 @@ import com.tangem.domain.settings.ShouldShowSaveWalletScreenUseCase
import com.tangem.domain.walletconnect.WalletConnectActions
import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase
import com.tangem.domain.wallets.usecase.GetWalletsUseCase
import com.tangem.domain.wallets.usecase.ShouldSaveUserWalletsUseCase
import com.tangem.feature.wallet.presentation.deeplink.WalletDeepLinksHandler
import com.tangem.feature.wallet.presentation.router.InnerWalletRouter
import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent
@ -53,7 +52,6 @@ internal class WalletViewModel @Inject constructor(
private val getWalletsUseCase: GetWalletsUseCase,
private val shouldShowSaveWalletScreenUseCase: ShouldShowSaveWalletScreenUseCase,
private val canUseBiometryUseCase: CanUseBiometryUseCase,
private val shouldSaveUserWalletsUseCase: ShouldSaveUserWalletsUseCase,
private val isWalletsScrollPreviewEnabled: IsWalletsScrollPreviewEnabled,
private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
analyticsEventsHandler: AnalyticsEventHandler,
@ -74,7 +72,7 @@ internal class WalletViewModel @Inject constructor(
suggestToEnableBiometrics()
subscribeOnWalletsUpdateFlow()
subscribeToUserWalletsUpdates()
subscribeOnBalanceHiding()
subscribeOnSelectedWalletFlow()
}
@ -112,25 +110,12 @@ internal class WalletViewModel @Inject constructor(
return router.isWalletLastScreen() && shouldShowSaveWalletScreenUseCase() && canUseBiometryUseCase()
}
private fun subscribeOnWalletsUpdateFlow() {
viewModelScope.launch(dispatchers.main) {
shouldSaveUserWalletsUseCase()
.conflate()
.distinctUntilChanged()
.collectLatest(::subscribeToUserWalletsUpdates)
}
}
private fun subscribeToUserWalletsUpdates(shouldSaveUserWallet: Boolean) {
private fun subscribeToUserWalletsUpdates() {
getWalletsUseCase()
.conflate()
.distinctUntilChanged()
.map {
walletsUpdateActionResolver.resolve(
wallets = it,
currentState = stateHolder.value,
canSaveWallets = shouldSaveUserWallet,
)
walletsUpdateActionResolver.resolve(wallets = it, currentState = stateHolder.value)
}
.onEach(::updateWallets)
.flowOn(dispatchers.main)
@ -182,14 +167,6 @@ internal class WalletViewModel @Inject constructor(
private suspend fun updateWallets(action: WalletsUpdateActionResolver.Action) {
when (action) {
is WalletsUpdateActionResolver.Action.InitializeWallets -> initializeWallets(action)
is WalletsUpdateActionResolver.Action.ReinitializeWallets -> {
walletScreenContentLoader.load(
userWallet = action.selectedWallet,
clickIntents = clickIntents,
isRefresh = true,
coroutineScope = viewModelScope,
)
}
is WalletsUpdateActionResolver.Action.ReinitializeWallet -> reinitializeWallet(action)
is WalletsUpdateActionResolver.Action.AddWallet -> addWallet(action)
is WalletsUpdateActionResolver.Action.DeleteWallet -> deleteWallet(action)

View file

@ -22,24 +22,16 @@ internal class WalletsUpdateActionResolver @Inject constructor(
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
) {
private var isInitialized: Boolean = false
private var canSaveWallets: Boolean = false
fun resolve(wallets: List<UserWallet>, currentState: WalletScreenState, canSaveWallets: Boolean): Action {
fun resolve(wallets: List<UserWallet>, currentState: WalletScreenState): Action {
val selectedWallet = wallets.getSelectedWallet()
val action = if (selectedWallet == null) {
createNoSelectedWalletAction(wallets)
} else {
when {
isFirstInitialization(currentState) -> {
createInitializeWalletsAction(wallets, selectedWallet, canSaveWallets)
}
isReinitialization(canSaveWallets) -> {
this.canSaveWallets = canSaveWallets
Action.ReinitializeWallets(selectedWallet = selectedWallet)
}
else -> getUpdateContentAction(currentState, wallets, selectedWallet)
if (isFirstInitialization(currentState)) {
createInitializeWalletsAction(wallets, selectedWallet)
} else {
getUpdateContentAction(currentState, wallets, selectedWallet)
}
}
@ -68,14 +60,7 @@ internal class WalletsUpdateActionResolver @Inject constructor(
return state.selectedWalletIndex == NOT_INITIALIZED_WALLET_INDEX
}
private fun createInitializeWalletsAction(
wallets: List<UserWallet>,
selectedWallet: UserWallet,
canSaveWallets: Boolean,
): Action {
this.isInitialized = true
this.canSaveWallets = canSaveWallets
private fun createInitializeWalletsAction(wallets: List<UserWallet>, selectedWallet: UserWallet): Action {
return Action.InitializeWallets(
selectedWalletIndex = wallets.indexOfWallet(selectedWallet.walletId),
selectedWallet = selectedWallet,
@ -83,10 +68,6 @@ internal class WalletsUpdateActionResolver @Inject constructor(
)
}
private fun isReinitialization(canSaveWallets: Boolean): Boolean {
return isInitialized && this.canSaveWallets != canSaveWallets
}
private fun getUpdateContentAction(
state: WalletScreenState,
wallets: List<UserWallet>,
@ -232,18 +213,6 @@ internal class WalletsUpdateActionResolver @Inject constructor(
}
}
/**
* Reinitialize wallets. Example, if user turned on wallets saving
*
* @property selectedWallet selected wallet
*/
data class ReinitializeWallets(val selectedWallet: UserWallet) : Action() {
override fun toString(): String {
return "ReinitializeWallets(selectedWallet = ${selectedWallet.walletId})"
}
}
/**
* Reinitialize selected wallet. Example, scanning a new card if wallets saving is turned off
*