From 7df5f9edc24264cba6e44366052958351816f76d Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 11 Oct 2023 17:29:26 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/TxHistoryDomainModule.kt | 9 +++++ .../ui/components/transactions/Transaction.kt | 14 +++++++- .../transactions/state/TransactionState.kt | 6 ++++ data/txhistory/build.gradle.kts | 1 + .../repository/DefaultTxHistoryRepository.kt | 6 ++++ .../repository/TxHistoryRepository.kt | 2 ++ .../GetExplorerTransactionUrlUseCase.kt | 12 +++++++ .../TokenDetailsLoadedBalanceConverter.kt | 4 ++- .../state/factory/TokenDetailsStateFactory.kt | 8 ++--- .../TokenDetailsTxHistoryItemFlowConverter.kt | 1 + ...ilsTxHistoryToTransactionStateConverter.kt | 12 +++++++ ...tailsTxHistoryTransactionStateConverter.kt | 12 +++++++ .../viewmodels/TokenDetailsClickIntents.kt | 6 ++++ .../viewmodels/TokenDetailsViewModel.kt | 33 +++++++++++++------ .../presentation/common/WalletPreviewData.kt | 2 ++ .../router/DefaultWalletRouter.kt | 2 +- .../presentation/router/InnerWalletRouter.kt | 2 +- .../WalletTxHistoryItemFlowConverter.kt | 1 + ...alletTxHistoryTransactionStateConverter.kt | 14 +++++++- .../wallet/viewmodels/WalletClickIntents.kt | 2 ++ .../wallet/viewmodels/WalletViewModel.kt | 24 +++++++++++++- gradle/dependencies.toml | 2 +- 22 files changed, 153 insertions(+), 22 deletions(-) create mode 100644 domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt diff --git a/app/src/main/java/com/tangem/tap/di/domain/TxHistoryDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TxHistoryDomainModule.kt index 3ab36cd231..7ba9e05cff 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TxHistoryDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TxHistoryDomainModule.kt @@ -2,6 +2,7 @@ package com.tangem.tap.di.domain import com.tangem.domain.tokens.* import com.tangem.domain.txhistory.repository.TxHistoryRepository +import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase import dagger.Module @@ -25,4 +26,12 @@ internal object TxHistoryDomainModule { fun provideGetTxHistoryItemsUseCase(txHistoryRepository: TxHistoryRepository): GetTxHistoryItemsUseCase { return GetTxHistoryItemsUseCase(repository = txHistoryRepository) } + + @Provides + @ViewModelScoped + fun providesGetExplorerTransactionUrlUseCase( + txHistoryRepository: TxHistoryRepository, + ): GetExplorerTransactionUrlUseCase { + return GetExplorerTransactionUrlUseCase(repository = txHistoryRepository) + } } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt index 4cbbb22026..676da451cf 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt @@ -2,6 +2,7 @@ package com.tangem.core.ui.components.transactions import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -24,8 +25,8 @@ import com.tangem.core.ui.R import com.tangem.core.ui.components.CircleShimmer import com.tangem.core.ui.components.RectangleShimmer import com.tangem.core.ui.components.transactions.state.TransactionState -import com.tangem.core.ui.components.transactions.state.TransactionState.Content.Status import com.tangem.core.ui.components.transactions.state.TransactionState.Content.Direction +import com.tangem.core.ui.components.transactions.state.TransactionState.Content.Status import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme @@ -49,10 +50,15 @@ fun Transaction(state: TransactionState, isBalanceHidden: Boolean, modifier: Mod modifier = modifier .background(TangemTheme.colors.background.primary) .defaultMinSize(minHeight = TangemTheme.dimens.size56) + .clickable( + enabled = state is TransactionState.Content, + onClick = (state as? TransactionState.Content)?.onClick ?: {}, + ) .padding(horizontal = TangemTheme.dimens.spacing12, vertical = TangemTheme.dimens.spacing10), color = TangemTheme.colors.background.primary, ) { @Suppress("DestructuringDeclarationWithTooManyEntries") + // FIXME: split this composable to small composables(loading/content/error) to properly handle onClick ConstraintLayout(modifier = Modifier.fillMaxWidth()) { val (iconItem, titleItem, subtitleItem, amountItem, timestampItem) = createRefs() @@ -359,6 +365,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< timestamp = "8:41", status = Status.Confirmed, direction = Direction.OUTGOING, + onClick = {}, ), TransactionState.Transfer( txHash = UUID.randomUUID().toString(), @@ -367,6 +374,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< timestamp = "8:41", status = Status.Unconfirmed, direction = Direction.INCOMING, + onClick = {}, ), TransactionState.Approve( txHash = UUID.randomUUID().toString(), @@ -375,6 +383,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< timestamp = "8:41", status = Status.Failed, direction = Direction.OUTGOING, + onClick = {}, ), TransactionState.Swap( txHash = UUID.randomUUID().toString(), @@ -383,6 +392,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< timestamp = "8:41", status = Status.Unconfirmed, direction = Direction.INCOMING, + onClick = {}, ), TransactionState.Custom( txHash = UUID.randomUUID().toString(), @@ -393,6 +403,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< direction = Direction.INCOMING, title = TextReference.Str("Submit"), subtitle = TextReference.Str("33BddS...ga2B"), + onClick = {}, ), TransactionState.Custom( txHash = UUID.randomUUID().toString(), @@ -403,6 +414,7 @@ private class TransactionItemStateProvider : CollectionPreviewParameterProvider< direction = Direction.OUTGOING, title = TextReference.Str("Submit"), subtitle = TextReference.Str("33BddS...ga2B"), + onClick = {}, ), TransactionState.Loading(txHash = UUID.randomUUID().toString()), ), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt index ad3853ceea..c513c83fba 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt @@ -20,6 +20,7 @@ sealed interface TransactionState { * @property timestamp timestamp * @property status transaction status * @property direction transaction direction + * @property onClick Lambda be invoked when manage button is clicked */ sealed class Content : TransactionState { @@ -28,6 +29,7 @@ sealed interface TransactionState { abstract val timestamp: String abstract val status: Status abstract val direction: Direction + abstract val onClick: () -> Unit fun copySealed( txHash: String = this.txHash, @@ -73,6 +75,7 @@ sealed interface TransactionState { override val timestamp: String, override val status: Status, override val direction: Direction, + override val onClick: () -> Unit, ) : Content() /** @@ -91,6 +94,7 @@ sealed interface TransactionState { override val timestamp: String, override val status: Status, override val direction: Direction, + override val onClick: () -> Unit, ) : Content() /** @@ -109,6 +113,7 @@ sealed interface TransactionState { override val timestamp: String, override val status: Status, override val direction: Direction, + override val onClick: () -> Unit, ) : Content() data class Custom( @@ -118,6 +123,7 @@ sealed interface TransactionState { override val timestamp: String, override val status: Status, override val direction: Direction, + override val onClick: () -> Unit, val title: TextReference, val subtitle: TextReference, ) : Content() diff --git a/data/txhistory/build.gradle.kts b/data/txhistory/build.gradle.kts index d53b060232..2b5b2f8165 100644 --- a/data/txhistory/build.gradle.kts +++ b/data/txhistory/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { implementation(deps.androidx.paging.runtime) implementation(deps.timber) implementation(deps.jodatime) + implementation(deps.tangem.blockchain) implementation(deps.hilt.core) kapt(deps.hilt.kapt) 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 bfa1cc57d1..0e2cd53343 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 @@ -3,6 +3,7 @@ package com.tangem.data.txhistory.repository import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData +import com.tangem.blockchain.common.Blockchain import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.txhistory.repository.paging.TxHistoryPagingSource import com.tangem.datasource.local.txhistory.TxHistoryItemsStore @@ -63,6 +64,11 @@ class DefaultTxHistoryRepository( return pager.flow } + override fun getTxExploreUrl(txHash: String, networkId: Network.ID): String { + val blockchain = Blockchain.fromId(networkId.value) + return blockchain.getExploreTxUrl(txHash) + } + private suspend fun getUserWallet(userWalletId: UserWalletId): UserWallet { return requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { "Unable to find user wallet with provided ID: $userWalletId" 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 a71fe087c1..6ddb7efd6f 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 @@ -21,4 +21,6 @@ interface TxHistoryRepository { pageSize: Int, refresh: Boolean, ): Flow> + + fun getTxExploreUrl(txHash: String, networkId: Network.ID): String } \ No newline at end of file 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 new file mode 100644 index 0000000000..d5628aa838 --- /dev/null +++ b/domain/txhistory/src/main/kotlin/com/tangem/domain/txhistory/usecase/GetExplorerTransactionUrlUseCase.kt @@ -0,0 +1,12 @@ +package com.tangem.domain.txhistory.usecase + +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.txhistory.repository.TxHistoryRepository + +class GetExplorerTransactionUrlUseCase( + private val repository: TxHistoryRepository, +) { + operator fun invoke(txHash: String, networkId: Network.ID): String { + return repository.getTxExploreUrl(txHash, networkId) + } +} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsLoadedBalanceConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsLoadedBalanceConverter.kt index cf82bb5725..e29e728e6b 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsLoadedBalanceConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsLoadedBalanceConverter.kt @@ -13,6 +13,7 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDeta import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState import com.tangem.feature.tokendetails.presentation.tokendetails.state.components.TokenDetailsNotification import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.txhistory.TokenDetailsTxHistoryToTransactionStateConverter +import com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels.TokenDetailsClickIntents import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList @@ -23,10 +24,11 @@ internal class TokenDetailsLoadedBalanceConverter( private val appCurrencyProvider: Provider, private val symbol: String, private val decimals: Int, + private val clickIntents: TokenDetailsClickIntents, ) : Converter, TokenDetailsState> { private val txHistoryItemConverter by lazy { - TokenDetailsTxHistoryToTransactionStateConverter(symbol, decimals) + TokenDetailsTxHistoryToTransactionStateConverter(symbol, decimals, clickIntents) } override fun convert(value: Either): TokenDetailsState { diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt index e4904101e8..dd73a40465 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt @@ -48,6 +48,7 @@ internal class TokenDetailsStateFactory( appCurrencyProvider = appCurrencyProvider, symbol = symbol, decimals = decimals, + clickIntents = clickIntents, ) } @@ -181,10 +182,7 @@ internal class TokenDetailsStateFactory( ) } - fun getStateWithChooseAddressBottomSheet( - addresses: List
, - onAddressTypeClick: (AddressModel) -> Unit, - ): TokenDetailsState { + fun getStateWithChooseAddressBottomSheet(addresses: List
): TokenDetailsState { return currentStateProvider().copy( bottomSheetConfig = TangemBottomSheetConfig( isShow = true, @@ -196,7 +194,7 @@ internal class TokenDetailsStateFactory( type = AddressModel.Type.valueOf(it.type.name), ) }, - onClick = onAddressTypeClick, + onClick = clickIntents::onAddressTypeSelected, ), ), ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt index 0f700b9373..c0aead9837 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt @@ -30,6 +30,7 @@ internal class TokenDetailsTxHistoryItemFlowConverter( TokenDetailsTxHistoryTransactionStateConverter( symbol = symbol, decimals = decimals, + clickIntents = clickIntents, ) } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryToTransactionStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryToTransactionStateConverter.kt index 5c11efff45..9425cf38e5 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryToTransactionStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryToTransactionStateConverter.kt @@ -4,6 +4,7 @@ import com.tangem.core.ui.components.transactions.state.TransactionState import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.utils.DateTimeFormatters import com.tangem.domain.txhistory.models.TxHistoryItem +import com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels.TokenDetailsClickIntents import com.tangem.features.tokendetails.impl.R import com.tangem.utils.converter.Converter import com.tangem.utils.toBriefAddressFormat @@ -14,6 +15,7 @@ import org.joda.time.DateTimeZone internal class TokenDetailsTxHistoryToTransactionStateConverter( private val symbol: String, private val decimals: Int, + private val clickIntents: TokenDetailsClickIntents, ) : Converter { override fun convert(value: TxHistoryItem): TransactionState { @@ -21,6 +23,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( } // TODO: Finalize transaction types [REDACTED_JIRA] + @Suppress("LongMethod") private fun createTransactionStateItem(item: TxHistoryItem): TransactionState { return when (val type = item.type) { TxHistoryItem.TransactionType.Transfer -> mapTransfer(item) @@ -35,6 +38,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Deposit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Submit -> TransactionState.Custom( txHash = item.txHash, @@ -45,6 +49,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Submit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Supply -> TransactionState.Custom( txHash = item.txHash, @@ -55,6 +60,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Supply"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Unoswap -> TransactionState.Custom( txHash = item.txHash, @@ -65,6 +71,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Unoswap"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Withdraw -> TransactionState.Custom( txHash = item.txHash, @@ -75,6 +82,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Withdraw"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) is TxHistoryItem.TransactionType.Custom -> TransactionState.Custom( txHash = item.txHash, @@ -85,6 +93,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str(type.id), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } } @@ -97,6 +106,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( timestamp = item.timestampInMillis.toTimeFormat(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } @@ -108,6 +118,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( timestamp = item.timestampInMillis.toTimeFormat(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } private fun mapSwap(item: TxHistoryItem): TransactionState { @@ -118,6 +129,7 @@ internal class TokenDetailsTxHistoryToTransactionStateConverter( timestamp = item.timestampInMillis.toTimeFormat(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt index f4174cafae..6690c6d52f 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt @@ -3,6 +3,7 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.state.factory. import com.tangem.core.ui.components.transactions.state.TransactionState import com.tangem.core.ui.extensions.TextReference import com.tangem.domain.txhistory.models.TxHistoryItem +import com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels.TokenDetailsClickIntents import com.tangem.features.tokendetails.impl.R import com.tangem.utils.converter.Converter import com.tangem.utils.toBriefAddressFormat @@ -11,6 +12,7 @@ import com.tangem.utils.toFormattedCurrencyString internal class TokenDetailsTxHistoryTransactionStateConverter( private val symbol: String, private val decimals: Int, + private val clickIntents: TokenDetailsClickIntents, ) : Converter { override fun convert(value: TxHistoryItem): TransactionState { @@ -18,6 +20,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( } // TODO: Finalize transaction types [REDACTED_JIRA] + @Suppress("LongMethod") private fun createTransactionStateItem(item: TxHistoryItem): TransactionState { return when (val type = item.type) { TxHistoryItem.TransactionType.Transfer -> mapTransfer(item) @@ -32,6 +35,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Deposit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Submit -> TransactionState.Custom( txHash = item.txHash, @@ -42,6 +46,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Submit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Supply -> TransactionState.Custom( txHash = item.txHash, @@ -52,6 +57,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Supply"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Unoswap -> TransactionState.Custom( txHash = item.txHash, @@ -62,6 +68,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Unoswap"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Withdraw -> TransactionState.Custom( txHash = item.txHash, @@ -72,6 +79,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Withdraw"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) is TxHistoryItem.TransactionType.Custom -> TransactionState.Custom( txHash = item.txHash, @@ -82,6 +90,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str(type.id), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } } @@ -94,6 +103,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } @@ -105,6 +115,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } private fun mapSwap(item: TxHistoryItem): TransactionState { @@ -115,6 +126,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsClickIntents.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsClickIntents.kt index 1adc6b021d..be5c08eab8 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsClickIntents.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsClickIntents.kt @@ -1,5 +1,7 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels +import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel + interface TokenDetailsClickIntents { fun onBackClick() @@ -26,6 +28,10 @@ interface TokenDetailsClickIntents { fun onExploreClick() + fun onTransactionClick(txHash: String) + + fun onAddressTypeSelected(addressModel: AddressModel) + fun onDismissBottomSheet() fun onCloseRentInfoNotification() diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 1de3829916..4d5a4ad91a 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -9,6 +9,7 @@ import arrow.core.getOrElse import com.tangem.blockchain.common.address.AddressType import com.tangem.common.Provider import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel import com.tangem.core.ui.components.transactions.state.TxHistoryState import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency @@ -25,6 +26,7 @@ import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.usecase.GetExploreUrlUseCase +import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.feature.tokendetails.presentation.router.InnerTokenDetailsRouter import com.tangem.feature.tokendetails.presentation.tokendetails.analytics.TokenScreenEvent @@ -60,6 +62,7 @@ internal class TokenDetailsViewModel @Inject constructor( private val isBalanceHiddenUseCase: IsBalanceHiddenUseCase, private val listenToFlipsUseCase: ListenToFlipsUseCase, private val getCurrencyWarningsUseCase: GetCurrencyWarningsUseCase, + private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, private val walletManagersFacade: WalletManagersFacade, private val reduxStateHolder: ReduxStateHolder, private val analyticsEventsHandler: AnalyticsEventHandler, @@ -340,31 +343,41 @@ internal class TokenDetailsViewModel @Inject constructor( ) if (addresses.size == 1) { - openUrl(AddressType.Default) - } else { - uiState = stateFactory.getStateWithChooseAddressBottomSheet( - addresses = addresses, - onAddressTypeClick = { - openUrl(AddressType.valueOf(it.type.name)) - uiState = stateFactory.getStateWithClosedBottomSheet() - }, + router.openUrl( + url = getExploreUrlUseCase( + userWalletId = userWalletId, + network = cryptoCurrency.network, + addressType = AddressType.Default, + ), ) + } else { + uiState = stateFactory.getStateWithChooseAddressBottomSheet(addresses = addresses) } } } - private fun openUrl(addressType: AddressType) { + override fun onAddressTypeSelected(addressModel: AddressModel) { viewModelScope.launch { router.openUrl( url = getExploreUrlUseCase( userWalletId = userWalletId, network = cryptoCurrency.network, - addressType = addressType, + addressType = AddressType.valueOf(addressModel.type.name), ), ) + uiState = stateFactory.getStateWithClosedBottomSheet() } } + override fun onTransactionClick(txHash: String) { + router.openUrl( + url = getExplorerTransactionUrlUseCase( + txHash = txHash, + networkId = cryptoCurrency.network.id, + ), + ) + } + override fun onRefreshSwipe() { analyticsEventsHandler.send(TokenScreenEvent.Refreshed(cryptoCurrency.symbol)) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index 9f6b97b22b..2cc53a625c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -426,6 +426,7 @@ internal object WalletPreviewData { timestamp = "8:41", status = TransactionState.Content.Status.Unconfirmed, direction = TransactionState.Content.Direction.OUTGOING, + onClick = {}, ), ), TxHistoryState.TxHistoryItemState.GroupTitle("Yesterday"), @@ -437,6 +438,7 @@ internal object WalletPreviewData { timestamp = "8:41", status = TransactionState.Content.Status.Confirmed, direction = TransactionState.Content.Direction.OUTGOING, + onClick = {}, ), ), ), diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 08206005d7..cf0a846de9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -108,7 +108,7 @@ internal class DefaultWalletRouter(private val reduxNavController: ReduxNavContr ) } - override fun openTxHistoryWebsite(url: String) { + override fun openUrl(url: String) { reduxNavController.navigate(action = NavigationAction.OpenUrl(url)) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt index 8234b7a917..5354359c05 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt @@ -40,7 +40,7 @@ internal interface InnerWalletRouter : WalletRouter { fun openOnboardingScreen() /** Open transaction history website by [url] */ - fun openTxHistoryWebsite(url: String) + fun openUrl(url: String) /** Open token details screen */ fun openTokenDetails(userWalletId: UserWalletId, currency: CryptoCurrency) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt index 0c5b962d71..245cfa94e8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt @@ -43,6 +43,7 @@ internal class WalletTxHistoryItemFlowConverter( WalletTxHistoryTransactionStateConverter( symbol = blockchain.currency, decimals = blockchain.decimals(), + clickIntents = clickIntents, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryTransactionStateConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryTransactionStateConverter.kt index ece331befc..b43fbb3029 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryTransactionStateConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryTransactionStateConverter.kt @@ -4,13 +4,15 @@ import com.tangem.core.ui.components.transactions.state.TransactionState import com.tangem.core.ui.extensions.TextReference import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.feature.wallet.impl.R +import com.tangem.feature.wallet.presentation.wallet.viewmodels.WalletClickIntents import com.tangem.utils.converter.Converter import com.tangem.utils.toBriefAddressFormat import com.tangem.utils.toFormattedCurrencyString -class WalletTxHistoryTransactionStateConverter( +internal class WalletTxHistoryTransactionStateConverter( private val symbol: String, private val decimals: Int, + private val clickIntents: WalletClickIntents, ) : Converter { override fun convert(value: TxHistoryItem): TransactionState { @@ -18,6 +20,7 @@ class WalletTxHistoryTransactionStateConverter( } // TODO: Finalize transaction types [REDACTED_JIRA] + @Suppress("LongMethod") private fun createTransactionStateItem(item: TxHistoryItem): TransactionState { return when (val type = item.type) { TxHistoryItem.TransactionType.Transfer -> mapTransfer(item) @@ -32,6 +35,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Deposit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Submit -> TransactionState.Custom( txHash = item.txHash, @@ -42,6 +46,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Submit"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Supply -> TransactionState.Custom( txHash = item.txHash, @@ -52,6 +57,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Supply"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Unoswap -> TransactionState.Custom( txHash = item.txHash, @@ -62,6 +68,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Unoswap"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) TxHistoryItem.TransactionType.Withdraw -> TransactionState.Custom( txHash = item.txHash, @@ -72,6 +79,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str("Withdraw"), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) is TxHistoryItem.TransactionType.Custom -> TransactionState.Custom( txHash = item.txHash, @@ -82,6 +90,7 @@ class WalletTxHistoryTransactionStateConverter( direction = item.direction.toUiDirection(), title = TextReference.Str(type.id), subtitle = item.direction.extractAddress(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } } @@ -94,6 +103,7 @@ class WalletTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } @@ -105,6 +115,7 @@ class WalletTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } private fun mapSwap(item: TxHistoryItem): TransactionState { @@ -115,6 +126,7 @@ class WalletTxHistoryTransactionStateConverter( timestamp = item.getRawTimestamp(), status = item.status.tiUiStatus(), direction = item.direction.toUiDirection(), + onClick = { clickIntents.onTransactionClick(item.txHash) }, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletClickIntents.kt index 06fc109344..193377047c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletClickIntents.kt @@ -72,4 +72,6 @@ internal interface WalletClickIntents { fun onReloadClick() fun onExploreClick() + + fun onTransactionClick(txHash: String) } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 20d3f08f1a..8c97e1e814 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -47,6 +47,7 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.NetworkGroup import com.tangem.domain.tokens.model.TokenList import com.tangem.domain.tokens.models.analytics.TokenReceiveAnalyticsEvent +import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase import com.tangem.domain.userwallets.UserWalletBuilder @@ -119,6 +120,7 @@ internal class WalletViewModel @Inject constructor( private val remindToRateAppLaterUseCase: RemindToRateAppLaterUseCase, private val neverToSuggestRateAppUseCase: NeverToSuggestRateAppUseCase, private val setWalletWithFundsFoundUseCase: SetWalletWithFundsFoundUseCase, + private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, wasCardScannedUseCase: WasCardScannedUseCase, isReadyToShowRateAppUseCase: IsReadyToShowRateAppUseCase, isDemoCardUseCase: IsDemoCardUseCase, @@ -702,7 +704,7 @@ internal class WalletViewModel @Inject constructor( ?.getOrNull() if (currencyStatus != null) { - router.openTxHistoryWebsite( + router.openUrl( url = getExploreUrlUseCase( userWalletId = wallet.walletId, network = currencyStatus.currency.network, @@ -829,6 +831,26 @@ internal class WalletViewModel @Inject constructor( } } + override fun onTransactionClick(txHash: String) { + viewModelScope.launch(dispatchers.io) { + val wallet = getWallet( + index = requireNotNull(uiState as? WalletState.ContentState).walletsListConfig.selectedWalletIndex, + ) + val currencyStatus = getPrimaryCurrencyStatusUpdatesUseCase(wallet.walletId) + .firstOrNull() + ?.getOrNull() + + if (currencyStatus != null) { + router.openUrl( + url = getExplorerTransactionUrlUseCase( + txHash = txHash, + networkId = currencyStatus.currency.network.id, + ), + ) + } + } + } + private suspend fun getHideTokeAlert( userWalletId: UserWalletId, cryptoCurrencyStatus: CryptoCurrencyStatus, diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index e580c27332..5f97e0c940 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -82,7 +82,7 @@ okHttp-prettyLogging = "3.1.0" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-355" +tangemBlockchainSdk = "develop-356" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-302" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds