From 2d2d1579439f659840e844e4195b594d8df8e0f3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Apr 2025 16:56:19 +0500 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values/strings.xml | 3 ++ .../components/notifications/Notification.kt | 7 +++- .../main/res/drawable/img_referral_promo.webp | Bin 0 -> 23568 bytes data/promo/build.gradle.kts | 1 + .../data/promo/DefaultPromoRepository.kt | 11 ++++++- .../tangem/data/promo/di/PromoDataModule.kt | 3 ++ .../referral/data/ReferralRepositoryImpl.kt | 4 +++ .../referral/domain/ReferralRepository.kt | 3 ++ .../intents/WalletWarningsClickIntents.kt | 30 +++++++++++++++--- .../analytics/WalletScreenAnalyticsEvent.kt | 6 ++++ .../utils/WalletWarningsAnalyticsSender.kt | 1 + .../domain/GetMultiWalletWarningsFactory.kt | 22 ++++++++++++- .../wallet/state/model/WalletNotification.kt | 16 ++++++++++ .../components/common/WalletNotifications.kt | 6 ++++ 14 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 core/ui/src/main/res/drawable/img_referral_promo.webp diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index a23e1b705f..48b2496729 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -520,6 +520,9 @@ NFT collections Unable to load the data Choose network + Join Now + Share your code - earn 5 USDT per sale. Your friend gets 10% OFF. + Get REWARDS for every friend! Last sale price Rarity label Rarity rank diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt index 7bd5322685..5d1f6b11fd 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/notifications/Notification.kt @@ -25,6 +25,8 @@ import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import com.tangem.core.ui.R import com.tangem.core.ui.components.* import com.tangem.core.ui.components.buttons.common.TangemButtonSize @@ -55,6 +57,7 @@ fun Notification( subtitleColor: Color = TangemTheme.colors.text.tertiary, containerColor: Color? = null, iconTint: Color? = null, + iconSize: Dp = 20.dp, isEnabled: Boolean = true, ) { NotificationBaseContainer( @@ -68,6 +71,7 @@ fun Notification( MainContent( iconResId = config.iconResId, iconTint = iconTint, + iconSize = iconSize, title = config.title, subtitle = config.subtitle, subtitleColor = subtitleColor, @@ -127,6 +131,7 @@ internal fun NotificationBaseContainer( private fun MainContent( iconResId: Int, iconTint: Color?, + iconSize: Dp, title: TextReference?, subtitle: TextReference, subtitleColor: Color, @@ -137,7 +142,7 @@ private fun MainContent( iconResId = iconResId, tint = iconTint, modifier = Modifier - .size(size = TangemTheme.dimens.size20) + .size(size = iconSize) .align(alignment = Alignment.CenterVertically), ) diff --git a/core/ui/src/main/res/drawable/img_referral_promo.webp b/core/ui/src/main/res/drawable/img_referral_promo.webp new file mode 100644 index 0000000000000000000000000000000000000000..25a0af2e67b7940ed70ca4a32611a73c45d42ca3 GIT binary patch literal 23568 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 bysffr90MDRbFQE*Z?!>S2`~Ti3_t(?*7Kcz literal 0 HcmV?d00001 diff --git a/data/promo/build.gradle.kts b/data/promo/build.gradle.kts index e2dd74f43c..7573a1e454 100644 --- a/data/promo/build.gradle.kts +++ b/data/promo/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation(projects.domain.promo) implementation(projects.domain.promo.models) implementation(projects.domain.wallets.models) + implementation(projects.features.referral.domain) implementation(projects.core.datasource) implementation(projects.core.utils) 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 2c409f90fd..c80337d42b 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 @@ -14,9 +14,11 @@ import com.tangem.domain.promo.PromoRepository import com.tangem.domain.promo.models.PromoId import com.tangem.domain.promo.models.StoryContent import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.feature.referral.domain.ReferralRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeoutOrNull @@ -26,6 +28,7 @@ internal class DefaultPromoRepository( private val appPreferencesStore: AppPreferencesStore, private val promoStoriesStore: PromoStoriesStore, private val dispatchers: CoroutineDispatcherProvider, + private val referralRepository: ReferralRepository, ) : PromoRepository { private val storyContentConverter = StoryContentResponseConverter() @@ -34,7 +37,13 @@ internal class DefaultPromoRepository( return appPreferencesStore.get( key = PreferencesKeys.getShouldShowPromoKey(promoId = promoId.name), default = true, - ) + ).map { shouldShow -> + if (promoId == PromoId.Referral) { + !referralRepository.isReferralParticipant(userWalletId) && shouldShow + } else { + shouldShow + } + } } override fun isReadyToShowTokenPromo(promoId: PromoId): Flow { 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 a564ef0509..69d489a2dc 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 @@ -5,6 +5,7 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.preferences.AppPreferencesStore 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 @@ -23,12 +24,14 @@ internal object PromoDataModule { appPreferencesStore: AppPreferencesStore, promoStoriesStore: PromoStoriesStore, dispatchers: CoroutineDispatcherProvider, + referralRepository: ReferralRepository, ): PromoRepository { return DefaultPromoRepository( tangemApi = tangemTechApi, appPreferencesStore = appPreferencesStore, promoStoriesStore = promoStoriesStore, dispatchers = dispatchers, + referralRepository = referralRepository, ) } } \ No newline at end of file diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt index f33ab65ce4..714e0e29dc 100644 --- a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt @@ -39,6 +39,10 @@ internal class ReferralRepositoryImpl @Inject constructor( } } + override suspend fun isReferralParticipant(userWalletId: UserWalletId): Boolean { + return getReferralData(userWalletId.stringValue) is ReferralData.ParticipantData + } + override suspend fun startReferral( walletId: String, networkId: String, diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt index 760277f9f8..9c890ff038 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt @@ -10,6 +10,9 @@ interface ReferralRepository { /** Returns data object of [ReferralData] depends on user program status */ suspend fun getReferralData(walletId: String): ReferralData + /** Returns whether user is participating in referral program */ + suspend fun isReferralParticipant(userWalletId: UserWalletId): Boolean + /** Starts user referral program */ suspend fun startReferral(walletId: String, networkId: String, tokenId: String, address: String): ReferralData 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 2688e82b36..316ee31a8a 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 @@ -2,6 +2,8 @@ package com.tangem.feature.wallet.child.wallet.model.intents import arrow.core.getOrElse import com.tangem.common.TangemBlogUrlBuilder +import com.tangem.common.routing.AppRoute +import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.di.ModelScoped @@ -70,6 +72,8 @@ internal interface WalletWarningsClickIntents { fun onClosePromoClick(promoId: PromoId) + fun onPromoClick(promoId: PromoId) + fun onSupportClick() fun onNoteMigrationButtonClick(url: String) @@ -106,6 +110,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( private val urlOpener: UrlOpener, private val tokensFeatureToggles: TokensFeatureToggles, private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher, + private val appRouter: AppRouter, ) : BaseWalletClickIntents(), WalletWarningsClickIntents { override fun onAddBackupCardClick() { @@ -271,17 +276,32 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( override fun onClosePromoClick(promoId: PromoId) { analyticsEventHandler.send( - TokenSwapPromoAnalyticsEvent.PromotionBannerClicked( - source = AnalyticsParam.ScreensSources.Main, - programName = TokenSwapPromoAnalyticsEvent.ProgramName.Empty, // Use it on new promo action - action = TokenSwapPromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed, - ), + if (promoId == PromoId.Referral) { + MainScreen.ReferralPromoButtonDismiss + } else { + TokenSwapPromoAnalyticsEvent.PromotionBannerClicked( + source = AnalyticsParam.ScreensSources.Main, + programName = TokenSwapPromoAnalyticsEvent.ProgramName.Empty, // Use it on new promo action + action = TokenSwapPromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed, + ) + }, ) modelScope.launch(dispatchers.main) { shouldShowPromoWalletUseCase.neverToShow(promoId) } } + override fun onPromoClick(promoId: PromoId) { + if (promoId == PromoId.Referral) { + val userWallet = getSelectedUserWallet() ?: return + analyticsEventHandler.send(MainScreen.ReferralPromoButtonParticipate) + modelScope.launch { + shouldShowPromoWalletUseCase.neverToShow(promoId) + appRouter.push(AppRoute.ReferralProgram(userWalletId = userWallet.walletId)) + } + } + } + override fun onSupportClick() { val scanResponse = getSelectedUserWallet()?.scanResponse ?: return val cardInfo = getCardInfoUseCase(scanResponse).getOrNull() ?: return 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 a07053ba04..523e8923de 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 @@ -137,5 +137,11 @@ sealed class WalletScreenAnalyticsEvent { data object NoticeSeedPhraseSupportButtonUsed : MainScreen(event = "Button - Support Used") data object NoticeSeedPhraseSupportButtonDeclined : MainScreen(event = "Button - Support Declined") + + // region Referral Promo + data object ReferralPromo : MainScreen(event = "Referral Banner") + data object ReferralPromoButtonParticipate : MainScreen(event = "Button - Referral Participate") + data object ReferralPromoButtonDismiss : MainScreen(event = "Button - Referral Dismiss") + //endregion } } \ No newline at end of file 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 36ed315d4b..0db4af387d 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 @@ -53,6 +53,7 @@ internal class WalletWarningsAnalyticsSender @Inject constructor( source = AnalyticsParam.ScreensSources.Main, programName = ProgramName.Empty, // Use it on new promo action ) + is WalletNotification.ReferralPromo -> MainScreen.ReferralPromo is WalletNotification.UnlockWallets -> null // See [SelectedWalletAnalyticsSender] is WalletNotification.Informational.NoAccount, is WalletNotification.Warning.LowSignatures, 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 5ca74067c5..f50c6ea080 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 @@ -6,6 +6,8 @@ import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.core.lce.Lce import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.models.StatusSource +import com.tangem.domain.promo.ShouldShowPromoWalletUseCase +import com.tangem.domain.promo.models.PromoId import com.tangem.domain.settings.IsReadyToShowRateAppUseCase import com.tangem.domain.tokens.error.TokenListError import com.tangem.domain.tokens.model.CryptoCurrency @@ -34,6 +36,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( private val isNeedToBackupUseCase: IsNeedToBackupUseCase, private val backupValidator: BackupValidator, private val seedPhraseNotificationUseCase: SeedPhraseNotificationUseCase, + private val shouldShowPromoWalletUseCase: ShouldShowPromoWalletUseCase, ) { @Suppress("MagicNumber", "MaximumLineLength") @@ -45,12 +48,15 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( flow2 = isReadyToShowRateAppUseCase(), flow3 = isNeedToBackupUseCase(userWallet.walletId), flow4 = seedPhraseNotificationUseCase(userWalletId = userWallet.walletId), - ) { maybeTokenList, isReadyToShowRating, isNeedToBackup, seedPhraseIssueStatus -> + flow5 = shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.Referral), + ) { maybeTokenList, isReadyToShowRating, isNeedToBackup, seedPhraseIssueStatus, shouldShowReferralPromo -> buildList { addUsedOutdatedDataNotification(maybeTokenList) addCriticalNotifications(userWallet, seedPhraseIssueStatus, clickIntents) + addReferralPromoNotification(cardTypesResolver, clickIntents, shouldShowReferralPromo) + addInformationalNotifications(cardTypesResolver, maybeTokenList, clickIntents) addWarningNotifications(cardTypesResolver, maybeTokenList, isNeedToBackup, clickIntents) @@ -187,6 +193,20 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( .map(CryptoCurrencyStatus::currency) } + private fun MutableList.addReferralPromoNotification( + cardTypesResolver: CardTypesResolver, + clickIntents: WalletClickIntents, + shouldShowPromo: Boolean, + ) { + addIf( + element = WalletNotification.ReferralPromo( + onCloseClick = { clickIntents.onClosePromoClick(promoId = PromoId.Referral) }, + onClick = { clickIntents.onPromoClick(promoId = PromoId.Referral) }, + ), + condition = shouldShowPromo && cardTypesResolver.isTangemWallet(), + ) + } + private fun MutableList.addWarningNotifications( cardTypesResolver: CardTypesResolver, tokenList: Lce, 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 203a35a3a8..8315a590cd 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 @@ -254,4 +254,20 @@ sealed class WalletNotification(val config: NotificationConfig) { iconResId = R.drawable.ic_error_sync_24, ), ) + + 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, + ), + ), + ) } \ No newline at end of file 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 211ce57e2d..0227a5339a 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 @@ -3,6 +3,7 @@ package com.tangem.feature.wallet.presentation.wallet.ui.components.common import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.notifications.NoteMigrationNotification import com.tangem.core.ui.components.notifications.Notification import com.tangem.core.ui.res.TangemTheme @@ -38,6 +39,11 @@ internal fun LazyListScope.notifications(configs: ImmutableList TangemTheme.colors.icon.warning is WalletNotification.Informational -> TangemTheme.colors.icon.accent