Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-04 13:37:46 +05:00
commit 7fc62c9e82
11 changed files with 42 additions and 13 deletions

View file

@ -29,8 +29,9 @@ class YieldConverter(
validators = value.validators
.asSequence()
.filter { it.status == ValidatorStatusDTO.ACTIVE }
.sortedByDescending { it.apr }
.map { convertValidator(it) }
.sortedByDescending { it.isStrategicPartner }
.sortedByDescending { it.apr }
.toImmutableList(),
isAvailable = value.isAvailable,
)

View file

@ -8,6 +8,7 @@ import com.tangem.domain.staking.model.stakekit.StakingError
import com.tangem.domain.staking.repositories.StakingErrorResolver
import com.tangem.domain.staking.repositories.StakingPendingTransactionRepository
import com.tangem.domain.wallets.models.UserWalletId
import org.joda.time.DateTime
import java.util.UUID
class InvalidatePendingTransactionsUseCase(
@ -40,12 +41,12 @@ class InvalidatePendingTransactionsUseCase(
newBalancesId: Int,
pendingData: List<Pair<PendingTransaction, BalanceItem>>,
): Pair<List<BalanceItem>, List<PendingTransaction>> {
val balances = realData.associateBy { Triple(it.groupId, it.type, it.amount) }.toMutableMap()
val balances = realData.associateBy { Pair(it.groupId to it.type, it.amount to it.date) }.toMutableMap()
val transactionsToRemove = mutableListOf<PendingTransaction>()
pendingData.forEach { (pendingTransaction, balanceItem) ->
val key = Triple(balanceItem.groupId, balanceItem.type, balanceItem.amount)
val key = Pair(balanceItem.groupId to balanceItem.type, balanceItem.amount to balanceItem.date)
val oldBalancesId = pendingTransaction.balancesId
when {
@ -57,7 +58,8 @@ class InvalidatePendingTransactionsUseCase(
}
else -> {
val groupId = UUID.randomUUID().toString()
balances[Triple(groupId, BalanceType.STAKED, pendingTransaction.amount)] = BalanceItem(
val now = DateTime.now()
balances[Pair(groupId to BalanceType.STAKED, pendingTransaction.amount to now)] = BalanceItem(
groupId = groupId,
type = pendingTransaction.type,
amount = pendingTransaction.amount,

View file

@ -7,6 +7,7 @@ import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.RewardBlockType
import com.tangem.domain.staking.model.stakekit.Yield
import kotlinx.collections.immutable.ImmutableList
import org.joda.time.DateTime
import java.math.BigDecimal
internal sealed class InnerYieldBalanceState {
@ -35,4 +36,5 @@ internal data class BalanceState(
val validator: Yield.Validator?,
val pendingActions: ImmutableList<PendingAction>,
val isPending: Boolean,
val date: DateTime,
)

View file

@ -63,6 +63,7 @@ internal class BalanceItemConverter(
pendingActions = value.pendingActions.toPersistentList(),
isClickable = value.type.isClickable() && !value.isPending,
isPending = value.isPending,
date = value.date ?: DateTime.now(),
)
}
}

View file

@ -14,6 +14,7 @@ import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.utils.Provider
import com.tangem.utils.converter.Converter
import kotlinx.collections.immutable.toPersistentList
import org.joda.time.DateTime
import java.math.BigDecimal
internal class RewardsValidatorStateConverter(
@ -91,6 +92,7 @@ internal class RewardsValidatorStateConverter(
isClickable = true,
type = balance.type,
isPending = balance.isPending,
date = balance.date ?: DateTime.now(),
)
}
}

View file

@ -12,6 +12,7 @@ import com.tangem.features.staking.impl.presentation.state.BalanceState
import com.tangem.features.staking.impl.presentation.state.InnerYieldBalanceState
import com.tangem.features.staking.impl.presentation.state.StakingStates
import kotlinx.collections.immutable.persistentListOf
import org.joda.time.DateTime
internal object InitialStakingStatePreview {
val defaultState = StakingStates.InitialInfoState.Data(
@ -93,6 +94,7 @@ internal object InitialStakingStatePreview {
type = BalanceType.STAKED,
subtitle = null,
isPending = false,
date = DateTime.now(),
),
),
),

View file

@ -33,6 +33,8 @@ internal object StakingClickIntentsStub : StakingClickIntents {
override fun onInfoClick(infoType: InfoType) {}
override fun onEnterClick() {}
override fun onAmountValueChange(value: String) {}
override fun onAmountPasteTriggerDismiss() {}

View file

@ -140,10 +140,7 @@ internal class SetButtonsStateTransformer(
private fun StakingUiState.onPrimaryClick() {
when (currentStep) {
StakingStep.InitialInfo -> {
clickIntents.onAmountValueChange("") // reset amount state
clickIntents.onNextClick(StakingActionCommonType.ENTER)
}
StakingStep.InitialInfo -> clickIntents.onEnterClick()
StakingStep.Validators -> {
if (confirmationState is StakingStates.ConfirmationState.Data) {
clickIntents.onNextClick(
@ -154,9 +151,7 @@ internal class SetButtonsStateTransformer(
clickIntents.onNextClick()
}
}
StakingStep.Amount -> {
clickIntents.onNextClick()
}
StakingStep.Amount -> clickIntents.onNextClick()
StakingStep.Confirmation -> onConfirmationClick()
StakingStep.RewardsValidators -> Unit
}

View file

@ -3,7 +3,6 @@ package com.tangem.features.staking.impl.presentation.state.transformers
import com.tangem.features.staking.impl.presentation.state.InnerConfirmationStakingState
import com.tangem.features.staking.impl.presentation.state.StakingStates
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.features.staking.impl.presentation.state.ValidatorState
import com.tangem.utils.transformer.Transformer
internal object SetConfirmationStateResetAssentTransformer : Transformer<StakingUiState> {
@ -14,7 +13,7 @@ internal object SetConfirmationStateResetAssentTransformer : Transformer<Staking
confirmationState.copy(
isPrimaryButtonEnabled = true,
innerState = InnerConfirmationStakingState.ASSENT,
validatorState = ValidatorState.Loading,
validatorState = confirmationState.validatorState.copySealed(isClickable = true),
)
} else {
confirmationState

View file

@ -33,6 +33,8 @@ internal interface StakingClickIntents : AmountScreenClickIntents {
fun onInfoClick(infoType: InfoType)
fun onEnterClick()
fun getFee(pendingAction: PendingAction?, pendingActions: ImmutableList<PendingAction>?)
override fun onAmountNext() = onNextClick(actionTypeToOverwrite = null)

View file

@ -388,6 +388,27 @@ internal class StakingViewModel @Inject constructor(
)
}
override fun onEnterClick() {
onAmountValueChange("") // reset amount state
// TODO refactor in [REDACTED_JIRA]
val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data
val filteredValidator = yield.validators.filter { it.preferred }
stateController.update {
value.copy(
confirmationState = confirmationState?.copy(
validatorState = ValidatorState.Content(
isClickable = true,
chosenValidator = filteredValidator[0],
availableValidators = filteredValidator,
),
) as StakingStates.ConfirmationState,
)
}
onNextClick(StakingActionCommonType.ENTER)
}
override fun onAmountValueChange(value: String) {
stateController.update(AmountChangeStateTransformer(cryptoCurrencyStatus, value, yield))
}