From 904d4bb00654b3e0fbb278971504fb3a84d72868 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Jun 2025 12:32:02 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../impl/presentation/model/StakingModel.kt | 12 +++-- .../state/helpers/StakingBalanceUpdater.kt | 46 +++++++------------ .../state/helpers/StakingTransactionSender.kt | 2 +- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt index 7794e5ff8d..82db22b95a 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/model/StakingModel.kt @@ -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() diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingBalanceUpdater.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingBalanceUpdater.kt index dfeecbeb92..22e12b38e9 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingBalanceUpdater.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingBalanceUpdater.kt @@ -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, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt index e6a8852809..618cbcd3ac 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt @@ -255,7 +255,7 @@ internal class StakingTransactionSender @AssistedInject constructor( networkId = cryptoCurrencyStatus.currency.network.id, ).getOrNull() ?: "" - balanceUpdater.fullUpdate() + balanceUpdater.updateAfterTransaction() onSendSuccess(txUrl) }, )