Updated on 2026-08-14

This commit is contained in:
Tangem 2023-07-28 18:28:34 +03:00
parent f2ab3a948d
commit 171732a41a
14 changed files with 162 additions and 45 deletions

View file

@ -46,14 +46,31 @@ internal class DefaultTokensRepository(
storeAndPushTokens(userWalletId, response)
}
override fun getTokens(userWalletId: UserWalletId, refresh: Boolean): Flow<Set<Token>> = channelFlow {
override suspend fun getSingleCurrencyWalletToken(userWalletId: UserWalletId): Token {
val userWallet = withContext(dispatchers.io) {
requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) {
"Unable to find a user wallet with provided ID: $userWalletId"
}
}
require(!userWallet.isMultiCurrency) {
"Single currency wallet excepted, but multi currency wallet was found: $userWalletId"
}
return cardTokensFactory
.createPrimaryTokenForSingleCurrencyCard(userWallet.scanResponse)
}
override fun getMultiCurrencyWalletTokens(userWalletId: UserWalletId, refresh: Boolean): Flow<Set<Token>> {
return channelFlow {
val userWallet = withContext(dispatchers.io) {
requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) {
"Unable to find a user wallet with provided ID: $userWalletId"
}
}
require(!userWallet.isMultiCurrency) {
"Multi currency wallet excepted, but single currency wallet was found: $userWalletId"
}
if (userWallet.isMultiCurrency) {
launch(dispatchers.io) {
getMultiCurrencyWalletTokens(userWallet).collectLatest(::send)
}
@ -61,8 +78,6 @@ internal class DefaultTokensRepository(
launch(dispatchers.io) {
fetchTokensIfCacheExpired(userWallet, refresh)
}
} else {
send(getSingleCurrencyWalletTokens(userWallet))
}
}
@ -87,22 +102,6 @@ internal class DefaultTokensRepository(
}
}
private suspend fun getSingleCurrencyWalletTokens(userWallet: UserWallet): Set<Token> {
var response = userTokensStore.getSyncOrNull(userWallet.walletId)
if (response == null) {
response = userTokensResponseFactory.createUserTokensResponse(
tokens = cardTokensFactory.createTokensForSingleCurrencyCard(userWallet.scanResponse),
isGroupedByNetwork = false,
isSortedByBalance = false,
)
userTokensStore.store(userWallet.walletId, response)
}
return responseTokensFactory.createTokens(response, userWallet.scanResponse.card)
}
private suspend fun fetchTokensIfCacheExpired(userWallet: UserWallet, refresh: Boolean) {
cacheRegistry.invokeOnExpire(
key = getTokensCacheKey(userWallet.walletId),

View file

@ -27,7 +27,7 @@ internal class CardTokensFactory(private val demoConfig: DemoConfig) {
return blockchains.mapNotNull { createCoin(it, card) }.toSet()
}
fun createTokensForSingleCurrencyCard(scanResponse: ScanResponse): Set<DomainToken> {
fun createPrimaryTokenForSingleCurrencyCard(scanResponse: ScanResponse): DomainToken {
val card = scanResponse.card
val resolver = scanResponse.cardTypesResolver
val blockchain = resolver.getBlockchain()
@ -39,13 +39,7 @@ internal class CardTokensFactory(private val demoConfig: DemoConfig) {
createToken(token, blockchain, card)
}
return buildSet {
add(coin)
if (primaryToken != null) {
add(primaryToken)
}
}
return primaryToken ?: coin
}
private fun createToken(sdkToken: SdkToken, blockchain: Blockchain, card: CardDTO): DomainToken? {