Updated on 2026-08-14

This commit is contained in:
Tangem 2025-03-13 18:43:33 +03:00
parent 82d2b4c9d7
commit c6ce899e8f
2 changed files with 22 additions and 6 deletions

View file

@ -1,5 +1,6 @@
package com.tangem.data.tokens.utils
import arrow.atomic.AtomicBoolean
import com.tangem.data.common.api.safeApiCall
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
@ -31,31 +32,44 @@ internal class CustomTokensMerger(
* @return A potentially updated UserTokensResponse, with custom tokens merged if necessary.
*/
suspend fun mergeIfPresented(userWalletId: UserWalletId, response: UserTokensResponse): UserTokensResponse {
// use flag to check: we can't compare two token list after merge because Token equals don't include some fields
val wasMerged = AtomicBoolean(false)
val mergedTokens = withContext(dispatchers.default) {
response.tokens
.map { token ->
async { mergeIfPresented(token) }
async { mergeIfPresented(token, wasMerged) }
}
.awaitAll()
}
val updatedResponse = response.copy(tokens = mergedTokens)
if (response.tokens != updatedResponse.tokens) {
// previously here was used compare response.tokens, but it's not working correctly
// because Token.equals() skip some fields
if (wasMerged.value) {
pushTokens(userWalletId, updatedResponse)
}
return updatedResponse
}
private suspend fun mergeIfPresented(token: UserTokensResponse.Token): UserTokensResponse.Token {
private suspend fun mergeIfPresented(
token: UserTokensResponse.Token,
wasMerged: AtomicBoolean,
): UserTokensResponse.Token {
if (isCoinOrNonCustomToken(token)) return token
return merge(token)
return merge(token, wasMerged)
}
private suspend fun merge(customToken: UserTokensResponse.Token): UserTokensResponse.Token {
private suspend fun merge(
customToken: UserTokensResponse.Token,
wasMerged: AtomicBoolean,
): UserTokensResponse.Token {
val foundToken = fetchToken(customToken)
if (foundToken != null) {
wasMerged.set(true)
}
return foundToken ?: customToken
}