diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 8a4472cf71..f627d8a830 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -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( diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt index 975bac4246..78c4150057 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/TransactionRepository.kt @@ -31,6 +31,7 @@ interface TransactionRepository { @Suppress("LongParameterList") suspend fun createApprovalTransaction( amount: Amount, + approvalAmount: Amount?, fee: Fee, contractAddress: String, spenderAddress: String, diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt index 2a699deea3..65d69a9d0a 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/CreateApprovalTransactionUseCase.kt @@ -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, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/stub/StakingClickIntentsStub.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/stub/StakingClickIntentsStub.kt index 6c4009304a..716cab0e93 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/stub/StakingClickIntentsStub.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/stub/StakingClickIntentsStub.kt @@ -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?, 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() {} diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/SetApprovalBottomSheetTypeChangeTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/SetApprovalBottomSheetTypeChangeTransformer.kt new file mode 100644 index 0000000000..0e58d0c7eb --- /dev/null +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/SetApprovalBottomSheetTypeChangeTransformer.kt @@ -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 { + 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, + ), + ) + } +} \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/ShowApprovalBottomSheetTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/ShowApprovalBottomSheetTransformer.kt index 4c1c1647f9..b5631913ad 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/ShowApprovalBottomSheetTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/approval/ShowApprovalBottomSheetTransformer.kt @@ -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, ), diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt index dfbede6fa3..4a5d106633 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt @@ -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, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingClickIntents.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingClickIntents.kt index cc84af5ff9..8e55492aa8 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingClickIntents.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingClickIntents.kt @@ -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( diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index 47ea7069b2..a6a90596ef 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -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,