From 36f2b71d03b9bdfb6b1e71ae096e947e60580abf Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 25 Sep 2024 10:47:47 +0500 Subject: [PATCH] Updated on 2026-08-14 --- ...r.kt => TransactionErrorAlertConverter.kt} | 2 +- .../alerts/models/AlertTransactionErrorUM.kt | 2 +- .../tangem/common/ui/alerts/models/AlertUM.kt | 2 +- .../usecase/SendTransactionUseCase.kt | 8 ++++ .../{SendAlertState.kt => SendAlertUM.kt} | 41 ++++------------- .../send/impl/presentation/state/SendEvent.kt | 3 +- .../state/SendEventStateFactory.kt | 20 ++++---- .../state/SendTransactionAlertConverter.kt | 46 ------------------- .../impl/presentation/ui/SendEventEffect.kt | 6 +-- .../state/events/StakingEventFactory.kt | 4 +- 10 files changed, 38 insertions(+), 96 deletions(-) rename common/ui/src/main/java/com/tangem/common/ui/alerts/{SendTransactionAlertConverter.kt => TransactionErrorAlertConverter.kt} (98%) rename features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/{SendAlertState.kt => SendAlertUM.kt} (60%) delete mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt diff --git a/common/ui/src/main/java/com/tangem/common/ui/alerts/SendTransactionAlertConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/alerts/TransactionErrorAlertConverter.kt similarity index 98% rename from common/ui/src/main/java/com/tangem/common/ui/alerts/SendTransactionAlertConverter.kt rename to common/ui/src/main/java/com/tangem/common/ui/alerts/TransactionErrorAlertConverter.kt index 2cb03f4f16..4cfcfa7a2b 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/alerts/SendTransactionAlertConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/alerts/TransactionErrorAlertConverter.kt @@ -8,7 +8,7 @@ import com.tangem.core.ui.extensions.wrappedList import com.tangem.domain.transaction.error.SendTransactionError import com.tangem.utils.converter.Converter -class SendTransactionAlertConverter( +class TransactionErrorAlertConverter( private val popBackStack: () -> Unit, private val onFailedTxEmailClick: (String) -> Unit, ) : Converter { diff --git a/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertTransactionErrorUM.kt b/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertTransactionErrorUM.kt index 5fd83163be..6d9cea587a 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertTransactionErrorUM.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertTransactionErrorUM.kt @@ -9,7 +9,7 @@ data class AlertTransactionErrorUM( val code: String, val cause: String?, val causeTextReference: TextReference? = null, - override val onConfirmClick: (() -> Unit)? = null, + override val onConfirmClick: () -> Unit, ) : AlertUM { override val title: TextReference = resourceReference(id = R.string.send_alert_transaction_failed_title) override val message: TextReference = resourceReference( diff --git a/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertUM.kt b/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertUM.kt index 1cf955bebe..a84d66b1ff 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertUM.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/alerts/models/AlertUM.kt @@ -8,5 +8,5 @@ interface AlertUM { val title: TextReference? val message: TextReference val confirmButtonText: TextReference - val onConfirmClick: (() -> Unit)? + val onConfirmClick: () -> Unit } \ No newline at end of file diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt index c6b5e9258c..be3afe3cd4 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt @@ -137,6 +137,14 @@ class SendTransactionUseCase( is BlockchainSdkError.WrappedTangemError -> { parseWrappedError(tangemError) // todo remove when sdk errors are revised } + is BlockchainSdkError.WrappedThrowable -> { + val causeError = tangemError.cause + if (causeError is BlockchainSdkError) { + SendTransactionError.BlockchainSdkError(causeError.code, causeError.customMessage) + } else { + SendTransactionError.BlockchainSdkError(tangemError.code, tangemError.customMessage) + } + } else -> { SendTransactionError.BlockchainSdkError(error.code, tangemError.customMessage) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertUM.kt similarity index 60% rename from features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt rename to features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertUM.kt index 4abbd3c665..c4e0e780f8 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertUM.kt @@ -1,58 +1,35 @@ package com.tangem.features.send.impl.presentation.state import androidx.compose.runtime.Immutable +import com.tangem.common.ui.alerts.models.AlertUM import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.wrappedList import com.tangem.features.send.impl.R @Immutable -internal sealed class SendAlertState { - - abstract val title: TextReference? - abstract val message: TextReference - open val confirmButtonText: TextReference = resourceReference(id = R.string.common_ok) - open val onConfirmClick: (() -> Unit)? = null +internal sealed class SendAlertUM : AlertUM { data class GenericError( override val title: TextReference? = resourceReference(id = R.string.send_alert_transaction_failed_title), override val onConfirmClick: (() -> Unit), - ) : SendAlertState() { + ) : SendAlertUM() { override val message: TextReference = resourceReference(R.string.common_unknown_error) override val confirmButtonText: TextReference = resourceReference(id = R.string.common_support) } - data class TransactionError( - val code: String, - val cause: String?, - val causeTextReference: TextReference? = null, - override val onConfirmClick: (() -> Unit), - ) : SendAlertState() { - override val title: TextReference = resourceReference(id = R.string.send_alert_transaction_failed_title) - override val message: TextReference = resourceReference( - id = R.string.send_alert_transaction_failed_text, - formatArgs = wrappedList(causeTextReference ?: cause.orEmpty(), code), - ) - override val confirmButtonText: TextReference = - resourceReference(id = R.string.common_support) - } - - data class DemoMode( + data class FeeIncreased( override val onConfirmClick: () -> Unit, - ) : SendAlertState() { - override val title: TextReference = resourceReference(id = R.string.warning_demo_mode_title) - override val message: TextReference = resourceReference(id = R.string.warning_demo_mode_message) - } - - data object FeeIncreased : SendAlertState() { + ) : SendAlertUM() { override val title: TextReference? = null override val message: TextReference = resourceReference(id = R.string.send_notification_high_fee_title) + override val confirmButtonText: TextReference = resourceReference(id = R.string.common_ok) } data class FeeTooLow( override val onConfirmClick: () -> Unit, - ) : SendAlertState() { + ) : SendAlertUM() { override val title: TextReference? = null override val message: TextReference = resourceReference(id = R.string.send_alert_fee_too_low_text) override val confirmButtonText: TextReference = resourceReference(R.string.common_continue) @@ -61,7 +38,7 @@ internal sealed class SendAlertState { data class FeeTooHigh( val times: String, override val onConfirmClick: () -> Unit, - ) : SendAlertState() { + ) : SendAlertUM() { override val title: TextReference? = null override val message: TextReference = resourceReference(id = R.string.send_alert_fee_too_high_text, wrappedList(times)) @@ -70,7 +47,7 @@ internal sealed class SendAlertState { data class FeeUnreachableError( override val onConfirmClick: (() -> Unit), - ) : SendAlertState() { + ) : SendAlertUM() { override val title: TextReference = resourceReference(R.string.send_fee_unreachable_error_title) override val message: TextReference = resourceReference(R.string.send_fee_unreachable_error_text) override val confirmButtonText = resourceReference(R.string.warning_button_refresh) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEvent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEvent.kt index 2fdb687d96..4a3fad4207 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEvent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEvent.kt @@ -1,6 +1,7 @@ package com.tangem.features.send.impl.presentation.state import androidx.compose.runtime.Immutable +import com.tangem.common.ui.alerts.models.AlertUM import com.tangem.core.ui.extensions.TextReference @Immutable @@ -8,5 +9,5 @@ internal sealed class SendEvent { data class ShowSnackBar(val text: TextReference) : SendEvent() - data class ShowAlert(val alert: SendAlertState) : SendEvent() + data class ShowAlert(val alert: AlertUM) : SendEvent() } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt index 3424853d60..1258c831fb 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt @@ -1,6 +1,7 @@ package com.tangem.features.send.impl.presentation.state import com.tangem.blockchain.common.transaction.TransactionFee +import com.tangem.common.ui.alerts.TransactionErrorAlertConverter import com.tangem.core.ui.event.consumedEvent import com.tangem.core.ui.event.triggeredEvent import com.tangem.domain.transaction.error.SendTransactionError @@ -24,9 +25,10 @@ internal class SendEventStateFactory( private val clickIntents: SendClickIntents, private val feeStateFactory: FeeStateFactory, ) { - private val sendTransactionErrorConverter by lazy(LazyThreadSafetyMode.NONE) { - SendTransactionAlertConverter( - clickIntents = clickIntents, + private val transactionErrorAlertConverter by lazy(LazyThreadSafetyMode.NONE) { + TransactionErrorAlertConverter( + popBackStack = clickIntents::popBackStack, + onFailedTxEmailClick = clickIntents::onFailedTxEmailClick, ) } @@ -37,7 +39,7 @@ internal class SendEventStateFactory( fun getSendTransactionErrorState(error: SendTransactionError?, onConsume: () -> Unit): SendUiState { val state = currentStateProvider() val event = error?.let { - sendTransactionErrorConverter.convert(error)?.let { + transactionErrorAlertConverter.convert(error)?.let { triggeredEvent(SendEvent.ShowAlert(it), onConsume) } } @@ -68,7 +70,7 @@ internal class SendEventStateFactory( return if (newFeeValue > oldFeeValue) { updateFeeState.copy( event = triggeredEvent( - data = SendEvent.ShowAlert(SendAlertState.FeeIncreased), + data = SendEvent.ShowAlert(SendAlertUM.FeeIncreased(onConsume)), onConsume = onConsume, ), ) @@ -83,7 +85,7 @@ internal class SendEventStateFactory( return state.copy( event = triggeredEvent( data = SendEvent.ShowAlert( - SendAlertState.FeeTooLow( + SendAlertUM.FeeTooLow( onConfirmClick = clickIntents::showSend, ), ), @@ -96,7 +98,7 @@ internal class SendEventStateFactory( return currentStateProvider().copy( event = triggeredEvent( data = SendEvent.ShowAlert( - SendAlertState.FeeTooHigh( + SendAlertUM.FeeTooHigh( onConfirmClick = clickIntents::showSend, times = diff, ), @@ -111,7 +113,7 @@ internal class SendEventStateFactory( return state.copy( event = triggeredEvent( data = SendEvent.ShowAlert( - SendAlertState.GenericError( + SendAlertUM.GenericError( onConfirmClick = { clickIntents.onFailedTxEmailClick(error?.localizedMessage.orEmpty()) }, ), ), @@ -125,7 +127,7 @@ internal class SendEventStateFactory( return state.copy( event = triggeredEvent( data = SendEvent.ShowAlert( - SendAlertState.FeeUnreachableError(onConfirmClick = clickIntents::feeReload), + SendAlertUM.FeeUnreachableError(onConfirmClick = clickIntents::feeReload), ), onConsume = onConsume, ), diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt deleted file mode 100644 index 7d184f5227..0000000000 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendTransactionAlertConverter.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.tangem.features.send.impl.presentation.state - -import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.extensions.wrappedList -import com.tangem.domain.transaction.error.SendTransactionError -import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents -import com.tangem.utils.converter.Converter - -internal class SendTransactionAlertConverter( - private val clickIntents: SendClickIntents, -) : Converter { - override fun convert(value: SendTransactionError): SendAlertState? { - return when (value) { - SendTransactionError.DemoCardError -> SendAlertState.DemoMode( - onConfirmClick = { clickIntents.popBackStack() }, - ) - is SendTransactionError.TangemSdkError -> SendAlertState.TransactionError( - code = value.code.toString(), - cause = null, - causeTextReference = resourceReference(value.messageRes, wrappedList(value.args)), - onConfirmClick = { clickIntents.onFailedTxEmailClick(value.code.toString()) }, - ) - is SendTransactionError.BlockchainSdkError -> SendAlertState.TransactionError( - code = value.code.toString(), - cause = value.message, - onConfirmClick = { clickIntents.onFailedTxEmailClick("${value.code}: ${value.message.orEmpty()}") }, - ) - is SendTransactionError.DataError -> SendAlertState.TransactionError( - code = "", - cause = value.message, - onConfirmClick = { clickIntents.onFailedTxEmailClick(value.message.orEmpty()) }, - ) - is SendTransactionError.NetworkError -> SendAlertState.TransactionError( - code = value.code.orEmpty(), - cause = value.message.orEmpty(), - onConfirmClick = { clickIntents.onFailedTxEmailClick(value.message.orEmpty()) }, - ) - is SendTransactionError.UnknownError -> SendAlertState.TransactionError( - code = "", - cause = value.ex?.localizedMessage, - onConfirmClick = { clickIntents.onFailedTxEmailClick(value.ex?.localizedMessage.orEmpty()) }, - ) - else -> null - } - } -} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt index dee53dccc8..27229a8cd5 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendEventEffect.kt @@ -5,19 +5,19 @@ import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource +import com.tangem.common.ui.alerts.models.AlertUM import com.tangem.core.ui.components.BasicDialog import com.tangem.core.ui.components.DialogButtonUM import com.tangem.core.ui.event.EventEffect import com.tangem.core.ui.event.StateEvent import com.tangem.core.ui.extensions.resolveReference import com.tangem.features.send.impl.R -import com.tangem.features.send.impl.presentation.state.SendAlertState import com.tangem.features.send.impl.presentation.state.SendEvent @Composable internal fun SendEventEffect(event: StateEvent, snackbarHostState: SnackbarHostState) { val resources = LocalContext.current.resources - var alertConfig by remember { mutableStateOf(value = null) } + var alertConfig by remember { mutableStateOf(value = null) } val keyboardController = LocalSoftwareKeyboardController.current LaunchedEffect(key1 = alertConfig) { @@ -44,7 +44,7 @@ internal fun SendEventEffect(event: StateEvent, snackbarHostState: Sn } @Composable -internal fun SendAlert(state: SendAlertState, onDismiss: () -> Unit) { +internal fun SendAlert(state: AlertUM, onDismiss: () -> Unit) { val confirmButton: DialogButtonUM val dismissButton: DialogButtonUM? diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/events/StakingEventFactory.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/events/StakingEventFactory.kt index 5c29cbbf5b..85c5470976 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/events/StakingEventFactory.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/events/StakingEventFactory.kt @@ -1,6 +1,6 @@ package com.tangem.features.staking.impl.presentation.state.events -import com.tangem.common.ui.alerts.SendTransactionAlertConverter +import com.tangem.common.ui.alerts.TransactionErrorAlertConverter import com.tangem.domain.staking.model.stakekit.StakingError import com.tangem.domain.transaction.error.SendTransactionError import com.tangem.features.staking.impl.presentation.state.StakingStateController @@ -22,7 +22,7 @@ internal class StakingEventFactory( fun createSendTransactionErrorAlert(error: SendTransactionError?) { val alert = error?.let { - SendTransactionAlertConverter( + TransactionErrorAlertConverter( popBackStack = popBackStack, onFailedTxEmailClick = onFailedTxEmailClick, ).convert(error)