Updated on 2026-08-14
This commit is contained in:
parent
b051579757
commit
e0e8fbcb22
3 changed files with 39 additions and 24 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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() -> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue