diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorAction.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorAction.kt index 0985f4b68c..0fd46c00ba 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorAction.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorAction.kt @@ -24,8 +24,8 @@ internal sealed interface WalletSelectorAction : Action { val walletsStores: Map>, ) : WalletSelectorAction - data class BalanceLoaded( - val userWalletModel: UserWalletModel, + data class BalancesLoaded( + val userWalletModels: List, ) : WalletSelectorAction object UnlockWithBiometry : WalletSelectorAction { diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index 4405407dcd..9d690e7df7 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -35,7 +35,6 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import org.rekotlin.Middleware import timber.log.Timber -import java.math.BigDecimal internal class WalletSelectorMiddleware { val middleware: Middleware = { _, appStateProvider -> @@ -81,7 +80,7 @@ internal class WalletSelectorMiddleware { is WalletSelectorAction.SelectedWalletChanged, is WalletSelectorAction.UnlockWithBiometry.Error, is WalletSelectorAction.UnlockWithBiometry.Success, - is WalletSelectorAction.BalanceLoaded, + is WalletSelectorAction.BalancesLoaded, is WalletSelectorAction.IsLockedChanged, is WalletSelectorAction.HandleError, is WalletSelectorAction.CloseError, @@ -104,20 +103,10 @@ internal class WalletSelectorMiddleware { state: WalletSelectorState, ) { if (updatedWalletStores.isNotEmpty()) scope.launch(Dispatchers.Default) { - state.wallets - .associateWith { updatedWalletStores[it.id] } - .forEach { (wallet, walletStores) -> - val isWalletTokensEmpty = (wallet.type as? UserWalletModel.Type.MultiCurrency)?.tokensCount == 0 - val updatedWallet = if (walletStores == null && isWalletTokensEmpty) { - wallet.copy(fiatBalance = TotalFiatBalance.Loaded(BigDecimal.ZERO)) - } else { - wallet.updateWalletStoresAndCalculateFiatBalance(walletStores.orEmpty()) - } - - if (wallet != updatedWallet) { - store.dispatchOnMain(WalletSelectorAction.BalanceLoaded(updatedWallet)) - } - } + val updatedWallets = state.wallets.updateWalletStoresAndCalculateFiatBalance(updatedWalletStores) + if (updatedWallets != state.wallets) { + store.dispatchOnMain(WalletSelectorAction.BalancesLoaded(updatedWallets)) + } } } @@ -314,18 +303,28 @@ internal class WalletSelectorMiddleware { } } + private suspend fun List.updateWalletStoresAndCalculateFiatBalance( + walletStores: Map>, + ): List { + return this + .associateWith { walletStores[it.id] } + .map { (wallet, walletStores) -> + wallet.updateWalletStoresAndCalculateFiatBalance(walletStores) + } + } + private suspend fun UserWalletModel.updateWalletStoresAndCalculateFiatBalance( - walletStores: List, + walletStores: List?, ): UserWalletModel { return this.copy( type = when (type) { is UserWalletModel.Type.MultiCurrency -> type.copy( - tokensCount = walletStores.flatMap { it.walletsData }.size, + tokensCount = walletStores?.flatMap { it.walletsData }?.size ?: 0, ) is UserWalletModel.Type.SingleCurrency -> type }, fiatBalance = totalFiatBalanceCalculator.calculate( - walletStores = walletStores, + walletStores = walletStores.orEmpty(), initial = TotalFiatBalance.Loading, ), ) diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt index b64fe0a3ce..277d3f45dd 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorReducer.kt @@ -24,8 +24,8 @@ internal object WalletSelectorReducer { is WalletSelectorAction.IsLockedChanged -> state.copy( isLocked = action.isLocked, ) - is WalletSelectorAction.BalanceLoaded -> state.copy( - wallets = state.wallets.updateWithBalance(action.userWalletModel), + is WalletSelectorAction.BalancesLoaded -> state.copy( + wallets = action.userWalletModels, ) is WalletSelectorAction.HandleError -> state.copy(error = action.error) is WalletSelectorAction.CloseError -> state.copy(error = null) @@ -85,19 +85,6 @@ internal object WalletSelectorReducer { } } - private fun List.updateWithBalance( - userWalletModel: UserWalletModel, - ): List { - return ArrayList(this).apply { - val index = indexOfFirst { it.id == userWalletModel.id } - if (index == -1) { - add(userWalletModel) - } else { - this[index] = userWalletModel - } - } - } - private fun UserWallet.getType(prevType: UserWalletModel.Type? = null): UserWalletModel.Type { return if (isMultiCurrency) { UserWalletModel.Type.MultiCurrency(