diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt index 9f7c34b90f..820f5b3d3f 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt @@ -39,6 +39,7 @@ import com.tangem.tap.features.walletSelector.redux.WalletSelectorMiddleware import com.tangem.tap.features.walletSelector.redux.WalletSelectorState import com.tangem.tap.features.welcome.redux.WelcomeMiddleware import com.tangem.tap.features.welcome.redux.WelcomeState +import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider import org.rekotlin.Middleware import org.rekotlin.StateType @@ -68,6 +69,12 @@ data class AppState( val domainNetworks: NetworkServices get() = domainState.globalState.networkServices + val featureRepositoryProvider: FeatureRepositoryProvider + get() = FeatureRepositoryProvider( + tangemTechApi = domainNetworks.tangemTechService.api, + dispatchers = AppCoroutineDispatcherProvider(), + ) + companion object { fun getMiddleware(): List> { return listOf( diff --git a/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryStore.kt b/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryStore.kt new file mode 100644 index 0000000000..5794edffb9 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryStore.kt @@ -0,0 +1,15 @@ +package com.tangem.tap.common.redux + +import com.tangem.datasource.api.tangemTech.TangemTechApi +import com.tangem.tap.features.home.data.HomeRepositoryImpl +import com.tangem.tap.features.home.domain.HomeRepository +import com.tangem.tap.features.wallet.data.WalletRepositoryImpl +import com.tangem.tap.features.wallet.domain.WalletRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider + +class FeatureRepositoryProvider(tangemTechApi: TangemTechApi, dispatchers: CoroutineDispatcherProvider) { + + val walletRepository: WalletRepository = WalletRepositoryImpl(tangemTechApi, dispatchers) + + val homeRepository: HomeRepository = HomeRepositoryImpl(tangemTechApi, dispatchers) +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index dfcdf942bf..46ea27926e 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -4,7 +4,6 @@ import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.guard import com.tangem.common.extensions.ifNotNull -import com.tangem.common.services.Result import com.tangem.domain.common.LogConfig import com.tangem.domain.common.extensions.withMainContext import com.tangem.tap.common.extensions.dispatchDebugErrorNotification @@ -187,23 +186,20 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di } is GlobalAction.FetchUserCountry -> { scope.launch { - val techService = store.state.domainNetworks.tangemTechService - when (val result = techService.userCountry()) { - is Result.Success -> { + // TODO("After adding DI") get dependencies by DI + runCatching { store.state.featureRepositoryProvider.homeRepository.getUserCountryCode() } + .onSuccess { store.dispatchOnMain( - GlobalAction.FetchUserCountry.Success( - countryCode = result.data.code.lowercase(), - ), + GlobalAction.FetchUserCountry.Success(countryCode = it.code.lowercase()), ) } - is Result.Failure -> { + .onFailure { store.dispatchOnMain( GlobalAction.FetchUserCountry.Success( countryCode = Locale.getDefault().country.lowercase(), ), ) } - } } } } diff --git a/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt new file mode 100644 index 0000000000..fed3f2e394 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt @@ -0,0 +1,23 @@ +package com.tangem.tap.features.home.data + +import com.tangem.datasource.api.tangemTech.TangemTechApi +import com.tangem.datasource.api.tangemTech.models.GeoResponse +import com.tangem.tap.features.home.domain.HomeRepository +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext + +/** + * Implementation of repository for Home feature + * + * @property tangemTechApi API for server requests + * @property dispatchers coroutine dispatcher provider + */ +class HomeRepositoryImpl( + private val tangemTechApi: TangemTechApi, + private val dispatchers: CoroutineDispatcherProvider, +) : HomeRepository { + + override suspend fun getUserCountryCode(): GeoResponse = withContext(dispatchers.io) { + tangemTechApi.getUserCountryCode() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt b/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt new file mode 100644 index 0000000000..ad489ae0fe --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt @@ -0,0 +1,10 @@ +package com.tangem.tap.features.home.domain + +import com.tangem.datasource.api.tangemTech.models.GeoResponse + +/** Repository for Home feature */ +interface HomeRepository { + + /** Get user's country code */ + suspend fun getUserCountryCode(): GeoResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/data/WalletRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/features/wallet/data/WalletRepositoryImpl.kt index a8d6086302..e610e03389 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/data/WalletRepositoryImpl.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/data/WalletRepositoryImpl.kt @@ -3,18 +3,21 @@ package com.tangem.tap.features.wallet.data import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse import com.tangem.tap.features.wallet.domain.WalletRepository -import kotlinx.coroutines.Dispatchers +import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext /** * Implementation of repository for Wallet feature * * @property tangemTechApi API for server requests + * @property dispatchers coroutine dispatcher provider */ -class WalletRepositoryImpl(private val tangemTechApi: TangemTechApi) : WalletRepository { +class WalletRepositoryImpl( + private val tangemTechApi: TangemTechApi, + private val dispatchers: CoroutineDispatcherProvider, +) : WalletRepository { - override suspend fun getCurrencyList(): CurrenciesResponse = - withContext(Dispatchers.IO) { // TODO("After adding DI") replace with CoroutineDispatcherProvider - tangemTechApi.getCurrencyList() - } + override suspend fun getCurrencyList(): CurrenciesResponse = withContext(dispatchers.io) { + tangemTechApi.getCurrencyList() + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 656faa2527..222f7b7fa1 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -36,7 +36,6 @@ import com.tangem.tap.domain.model.WalletStoreModel import com.tangem.tap.features.demo.DemoHelper import com.tangem.tap.features.home.redux.HomeAction import com.tangem.tap.features.send.redux.PrepareSendScreen -import com.tangem.tap.features.wallet.data.WalletRepositoryImpl import com.tangem.tap.features.wallet.models.Currency import com.tangem.tap.features.wallet.models.PendingTransactionType import com.tangem.tap.features.wallet.models.filterByCoin @@ -74,7 +73,7 @@ class WalletMiddleware { private val appCurrencyMiddleware by lazy(mode = LazyThreadSafetyMode.NONE) { AppCurrencyMiddleware( // TODO("After adding DI") get dependencies by DI - walletRepository = WalletRepositoryImpl(store.state.domainNetworks.tangemTechService.api), + walletRepository = store.state.featureRepositoryProvider.walletRepository, tapWalletManager = store.state.globalState.tapWalletManager, fiatCurrenciesPrefStorage = preferencesStorage.fiatCurrenciesPrefStorage, appCurrencyProvider = { store.state.globalState.appCurrency }, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/Responses.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/Responses.kt index 865685b00a..adcccdac54 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/Responses.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/Responses.kt @@ -34,10 +34,6 @@ data class CoinsResponse( //rates.keys = networkId's data class RatesResponse(val rates: Map) : TangemTechResponse -data class GeoResponse( - val code: String, -) : TangemTechResponse - data class UserTokensResponse( val version: Int = 0, val group: String? = null, 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 d913dc7353..8a46ed2092 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,6 +1,7 @@ package com.tangem.datasource.api.tangemTech import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse +import com.tangem.datasource.api.tangemTech.models.GeoResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.PUT @@ -33,7 +34,7 @@ interface TangemTechApi { suspend fun getCurrencyList(): CurrenciesResponse @GET("geo") - suspend fun geo(): GeoResponse + suspend fun getUserCountryCode(): GeoResponse @GET("user-tokens/{user-id}") suspend fun getUserTokens(@Path(value = "user-id") userId: String): UserTokensResponse diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt index e609c1dafc..3827446aec 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt @@ -50,10 +50,6 @@ class TangemTechService( } } - suspend fun userCountry(): Result = withContext(Dispatchers.IO) { - performRequest { api.geo() } - } - suspend fun getUserTokens(userId: String): Result = withContext(Dispatchers.IO) { performRequest { api.getUserTokens(userId) } } 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 new file mode 100644 index 0000000000..e6cdfa4b12 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/GeoResponse.kt @@ -0,0 +1,7 @@ +package com.tangem.datasource.api.tangemTech.models + +import com.squareup.moshi.Json + +data class GeoResponse( + @Json(name = "code") val code: String, +) \ No newline at end of file