From 7d15269083699a7d55aef1b4d3e9c8d28e10b0d2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 12 Apr 2024 17:20:20 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../repository/DefaultTxHistoryRepository.kt | 15 +++++++++++++++ .../txhistory/repository/TxHistoryRepository.kt | 3 +++ .../usecase/GetExplorerTransactionUrlUseCase.kt | 15 +++++++++++++++ .../impl/presentation/state/SendStateFactory.kt | 9 +-------- .../impl/presentation/viewmodel/SendViewModel.kt | 13 ++++++++++--- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt index dba0ed594a..64268e3c0c 100644 --- a/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt +++ b/data/txhistory/src/main/kotlin/com/tangem/data/txhistory/repository/DefaultTxHistoryRepository.kt @@ -9,6 +9,7 @@ import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.txhistory.repository.paging.TxHistoryPagingSource import com.tangem.datasource.local.txhistory.TxHistoryItemsStore import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.txhistory.models.Page @@ -69,6 +70,7 @@ class DefaultTxHistoryRepository( return pager.flow } + @Deprecated("Replace with getTxExploreUrl [UserWalletId, Network] instead") override fun getTxExploreUrl(txHash: String, networkId: Network.ID): String { val blockchain = Blockchain.fromId(networkId.value) return when (val txExploreState = blockchain.getExploreTxUrl(txHash)) { @@ -77,6 +79,19 @@ class DefaultTxHistoryRepository( } } + override suspend fun getTxExploreUrl(userWalletId: UserWalletId, network: Network): String { + val blockchain = Blockchain.fromNetworkId(network.id.value) + val walletManager = walletManagersFacade.getOrCreateWalletManager( + userWalletId = userWalletId, + network = network, + ) + val lastTxHash = walletManager?.wallet?.recentTransactions?.last()?.hash.orEmpty() + return when (val txExploreState = blockchain?.getExploreTxUrl(lastTxHash)) { + is TxExploreState.Url -> txExploreState.url + else -> "" + } + } + override suspend fun getFixedSizeTxHistoryItems( userWalletId: UserWalletId, currency: CryptoCurrency, diff --git a/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/repository/TxHistoryRepository.kt b/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/repository/TxHistoryRepository.kt index b010a54db4..652b15c85b 100644 --- a/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/repository/TxHistoryRepository.kt +++ b/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/repository/TxHistoryRepository.kt @@ -24,6 +24,9 @@ interface TxHistoryRepository { fun getTxExploreUrl(txHash: String, networkId: Network.ID): String + /** Get transaction url in explorer via last transaction from wallet's recentTransactions list */ + suspend fun getTxExploreUrl(userWalletId: UserWalletId, network: Network): String + @Throws(TxHistoryListError::class) suspend fun getFixedSizeTxHistoryItems( userWalletId: UserWalletId, diff --git a/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt b/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt index 974d439c7e..cedb309901 100644 --- a/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt +++ b/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt @@ -6,10 +6,12 @@ import arrow.core.raise.either import com.tangem.domain.tokens.model.Network import com.tangem.domain.txhistory.models.TxStatusError import com.tangem.domain.txhistory.repository.TxHistoryRepository +import com.tangem.domain.wallets.models.UserWalletId class GetExplorerTransactionUrlUseCase( private val repository: TxHistoryRepository, ) { + @Deprecated("Replace with invoke [UserWalletId, Network]") operator fun invoke(txHash: String, networkId: Network.ID): Either { return either { catch( @@ -22,4 +24,17 @@ class GetExplorerTransactionUrlUseCase( ) } } + + suspend operator fun invoke(userWalletId: UserWalletId, network: Network): Either { + return either { + catch( + block = { + repository.getTxExploreUrl(userWalletId, network).ifEmpty { + raise(TxStatusError.EmptyUrlError) + } + }, + catch = { raise(TxStatusError.DataError(it)) }, + ) + } + } } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt index 24be0a0973..6861d18b0f 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt @@ -8,7 +8,6 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.txhistory.models.TxHistoryItem -import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.ValidateWalletMemoUseCase import com.tangem.features.send.impl.R @@ -36,7 +35,6 @@ internal class SendStateFactory( private val feeCryptoCurrencyStatusProvider: Provider, private val isTapHelpPreviewEnabledProvider: Provider, private val validateWalletMemoUseCase: ValidateWalletMemoUseCase, - private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, ) { private val iconStateConverter by lazy(::CryptoCurrencyToIconStateConverter) @@ -251,14 +249,9 @@ internal class SendStateFactory( ) } - fun getTransactionSendState(txData: TransactionData): SendUiState { + fun getTransactionSendState(txData: TransactionData, txUrl: String): SendUiState { val state = currentStateProvider() - val cryptoCurrency = cryptoCurrencyStatusProvider().currency val sendState = state.sendState ?: return state - val txUrl = getExplorerTransactionUrlUseCase( - txHash = txData.hash.orEmpty(), - networkId = cryptoCurrency.network.id, - ).getOrElse { "" } return state.copy( sendState = sendState.copy( transactionDate = txData.date?.timeInMillis ?: System.currentTimeMillis(), diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 82ab855b4d..9f1089fccf 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -89,9 +89,9 @@ internal class SendViewModel @Inject constructor( private val parseQrCodeUseCase: ParseQrCodeUseCase, private val isSendTapHelpEnabledUseCase: IsSendTapHelpEnabledUseCase, private val neverShowTapHelpUseCase: NeverShowTapHelpUseCase, + private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, currencyChecksRepository: CurrencyChecksRepository, isFeeApproximateUseCase: IsFeeApproximateUseCase, - getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, validateWalletMemoUseCase: ValidateWalletMemoUseCase, getBalanceNotEnoughForFeeWarningUseCase: GetBalanceNotEnoughForFeeWarningUseCase, savedStateHandle: SavedStateHandle, @@ -123,7 +123,6 @@ internal class SendViewModel @Inject constructor( cryptoCurrencyStatusProvider = Provider { cryptoCurrencyStatus }, feeCryptoCurrencyStatusProvider = Provider { feeCryptoCurrencyStatus }, validateWalletMemoUseCase = validateWalletMemoUseCase, - getExplorerTransactionUrlUseCase = getExplorerTransactionUrlUseCase, isTapHelpPreviewEnabledProvider = Provider { isTapHelpPreviewEnabled }, ) @@ -845,13 +844,21 @@ internal class SendViewModel @Inject constructor( }, ifRight = { uiState = stateFactory.getSendingStateUpdate(isSending = false) - uiState = stateFactory.getTransactionSendState(txData) + updateTransactionStatus(txData) scheduleBalanceUpdate() analyticsEventHandler.send(SendAnalyticEvents.TransactionScreenOpened) }, ) } + private suspend fun updateTransactionStatus(txData: TransactionData) { + val txUrl = getExplorerTransactionUrlUseCase( + userWalletId = userWalletId, + network = cryptoCurrency.network, + ).getOrElse { "" } + uiState = stateFactory.getTransactionSendState(txData, txUrl) + } + private fun scheduleBalanceUpdate() { viewModelScope.launch(dispatchers.io) { delay(BALANCE_UPDATE_DELAY)