Updated on 2026-08-14
This commit is contained in:
parent
d7b51a7b94
commit
6c04292b22
9 changed files with 50 additions and 13 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ interface TransactionRepository {
|
|||
@Suppress("LongParameterList")
|
||||
suspend fun createApprovalTransaction(
|
||||
amount: Amount,
|
||||
approvalAmount: Amount?,
|
||||
fee: Fee,
|
||||
contractAddress: String,
|
||||
spenderAddress: String,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue