Updated on 2026-08-14
This commit is contained in:
parent
72a1365157
commit
f4ab3116fe
6 changed files with 27 additions and 39 deletions
|
|
@ -1,26 +0,0 @@
|
||||||
package com.tangem.datasource.local.appcurrency
|
|
||||||
|
|
||||||
import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import kotlinx.coroutines.flow.flowOf
|
|
||||||
|
|
||||||
// TODO: Will be implemented in [REDACTED_TASK_KEY] task
|
|
||||||
internal class MockSelectedAppCurrencyStore : SelectedAppCurrencyStore {
|
|
||||||
|
|
||||||
override fun get(): Flow<CurrenciesResponse.Currency> {
|
|
||||||
return flowOf(
|
|
||||||
CurrenciesResponse.Currency(
|
|
||||||
id = "usd",
|
|
||||||
code = "USD",
|
|
||||||
name = "US Dollar",
|
|
||||||
unit = "$",
|
|
||||||
type = "fiat",
|
|
||||||
rateBTC = "",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun store(item: CurrenciesResponse.Currency) {
|
|
||||||
/* no-op */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -8,4 +8,6 @@ interface SelectedAppCurrencyStore {
|
||||||
fun get(): Flow<CurrenciesResponse.Currency>
|
fun get(): Flow<CurrenciesResponse.Currency>
|
||||||
|
|
||||||
suspend fun store(item: CurrenciesResponse.Currency)
|
suspend fun store(item: CurrenciesResponse.Currency)
|
||||||
|
|
||||||
|
suspend fun isEmpty(): Boolean
|
||||||
}
|
}
|
||||||
|
|
@ -7,4 +7,9 @@ import com.tangem.datasource.local.datastore.core.StringKeyDataStore
|
||||||
|
|
||||||
internal class DefaultSelectedAppCurrencyStore(
|
internal class DefaultSelectedAppCurrencyStore(
|
||||||
dataStore: StringKeyDataStore<CurrenciesResponse.Currency>,
|
dataStore: StringKeyDataStore<CurrenciesResponse.Currency>,
|
||||||
) : SelectedAppCurrencyStore, KeylessDataStoreDecorator<CurrenciesResponse.Currency>(dataStore)
|
) : SelectedAppCurrencyStore, KeylessDataStoreDecorator<CurrenciesResponse.Currency>(dataStore) {
|
||||||
|
|
||||||
|
override suspend fun isEmpty(): Boolean {
|
||||||
|
return getSyncOrNull() == null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,15 +10,15 @@ internal abstract class KeylessDataStoreDecorator<Value : Any>(
|
||||||
return STRING_KEY
|
return STRING_KEY
|
||||||
}
|
}
|
||||||
|
|
||||||
fun get(): Flow<Value> {
|
open fun get(): Flow<Value> {
|
||||||
return get(Unit)
|
return get(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getSyncOrNull(): Value? {
|
open suspend fun getSyncOrNull(): Value? {
|
||||||
return getSyncOrNull(Unit)
|
return getSyncOrNull(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun store(item: Value) {
|
open suspend fun store(item: Value) {
|
||||||
store(Unit, item)
|
store(Unit, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
|
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.channelFlow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEmpty
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.joda.time.Duration
|
import org.joda.time.Duration
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
@ -27,11 +27,18 @@ internal class DefaultAppCurrencyRepository(
|
||||||
|
|
||||||
private val appCurrencyConverter = AppCurrencyConverter()
|
private val appCurrencyConverter = AppCurrencyConverter()
|
||||||
|
|
||||||
override fun getSelectedAppCurrency(): Flow<AppCurrency> {
|
override fun getSelectedAppCurrency(): Flow<AppCurrency> = channelFlow {
|
||||||
return selectedAppCurrencyStore.get()
|
launch(dispatchers.io) {
|
||||||
.onEmpty { fetchDefaultAppCurrency() }
|
selectedAppCurrencyStore.get()
|
||||||
.map(appCurrencyConverter::convert)
|
.map(appCurrencyConverter::convert)
|
||||||
.flowOn(dispatchers.io)
|
.collect(::send)
|
||||||
|
}
|
||||||
|
|
||||||
|
launch(dispatchers.io) {
|
||||||
|
if (selectedAppCurrencyStore.isEmpty()) {
|
||||||
|
fetchDefaultAppCurrency()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getAvailableAppCurrencies(): List<AppCurrency> {
|
override suspend fun getAvailableAppCurrencies(): List<AppCurrency> {
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||||
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
|
||||||
import com.tangem.datasource.local.token.UserTokensStore
|
import com.tangem.datasource.local.token.UserTokensStore
|
||||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||||
import com.tangem.domain.core.error.DataError
|
|
||||||
import com.tangem.domain.common.util.derivationStyleProvider
|
import com.tangem.domain.common.util.derivationStyleProvider
|
||||||
|
import com.tangem.domain.core.error.DataError
|
||||||
import com.tangem.domain.demo.DemoConfig
|
import com.tangem.domain.demo.DemoConfig
|
||||||
import com.tangem.domain.tokens.models.CryptoCurrency
|
import com.tangem.domain.tokens.models.CryptoCurrency
|
||||||
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
||||||
|
|
@ -164,7 +164,7 @@ internal class DefaultCurrenciesRepository(
|
||||||
|
|
||||||
tangemTechApi.saveUserTokens(userWallet.walletId.stringValue, response)
|
tangemTechApi.saveUserTokens(userWallet.walletId.stringValue, response)
|
||||||
} else {
|
} else {
|
||||||
throw error
|
Timber.e(error, "Unable to fetch currencies for: ${userWallet.walletId}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue