Updated on 2026-08-14

This commit is contained in:
Tangem 2025-06-09 12:32:02 +03:00
parent e5478ad943
commit 904d4bb006
3 changed files with 27 additions and 33 deletions

View file

@ -28,6 +28,7 @@ import com.tangem.domain.feedback.SaveBlockchainErrorUseCase
import com.tangem.domain.feedback.SendFeedbackEmailUseCase
import com.tangem.domain.feedback.models.BlockchainErrorInfo
import com.tangem.domain.feedback.models.FeedbackEmailType
import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.staking.*
import com.tangem.domain.staking.analytics.StakeScreenSource
@ -420,7 +421,7 @@ internal class StakingModel @Inject constructor(
override fun onRefreshSwipe(isRefreshing: Boolean) {
stateController.update(SetInitialLoadingStateTransformer(isRefreshing))
coroutineScope.launch {
balanceUpdater.partialUpdate()
balanceUpdater.updatePullToRefresh()
}.invokeOnCompletion {
stateController.update(SetInitialLoadingStateTransformer(false))
}
@ -929,7 +930,12 @@ internal class StakingModel @Inject constructor(
isSingleWalletWithTokens = false,
)
.conflate()
.distinctUntilChangedBy { it.getOrNull()?.value?.yieldBalance }
.filter {
val sources = it.getOrNull()?.value?.sources ?: return@filter true
sources.networkSource == StatusSource.ACTUAL && sources.yieldBalanceSource == StatusSource.ACTUAL
}
.distinctUntilChanged()
.filter { value.currentStep == StakingStep.InitialInfo }
.onEach { maybeStatus ->
maybeStatus.fold(
@ -1005,7 +1011,7 @@ internal class StakingModel @Inject constructor(
when {
isInitState() -> {
updateInitialData(status)
balanceUpdater.partialUpdate()
balanceUpdater.updateAfterNavigationToInitial()
}
isAssentState() -> {
getFee()

View file

@ -1,12 +1,10 @@
package com.tangem.features.staking.impl.presentation.state.helpers
import com.tangem.domain.staking.FetchActionsUseCase
import com.tangem.domain.staking.FetchStakingYieldBalanceUseCase
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.action.StakingActionStatus
import com.tangem.domain.tokens.FetchCurrencyStatusUseCase
import com.tangem.domain.tokens.FetchPendingTransactionsUseCase
import com.tangem.domain.tokens.TokensFeatureToggles
import com.tangem.domain.tokens.UpdateDelayedNetworkStatusUseCase
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase
import com.tangem.domain.wallets.models.UserWallet
@ -20,18 +18,16 @@ import kotlinx.coroutines.*
@Suppress("LongParameterList")
internal class StakingBalanceUpdater @AssistedInject constructor(
private val fetchPendingTransactionsUseCase: FetchPendingTransactionsUseCase,
private val updateDelayedNetworkStatusUseCase: UpdateDelayedNetworkStatusUseCase,
private val stakingYieldBalanceUseCase: FetchStakingYieldBalanceUseCase,
private val getTxHistoryItemsCountUseCase: GetTxHistoryItemsCountUseCase,
private val fetchActionsUseCase: FetchActionsUseCase,
private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter,
private val tokensFeatureToggles: TokensFeatureToggles,
private val fetchCurrencyStatusUseCase: FetchCurrencyStatusUseCase,
@DelayedWork private val coroutineScope: CoroutineScope,
@Assisted private val userWallet: UserWallet,
@Assisted private val cryptoCurrencyStatus: CryptoCurrencyStatus,
@Assisted private val yield: Yield,
) {
fun fullUpdate() {
fun updateAfterTransaction() {
coroutineScope.launch {
listOf(
// we should update network to find pending tx after 1 sec
@ -43,50 +39,42 @@ internal class StakingBalanceUpdater @AssistedInject constructor(
},
// we should update tx history and network for new balances
async {
updateStakeBalance()
fetchCurrencyStatus(delayMillis = BALANCE_UPDATE_DELAY)
},
async {
updateTxHistory()
},
async {
updateNetworkStatuses()
},
async {
updateProcessingActions()
updateStakingActions()
},
).awaitAll()
}
}
suspend fun partialUpdate() {
suspend fun updatePullToRefresh() {
coroutineScope {
listOf(
async {
updateStakeBalance()
fetchCurrencyStatus()
},
async {
updateNetworkStatuses(delay = 0)
},
async {
updateProcessingActions()
updateStakingActions()
},
).awaitAll()
}
}
private suspend fun updateNetworkStatuses(delay: Long = BALANCE_UPDATE_DELAY) {
updateDelayedNetworkStatusUseCase(
userWalletId = userWallet.walletId,
network = cryptoCurrencyStatus.currency.network,
delayMillis = delay,
)
suspend fun updateAfterNavigationToInitial() {
coroutineScope {
async { updateStakingActions() }.await()
}
}
private suspend fun updateStakeBalance() {
stakingYieldBalanceUseCase(
private suspend fun fetchCurrencyStatus(delayMillis: Long = 0L) {
delay(delayMillis)
fetchCurrencyStatusUseCase(
userWalletId = userWallet.walletId,
cryptoCurrency = cryptoCurrencyStatus.currency,
isRefactoringEnabled = tokensFeatureToggles.isStakingLoadingRefactoringEnabled,
id = cryptoCurrencyStatus.currency.id,
refresh = true,
)
}
@ -103,7 +91,7 @@ internal class StakingBalanceUpdater @AssistedInject constructor(
}
}
private suspend fun updateProcessingActions() {
private suspend fun updateStakingActions() {
fetchActionsUseCase(
userWalletId = userWallet.walletId,
cryptoCurrency = cryptoCurrencyStatus.currency,

View file

@ -255,7 +255,7 @@ internal class StakingTransactionSender @AssistedInject constructor(
networkId = cryptoCurrencyStatus.currency.network.id,
).getOrNull() ?: ""
balanceUpdater.fullUpdate()
balanceUpdater.updateAfterTransaction()
onSendSuccess(txUrl)
},
)