diff --git a/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt index 2c7ebb8702..c2b9cb9ac8 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/OnrampDomainModule.kt @@ -219,4 +219,22 @@ internal object OnrampDomainModule { ): GetOnrampRedirectUrlUseCase { return GetOnrampRedirectUrlUseCase(onrampRepository, transactionRepository, onrampErrorResolver) } + + @Provides + @Singleton + fun provideFetchOnrampCurrenciesUseCase( + onrampRepository: OnrampRepository, + onrampErrorResolver: OnrampErrorResolver, + ): FetchOnrampCurrenciesUseCase { + return FetchOnrampCurrenciesUseCase(onrampRepository, onrampErrorResolver) + } + + @Provides + @Singleton + fun provideFetchOnrampCountriesUseCase( + onrampRepository: OnrampRepository, + onrampErrorResolver: OnrampErrorResolver, + ): FetchOnrampCountriesUseCase { + return FetchOnrampCountriesUseCase(onrampRepository, onrampErrorResolver) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt index def89f2cb1..e786b22f21 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/OnrampStoreModule.kt @@ -1,6 +1,10 @@ package com.tangem.datasource.di import com.tangem.datasource.local.datastore.RuntimeDataStore +import com.tangem.datasource.local.onramp.countries.DefaultOnrampCountriesStore +import com.tangem.datasource.local.onramp.countries.OnrampCountriesStore +import com.tangem.datasource.local.onramp.currencies.DefaultOnrampCurrenciesStore +import com.tangem.datasource.local.onramp.currencies.OnrampCurrenciesStore import com.tangem.datasource.local.onramp.pairs.DefaultOnrampPairsStore import com.tangem.datasource.local.onramp.pairs.OnrampPairsStore import com.tangem.datasource.local.onramp.paymentmethods.DefaultOnrampPaymentMethodsStore @@ -34,4 +38,16 @@ internal object OnrampStoreModule { fun provideOnrampQuotesStore(): OnrampQuotesStore { return DefaultOnrampQuotesStore(dataStore = RuntimeDataStore()) } + + @Provides + @Singleton + fun provideOnrampCountriesStore(): OnrampCountriesStore { + return DefaultOnrampCountriesStore(dataStore = RuntimeDataStore()) + } + + @Provides + @Singleton + fun provideOnrampCurrencies(): OnrampCurrenciesStore { + return DefaultOnrampCurrenciesStore(dataStore = RuntimeDataStore()) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/DefaultOnrampCountriesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/DefaultOnrampCountriesStore.kt new file mode 100644 index 0000000000..8a532d8284 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/DefaultOnrampCountriesStore.kt @@ -0,0 +1,11 @@ +package com.tangem.datasource.local.onramp.countries + +import com.tangem.datasource.local.datastore.core.StringKeyDataStore +import com.tangem.datasource.local.datastore.core.StringKeyDataStoreDecorator +import com.tangem.domain.onramp.model.OnrampCountry + +internal class DefaultOnrampCountriesStore( + dataStore: StringKeyDataStore>, +) : OnrampCountriesStore, StringKeyDataStoreDecorator>(dataStore) { + override fun provideStringKey(key: String): String = key +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/OnrampCountriesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/OnrampCountriesStore.kt new file mode 100644 index 0000000000..cd6fad266e --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/countries/OnrampCountriesStore.kt @@ -0,0 +1,11 @@ +package com.tangem.datasource.local.onramp.countries + +import com.tangem.domain.onramp.model.OnrampCountry +import kotlinx.coroutines.flow.Flow + +interface OnrampCountriesStore { + suspend fun getSyncOrNull(key: String): List? + fun get(key: String): Flow> + suspend fun store(key: String, value: List) + suspend fun clear() +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/DefaultOnrampCurrenciesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/DefaultOnrampCurrenciesStore.kt new file mode 100644 index 0000000000..d24195590d --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/DefaultOnrampCurrenciesStore.kt @@ -0,0 +1,11 @@ +package com.tangem.datasource.local.onramp.currencies + +import com.tangem.datasource.local.datastore.core.StringKeyDataStore +import com.tangem.datasource.local.datastore.core.StringKeyDataStoreDecorator +import com.tangem.domain.onramp.model.OnrampCurrency + +internal class DefaultOnrampCurrenciesStore( + dataStore: StringKeyDataStore>, +) : OnrampCurrenciesStore, StringKeyDataStoreDecorator>(dataStore) { + override fun provideStringKey(key: String): String = key +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/OnrampCurrenciesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/OnrampCurrenciesStore.kt new file mode 100644 index 0000000000..38bea3c404 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/local/onramp/currencies/OnrampCurrenciesStore.kt @@ -0,0 +1,11 @@ +package com.tangem.datasource.local.onramp.currencies + +import com.tangem.domain.onramp.model.OnrampCurrency +import kotlinx.coroutines.flow.Flow + +interface OnrampCurrenciesStore { + suspend fun getSyncOrNull(key: String): List? + fun get(key: String): Flow> + suspend fun store(key: String, value: List) + suspend fun clear() +} \ No newline at end of file diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt index 32ad1d581a..8b427f58f6 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt @@ -25,6 +25,8 @@ import com.tangem.datasource.api.onramp.models.response.model.OnrampCurrencyDTO import com.tangem.datasource.api.onramp.models.response.model.OnrampPairDTO import com.tangem.datasource.api.onramp.models.response.model.PaymentMethodDTO import com.tangem.datasource.crypto.DataSignatureVerifier +import com.tangem.datasource.local.onramp.countries.OnrampCountriesStore +import com.tangem.datasource.local.onramp.currencies.OnrampCurrenciesStore import com.tangem.datasource.local.onramp.pairs.OnrampPairsStore import com.tangem.datasource.local.onramp.paymentmethods.OnrampPaymentMethodsStore import com.tangem.datasource.local.onramp.quotes.OnrampQuotesStore @@ -66,6 +68,8 @@ internal class DefaultOnrampRepository( private val paymentMethodsStore: OnrampPaymentMethodsStore, private val pairsStore: OnrampPairsStore, private val quotesStore: OnrampQuotesStore, + private val countriesStore: OnrampCountriesStore, + private val currenciesStore: OnrampCurrenciesStore, private val walletManagersFacade: WalletManagersFacade, private val dataSignatureVerifier: DataSignatureVerifier, moshi: Moshi, @@ -79,16 +83,36 @@ internal class DefaultOnrampRepository( private val onrampErrorAdapter = moshi.adapter(ExpressErrorResponse::class.java) private val onrampErrorConverter = OnrampErrorConverter(onrampErrorAdapter) - override suspend fun getCurrencies(): List = withContext(dispatchers.io) { - onrampApi.getCurrencies() - .getOrThrow() - .map(currencyConverter::convert) + override suspend fun getCurrencies(): Flow> = withContext(dispatchers.io) { + currenciesStore.get(CURRENCIES_KEY) } - override suspend fun getCountries(): List = withContext(dispatchers.io) { - onrampApi.getCountries() + override suspend fun fetchCurrencies() = withContext(dispatchers.io) { + if (!currenciesStore.getSyncOrNull(CURRENCIES_KEY).isNullOrEmpty()) return@withContext + + val result = onrampApi.getCurrencies() + .getOrThrow() + .map(currencyConverter::convert) + + currenciesStore.store(CURRENCIES_KEY, result) + } + + override suspend fun getCountries(): Flow> = withContext(dispatchers.io) { + countriesStore.get(COUNTRIES_KEY) + } + + override suspend fun getCountriesSync(): List? { + return countriesStore.getSyncOrNull(COUNTRIES_KEY) + } + + override suspend fun fetchCountries() = withContext(dispatchers.io) { + if (!countriesStore.getSyncOrNull(COUNTRIES_KEY).isNullOrEmpty()) return@withContext + + val result = onrampApi.getCountries() .getOrThrow() .map(countryConverter::convert) + + countriesStore.store(COUNTRIES_KEY, result) } override suspend fun getCountryByIp(): OnrampCountry = withContext(dispatchers.io) { @@ -339,6 +363,8 @@ internal class DefaultOnrampRepository( paymentMethodsStore.clear() pairsStore.clear() quotesStore.clear() + countriesStore.clear() + currenciesStore.clear() } private suspend fun storeOnrampPairs(pairs: List, providers: List) { @@ -455,6 +481,8 @@ internal class DefaultOnrampRepository( const val SELECTED_PAYMENT_METHOD_KEY = "onramp_selected_payment_method" const val PAIRS_KEY = "onramp_pairs" const val QUOTES_KEY = "onramp_quotes" + const val COUNTRIES_KEY = "onramp_countries" + const val CURRENCIES_KEY = "onramp_currencies" const val PROVIDER_THEME_DARK = "dark" const val PROVIDER_THEME_LIGHT = "light" } diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt b/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt index a61d427078..febd5c21c9 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt @@ -10,6 +10,8 @@ import com.tangem.datasource.api.express.models.response.ExpressErrorResponse import com.tangem.datasource.api.onramp.OnrampApi import com.tangem.datasource.crypto.DataSignatureVerifier import com.tangem.datasource.di.NetworkMoshi +import com.tangem.datasource.local.onramp.countries.OnrampCountriesStore +import com.tangem.datasource.local.onramp.currencies.OnrampCurrenciesStore import com.tangem.datasource.local.onramp.pairs.OnrampPairsStore import com.tangem.datasource.local.onramp.paymentmethods.OnrampPaymentMethodsStore import com.tangem.datasource.local.onramp.quotes.OnrampQuotesStore @@ -39,6 +41,8 @@ internal object OnrampDataModule { paymentMethodsStore: OnrampPaymentMethodsStore, pairsStore: OnrampPairsStore, quotesStore: OnrampQuotesStore, + countriesStore: OnrampCountriesStore, + currenciesStore: OnrampCurrenciesStore, walletManagersFacade: WalletManagersFacade, dataSignatureVerifier: DataSignatureVerifier, @NetworkMoshi moshi: Moshi, @@ -51,6 +55,8 @@ internal object OnrampDataModule { paymentMethodsStore = paymentMethodsStore, pairsStore = pairsStore, quotesStore = quotesStore, + currenciesStore = currenciesStore, + countriesStore = countriesStore, walletManagersFacade = walletManagersFacade, dataSignatureVerifier = dataSignatureVerifier, moshi = moshi, diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/CheckOnrampAvailabilityUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/CheckOnrampAvailabilityUseCase.kt index 561f2cf5fd..52971ea345 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/CheckOnrampAvailabilityUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/CheckOnrampAvailabilityUseCase.kt @@ -26,7 +26,7 @@ class CheckOnrampAvailabilityUseCase( } private suspend fun proceedWithSavedCountry(savedCountry: OnrampCountry): OnrampAvailability { - val countries = repository.getCountries() + val countries = repository.getCountriesSync().orEmpty() val onrampAvailable = countries.find { it == savedCountry }?.onrampAvailable ?: false return if (onrampAvailable) { val currency = repository.getDefaultCurrencySync() ?: run { diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCountriesUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCountriesUseCase.kt new file mode 100644 index 0000000000..8f320a1247 --- /dev/null +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCountriesUseCase.kt @@ -0,0 +1,16 @@ +package com.tangem.domain.onramp + +import arrow.core.Either +import com.tangem.domain.onramp.model.error.OnrampError +import com.tangem.domain.onramp.repositories.OnrampErrorResolver +import com.tangem.domain.onramp.repositories.OnrampRepository + +class FetchOnrampCountriesUseCase( + private val repository: OnrampRepository, + private val errorResolver: OnrampErrorResolver, +) { + + suspend operator fun invoke(): Either { + return Either.catch { repository.fetchCountries() }.mapLeft(errorResolver::resolve) + } +} \ No newline at end of file diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCurrenciesUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCurrenciesUseCase.kt new file mode 100644 index 0000000000..d1a15ca673 --- /dev/null +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/FetchOnrampCurrenciesUseCase.kt @@ -0,0 +1,16 @@ +package com.tangem.domain.onramp + +import arrow.core.Either +import com.tangem.domain.onramp.model.error.OnrampError +import com.tangem.domain.onramp.repositories.OnrampErrorResolver +import com.tangem.domain.onramp.repositories.OnrampRepository + +class FetchOnrampCurrenciesUseCase( + private val repository: OnrampRepository, + private val errorResolver: OnrampErrorResolver, +) { + + suspend operator fun invoke(): Either { + return Either.catch { repository.fetchCurrencies() }.mapLeft(errorResolver::resolve) + } +} \ No newline at end of file diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountriesUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountriesUseCase.kt index 928db29e59..1ede7cb75b 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountriesUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCountriesUseCase.kt @@ -1,17 +1,21 @@ package com.tangem.domain.onramp import arrow.core.Either +import com.tangem.domain.core.utils.EitherFlow import com.tangem.domain.onramp.model.OnrampCountry import com.tangem.domain.onramp.model.error.OnrampError import com.tangem.domain.onramp.repositories.OnrampErrorResolver import com.tangem.domain.onramp.repositories.OnrampRepository +import kotlinx.coroutines.flow.map class GetOnrampCountriesUseCase( private val onrampRepository: OnrampRepository, private val errorResolver: OnrampErrorResolver, ) { - suspend operator fun invoke(): Either> { - return Either.catch { onrampRepository.getCountries() }.mapLeft(errorResolver::resolve) + suspend operator fun invoke(): EitherFlow> { + return onrampRepository.getCountries().map { + Either.catch { it }.mapLeft(errorResolver::resolve) + } } } \ No newline at end of file diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCurrenciesUseCase.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCurrenciesUseCase.kt index 29b1aee914..33f5ac2f22 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCurrenciesUseCase.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/GetOnrampCurrenciesUseCase.kt @@ -1,23 +1,26 @@ package com.tangem.domain.onramp import arrow.core.Either +import com.tangem.domain.core.utils.EitherFlow import com.tangem.domain.onramp.model.OnrampCurrencies import com.tangem.domain.onramp.model.error.OnrampError import com.tangem.domain.onramp.repositories.OnrampErrorResolver import com.tangem.domain.onramp.repositories.OnrampRepository +import kotlinx.coroutines.flow.map class GetOnrampCurrenciesUseCase( private val onrampRepository: OnrampRepository, private val errorResolver: OnrampErrorResolver, ) { - suspend operator fun invoke(): Either { - return Either.catch { - val currenciesList = onrampRepository.getCurrencies() - val (populars, others) = currenciesList.toSet() - .partition { popularFiatCodes.contains(it.code.uppercase()) } - OnrampCurrencies(populars = populars, others = others) - }.mapLeft(errorResolver::resolve) + suspend operator fun invoke(): EitherFlow { + return onrampRepository.getCurrencies().map { currenciesList -> + Either.catch { + val (populars, others) = currenciesList.toSet() + .partition { popularFiatCodes.contains(it.code.uppercase()) } + OnrampCurrencies(populars = populars, others = others) + }.mapLeft(errorResolver::resolve) + } } private companion object { diff --git a/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt b/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt index 7ead04a301..c5d09a5da7 100644 --- a/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt +++ b/domain/onramp/src/main/java/com/tangem/domain/onramp/repositories/OnrampRepository.kt @@ -10,10 +10,13 @@ import kotlinx.coroutines.flow.Flow @Suppress("TooManyFunctions") interface OnrampRepository { // api - suspend fun getCurrencies(): List - suspend fun getCountries(): List + suspend fun getCurrencies(): Flow> + suspend fun getCountries(): Flow> + suspend fun getCountriesSync(): List? suspend fun getCountryByIp(): OnrampCountry suspend fun getStatus(txId: String): OnrampStatus + suspend fun fetchCurrencies() + suspend fun fetchCountries() suspend fun fetchPaymentMethodsIfAbsent() suspend fun fetchPairs(currency: OnrampCurrency, country: OnrampCountry, cryptoCurrency: CryptoCurrency) suspend fun fetchQuotes(cryptoCurrency: CryptoCurrency, amount: Amount) diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/ui/OnrampAmountContent.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/ui/OnrampAmountContent.kt index 02bb9aade5..608587c822 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/ui/OnrampAmountContent.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/ui/OnrampAmountContent.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDirection +import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.tangem.common.ui.amountScreen.models.AmountFieldModel import com.tangem.core.ui.components.TextShimmer @@ -40,10 +41,7 @@ internal fun OnrampAmountContent(state: OnrampAmountBlockUM, modifier: Modifier .padding(vertical = TangemTheme.dimens.spacing28), horizontalAlignment = Alignment.CenterHorizontally, ) { - OnrampCurrencyIcon( - modifier = Modifier.padding(start = TangemTheme.dimens.spacing24), - currencyUM = state.currencyUM, - ) + OnrampCurrencyIcon(currencyUM = state.currencyUM) OnrampAmountField(amountField = state.amountFieldModel) OnrampAmountSecondary(state = state.secondaryFieldModel) } @@ -124,7 +122,10 @@ private fun OnrampAmountSecondary(state: OnrampAmountSecondaryFieldUM) { @Composable private fun OnrampCurrencyIcon(currencyUM: OnrampCurrencyUM, modifier: Modifier = Modifier) { Row( - modifier = modifier.clickable(onClick = currencyUM.onClick), + modifier = modifier + .clip(RoundedCornerShape(8.dp)) + .clickable(onClick = currencyUM.onClick) + .padding(start = TangemTheme.dimens.spacing24), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing8), ) { diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcountry/model/OnrampSelectCountryModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcountry/model/OnrampSelectCountryModel.kt index 3b401da0a1..60c6819e3b 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcountry/model/OnrampSelectCountryModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcountry/model/OnrampSelectCountryModel.kt @@ -6,6 +6,7 @@ import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.components.fields.entity.SearchBarUM import com.tangem.core.ui.extensions.resourceReference +import com.tangem.domain.onramp.FetchOnrampCountriesUseCase import com.tangem.domain.onramp.GetOnrampCountriesUseCase import com.tangem.domain.onramp.GetOnrampCountryUseCase import com.tangem.domain.onramp.OnrampSaveDefaultCountryUseCase @@ -39,6 +40,7 @@ internal class OnrampSelectCountryModel @Inject constructor( private val getOnrampCountriesUseCase: GetOnrampCountriesUseCase, private val saveDefaultCountryUseCase: OnrampSaveDefaultCountryUseCase, private val getOnrampCountryUseCase: GetOnrampCountryUseCase, + private val fetchOnrampCountriesUseCase: FetchOnrampCountriesUseCase, paramsContainer: ParamsContainer, ) : Model() { @@ -52,9 +54,16 @@ internal class OnrampSelectCountryModel @Inject constructor( init { analyticsEventHandler.send(OnrampAnalyticsEvent.SelectResidenceOpened) + updateCountriesList() modelScope.launch { subscribeOnUpdateState() } } + private fun updateCountriesList() { + modelScope.launch { + fetchOnrampCountriesUseCase() + } + } + fun dismiss() { params.onDismiss() } @@ -62,7 +71,7 @@ internal class OnrampSelectCountryModel @Inject constructor( @OptIn(ExperimentalCoroutinesApi::class) private suspend fun subscribeOnUpdateState() { combine( - flow = refreshTrigger.onStart { emit(Unit) }.flatMapLatest { flowOf(getOnrampCountriesUseCase()) }, + flow = refreshTrigger.onStart { emit(Unit) }.flatMapLatest { getOnrampCountriesUseCase() }, flow2 = getOnrampCountryUseCase(), flow3 = searchManager.query, ) { maybeCountries, maybeCountry, query -> diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcurrency/model/OnrampSelectCurrencyModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcurrency/model/OnrampSelectCurrencyModel.kt index 46a3aea5de..3ff2d6fc80 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcurrency/model/OnrampSelectCurrencyModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/selectcurrency/model/OnrampSelectCurrencyModel.kt @@ -7,6 +7,7 @@ import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.components.fields.entity.SearchBarUM import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference +import com.tangem.domain.onramp.FetchOnrampCurrenciesUseCase import com.tangem.domain.onramp.GetOnrampCurrenciesUseCase import com.tangem.domain.onramp.OnrampSaveDefaultCurrencyUseCase import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent @@ -31,6 +32,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject +@Suppress("LongParameterList") @ComponentScoped internal class OnrampSelectCurrencyModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -38,6 +40,7 @@ internal class OnrampSelectCurrencyModel @Inject constructor( private val searchManager: InputManager, private val getOnrampCurrenciesUseCase: GetOnrampCurrenciesUseCase, private val saveDefaultCurrencyUseCase: OnrampSaveDefaultCurrencyUseCase, + private val fetchOnrampCurrenciesUseCase: FetchOnrampCurrenciesUseCase, paramsContainer: ParamsContainer, ) : Model() { @@ -51,13 +54,20 @@ internal class OnrampSelectCurrencyModel @Inject constructor( private val refreshTrigger = MutableSharedFlow() init { + updateCurrenciesList() subscribeOnUpdateState() } + private fun updateCurrenciesList() { + modelScope.launch { + fetchOnrampCurrenciesUseCase() + } + } + @OptIn(ExperimentalCoroutinesApi::class) private fun subscribeOnUpdateState() { combine( - flow = refreshTrigger.onStart { emit(Unit) }.flatMapLatest { flowOf(getOnrampCurrenciesUseCase.invoke()) }, + flow = refreshTrigger.onStart { emit(Unit) }.flatMapLatest { getOnrampCurrenciesUseCase() }, flow2 = searchManager.query, ) { maybeCurrencies, query -> maybeCurrencies.onLeft {