Updated on 2026-08-14

This commit is contained in:
Tangem 2026-06-18 12:36:46 +05:00
parent 26201c5c0b
commit 0be1358760
39 changed files with 581 additions and 124 deletions

View file

@ -31,6 +31,8 @@ dependencies {
implementation(projects.domain.onramp.models)
implementation(projects.domain.offramp)
implementation(projects.domain.demo)
implementation(projects.domain.card)
implementation(projects.domain.feedback)
implementation(deps.lifecycle.compose)
implementation(deps.compose.foundation)

View file

@ -12,9 +12,12 @@ import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.DialogMessage
import com.tangem.core.ui.message.dialog.Dialogs
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.card.IsWalletBackupProblematicUseCase
import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.feedback.SendBackupProblemEmailUseCase
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.offramp.GetOfframpUrlUseCase
import com.tangem.domain.onramp.model.OnrampSource
@ -23,9 +26,9 @@ import com.tangem.utils.Provider
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.collections.immutable.toImmutableList
@Suppress("LongParameterList")
class TokenActionsHandler @AssistedInject constructor(
@ -39,6 +42,8 @@ class TokenActionsHandler @AssistedInject constructor(
@Assisted private val onHandleQuickAction: (action: HandledQuickAction, shouldDismiss: Boolean) -> Unit,
@Assisted private val coroutineScope: CoroutineScope,
private val isDemoCardUseCase: IsDemoCardUseCase,
private val isWalletBackupProblematicUseCase: IsWalletBackupProblematicUseCase,
private val sendBackupProblemEmailUseCase: SendBackupProblemEmailUseCase,
private val messageSender: UiMessageSender,
) {
@ -47,6 +52,8 @@ class TokenActionsHandler @AssistedInject constructor(
}
fun handle(action: TokenActionsBSContentUM.Action, cryptoCurrencyData: CryptoCurrencyData) {
if (isTopUpBlockedByBackupError(action, cryptoCurrencyData.userWallet)) return
onHandleQuickAction(
HandledQuickAction(
action = action,
@ -80,6 +87,21 @@ class TokenActionsHandler @AssistedInject constructor(
}
}
private fun isTopUpBlockedByBackupError(action: TokenActionsBSContentUM.Action, userWallet: UserWallet): Boolean {
val isBlockedAction = action == TokenActionsBSContentUM.Action.Buy ||
action == TokenActionsBSContentUM.Action.Receive ||
action == TokenActionsBSContentUM.Action.Exchange
if (!isBlockedAction) return false
if (!isWalletBackupProblematicUseCase(userWallet)) return false
messageSender.send(
Dialogs.backupErrorAddFundsDisabled(
onContactSupport = { coroutineScope.launch { sendBackupProblemEmailUseCase(userWallet.walletId) } },
),
)
return true
}
private fun handleDemoMode(action: TokenActionsBSContentUM.Action, userWallet: UserWallet.Cold): Boolean {
val isDemoCard = isDemoCardUseCase.invoke(userWallet.cardId)
val isNeededShowDemoWarning = isDemoCard && disabledActionsInDemoMode.contains(action)

View file

@ -41,6 +41,15 @@ sealed class NotificationUM(val config: NotificationConfig) {
subtitle = resourceReference(R.string.send_notification_invalid_amount_text),
)
data class DestinationBackupError(val onContactSupport: () -> Unit) : Error(
title = resourceReference(R.string.warning_backup_error_add_funds_title),
subtitle = resourceReference(R.string.warning_backup_error_add_funds_message),
buttonState = NotificationConfig.ButtonsState.SecondaryButtonConfig(
text = resourceReference(R.string.common_contact_support),
onClick = onContactSupport,
),
)
data class MinimumAmountError(val amount: String) : Error(
title = resourceReference(R.string.send_notification_invalid_amount_title),
subtitle = resourceReference(