From 1c17a8389aeebaee304391c359e76d39f2960015 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 20 Apr 2026 19:04:32 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../api/PromoBannersBlockComponent.kt | 6 +++--- .../impl/model/PromoBannersBlockModel.kt | 20 ++++++++++--------- .../DefaultPromoBannersRepository.kt | 7 +------ 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/PromoBannersBlockComponent.kt b/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/PromoBannersBlockComponent.kt index e97e39f047..57c0e3844a 100644 --- a/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/PromoBannersBlockComponent.kt +++ b/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/PromoBannersBlockComponent.kt @@ -12,9 +12,9 @@ interface PromoBannersBlockComponent : ComposableContentComponent { val isInitiallyVisibleOnScreen: Boolean = true, ) - enum class Placeholder { - MAIN, - FEED, + enum class Placeholder(val value: String) { + MAIN("main"), + FEED("shtorka"), } interface Factory : ComponentFactory diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt index d4a633984f..7abc5a48bd 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/model/PromoBannersBlockModel.kt @@ -21,6 +21,8 @@ import java.util.Locale import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject +private typealias ShownBannerKey = Pair + @ModelScoped internal class PromoBannersBlockModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -34,8 +36,8 @@ internal class PromoBannersBlockModel @Inject constructor( private val params = paramsContainer.require() private val converter = PromoBannerDisplayToNotificationConverter() - private val placeholder: String = params.placeholder.name.lowercase() - private val shownBannerIds: MutableSet = ConcurrentHashMap.newKeySet() + private val placeholderName: String = params.placeholder.value + private val shownBannerIds: MutableSet = ConcurrentHashMap.newKeySet() private var isVisibleOnScreen: Boolean = params.isInitiallyVisibleOnScreen private var wasCarouselScrolled = false private val savedDisplayIdByWalletId: MutableMap = mutableMapOf() @@ -92,7 +94,7 @@ internal class PromoBannersBlockModel @Inject constructor( banners = bannerUMs, isVisibleOnScreen = isVisibleOnScreen, placeholder = params.placeholder, - onBannerShown = ::onBannerShown, + onBannerShown = { displayId -> onBannerShown(walletId, displayId) }, onCarouselScrolled = ::onCarouselScrolled, onPageChanged = { displayId -> savedDisplayIdByWalletId[walletId] = displayId }, ) @@ -101,21 +103,21 @@ internal class PromoBannersBlockModel @Inject constructor( } } - private fun onBannerShown(displayId: Int) { - if (shownBannerIds.add(displayId)) { - analyticsEventHandler.send(PromoBannerAnalyticsEvent.Shown(displayId, placeholder)) + private fun onBannerShown(walletId: String, displayId: Int) { + if (shownBannerIds.add(walletId to displayId)) { + analyticsEventHandler.send(PromoBannerAnalyticsEvent.Shown(displayId, placeholderName)) } } private fun onCarouselScrolled(displayId: Int) { if (!wasCarouselScrolled) { wasCarouselScrolled = true - analyticsEventHandler.send(PromoBannerAnalyticsEvent.CarouselScrolled(displayId, placeholder)) + analyticsEventHandler.send(PromoBannerAnalyticsEvent.CarouselScrolled(displayId, placeholderName)) } } private fun onButtonClick(displayId: Int, deeplink: String?) { - analyticsEventHandler.send(PromoBannerAnalyticsEvent.Clicked(displayId, placeholder)) + analyticsEventHandler.send(PromoBannerAnalyticsEvent.Clicked(displayId, placeholderName)) deeplink?.let { deeplinkLauncher.launch(it) } } @@ -131,7 +133,7 @@ internal class PromoBannersBlockModel @Inject constructor( ) private fun onBannerDismiss(walletId: String, displayId: Int) { - analyticsEventHandler.send(PromoBannerAnalyticsEvent.Dismissed(displayId, placeholder)) + analyticsEventHandler.send(PromoBannerAnalyticsEvent.Dismissed(displayId, placeholderName)) uiState.update { state -> state.copy( banners = state.banners diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/repository/DefaultPromoBannersRepository.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/repository/DefaultPromoBannersRepository.kt index 37c5cf33ef..0ab8bf3ee9 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/repository/DefaultPromoBannersRepository.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/repository/DefaultPromoBannersRepository.kt @@ -37,7 +37,7 @@ internal class DefaultPromoBannersRepository( val banners = withContext(dispatchers.io) { tangemTechApi.getPromoBannerDisplays( walletId = walletId, - placeholder = placeholder.toApiValue(), + placeholder = placeholder.value, languageISOCode = languageISOCode, ).getOrThrow() .items @@ -71,9 +71,4 @@ internal class DefaultPromoBannersRepository( tangemTechApi.dismissPromoBannerDisplay(displayId, request).getOrThrow() } } - - private fun Placeholder.toApiValue(): String = when (this) { - Placeholder.MAIN -> "main" - Placeholder.FEED -> "shtorka" - } } \ No newline at end of file