From ce948a71ae1728c70db5f4f277bde755508df602 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 14 May 2026 11:50:47 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../kotlin/com/tangem/common/BaseTestCase.kt | 6 - .../tap/di/domain/OnrampDomainModule.kt | 3 - .../tangem/tap/di/domain/PromoDomainModule.kt | 23 --- .../configs/feature_toggles_config.json | 4 - .../promotion/models/PromoBannerResponse.kt | 24 ---- .../promotion/models/PromoBannerV2Response.kt | 10 -- .../api/tangemTech/TangemTechApi.kt | 16 --- .../tangem/datasource/di/PromoStoreModule.kt | 9 -- .../local/preferences/PreferencesKeys.kt | 2 - .../local/promo/DefaultPromoBannerStore.kt | 19 --- .../local/promo/PromoBannerStore.kt | 10 -- .../res/drawable/img_black_friday_promo.webp | Bin 18400 -> 0 bytes .../main/res/drawable/img_okx_dex_logo.xml | 29 ---- .../res/drawable/img_one_plus_one_promo.webp | Bin 12812 -> 0 bytes .../main/res/drawable/img_referral_promo.webp | Bin 23568 -> 0 bytes .../res/drawable/img_visa_waitlist_promo.webp | Bin 13438 -> 0 bytes data/promo/build.gradle.kts | 2 - .../data/promo/DefaultPromoRepository.kt | 135 +----------------- .../promo/converters/PromoBannerConverter.kt | 24 ---- .../tangem/data/promo/di/PromoDataModule.kt | 6 - .../domain/onramp/model/OnrampSource.kt | 1 - .../domain/onramp/GetOnrampOffersUseCase.kt | 34 +---- .../onramp/GetOnrampOffersUseCaseTest.kt | 105 -------------- domain/promo/models/build.gradle.kts | 1 - .../tangem/domain/promo/models/PromoBanner.kt | 35 ----- .../tangem/domain/promo/PromoRepository.kt | 14 -- .../promo/ShouldShowPromoTokenUseCase.kt | 11 -- .../promo/ShouldShowPromoWalletUseCase.kt | 57 -------- .../model/analytics/PromoAnalyticsEvent.kt | 65 --------- .../model/warnings/CryptoCurrencyWarning.kt | 8 -- .../feed/components/FeedEntryChildFactory.kt | 3 - .../components/feed/DefaultFeedComponent.kt | 7 +- .../api/NewPromoBannersFeatureToggles.kt | 5 - .../impl/di/PromoBannersFeatureModule.kt | 6 - .../DefaultNewPromoBannersFeatureToggles.kt | 14 -- ...okenDetailsNotificationsAnalyticsSender.kt | 6 - .../model/TokenDetailsClickIntents.kt | 9 -- .../tokendetails/model/TokenDetailsModel.kt | 31 ---- .../components/TokenDetailsNotification.kt | 19 --- .../TokenDetailsNotificationConverter.kt | 6 - .../UpdateNotificationsTransformer.kt | 1 - .../wallet/child/wallet/WalletComponent.kt | 5 +- .../intents/WalletWarningsClickIntents.kt | 128 ----------------- .../analytics/WalletScreenAnalyticsEvent.kt | 6 - .../utils/WalletWarningsAnalyticsSender.kt | 31 ---- .../domain/GetMultiWalletWarningsFactory.kt | 49 +------ .../GetWalletNotificationsCarouselFactory.kt | 45 +----- .../wallet/state/model/WalletNotification.kt | 116 --------------- .../state/model/WalletNotificationUM.kt | 47 ------ .../components/common/WalletNotifications.kt | 4 - .../main/res/drawable/ic_yield_promo_36.xml | 15 -- 51 files changed, 20 insertions(+), 1186 deletions(-) delete mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt delete mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerV2Response.kt delete mode 100644 core/datasource/src/main/java/com/tangem/datasource/local/promo/DefaultPromoBannerStore.kt delete mode 100644 core/datasource/src/main/java/com/tangem/datasource/local/promo/PromoBannerStore.kt delete mode 100644 core/ui/src/main/res/drawable/img_black_friday_promo.webp delete mode 100644 core/ui/src/main/res/drawable/img_okx_dex_logo.xml delete mode 100644 core/ui/src/main/res/drawable/img_one_plus_one_promo.webp delete mode 100644 core/ui/src/main/res/drawable/img_referral_promo.webp delete mode 100644 core/ui/src/main/res/drawable/img_visa_waitlist_promo.webp delete mode 100644 data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt delete mode 100644 domain/promo/models/src/main/java/com/tangem/domain/promo/models/PromoBanner.kt delete mode 100644 domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoTokenUseCase.kt delete mode 100644 domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoWalletUseCase.kt delete mode 100644 domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/PromoAnalyticsEvent.kt delete mode 100644 features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/NewPromoBannersFeatureToggles.kt delete mode 100644 features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/toggles/DefaultNewPromoBannersFeatureToggles.kt delete mode 100644 features/wallet/impl/src/main/res/drawable/ic_yield_promo_36.xml diff --git a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt index b340c7b317..f8e317b50a 100644 --- a/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt +++ b/app/src/androidTest/kotlin/com/tangem/common/BaseTestCase.kt @@ -24,8 +24,6 @@ import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.walletmanager.WalletManagersStore import com.tangem.datasource.utils.WireMockRedirectInterceptor -import com.tangem.domain.promo.PromoRepository -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION import com.tangem.tap.MainActivity @@ -59,9 +57,6 @@ abstract class BaseTestCase : TestCase( @Inject lateinit var appPreferencesStore: AppPreferencesStore - @Inject - lateinit var promoRepository: PromoRepository - @Inject lateinit var walletManagersStore: WalletManagersStore @@ -136,7 +131,6 @@ abstract class BaseTestCase : TestCase( value = false ) } - promoRepository.setNeverToShowWalletPromo(PromoId.Sepa) } apiEnvironmentRule.setup(apiConfigsManager) ActivityScenario.launch(MainActivity::class.java) diff --git a/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt index ad1ba0be09..a365d68514 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt @@ -4,7 +4,6 @@ import com.tangem.domain.offramp.GetOfframpUrlUseCase import com.tangem.domain.offramp.repository.OfframpRepository import com.tangem.domain.onramp.* import com.tangem.domain.onramp.repositories.* -import com.tangem.domain.promo.PromoRepository import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.tap.data.DefaultOfframpRepository import com.tangem.tap.network.exchangeServices.SellService @@ -269,14 +268,12 @@ internal object OnrampDomainModule { onrampErrorResolver: OnrampErrorResolver, onrampTransactionRepository: OnrampTransactionRepository, settingsRepository: SettingsRepository, - promoRepository: PromoRepository, ): GetOnrampOffersUseCase { return GetOnrampOffersUseCase( onrampRepository = onrampRepository, errorResolver = onrampErrorResolver, onrampTransactionRepository = onrampTransactionRepository, settingsRepository = settingsRepository, - promoRepository = promoRepository, ) } diff --git a/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt index ccb73d68a6..3c11cda465 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt @@ -2,11 +2,8 @@ package com.tangem.tap.di.domain import com.tangem.domain.promo.GetStoryContentUseCase import com.tangem.domain.promo.PromoRepository -import com.tangem.domain.promo.ShouldShowPromoTokenUseCase -import com.tangem.domain.promo.ShouldShowPromoWalletUseCase import com.tangem.domain.promo.ShouldShowStoriesUseCase import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -17,26 +14,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) internal object PromoDomainModule { - @Provides - @Singleton - fun provideShouldShowSwapPromoWalletUseCase( - promoRepository: PromoRepository, - settingsRepository: SettingsRepository, - newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles, - ): ShouldShowPromoWalletUseCase { - return ShouldShowPromoWalletUseCase( - promoRepository, - settingsRepository, - newPromoBannersFeatureToggles.isNewPromoBannersEnabled, - ) - } - - @Provides - @Singleton - fun provideShouldShowSwapPromoTokenUseCase(promoRepository: PromoRepository): ShouldShowPromoTokenUseCase { - return ShouldShowPromoTokenUseCase(promoRepository) - } - @Provides @Singleton fun provideShouldShowSwapStoriesUseCase(promoRepository: PromoRepository): ShouldShowStoriesUseCase { diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index a219ffaceb..7e831f6919 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -27,10 +27,6 @@ "name": "DYNAMIC_ADDRESSES_ENABLED", "version": "undefined" }, - { - "name": "NEW_PROMO_BANNERS_ENABLED", - "version": "5.37" - }, { "name": "VIRTUAL_ACCOUNTS_ENABLED", "version": "undefined" diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt deleted file mode 100644 index 90caaabe5a..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerResponse.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.tangem.datasource.api.promotion.models - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class PromoBannerResponse( - @Json(name = "name") val name: String, - @Json(name = "all") val bannerState: BannerState?, -) { - - @JsonClass(generateAdapter = true) - data class BannerState( - @Json(name = "timeline") val timeline: Timeline, - @Json(name = "status") val status: String, - @Json(name = "link") val link: String?, - ) - - @JsonClass(generateAdapter = true) - data class Timeline( - @Json(name = "start") val start: String, - @Json(name = "end") val end: String, - ) -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerV2Response.kt b/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerV2Response.kt deleted file mode 100644 index 23b62757cb..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/api/promotion/models/PromoBannerV2Response.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.tangem.datasource.api.promotion.models - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class PromoBannerV2Response( - @Json(name = "promotions") - val promotions: List, -) \ No newline at end of file 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 be30fea0bc..2d1b924b27 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 @@ -1,8 +1,6 @@ package com.tangem.datasource.api.tangemTech import com.tangem.datasource.api.common.response.ApiResponse -import com.tangem.datasource.api.promotion.models.PromoBannerResponse -import com.tangem.datasource.api.promotion.models.PromoBannerV2Response import com.tangem.datasource.api.promotion.models.StoryContentResponse import com.tangem.datasource.api.tangemTech.models.* import com.tangem.datasource.api.tangemTech.models.promobanners.PromoBannerDisplaysResponse @@ -172,20 +170,6 @@ interface TangemTechApi { ): ApiResponse // endregion - // region promo banners - @GET("/v1/promotion") - suspend fun getPromoBanner( - @Query("programName") name: String, - @Header("Cache-Control") cacheControl: String = "max-age=600", - ): ApiResponse - - @GET("/v2/promotion") - suspend fun getPromoBannersV2( - @Query("walletId") walletId: String, - @Header("Cache-Control") cacheControl: String = "max-age=600", - ): ApiResponse - // endregion - // region promo banners @GET("v1/banner/displays") suspend fun getPromoBannerDisplays( diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/PromoStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/PromoStoreModule.kt index af846ebcbb..b8af7137ae 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/PromoStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/PromoStoreModule.kt @@ -1,10 +1,7 @@ package com.tangem.datasource.di import com.tangem.datasource.local.datastore.RuntimeDataStore -import com.tangem.datasource.local.datastore.RuntimeSharedStore -import com.tangem.datasource.local.promo.DefaultPromoBannerStore import com.tangem.datasource.local.promo.DefaultPromoStoriesStore -import com.tangem.datasource.local.promo.PromoBannerStore import com.tangem.datasource.local.promo.PromoStoriesStore import dagger.Module import dagger.Provides @@ -21,10 +18,4 @@ object PromoStoreModule { fun providePromoStoriesStore(): PromoStoriesStore { return DefaultPromoStoriesStore(dataStore = RuntimeDataStore()) } - - @Provides - @Singleton - fun providePromoBannerStore(): PromoBannerStore { - return DefaultPromoBannerStore(dataStore = RuntimeSharedStore()) - } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt index f99dbf63f7..d12ab69628 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt @@ -172,8 +172,6 @@ object PreferencesKeys { // region Promo fun getShouldShowStoriesKey(storyId: String) = booleanPreferencesKey("shouldShowStories_$storyId") - - fun getShouldShowPromoKey(promoId: String) = booleanPreferencesKey("shouldShowPromo_$promoId") // endregion // region Permission diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/promo/DefaultPromoBannerStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/promo/DefaultPromoBannerStore.kt deleted file mode 100644 index 6065fa079a..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/local/promo/DefaultPromoBannerStore.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tangem.datasource.local.promo - -import com.tangem.datasource.api.promotion.models.PromoBannerResponse -import com.tangem.datasource.local.datastore.RuntimeSharedStore - -internal class DefaultPromoBannerStore( - private val dataStore: RuntimeSharedStore>, -) : PromoBannerStore { - - override suspend fun getSyncOrNull(promoId: String): PromoBannerResponse? { - return dataStore.getSyncOrNull()?.get(promoId) - } - - override suspend fun store(promoId: String, promoBanner: PromoBannerResponse) { - dataStore.update(emptyMap()) { current -> - current + (promoId to promoBanner) - } - } -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/promo/PromoBannerStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/promo/PromoBannerStore.kt deleted file mode 100644 index f951238bd5..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/local/promo/PromoBannerStore.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.tangem.datasource.local.promo - -import com.tangem.datasource.api.promotion.models.PromoBannerResponse - -interface PromoBannerStore { - - suspend fun getSyncOrNull(promoId: String): PromoBannerResponse? - - suspend fun store(promoId: String, promoBanner: PromoBannerResponse) -} \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/img_black_friday_promo.webp b/core/ui/src/main/res/drawable/img_black_friday_promo.webp deleted file mode 100644 index 18ad8343592e71f7e1b3a68e21dc0f3af194e11e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18400 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 H00000Z$U7a diff --git a/core/ui/src/main/res/drawable/img_okx_dex_logo.xml b/core/ui/src/main/res/drawable/img_okx_dex_logo.xml deleted file mode 100644 index 3a4ba80759..0000000000 --- a/core/ui/src/main/res/drawable/img_okx_dex_logo.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/ui/src/main/res/drawable/img_one_plus_one_promo.webp b/core/ui/src/main/res/drawable/img_one_plus_one_promo.webp deleted file mode 100644 index 729a3af0c7b38e4fac8e3a3ba81bb9aa1b3f032c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12812 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 diff --git a/core/ui/src/main/res/drawable/img_referral_promo.webp b/core/ui/src/main/res/drawable/img_referral_promo.webp deleted file mode 100644 index 25a0af2e67b7940ed70ca4a32611a73c45d42ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23568 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 bysffr90MDRbFQE*Z?!>S2`~Ti3_t(?*7Kcz diff --git a/core/ui/src/main/res/drawable/img_visa_waitlist_promo.webp b/core/ui/src/main/res/drawable/img_visa_waitlist_promo.webp deleted file mode 100644 index 6da45900589e72a54bffa438bbaf439671cf104d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13438 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 diff --git a/data/promo/build.gradle.kts b/data/promo/build.gradle.kts index e4e45ecdca..1b7b5eac13 100644 --- a/data/promo/build.gradle.kts +++ b/data/promo/build.gradle.kts @@ -13,8 +13,6 @@ android { dependencies { implementation(deps.androidx.datastore) - implementation(deps.jodatime) - implementation(deps.hilt.android) kapt(deps.hilt.kapt) diff --git a/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt b/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt index 1a87137803..d4c1cdc137 100644 --- a/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt +++ b/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt @@ -1,25 +1,17 @@ package com.tangem.data.promo -import com.tangem.data.promo.converters.PromoBannerConverter import com.tangem.data.promo.converters.StoryContentResponseConverter import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys -import com.tangem.datasource.local.preferences.PreferencesKeys.getShouldShowStoriesKey import com.tangem.datasource.local.preferences.utils.get import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.preferences.utils.store -import com.tangem.datasource.local.promo.PromoBannerStore import com.tangem.datasource.local.promo.PromoStoriesStore -import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.promo.PromoRepository -import com.tangem.domain.promo.models.PromoBanner -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.promo.models.StoryContent -import com.tangem.feature.referral.domain.ReferralRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import com.tangem.utils.coroutines.runCatching import com.tangem.utils.coroutines.runSuspendCatching import kotlinx.coroutines.flow.* import kotlinx.coroutines.withContext @@ -29,84 +21,10 @@ internal class DefaultPromoRepository( private val tangemApi: TangemTechApi, private val appPreferencesStore: AppPreferencesStore, private val promoStoriesStore: PromoStoriesStore, - private val promoBannerStore: PromoBannerStore, private val dispatchers: CoroutineDispatcherProvider, - private val referralRepository: ReferralRepository, ) : PromoRepository { private val storyContentConverter = StoryContentResponseConverter() - private val promoBannerConverter = PromoBannerConverter() - - override fun isReadyToShowWalletPromo(userWalletId: UserWalletId, promoId: PromoId): Flow { - return appPreferencesStore.get( - key = PreferencesKeys.getShouldShowPromoKey(promoId = promoId.name), - default = true, - ) - .distinctUntilChanged() - .map { shouldShow -> - when (promoId) { - PromoId.Referral -> runSuspendCatching { - !referralRepository.isReferralParticipant(userWalletId) && shouldShow - }.getOrDefault(false) - PromoId.Sepa -> { - val isActive = getSepaPromoBanner()?.isActive == true - - isActive && shouldShow - } - PromoId.VisaPresale -> { - val isActive = getVisaPromoBanner()?.isActive == true - - isActive && shouldShow - } - PromoId.BlackFriday -> { - val isActive = getBlackFridayPromoBanner()?.isActive == true - - isActive && shouldShow - } - PromoId.OnePlusOne -> { - val isActive = getOnePlusOnePromoBanner()?.isActive == true - - isActive && shouldShow - } - PromoId.YieldPromo -> { - val isActive = getYieldPromoBanner(userWalletId)?.isActive == true - - isActive && shouldShow - } - } - } - } - - override fun isReadyToShowTokenPromo(promoId: PromoId): Flow { - return when (promoId) { - PromoId.Referral -> flowOf(false) - PromoId.Sepa -> flowOf(false) - PromoId.VisaPresale -> flowOf(false) - PromoId.BlackFriday -> flowOf(false) - PromoId.OnePlusOne -> flowOf(false) - PromoId.YieldPromo -> flowOf(false) - } - } - - override suspend fun setNeverToShowWalletPromo(promoId: PromoId) { - appPreferencesStore.store(PreferencesKeys.getShouldShowPromoKey(promoId = promoId.name), false) - } - - override suspend fun setNeverToShowTokenPromo(promoId: PromoId) { - appPreferencesStore.store(PreferencesKeys.getShouldShowPromoKey(promoId = promoId.name), false) - } - - override suspend fun isMoonpayPromoActive(): Boolean { - val banner = runCatching(dispatchers.io) { - val response = promoBannerStore.getSyncOrNull(MOONPAY_NAME) ?: run { - val apiResponse = tangemApi.getPromoBanner(MOONPAY_NAME).getOrThrow() - promoBannerStore.store(MOONPAY_NAME, apiResponse) - apiResponse - } - promoBannerConverter.convert(response) - }.getOrNull() - return banner?.isActive == true - } override fun getStoryById(id: String): Flow = isReadyToShowStories(id).mapLatest { getStoryByIdSync(id = id, refresh = false) @@ -136,68 +54,21 @@ internal class DefaultPromoRepository( } override fun isReadyToShowStories(storyId: String): Flow { - return appPreferencesStore.get(getShouldShowStoriesKey(storyId), true) + return appPreferencesStore.get(PreferencesKeys.getShouldShowStoriesKey(storyId), true) } override suspend fun isReadyToShowStoriesSync(storyId: String): Boolean { - return appPreferencesStore.getSyncOrDefault(getShouldShowStoriesKey(storyId), true) + return appPreferencesStore.getSyncOrDefault(PreferencesKeys.getShouldShowStoriesKey(storyId), true) } override suspend fun setNeverToShowStories(storyId: String) { appPreferencesStore.store( - key = getShouldShowStoriesKey(storyId), + key = PreferencesKeys.getShouldShowStoriesKey(storyId), value = false, ) } - private suspend fun getSepaPromoBanner(): PromoBanner? { - return runCatching(dispatchers.io) { - promoBannerConverter.convert( - tangemApi.getPromoBanner(SEPA_NAME).getOrThrow(), - ) - }.getOrNull() - } - - private suspend fun getVisaPromoBanner(): PromoBanner? { - return runCatching(dispatchers.io) { - promoBannerConverter.convert( - tangemApi.getPromoBanner(VISA_NAME).getOrThrow(), - ) - }.getOrNull() - } - - private suspend fun getBlackFridayPromoBanner(): PromoBanner? { - return runCatching(dispatchers.io) { - promoBannerConverter.convert( - tangemApi.getPromoBanner(BLACK_FRIDAY_NAME).getOrThrow(), - ) - }.getOrNull() - } - - private suspend fun getOnePlusOnePromoBanner(): PromoBanner? { - return runCatching(dispatchers.io) { - promoBannerConverter.convert( - tangemApi.getPromoBanner(ONE_PLUS_ONE_NAME).getOrThrow(), - ) - }.getOrNull() - } - - private suspend fun getYieldPromoBanner(userWalletId: UserWalletId): PromoBanner? { - return runCatching(dispatchers.io) { - val response = tangemApi.getPromoBannersV2(userWalletId.stringValue).getOrThrow() - val yieldPromotion = response.promotions.find { it.name == YIELD_PROMO_NAME } - ?: return@runCatching null - promoBannerConverter.convert(yieldPromotion) - }.getOrNull() - } - private companion object { - const val SEPA_NAME = "sepa" - const val VISA_NAME = "visa-waitlist" - const val BLACK_FRIDAY_NAME = "black-friday" - const val MOONPAY_NAME = "moonpay" - const val ONE_PLUS_ONE_NAME = "one-plus-one" - const val YIELD_PROMO_NAME = "promo-yield" const val STORIES_LOAD_DELAY = 1000L } } \ No newline at end of file diff --git a/data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt b/data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt deleted file mode 100644 index 1128472f33..0000000000 --- a/data/promo/src/main/java/com/tangem/data/promo/converters/PromoBannerConverter.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.tangem.data.promo.converters - -import com.tangem.datasource.api.promotion.models.PromoBannerResponse -import com.tangem.domain.promo.models.PromoBanner -import com.tangem.utils.converter.Converter -import org.joda.time.DateTime - -class PromoBannerConverter : Converter { - - override fun convert(value: PromoBannerResponse): PromoBanner? { - val bannerState = value.bannerState ?: return null - return PromoBanner( - name = value.name, - bannerState = PromoBanner.BannerState( - status = bannerState.status, - link = bannerState.link, - timeline = PromoBanner.Timeline( - start = DateTime.parse(bannerState.timeline.start), - end = DateTime.parse(bannerState.timeline.end), - ), - ), - ) - } -} \ No newline at end of file diff --git a/data/promo/src/main/java/com/tangem/data/promo/di/PromoDataModule.kt b/data/promo/src/main/java/com/tangem/data/promo/di/PromoDataModule.kt index 2f0c689e53..a564ef0509 100644 --- a/data/promo/src/main/java/com/tangem/data/promo/di/PromoDataModule.kt +++ b/data/promo/src/main/java/com/tangem/data/promo/di/PromoDataModule.kt @@ -3,10 +3,8 @@ package com.tangem.data.promo.di import com.tangem.data.promo.DefaultPromoRepository import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.datasource.local.promo.PromoBannerStore import com.tangem.datasource.local.promo.PromoStoriesStore import com.tangem.domain.promo.PromoRepository -import com.tangem.feature.referral.domain.ReferralRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides @@ -24,17 +22,13 @@ internal object PromoDataModule { tangemTechApi: TangemTechApi, appPreferencesStore: AppPreferencesStore, promoStoriesStore: PromoStoriesStore, - promoBannerStore: PromoBannerStore, dispatchers: CoroutineDispatcherProvider, - referralRepository: ReferralRepository, ): PromoRepository { return DefaultPromoRepository( tangemApi = tangemTechApi, appPreferencesStore = appPreferencesStore, promoStoriesStore = promoStoriesStore, dispatchers = dispatchers, - referralRepository = referralRepository, - promoBannerStore = promoBannerStore, ) } } \ No newline at end of file diff --git a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampSource.kt b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampSource.kt index e193dbc3b2..86b72907ad 100644 --- a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampSource.kt +++ b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampSource.kt @@ -6,5 +6,4 @@ enum class OnrampSource(val analyticsName: String) { TOKEN_LONG_TAP("Long Tap"), TOKEN_DETAILS("Token"), MARKETS("Markets"), - SEPA_BANNER("SEPA Banner"), } \ No newline at end of file diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampOffersUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampOffersUseCase.kt index 11049ae4d2..9049e4906c 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampOffersUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampOffersUseCase.kt @@ -11,11 +11,9 @@ import com.tangem.domain.onramp.repositories.OnrampRepository import com.tangem.domain.onramp.repositories.OnrampTransactionRepository import com.tangem.domain.onramp.utils.calculateRateDif import com.tangem.domain.onramp.utils.compareOffersByRateSpeedAndPriority -import com.tangem.domain.promo.PromoRepository import com.tangem.domain.settings.repositories.SettingsRepository import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map class GetOnrampOffersUseCase( @@ -23,16 +21,14 @@ class GetOnrampOffersUseCase( private val onrampTransactionRepository: OnrampTransactionRepository, private val errorResolver: OnrampErrorResolver, private val settingsRepository: SettingsRepository, - private val promoRepository: PromoRepository, ) { operator fun invoke(): EitherFlow> { return combine( onrampRepository.getQuotes(), onrampTransactionRepository.getAllTransactions(), - flow { emit(promoRepository.isMoonpayPromoActive()) }, - ) { quotes, transactions, isMoonpayPromoActive -> - processOffers(quotes, transactions, isMoonpayPromoActive) + ) { quotes, transactions -> + processOffers(quotes, transactions) } .map { offers -> offers.right() } .catch { throwable -> errorResolver.resolve(throwable).left() } @@ -41,7 +37,6 @@ class GetOnrampOffersUseCase( private suspend fun processOffers( quotes: List, transactions: List, - isMoonpayPromoActive: Boolean, ): List { val validQuotes = quotes.filterIsInstance() if (validQuotes.isEmpty()) return emptyList() @@ -62,7 +57,7 @@ class GetOnrampOffersUseCase( val recentOffer = findRecentOffer(offers, transactions) val bestRateOffer = findBestRateOffer(offers, isGooglePayAvailable) - val fastestOffer = findFastestOffer(offers, isGooglePayAvailable, isMoonpayPromoActive) + val fastestOffer = findFastestOffer(offers, isGooglePayAvailable) return buildOffersBlocks( recentOffer = recentOffer, @@ -90,23 +85,8 @@ class GetOnrampOffersUseCase( return offers.maxWithOrNull(offerComparator(isGooglePayAvailable)) } - private fun findFastestOffer( - offers: List, - isGooglePayAvailable: Boolean, - isMoonpayPromoActive: Boolean, - ): OnrampOffer? { - val moonpayPromoOffers = if (isMoonpayPromoActive) { - offers.filter { offer -> - offer.quote.provider.id == MOONPAY_PROMO_PROVIDER_ID && - offer.quote.paymentMethod.type == PaymentMethodType.GOOGLE_PAY - } - } else { - emptyList() - } - - val instantOffers = moonpayPromoOffers.ifEmpty { - offers.filter { it.quote.paymentMethod.type.isInstant() } - } + private fun findFastestOffer(offers: List, isGooglePayAvailable: Boolean): OnrampOffer? { + val instantOffers = offers.filter { it.quote.paymentMethod.type.isInstant() } return if (instantOffers.isNotEmpty()) { instantOffers.maxWithOrNull(fastestOfferComparator(isGooglePayAvailable)) @@ -308,8 +288,4 @@ class GetOnrampOffersUseCase( -> true } } - - private companion object { - const val MOONPAY_PROMO_PROVIDER_ID = "moonpay" - } } \ No newline at end of file diff --git a/domain/onramp/src/test/kotlin/com/tangem/domain/onramp/GetOnrampOffersUseCaseTest.kt b/domain/onramp/src/test/kotlin/com/tangem/domain/onramp/GetOnrampOffersUseCaseTest.kt index 5f249f97a2..660735a8e7 100644 --- a/domain/onramp/src/test/kotlin/com/tangem/domain/onramp/GetOnrampOffersUseCaseTest.kt +++ b/domain/onramp/src/test/kotlin/com/tangem/domain/onramp/GetOnrampOffersUseCaseTest.kt @@ -7,7 +7,6 @@ import com.tangem.domain.onramp.model.cache.OnrampTransaction import com.tangem.domain.onramp.repositories.OnrampErrorResolver import com.tangem.domain.onramp.repositories.OnrampRepository import com.tangem.domain.onramp.repositories.OnrampTransactionRepository -import com.tangem.domain.promo.PromoRepository import com.tangem.domain.settings.repositories.SettingsRepository import io.mockk.* import kotlinx.coroutines.flow.flowOf @@ -25,7 +24,6 @@ class GetOnrampOffersUseCaseTest { private val errorResolver: OnrampErrorResolver = mockk(relaxUnitFun = true) private val settingsRepository: SettingsRepository = mockk(relaxUnitFun = true) private val cryptoCurrencyId: CryptoCurrency.ID = mockk(relaxUnitFun = true) - private val promoRepository: PromoRepository = mockk(relaxUnitFun = true) private lateinit var useCase: GetOnrampOffersUseCase @@ -37,7 +35,6 @@ class GetOnrampOffersUseCaseTest { onrampTransactionRepository = onrampTransactionRepository, errorResolver = errorResolver, settingsRepository = settingsRepository, - promoRepository = promoRepository, ) } @@ -228,7 +225,6 @@ class GetOnrampOffersUseCaseTest { val transactions = emptyList() - coEvery { promoRepository.isMoonpayPromoActive() } returns false coEvery { settingsRepository.isGooglePayAvailability() } returns false coEvery { onrampRepository.getQuotes() } returns flowOf(quotes) coEvery { onrampTransactionRepository.getAllTransactions() } returns flowOf( @@ -249,107 +245,6 @@ class GetOnrampOffersUseCaseTest { } } - @Test - fun `invoke should fallback to standard instant offers when promo is active but no Moonpay offers exist`() = - runTest { - val instantMethod = createMockPaymentMethod("gpay", "Google Pay", PaymentMethodType.GOOGLE_PAY) - val slowMethod = createMockPaymentMethod("bank", "Bank Transfer", PaymentMethodType.CARD) - val provider = createMockProvider("other", "Other Provider") - - val quotes = listOf( - createMockQuote(instantMethod, provider, BigDecimal("95.0")), - createMockQuote(slowMethod, provider, BigDecimal("100.0")), - ) - - val transactions = emptyList() - - coEvery { promoRepository.isMoonpayPromoActive() } returns true - coEvery { settingsRepository.isGooglePayAvailability() } returns true - coEvery { onrampRepository.getQuotes() } returns flowOf(quotes) - coEvery { onrampTransactionRepository.getAllTransactions() } returns flowOf(transactions) - - val result = useCase() - - result.collect { either -> - Truth.assertThat(either.isRight()).isTrue() - either.fold( - ifLeft = { error -> Truth.assertThat(error).isNull() }, - ifRight = { offers -> - Truth.assertThat(offers).hasSize(1) - - val recommendedBlock = offers.find { it.category == OnrampOfferCategory.Recommended } - Truth.assertThat(recommendedBlock).isNotNull() - Truth.assertThat(recommendedBlock?.offers).hasSize(2) - - val fastestOffer = - recommendedBlock?.offers?.find { it.advantages == OnrampOfferAdvantages.Fastest } - Truth.assertThat(fastestOffer).isNotNull() - - when (val quote = fastestOffer?.quote) { - is OnrampQuote.Data -> { - Truth.assertThat(quote.provider.id).isNotEqualTo("moonpay") - Truth.assertThat(quote.paymentMethod.type).isEqualTo(PaymentMethodType.GOOGLE_PAY) - } - else -> Truth.assertThat(false).isTrue() - } - }, - ) - } - } - - @Test - fun `invoke should show Moonpay fastest offer when promo is active`() = runTest { - val moonpayGooglePayMethod = createMockPaymentMethod("moonpay-gpay", "Google Pay", PaymentMethodType.GOOGLE_PAY) - val otherGooglePayMethod = createMockPaymentMethod( - "other-gpay", - "Other Google Pay", - PaymentMethodType.GOOGLE_PAY, - ) - val slowMethod = createMockPaymentMethod("bank", "Bank Transfer", PaymentMethodType.CARD) - val moonpayProvider = createMockProvider("moonpay", "Moonpay") - val otherProvider = createMockProvider("other", "Other Provider") - - val quotes = listOf( - createMockQuote(moonpayGooglePayMethod, moonpayProvider, BigDecimal("100.0")), - createMockQuote(otherGooglePayMethod, otherProvider, BigDecimal("95.0")), - createMockQuote(slowMethod, otherProvider, BigDecimal("105.0")), - ) - - val transactions = emptyList() - - coEvery { promoRepository.isMoonpayPromoActive() } returns true - coEvery { settingsRepository.isGooglePayAvailability() } returns true - coEvery { onrampRepository.getQuotes() } returns flowOf(quotes) - coEvery { onrampTransactionRepository.getAllTransactions() } returns flowOf(transactions) - - val result = useCase() - - result.collect { either -> - Truth.assertThat(either.isRight()).isTrue() - either.fold( - ifLeft = { error -> Truth.assertThat(error).isNull() }, - ifRight = { offers -> - Truth.assertThat(offers).hasSize(1) - - val recommendedBlock = offers.find { it.category == OnrampOfferCategory.Recommended } - Truth.assertThat(recommendedBlock).isNotNull() - - val fastestOffer = recommendedBlock?.offers?.find { it.advantages == OnrampOfferAdvantages.Fastest } - Truth.assertThat(fastestOffer).isNotNull() - - when (val quote = fastestOffer?.quote) { - is OnrampQuote.Data -> { - Truth.assertThat(quote.provider.id).isEqualTo("moonpay") - Truth.assertThat(quote.paymentMethod.type).isEqualTo(PaymentMethodType.GOOGLE_PAY) - Truth.assertThat(quote.toAmount.value).isEqualTo(BigDecimal("100.0")) - } - else -> Truth.assertThat(false).isTrue() - } - }, - ) - } - } - private fun createMockPaymentMethod( id: String, name: String, diff --git a/domain/promo/models/build.gradle.kts b/domain/promo/models/build.gradle.kts index fe9e75a251..308120d8d5 100644 --- a/domain/promo/models/build.gradle.kts +++ b/domain/promo/models/build.gradle.kts @@ -5,5 +5,4 @@ plugins { } dependencies { - implementation(deps.jodatime) } \ No newline at end of file diff --git a/domain/promo/models/src/main/java/com/tangem/domain/promo/models/PromoBanner.kt b/domain/promo/models/src/main/java/com/tangem/domain/promo/models/PromoBanner.kt deleted file mode 100644 index ee31586b29..0000000000 --- a/domain/promo/models/src/main/java/com/tangem/domain/promo/models/PromoBanner.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.tangem.domain.promo.models - -import org.joda.time.DateTime - -data class PromoBanner( - val name: String, - val bannerState: BannerState, -) { - - val isActive = bannerState.status == ACTIVE_STATUS && bannerState.timeline.end.isAfterNow - - data class BannerState( - val timeline: Timeline, - val status: String, - val link: String?, - ) - - data class Timeline( - val start: DateTime, - val end: DateTime, - ) - - private companion object { - const val ACTIVE_STATUS = "active" - } -} - -enum class PromoId { - Referral, - Sepa, - VisaPresale, - BlackFriday, - OnePlusOne, - YieldPromo, -} \ No newline at end of file diff --git a/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt b/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt index 40cb514115..ac8f22142e 100644 --- a/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt +++ b/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt @@ -1,24 +1,10 @@ package com.tangem.domain.promo -import com.tangem.domain.models.wallet.UserWalletId -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.promo.models.StoryContent import kotlinx.coroutines.flow.Flow interface PromoRepository { - // region Promo - fun isReadyToShowWalletPromo(userWalletId: UserWalletId, promoId: PromoId): Flow - - fun isReadyToShowTokenPromo(promoId: PromoId): Flow - - suspend fun setNeverToShowWalletPromo(promoId: PromoId) - - suspend fun setNeverToShowTokenPromo(promoId: PromoId) - - suspend fun isMoonpayPromoActive(): Boolean - // endregion - // region Stories fun getStoryById(id: String): Flow diff --git a/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoTokenUseCase.kt b/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoTokenUseCase.kt deleted file mode 100644 index e6ad0e7580..0000000000 --- a/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoTokenUseCase.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tangem.domain.promo - -import com.tangem.domain.promo.models.PromoId -import kotlinx.coroutines.flow.Flow - -class ShouldShowPromoTokenUseCase(private val promoRepository: PromoRepository) { - - operator fun invoke(promoId: PromoId): Flow = promoRepository.isReadyToShowTokenPromo(promoId) - - suspend fun neverToShow(promoId: PromoId) = promoRepository.setNeverToShowTokenPromo(promoId) -} \ No newline at end of file diff --git a/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoWalletUseCase.kt b/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoWalletUseCase.kt deleted file mode 100644 index b7cf191c4d..0000000000 --- a/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowPromoWalletUseCase.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.tangem.domain.promo - -import com.tangem.domain.models.wallet.UserWalletId -import com.tangem.domain.promo.models.PromoId -import com.tangem.domain.settings.repositories.SettingsRepository -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emitAll -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map -import java.util.Calendar - -class ShouldShowPromoWalletUseCase( - private val promoRepository: PromoRepository, - private val settingsRepository: SettingsRepository, - private val isNewPromoBannersEnabled: Boolean, -) { - - operator fun invoke(userWalletId: UserWalletId, promoId: PromoId): Flow { - if (isNewPromoBannersEnabled) return flowOf(false) - - return flow { - emit(false) - - val promoFlow = promoRepository.isReadyToShowWalletPromo(userWalletId, promoId) - .map { applyWalletFirstUsageCondition(promoId, it) } - - emitAll(promoFlow) - } - } - - private suspend fun applyWalletFirstUsageCondition(promoId: PromoId, isReady: Boolean): Boolean { - if (!isReady) return false - - return when (promoId) { - PromoId.Referral, - PromoId.VisaPresale, - PromoId.BlackFriday, - PromoId.OnePlusOne, - PromoId.YieldPromo, - -> true - PromoId.Sepa -> { - val walletFirstUsageDate = settingsRepository.getWalletFirstUsageDate() - if (walletFirstUsageDate == 0L) return false - - val currentDate = Calendar.getInstance().timeInMillis - currentDate - walletFirstUsageDate > ONE_DAY_IN_MILLIS - } - } - } - - suspend fun neverToShow(promoId: PromoId) = promoRepository.setNeverToShowWalletPromo(promoId) - - private companion object { - const val ONE_DAY_IN_MILLIS = 1 * 24 * 60 * 60 * 1000L - } -} \ No newline at end of file diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/PromoAnalyticsEvent.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/PromoAnalyticsEvent.kt deleted file mode 100644 index 56073246a8..0000000000 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/analytics/PromoAnalyticsEvent.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.tangem.domain.tokens.model.analytics - -import com.tangem.core.analytics.models.AnalyticsEvent -import com.tangem.core.analytics.models.AnalyticsParam - -sealed class PromoAnalyticsEvent( - event: String, - params: Map = emptyMap(), -) : AnalyticsEvent(category = "Promotion", event = event, params = params) { - data class NoticePromotionBanner( - private val source: AnalyticsParam.ScreensSources, - private val program: Program, - ) : PromoAnalyticsEvent( - event = "Notice - Promotion Banner", - params = mapOf( - AnalyticsParam.SOURCE to source.value, - "Program Name" to program.programName, - ), - ) - - data class PromotionBannerClicked( - private val source: AnalyticsParam.ScreensSources, - private val program: Program, - private val action: BannerAction, - ) : PromoAnalyticsEvent( - event = "Promo Banner Clicked", - params = mapOf( - AnalyticsParam.SOURCE to source.value, - "Program Name" to program.programName, - "Action" to action.action, - ), - ) { - sealed class BannerAction(val action: String) { - class Clicked : BannerAction(action = "Clicked") - class Closed : BannerAction(action = "Closed") - } - } - - // region visa waitlist promo - class VisaWaitlistPromo : PromoAnalyticsEvent(event = "Visa Waitlist") - - class VisaWaitlistPromoJoin : PromoAnalyticsEvent( - event = "Button - Join Now", - params = mapOf( - "Program Name" to "Visa Waitlist", - ), - ) - - class VisaWaitlistPromoDismiss : PromoAnalyticsEvent( - event = "Button - Close", - params = mapOf( - "Program Name" to "Visa Waitlist", - ), - ) - //endregion - - // Use it on new promo action - enum class Program(val programName: String) { - Empty("Empty"), - Sepa("Sepa"), - BlackFriday("Black Friday"), - OnePlusOne("One-Plus-One"), - YieldPromo("Yield Promo"), - } -} \ No newline at end of file diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt index 1d69153c6e..1b6ba9272e 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/warnings/CryptoCurrencyWarning.kt @@ -1,8 +1,6 @@ package com.tangem.domain.tokens.model.warnings import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.promo.models.PromoId -import org.joda.time.DateTime import java.math.BigDecimal sealed class CryptoCurrencyWarning { @@ -47,12 +45,6 @@ sealed class CryptoCurrencyWarning { val cryptoCurrency: CryptoCurrency, ) : CryptoCurrencyWarning() - data class SwapPromo( - val promoId: PromoId, - val startDateTime: DateTime, - val endDateTime: DateTime, - ) : CryptoCurrencyWarning() - data object BeaconChainShutdown : CryptoCurrencyWarning() data object MigrationMaticToPol : CryptoCurrencyWarning() diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/FeedEntryChildFactory.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/FeedEntryChildFactory.kt index 4ae731f39c..5274b83b8d 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/FeedEntryChildFactory.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/FeedEntryChildFactory.kt @@ -18,7 +18,6 @@ import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListCo import com.tangem.features.feed.components.news.details.DefaultNewsDetailsComponent import com.tangem.features.feed.components.news.list.DefaultNewsListComponent import com.tangem.features.feed.components.search.DefaultSearchComponent -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles import com.tangem.features.promobanners.api.PromoBannersBlockComponent import kotlinx.serialization.Serializable import javax.inject.Inject @@ -30,7 +29,6 @@ internal class FeedEntryChildFactory @Inject constructor( private val portfolioBlockComponentFactory: PortfolioBlockComponent.Factory, private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory, private val promoBannersBlockComponentFactory: PromoBannersBlockComponent.Factory, - private val newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles, private val designFeatureToggles: DesignFeatureToggles, ) { @@ -121,7 +119,6 @@ internal class FeedEntryChildFactory @Inject constructor( params = FeedParams(feedClickIntents = feedEntryClickIntents), addToPortfolioComponentFactory = addToPortfolioComponentFactory, promoBannersBlockComponentFactory = promoBannersBlockComponentFactory, - newPromoBannersFeatureToggles = newPromoBannersFeatureToggles, ) } is Child.Earn -> { diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/feed/DefaultFeedComponent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/feed/DefaultFeedComponent.kt index 21ebee8140..65a7fc6b83 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/feed/DefaultFeedComponent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/feed/DefaultFeedComponent.kt @@ -24,7 +24,6 @@ import com.tangem.features.feed.model.feed.FeedComponentModel import com.tangem.features.feed.model.feed.FeedModelClickIntents import com.tangem.features.feed.ui.feed.FeedList import com.tangem.features.feed.ui.feed.FeedListHeader -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles import com.tangem.features.promobanners.api.PromoBannersBlockComponent internal class DefaultFeedComponent( @@ -32,13 +31,11 @@ internal class DefaultFeedComponent( private val params: FeedParams, private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory, private val promoBannersBlockComponentFactory: PromoBannersBlockComponent.Factory, - private val newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles, ) : ComposableModularBottomSheetContentComponent, AppComponentContext by appComponentContext { private val feedComponentModel = getOrCreateModel(params = params) - private val promoBannersBlockComponent: PromoBannersBlockComponent? by lazy { - if (!newPromoBannersFeatureToggles.isNewPromoBannersEnabled) return@lazy null + private val promoBannersBlockComponent: PromoBannersBlockComponent by lazy { promoBannersBlockComponentFactory.create( context = child("promoBannersBlockComponent"), params = PromoBannersBlockComponent.Params( @@ -72,7 +69,7 @@ internal class DefaultFeedComponent( ) { val isExpanded = bottomSheetState.value == BottomSheetState.EXPANDED LaunchedEffect(isExpanded) { - promoBannersBlockComponent?.setVisibleOnScreen(isExpanded) + promoBannersBlockComponent.setVisibleOnScreen(isExpanded) } LifecycleStartEffect(Unit) { diff --git a/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/NewPromoBannersFeatureToggles.kt b/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/NewPromoBannersFeatureToggles.kt deleted file mode 100644 index bc392c04ba..0000000000 --- a/features/promo-banners/api/src/main/kotlin/com/tangem/features/promobanners/api/NewPromoBannersFeatureToggles.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.tangem.features.promobanners.api - -interface NewPromoBannersFeatureToggles { - val isNewPromoBannersEnabled: Boolean -} \ No newline at end of file diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/di/PromoBannersFeatureModule.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/di/PromoBannersFeatureModule.kt index a6d23d0e7e..32414701c1 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/di/PromoBannersFeatureModule.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/di/PromoBannersFeatureModule.kt @@ -4,13 +4,11 @@ import com.tangem.core.decompose.di.ModelComponent import com.tangem.core.decompose.model.Model import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.datastore.RuntimeSharedStore -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles import com.tangem.features.promobanners.api.PromoBannersBlockComponent import com.tangem.features.promobanners.impl.DefaultPromoBannersBlockComponent import com.tangem.features.promobanners.impl.model.PromoBannersBlockModel import com.tangem.features.promobanners.impl.repository.DefaultPromoBannersRepository import com.tangem.features.promobanners.impl.repository.PromoBannersRepository -import com.tangem.features.promobanners.impl.toggles.DefaultNewPromoBannersFeatureToggles import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Binds import dagger.Module @@ -31,10 +29,6 @@ internal interface PromoBannersFeatureModule { factory: DefaultPromoBannersBlockComponent.Factory, ): PromoBannersBlockComponent.Factory - @Binds - @Singleton - fun bindFeatureToggles(impl: DefaultNewPromoBannersFeatureToggles): NewPromoBannersFeatureToggles - companion object { @Provides diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/toggles/DefaultNewPromoBannersFeatureToggles.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/toggles/DefaultNewPromoBannersFeatureToggles.kt deleted file mode 100644 index 7e729c7e60..0000000000 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/toggles/DefaultNewPromoBannersFeatureToggles.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.tangem.features.promobanners.impl.toggles - -import com.tangem.core.configtoggle.FeatureToggles -import com.tangem.core.configtoggle.feature.FeatureTogglesManager -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles -import javax.inject.Inject - -internal class DefaultNewPromoBannersFeatureToggles @Inject constructor( - private val featureTogglesManager: FeatureTogglesManager, -) : NewPromoBannersFeatureToggles { - - override val isNewPromoBannersEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled(toggle = FeatureToggles.NEW_PROMO_BANNERS_ENABLED) -} \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt index 7e71e96ddf..805a18caa5 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/analytics/TokenDetailsNotificationsAnalyticsSender.kt @@ -2,9 +2,7 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.analytics import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsEvent -import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState import com.tangem.feature.tokendetails.presentation.tokendetails.state.components.TokenDetailsNotification import com.tangem.features.yield.supply.api.analytics.YieldSupplyAnalytics @@ -39,10 +37,6 @@ internal class TokenDetailsNotificationsAnalyticsSender( currency = cryptoCurrency, source = TokenDetailsAnalyticsEvent.Notice.NotEnoughFee.Source.DetailedScreen, ) - is TokenDetailsNotification.SwapPromo -> PromoAnalyticsEvent.NoticePromotionBanner( - program = PromoAnalyticsEvent.Program.Empty, // Use it on new promo action - source = AnalyticsParam.ScreensSources.Token, - ) is TokenDetailsNotification.KaspaIncompleteTransactionWarning -> TokenDetailsAnalyticsEvent.Notice.Reveal( currency = cryptoCurrency, ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsClickIntents.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsClickIntents.kt index 71cd36300b..0fd56bb881 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsClickIntents.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsClickIntents.kt @@ -3,7 +3,6 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.model import com.tangem.common.ui.bottomsheet.receive.AddressModel import com.tangem.core.ui.extensions.TextReference import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenBalanceSegmentedButtonConfig @@ -42,10 +41,6 @@ interface TokenDetailsClickIntents { fun onCloseRentInfoNotification() - fun onSwapPromoDismiss(promoId: PromoId) - - fun onSwapPromoClick(promoId: PromoId) - fun onGenerateExtendedKey() fun onDynamicAddressesClick() @@ -143,10 +138,6 @@ internal class EmptyTokenDetailsClickIntents : TokenDetailsClickIntents { override fun onCloseRentInfoNotification() { /* no op */ } - override fun onSwapPromoDismiss(promoId: PromoId) { /* no op */ } - - override fun onSwapPromoClick(promoId: PromoId) { /* no op */ } - override fun onRetryIncompleteTransactionClick() { /* no op */ } override fun onOpenTrustlineClick() { /* no op */ } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt index 816b82fa5b..2b86f0895c 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/model/TokenDetailsModel.kt @@ -58,15 +58,12 @@ import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.offramp.GetOfframpUrlUseCase import com.tangem.domain.onramp.model.OnrampSource -import com.tangem.domain.promo.ShouldShowPromoTokenUseCase -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.staking.GetStakingAvailabilityUseCase import com.tangem.domain.staking.GetStakingEntryInfoUseCase import com.tangem.domain.staking.model.StakingAvailability import com.tangem.domain.tokens.* import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason import com.tangem.domain.tokens.model.TokenActionsState -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenReceiveCopyActionSource import com.tangem.domain.tokens.model.analytics.TokenReceiveNewAnalyticsEvent import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent @@ -136,7 +133,6 @@ internal class TokenDetailsModel @Inject constructor( private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, private val getCurrencyWarningsUseCase: GetCurrencyWarningsUseCase, private val getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase, - private val shouldShowPromoTokenUseCase: ShouldShowPromoTokenUseCase, private val getExtendedPublicKeyForCurrencyUseCase: GetExtendedPublicKeyForCurrencyUseCase, private val getStakingEntryInfoUseCase: GetStakingEntryInfoUseCase, private val getStakingAvailabilityUseCase: GetStakingAvailabilityUseCase, @@ -829,33 +825,6 @@ internal class TokenDetailsModel @Inject constructor( uiState.value = stateFactory.getStateWithRemovedRentNotification() } - override fun onSwapPromoDismiss(promoId: PromoId) { - modelScope.launch(dispatchers.main) { - shouldShowPromoTokenUseCase.neverToShow(promoId) - analyticsEventsHandler.send( - PromoAnalyticsEvent.PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Token, - program = PromoAnalyticsEvent.Program.Empty, // Use it on new promo action - action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed(), - ), - ) - } - } - - override fun onSwapPromoClick(promoId: PromoId) { - modelScope.launch(dispatchers.main) { - shouldShowPromoTokenUseCase.neverToShow(promoId) - analyticsEventsHandler.send( - PromoAnalyticsEvent.PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Token, - program = PromoAnalyticsEvent.Program.Empty, // Use it on new promo action - action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Clicked(), - ), - ) - } - onSwapClick(ScenarioUnavailabilityReason.None) - } - override fun onCopyAddress(): TextReference? { val networkAddress = cryptoCurrencyStatus?.value?.networkAddress ?: return null val addresses = networkAddress.availableAddresses.mapToAddressModels(cryptoCurrency).toImmutableList() diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt index bb05ee4cc5..e880ab2141 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/components/TokenDetailsNotification.kt @@ -13,7 +13,6 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning import com.tangem.features.tokendetails.impl.R -import org.joda.time.DateTime @Immutable internal sealed class TokenDetailsNotification(val config: NotificationConfig) { @@ -47,24 +46,6 @@ internal sealed class TokenDetailsNotification(val config: NotificationConfig) { ), ) - data class SwapPromo( - val startDateTime: DateTime, - val endDateTime: DateTime, - val onSwapClick: () -> Unit, - val onCloseClick: () -> Unit, - ) : TokenDetailsNotification( - config = NotificationConfig( - title = resourceReference(id = R.string.swap_promo_title), - subtitle = resourceReference(id = R.string.swap_promo_text), - iconResId = R.drawable.img_okx_dex_logo, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(id = com.tangem.core.ui.R.string.token_swap_promotion_button), - onClick = onSwapClick, - ), - ), - ) - data object NetworksUnreachable : Warning( title = resourceReference(R.string.warning_network_unreachable_title), subtitle = resourceReference(R.string.warning_network_unreachable_message), diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt index 669c4a05df..c305faadbd 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsNotificationConverter.kt @@ -108,12 +108,6 @@ internal class TokenDetailsNotificationConverter( symbol = warning.amountCurrency.network.currencySymbol, ) is CryptoCurrencyWarning.TopUpWithoutReserve -> TopUpWithoutReserve - is CryptoCurrencyWarning.SwapPromo -> SwapPromo( - startDateTime = warning.startDateTime, - endDateTime = warning.endDateTime, - onSwapClick = { clickIntents.onSwapPromoClick(warning.promoId) }, - onCloseClick = { clickIntents.onSwapPromoDismiss(warning.promoId) }, - ) is CryptoCurrencyWarning.BeaconChainShutdown -> NetworkShutdown( title = resourceReference(R.string.warning_beacon_chain_retirement_title), subtitle = resourceReference(R.string.warning_beacon_chain_retirement_content), diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/transformer/UpdateNotificationsTransformer.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/transformer/UpdateNotificationsTransformer.kt index 40232ef9c8..49918ddbca 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/transformer/UpdateNotificationsTransformer.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/transformer/UpdateNotificationsTransformer.kt @@ -184,7 +184,6 @@ internal class UpdateNotificationsTransformer( is CryptoCurrencyWarning.Rent, is CryptoCurrencyWarning.SomeNetworksNoAccount, is CryptoCurrencyWarning.TopUpWithoutReserve, - is CryptoCurrencyWarning.SwapPromo, is CryptoCurrencyWarning.FeeResourceInfo, is CryptoCurrencyWarning.UsedOutdatedDataWarning, -> null diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt index cc0155e82f..622fc2b25b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt @@ -37,7 +37,6 @@ import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.KycRejec import com.tangem.feature.walletsettings.component.RenameWalletComponent import com.tangem.features.biometry.AskBiometryComponent import com.tangem.features.feed.entry.components.FeedEntryComponent -import com.tangem.features.promobanners.api.NewPromoBannersFeatureToggles import com.tangem.features.promobanners.api.PromoBannersBlockComponent import com.tangem.features.pushnotifications.api.PushNotificationsBottomSheetComponent import com.tangem.features.pushnotifications.api.PushNotificationsParams @@ -63,7 +62,6 @@ internal class WalletComponent @AssistedInject constructor( private val tokenReceiveComponentFactory: TokenReceiveComponent.Factory, private val yieldSupplyDepositedWarningComponent: YieldSupplyDepositedWarningComponent.Factory, private val promoBannersBlockComponentFactory: PromoBannersBlockComponent.Factory, - private val newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles, private val networkSelectionComponentFactory: NetworkSelectionComponent.Factory, private val tokenActionsComponentFactory: TokenActionsComponent.Factory, private val portfolioSelectorComponentFactory: PortfolioSelectorComponent.Factory, @@ -85,8 +83,7 @@ internal class WalletComponent @AssistedInject constructor( ) } - private val promoBannersBlockComponent: PromoBannersBlockComponent? by lazy { - if (!newPromoBannersFeatureToggles.isNewPromoBannersEnabled) return@lazy null + private val promoBannersBlockComponent: PromoBannersBlockComponent by lazy { promoBannersBlockComponentFactory.create( context = child("promoBannersBlockComponent"), params = PromoBannersBlockComponent.Params( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt index 5eafa28841..9d839be728 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt @@ -12,7 +12,6 @@ import com.tangem.core.analytics.models.event.AssetsDiscoveryAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.navigation.review.ReviewManager -import com.tangem.core.navigation.url.UrlOpener import com.tangem.domain.assetsdiscovery.usecase.AcknowledgeAssetsDiscoveryCompletionUseCase import com.tangem.domain.card.SetCardWasScannedUseCase import com.tangem.domain.common.wallets.UserWalletsListRepository @@ -29,17 +28,11 @@ import com.tangem.domain.models.wallet.requireColdWallet import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.notifications.SetShouldShowNotificationUseCase import com.tangem.domain.notifications.repository.NotificationsRepository -import com.tangem.domain.onramp.model.OnrampSource -import com.tangem.domain.promo.ShouldShowPromoWalletUseCase -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.quotes.multi.MultiQuoteStatusFetcher import com.tangem.domain.settings.NeverToSuggestRateAppUseCase import com.tangem.domain.settings.RemindToRateAppLaterUseCase import com.tangem.domain.staking.StakingIdFactory import com.tangem.domain.staking.multi.MultiStakingBalanceFetcher -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent.Program -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent.PromotionBannerClicked import com.tangem.domain.tokens.model.details.NavigationAction import com.tangem.domain.wallets.usecase.* import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent @@ -75,10 +68,6 @@ internal interface WalletWarningsClickIntents { fun onCloseRateAppWarningClick() - fun onClosePromoClick(promoId: PromoId) - - fun onPromoClick(promoId: PromoId, cryptoCurrency: CryptoCurrency? = null) - fun onSupportClick() fun onBackupErrorClick() @@ -91,8 +80,6 @@ internal interface WalletWarningsClickIntents { fun onFinishWalletActivationClick(isBackupExists: Boolean) - fun onYieldPromoTermsAndConditionsClick() - fun onUpgradeHotWalletClick(userWalletId: UserWalletId) fun onCloseUpgradeBannerClick(userWalletId: UserWalletId) @@ -115,10 +102,8 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( private val nonBiometricUnlockWalletUseCase: NonBiometricUnlockWalletUseCase, private val analyticsEventHandler: AnalyticsEventHandler, private val dispatchers: CoroutineDispatcherProvider, - private val shouldShowPromoWalletUseCase: ShouldShowPromoWalletUseCase, private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, - private val urlOpener: UrlOpener, private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher, private val multiQuoteStatusFetcher: MultiQuoteStatusFetcher, private val multiStakingBalanceFetcher: MultiStakingBalanceFetcher, @@ -243,91 +228,6 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( } } - override fun onClosePromoClick(promoId: PromoId) { - analyticsEventHandler.send( - when (promoId) { - PromoId.Referral -> MainScreen.ReferralPromoButtonDismiss() - PromoId.Sepa -> PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.Sepa, - action = PromotionBannerClicked.BannerAction.Closed(), - ) - PromoId.VisaPresale -> PromoAnalyticsEvent.VisaWaitlistPromoDismiss() - PromoId.BlackFriday -> PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.BlackFriday, - action = PromotionBannerClicked.BannerAction.Closed(), - ) - PromoId.OnePlusOne -> PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.OnePlusOne, - action = PromotionBannerClicked.BannerAction.Closed(), - ) - PromoId.YieldPromo -> PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.YieldPromo, - action = PromotionBannerClicked.BannerAction.Closed(), - ) - }, - ) - modelScope.launch(dispatchers.main) { - shouldShowPromoWalletUseCase.neverToShow(promoId) - } - } - - override fun onPromoClick(promoId: PromoId, cryptoCurrency: CryptoCurrency?) { - val userWallet = getSelectedUserWallet() ?: return - when (promoId) { - PromoId.Referral -> { - analyticsEventHandler.send(MainScreen.ReferralPromoButtonParticipate()) - appRouter.push(ReferralProgram(userWalletId = userWallet.walletId)) - } - PromoId.Sepa -> { - analyticsEventHandler.send( - PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.Sepa, - action = PromotionBannerClicked.BannerAction.Clicked(), - ), - ) - cryptoCurrency ?: return - appRouter.push( - Onramp( - userWalletId = userWallet.walletId, - currency = cryptoCurrency, - source = OnrampSource.SEPA_BANNER, - shouldLaunchSepa = true, - ), - ) - } - PromoId.VisaPresale -> { - analyticsEventHandler.send(PromoAnalyticsEvent.VisaWaitlistPromoJoin()) - urlOpener.openUrl(VISA_PROMO_LINK) - } - PromoId.BlackFriday -> { - analyticsEventHandler.send( - PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.BlackFriday, - action = PromotionBannerClicked.BannerAction.Clicked(), - ), - ) - urlOpener.openUrl(BLACK_FRIDAY_PROMO_LINK) - } - PromoId.OnePlusOne -> { - analyticsEventHandler.send( - PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.OnePlusOne, - action = PromotionBannerClicked.BannerAction.Clicked(), - ), - ) - urlOpener.openUrl(ONE_PLUS_ONE_PROMO_LINK) - } - PromoId.YieldPromo -> Unit // banner is not clickable, only terms and conditions button - } - } - override fun onSupportClick() { val userWallet = getSelectedUserWallet() ?: return @@ -478,17 +378,6 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( } } - override fun onYieldPromoTermsAndConditionsClick() { - analyticsEventHandler.send( - PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - program = Program.YieldPromo, - action = PromotionBannerClicked.BannerAction.Clicked(), - ), - ) - urlOpener.openUrl(YIELD_PROMO_TERMS_LINK) - } - override fun onUpgradeHotWalletClick(userWalletId: UserWalletId) { modelScope.launch(dispatchers.main) { val userWallet = getUserWalletUseCase(userWalletId).getOrNull() @@ -519,21 +408,4 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( AccountId.forMainCryptoPortfolio(userWalletId), ) } - - private companion object { - const val VISA_PROMO_LINK = "https://tangem.com/en/cardwaitlist/?utm_source=tangem-app-banner" + - "&utm_medium=banner" + - "&utm_campaign=tangempaywaitlist" - const val BLACK_FRIDAY_PROMO_LINK = "https://tangem.com/en/pricing/" + - "?promocode=BF2025" + - "&utm_source=tangem-app-banner" + - "&utm_medium=banner" + - "&utm_campaign=BlackFriday2025" - const val ONE_PLUS_ONE_PROMO_LINK = "https://tangem.com/pricing/" + - "?cat=family" + - "&utm_source=tangem-app-banner" + - "&utm_medium=banner" + - "&utm_campaign=BOGO50" - const val YIELD_PROMO_TERMS_LINK = "https://tangem.com/docs/yield-mode-toc.html" - } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt index f7e59102b3..f98e930174 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/WalletScreenAnalyticsEvent.kt @@ -125,12 +125,6 @@ sealed class WalletScreenAnalyticsEvent { if (blockchain != null) put("Blockchain", blockchain) }, ) - - // region Referral Promo - class ReferralPromo : MainScreen(event = "Referral Banner") - class ReferralPromoButtonParticipate : MainScreen(event = "Button - Referral Participate") - class ReferralPromoButtonDismiss : MainScreen(event = "Button - Referral Dismiss") - //endregion } sealed class PushBannerPromo( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletWarningsAnalyticsSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletWarningsAnalyticsSender.kt index 4c57e85428..1d2faad058 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletWarningsAnalyticsSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletWarningsAnalyticsSender.kt @@ -4,7 +4,6 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.di.ModelScoped -import com.tangem.domain.tokens.model.analytics.PromoAnalyticsEvent.* import com.tangem.feature.wallet.child.wallet.model.WalletActivationBannerType import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.MainScreen import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.MainScreen.* @@ -69,28 +68,6 @@ internal class WalletWarningsAnalyticsSender @Inject constructor( is WalletNotification.RateApp -> HowDoYouLikeTangem() is WalletNotification.Critical.BackupError -> BackupError() is WalletNotification.NoteMigration -> NotePromo() - is WalletNotification.SwapPromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.Empty, // Use it on new promo action - ) - is WalletNotification.Sepa -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.Sepa, - ) - is WalletNotification.BlackFridayPromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.BlackFriday, - ) - is WalletNotification.OnePlusOnePromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.OnePlusOne, - ) - is WalletNotification.YieldPromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.YieldPromo, - ) - is WalletNotification.ReferralPromo -> MainScreen.ReferralPromo() - is WalletNotification.VisaPresalePromo -> VisaWaitlistPromo() is WalletNotification.UnlockWallets -> null // See [SelectedWalletAnalyticsSender] is WalletNotification.Informational.NoAccount, is WalletNotification.Warning.LowSignatures, @@ -138,14 +115,6 @@ internal class WalletWarningsAnalyticsSender @Inject constructor( is WalletNotificationUM.RateApp -> HowDoYouLikeTangem() is WalletNotificationUM.BackupError -> BackupError() is WalletNotificationUM.NoteMigration -> NotePromo() - is WalletNotificationUM.OnePlusOnePromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.OnePlusOne, - ) - is WalletNotificationUM.YieldPromo -> NoticePromotionBanner( - source = AnalyticsParam.ScreensSources.Main, - program = Program.YieldPromo, - ) is WalletNotificationUM.FinishWalletActivation -> { val activationState = if (notificationUM.isBackupExists) { NoticeFinishActivation.ActivationState.Unfinished diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt index c4b2be588a..779bf672b9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt @@ -24,8 +24,6 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.notifications.repository.NotificationsRepository -import com.tangem.domain.promo.ShouldShowPromoWalletUseCase -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.settings.IsReadyToShowRateAppUseCase import com.tangem.domain.assetsdiscovery.model.AssetsDiscoveryProgress import com.tangem.domain.assetsdiscovery.usecase.ObserveAssetsDiscoveryUseCase @@ -54,7 +52,6 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( private val isReadyToShowRateAppUseCase: IsReadyToShowRateAppUseCase, private val isNeedToBackupUseCase: IsNeedToBackupUseCase, private val backupValidator: BackupValidator, - private val shouldShowPromoWalletUseCase: ShouldShowPromoWalletUseCase, private val notificationsRepository: NotificationsRepository, private val accountDependencies: AccountDependencies, private val getAccessCodeSkippedUseCase: GetAccessCodeSkippedUseCase, @@ -82,13 +79,9 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( accountStatusListFlow, isReadyToShowRateAppUseCase().distinctUntilChanged(), isNeedToBackupUseCase(userWallet.walletId).distinctUntilChanged(), - shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.OnePlusOne) - .distinctUntilChanged(), notificationsRepository.getShouldShowNotification(NotificationId.EnablePushesReminderNotification.key) .distinctUntilChanged(), getAccessCodeSkippedUseCase(userWallet.walletId).distinctUntilChanged(), - shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.YieldPromo) - .distinctUntilChanged(), shouldShowUpgradeHotWalletBannerUseCase.invoke(userWallet.walletId) .distinctUntilChanged(), getUpgradeBannerClosureTimestampUseCase(userWallet.walletId) @@ -99,13 +92,11 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( val accountStatusList = array[0] as AccountStatusList val isReadyToShowRating = array[1] as Boolean val isNeedToBackup = array[2] as Boolean - val shouldShowOnePlusOnePromo = array[3] as Boolean - val shouldShowEnablePushesReminderNotification = array[4] as Boolean - val shouldAccessCodeSkipped = array[5] as Boolean - val shouldShowYieldPromo = array[6] as Boolean - val shouldShowUpgradeBanner = array[7] as Boolean - val closureTimestamp = array[8] as? Long - val assetsDiscoveryProgress = array[9] as AssetsDiscoveryProgress + val shouldShowEnablePushesReminderNotification = array[3] as Boolean + val shouldAccessCodeSkipped = array[4] as Boolean + val shouldShowUpgradeBanner = array[5] as Boolean + val closureTimestamp = array[6] as? Long + val assetsDiscoveryProgress = array[7] as AssetsDiscoveryProgress val flattenCurrencies = accountStatusList.flattenCurrencies() val paymentAccountStatus = accountStatusList.accountStatuses @@ -132,10 +123,6 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( shouldAccessCodeSkipped = shouldAccessCodeSkipped, ) - addOnePlusOnePromoNotification(clickIntents, shouldShowOnePlusOnePromo) - - addYieldPromoNotification(clickIntents, shouldShowYieldPromo) - addInformationalNotifications( userWallet = userWallet, cardTypesResolver = cardTypesResolver, @@ -296,32 +283,6 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( .map(CryptoCurrencyStatus::currency) } - private fun MutableList.addOnePlusOnePromoNotification( - clickIntents: WalletClickIntents, - shouldShowPromo: Boolean, - ) { - addIf( - element = WalletNotification.OnePlusOnePromo( - onCloseClick = { clickIntents.onClosePromoClick(promoId = PromoId.OnePlusOne) }, - onClick = { clickIntents.onPromoClick(promoId = PromoId.OnePlusOne) }, - ), - condition = shouldShowPromo, - ) - } - - private fun MutableList.addYieldPromoNotification( - clickIntents: WalletClickIntents, - shouldShowPromo: Boolean, - ) { - addIf( - element = WalletNotification.YieldPromo( - onCloseClick = { clickIntents.onClosePromoClick(promoId = PromoId.YieldPromo) }, - onTermsAndConditionsClick = { clickIntents.onYieldPromoTermsAndConditionsClick() }, - ), - condition = shouldShowPromo, - ) - } - // private fun MutableList.addYieldSupplyNotifications( // flattenCurrencies: Lce>, // ) { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetWalletNotificationsCarouselFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetWalletNotificationsCarouselFactory.kt index 0988254408..05fde4c1ac 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetWalletNotificationsCarouselFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetWalletNotificationsCarouselFactory.kt @@ -5,10 +5,7 @@ import com.tangem.common.ui.notifications.NotificationId import com.tangem.core.decompose.di.ModelScoped import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.models.wallet.UserWallet -import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.notifications.repository.NotificationsRepository -import com.tangem.domain.promo.ShouldShowPromoWalletUseCase -import com.tangem.domain.promo.models.PromoId import com.tangem.domain.settings.IsReadyToShowRateAppUseCase import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents @@ -29,32 +26,22 @@ import javax.inject.Inject @ModelScoped internal class GetWalletNotificationsCarouselFactory @Inject constructor( private val isReadyToShowRateAppUseCase: IsReadyToShowRateAppUseCase, - private val shouldShowPromoWalletUseCase: ShouldShowPromoWalletUseCase, private val getWalletsUseCase: GetWalletsUseCase, private val notificationsRepository: NotificationsRepository, ) { fun create(userWallet: UserWallet, clickIntents: WalletClickIntents): Flow> { return combine( - flow = shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.YieldPromo) - .distinctUntilChanged(), - flow2 = notificationsRepository.getShouldShowNotification( + flow = notificationsRepository.getShouldShowNotification( NotificationId.EnablePushesReminderNotification.key, ).distinctUntilChanged(), - flow3 = shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.OnePlusOne) - .distinctUntilChanged(), - flow4 = isReadyToShowRateAppUseCase().distinctUntilChanged(), - flow5 = getWalletsUseCase().conflate(), - ) { showYieldPromo, showPushesNotification, showOnePlusOnePromo, showRateAppPromo, wallets -> + flow2 = isReadyToShowRateAppUseCase().distinctUntilChanged(), + flow3 = getWalletsUseCase().conflate(), + ) { showPushesNotification, showRateAppPromo, wallets -> buildList { addNoteMigrationNotification(userWallet, wallets, clickIntents) addRateAppNotification(showRateAppPromo, clickIntents) - if (userWallet.isMultiCurrency) { - addOnePlusOnePromoNotification(clickIntents, showOnePlusOnePromo) - addYieldPromoNotification(clickIntents, showYieldPromo) - } - addPushNotification( shouldShow = showPushesNotification, isPushesAllowed = notificationsRepository.isUserAllowToSubscribeOnPushNotifications(), @@ -77,30 +64,6 @@ internal class GetWalletNotificationsCarouselFactory @Inject constructor( } } - private fun MutableList.addYieldPromoNotification( - clickIntents: WalletClickIntents, - shouldShowPromo: Boolean, - ) { - addIf(shouldShowPromo) { - WalletNotificationUM.YieldPromo( - onCloseClick = { clickIntents.onClosePromoClick(promoId = PromoId.YieldPromo) }, - onTermsAndConditionsClick = { clickIntents.onYieldPromoTermsAndConditionsClick() }, - ) - } - } - - private fun MutableList.addOnePlusOnePromoNotification( - clickIntents: WalletClickIntents, - shouldShowPromo: Boolean, - ) { - addIf(shouldShowPromo) { - WalletNotificationUM.OnePlusOnePromo( - onCloseClick = { clickIntents.onClosePromoClick(promoId = PromoId.OnePlusOne) }, - onClick = { clickIntents.onPromoClick(promoId = PromoId.OnePlusOne) }, - ) - } - } - private fun MutableList.addNoteMigrationNotification( userWallet: UserWallet, userWallets: List, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt index ecdd0aa9e5..de07e7a7f6 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt @@ -12,7 +12,6 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.wrappedList import com.tangem.feature.wallet.child.wallet.model.WalletActivationBannerType import com.tangem.feature.wallet.impl.R -import org.joda.time.DateTime /** * Wallet notification component state @@ -229,19 +228,6 @@ sealed class WalletNotification(val config: NotificationConfig) { ), ) - data class SwapPromo( - val startDateTime: DateTime, - val endDateTime: DateTime, - val onCloseClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(id = R.string.swap_promo_title), - subtitle = resourceReference(id = R.string.swap_promo_text), - iconResId = R.drawable.img_okx_dex_logo, - onCloseClick = onCloseClick, - ), - ) - data class NoteMigration(val onClick: () -> Unit) : WalletNotification( config = NotificationConfig( title = resourceReference(R.string.wallet_promo_banner_title), @@ -282,108 +268,6 @@ sealed class WalletNotification(val config: NotificationConfig) { ), ) - data class ReferralPromo( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_referral_promo_title), - subtitle = resourceReference(R.string.notification_referral_promo_text), - iconResId = R.drawable.img_referral_promo, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.notification_referral_promo_button), - onClick = onClick, - ), - iconSize = 54.dp, - ), - ) - - data class VisaPresalePromo( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_visa_waitlist_promo_title), - subtitle = resourceReference(R.string.notification_visa_waitlist_promo_text), - iconResId = R.drawable.img_visa_waitlist_promo, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.notification_referral_promo_button), - onClick = onClick, - ), - iconSize = 54.dp, - ), - ) - - data class Sepa( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_sepa_title), - subtitle = resourceReference(R.string.notification_sepa_text), - iconResId = R.drawable.img_notification_sepa, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.notification_sepa_button), - onClick = onClick, - ), - iconSize = 54.dp, - ), - ) - - data class BlackFridayPromo( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_black_friday_title), - subtitle = resourceReference(R.string.notification_black_friday_text), - iconResId = R.drawable.img_black_friday_promo, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.common_claim), - onClick = onClick, - ), - iconSize = 54.dp, - ), - ) - - data class OnePlusOnePromo( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_one_plus_one_title), - subtitle = resourceReference(R.string.notification_one_plus_one_text), - iconResId = R.drawable.img_one_plus_one_promo, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.notification_one_plus_one_button), - onClick = onClick, - ), - iconSize = 54.dp, - ), - ) - - data class YieldPromo( - val onCloseClick: () -> Unit, - val onTermsAndConditionsClick: () -> Unit, - ) : WalletNotification( - config = NotificationConfig( - title = resourceReference(R.string.notification_yield_promo_title), - subtitle = resourceReference(R.string.notification_yield_promo_text), - iconResId = R.drawable.ic_yield_promo_36, - onCloseClick = onCloseClick, - buttonsState = NotificationConfig.ButtonsState.SecondaryButtonConfig( - text = resourceReference(R.string.notification_yield_promo_button), - onClick = onTermsAndConditionsClick, - ), - iconSize = 36.dp, - ), - ) - data class PushNotifications( val onCloseClick: () -> Unit, val onEnabledClick: () -> Unit, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotificationUM.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotificationUM.kt index f33fa5a3a0..91bee732d4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotificationUM.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotificationUM.kt @@ -360,53 +360,6 @@ internal sealed class WalletNotificationUM(val messageUM: TangemMessageUM, val t type = WalletNotificationType.Promo, ) - data class OnePlusOnePromo( - val onCloseClick: () -> Unit, - val onClick: () -> Unit, - ) : WalletNotificationUM( - messageUM = TangemMessageUM( - id = "OnePlusOnePromoNotification", - title = resourceReference(R.string.notification_one_plus_one_title), - subtitle = resourceReference(R.string.notification_one_plus_one_text), - messageEffect = TangemMessageEffect.Magic, - iconUM = TangemIconUM.Image(R.drawable.img_one_plus_one_promo), - iconSize = 54.dp, - buttonsUM = persistentListOf( - TangemMessageButtonUM( - text = resourceReference(R.string.common_later), - type = TangemButtonType.PrimaryInverse, - onClick = onCloseClick, - ), - TangemMessageButtonUM( - text = resourceReference(R.string.notification_one_plus_one_button), - type = TangemButtonType.Primary, - onClick = onClick, - ), - ), - ), - type = WalletNotificationType.Promo, - ) - - data class YieldPromo( - val onCloseClick: () -> Unit, - val onTermsAndConditionsClick: () -> Unit, - ) : WalletNotificationUM( - messageUM = TangemMessageUM( - id = "YieldPromoNotification", - title = resourceReference(R.string.notification_yield_promo_title), - subtitle = resourceReference(R.string.notification_yield_promo_text), - onCloseClick = onCloseClick, - messageEffect = TangemMessageEffect.Magic, - buttonsUM = persistentListOf( - TangemMessageButtonUM( - text = resourceReference(R.string.notification_yield_promo_button), - type = TangemButtonType.Primary, - onClick = onTermsAndConditionsClick, - ), - ), - ), - type = WalletNotificationType.Promo, - ) // endregion // region Survey diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletNotifications.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletNotifications.kt index 8d058b28bc..a3ef3b68c4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletNotifications.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletNotifications.kt @@ -27,11 +27,7 @@ internal fun LazyListScope.notifications(configs: ImmutableList - // TODO develop promo banner general component when (item) { - is WalletNotification.SwapPromo -> { - // Use it on new promo action - } is WalletNotification.NoteMigration -> { NoteMigrationNotification( config = item.config, diff --git a/features/wallet/impl/src/main/res/drawable/ic_yield_promo_36.xml b/features/wallet/impl/src/main/res/drawable/ic_yield_promo_36.xml deleted file mode 100644 index 4a4921466d..0000000000 --- a/features/wallet/impl/src/main/res/drawable/ic_yield_promo_36.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - -