From cc6d2533bf63ce71f338773e76f4fa2c69fcbc3e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 30 Jan 2026 13:31:45 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../impl/common/entity/YieldSupplyFeeUM.kt | 1 + .../common/ui/YieldSupplyActionContent.kt | 1 + .../approve/YieldSupplyApproveComponent.kt | 35 ++++++++++---- .../approve/model/YieldSupplyApproveModel.kt | 2 + .../YieldSupplyStartEarningComponent.kt | 46 +++++++++++++------ .../YieldSupplyStartEarningEntryModel.kt | 1 + .../model/YieldSupplyStartEarningModel.kt | 5 ++ .../YieldSupplyStopEarningComponent.kt | 37 +++++++++++---- .../model/YieldSupplyStopEarningModel.kt | 2 + 9 files changed, 96 insertions(+), 34 deletions(-) diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/entity/YieldSupplyFeeUM.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/entity/YieldSupplyFeeUM.kt index 20e09cc6cb..5b2edf1a67 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/entity/YieldSupplyFeeUM.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/entity/YieldSupplyFeeUM.kt @@ -31,4 +31,5 @@ internal data class YieldSupplyActionUM( val yieldSupplyFeeUM: YieldSupplyFeeUM, val isPrimaryButtonEnabled: Boolean, val isTransactionSending: Boolean, + val isHoldToConfirmEnabled: Boolean, ) \ No newline at end of file diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/ui/YieldSupplyActionContent.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/ui/YieldSupplyActionContent.kt index 71645d1247..f45cde0551 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/ui/YieldSupplyActionContent.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/common/ui/YieldSupplyActionContent.kt @@ -156,6 +156,7 @@ private class YieldSupplyActionContentPreviewProvider : PreviewParameterProvider ), isPrimaryButtonEnabled = false, isTransactionSending = false, + isHoldToConfirmEnabled = false, ), ) } diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/YieldSupplyApproveComponent.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/YieldSupplyApproveComponent.kt index 9e641d0513..f56edfc633 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/YieldSupplyApproveComponent.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/YieldSupplyApproveComponent.kt @@ -18,7 +18,9 @@ import com.tangem.common.ui.userwallet.ext.walletInterationIcon import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.components.HoldToConfirmButton import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.R as CoreR import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle @@ -74,15 +76,30 @@ internal class YieldSupplyApproveComponent( ) }, footer = { - PrimaryButtonIconEnd( - text = stringResourceSafe(R.string.common_confirm), - onClick = model::onClick, - iconResId = walletInterationIcon(params.userWallet), - enabled = state.isPrimaryButtonEnabled, - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - ) + val modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + + if (state.isHoldToConfirmEnabled) { + HoldToConfirmButton( + text = stringResourceSafe( + CoreR.string.common_hold_to, + stringResourceSafe(R.string.common_confirm), + ), + onConfirm = model::onClick, + enabled = state.isPrimaryButtonEnabled, + isLoading = state.isTransactionSending, + modifier = modifier, + ) + } else { + PrimaryButtonIconEnd( + text = stringResourceSafe(R.string.common_confirm), + onClick = model::onClick, + iconResId = walletInterationIcon(params.userWallet), + enabled = state.isPrimaryButtonEnabled, + modifier = modifier, + ) + } }, content = { YieldSupplyActionContent( diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt index 88123f909a..ca94e2df0c 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/approve/model/YieldSupplyApproveModel.kt @@ -18,6 +18,7 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus +import com.tangem.domain.models.wallet.isHotWallet import com.tangem.domain.tokens.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.transaction.usecase.CreateApprovalTransactionUseCase import com.tangem.domain.transaction.usecase.GetFeeUseCase @@ -95,6 +96,7 @@ internal class YieldSupplyApproveModel @Inject constructor( yieldSupplyFeeUM = YieldSupplyFeeUM.Loading, isPrimaryButtonEnabled = false, isTransactionSending = false, + isHoldToConfirmEnabled = params.userWallet.isHotWallet, ), ) diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/YieldSupplyStartEarningComponent.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/YieldSupplyStartEarningComponent.kt index 1783ee53c8..c7957a5d41 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/YieldSupplyStartEarningComponent.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/YieldSupplyStartEarningComponent.kt @@ -17,6 +17,7 @@ import com.tangem.common.ui.userwallet.ext.walletInterationIcon import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.components.HoldToConfirmButton import com.tangem.core.ui.components.PrimaryButtonIconEnd import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle import com.tangem.core.ui.components.currency.icon.CurrencyIcon @@ -25,6 +26,7 @@ import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.core.ui.R as CoreR import com.tangem.features.yield.supply.impl.R import com.tangem.features.yield.supply.impl.common.entity.YieldSupplyActionUM import com.tangem.features.yield.supply.impl.common.entity.YieldSupplyFeeUM @@ -106,22 +108,36 @@ internal class YieldSupplyStartEarningComponent( override fun Footer() { val state by model.uiState.collectAsStateWithLifecycle() - val icon = if (state.isPrimaryButtonEnabled) { - walletInterationIcon(model.userWallet) - } else { - null - } + val modifier = Modifier + .fillMaxWidth() + .padding(16.dp) - PrimaryButtonIconEnd( - text = stringResourceSafe(R.string.yield_module_start_earning), - onClick = model::onClick, - enabled = state.isPrimaryButtonEnabled, - iconResId = icon, - showProgress = state.isTransactionSending, - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - ) + if (state.isHoldToConfirmEnabled) { + HoldToConfirmButton( + text = stringResourceSafe( + CoreR.string.common_hold_to, + stringResourceSafe(R.string.yield_module_start_earning), + ), + onConfirm = model::onClick, + enabled = state.isPrimaryButtonEnabled, + isLoading = state.isTransactionSending, + modifier = modifier, + ) + } else { + val icon = if (state.isPrimaryButtonEnabled) { + walletInterationIcon(model.userWallet) + } else { + null + } + PrimaryButtonIconEnd( + text = stringResourceSafe(R.string.yield_module_start_earning), + onClick = model::onClick, + enabled = state.isPrimaryButtonEnabled, + iconResId = icon, + showProgress = state.isTransactionSending, + modifier = modifier, + ) + } } data class Params( diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningEntryModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningEntryModel.kt index 88108f3a9d..62a991685c 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningEntryModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningEntryModel.kt @@ -49,6 +49,7 @@ internal class YieldSupplyStartEarningEntryModel @Inject constructor( yieldSupplyFeeUM = YieldSupplyFeeUM.Loading, isPrimaryButtonEnabled = false, isTransactionSending = false, + isHoldToConfirmEnabled = false, ), ) diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt index c5fda7511e..ce6782467d 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/startearning/model/YieldSupplyStartEarningModel.kt @@ -15,6 +15,7 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.models.wallet.isHotWallet import com.tangem.domain.tokens.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.tokens.GetSingleCryptoCurrencyStatusUseCase import com.tangem.domain.transaction.error.GetFeeError @@ -107,6 +108,7 @@ internal class YieldSupplyStartEarningModel @Inject constructor( yieldSupplyFeeUM = YieldSupplyFeeUM.Loading, isPrimaryButtonEnabled = false, isTransactionSending = false, + isHoldToConfirmEnabled = false, ), ) @@ -307,6 +309,9 @@ internal class YieldSupplyStartEarningModel @Inject constructor( getUserWalletUseCase(userWalletId).fold( ifRight = { wallet -> userWallet = wallet + uiState.update { + it.copy(isHoldToConfirmEnabled = wallet.isHotWallet) + } getCurrenciesStatusUpdates() }, ifLeft = { diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/YieldSupplyStopEarningComponent.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/YieldSupplyStopEarningComponent.kt index d67dc087bb..eae26ea8e1 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/YieldSupplyStopEarningComponent.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/YieldSupplyStopEarningComponent.kt @@ -19,7 +19,9 @@ import com.tangem.common.ui.userwallet.ext.walletInterationIcon import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.child import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.components.HoldToConfirmButton import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.R as CoreR import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle @@ -78,16 +80,31 @@ internal class YieldSupplyStopEarningComponent( ) }, footer = { - PrimaryButtonIconEnd( - text = stringResourceSafe(R.string.common_confirm), - onClick = model::onClick, - iconResId = walletInterationIcon(params.userWallet), - enabled = state.isPrimaryButtonEnabled, - showProgress = state.isTransactionSending, - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - ) + val modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + + if (state.isHoldToConfirmEnabled) { + HoldToConfirmButton( + text = stringResourceSafe( + CoreR.string.common_hold_to, + stringResourceSafe(R.string.common_confirm), + ), + onConfirm = model::onClick, + enabled = state.isPrimaryButtonEnabled, + isLoading = state.isTransactionSending, + modifier = modifier, + ) + } else { + PrimaryButtonIconEnd( + text = stringResourceSafe(R.string.common_confirm), + onClick = model::onClick, + iconResId = walletInterationIcon(params.userWallet), + enabled = state.isPrimaryButtonEnabled, + showProgress = state.isTransactionSending, + modifier = modifier, + ) + } }, content = { YieldSupplyActionContent( diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt index fc7f22db11..875b0b0fb4 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/subcomponents/stopearning/model/YieldSupplyStopEarningModel.kt @@ -15,6 +15,7 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus +import com.tangem.domain.models.wallet.isHotWallet import com.tangem.domain.tokens.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.transaction.usecase.GetFeeUseCase import com.tangem.domain.transaction.usecase.SendTransactionUseCase @@ -99,6 +100,7 @@ internal class YieldSupplyStopEarningModel @Inject constructor( yieldSupplyFeeUM = YieldSupplyFeeUM.Loading, isPrimaryButtonEnabled = false, isTransactionSending = false, + isHoldToConfirmEnabled = params.userWallet.isHotWallet, ), )