diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt index bcf8f4064e..baa901aeba 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/state/GiveTxPermissionState.kt @@ -42,6 +42,7 @@ enum class ApproveType(val text: TextReference) { data class ApprovePermissionButton( val isEnabled: Boolean, val isLoading: Boolean = false, + val isHoldToConfirm: Boolean = false, val onClick: () -> Unit, ) diff --git a/features/approval/api/src/main/java/com/tangem/features/approval/api/GiveApprovalComponent.kt b/features/approval/api/src/main/java/com/tangem/features/approval/api/GiveApprovalComponent.kt index e2345bbc2d..10506d2ba5 100644 --- a/features/approval/api/src/main/java/com/tangem/features/approval/api/GiveApprovalComponent.kt +++ b/features/approval/api/src/main/java/com/tangem/features/approval/api/GiveApprovalComponent.kt @@ -15,6 +15,7 @@ interface GiveApprovalComponent : ComposableBottomSheetComponent { val amount: String, val spenderAddress: String, val subtitle: TextReference, + val isHoldToConfirm: Boolean = false, val callback: Callback, ) diff --git a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/DefaultGiveApprovalComponent.kt b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/DefaultGiveApprovalComponent.kt index c0102d54a6..756d19c2be 100644 --- a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/DefaultGiveApprovalComponent.kt +++ b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/DefaultGiveApprovalComponent.kt @@ -86,6 +86,7 @@ internal class DefaultGiveApprovalComponent @AssistedInject constructor( walletInteractionIcon = uiState.walletInteractionIcon, isApproveEnabled = uiState.isApproveButtonEnabled, isApproveLoading = uiState.isApproveLoading, + isHoldToConfirm = uiState.isHoldToConfirm, onApproveClick = model::onApproveClick, onCancelClick = model::onCancelClick, onOpenLearnMoreAboutApproveClick = model::onOpenLearnMoreAboutApproveClick, diff --git a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt index 3d328cc6bf..9873b3d65a 100644 --- a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt +++ b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalModel.kt @@ -76,6 +76,7 @@ internal class GiveApprovalModel @Inject constructor( walletInteractionIcon = walletInterationIcon(userWallet), isApproveButtonEnabled = false, isApproveLoading = false, + isHoldToConfirm = params.isHoldToConfirm, ), ) diff --git a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalUM.kt b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalUM.kt index 96fc768b88..38f5698135 100644 --- a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalUM.kt +++ b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/model/GiveApprovalUM.kt @@ -11,4 +11,5 @@ internal data class GiveApprovalUM( @DrawableRes val walletInteractionIcon: Int?, val isApproveButtonEnabled: Boolean, val isApproveLoading: Boolean, + val isHoldToConfirm: Boolean = false, ) \ No newline at end of file diff --git a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/ui/GiveApprovalContent.kt b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/ui/GiveApprovalContent.kt index 2d3386f430..ce70ed4b1c 100644 --- a/features/approval/impl/src/main/java/com/tangem/features/approval/impl/ui/GiveApprovalContent.kt +++ b/features/approval/impl/src/main/java/com/tangem/features/approval/impl/ui/GiveApprovalContent.kt @@ -48,6 +48,7 @@ internal fun GiveApprovalContent( walletInteractionIcon: Int?, isApproveEnabled: Boolean, isApproveLoading: Boolean, + isHoldToConfirm: Boolean, onApproveClick: () -> Unit, onCancelClick: () -> Unit, onOpenLearnMoreAboutApproveClick: () -> Unit, @@ -81,16 +82,28 @@ internal fun GiveApprovalContent( SpacerH(height = TangemTheme.dimens.spacing20) - PrimaryButtonIconEnd( - text = stringResourceSafe(id = CommonUiR.string.common_approve), - iconResId = walletInteractionIcon, - showProgress = isApproveLoading, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = TangemTheme.dimens.spacing16), - onClick = onApproveClick, - enabled = isApproveEnabled, - ) + if (isHoldToConfirm) { + HoldToConfirmButton( + text = stringResourceSafe(id = CommonUiR.string.common_approve), + enabled = isApproveEnabled, + isLoading = isApproveLoading, + onConfirm = onApproveClick, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = TangemTheme.dimens.spacing16), + ) + } else { + PrimaryButtonIconEnd( + text = stringResourceSafe(id = CommonUiR.string.common_approve), + iconResId = walletInteractionIcon, + showProgress = isApproveLoading, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = TangemTheme.dimens.spacing16), + onClick = onApproveClick, + enabled = isApproveEnabled, + ) + } SpacerH12() @@ -309,6 +322,7 @@ private fun GiveApprovalContentPreview( walletInteractionIcon = params.walletInteractionIcon, isApproveEnabled = params.isApproveEnabled, isApproveLoading = params.isApproveLoading, + isHoldToConfirm = false, onApproveClick = {}, onCancelClick = {}, onOpenLearnMoreAboutApproveClick = {}, 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 a45bcd44b5..f4b678091c 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 @@ -1497,6 +1497,7 @@ internal class StakingModel @Inject constructor( id = R.string.give_permission_staking_subtitle, formatArgs = wrappedList(cryptoCurrencyStatus.currency.symbol), ), + isHoldToConfirm = value.shouldShowHoldToConfirmButton, callback = approvalCallback, ) } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetButtonsStateTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetButtonsStateTransformer.kt index 00b3379362..725c5869e8 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetButtonsStateTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetButtonsStateTransformer.kt @@ -44,8 +44,10 @@ internal class SetButtonsStateTransformer( val isConfirmation = prevState.currentStep == StakingStep.Confirmation val isInProgress = innerConfirmState == InnerConfirmationStakingState.IN_PROGRESS val isCompleted = innerConfirmState == InnerConfirmationStakingState.COMPLETED + val isApprovalRequired = prevState.isApprovalRequired() - val isHoldToConfirm = prevState.shouldShowHoldToConfirmButton && isConfirmation && !isCompleted + val isHoldToConfirm = prevState.shouldShowHoldToConfirmButton && + isConfirmation && !isCompleted && !isApprovalRequired val isIconVisible = isConfirmation && !isCompleted && !isHoldToConfirm val isPrimaryButtonDisabled = prevState.isPrimaryButtonDisabled() return NavigationButton( @@ -114,14 +116,9 @@ internal class SetButtonsStateTransformer( private fun StakingUiState.getConfirmationButtonText(): TextReference { val confirmationState = confirmationState as? StakingStates.ConfirmationState.Data ?: return resourceReference(R.string.common_close) - val amountState = amountState as? AmountState.Data - ?: return resourceReference(R.string.common_close) - if (actionType is StakingActionCommonType.Enter) { - val amount = amountState.amountTextField.cryptoAmount.value.orZero() - if (confirmationState.isApprovalNeeded && confirmationState.allowance < amount) { - return resourceReference(R.string.give_permission_title) - } + if (isApprovalRequired()) { + return resourceReference(R.string.give_permission_title) } return getBaseActionText(confirmationState) @@ -151,18 +148,13 @@ internal class SetButtonsStateTransformer( private fun StakingUiState.onConfirmationClick() { val confirmationState = confirmationState as? StakingStates.ConfirmationState.Data - val amountState = amountState as? AmountState.Data - if (confirmationState != null && amountState != null) { + if (confirmationState != null) { if (confirmationState.innerState == InnerConfirmationStakingState.COMPLETED) { clickIntents.onNextClick() + } else if (isApprovalRequired()) { + clickIntents.showApprovalBottomSheet() } else { - val amount = amountState.amountTextField.cryptoAmount.value.orZero() - val isEnterAction = actionType is StakingActionCommonType.Enter - if (isEnterAction && confirmationState.isApprovalNeeded && confirmationState.allowance < amount) { - clickIntents.showApprovalBottomSheet() - } else { - clickIntents.onActionClick() - } + clickIntents.onActionClick() } } else { clickIntents.onBackClick() @@ -177,6 +169,15 @@ internal class SetButtonsStateTransformer( return !hasNotStaking && isCardano && currentStep == StakingStep.InitialInfo } + private fun StakingUiState.isApprovalRequired(): Boolean { + val confirmState = confirmationState as? StakingStates.ConfirmationState.Data ?: return false + val amountState = amountState as? AmountState.Data ?: return false + val amount = amountState.amountTextField.cryptoAmount.value.orZero() + return actionType is StakingActionCommonType.Enter && + confirmState.isApprovalNeeded && + confirmState.allowance < amount + } + private fun StakingUiState.isButtonEnabled(): Boolean { return when (currentStep) { StakingStep.InitialInfo -> initialInfoState.isPrimaryButtonEnabled