Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-24 18:44:09 +05:00
parent ff2907e26e
commit 957bb0dd56
13 changed files with 159 additions and 61 deletions

View file

@ -113,7 +113,6 @@ internal class YieldBalancesConverter(
private fun BalanceType.toGroup() = when (this) {
BalanceType.PREPARING,
BalanceType.STAKED,
BalanceType.REWARDS,
BalanceType.AVAILABLE,
BalanceType.LOCKED,
-> BalanceGroupType.ACTIVE
@ -121,6 +120,7 @@ internal class YieldBalancesConverter(
BalanceType.UNLOCKING,
BalanceType.UNSTAKED,
-> BalanceGroupType.UNSTAKED
BalanceType.REWARDS,
BalanceType.UNKNOWN,
-> BalanceGroupType.UNKNOWN
}

View file

@ -12,13 +12,11 @@ internal class AmountChangeStateTransformer(
private val value: String,
) : Transformer<StakingUiState> {
private val amountRequirementStateTransformer by lazy(LazyThreadSafetyMode.NONE) {
AmountRequirementStateTransformer(
cryptoCurrencyStatus,
yield,
value,
)
}
private val amountRequirementStateTransformer = AmountRequirementStateTransformer(
cryptoCurrencyStatus,
yield,
value,
)
override fun transform(prevState: StakingUiState): StakingUiState {
val updatedAmountState = AmountFieldChangeTransformer(

View file

@ -12,16 +12,13 @@ internal class AmountMaxValueStateTransformer(
private val yield: Yield,
) : Transformer<StakingUiState> {
private val amountRequirementStateTransformer by lazy(LazyThreadSafetyMode.NONE) {
val value = cryptoCurrencyStatus.value.amount
private val amountRequirementStateTransformer = AmountRequirementStateTransformer(
cryptoCurrencyStatus = cryptoCurrencyStatus,
yield = yield,
value = cryptoCurrencyStatus.value.amount
?.parseBigDecimal(cryptoCurrencyStatus.currency.decimals)
.orEmpty()
AmountRequirementStateTransformer(
cryptoCurrencyStatus,
yield,
value,
)
}
.orEmpty(),
)
override fun transform(prevState: StakingUiState): StakingUiState {
val updatedAmountState = AmountFieldMaxAmountTransformer(cryptoCurrencyStatus).transform(prevState.amountState)

View file

@ -6,6 +6,7 @@ import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.core.ui.utils.parseToBigDecimal
import com.tangem.domain.staking.model.stakekit.AddressArgument
import com.tangem.domain.staking.model.stakekit.Yield
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.staking.impl.R
@ -18,38 +19,47 @@ internal class AmountRequirementStateTransformer(
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
val amountRequirements = yield.args.enter.args[Yield.Args.ArgType.AMOUNT]
val amountDecimal = value.parseToBigDecimal(cryptoCurrencyStatus.currency.decimals)
return if (prevState !is AmountState.Data || amountRequirements == null) {
prevState
} else {
val isAlreadyErrorState = prevState.amountTextField.isError
val isAmountRequired = amountRequirements.required
val isAmountZero = amountDecimal.isZero()
val isExceedsRequirements =
amountRequirements.maximum?.compareTo(amountDecimal) == -1 ||
amountRequirements.minimum?.compareTo(amountDecimal) == 1
updateWithError(prevState, amountRequirements)
}
}
val isRequirementError = !isAmountZero && isAmountRequired && isExceedsRequirements && !isAlreadyErrorState
if (isRequirementError) {
prevState.copy(
amountTextField = prevState.amountTextField.copy(
isError = true,
error = resourceReference(
R.string.staking_amount_requirement_error,
wrappedList(
BigDecimalFormatter.formatCryptoAmount(
amountRequirements.minimum,
cryptoCurrencyStatus.currency.symbol,
cryptoCurrencyStatus.currency.decimals,
),
private fun updateWithError(prevState: AmountState.Data, amountRequirements: AddressArgument): AmountState {
val isRequirementError = isRequirementError(prevState, amountRequirements)
return if (isRequirementError) {
prevState.copy(
amountTextField = prevState.amountTextField.copy(
isError = true,
error = resourceReference(
R.string.staking_amount_requirement_error,
wrappedList(
BigDecimalFormatter.formatCryptoAmount(
amountRequirements.minimum,
cryptoCurrencyStatus.currency.symbol,
cryptoCurrencyStatus.currency.decimals,
),
),
),
)
} else {
prevState
}
),
)
} else {
prevState
}
}
private fun isRequirementError(prevState: AmountState.Data, amountRequirements: AddressArgument): Boolean {
val amountDecimal = value.parseToBigDecimal(cryptoCurrencyStatus.currency.decimals)
val isAlreadyErrorState = prevState.amountTextField.isError
val isAmountRequired = amountRequirements.required
val isAmountZero = amountDecimal.isZero()
val isExceedsRequirements =
amountRequirements.maximum?.compareTo(amountDecimal) == -1 ||
amountRequirements.minimum?.compareTo(amountDecimal) == 1
return !isAmountZero && isAmountRequired && isExceedsRequirements && !isAlreadyErrorState
}
}

View file

@ -120,6 +120,8 @@ internal class StakingViewModel @Inject constructor(
val pendingActions = confirmationState.pendingActions
val stakingTransaction = getStakingTransactionUseCase(
userWalletId = userWalletId,
network = cryptoCurrencyStatus.currency.network,
params = ActionParams(
actionCommonType = getStakingCommonType(),
integrationId = yield.id,
@ -158,6 +160,8 @@ internal class StakingViewModel @Inject constructor(
val cryptoCurrencyValue = cryptoCurrencyStatus.value
val stakingGasEstimate = estimateGasUseCase(
userWalletId = userWalletId,
network = cryptoCurrencyStatus.currency.network,
params = ActionParams(
actionCommonType = getStakingCommonType(),
integrationId = yield.id,