diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapComponent.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapComponent.kt index 6e9495b238..1ab3e27465 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapComponent.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/DefaultSwapComponent.kt @@ -101,9 +101,10 @@ internal class DefaultSwapComponent @AssistedInject constructor( @Composable override fun Content(modifier: Modifier) { if (sendFeatureToggles.isGaslessTransactionsEnabled) { - val fromCryptoCurrency by remember { derivedStateOf { model.dataState.fromCryptoCurrency } } - val feePaidCryptoCurrency by remember { derivedStateOf { model.dataState.feePaidCryptoCurrency } } - val amount by remember { derivedStateOf { model.dataState.amount } } + val dataState by model.dataStateStateFlow.collectAsStateWithLifecycle() + val fromCryptoCurrency by remember { derivedStateOf { dataState.fromCryptoCurrency } } + val feePaidCryptoCurrency by remember { derivedStateOf { dataState.feePaidCryptoCurrency } } + val amount by remember { derivedStateOf { dataState.amount } } LaunchedEffect(fromCryptoCurrency, feePaidCryptoCurrency, amount.isNullOrBlank()) { if (amount.isNullOrBlank()) { diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index 8f5bd07b10..fd342433db 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -80,7 +80,6 @@ import com.tangem.feature.swap.domain.models.SwapAmount import com.tangem.feature.swap.domain.models.domain.* import com.tangem.feature.swap.domain.models.ui.* import com.tangem.feature.swap.models.AddToPortfolioRoute -import com.tangem.feature.swap.models.SwapCardState import com.tangem.feature.swap.models.SwapStateHolder import com.tangem.feature.swap.models.UiActions import com.tangem.feature.swap.models.market.SwapMarketsListBatchFlowManager @@ -200,7 +199,12 @@ internal class SwapModel @Inject constructor( private val searchDebouncer = Debouncer() private val singleTaskScheduler = SingleTaskScheduler>() - var dataState by mutableStateOf(SwapProcessDataState()) + val dataStateStateFlow = MutableStateFlow(SwapProcessDataState()) + var dataState + get() = dataStateStateFlow.value + set(value) { + dataStateStateFlow.value = value + } var uiState: SwapStateHolder by mutableStateOf( stateBuilder.createInitialLoadingState( @@ -699,6 +703,7 @@ internal class SwapModel @Inject constructor( toProvidersList: List, updateFeeBlock: Boolean = true, ): PeriodicTask> { + var shouldUpdateFeeBlock = updateFeeBlock return PeriodicTask( delay = UPDATE_DELAY, task = { @@ -734,8 +739,10 @@ internal class SwapModel @Inject constructor( tokenSwapInfoForProviders = successStates.entries .associate { it.key.providerId to it.value.toTokenInfo }, ) - if (updateFeeBlock) { + if (shouldUpdateFeeBlock) { modelScope.launch { feeSelectorReloadTrigger.triggerUpdate() } + } else { + shouldUpdateFeeBlock = true } } else { feeSelectorRepository.state.value = FeeSelectorUM.Error(GetFeeError.UnknownError, isHidden = true) @@ -2140,20 +2147,19 @@ internal class SwapModel @Inject constructor( ) } + @Suppress("UnsafeCallOnNullableType") inner class FeeSelectorRepository : SwapFeeSelectorBlockComponent.ModelRepositoryExtended { - override val state = MutableStateFlow(FeeSelectorUM.Loading) + override val state = MutableStateFlow( + FeeSelectorUM.Error(GetFeeError.UnknownError, isHidden = true), + ) override suspend fun loadFeeExtended( selectedToken: CryptoCurrencyStatus?, ): Either { - val sendCardData = - uiState.sendCardData as? SwapCardState.SwapCardData ?: return Either.Left(GetFeeError.UnknownError) - val receiveCardData = - uiState.receiveCardData as? SwapCardState.SwapCardData ?: return Either.Left(GetFeeError.UnknownError) - val fromToken = sendCardData.token ?: return Either.Left(GetFeeError.UnknownError) - val toToken = receiveCardData.token ?: return Either.Left(GetFeeError.UnknownError) - val selectedProvider = dataState.selectedProvider ?: return Either.Left(GetFeeError.UnknownError) + val fromToken = dataState.fromCryptoCurrency ?: return Either.Left(GetFeeError.UnknownError) + val toToken = dataState.toCryptoCurrency ?: return Either.Left(GetFeeError.UnknownError) + val selectedProvider = dataStateStateFlow.first { it.selectedProvider != null }.selectedProvider!! if (dataState.lastLoadedSwapStates[selectedProvider] !is SwapState.QuotesLoadedState) { return Either.Left(GetFeeError.UnknownError) @@ -2209,13 +2215,9 @@ internal class SwapModel @Inject constructor( } override suspend fun loadFee(): Either { - val sendCardData = - uiState.sendCardData as? SwapCardState.SwapCardData ?: return Either.Left(GetFeeError.UnknownError) - val receiveCardData = - uiState.receiveCardData as? SwapCardState.SwapCardData ?: return Either.Left(GetFeeError.UnknownError) - val fromToken = sendCardData.token ?: return Either.Left(GetFeeError.UnknownError) - val toToken = receiveCardData.token ?: return Either.Left(GetFeeError.UnknownError) - val selectedProvider = dataState.selectedProvider ?: return Either.Left(GetFeeError.UnknownError) + val fromToken = dataState.fromCryptoCurrency ?: return Either.Left(GetFeeError.UnknownError) + val toToken = dataState.toCryptoCurrency ?: return Either.Left(GetFeeError.UnknownError) + val selectedProvider = dataStateStateFlow.first { it.selectedProvider != null }.selectedProvider!! if (dataState.lastLoadedSwapStates[selectedProvider] !is SwapState.QuotesLoadedState) { return Either.Left(GetFeeError.UnknownError)