From e0e8fbcb2299fdf35a0f3c63b8c9b1dcc6113fdc Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 1 Oct 2024 07:40:40 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../InvalidatePendingTransactionsUseCase.kt | 31 +++++++++---------- .../converters/YieldBalancesConverter.kt | 11 ++++--- .../viewmodel/StakingViewModel.kt | 21 +++++++++++-- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt index 82a55f65e7..b7c4c597ef 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/InvalidatePendingTransactionsUseCase.kt @@ -5,7 +5,6 @@ import com.tangem.domain.staking.model.PendingTransaction import com.tangem.domain.staking.model.stakekit.BalanceItem import com.tangem.domain.staking.model.stakekit.BalanceType import com.tangem.domain.staking.model.stakekit.StakingError -import com.tangem.domain.staking.model.stakekit.YieldBalance import com.tangem.domain.staking.repositories.StakingErrorResolver import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository import com.tangem.domain.wallets.models.UserWalletId @@ -18,36 +17,34 @@ class InvalidatePendingTransactionsUseCase( operator fun invoke( userWalletId: UserWalletId, - yieldBalance: YieldBalance, + balanceItems: List, + balancesId: Int, ): Either> { return Either.catch { - if (yieldBalance is YieldBalance.Data) { - val (balancesToDisplay, transactionsToRemove) = mergeRealAndPendingTransactions( - yieldBalance = yieldBalance, - pending = stakingPendingTransactionRepository.getTransactionsWithBalanceItems(userWalletId), - ) + val (balancesToDisplay, transactionsToRemove) = mergeRealAndPendingTransactions( + realData = balanceItems, + newBalancesId = balancesId, + pendingData = stakingPendingTransactionRepository.getTransactionsWithBalanceItems(userWalletId), + ) - stakingPendingTransactionRepository.removeTransactions(userWalletId, transactionsToRemove.toSet()) + stakingPendingTransactionRepository.removeTransactions(userWalletId, transactionsToRemove.toSet()) - balancesToDisplay - } else { - emptyList() - } + balancesToDisplay }.mapLeft { stakingErrorResolver.resolve(it) } } private fun mergeRealAndPendingTransactions( - yieldBalance: YieldBalance.Data, - pending: List>, + realData: List, + newBalancesId: Int, + pendingData: List>, ): Pair, List> { - val balances = yieldBalance.balance.items.associateBy { Triple(it.groupId, it.type, it.amount) }.toMutableMap() - val newBalancesId = yieldBalance.getBalancesUniqueId() + val balances = realData.associateBy { Triple(it.groupId, it.type, it.amount) }.toMutableMap() val transactionsToRemove = mutableListOf() - pending.forEach { (pendingTransaction, balanceItem) -> + pendingData.forEach { (pendingTransaction, balanceItem) -> val key = Triple(balanceItem.groupId, balanceItem.type, balanceItem.amount) val oldBalancesId = pendingTransaction.balancesId diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/converters/YieldBalancesConverter.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/converters/YieldBalancesConverter.kt index 5c82de46c3..1280175dbb 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/converters/YieldBalancesConverter.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/converters/YieldBalancesConverter.kt @@ -28,12 +28,15 @@ internal class YieldBalancesConverter( val cryptoCurrency = cryptoCurrencyStatus.currency val yieldBalance = cryptoCurrencyStatus.value.yieldBalance + val balanceToShowItems = balancesToShowProvider() - return if (yieldBalance is YieldBalance.Data) { - val cryptoRewardsValue = yieldBalance.getRewardStakingBalance() - val fiatRewardsValue = cryptoCurrencyStatus.value.fiatRate?.times(cryptoRewardsValue) + return if (yieldBalance is YieldBalance.Data || balanceToShowItems.any { it.isPending }) { + val cryptoRewardsValue = (yieldBalance as? YieldBalance.Data)?.getRewardStakingBalance() - val balanceToShowItems = balancesToShowProvider() + val fiatRate = cryptoCurrencyStatus.value.fiatRate + val fiatRewardsValue = if (fiatRate != null && cryptoRewardsValue != null) { + fiatRate.times(cryptoRewardsValue) + } else null InnerYieldBalanceState.Data( rewardsCrypto = BigDecimalFormatter.formatCryptoAmount( diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index 6590a3b1c7..2c0c1833ed 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -136,9 +136,12 @@ internal class StakingViewModel @Inject constructor( private val balancesToShow: List get() { - return cryptoCurrencyStatus.value.yieldBalance?.let { - invalidatePendingTransactionsUseCase(userWallet.walletId, it).getOrElse { emptyList() } - } ?: emptyList() + val yieldBalance = cryptoCurrencyStatus.value.yieldBalance as? YieldBalance.Data + return invalidatePendingTransactionsUseCase( + userWalletId = userWallet.walletId, + balanceItems = yieldBalance?.balance?.items ?: emptyList(), + balancesId = yieldBalance?.getBalancesUniqueId() ?: 0, + ).getOrElse { emptyList() } } private var isInitialInfoAnalyticSent: Boolean = false @@ -224,6 +227,18 @@ internal class StakingViewModel @Inject constructor( stateController.update(SetPossiblePendingTransactionTransformer(balanceState, cryptoCurrencyStatus)) } + stateController.update( + transformer = SetInitialDataStateTransformer( + clickIntents = this@StakingViewModel, + yield = yield, + isAnyTokenStaked = true, + isApprovalNeeded = stakingApproval is StakingApproval.Needed, + cryptoCurrencyStatusProvider = Provider { cryptoCurrencyStatus }, + userWalletProvider = Provider { userWallet }, + appCurrencyProvider = Provider { appCurrency }, + balancesToShowProvider = Provider { balancesToShow }, + ), + ) onRefreshSwipe(isRefreshing = false) } isAssentState() -> {