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 new file mode 100644 index 0000000000..a8d6086302 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/data/WalletRepositoryImpl.kt @@ -0,0 +1,20 @@ +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 kotlinx.coroutines.withContext + +/** + * Implementation of repository for Wallet feature + * + * @property tangemTechApi API for server requests + */ +class WalletRepositoryImpl(private val tangemTechApi: TangemTechApi) : WalletRepository { + + override suspend fun getCurrencyList(): CurrenciesResponse = + withContext(Dispatchers.IO) { // TODO("After adding DI") replace with CoroutineDispatcherProvider + tangemTechApi.getCurrencyList() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/domain/WalletRepository.kt b/app/src/main/java/com/tangem/tap/features/wallet/domain/WalletRepository.kt new file mode 100644 index 0000000000..c3ba927d31 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/wallet/domain/WalletRepository.kt @@ -0,0 +1,10 @@ +package com.tangem.tap.features.wallet.domain + +import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse + +/** Repository for Wallet feature */ +interface WalletRepository { + + /** Get list of currency */ + suspend fun getCurrencyList(): CurrenciesResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt index c60632f60e..3b6375373a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/AppCurrencyMiddleware.kt @@ -1,8 +1,6 @@ package com.tangem.tap.features.wallet.redux.middlewares -import com.tangem.common.services.Result -import com.tangem.datasource.api.tangemTech.CurrenciesResponse -import com.tangem.datasource.api.tangemTech.TangemTechService +import com.tangem.datasource.api.tangemTech.models.Currency import com.tangem.tap.common.analytics.Analytics import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.MainScreen @@ -11,6 +9,7 @@ import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapWalletManager import com.tangem.tap.features.details.redux.DetailsAction +import com.tangem.tap.features.wallet.domain.WalletRepository import com.tangem.tap.features.wallet.redux.WalletAction import com.tangem.tap.features.wallet.redux.models.WalletDialog import com.tangem.tap.features.walletSelector.redux.WalletSelectorAction @@ -21,7 +20,7 @@ import com.tangem.tap.userWalletsListManager import kotlinx.coroutines.launch class AppCurrencyMiddleware( - private val tangemTechService: TangemTechService, + private val walletRepository: WalletRepository, private val tapWalletManager: TapWalletManager, private val fiatCurrenciesPrefStorage: FiatCurrenciesPrefStorage, private val appCurrencyProvider: () -> FiatCurrency, @@ -45,12 +44,10 @@ class AppCurrencyMiddleware( } scope.launch { - when (val result = tangemTechService.currencies()) { - is Result.Success -> { - val currenciesList = result.data.currencies - if (currenciesList.isNotEmpty() && - currenciesList.toSet() != storedFiatCurrencies.toSet() - ) { + runCatching { walletRepository.getCurrencyList() } + .onSuccess { + val currenciesList = it.currencies + if (currenciesList.isNotEmpty() && !currenciesList.toSet().equals(storedFiatCurrencies.toSet())) { fiatCurrenciesPrefStorage.save(currenciesList) store.dispatchDialogShow( WalletDialog.CurrencySelectionDialog( @@ -60,8 +57,6 @@ class AppCurrencyMiddleware( ) } } - is Result.Failure -> {} - } } } @@ -82,7 +77,7 @@ class AppCurrencyMiddleware( } } - private fun List.mapToUiModel(): List { + private fun List.mapToUiModel(): List { return this.map { FiatCurrency( code = it.code, 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 5dcd8b81bd..656faa2527 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,6 +36,7 @@ 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 @@ -72,7 +73,8 @@ class WalletMiddleware { private val walletDialogMiddleware = WalletDialogsMiddleware() private val appCurrencyMiddleware by lazy(mode = LazyThreadSafetyMode.NONE) { AppCurrencyMiddleware( - tangemTechService = store.state.domainNetworks.tangemTechService, + // TODO("After adding DI") get dependencies by DI + walletRepository = WalletRepositoryImpl(store.state.domainNetworks.tangemTechService.api), tapWalletManager = store.state.globalState.tapWalletManager, fiatCurrenciesPrefStorage = preferencesStorage.fiatCurrenciesPrefStorage, appCurrencyProvider = { store.state.globalState.appCurrency }, diff --git a/app/src/main/java/com/tangem/tap/persistence/FiatCurrenciesPrefStorage.kt b/app/src/main/java/com/tangem/tap/persistence/FiatCurrenciesPrefStorage.kt index 59c500f9a7..1a65320a5e 100644 --- a/app/src/main/java/com/tangem/tap/persistence/FiatCurrenciesPrefStorage.kt +++ b/app/src/main/java/com/tangem/tap/persistence/FiatCurrenciesPrefStorage.kt @@ -3,7 +3,7 @@ package com.tangem.tap.persistence import android.content.SharedPreferences import androidx.core.content.edit import com.tangem.common.json.MoshiJsonConverter -import com.tangem.datasource.api.tangemTech.CurrenciesResponse +import com.tangem.datasource.api.tangemTech.models.Currency import com.tangem.tap.common.entities.FiatCurrency /** @@ -32,14 +32,14 @@ class FiatCurrenciesPrefStorage( preferences.edit { putString(APP_CURRENCY_KEY, json) } } - fun save(currencies: List) { + fun save(currencies: List) { val json: String = converter.toJson(currencies) return preferences.edit().putString(FIAT_CURRENCIES_KEY, json).apply() } - fun restore(): List { + fun restore(): List { val json = preferences.getString(FIAT_CURRENCIES_KEY, "") - val type = converter.typedList(CurrenciesResponse.Currency::class.java) + val type = converter.typedList(Currency::class.java) if (json.isNullOrBlank()) return emptyList() return converter.fromJson(json, type) ?: emptyList() 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 532a5debfb..865685b00a 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,18 +34,6 @@ data class CoinsResponse( //rates.keys = networkId's data class RatesResponse(val rates: Map) : TangemTechResponse -data class CurrenciesResponse(val currencies: List) { - - data class Currency( - val id: String, - val code: String, // this is an uppercase id - val name: String, - val rateBTC: String, - val unit: String, // $, €, ₽ - val type: String, - ) : TangemTechResponse -} - data class GeoResponse( val code: String, ) : TangemTechResponse 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 edfab6f5e2..d913dc7353 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,5 +1,6 @@ package com.tangem.datasource.api.tangemTech +import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.PUT @@ -29,7 +30,7 @@ interface TangemTechApi { ): RatesResponse @GET("currencies") - suspend fun currencies(): CurrenciesResponse + suspend fun getCurrencyList(): CurrenciesResponse @GET("geo") suspend fun geo(): GeoResponse 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 50540a226e..e609c1dafc 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 @@ -19,7 +19,7 @@ class TangemTechService( CacheControlHttpInterceptor(cacheMaxAge), ) - private var api: TangemTechApi = createApi() + var api: TangemTechApi = createApi() suspend fun coins( contractAddress: String? = null, @@ -54,10 +54,6 @@ class TangemTechService( performRequest { api.geo() } } - suspend fun currencies(): Result = withContext(Dispatchers.IO) { - performRequest { api.currencies() } - } - 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/CurrenciesResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CurrenciesResponse.kt new file mode 100644 index 0000000000..608b133f1a --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CurrenciesResponse.kt @@ -0,0 +1,16 @@ +package com.tangem.datasource.api.tangemTech.models + +import com.squareup.moshi.Json + +data class CurrenciesResponse( + @Json(name = "currencies") val currencies: List +) + +data class Currency( + @Json(name = "id") val id: String, + @Json(name = "code") val code: String, // this is an uppercase id + @Json(name = "name") val name: String, + @Json(name = "rateBTC") val rateBTC: String, + @Json(name = "unit") val unit: String, // $, €, ₽ + @Json(name = "type") val type: String +) \ No newline at end of file