Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-05 00:23:39 +05:00
parent b9d30a4d55
commit f209babd03
10 changed files with 55 additions and 6 deletions

View file

@ -168,4 +168,16 @@ internal object StakingDomainModule {
stakingErrorResolver = stakingErrorResolver,
)
}
@Provides
@Singleton
fun provideIsAnyTokenStakedUseCase(
stakingRepository: StakingRepository,
stakingErrorResolver: StakingErrorResolver,
): IsAnyTokenStakedUseCase {
return IsAnyTokenStakedUseCase(
stakingRepository = stakingRepository,
stakingErrorResolver = stakingErrorResolver,
)
}
}

View file

@ -37,10 +37,7 @@ import com.tangem.domain.staking.model.StakingApproval
import com.tangem.domain.staking.model.StakingAvailability
import com.tangem.domain.staking.model.StakingEntryInfo
import com.tangem.domain.staking.model.UnsubmittedTransactionMetadata
import com.tangem.domain.staking.model.stakekit.NetworkType
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.staking.model.stakekit.YieldBalance
import com.tangem.domain.staking.model.stakekit.YieldBalanceList
import com.tangem.domain.staking.model.stakekit.*
import com.tangem.domain.staking.model.stakekit.action.StakingAction
import com.tangem.domain.staking.model.stakekit.action.StakingActionCommonType
import com.tangem.domain.staking.model.stakekit.action.StakingActionType
@ -516,6 +513,16 @@ internal class DefaultStakingRepository(
}
}
override suspend fun isAnyTokenStaked(userWalletId: UserWalletId): Boolean {
return withContext(dispatchers.io) {
stakingBalanceStore.getSyncOrNull(userWalletId)
?.let {
it.isNotEmpty() && it.any { yieldBalance -> yieldBalance.balances.isNotEmpty() }
}
?: false
}
}
private suspend fun createActionRequestBody(
userWalletId: UserWalletId,
network: Network,

View file

@ -0,0 +1,18 @@
package com.tangem.domain.staking
import arrow.core.Either
import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.repositories.StakingErrorResolver
import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.wallets.models.UserWalletId
class IsAnyTokenStakedUseCase(
private val stakingRepository: StakingRepository,
private val stakingErrorResolver: StakingErrorResolver,
) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<StakingError, Boolean> {
return Either
.catch { stakingRepository.isAnyTokenStaked(userWalletId) }
.mapLeft { stakingErrorResolver.resolve(it) }
}
}

View file

@ -83,4 +83,6 @@ interface StakingRepository {
/** Returns staking approval */
fun getStakingApproval(cryptoCurrency: CryptoCurrency): StakingApproval
suspend fun isAnyTokenStaked(userWalletId: UserWalletId): Boolean
}

View file

@ -252,4 +252,6 @@ class MockStakingRepository : StakingRepository {
}
override fun getStakingApproval(cryptoCurrency: CryptoCurrency): StakingApproval = StakingApproval.Empty
override suspend fun isAnyTokenStaked(userWalletId: UserWalletId): Boolean = false
}

View file

@ -57,6 +57,7 @@ internal sealed class StakingStates {
sealed class InitialInfoState : StakingStates() {
data class Data(
override val isPrimaryButtonEnabled: Boolean,
val showBanner: Boolean,
val infoItems: ImmutableList<RoundedListWithDividersItemData>,
val aprRange: TextReference,
val onInfoClick: (InfoType) -> Unit,

View file

@ -15,6 +15,7 @@ import kotlinx.collections.immutable.persistentListOf
internal object InitialStakingStatePreview {
val defaultState = StakingStates.InitialInfoState.Data(
isPrimaryButtonEnabled = true,
showBanner = true,
aprRange = stringReference("2.54-5.12%"),
infoItems = persistentListOf(
RoundedListWithDividersItemData(

View file

@ -36,6 +36,7 @@ internal class SetInitialDataStateTransformer(
private val clickIntents: StakingClickIntents,
private val yield: Yield,
private val isApprovalNeeded: Boolean,
private val isAnyTokenStaked: Boolean,
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
private val userWalletProvider: Provider<UserWallet>,
private val appCurrencyProvider: Provider<AppCurrency>,
@ -79,12 +80,14 @@ internal class SetInitialDataStateTransformer(
}
private fun createInitialInfoState(): StakingStates.InitialInfoState.Data {
val yieldBalance = yieldBalancesConverter.convert(Unit)
return StakingStates.InitialInfoState.Data(
isPrimaryButtonEnabled = !cryptoCurrencyStatusProvider().value.amount.isNullOrZero(),
showBanner = !isAnyTokenStaked && yieldBalance == InnerYieldBalanceState.Empty,
aprRange = getAprRange(yield.validators),
infoItems = getInfoItems(),
onInfoClick = clickIntents::onInfoClick,
yieldBalance = yieldBalancesConverter.convert(Unit),
yieldBalance = yieldBalance,
)
}

View file

@ -75,7 +75,7 @@ internal fun StakingInitialInfoContent(
.background(TangemTheme.colors.background.secondary)
.padding(horizontal = TangemTheme.dimens.spacing16),
) {
if (state.yieldBalance == InnerYieldBalanceState.Empty) {
if (state.showBanner) {
item(key = BANNER_BLOCK_KEY) {
Column(
modifier = Modifier.animateItemPlacement(),

View file

@ -105,6 +105,7 @@ internal class StakingViewModel @Inject constructor(
private val validateTransactionUseCase: ValidateTransactionUseCase,
private val getCurrencyCheckUseCase: GetCurrencyCheckUseCase,
private val isAmountSubtractAvailableUseCase: IsAmountSubtractAvailableUseCase,
private val isAnyTokenStakedUseCase: IsAnyTokenStakedUseCase,
@DelayedWork private val coroutineScope: CoroutineScope,
savedStateHandle: SavedStateHandle,
) : ViewModel(), DefaultLifecycleObserver, StakingClickIntents {
@ -713,6 +714,7 @@ internal class StakingViewModel @Inject constructor(
getCryptoCurrencyStatusSyncUseCase(userWalletId, cryptoCurrencyId).fold(
ifRight = {
feeCryptoCurrencyStatus = getFeePaidCryptoCurrencyStatusSyncUseCase(userWalletId, it).getOrNull()
val isAnyTokenStaked = isAnyTokenStakedUseCase(userWalletId).getOrNull() ?: false
cryptoCurrencyStatus = it
setupApprovalNeeded()
@ -723,6 +725,7 @@ internal class StakingViewModel @Inject constructor(
clickIntents = this@StakingViewModel,
yield = yield,
isApprovalNeeded = stakingApproval is StakingApproval.Needed,
isAnyTokenStaked = isAnyTokenStaked,
cryptoCurrencyStatusProvider = Provider { cryptoCurrencyStatus },
userWalletProvider = Provider { userWallet },
appCurrencyProvider = Provider { appCurrency },