Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-28 15:57:25 +03:00
parent 5037fabe32
commit fa934e9847
3 changed files with 63 additions and 37 deletions

View file

@ -24,6 +24,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.common.ui.navigationButtons.preview.NavigationButtonsPreview import com.tangem.common.ui.navigationButtons.preview.NavigationButtonsPreview
import com.tangem.core.ui.components.HoldToConfirmButton
import com.tangem.core.ui.components.Keyboard import com.tangem.core.ui.components.Keyboard
import com.tangem.core.ui.components.SecondaryButtonIconStart import com.tangem.core.ui.components.SecondaryButtonIconStart
import com.tangem.core.ui.components.buttons.common.TangemButton import com.tangem.core.ui.components.buttons.common.TangemButton
@ -98,6 +99,19 @@ fun NavigationPrimaryButton(primaryButton: NavigationButton?, modifier: Modifier
modifier = modifier.fillMaxWidth(), modifier = modifier.fillMaxWidth(),
) { button -> ) { button ->
if (button != null && button.textReference != TextReference.EMPTY) { if (button != null && button.textReference != TextReference.EMPTY) {
if (button.isHoldToConfirm) {
HoldToConfirmButton(
text = button.textReference.resolveReference(),
enabled = button.isEnabled,
isLoading = button.shouldShowProgress,
onConfirm = {
GlobalMultipleClickPreventer.processEvent {
button.onClick()
}
},
modifier = Modifier.fillMaxWidth(),
)
} else {
val icon = if (button.iconRes != null && button.isIconVisible) { val icon = if (button.iconRes != null && button.isIconVisible) {
TangemButtonIconPosition.End(iconResId = button.iconRes) TangemButtonIconPosition.End(iconResId = button.iconRes)
} else { } else {
@ -126,6 +140,7 @@ fun NavigationPrimaryButton(primaryButton: NavigationButton?, modifier: Modifier
icon = icon, icon = icon,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) )
}
} else { } else {
Spacer(modifier = Modifier.fillMaxWidth()) Spacer(modifier = Modifier.fillMaxWidth())
} }

View file

@ -34,5 +34,6 @@ data class NavigationButton(
val isEnabled: Boolean = true, val isEnabled: Boolean = true,
val isDimmed: Boolean = false, val isDimmed: Boolean = false,
val isHapticClick: Boolean = false, val isHapticClick: Boolean = false,
val isHoldToConfirm: Boolean = false,
val onClick: () -> Unit, val onClick: () -> Unit,
) )

View file

@ -18,8 +18,11 @@ import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.navigation.Router import com.tangem.core.decompose.navigation.Router
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.express.models.ExpressOperationType import com.tangem.domain.express.models.ExpressOperationType
import com.tangem.domain.models.wallet.isHotWallet
import com.tangem.domain.express.models.ExpressProviderType import com.tangem.domain.express.models.ExpressProviderType
import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.currency.CryptoCurrencyStatus
@ -486,6 +489,7 @@ internal class SendWithSwapConfirmModel @Inject constructor(
}.onEach { (state, _) -> }.onEach { (state, _) ->
val confirmUM = state.confirmUM val confirmUM = state.confirmUM
val isReadyToSend = confirmUM is ConfirmUM.Content && !confirmUM.isTransactionInProcess val isReadyToSend = confirmUM is ConfirmUM.Content && !confirmUM.isTransactionInProcess
val isHoldToConfirm = params.userWallet.isHotWallet && confirmUM is ConfirmUM.Content
params.callback.onResult( params.callback.onResult(
route = SendWithSwapRoute.Confirm, route = SendWithSwapRoute.Confirm,
sendWithSwapUM = state.copy( sendWithSwapUM = state.copy(
@ -496,18 +500,11 @@ internal class SendWithSwapConfirmModel @Inject constructor(
backIconRes = R.drawable.ic_back_24, backIconRes = R.drawable.ic_back_24,
backIconClick = router::pop, backIconClick = router::pop,
primaryButton = NavigationButton( primaryButton = NavigationButton(
textReference = when (confirmUM) { textReference = getPrimaryButtonText(confirmUM, isHoldToConfirm),
is ConfirmUM.Success -> resourceReference(R.string.common_close)
is ConfirmUM.Content -> if (confirmUM.isTransactionInProcess) {
resourceReference(R.string.send_sending)
} else {
resourceReference(R.string.common_send)
}
else -> resourceReference(R.string.common_send)
},
iconRes = walletInterationIcon(params.userWallet), iconRes = walletInterationIcon(params.userWallet),
isIconVisible = isReadyToSend, isIconVisible = isReadyToSend && !isHoldToConfirm,
isHapticClick = isReadyToSend, isHapticClick = isReadyToSend,
isHoldToConfirm = isHoldToConfirm,
isEnabled = confirmUM.isPrimaryButtonEnabled, isEnabled = confirmUM.isPrimaryButtonEnabled,
onClick = { onClick = {
when (confirmUM) { when (confirmUM) {
@ -525,4 +522,17 @@ internal class SendWithSwapConfirmModel @Inject constructor(
) )
}.launchIn(modelScope) }.launchIn(modelScope)
} }
private fun getPrimaryButtonText(confirmUM: ConfirmUM, isHoldToConfirm: Boolean): TextReference {
return when {
isHoldToConfirm -> resourceReference(
id = com.tangem.core.ui.R.string.common_hold_to,
formatArgs = wrappedList(resourceReference(R.string.common_send)),
)
confirmUM is ConfirmUM.Success -> resourceReference(R.string.common_close)
confirmUM is ConfirmUM.Content && confirmUM.isTransactionInProcess ->
resourceReference(R.string.send_sending)
else -> resourceReference(R.string.common_send)
}
}
} }