diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt index 23edacd61b..4a52e5d13e 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt @@ -135,4 +135,13 @@ interface TangemTechApi { @ReadTimeout(duration = 5, unit = TimeUnit.SECONDS) @GET("networks/providers") suspend fun getBlockchainProviders(): Map> + + companion object { + val marketsQuoteFields = listOf( + "price", + "priceChange24h", + "priceChange1w", + "priceChange30d", + ) + } } \ No newline at end of file diff --git a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt index 39637200e5..79576d75c3 100644 --- a/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt +++ b/data/markets/src/main/java/com/tangem/data/markets/DefaultMarketsTokenRepository.kt @@ -9,14 +9,17 @@ import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.data.common.currency.getNetwork import com.tangem.data.common.utils.retryOnError import com.tangem.data.markets.analytics.MarketsDataAnalyticsEvent +import com.tangem.data.markets.converters.* import com.tangem.data.markets.converters.TokenChartConverter import com.tangem.data.markets.converters.TokenMarketInfoConverter import com.tangem.data.markets.converters.TokenMarketListConverter +import com.tangem.data.markets.converters.TokenQuotesShortConverter import com.tangem.data.markets.converters.toRequestParam import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.markets.TangemTechMarketsApi import com.tangem.datasource.api.tangemTech.TangemTechApi +import com.tangem.datasource.api.tangemTech.TangemTechApi.Companion.marketsQuoteFields import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.markets.* @@ -188,16 +191,24 @@ internal class DefaultMarketsTokenRepository( return TokenMarketInfoConverter.convert(resultResponse) } - override suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String): TokenQuotes { - // TODO change method when backend is ready - // add error analytics event - val response = marketsApi.getCoinMarketData( - currency = fiatCurrencyCode, - coinId = tokenId, - language = "en", + override suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String, tokenSymbol: String): TokenQuotes { + // for second markets iteration we should use extended api method with all required fields + val response = tangemTechApi.getQuotes( + currencyId = fiatCurrencyCode, + coinIds = tokenId, + fields = marketsQuoteFields.joinToString(separator = ","), ) - return TokenMarketInfoConverter.convert(response.getOrThrow()).quotes + val result = catchApiErrorAndSendEvent( + errorEvent = MarketsDataAnalyticsEvent.Details.Error( + request = MarketsDataAnalyticsEvent.Details.Error.Request.Info, + tokenSymbol = tokenSymbol, + ), + ) { + response.getOrThrow() + } + + return TokenQuotesShortConverter.convert(tokenId, result).toFull() } override suspend fun createCryptoCurrency( diff --git a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotes.kt b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotes.kt index 18826801e3..56bd39c7c1 100644 --- a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotes.kt +++ b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotes.kt @@ -11,4 +11,17 @@ data class TokenQuotes( val m6ChangePercent: BigDecimal?, val yearChangePercent: BigDecimal?, val allTimeChangePercent: BigDecimal?, -) \ No newline at end of file +) + +fun TokenQuotes.populateWith(quotes: TokenQuotes): TokenQuotes { + return TokenQuotes( + currentPrice = quotes.currentPrice, + h24ChangePercent = quotes.h24ChangePercent ?: this.h24ChangePercent, + weekChangePercent = quotes.weekChangePercent ?: this.weekChangePercent, + monthChangePercent = quotes.monthChangePercent ?: this.monthChangePercent, + m3ChangePercent = quotes.m3ChangePercent ?: this.m3ChangePercent, + m6ChangePercent = quotes.m6ChangePercent ?: this.m6ChangePercent, + yearChangePercent = quotes.yearChangePercent ?: this.yearChangePercent, + allTimeChangePercent = quotes.allTimeChangePercent ?: this.allTimeChangePercent, + ) +} \ No newline at end of file diff --git a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotesShort.kt b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotesShort.kt index 3b6bb3bdf1..ce2ff4bb71 100644 --- a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotesShort.kt +++ b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenQuotesShort.kt @@ -7,4 +7,15 @@ data class TokenQuotesShort( val h24ChangePercent: BigDecimal, val weekChangePercent: BigDecimal, val monthChangePercent: BigDecimal, +) + +fun TokenQuotesShort.toFull() = TokenQuotes( + currentPrice = currentPrice, + h24ChangePercent = h24ChangePercent, + weekChangePercent = weekChangePercent, + monthChangePercent = monthChangePercent, + m3ChangePercent = null, + m6ChangePercent = null, + yearChangePercent = null, + allTimeChangePercent = null, ) \ No newline at end of file diff --git a/domain/markets/src/main/java/com/tangem/domain/markets/GetTokenFullQuotesUseCase.kt b/domain/markets/src/main/java/com/tangem/domain/markets/GetTokenFullQuotesUseCase.kt index a755057a98..e8b8470add 100644 --- a/domain/markets/src/main/java/com/tangem/domain/markets/GetTokenFullQuotesUseCase.kt +++ b/domain/markets/src/main/java/com/tangem/domain/markets/GetTokenFullQuotesUseCase.kt @@ -7,11 +7,16 @@ import com.tangem.domain.markets.repositories.MarketsTokenRepository class GetTokenFullQuotesUseCase( private val marketsTokenRepository: MarketsTokenRepository, ) { - suspend operator fun invoke(appCurrency: AppCurrency, tokenId: String): Either { + suspend operator fun invoke( + appCurrency: AppCurrency, + tokenId: String, + tokenSymbol: String, + ): Either { return Either.catch { marketsTokenRepository.getTokenQuotes( fiatCurrencyCode = appCurrency.code, tokenId = tokenId, + tokenSymbol = tokenSymbol, ) }.mapLeft {} } diff --git a/domain/markets/src/main/java/com/tangem/domain/markets/repositories/MarketsTokenRepository.kt b/domain/markets/src/main/java/com/tangem/domain/markets/repositories/MarketsTokenRepository.kt index c9ff5dae64..f28da22c7b 100644 --- a/domain/markets/src/main/java/com/tangem/domain/markets/repositories/MarketsTokenRepository.kt +++ b/domain/markets/src/main/java/com/tangem/domain/markets/repositories/MarketsTokenRepository.kt @@ -33,7 +33,7 @@ interface MarketsTokenRepository { languageCode: String, ): TokenMarketInfo - suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String): TokenQuotes + suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String, tokenSymbol: String): TokenQuotes suspend fun createCryptoCurrency( userWalletId: UserWalletId, diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt index 5f12f70b59..647c40534c 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/MarketsTokenDetailsModel.kt @@ -229,6 +229,7 @@ internal class MarketsTokenDetailsModel @Inject constructor( val result = getTokenFullQuotesUseCase( tokenId = params.token.id, appCurrency = currentAppCurrency.value, + tokenSymbol = params.token.symbol, ) result.onRight { res -> @@ -389,9 +390,11 @@ internal class MarketsTokenDetailsModel @Inject constructor( } private suspend fun updateQuotes(newQuotes: TokenQuotes) { - quotesStateUpdater.updateQuotes(newQuotes) + val populatedNewQuotes = currentQuotes.value.populateWith(newQuotes) - val percent = newQuotes + quotesStateUpdater.updateQuotes(newQuotes = populatedNewQuotes) + + val percent = populatedNewQuotes .getPercentByInterval(interval = state.value.selectedInterval) chartDataProducer.runTransaction {