Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-27 13:18:26 +05:00
parent e7f65c8e85
commit 9c1bc4e327
28 changed files with 154 additions and 219 deletions

View file

@ -75,6 +75,7 @@ dependencies {
implementation(projects.domain.markets) implementation(projects.domain.markets)
implementation(projects.domain.manageTokens) implementation(projects.domain.manageTokens)
implementation(projects.domain.onramp) implementation(projects.domain.onramp)
implementation(projects.domain.promo)
implementation(projects.common) implementation(projects.common)
implementation(projects.common.routing) implementation(projects.common.routing)

View file

@ -0,0 +1,36 @@
package com.tangem.tap.di.domain
import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.ShouldShowRingPromoUseCase
import com.tangem.domain.promo.ShouldShowSwapPromoTokenUseCase
import com.tangem.domain.promo.ShouldShowSwapPromoWalletUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object PromoDomainModule {
@Provides
@Singleton
fun provideShouldShowSwapPromoWalletUseCase(
promoSettingsRepository: PromoRepository,
): ShouldShowSwapPromoWalletUseCase {
return ShouldShowSwapPromoWalletUseCase(promoSettingsRepository)
}
@Provides
@Singleton
fun provideShouldShowRingPromoUseCase(promoRepository: PromoRepository): ShouldShowRingPromoUseCase {
return ShouldShowRingPromoUseCase(promoRepository)
}
@Provides
@Singleton
fun provideShouldShowSwapPromoTokenUseCase(promoRepository: PromoRepository): ShouldShowSwapPromoTokenUseCase {
return ShouldShowSwapPromoTokenUseCase(promoRepository)
}
}

View file

@ -8,7 +8,6 @@ import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository
import com.tangem.domain.settings.* import com.tangem.domain.settings.*
import com.tangem.domain.settings.repositories.AppRatingRepository import com.tangem.domain.settings.repositories.AppRatingRepository
import com.tangem.domain.settings.repositories.PermissionRepository import com.tangem.domain.settings.repositories.PermissionRepository
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase
import com.tangem.domain.settings.usercountry.GetUserCountryUseCase import com.tangem.domain.settings.usercountry.GetUserCountryUseCase
@ -117,30 +116,6 @@ internal object SettingsDomainModule {
return IsWalletsScrollPreviewEnabled(settingsRepository = settingsRepository) return IsWalletsScrollPreviewEnabled(settingsRepository = settingsRepository)
} }
@Provides
@Singleton
fun provideShouldShowSwapPromoWalletUseCase(
promoSettingsRepository: PromoSettingsRepository,
): ShouldShowSwapPromoWalletUseCase {
return ShouldShowSwapPromoWalletUseCase(promoSettingsRepository)
}
@Provides
@Singleton
fun provideShouldShowRingPromoUseCase(
promoSettingsRepository: PromoSettingsRepository,
): ShouldShowRingPromoUseCase {
return ShouldShowRingPromoUseCase(promoSettingsRepository)
}
@Provides
@Singleton
fun provideShouldShowSwapPromoTokenUseCase(
promoSettingsRepository: PromoSettingsRepository,
): ShouldShowSwapPromoTokenUseCase {
return ShouldShowSwapPromoTokenUseCase(promoSettingsRepository)
}
@Provides @Provides
@Singleton @Singleton
fun provideDeleteDeprecatedLogsUseCase(settingsRepository: SettingsRepository): DeleteDeprecatedLogsUseCase { fun provideDeleteDeprecatedLogsUseCase(settingsRepository: SettingsRepository): DeleteDeprecatedLogsUseCase {

View file

@ -1,12 +1,10 @@
package com.tangem.tap.di.domain package com.tangem.tap.di.domain
import com.tangem.domain.exchange.RampStateManager import com.tangem.domain.exchange.RampStateManager
import com.tangem.domain.settings.ShouldShowSwapPromoTokenUseCase
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.tokens.* import com.tangem.domain.tokens.*
import com.tangem.domain.tokens.repository.* import com.tangem.domain.tokens.repository.*
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.feature.swap.domain.api.SwapRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
@ -118,13 +116,9 @@ internal object TokensDomainModule {
currenciesRepository: CurrenciesRepository, currenciesRepository: CurrenciesRepository,
quotesRepository: QuotesRepository, quotesRepository: QuotesRepository,
networksRepository: NetworksRepository, networksRepository: NetworksRepository,
swapRepository: SwapRepository,
currencyChecksRepository: CurrencyChecksRepository, currencyChecksRepository: CurrencyChecksRepository,
showSwapPromoTokenUseCase: ShouldShowSwapPromoTokenUseCase,
promoRepository: PromoRepository,
stakingRepository: StakingRepository, stakingRepository: StakingRepository,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
rampStateManager: RampStateManager,
): GetCurrencyWarningsUseCase { ): GetCurrencyWarningsUseCase {
return GetCurrencyWarningsUseCase( return GetCurrencyWarningsUseCase(
walletManagersFacade = walletManagersFacade, walletManagersFacade = walletManagersFacade,
@ -132,12 +126,8 @@ internal object TokensDomainModule {
quotesRepository = quotesRepository, quotesRepository = quotesRepository,
networksRepository = networksRepository, networksRepository = networksRepository,
currencyChecksRepository = currencyChecksRepository, currencyChecksRepository = currencyChecksRepository,
swapRepository = swapRepository,
showSwapPromoTokenUseCase = showSwapPromoTokenUseCase,
promoRepository = promoRepository,
stakingRepository = stakingRepository, stakingRepository = stakingRepository,
dispatchers = dispatchers, dispatchers = dispatchers,
rampStateManager = rampStateManager,
) )
} }

View file

@ -17,8 +17,9 @@ dependencies {
implementation(deps.hilt.android) implementation(deps.hilt.android)
kapt(deps.hilt.kapt) kapt(deps.hilt.kapt)
implementation(projects.domain.tokens) implementation(projects.domain.promo)
implementation(projects.domain.tokens.models) implementation(projects.domain.promo.models)
implementation(projects.domain.wallets.models)
implementation(projects.core.datasource) implementation(projects.core.datasource)
implementation(projects.core.utils) implementation(projects.core.utils)

View file

@ -3,13 +3,25 @@ package com.tangem.data.promo
import com.tangem.data.promo.converters.PromoResponseConverter import com.tangem.data.promo.converters.PromoResponseConverter
import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.domain.promo.PromoBanner import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.tokens.repository.PromoRepository import com.tangem.datasource.local.preferences.PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_RING_PROMO_KEY
import com.tangem.datasource.local.preferences.utils.get
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.models.PromoBanner
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching import com.tangem.utils.coroutines.runCatching
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
internal class DefaultPromoRepository( internal class DefaultPromoRepository(
private val tangemApi: TangemTechApi, private val tangemApi: TangemTechApi,
private val appPreferencesStore: AppPreferencesStore,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
) : PromoRepository { ) : PromoRepository {
@ -41,6 +53,42 @@ internal class DefaultPromoRepository(
}.getOrNull() }.getOrNull()
} }
override fun isReadyToShowWalletSwapPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY, true)
}
override fun isReadyToShowTokenSwapPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY, true)
}
override suspend fun setNeverToShowWalletSwapPromo() {
appPreferencesStore.store(
key = IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY,
value = false,
)
}
override suspend fun setNeverToShowTokenSwapPromo() {
appPreferencesStore.store(
key = IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY,
value = false,
)
}
override fun isReadyToShowRingPromo(userWalletId: UserWalletId): Flow<Boolean> {
return combine(
flow = appPreferencesStore
.get(key = ADDED_WALLETS_WITH_RING_KEY, default = emptySet())
.map { userWalletId.stringValue in it },
flow2 = appPreferencesStore.get(key = SHOULD_SHOW_RING_PROMO_KEY, default = true),
transform = { isRingAdded, shouldShowRingPromo -> isRingAdded && shouldShowRingPromo },
)
}
override suspend fun setNeverToShowRingPromo() {
appPreferencesStore.store(key = SHOULD_SHOW_RING_PROMO_KEY, value = false)
}
private companion object { private companion object {
private const val CHANGELLY_NAME = "changelly" private const val CHANGELLY_NAME = "changelly"
private const val OKX = "okx" private const val OKX = "okx"

View file

@ -1,7 +1,7 @@
package com.tangem.data.promo.converters package com.tangem.data.promo.converters
import com.tangem.datasource.api.promotion.models.PromotionInfoResponse import com.tangem.datasource.api.promotion.models.PromotionInfoResponse
import com.tangem.domain.promo.PromoBanner import com.tangem.domain.promo.models.PromoBanner
import com.tangem.utils.converter.Converter import com.tangem.utils.converter.Converter
import org.joda.time.DateTime import org.joda.time.DateTime

View file

@ -2,7 +2,8 @@ package com.tangem.data.promo.di
import com.tangem.data.promo.DefaultPromoRepository import com.tangem.data.promo.DefaultPromoRepository
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.domain.tokens.repository.PromoRepository import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.promo.PromoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
@ -18,8 +19,9 @@ internal object PromoDataModule {
@Singleton @Singleton
fun providePromoRepository( fun providePromoRepository(
tangemTechApi: TangemTechApi, tangemTechApi: TangemTechApi,
appPreferencesStore: AppPreferencesStore,
dispatchers: CoroutineDispatcherProvider, dispatchers: CoroutineDispatcherProvider,
): PromoRepository { ): PromoRepository {
return DefaultPromoRepository(tangemTechApi, dispatchers) return DefaultPromoRepository(tangemTechApi, appPreferencesStore, dispatchers)
} }
} }

View file

@ -17,7 +17,6 @@ dependencies {
implementation(projects.domain.balanceHiding.models) implementation(projects.domain.balanceHiding.models)
implementation(projects.domain.settings) implementation(projects.domain.settings)
implementation(projects.domain.wallets.models)
implementation(deps.androidx.datastore) implementation(deps.androidx.datastore)

View file

@ -1,57 +0,0 @@
package com.tangem.data.settings
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_RING_PROMO_KEY
import com.tangem.datasource.local.preferences.utils.get
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
/**
* Repository for showing swap promo notification.
*/
class DefaultPromoSettingsRepository(
private val appPreferencesStore: AppPreferencesStore,
) : PromoSettingsRepository {
override fun isReadyToShowWalletSwapPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY, true)
}
override fun isReadyToShowTokenSwapPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY, true)
}
override suspend fun setNeverToShowWalletSwapPromo() {
appPreferencesStore.store(
key = IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY,
value = false,
)
}
override suspend fun setNeverToShowTokenSwapPromo() {
appPreferencesStore.store(
key = IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY,
value = false,
)
}
override fun isReadyToShowRingPromo(userWalletId: UserWalletId): Flow<Boolean> {
return combine(
flow = appPreferencesStore
.get(key = ADDED_WALLETS_WITH_RING_KEY, default = emptySet())
.map { userWalletId.stringValue in it },
flow2 = appPreferencesStore.get(key = SHOULD_SHOW_RING_PROMO_KEY, default = true),
transform = { isRingAdded, shouldShowRingPromo -> isRingAdded && shouldShowRingPromo },
)
}
override suspend fun setNeverToShowRingPromo() {
appPreferencesStore.store(key = SHOULD_SHOW_RING_PROMO_KEY, value = false)
}
}

View file

@ -2,14 +2,12 @@ package com.tangem.data.settings.di
import com.tangem.data.settings.DefaultAppRatingRepository import com.tangem.data.settings.DefaultAppRatingRepository
import com.tangem.data.settings.DefaultPermissionRepository import com.tangem.data.settings.DefaultPermissionRepository
import com.tangem.data.settings.DefaultPromoSettingsRepository
import com.tangem.data.settings.DefaultSettingsRepository import com.tangem.data.settings.DefaultSettingsRepository
import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.logs.AppLogsStore import com.tangem.datasource.local.logs.AppLogsStore
import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.settings.repositories.AppRatingRepository import com.tangem.domain.settings.repositories.AppRatingRepository
import com.tangem.domain.settings.repositories.PermissionRepository import com.tangem.domain.settings.repositories.PermissionRepository
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module import dagger.Module
@ -44,12 +42,6 @@ internal object SettingsDataModule {
return DefaultAppRatingRepository(appPreferencesStore = appPreferencesStore) return DefaultAppRatingRepository(appPreferencesStore = appPreferencesStore)
} }
@Provides
@Singleton
fun providePromoSettingsSettingsRepository(appPreferencesStore: AppPreferencesStore): PromoSettingsRepository {
return DefaultPromoSettingsRepository(appPreferencesStore = appPreferencesStore)
}
@Provides @Provides
@Singleton @Singleton
fun providePushPermissionRepository(appPreferencesStore: AppPreferencesStore): PermissionRepository { fun providePushPermissionRepository(appPreferencesStore: AppPreferencesStore): PermissionRepository {

1
domain/promo/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,12 @@
plugins {
alias(deps.plugins.kotlin.jvm)
id("configuration")
}
dependencies {
implementation(projects.domain.promo.models)
implementation(projects.domain.wallets.models)
implementation(deps.kotlin.coroutines)
implementation(deps.arrow.core)
}

1
domain/promo/models/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,9 @@
plugins {
alias(deps.plugins.kotlin.jvm)
alias(deps.plugins.kotlin.serialization)
id("configuration")
}
dependencies {
implementation(deps.jodatime)
}

View file

@ -1,4 +1,4 @@
package com.tangem.domain.promo package com.tangem.domain.promo.models
import org.joda.time.DateTime import org.joda.time.DateTime

View file

@ -1,9 +1,17 @@
package com.tangem.domain.settings.repositories package com.tangem.domain.promo
import com.tangem.domain.promo.models.PromoBanner
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface PromoSettingsRepository { interface PromoRepository {
suspend fun getChangellyPromoBanner(): PromoBanner?
suspend fun getOkxPromoBanner(): PromoBanner?
suspend fun getRingPromoBanner(): PromoBanner?
fun isReadyToShowWalletSwapPromo(): Flow<Boolean> fun isReadyToShowWalletSwapPromo(): Flow<Boolean>
fun isReadyToShowTokenSwapPromo(): Flow<Boolean> fun isReadyToShowTokenSwapPromo(): Flow<Boolean>

View file

@ -1,10 +1,9 @@
package com.tangem.domain.settings package com.tangem.domain.promo
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
class ShouldShowRingPromoUseCase(private val promoSettingsRepository: PromoSettingsRepository) { class ShouldShowRingPromoUseCase(private val promoSettingsRepository: PromoRepository) {
operator fun invoke(userWalletId: UserWalletId): Flow<Boolean> { operator fun invoke(userWalletId: UserWalletId): Flow<Boolean> {
return promoSettingsRepository.isReadyToShowRingPromo(userWalletId) return promoSettingsRepository.isReadyToShowRingPromo(userWalletId)

View file

@ -1,9 +1,8 @@
package com.tangem.domain.settings package com.tangem.domain.promo
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
class ShouldShowSwapPromoTokenUseCase(private val promoSettingsRepository: PromoSettingsRepository) { class ShouldShowSwapPromoTokenUseCase(private val promoSettingsRepository: PromoRepository) {
operator fun invoke(): Flow<Boolean> = promoSettingsRepository.isReadyToShowTokenSwapPromo() operator fun invoke(): Flow<Boolean> = promoSettingsRepository.isReadyToShowTokenSwapPromo()

View file

@ -1,9 +1,8 @@
package com.tangem.domain.settings package com.tangem.domain.promo
import com.tangem.domain.settings.repositories.PromoSettingsRepository
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
class ShouldShowSwapPromoWalletUseCase(private val promoSettingsRepository: PromoSettingsRepository) { class ShouldShowSwapPromoWalletUseCase(private val promoSettingsRepository: PromoRepository) {
operator fun invoke(): Flow<Boolean> = promoSettingsRepository.isReadyToShowWalletSwapPromo() operator fun invoke(): Flow<Boolean> = promoSettingsRepository.isReadyToShowWalletSwapPromo()

View file

@ -1,37 +1,30 @@
package com.tangem.domain.tokens package com.tangem.domain.tokens
import com.tangem.domain.exchange.RampStateManager
import com.tangem.domain.settings.ShouldShowSwapPromoTokenUseCase
import com.tangem.domain.staking.repositories.StakingRepository import com.tangem.domain.staking.repositories.StakingRepository
import com.tangem.domain.tokens.model.* import com.tangem.domain.tokens.model.*
import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning
import com.tangem.domain.tokens.model.warnings.HederaWarnings import com.tangem.domain.tokens.model.warnings.HederaWarnings
import com.tangem.domain.tokens.model.warnings.KaspaWarnings import com.tangem.domain.tokens.model.warnings.KaspaWarnings
import com.tangem.domain.tokens.operations.CurrenciesStatusesOperations import com.tangem.domain.tokens.operations.CurrenciesStatusesOperations
import com.tangem.domain.tokens.repository.* import com.tangem.domain.tokens.repository.CurrenciesRepository
import com.tangem.domain.tokens.repository.CurrencyChecksRepository
import com.tangem.domain.tokens.repository.NetworksRepository
import com.tangem.domain.tokens.repository.QuotesRepository
import com.tangem.domain.transaction.models.AssetRequirementsCondition import com.tangem.domain.transaction.models.AssetRequirementsCondition
import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.swap.domain.api.SwapRepository
import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo
import com.tangem.lib.crypto.BlockchainUtils import com.tangem.lib.crypto.BlockchainUtils
import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching
import com.tangem.utils.isNullOrZero
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import java.math.BigDecimal import java.math.BigDecimal
@Suppress("LongParameterList", "LargeClass") @Suppress("LongParameterList")
class GetCurrencyWarningsUseCase( class GetCurrencyWarningsUseCase(
private val walletManagersFacade: WalletManagersFacade, private val walletManagersFacade: WalletManagersFacade,
private val currenciesRepository: CurrenciesRepository, private val currenciesRepository: CurrenciesRepository,
private val quotesRepository: QuotesRepository, private val quotesRepository: QuotesRepository,
private val networksRepository: NetworksRepository, private val networksRepository: NetworksRepository,
private val swapRepository: SwapRepository,
private val rampStateManager: RampStateManager,
private val stakingRepository: StakingRepository, private val stakingRepository: StakingRepository,
private val promoRepository: PromoRepository,
private val showSwapPromoTokenUseCase: ShouldShowSwapPromoTokenUseCase,
private val dispatchers: CoroutineDispatcherProvider, private val dispatchers: CoroutineDispatcherProvider,
private val currencyChecksRepository: CurrencyChecksRepository, private val currencyChecksRepository: CurrencyChecksRepository,
) { ) {
@ -78,75 +71,6 @@ class GetCurrencyWarningsUseCase(
}.flowOn(dispatchers.io) }.flowOn(dispatchers.io)
} }
// disabled for now, don't use it directly in combine() to avoid blocking other notifications
@Suppress("UnusedPrivateMember")
private suspend fun getSwapPromoNotificationWarning(
operations: CurrenciesStatusesOperations,
userWalletId: UserWalletId,
currencyStatus: CryptoCurrencyStatus,
): Flow<CryptoCurrencyWarning?> {
val currency = currencyStatus.currency
val cryptoStatuses = operations.getCurrenciesStatusesSync()
val promoBanner = promoRepository.getOkxPromoBanner()
return combine(
flow = showSwapPromoTokenUseCase()
.conflate()
.distinctUntilChanged(),
flow2 = flowOf(rampStateManager.availableForSwap(userWalletId, currency))
.conflate()
.distinctUntilChanged(),
) { shouldShowSwapPromo, isExchangeable ->
promoBanner ?: return@combine null
val showPromoBanner = promoBanner.isActive && shouldShowSwapPromo
if (showPromoBanner && isExchangeable && currencyStatus.value !is CryptoCurrencyStatus.Unreachable) {
cryptoStatuses.fold(
ifLeft = { null },
ifRight = { cryptoCurrencyStatuses ->
val pairs = runCatching(dispatchers.io) {
swapRepository.getPairsOnly(
LeastTokenInfo(
contractAddress = (currency as? CryptoCurrency.Token)?.contractAddress ?: "0",
network = currency.network.backendId,
),
cryptoCurrencyStatuses.map { it.currency },
)
}.getOrNull()?.pairs ?: emptyList()
val filteredCurrencies = cryptoCurrencyStatuses.filterNot {
it.currency.id == currency.id
}
val currencyPairs = pairs.filter {
it.from.network == currency.network.backendId ||
it.to.network == currency.network.backendId
}
val showPromo = currencyPairs.any { pair ->
val availablePair = if (currencyStatus.value.amount.isNullOrZero()) {
filteredCurrencies.filterNot { it.value.amount.isNullOrZero() }
} else {
filteredCurrencies
}
availablePair
.any {
it.currency.network.backendId == pair.to.network ||
it.currency.network.backendId == pair.from.network
}
}
if (showPromo) {
CryptoCurrencyWarning.SwapPromo(
startDateTime = promoBanner.bannerState.timeline.start,
endDateTime = promoBanner.bannerState.timeline.end,
)
} else {
null
}
},
)
} else {
null
}
}
}
@Suppress("LongParameterList") @Suppress("LongParameterList")
private suspend fun getCoinRelatedWarnings( private suspend fun getCoinRelatedWarnings(
userWalletId: UserWalletId, userWalletId: UserWalletId,

View file

@ -1,12 +0,0 @@
package com.tangem.domain.tokens.repository
import com.tangem.domain.promo.PromoBanner
interface PromoRepository {
suspend fun getChangellyPromoBanner(): PromoBanner?
suspend fun getOkxPromoBanner(): PromoBanner?
suspend fun getRingPromoBanner(): PromoBanner?
}

View file

@ -84,6 +84,7 @@ dependencies {
implementation(projects.domain.markets.models) implementation(projects.domain.markets.models)
implementation(projects.domain.onramp) implementation(projects.domain.onramp)
implementation(projects.domain.onramp.models) implementation(projects.domain.onramp.models)
implementation(projects.domain.promo)
/** Temp dependency to swap domain */ /** Temp dependency to swap domain */
implementation(projects.features.swap.domain) implementation(projects.features.swap.domain)

View file

@ -32,7 +32,7 @@ import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.onramp.model.OnrampSource import com.tangem.domain.onramp.model.OnrampSource
import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.settings.ShouldShowSwapPromoTokenUseCase import com.tangem.domain.promo.ShouldShowSwapPromoTokenUseCase
import com.tangem.domain.staking.GetStakingAvailabilityUseCase import com.tangem.domain.staking.GetStakingAvailabilityUseCase
import com.tangem.domain.staking.GetStakingEntryInfoUseCase import com.tangem.domain.staking.GetStakingEntryInfoUseCase
import com.tangem.domain.staking.GetStakingIntegrationIdUseCase import com.tangem.domain.staking.GetStakingIntegrationIdUseCase

View file

@ -84,6 +84,8 @@ dependencies {
implementation(projects.domain.feedback) implementation(projects.domain.feedback)
implementation(projects.domain.onramp.models) implementation(projects.domain.onramp.models)
implementation(projects.domain.onramp) implementation(projects.domain.onramp)
implementation(projects.domain.promo)
implementation(projects.domain.promo.models)
//TODO: Create api/impl modules for onboarding [REDACTED_JIRA] //TODO: Create api/impl modules for onboarding [REDACTED_JIRA]
implementation(projects.features.onboarding) implementation(projects.features.onboarding)

View file

@ -4,14 +4,14 @@ import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.core.lce.Lce import com.tangem.domain.core.lce.Lce
import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.promo.PromoBanner import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.ShouldShowRingPromoUseCase
import com.tangem.domain.promo.models.PromoBanner
import com.tangem.domain.settings.IsReadyToShowRateAppUseCase import com.tangem.domain.settings.IsReadyToShowRateAppUseCase
import com.tangem.domain.settings.ShouldShowRingPromoUseCase
import com.tangem.domain.tokens.error.TokenListError import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.TokenList import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.tokens.repository.PromoRepository
import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification

View file

@ -9,9 +9,12 @@ import com.tangem.domain.card.SetCardWasScannedUseCase
import com.tangem.domain.feedback.GetCardInfoUseCase import com.tangem.domain.feedback.GetCardInfoUseCase
import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase
import com.tangem.domain.feedback.models.FeedbackEmailType import com.tangem.domain.feedback.models.FeedbackEmailType
import com.tangem.domain.promo.ShouldShowRingPromoUseCase
import com.tangem.domain.promo.ShouldShowSwapPromoWalletUseCase
import com.tangem.domain.redux.LegacyAction import com.tangem.domain.redux.LegacyAction
import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.settings.* import com.tangem.domain.settings.NeverToSuggestRateAppUseCase
import com.tangem.domain.settings.RemindToRateAppLaterUseCase
import com.tangem.domain.tokens.FetchTokenListUseCase import com.tangem.domain.tokens.FetchTokenListUseCase
import com.tangem.domain.tokens.FetchTokenListUseCase.RefreshMode import com.tangem.domain.tokens.FetchTokenListUseCase.RefreshMode
import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrency

View file

@ -245,6 +245,7 @@ include(":domain:manage-tokens")
include(":domain:manage-tokens:models") include(":domain:manage-tokens:models")
include(":domain:onramp") include(":domain:onramp")
include(":domain:onramp:models") include(":domain:onramp:models")
include(":domain:promo")
// endregion Domain modules // endregion Domain modules
// region Data modules // region Data modules
@ -269,4 +270,5 @@ include(":data:wallet-connect")
include(":data:markets") include(":data:markets")
include(":data:manage-tokens") include(":data:manage-tokens")
include(":data:onramp") include(":data:onramp")
// endregion Data modules // endregion Data modules
include(":domain:promo:models")