From 0cfab87af822afb3dd55a15f95db6f03f25ea78e Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 28 Jan 2026 12:27:26 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../news/repository/DefaultNewsRepository.kt | 4 ++-- .../feed/components/DefaultFeedEntryComponent.kt | 2 +- .../analytics/MarketTokenAnalyticsEvent.kt | 14 ++++++++------ .../market/details/MarketsTokenDetailsModel.kt | 5 +++-- .../feed/model/news/details/NewsDetailsModel.kt | 16 ++++++++++++---- .../analytics/NewsDetailsAnalyticsEvent.kt | 11 +++++++++++ 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt b/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt index a76785afcf..84318ce9e7 100644 --- a/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt +++ b/data/news/src/main/java/com/tangem/data/news/repository/DefaultNewsRepository.kt @@ -225,7 +225,7 @@ internal class DefaultNewsRepository( when (val apiResponse = newsApi.getTrendingNews(limit = limit, language = language)) { is ApiResponse.Error -> { Timber.e( - apiResponse.cause.cause, + apiResponse.cause, "Trending news fetch failed cause: ${ when (val error = apiResponse.cause) { is ApiResponseError.HttpException -> error.code @@ -238,7 +238,7 @@ internal class DefaultNewsRepository( trendingNewsStore.clear() trendingNewsStore.store( key = TRENDING_NEWS_KEY, - value = TrendingNews.Error(error = newsErrorResolver.resolve(apiResponse.cause.cause)), + value = TrendingNews.Error(error = newsErrorResolver.resolve(apiResponse.cause)), ) } is ApiResponse.Success -> { diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt index 0be2031e7d..edbc89d7d4 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt @@ -74,7 +74,7 @@ internal class DefaultFeedEntryComponent @AssistedInject constructor( onArticleClick( articleId = articleId, preselectedArticlesId = preselectedArticlesId, - screenSource = AnalyticsParam.ScreensSources.Markets, + screenSource = AnalyticsParam.ScreensSources.Token, ) }, ), diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/analytics/MarketTokenAnalyticsEvent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/analytics/MarketTokenAnalyticsEvent.kt index 255e31fb5b..4144ee8c77 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/analytics/MarketTokenAnalyticsEvent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/analytics/MarketTokenAnalyticsEvent.kt @@ -13,33 +13,35 @@ internal sealed class MarketTokenAnalyticsEvent( ) : AnalyticsEvent(category = "CoinPage", event = event, params = params) { data class TokenNewsViewed( - private val token: String, + private val tokenSymbol: String, ) : MarketTokenAnalyticsEvent( event = "Token News Viewed", params = mapOf( - AnalyticsParam.TOKEN_PARAM to token, + AnalyticsParam.TOKEN_PARAM to tokenSymbol, ), ), OneTimePerSessionEvent { - override val oneTimeEventId: String = event + token + override val oneTimeEventId: String = event + tokenSymbol } data class TokenNewsCarouselScrolled( - private val token: String, + private val tokenSymbol: String, ) : MarketTokenAnalyticsEvent( event = "Token News Carousel Scrolled", params = mapOf( - AnalyticsParam.TOKEN_PARAM to token, + AnalyticsParam.TOKEN_PARAM to tokenSymbol, ), ), OneTimePerSessionEvent { - override val oneTimeEventId: String = event + token + override val oneTimeEventId: String = event + tokenSymbol } data class TokenNewsLoadError( + private val tokenSymbol: String, private val code: Int?, private val message: String, ) : MarketTokenAnalyticsEvent( event = "Token News Load Error", params = mapOf( + AnalyticsParam.TOKEN_PARAM to tokenSymbol, ERROR_CODE to (code ?: IS_NOT_HTTP_ERROR).toString(), ERROR_MESSAGE to message, ), diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt index b3675953a2..9d3d1ecd4b 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/details/MarketsTokenDetailsModel.kt @@ -329,14 +329,14 @@ internal class MarketsTokenDetailsModel @Inject constructor( onFirstVisible = { analyticsEventHandler.send( MarketTokenAnalyticsEvent.TokenNewsViewed( - token = params.token.symbol, + tokenSymbol = params.token.symbol, ), ) }, onScroll = { analyticsEventHandler.send( MarketTokenAnalyticsEvent.TokenNewsCarouselScrolled( - token = params.token.symbol, + tokenSymbol = params.token.symbol, ), ) }, @@ -351,6 +351,7 @@ internal class MarketsTokenDetailsModel @Inject constructor( } analyticsEventHandler.send( MarketTokenAnalyticsEvent.TokenNewsLoadError( + tokenSymbol = params.token.symbol, code = code, message = message, ), diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt index 3ea4a9c266..5752717896 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/NewsDetailsModel.kt @@ -208,28 +208,36 @@ internal class NewsDetailsModel @Inject constructor( newsIds = params.preselectedArticlesId, language = currentLanguage, ).onLeft { errors -> - errors.onEach { (newsId, throwable) -> + errors.onEach { (newsId, error) -> when { // an article is opened from deeplink and is not found params.screenSource == AnalyticsParam.ScreensSources.NewsLink.value && newsId == params.articleId && - throwable is ApiResponseError.HttpException && - throwable.code == ApiResponseError.HttpException.Code.NOT_FOUND + error is ApiResponseError.HttpException && + error.code == ApiResponseError.HttpException.Code.NOT_FOUND -> { analyticsEventHandler.send( NewsDetailsAnalyticsEvent.NewsLinkMismatch( newsId = params.articleId, + code = error.code.numericCode, + message = error.message.orEmpty(), ), ) } // global request executing error newsId < 0 -> { - Timber.e(throwable) + Timber.e(error) } else -> { + val (code, message) = when (error) { + is ApiResponseError.HttpException -> error.code.numericCode to error.message.orEmpty() + else -> null to "" + } analyticsEventHandler.send( NewsDetailsAnalyticsEvent.NewsArticleLoadError( newsId = newsId, + code = code, + message = message, ), ) } diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/analytics/NewsDetailsAnalyticsEvent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/analytics/NewsDetailsAnalyticsEvent.kt index 128235303e..6e43d74467 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/analytics/NewsDetailsAnalyticsEvent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/news/details/analytics/NewsDetailsAnalyticsEvent.kt @@ -2,6 +2,9 @@ package com.tangem.features.feed.model.news.details.analytics import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_CODE +import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_MESSAGE +import com.tangem.core.analytics.models.IS_NOT_HTTP_ERROR import com.tangem.core.analytics.models.OneTimePerSessionEvent internal sealed class NewsDetailsAnalyticsEvent( @@ -44,19 +47,27 @@ internal sealed class NewsDetailsAnalyticsEvent( data class NewsArticleLoadError( private val newsId: Int, + private val code: Int?, + private val message: String, ) : NewsDetailsAnalyticsEvent( event = "News Article Load Error", params = mapOf( "News Id" to newsId.toString(), + ERROR_CODE to (code ?: IS_NOT_HTTP_ERROR).toString(), + ERROR_MESSAGE to message, ), ) data class NewsLinkMismatch( private val newsId: Int, + private val code: Int?, + private val message: String, ) : NewsDetailsAnalyticsEvent( event = "News Link Mismatch", params = mapOf( "News Id" to newsId.toString(), + ERROR_CODE to (code ?: IS_NOT_HTTP_ERROR).toString(), + ERROR_MESSAGE to message, ), ) } \ No newline at end of file