Updated on 2026-08-14

This commit is contained in:
Tangem 2026-02-27 16:14:42 +03:00
parent 1aee06ae82
commit 2de45591bd
3 changed files with 61 additions and 2 deletions

View file

@ -63,6 +63,7 @@ import com.tangem.features.onramp.tokenlist.entity.TokenListUMController
import com.tangem.features.onramp.tokenlist.entity.TokenListUMTransformer
import com.tangem.features.onramp.tokenlist.entity.transformer.*
import com.tangem.features.onramp.tokenlist.entity.utils.OnrampTokenItemStateConverterFactory
import com.tangem.features.onramp.utils.ClearSearchBarTransformer
import com.tangem.features.onramp.utils.UpdateSearchBarActiveStateTransformer
import com.tangem.features.onramp.utils.UpdateSearchBarCallbacksTransformer
import com.tangem.features.onramp.utils.UpdateSearchQueryTransformer
@ -163,6 +164,7 @@ internal class AvailableSwapPairsModel @Inject constructor(
}
initializeSearchBarCallbacks()
subscribeOnSelectedStatusChange()
subscribeOnAvailablePairsUpdates()
if (swapFeatureToggles.isMarketListFeatureEnabled) {
@ -195,6 +197,13 @@ internal class AvailableSwapPairsModel @Inject constructor(
.shareIn(scope = modelScope, started = SharingStarted.Eagerly, replay = 1)
}
private fun subscribeOnSelectedStatusChange() {
params.selectedStatus
.filter { it == null }
.onEach { clearSearchState() }
.launchIn(modelScope)
}
private fun initializeSearchBarCallbacks() {
tokenListUMController.update(
transformer = UpdateSearchBarCallbacksTransformer(
@ -575,9 +584,22 @@ internal class AvailableSwapPairsModel @Inject constructor(
isSearched = state.value.searchBarUM.query.isNotEmpty(),
),
)
clearSearchState()
params.onTokenClick(tokenItem, status)
}
private fun clearSearchState() {
tokenListUMController.update(
transformer = ClearSearchBarTransformer(
placeHolder = resourceReference(id = R.string.common_search),
),
)
modelScope.launch {
searchManager.update("")
}
searchQueryStateForMarkets.value = ""
}
private fun CryptoCurrencyStatus.toLeastTokenInfo(): LeastTokenInfo {
return LeastTokenInfo(
contractAddress = (currency as? CryptoCurrency.Token)?.contractAddress ?: "0",
@ -695,6 +717,8 @@ internal class AvailableSwapPairsModel @Inject constructor(
),
)
clearSearchState()
// Trigger re-fetch of available pairs (clears cache + re-enters collectLatest)
refreshPairsTrigger.emit(Unit)

View file

@ -5,6 +5,7 @@ import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.ui.components.fields.InputManager
import com.tangem.core.ui.components.token.state.TokenItemState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
@ -36,6 +37,7 @@ import com.tangem.features.onramp.swap.entity.AccountCurrencyUM
import com.tangem.features.onramp.tokenlist.OnrampTokenListComponent
import com.tangem.features.onramp.tokenlist.entity.*
import com.tangem.features.onramp.tokenlist.entity.transformer.*
import com.tangem.features.onramp.utils.ClearSearchBarTransformer
import com.tangem.features.onramp.utils.UpdateSearchBarActiveStateTransformer
import com.tangem.features.onramp.utils.UpdateSearchBarCallbacksTransformer
import com.tangem.features.onramp.utils.UpdateSearchQueryTransformer
@ -120,7 +122,7 @@ internal class OnrampTokenListModel @Inject constructor(
UpdateTokenItemsTransformer(
appCurrency = appCurrency,
onItemClick = params.onTokenClick,
onItemClick = ::onTokenClick,
statuses = filterByQueryTokenList.let { statuses ->
if (hasRestrictionForSell || isInsufficientBalanceForSell) {
mapOf(false to statuses)
@ -174,7 +176,7 @@ internal class OnrampTokenListModel @Inject constructor(
updateTokenListUM(
UpdateAccountTokenListTransformer(
appCurrency = appCurrency,
onItemClick = params.onTokenClick,
onItemClick = ::onTokenClick,
accountList = filterByQueryAccountList.filterByAvailability(),
isBalanceHidden = isBalanceHidden,
unavailableErrorText = getUnavailableTokensHeaderReference(),
@ -275,6 +277,22 @@ internal class OnrampTokenListModel @Inject constructor(
}
}
private fun onTokenClick(tokenItemState: TokenItemState, status: CryptoCurrencyStatus) {
clearSearchState()
params.onTokenClick(tokenItemState, status)
}
private fun clearSearchState() {
tokenListUMController.update(
transformer = ClearSearchBarTransformer(
placeHolder = resourceReference(id = R.string.common_search),
),
)
modelScope.launch {
searchManager.update("")
}
}
private fun onSearchQueryChange(newQuery: String) {
val searchBar = state.value.searchBarUM
if (searchBar.query == newQuery) return

View file

@ -0,0 +1,17 @@
package com.tangem.features.onramp.utils
import com.tangem.core.ui.components.fields.entity.SearchBarUM
import com.tangem.core.ui.extensions.TextReference
internal class ClearSearchBarTransformer(
private val placeHolder: TextReference,
) : SearchBarUMTransformer() {
override fun transform(prevState: SearchBarUM): SearchBarUM {
return prevState.copy(
query = "",
isActive = false,
placeholderText = placeHolder,
)
}
}