Updated on 2026-08-14
This commit is contained in:
parent
7fb168b533
commit
7df5f9edc2
22 changed files with 153 additions and 22 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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()),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -21,4 +21,6 @@ interface TxHistoryRepository {
|
|||
pageSize: Int,
|
||||
refresh: Boolean,
|
||||
): Flow<PagingData<TxHistoryItem>>
|
||||
|
||||
fun getTxExploreUrl(txHash: String, networkId: Network.ID): String
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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<AppCurrency>,
|
||||
private val symbol: String,
|
||||
private val decimals: Int,
|
||||
private val clickIntents: TokenDetailsClickIntents,
|
||||
) : Converter<Either<CurrencyStatusError, CryptoCurrencyStatus>, TokenDetailsState> {
|
||||
|
||||
private val txHistoryItemConverter by lazy {
|
||||
TokenDetailsTxHistoryToTransactionStateConverter(symbol, decimals)
|
||||
TokenDetailsTxHistoryToTransactionStateConverter(symbol, decimals, clickIntents)
|
||||
}
|
||||
|
||||
override fun convert(value: Either<CurrencyStatusError, CryptoCurrencyStatus>): TokenDetailsState {
|
||||
|
|
|
|||
|
|
@ -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<Address>,
|
||||
onAddressTypeClick: (AddressModel) -> Unit,
|
||||
): TokenDetailsState {
|
||||
fun getStateWithChooseAddressBottomSheet(addresses: List<Address>): 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,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ internal class TokenDetailsTxHistoryItemFlowConverter(
|
|||
TokenDetailsTxHistoryTransactionStateConverter(
|
||||
symbol = symbol,
|
||||
decimals = decimals,
|
||||
clickIntents = clickIntents,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<TxHistoryItem, TransactionState> {
|
||||
|
||||
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) },
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<TxHistoryItem, TransactionState> {
|
||||
|
||||
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) },
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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 = {},
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ internal class WalletTxHistoryItemFlowConverter(
|
|||
WalletTxHistoryTransactionStateConverter(
|
||||
symbol = blockchain.currency,
|
||||
decimals = blockchain.decimals(),
|
||||
clickIntents = clickIntents,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<TxHistoryItem, TransactionState> {
|
||||
|
||||
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) },
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,4 +72,6 @@ internal interface WalletClickIntents {
|
|||
fun onReloadClick()
|
||||
|
||||
fun onExploreClick()
|
||||
|
||||
fun onTransactionClick(txHash: String)
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue