From 98fee821fab8e9c0d7b5f22448819592d8e823c4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 5 Dec 2024 16:11:05 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/OnrampDomainModule.kt | 6 +++ .../response/model/OnrampCurrencyDTO.kt | 3 ++ .../onramp/converters/CurrencyConverter.kt | 2 + .../domain/onramp/model/OnrampCurrency.kt | 1 + .../domain/onramp/OnrampFetchPairsUseCase.kt | 16 +++++++ .../main/entity/factory/OnrampStateFactory.kt | 6 +-- .../amount/OnrampAmountStateFactory.kt | 4 +- .../main/model/OnrampMainComponentModel.kt | 45 ++++++++++++++++--- .../onramp/main/ui/OnrampAmountContent.kt | 1 + 9 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 domain/onramp/src/main/java/com/tangem/domain/onramp/OnrampFetchPairsUseCase.kt 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 3b83197304..36627cbffe 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 @@ -162,6 +162,12 @@ internal object OnrampDomainModule { return OnrampSaveSelectedPaymentMethod(onrampRepository) } + @Provides + @Singleton + fun provideOnrampFetchPairsUseCase(onrampRepository: OnrampRepository): OnrampFetchPairsUseCase { + return OnrampFetchPairsUseCase(onrampRepository) + } + @Provides @Singleton fun provideGetOnrampRedirectUrlUseCase( diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/model/OnrampCurrencyDTO.kt b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/model/OnrampCurrencyDTO.kt index 480626a016..7dbb49bbdf 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/model/OnrampCurrencyDTO.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/model/OnrampCurrencyDTO.kt @@ -16,4 +16,7 @@ data class OnrampCurrencyDTO( @Json(name = "precision") val precision: Int, + + @Json(name = "unit") + val unit: String?, ) \ No newline at end of file diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/converters/CurrencyConverter.kt b/data/onramp/src/main/java/com/tangem/data/onramp/converters/CurrencyConverter.kt index 4c37be2fc8..876e4ba880 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/converters/CurrencyConverter.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/converters/CurrencyConverter.kt @@ -11,6 +11,7 @@ internal class CurrencyConverter : TwoWayConverter { + return Either.catch { + val country = requireNotNull(repository.getDefaultCountrySync()) { "Country must not be null" } + val currency = requireNotNull(repository.getDefaultCurrencySync()) { "Currency must not be null" } + repository.fetchPairs(currency = currency, country = country, cryptoCurrency = cryptoCurrency) + } + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt index 054e19aa36..7616976a84 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/OnrampStateFactory.kt @@ -12,10 +12,6 @@ import com.tangem.domain.tokens.model.AmountType import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.convertToAmount import com.tangem.features.onramp.main.entity.* -import com.tangem.features.onramp.main.entity.OnrampAmountBlockUM -import com.tangem.features.onramp.main.entity.OnrampAmountSecondaryFieldUM -import com.tangem.features.onramp.main.entity.OnrampCurrencyUM -import com.tangem.features.onramp.main.entity.OnrampMainComponentUM import com.tangem.utils.Provider import java.math.BigDecimal @@ -77,7 +73,7 @@ internal class OnrampStateFactory( } private fun BigDecimal.convertToFiatAmount(currency: OnrampCurrency): Amount = Amount( - currencySymbol = currency.name, + currencySymbol = currency.unit, value = this, decimals = currency.precision, type = AmountType.FiatType(currency.code), diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt index ec9ef905d1..0c2753785f 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/entity/factory/amount/OnrampAmountStateFactory.kt @@ -39,7 +39,7 @@ internal class OnrampAmountStateFactory( ), amountFieldModel = amountState.amountFieldModel.copy( fiatAmount = amountState.amountFieldModel.fiatAmount.copy( - currencySymbol = currency.code, + currencySymbol = currency.unit, decimals = currency.precision, type = AmountType.FiatType(currency.code), ), @@ -65,6 +65,8 @@ internal class OnrampAmountStateFactory( if (currentState !is OnrampMainComponentUM.Content) return currentState val amountState = currentState.amountBlockState + if (amountState.amountFieldModel.fiatValue.isEmpty()) return currentState + return currentState.copy( amountBlockState = amountState.copy( secondaryFieldModel = quote.toSecondaryFieldUiModel(amountState), diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt index 9e382eb0e9..ec0fbf7399 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt @@ -33,6 +33,9 @@ import com.tangem.features.onramp.main.entity.factory.amount.OnrampAmountStateFa import com.tangem.features.onramp.utils.InputManager import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import com.tangem.utils.coroutines.PeriodicTask +import com.tangem.utils.coroutines.SingleTaskScheduler +import com.tangem.utils.isNullOrZero import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import timber.log.Timber @@ -50,6 +53,7 @@ internal class OnrampMainComponentModel @Inject constructor( private val clearOnrampCacheUseCase: ClearOnrampCacheUseCase, private val fetchQuotesUseCase: OnrampFetchQuotesUseCase, private val getOnrampQuotesUseCase: GetOnrampQuotesUseCase, + private val fetchPairsUseCase: OnrampFetchPairsUseCase, private val amountInputManager: InputManager, private val messageSender: UiMessageSender, getWalletsUseCase: GetWalletsUseCase, @@ -73,6 +77,7 @@ internal class OnrampMainComponentModel @Inject constructor( onClose = router::pop, ), ) + private val quotesTaskScheduler = SingleTaskScheduler() val state: StateFlow get() = _state.asStateFlow() val bottomSheetNavigation: SlotNavigation = SlotNavigation() @@ -126,6 +131,7 @@ internal class OnrampMainComponentModel @Inject constructor( val currency = maybeCurrency.getOrNull() if (currency != null) { _state.update { amountStateFactory.getUpdatedCurrencyState(currency) } + updatePairsAndQuotes() } } .launchIn(modelScope) @@ -135,15 +141,39 @@ internal class OnrampMainComponentModel @Inject constructor( amountInputManager.query .filter(String::isNotEmpty) .collectLatest { _ -> - val content = state.value as? OnrampMainComponentUM.Content ?: return@collectLatest _state.update { amountStateFactory.getAmountSecondaryLoadingState() } - fetchQuotesUseCase.invoke( - amount = content.amountBlockState.amountFieldModel.fiatAmount, - cryptoCurrency = params.cryptoCurrency, - ) + startLoadingQuotes() } } + private suspend fun updatePairsAndQuotes() { + fetchPairsUseCase.invoke(params.cryptoCurrency) + startLoadingQuotes() + } + + private fun startLoadingQuotes() { + quotesTaskScheduler.cancelTask() + quotesTaskScheduler.scheduleTask(scope = modelScope, task = loadQuotesTask()) + } + + private fun loadQuotesTask(): PeriodicTask { + return PeriodicTask( + delay = UPDATE_DELAY, + task = { + runCatching { + val content = state.value as? OnrampMainComponentUM.Content ?: return@runCatching + if (content.amountBlockState.amountFieldModel.fiatAmount.value.isNullOrZero()) return@runCatching + fetchQuotesUseCase.invoke( + amount = content.amountBlockState.amountFieldModel.fiatAmount, + cryptoCurrency = params.cryptoCurrency, + ) + } + }, + onSuccess = {}, + onError = {}, + ) + } + private fun subscribeToQuotesUpdate() { getOnrampQuotesUseCase.invoke() .onEach { maybeQuotes -> @@ -205,6 +235,7 @@ internal class OnrampMainComponentModel @Inject constructor( override fun onDestroy() { modelScope.launch { clearOnrampCacheUseCase.invoke() } + quotesTaskScheduler.cancelTask() super.onDestroy() } @@ -236,4 +267,8 @@ internal class OnrampMainComponentModel @Inject constructor( }, ) } + + private companion object { + const val UPDATE_DELAY = 10_000L + } } \ No newline at end of file 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 b75e7d3976..855297b410 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 @@ -60,6 +60,7 @@ private fun OnrampAmountField(amountField: AmountFieldModel) { visualTransformation = AmountVisualTransformation( decimals = amountField.fiatAmount.decimals, symbol = amountField.fiatAmount.currencySymbol, + currencyCode = amountField.fiatAmount.currencySymbol, decimalFormat = decimalFormat, ), onValueChange = amountField.onValueChange,