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 9e1aaa62ba..70e39f6f9b 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 @@ -93,6 +93,7 @@ import com.tangem.utils.extensions.isSingleItem import com.tangem.utils.extensions.orZero import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch @@ -601,10 +602,20 @@ internal class StakingModel @Inject constructor( override fun onActiveStake(activeStake: BalanceState) { val networkId = cryptoCurrencyStatus.currency.network.rawId - if (isSingleAction(networkId, activeStake)) { + val preferredValidators = yield.validators.filter { it.preferred } + val pendingActions = activeStake.pendingActions.mapNotNull { action -> + if (action.type in listOf(StakingActionType.RESTAKE, StakingActionType.STAKE) && + preferredValidators.isSingleItem() + ) { + null + } else { + action + } + }.toImmutableList() + if (isSingleAction(networkId, pendingActions)) { prepareForConfirmation( balanceType = activeStake.type, - pendingActions = activeStake.pendingActions, + pendingActions = pendingActions, balanceState = activeStake, validator = activeStake.validator, amountValue = activeStake.cryptoValue, @@ -613,7 +624,7 @@ internal class StakingModel @Inject constructor( } else { stateController.update( ShowActionSelectorBottomSheetTransformer( - pendingActions = withStubUnstakeAction(networkId, activeStake), + pendingActions = withStubUnstakeAction(networkId, pendingActions, activeStake), onActionSelect = { action -> prepareForConfirmation( balanceType = activeStake.type, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingPendingActionUtils.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingPendingActionUtils.kt index 6ef20b93a9..d229b97f60 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingPendingActionUtils.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/utils/StakingPendingActionUtils.kt @@ -37,17 +37,21 @@ internal fun StakingActionType?.getPendingActionTitle(): TextReference = when (t null -> TextReference.EMPTY } -internal fun isSingleAction(networkId: String, activeStake: BalanceState): Boolean { - val isSingleAction = activeStake.pendingActions.size <= 1 // Either single or none pending actions - val isCompositePendingActions = isCompositePendingActions(networkId, activeStake.pendingActions) - val isRestake = activeStake.pendingActions.any { it.type.isRestake } +internal fun isSingleAction(networkId: String, pendingActions: List): Boolean { + val isSingleAction = pendingActions.size <= 1 // Either single or none pending actions + val isCompositePendingActions = isCompositePendingActions(networkId, pendingActions.toPersistentList()) + val isRestake = pendingActions.any { it.type.isRestake } return isSingleAction && !isRestake || isCompositePendingActions } -internal fun withStubUnstakeAction(networkId: String, activeStake: BalanceState): ImmutableList { +internal fun withStubUnstakeAction( + networkId: String, + pendingActions: List, + activeStake: BalanceState, +): ImmutableList { return if (isStubUnstakeAction(networkId) && activeStake.type != BalanceType.REWARDS) { - activeStake.pendingActions.plus( + pendingActions.plus( PendingAction( type = StakingActionType.UNSTAKE, passthrough = "",