Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-10 19:37:26 +05:00
parent d7b51a7b94
commit 6c04292b22
9 changed files with 50 additions and 13 deletions

View file

@ -66,6 +66,7 @@ internal class DefaultTransactionRepository(
override suspend fun createApprovalTransaction(
amount: Amount,
approvalAmount: Amount?,
fee: Fee,
contractAddress: String,
spenderAddress: String,
@ -83,7 +84,7 @@ internal class DefaultTransactionRepository(
val approvalData = approver.getApproveData(
spenderAddress = spenderAddress,
value = amount,
value = approvalAmount,
)
val extras = createTransactionDataExtras(

View file

@ -31,6 +31,7 @@ interface TransactionRepository {
@Suppress("LongParameterList")
suspend fun createApprovalTransaction(
amount: Amount,
approvalAmount: Amount?,
fee: Fee,
contractAddress: String,
spenderAddress: String,

View file

@ -16,14 +16,15 @@ class CreateApprovalTransactionUseCase(
suspend operator fun invoke(
cryptoCurrency: CryptoCurrency.Token,
userWalletId: UserWalletId,
amount: BigDecimal,
amount: BigDecimal?,
fee: Fee,
contractAddress: String,
spenderAddress: String,
hash: String? = null,
) = Either.catch {
transactionRepository.createApprovalTransaction(
amount = amount.convertToSdkAmount(cryptoCurrency),
amount = BigDecimal.ZERO.convertToSdkAmount(cryptoCurrency),
approvalAmount = amount?.convertToSdkAmount(cryptoCurrency),
contractAddress = contractAddress,
spenderAddress = spenderAddress,
userWalletId = userWalletId,

View file

@ -1,5 +1,6 @@
package com.tangem.features.staking.impl.presentation.state.stub
import com.tangem.common.ui.bottomsheet.permission.state.ApproveType
import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.Yield
@ -21,7 +22,8 @@ internal object StakingClickIntentsStub : StakingClickIntents {
pendingAction: PendingAction?,
pendingActions: ImmutableList<PendingAction>?,
balanceState: BalanceState?,
) { }
) {
}
override fun onActionClick() {}
@ -53,6 +55,8 @@ internal object StakingClickIntentsStub : StakingClickIntents {
override fun showApprovalBottomSheet() {}
override fun onApproveTypeChange(approveType: ApproveType) {}
override fun onApprovalClick() {}
override fun onExploreClick() {}

View file

@ -0,0 +1,23 @@
package com.tangem.features.staking.impl.presentation.state.transformers.approval
import com.tangem.common.ui.bottomsheet.permission.state.ApproveType
import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.features.staking.impl.presentation.state.StakingUiState
import com.tangem.utils.transformer.Transformer
internal class SetApprovalBottomSheetTypeChangeTransformer(
private val approveType: ApproveType,
) : Transformer<StakingUiState> {
override fun transform(prevState: StakingUiState): StakingUiState {
val approvalBottomSheetConfig = prevState.bottomSheetConfig?.content as? GiveTxPermissionBottomSheetConfig
return prevState.copy(
bottomSheetConfig = prevState.bottomSheetConfig?.copy(
content = approvalBottomSheetConfig?.copy(
data = approvalBottomSheetConfig.data.copy(approveType = approveType),
) as TangemBottomSheetConfigContent,
),
)
}
}

View file

@ -72,6 +72,7 @@ internal class ShowApprovalBottomSheetTransformer(
formatArgs = wrappedList(cryptoCurrency.symbol),
),
dialogText = resourceReference(R.string.give_permission_staking_footer),
onChangeApproveType = prevState.clickIntents::onApproveTypeChange,
),
onCancel = onDismiss,
),

View file

@ -1,7 +1,6 @@
package com.tangem.features.staking.impl.presentation.ui
import android.content.res.Configuration
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@ -9,7 +8,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi
@ -65,7 +63,7 @@ private const val STAKING_REWARD_BLOCK_KEY = "StakingRewardBlock"
private const val ACTIVE_STAKING_BLOCK_KEY = "ActiveStakingBlock"
private const val STAKE_PRIMARY_BUTTON_KEY = "StakePrimaryButton"
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterialApi::class)
@Composable
internal fun StakingInitialInfoContent(
state: StakingStates.InitialInfoState,

View file

@ -1,6 +1,7 @@
package com.tangem.features.staking.impl.presentation.viewmodel
import com.tangem.common.ui.amountScreen.AmountScreenClickIntents
import com.tangem.common.ui.bottomsheet.permission.state.ApproveType
import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.domain.staking.model.stakekit.PendingAction
import com.tangem.domain.staking.model.stakekit.Yield
@ -51,6 +52,8 @@ internal interface StakingClickIntents : AmountScreenClickIntents {
fun showApprovalBottomSheet()
fun onApproveTypeChange(approveType: ApproveType)
fun onApprovalClick()
fun onAmountReduceByClick(

View file

@ -11,6 +11,8 @@ import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.bundle.unbundle
import com.tangem.common.ui.amountScreen.converters.AmountReduceByTransformer
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.bottomsheet.permission.state.ApproveType
import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionBottomSheetConfig
import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.ui.haptic.TangemHapticEffect
@ -59,10 +61,7 @@ import com.tangem.features.staking.impl.presentation.state.helpers.StakingFeeTra
import com.tangem.features.staking.impl.presentation.state.helpers.StakingTransactionSender
import com.tangem.features.staking.impl.presentation.state.transformers.*
import com.tangem.features.staking.impl.presentation.state.transformers.amount.*
import com.tangem.features.staking.impl.presentation.state.transformers.approval.SetApprovalBottomSheetInProgressTransformer
import com.tangem.features.staking.impl.presentation.state.transformers.approval.SetApprovalInProgressTransformer
import com.tangem.features.staking.impl.presentation.state.transformers.approval.SetConfirmationStateAssentApprovalTransformer
import com.tangem.features.staking.impl.presentation.state.transformers.approval.ShowApprovalBottomSheetTransformer
import com.tangem.features.staking.impl.presentation.state.transformers.approval.*
import com.tangem.features.staking.impl.presentation.state.transformers.validator.ValidatorSelectChangeTransformer
import com.tangem.features.staking.impl.presentation.state.utils.isSolanaWithdraw
import com.tangem.utils.Provider
@ -562,6 +561,10 @@ internal class StakingViewModel @Inject constructor(
)
}
override fun onApproveTypeChange(approveType: ApproveType) {
stateController.update(SetApprovalBottomSheetTypeChangeTransformer(approveType))
}
override fun onApprovalClick() {
viewModelScope.launch {
stateController.update(
@ -573,15 +576,17 @@ internal class StakingViewModel @Inject constructor(
val tokenCryptoCurrency =
cryptoCurrencyStatus.currency as? CryptoCurrency.Token ?: error("No token currency")
val amountValue = (value.amountState as? AmountState.Data)?.amountTextField?.cryptoAmount?.value
?: error("No amount provided")
val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data
?: error("No confirmation state")
val fee = (confirmationState.feeState as? FeeState.Content)?.fee ?: error("No fee provided")
val approval = stakingApproval as? StakingApproval.Needed ?: error("No staking approve spender address")
val approvalBottomSheetConfig = value.bottomSheetConfig?.content as? GiveTxPermissionBottomSheetConfig
val isLimitedApproval = approvalBottomSheetConfig?.data?.approveType == ApproveType.LIMITED
val approvalTransaction = createApprovalTransactionUseCase(
amount = amountValue,
amount = amountValue.takeIf { isLimitedApproval },
contractAddress = tokenCryptoCurrency.contractAddress,
spenderAddress = approval.spenderAddress,
fee = fee,