Updated on 2026-08-14

This commit is contained in:
Tangem 2024-02-27 16:11:50 +05:00
parent f3906a385a
commit 0fae3c188c
5 changed files with 92 additions and 1 deletions

View file

@ -3,6 +3,7 @@ package com.tangem.tap.di.domain
import com.tangem.domain.tokens.* import com.tangem.domain.tokens.*
import com.tangem.domain.txhistory.repository.TxHistoryRepository import com.tangem.domain.txhistory.repository.TxHistoryRepository
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
import com.tangem.domain.txhistory.usecase.GetFixedTxHistoryItemsUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase
import dagger.Module import dagger.Module
@ -34,4 +35,10 @@ internal object TxHistoryDomainModule {
): GetExplorerTransactionUrlUseCase { ): GetExplorerTransactionUrlUseCase {
return GetExplorerTransactionUrlUseCase(repository = txHistoryRepository) return GetExplorerTransactionUrlUseCase(repository = txHistoryRepository)
} }
@Provides
@ViewModelScoped
fun providesGetFixedTxHistoryItemsUseCase(txHistoryRepository: TxHistoryRepository): GetFixedTxHistoryItemsUseCase {
return GetFixedTxHistoryItemsUseCase(repository = txHistoryRepository)
}
} }

View file

@ -10,11 +10,13 @@ import com.tangem.datasource.local.txhistory.TxHistoryItemsStore
import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network import com.tangem.domain.tokens.model.Network
import com.tangem.domain.txhistory.models.Page
import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.domain.txhistory.models.TxHistoryItem
import com.tangem.domain.txhistory.models.TxHistoryState import com.tangem.domain.txhistory.models.TxHistoryState
import com.tangem.domain.txhistory.models.TxHistoryStateError import com.tangem.domain.txhistory.models.TxHistoryStateError
import com.tangem.domain.txhistory.repository.TxHistoryRepository import com.tangem.domain.txhistory.repository.TxHistoryRepository
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.walletmanager.utils.SdkPageConverter
import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -25,6 +27,7 @@ class DefaultTxHistoryRepository(
private val userWalletsStore: UserWalletsStore, private val userWalletsStore: UserWalletsStore,
private val txHistoryItemsStore: TxHistoryItemsStore, private val txHistoryItemsStore: TxHistoryItemsStore,
) : TxHistoryRepository { ) : TxHistoryRepository {
private val sdkPageConverter by lazy { SdkPageConverter() }
override suspend fun getTxHistoryItemsCount(userWalletId: UserWalletId, currency: CryptoCurrency): Int { override suspend fun getTxHistoryItemsCount(userWalletId: UserWalletId, currency: CryptoCurrency): Int {
val userWallet = getUserWallet(userWalletId) val userWallet = getUserWallet(userWalletId)
@ -74,6 +77,43 @@ class DefaultTxHistoryRepository(
} }
} }
override suspend fun getFixedSizeTxHistoryItems(
userWalletId: UserWalletId,
currency: CryptoCurrency,
pageSize: Int,
refresh: Boolean,
): List<TxHistoryItem> {
cacheRegistry.invokeOnExpire(
key = getTxHistoryPageKey(currency, userWalletId, Page.Initial),
skipCache = refresh,
block = { fetchFixedSizeTxHistoryItems(userWalletId, currency, pageSize) },
)
val txs = txHistoryItemsStore.getSyncOrNull(
key = TxHistoryItemsStore.Key(userWalletId, currency),
page = Page.Initial,
)?.items
return txs ?: emptyList()
}
private fun getTxHistoryPageKey(currency: CryptoCurrency, userWalletId: UserWalletId, page: Page): String {
return "tx_history_page_${currency}_${userWalletId}_$page"
}
private suspend fun fetchFixedSizeTxHistoryItems(
userWalletId: UserWalletId,
currency: CryptoCurrency,
pageSize: Int,
) {
val wrappedItems = walletManagersFacade.getTxHistoryItems(
userWalletId = userWalletId,
currency = currency,
page = sdkPageConverter.convertBack(Page.Initial),
pageSize = pageSize,
)
txHistoryItemsStore.store(TxHistoryItemsStore.Key(userWalletId, currency), wrappedItems)
}
private suspend fun getUserWallet(userWalletId: UserWalletId): UserWallet { private suspend fun getUserWallet(userWalletId: UserWalletId): UserWallet {
return requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { return requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) {
"Unable to find user wallet with provided ID: $userWalletId" "Unable to find user wallet with provided ID: $userWalletId"

View file

@ -23,4 +23,12 @@ interface TxHistoryRepository {
): Flow<PagingData<TxHistoryItem>> ): Flow<PagingData<TxHistoryItem>>
fun getTxExploreUrl(txHash: String, networkId: Network.ID): String fun getTxExploreUrl(txHash: String, networkId: Network.ID): String
@Throws(TxHistoryListError::class)
suspend fun getFixedSizeTxHistoryItems(
userWalletId: UserWalletId,
currency: CryptoCurrency,
pageSize: Int,
refresh: Boolean,
): List<TxHistoryItem>
} }

View file

@ -0,0 +1,36 @@
package com.tangem.domain.txhistory.usecase
import arrow.core.Either
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.txhistory.models.TxHistoryItem
import com.tangem.domain.txhistory.models.TxHistoryListError
import com.tangem.domain.txhistory.repository.TxHistoryRepository
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
/**
* Returns first page with size [DEFAULT_PAGE_SIZE] of tx history.
* Page size is preserved to reuse cached data in Token Details Screen.
*
* IMPORTANT!!!
* If page size bigger than [DEFAULT_PAGE_SIZE] is needed consider to implement another use case
* without use of cached data or increase [DEFAULT_PAGE_SIZE]
*/
class GetFixedTxHistoryItemsUseCase(
private val repository: TxHistoryRepository,
) {
operator fun invoke(
userWalletId: UserWalletId,
currency: CryptoCurrency,
pageSize: Int = DEFAULT_PAGE_SIZE,
refresh: Boolean = false,
): Either<TxHistoryListError, Flow<List<TxHistoryItem>>> {
return Either.catch {
flow {
emit(repository.getFixedSizeTxHistoryItems(userWalletId, currency, pageSize, refresh))
}
}.mapLeft { TxHistoryListError.DataError(it) }
}
}

View file

@ -11,7 +11,7 @@ import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
private const val DEFAULT_PAGE_SIZE = 50 const val DEFAULT_PAGE_SIZE = 50
// TODO: Add tests // TODO: Add tests
class GetTxHistoryItemsUseCase(private val repository: TxHistoryRepository) { class GetTxHistoryItemsUseCase(private val repository: TxHistoryRepository) {