Updated on 2026-08-14
This commit is contained in:
parent
f2ab3a948d
commit
171732a41a
14 changed files with 162 additions and 45 deletions
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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? {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue