Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-01 07:40:40 +03:00
parent b051579757
commit e0e8fbcb22
3 changed files with 39 additions and 24 deletions

View file

@ -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<BalanceItem>,
balancesId: Int,
): Either<StakingError, List<BalanceItem>> {
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<Pair<PendingTransaction, BalanceItem>>,
realData: List<BalanceItem>,
newBalancesId: Int,
pendingData: List<Pair<PendingTransaction, BalanceItem>>,
): Pair<List<BalanceItem>, List<PendingTransaction>> {
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<PendingTransaction>()
pending.forEach { (pendingTransaction, balanceItem) ->
pendingData.forEach { (pendingTransaction, balanceItem) ->
val key = Triple(balanceItem.groupId, balanceItem.type, balanceItem.amount)
val oldBalancesId = pendingTransaction.balancesId

View file

@ -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(

View file

@ -136,9 +136,12 @@ internal class StakingViewModel @Inject constructor(
private val balancesToShow: List<BalanceItem>
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() -> {