diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt index 1619c322de..0c38cd669b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/AppPreferencesStore.kt @@ -32,6 +32,11 @@ class AppPreferencesStore( return edit { transform(it) } } + /** Get data [T] by [key]. If data is not found, it returns [default] */ + inline fun MutablePreferences.getOrDefault(key: Preferences.Key, default: T): T { + return this[key] ?: default + } + /** * Get nullable data [T] by string [key] from [MutablePreferences] * 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 26d5b3cf08..ffa0aeee60 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 @@ -45,7 +45,7 @@ object PreferencesKeys { val IS_WALLET_SWAP_PROMO_SHOW_KEY by lazy { booleanPreferencesKey(name = "isWalletSwapPromoShown") } - val IS_TOKEN_SWAP_PROMO_SHOW_KEY by lazy { booleanPreferencesKey(name = "isTokenSwapPromoShown") } + val IS_TOKEN_SWAP_PROMO_SHOW_KEY by lazy { stringSetPreferencesKey(name = "isTokenSwapPromoShown") } } /** Preferences keys set that should be migrated from "PreferencesDataSource" to a new DataStore */ diff --git a/data/settings/src/main/java/com/tangem/data/settings/DefaultSwapPromoRepository.kt b/data/settings/src/main/java/com/tangem/data/settings/DefaultSwapPromoRepository.kt index dd94a2e07c..cfdc97ba1c 100644 --- a/data/settings/src/main/java/com/tangem/data/settings/DefaultSwapPromoRepository.kt +++ b/data/settings/src/main/java/com/tangem/data/settings/DefaultSwapPromoRepository.kt @@ -21,9 +21,9 @@ class DefaultSwapPromoRepository( .map { it && checkPromoPeriod() } } - override fun isReadyToShowToken(): Flow { - return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_SHOW_KEY, true) - .map { it && checkPromoPeriod() } + override fun isReadyToShowToken(userWalletId: String, currencyId: String): Flow { + return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_SHOW_KEY, emptySet()) + .map { !it.contains(userWalletId + currencyId) && checkPromoPeriod() } } override suspend fun setNeverToShowWallet() { @@ -33,11 +33,14 @@ class DefaultSwapPromoRepository( ) } - override suspend fun setNeverToShowToken() { - appPreferencesStore.store( - key = IS_TOKEN_SWAP_PROMO_SHOW_KEY, - value = false, - ) + override suspend fun setNeverToShowToken(userWalletId: String, currencyId: String) { + appPreferencesStore.editData { mutablePreferences -> + val storesCurrencies = mutablePreferences.getOrDefault(IS_TOKEN_SWAP_PROMO_SHOW_KEY, emptySet()) + mutablePreferences.set( + key = IS_TOKEN_SWAP_PROMO_SHOW_KEY, + value = storesCurrencies.toMutableSet().apply { add(userWalletId + currencyId) }, + ) + } } private fun checkPromoPeriod(): Boolean { diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/ShouldShowSwapPromoTokenUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/ShouldShowSwapPromoTokenUseCase.kt index 0c75a4f52a..6d7b0b30f9 100644 --- a/domain/settings/src/main/java/com/tangem/domain/settings/ShouldShowSwapPromoTokenUseCase.kt +++ b/domain/settings/src/main/java/com/tangem/domain/settings/ShouldShowSwapPromoTokenUseCase.kt @@ -5,7 +5,9 @@ import kotlinx.coroutines.flow.Flow class ShouldShowSwapPromoTokenUseCase(private val swapPromoRepository: SwapPromoRepository) { - operator fun invoke(): Flow = swapPromoRepository.isReadyToShowToken() + operator fun invoke(userWalletId: String, currencyId: String): Flow = + swapPromoRepository.isReadyToShowToken(userWalletId, currencyId) - suspend fun neverToShow() = swapPromoRepository.setNeverToShowToken() + suspend fun neverToShow(userWalletId: String, currencyId: String) = + swapPromoRepository.setNeverToShowToken(userWalletId, currencyId) } \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SwapPromoRepository.kt b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SwapPromoRepository.kt index 95d31f65d8..96d180f4df 100644 --- a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SwapPromoRepository.kt +++ b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SwapPromoRepository.kt @@ -5,9 +5,9 @@ import kotlinx.coroutines.flow.Flow interface SwapPromoRepository { fun isReadyToShowWallet(): Flow - fun isReadyToShowToken(): Flow + fun isReadyToShowToken(userWalletId: String, currencyId: String): Flow suspend fun setNeverToShowWallet() - suspend fun setNeverToShowToken() + suspend fun setNeverToShowToken(userWalletId: String, currencyId: String) } \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 3090438e08..849e3933a5 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -57,7 +57,7 @@ class GetCurrencyWarningsUseCase( operations.getCurrenciesStatusesFlow().conflate(), flowOf(walletManagersFacade.getRentInfo(userWalletId, currency.network)), flowOf(walletManagersFacade.getExistentialDeposit(userWalletId, currency.network)), - showSwapPromoTokenUseCase().conflate(), + showSwapPromoTokenUseCase(userWalletId.stringValue, currency.id.value).conflate(), ) { coinRelatedWarnings, cryptoStatuses, maybeRentWarning, maybeEdWarning, shouldShowSwapPromo -> setOfNotNull( getSwapPromoNotificationWarning( @@ -116,11 +116,8 @@ class GetCurrencyWarningsUseCase( } availablePair .any { - ( - it.currency.network.backendId == pair.to.network || - it.currency.network.backendId == pair.from.network - ) && - !it.value.amount.isNullOrZero() + it.currency.network.backendId == pair.to.network || + it.currency.network.backendId == pair.from.network } } if (isExchangeable) { diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 100aabe066..ef5cb340ad 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -560,14 +560,17 @@ internal class TokenDetailsViewModel @Inject constructor( override fun onSwapPromoDismiss() { viewModelScope.launch(dispatchers.main) { - shouldShowSwapPromoTokenUseCase.neverToShow() + shouldShowSwapPromoTokenUseCase.neverToShow(userWalletId.stringValue, cryptoCurrency.id.value) analyticsEventsHandler.send(TokenSwapPromoAnalyticsEvent.Close) } } override fun onSwapPromoClick() { + viewModelScope.launch(dispatchers.main) { + shouldShowSwapPromoTokenUseCase.neverToShow(userWalletId.stringValue, cryptoCurrency.id.value) + analyticsEventsHandler.send(TokenSwapPromoAnalyticsEvent.Exchange(cryptoCurrency.symbol)) + } onSwapClick() - analyticsEventsHandler.send(TokenSwapPromoAnalyticsEvent.Exchange(cryptoCurrency.symbol)) } private companion object {