diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt index b11098e47f..3641f6b545 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt @@ -1,11 +1,9 @@ package com.tangem.domain.account.status.di import com.tangem.domain.account.repository.AccountsCRUDRepository +import com.tangem.domain.account.status.supplier.MultiAccountStatusListSupplier import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier -import com.tangem.domain.account.status.usecase.GetAccountCurrencyByAddressUseCase -import com.tangem.domain.account.status.usecase.GetAccountCurrencyStatusUseCase -import com.tangem.domain.account.status.usecase.GetCryptoCurrencyActionsUseCaseV2 -import com.tangem.domain.account.status.usecase.ManageCryptoCurrenciesUseCase +import com.tangem.domain.account.status.usecase.* import com.tangem.domain.account.status.utils.CryptoCurrencyBalanceFetcher import com.tangem.domain.account.supplier.SingleAccountListSupplier import com.tangem.domain.common.wallets.UserWalletsListRepository @@ -61,6 +59,16 @@ internal object AccountStatusUseCaseModule { ) } + @Provides + @Singleton + fun provideGetWalletTotalBalanceUseCaseV2( + multiAccountStatusListSupplier: MultiAccountStatusListSupplier, + ): GetWalletTotalBalanceUseCaseV2 { + return GetWalletTotalBalanceUseCaseV2( + multiAccountStatusListSupplier = multiAccountStatusListSupplier, + ) + } + @Provides @Singleton fun provideGetAccountCurrencyStatusUseCase( diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt index 60ed1d5971..b37d457efc 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/MultiAccountStatusListSupplier.kt @@ -3,6 +3,7 @@ package com.tangem.domain.account.status.supplier import com.tangem.domain.account.models.AccountStatusList import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer import com.tangem.domain.core.flow.FlowCachingSupplier +import kotlinx.coroutines.flow.Flow /** * Supplier that provides a list of [AccountStatusList]s for all user wallets. @@ -12,4 +13,9 @@ import com.tangem.domain.core.flow.FlowCachingSupplier abstract class MultiAccountStatusListSupplier( override val factory: MultiAccountStatusListProducer.Factory, override val keyCreator: (Unit) -> String, -) : FlowCachingSupplier>() \ No newline at end of file +) : FlowCachingSupplier>() { + + operator fun invoke(): Flow> { + return super.invoke(params = Unit) + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetWalletTotalBalanceUseCaseV2.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetWalletTotalBalanceUseCaseV2.kt new file mode 100644 index 0000000000..0bae08d46c --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetWalletTotalBalanceUseCaseV2.kt @@ -0,0 +1,36 @@ +package com.tangem.domain.account.status.usecase + +import com.tangem.domain.account.status.supplier.MultiAccountStatusListSupplier +import com.tangem.domain.core.lce.LceFlow +import com.tangem.domain.core.utils.lceContent +import com.tangem.domain.models.TotalFiatBalance +import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.domain.tokens.error.TokenListError +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map + +/** + * Use case to get total fiat balances for multiple user wallets. + * It's second version of the use case that will replace the previous one after accounts feature released. + * + * @param multiAccountStatusListSupplier Supplier that provides the status list for multiple accounts. + */ +class GetWalletTotalBalanceUseCaseV2( + private val multiAccountStatusListSupplier: MultiAccountStatusListSupplier, +) { + + operator fun invoke( + userWalletIds: Collection, + ): LceFlow> { + return multiAccountStatusListSupplier() + .map { accountStatusLists -> + accountStatusLists + .filter { it.userWalletId in userWalletIds } + .associate { + it.userWalletId to it.totalFiatBalance + } + .lceContent() + } + .distinctUntilChanged() + } +} \ No newline at end of file diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/NewMarketsPortfolioDelegate.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/NewMarketsPortfolioDelegate.kt index faed05e1b5..fd1f0fecea 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/NewMarketsPortfolioDelegate.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/NewMarketsPortfolioDelegate.kt @@ -35,17 +35,19 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* +@OptIn(ExperimentalCoroutinesApi::class) @Suppress("LongParameterList") internal class NewMarketsPortfolioDelegate @AssistedInject constructor( - private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, - private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, + getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, + getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, private val allAccountSupplier: MultiAccountStatusListSupplier, private val getCryptoCurrencyActionsUseCase: GetCryptoCurrencyActionsUseCaseV2, private val getUserWalletUseCase: GetUserWalletUseCase, - private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase, + isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase, @Assisted private val scope: CoroutineScope, @Assisted private val token: TokenMarketParams, @Assisted private val tokenActionsHandler: TokenActionsHandler, @@ -163,7 +165,7 @@ internal class NewMarketsPortfolioDelegate @AssistedInject constructor( } private fun portfolioWithThisCurrencyFLow(): Flow = - allAccountSupplier(Unit).map { list -> list.map { it.addedAccountsFlow() } }.flatMapLatest { flows -> + allAccountSupplier().map { list -> list.map { it.addedAccountsFlow() } }.flatMapLatest { flows -> combine(flows) { PortfoliosWithThisCurrency( currencyRawId = currencyRawId, @@ -204,7 +206,7 @@ internal class NewMarketsPortfolioDelegate @AssistedInject constructor( val appCurrency = settings.appCurrency val isBalanceHidden = settings.isBalanceHidden val isAccountMode = settings.isAccountMode - val uiItems: MutableList = mutableListOf() + val uiItems: MutableList = mutableListOf() fun toggleQuickActions(key: Pair) = expandedHolder?.update { expanded -> val isExpand = expanded.contains(key) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt index 80f53e3613..becc704e91 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt @@ -270,7 +270,7 @@ internal class SendDestinationModel @Inject constructor( private fun getAddedAddresses(): Flow> { return combine( flow = getWalletsUseCase().conflate(), - flow2 = multiAccountStatusListSupplier(Unit).conflate(), + flow2 = multiAccountStatusListSupplier().conflate(), ) { wallets, accountList -> val cryptoCurrencyNetwork = cryptoCurrency.network diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletsFetcher.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletsFetcher.kt index 65c3ffbbe7..f595824173 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletsFetcher.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletsFetcher.kt @@ -6,6 +6,8 @@ import com.tangem.common.ui.userwallet.state.UserWalletItemUM import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.message.SnackbarMessage +import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles +import com.tangem.domain.account.status.usecase.GetWalletTotalBalanceUseCaseV2 import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.error.SelectedAppCurrencyError import com.tangem.domain.appcurrency.model.AppCurrency @@ -37,7 +39,9 @@ import kotlinx.coroutines.flow.* @Suppress("LongParameterList") internal class DefaultUserWalletsFetcher @AssistedInject constructor( getWalletsUseCase: GetWalletsUseCase, + private val accountsFeatureToggles: AccountsFeatureToggles, private val getWalletTotalBalanceUseCase: GetWalletTotalBalanceUseCase, + private val getWalletTotalBalanceUseCaseV2: GetWalletTotalBalanceUseCaseV2, private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, @Assisted private val onWalletClick: (UserWalletId) -> Unit, @@ -97,7 +101,11 @@ internal class DefaultUserWalletsFetcher @AssistedInject constructor( // We should not load balances in auth mode flowOf(Lce.Loading(walletIds.associateWith { TotalFiatBalance.Loading })) } else { - getWalletTotalBalanceUseCase(walletIds).distinctUntilChanged() + if (accountsFeatureToggles.isFeatureEnabled) { + getWalletTotalBalanceUseCaseV2(userWalletIds = walletIds) + } else { + getWalletTotalBalanceUseCase(walletIds).distinctUntilChanged() + } } }