From 2d670ed6c492ca5389ae77e5168c74db30a7522a Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 19 Sep 2024 13:30:45 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/SettingsDomainModule.kt | 14 ++++++ .../api/tangemTech/models/GeoResponse.kt | 2 + data/settings/build.gradle.kts | 1 + .../settings/DefaultSettingsRepository.kt | 48 +++++++++++++++++++ .../data/settings/di/SettingsDataModule.kt | 11 ++++- .../repositories/SettingsRepository.kt | 6 +++ .../usercountry/FetchUserCountryUseCase.kt | 28 +++++++++++ .../usercountry/GetUserCountryUseCase.kt | 34 +++++++++++++ .../usercountry/models/UserCountry.kt | 13 +++++ .../usercountry/models/UserCountryError.kt | 15 ++++++ 10 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 domain/settings/src/main/java/com/tangem/domain/settings/usercountry/FetchUserCountryUseCase.kt create mode 100644 domain/settings/src/main/java/com/tangem/domain/settings/usercountry/GetUserCountryUseCase.kt create mode 100644 domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountry.kt create mode 100644 domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountryError.kt diff --git a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt index 1b5860c2c0..e175d51e25 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt @@ -10,6 +10,8 @@ import com.tangem.domain.settings.repositories.AppRatingRepository 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.usercountry.FetchUserCountryUseCase +import com.tangem.domain.settings.usercountry.GetUserCountryUseCase import com.tangem.tap.domain.sdk.TangemSdkManager import com.tangem.tap.domain.settings.DefaultLegacySettingsRepository import dagger.Module @@ -212,4 +214,16 @@ internal object SettingsDomainModule { return ShouldSaveAccessCodesUseCase(settingsRepository = settingsRepository) } // endregion + + @Provides + @Singleton + fun provideFetchUserCountryCodeUseCase(settingsRepository: SettingsRepository): FetchUserCountryUseCase { + return FetchUserCountryUseCase(settingsRepository) + } + + @Provides + @Singleton + fun provideGetUserCountryCodeUseCase(settingsRepository: SettingsRepository): GetUserCountryUseCase { + return GetUserCountryUseCase(settingsRepository) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/GeoResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/GeoResponse.kt index e6cdfa4b12..f444437037 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/GeoResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/GeoResponse.kt @@ -1,7 +1,9 @@ package com.tangem.datasource.api.tangemTech.models import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +@JsonClass(generateAdapter = true) data class GeoResponse( @Json(name = "code") val code: String, ) \ No newline at end of file diff --git a/data/settings/build.gradle.kts b/data/settings/build.gradle.kts index 96f4640242..6856b1236f 100644 --- a/data/settings/build.gradle.kts +++ b/data/settings/build.gradle.kts @@ -30,5 +30,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) + implementation(deps.timber) // endregion } diff --git a/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt b/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt index d9122fb1b3..6ea8cb2b4d 100644 --- a/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt +++ b/data/settings/src/main/java/com/tangem/data/settings/DefaultSettingsRepository.kt @@ -1,17 +1,31 @@ package com.tangem.data.settings +import com.tangem.datasource.api.tangemTech.TangemTechApi +import com.tangem.datasource.api.tangemTech.models.GeoResponse import com.tangem.datasource.local.logs.AppLogsStore import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.preferences.utils.store import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.domain.settings.usercountry.models.UserCountry +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import timber.log.Timber +import java.util.Locale internal class DefaultSettingsRepository( private val appPreferencesStore: AppPreferencesStore, private val appLogsStore: AppLogsStore, + private val tangemTechApi: TangemTechApi, + private val dispatchers: CoroutineDispatcherProvider, ) : SettingsRepository { + private val userCountryFlow = MutableStateFlow(value = null) + override suspend fun shouldShowSaveUserWalletScreen(): Boolean { return appPreferencesStore.getSyncOrDefault( key = PreferencesKeys.SHOULD_SHOW_SAVE_USER_WALLET_SCREEN_KEY, @@ -99,4 +113,38 @@ internal class DefaultSettingsRepository( override suspend fun setMarketsTooltipShown(value: Boolean) { appPreferencesStore.store(key = PreferencesKeys.SHOULD_SHOW_MARKETS_TOOLTIP_KEY, value = !value) } + + override suspend fun getUserCountryCodeSync(): UserCountry? { + // If user country code is already set, return it + val countryCode = userCountryFlow.value + if (countryCode != null) return countryCode + + coroutineScope { + launch { fetchUserCountryCode() } + } + + return null + } + + override suspend fun fetchUserCountryCode() { + Timber.i("Start fetching user country code") + + withContext(dispatchers.io) { + val country = runCatching { tangemTechApi.getUserCountryCode() } + .fold( + onSuccess = GeoResponse::code, + onFailure = { Locale.getDefault().country }, + ) + .lowercase() + + val code = when (country) { + UserCountry.Russia.code -> UserCountry.Russia + else -> UserCountry.Other(code = country) + } + + Timber.i("User code country is $code") + + userCountryFlow.value = code + } + } } \ No newline at end of file diff --git a/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt b/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt index bddc8ef6e1..0ea5bce762 100644 --- a/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt +++ b/data/settings/src/main/java/com/tangem/data/settings/di/SettingsDataModule.kt @@ -4,12 +4,14 @@ import com.tangem.data.settings.DefaultAppRatingRepository import com.tangem.data.settings.DefaultPermissionRepository import com.tangem.data.settings.DefaultPromoSettingsRepository import com.tangem.data.settings.DefaultSettingsRepository +import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.local.logs.AppLogsStore import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.domain.settings.repositories.AppRatingRepository import com.tangem.domain.settings.repositories.PermissionRepository import com.tangem.domain.settings.repositories.PromoSettingsRepository import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -25,8 +27,15 @@ internal object SettingsDataModule { fun provideSettingsRepository( appPreferencesStore: AppPreferencesStore, appLogsStore: AppLogsStore, + tangemTechApi: TangemTechApi, + dispatchers: CoroutineDispatcherProvider, ): SettingsRepository { - return DefaultSettingsRepository(appPreferencesStore = appPreferencesStore, appLogsStore = appLogsStore) + return DefaultSettingsRepository( + appPreferencesStore = appPreferencesStore, + appLogsStore = appLogsStore, + tangemTechApi = tangemTechApi, + dispatchers = dispatchers, + ) } @Provides diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt index 6067b99a64..b342dcd2ef 100644 --- a/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt +++ b/domain/settings/src/main/java/com/tangem/domain/settings/repositories/SettingsRepository.kt @@ -1,5 +1,7 @@ package com.tangem.domain.settings.repositories +import com.tangem.domain.settings.usercountry.models.UserCountry + interface SettingsRepository { suspend fun shouldShowSaveUserWalletScreen(): Boolean @@ -33,4 +35,8 @@ interface SettingsRepository { suspend fun shouldShowMarketsTooltip(): Boolean suspend fun setMarketsTooltipShown(value: Boolean) + + suspend fun getUserCountryCodeSync(): UserCountry? + + suspend fun fetchUserCountryCode() } \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/FetchUserCountryUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/FetchUserCountryUseCase.kt new file mode 100644 index 0000000000..5eab20c011 --- /dev/null +++ b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/FetchUserCountryUseCase.kt @@ -0,0 +1,28 @@ +package com.tangem.domain.settings.usercountry + +import arrow.core.Either +import arrow.core.raise.catch +import arrow.core.raise.either +import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.domain.settings.usercountry.models.UserCountryError + +/** + * Fetch user country use case + * + * @property settingsRepository settings repository + * +[REDACTED_AUTHOR] + */ +class FetchUserCountryUseCase( + private val settingsRepository: SettingsRepository, +) { + + suspend operator fun invoke(): Either { + return either { + catch( + block = { settingsRepository.fetchUserCountryCode() }, + catch = { raise(UserCountryError.DataError) }, + ) + } + } +} \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/GetUserCountryUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/GetUserCountryUseCase.kt new file mode 100644 index 0000000000..01768f5a6c --- /dev/null +++ b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/GetUserCountryUseCase.kt @@ -0,0 +1,34 @@ +package com.tangem.domain.settings.usercountry + +import arrow.core.Either +import arrow.core.raise.catch +import arrow.core.raise.either +import arrow.core.raise.ensureNotNull +import com.tangem.domain.settings.repositories.SettingsRepository +import com.tangem.domain.settings.usercountry.models.UserCountry +import com.tangem.domain.settings.usercountry.models.UserCountryError + +/** + * Get user country code use case + * + * @property settingsRepository settings repository + * +[REDACTED_AUTHOR] + */ +class GetUserCountryUseCase( + private val settingsRepository: SettingsRepository, +) { + + suspend operator fun invoke(): Either { + return either { + val userCountryCode = catch( + block = { settingsRepository.getUserCountryCodeSync() }, + catch = { raise(UserCountryError.DataError) }, + ) + + ensureNotNull(userCountryCode) { UserCountryError.NotSetup } + + userCountryCode + } + } +} \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountry.kt b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountry.kt new file mode 100644 index 0000000000..e212b96917 --- /dev/null +++ b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountry.kt @@ -0,0 +1,13 @@ +package com.tangem.domain.settings.usercountry.models + +/** + * User country + * +[REDACTED_AUTHOR] + */ +sealed class UserCountry(open val code: String) { + + data object Russia : UserCountry("ru") + + data class Other(override val code: String) : UserCountry(code) +} \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountryError.kt b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountryError.kt new file mode 100644 index 0000000000..8d6e483a09 --- /dev/null +++ b/domain/settings/src/main/java/com/tangem/domain/settings/usercountry/models/UserCountryError.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.settings.usercountry.models + +/** + * User country error + * +[REDACTED_AUTHOR] + */ +sealed interface UserCountryError { + + /** User country is still loading */ + data object NotSetup : UserCountryError + + /** Data error */ + data object DataError : UserCountryError +} \ No newline at end of file