Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-30 13:31:45 +03:00
parent a411d79c10
commit cc6d2533bf
9 changed files with 96 additions and 34 deletions

View file

@ -31,4 +31,5 @@ internal data class YieldSupplyActionUM(
val yieldSupplyFeeUM: YieldSupplyFeeUM,
val isPrimaryButtonEnabled: Boolean,
val isTransactionSending: Boolean,
val isHoldToConfirmEnabled: Boolean,
)

View file

@ -156,6 +156,7 @@ private class YieldSupplyActionContentPreviewProvider : PreviewParameterProvider
),
isPrimaryButtonEnabled = false,
isTransactionSending = false,
isHoldToConfirmEnabled = false,
),
)
}

View file

@ -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(

View file

@ -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,
),
)

View file

@ -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(

View file

@ -49,6 +49,7 @@ internal class YieldSupplyStartEarningEntryModel @Inject constructor(
yieldSupplyFeeUM = YieldSupplyFeeUM.Loading,
isPrimaryButtonEnabled = false,
isTransactionSending = false,
isHoldToConfirmEnabled = false,
),
)

View file

@ -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 = {

View file

@ -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(

View file

@ -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,
),
)