diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/UserTokensResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/UserTokensResponse.kt index 46432b2d8c..80e222a51b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/UserTokensResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/UserTokensResponse.kt @@ -25,6 +25,8 @@ data class UserTokensResponse( override fun equals(other: Any?): Boolean { val otherToken = other as? Token ?: return false + // use only this fields is enough and correct to compare, don't add id or smth + // to avoid duplicates for tokens on main screen return otherToken.contractAddress == this.contractAddress && otherToken.networkId == this.networkId && otherToken.derivationPath == this.derivationPath && diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt index dae6959b59..da22162e0a 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CustomTokensMerger.kt @@ -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 }