From eadf1a17c8abfb41c6e2a9350bd256f957d1ba53 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 30 Jan 2025 20:17:28 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../ui/expressStatus/ExpressHideButton.kt | 3 +- .../OnrampStatusBottomSheetContent.kt | 5 +++ .../domain/onramp/model/OnrampStatus.kt | 16 +++++++++ .../factory/express/OnrampStatusFactory.kt | 4 +-- .../wallet/domain/OnrampStatusFactory.kt | 4 +-- .../wallet/state/model/WalletAlertState.kt | 12 +++++++ .../SingleWalletOnrampTransactionConverter.kt | 5 ++- .../wallet/state/utils/WalletEventSender.kt | 2 +- .../intents/WalletContentClickIntents.kt | 35 +++++++++++++++++-- 9 files changed, 75 insertions(+), 11 deletions(-) diff --git a/common/ui/src/main/java/com/tangem/common/ui/expressStatus/ExpressHideButton.kt b/common/ui/src/main/java/com/tangem/common/ui/expressStatus/ExpressHideButton.kt index 9c9723be6f..16a1484d52 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/expressStatus/ExpressHideButton.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/expressStatus/ExpressHideButton.kt @@ -3,6 +3,7 @@ package com.tangem.common.ui.expressStatus import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape @@ -19,7 +20,7 @@ import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme @Composable -fun ExpressHideButton(isTerminal: Boolean, isAutoDisposable: Boolean, onClick: () -> Unit) { +fun ColumnScope.ExpressHideButton(isTerminal: Boolean, isAutoDisposable: Boolean, onClick: () -> Unit) { AnimatedVisibility( visible = isTerminal && !isAutoDisposable, label = "Hide button visibility animation", diff --git a/common/ui/src/main/java/com/tangem/common/ui/expressStatus/OnrampStatusBottomSheetContent.kt b/common/ui/src/main/java/com/tangem/common/ui/expressStatus/OnrampStatusBottomSheetContent.kt index 35905de8f7..fc888d6c64 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/expressStatus/OnrampStatusBottomSheetContent.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/expressStatus/OnrampStatusBottomSheetContent.kt @@ -59,6 +59,11 @@ fun OnrampStatusBottomSheetContent(state: ExpressTransactionStateUM.OnrampUM) { SpacerH12() ExpressStatusBlock(state = state.info.status) ExpressStatusNotificationBlock(state = state.info.notification) + ExpressHideButton( + isTerminal = state.activeStatus.isTerminal, + isAutoDisposable = state.activeStatus.isAutoDisposable, + onClick = state.info.onDisposeExpressStatus, + ) SpacerH24() } } \ No newline at end of file diff --git a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampStatus.kt b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampStatus.kt index 64aa740a5e..e116c0c085 100644 --- a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampStatus.kt +++ b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampStatus.kt @@ -49,6 +49,22 @@ data class OnrampStatus( -> false } + val isAutoDisposable: Boolean + get() = when (this) { + Finished, + -> true + Expired, + Failed, + Paused, + Created, + WaitingForPayment, + PaymentProcessing, + Verifying, + Paid, + Sending, + -> false + } + val isHidden: Boolean get() = when (this) { Created, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt index 7ca14864da..79328454af 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/express/OnrampStatusFactory.kt @@ -68,12 +68,12 @@ internal class OnrampStatusFactory @AssistedInject constructor( } } - suspend fun removeTransactionOnBottomSheetClosed() { + suspend fun removeTransactionOnBottomSheetClosed(isForceDispose: Boolean) { val state = currentStateProvider() val bottomSheetConfig = state.bottomSheetConfig?.content as? ExpressStatusBottomSheetConfig ?: return val selectedTx = bottomSheetConfig.value as? ExpressTransactionStateUM.OnrampUM ?: return - if (selectedTx.activeStatus.isTerminal) { + if (selectedTx.activeStatus.isAutoDisposable || isForceDispose) { onrampRemoveTransactionUseCase(externalTxId = selectedTx.info.txExternalId) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt index 7686df2258..32450b5201 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/OnrampStatusFactory.kt @@ -30,12 +30,12 @@ internal class OnrampStatusFactory @Inject constructor( private val dispatchers: CoroutineDispatcherProvider, ) { - suspend fun removeTransactionOnBottomSheetClosed() { + suspend fun removeTransactionOnBottomSheetClosed(forceDispose: Boolean) { val state = stateHolder.getSelectedWallet() val bottomSheetConfig = state.bottomSheetConfig?.content as? ExpressStatusBottomSheetConfig ?: return val selectedTx = bottomSheetConfig.value as? ExpressTransactionStateUM.OnrampUM ?: return - if (selectedTx.activeStatus.isTerminal) { + if (selectedTx.activeStatus.isAutoDisposable || forceDispose) { onrampRemoveTransactionUseCase(externalTxId = selectedTx.info.txExternalId) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletAlertState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletAlertState.kt index 5c8ab22a90..a3300aacb2 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletAlertState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletAlertState.kt @@ -16,6 +16,8 @@ internal sealed interface WalletAlertState { open val confirmButtonText: TextReference = resourceReference(id = R.string.common_ok) open val isWarningConfirmButton: Boolean = false abstract val onConfirmClick: (() -> Unit)? + open val cancelButtonText: TextReference? = null + open val onCancelClick: (() -> Unit)? = null } @Immutable @@ -107,4 +109,14 @@ internal sealed interface WalletAlertState { override val onConfirmClick: (() -> Unit)? = null } + + data class ConfirmExpressStatusHide( + override val onConfirmClick: (() -> Unit), + override val onCancelClick: (() -> Unit), + ) : Basic() { + override val title: TextReference = resourceReference(R.string.express_status_hide_dialog_title) + override val message: TextReference = resourceReference(R.string.express_status_hide_dialog_text) + override val confirmButtonText: TextReference = resourceReference(R.string.common_hide) + override val cancelButtonText: TextReference = resourceReference(R.string.common_cancel) + } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletOnrampTransactionConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletOnrampTransactionConverter.kt index 606d0ed064..a5a0ee99b1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletOnrampTransactionConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletOnrampTransactionConverter.kt @@ -62,9 +62,7 @@ internal class SingleWalletOnrampTransactionConverter( value.timestamp.toTimeFormat(), ), ), - toAmount = stringReference( - value.toAmount.format { crypto(currency) }, - ), + toAmount = stringReference(value.toAmount.format { crypto(currency) }), toFiatAmount = stringReference( status.fiatRate?.multiply(value.toAmount).format { fiat( @@ -94,6 +92,7 @@ internal class SingleWalletOnrampTransactionConverter( analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider) clickIntents.onGoToProviderClick(it) }, + onDisposeExpressStatus = clickIntents::onConfirmDisposeExpressStatus, onClick = { val analyticEvent = TokenOnrampAnalyticsEvent.OnrampStatusOpened( tokenSymbol = currency.symbol, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletEventSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletEventSender.kt index 34859d54d9..710e54acde 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletEventSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletEventSender.kt @@ -21,7 +21,7 @@ internal class WalletEventSender @Inject constructor( stateHolder.update(transformer = SendEventTransformer(event = event, onConsume = ::onConsume)) } - private fun onConsume() { + fun onConsume() { stateHolder.update { it.copy(event = consumedEvent()) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt index 0b20b60c75..3d00a7564b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt @@ -15,12 +15,14 @@ import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.feature.wallet.presentation.wallet.domain.OnrampStatusFactory import com.tangem.feature.wallet.presentation.wallet.domain.unwrap import com.tangem.feature.wallet.presentation.wallet.state.WalletStateController +import com.tangem.feature.wallet.presentation.wallet.state.model.* import com.tangem.feature.wallet.presentation.wallet.state.model.ActionsBottomSheetConfig -import com.tangem.feature.wallet.presentation.wallet.state.model.WalletBottomSheetConfig +import com.tangem.feature.wallet.presentation.wallet.state.model.WalletEvent import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState import com.tangem.feature.wallet.presentation.wallet.state.transformers.CloseBottomSheetTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.OpenBottomSheetTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.converter.MultiWalletCurrencyActionsConverter +import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletEventSender import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.flow.collectLatest @@ -54,6 +56,10 @@ internal interface WalletContentClickIntents { fun onGoToProviderClick(externalTxId: String) fun onExpressTransactionClick(txId: String) + + fun onConfirmDisposeExpressStatus() + + fun onDisposeExpressStatus() } @Suppress("LongParameterList") @@ -70,6 +76,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( private val shouldShowMarketsTooltipUseCase: ShouldShowMarketsTooltipUseCase, private val dispatchers: CoroutineDispatcherProvider, private val reduxStateHolder: ReduxStateHolder, + private val walletEventSender: WalletEventSender, ) : BaseWalletClickIntents(), WalletContentClickIntents { override fun onBackClick() = router.popBackStack() @@ -185,7 +192,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( val userWalletId = stateHolder.getSelectedWalletId() if (stateHolder.getSelectedWallet().bottomSheetConfig?.content is ExpressStatusBottomSheetConfig) { viewModelScope.launch(dispatchers.main) { - onrampStatusFactory.removeTransactionOnBottomSheetClosed() + onrampStatusFactory.removeTransactionOnBottomSheetClosed(forceDispose = false) } } stateHolder.update(CloseBottomSheetTransformer(userWalletId)) @@ -211,4 +218,28 @@ internal class WalletContentClickIntentsImplementor @Inject constructor( ) } } + + override fun onConfirmDisposeExpressStatus() { + walletEventSender.send( + WalletEvent.ShowAlert( + WalletAlertState.ConfirmExpressStatusHide( + onConfirmClick = { + walletEventSender.onConsume() + onDisposeExpressStatus() + }, + onCancelClick = walletEventSender::onConsume, + ), + ), + ) + } + + override fun onDisposeExpressStatus() { + val userWalletId = stateHolder.getSelectedWalletId() + if (stateHolder.getSelectedWallet().bottomSheetConfig?.content is ExpressStatusBottomSheetConfig) { + viewModelScope.launch(dispatchers.main) { + onrampStatusFactory.removeTransactionOnBottomSheetClosed(forceDispose = true) + } + } + stateHolder.update(CloseBottomSheetTransformer(userWalletId)) + } } \ No newline at end of file