Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-13 17:45:24 +02:00
parent 0b78c692ee
commit 16ebea436f
10 changed files with 101 additions and 79 deletions

View file

@ -99,7 +99,6 @@ internal class DefaultSearchComponent(
params = SearchTokenSelectorComponent.Params(
entries = config.entries,
appCurrency = config.appCurrency,
isBalanceHidden = config.isBalanceHidden,
onTokenSelected = config.onTokenSelected,
onDismiss = config.onDismiss,
),

View file

@ -8,7 +8,6 @@ internal sealed interface SearchBottomSheetRoute {
data class TokenSelector(
val entries: List<UserAssetEntry>,
val appCurrency: AppCurrency,
val isBalanceHidden: Boolean,
val onTokenSelected: (UserAssetEntry) -> Unit,
val onDismiss: () -> Unit,
) : SearchBottomSheetRoute

View file

@ -39,7 +39,6 @@ internal class SearchTokenSelectorComponent @AssistedInject constructor(
data class Params(
val entries: List<UserAssetEntry>,
val appCurrency: AppCurrency,
val isBalanceHidden: Boolean,
val onTokenSelected: (UserAssetEntry) -> Unit,
val onDismiss: () -> Unit,
)

View file

@ -229,7 +229,6 @@ internal class SearchModel @Inject constructor(
SearchBottomSheetRoute.TokenSelector(
entries = grouped.entries,
appCurrency = currentAppCurrency.value,
isBalanceHidden = isBalanceHidden.value,
onTokenSelected = ::onTokenSelectedFromGroup,
onDismiss = { bottomSheetNavigation.dismiss() },
),

View file

@ -6,25 +6,31 @@ import com.tangem.common.ui.userwallet.converter.WalletIconUMConverter
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.ui.ds.image.DeviceIconUM
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
import com.tangem.domain.common.wallets.UserWalletsListRepository
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.usecase.GetWalletIconUseCase
import com.tangem.features.feed.components.search.SearchTokenSelectorComponent
import com.tangem.features.feed.model.search.state.TokenSelectorStateController
import com.tangem.features.feed.model.search.state.transformers.BuildTokenSelectorSectionsTransformer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import javax.inject.Inject
@Suppress("LongParameterList")
@Stable
@ModelScoped
internal class SearchTokenSelectorModel @Inject constructor(
override val dispatchers: CoroutineDispatcherProvider,
paramsContainer: ParamsContainer,
getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
userWalletsListRepository: UserWalletsListRepository,
private val stateController: TokenSelectorStateController,
private val userWalletsListRepository: UserWalletsListRepository,
private val getWalletIconUseCase: GetWalletIconUseCase,
private val walletIconUMConverter: WalletIconUMConverter,
) : Model() {
@ -35,25 +41,37 @@ internal class SearchTokenSelectorModel @Inject constructor(
get() = stateController.uiState
init {
modelScope.launch(dispatchers.default) {
val requiredWalletIds = params.entries.map { it.userWalletId }.toSet()
val walletIcons = userWalletsListRepository.userWallets
.filterNotNull()
.first()
.filter { it.walletId in requiredWalletIds }
.associate { wallet ->
wallet.walletId to walletIconUMConverter.convert(getWalletIconUseCase(wallet))
}
val requiredWalletIds = params.entries.map { it.userWalletId }.toSet()
val walletIconsFlow = userWalletsListRepository.userWallets
.filterNotNull()
.map { wallets ->
wallets
.filter { it.walletId in requiredWalletIds }
.associate { wallet ->
wallet.walletId to walletIconUMConverter.convert(getWalletIconUseCase(wallet))
}
}
stateController.update(
BuildTokenSelectorSectionsTransformer(
entries = params.entries,
appCurrency = params.appCurrency,
isBalanceHidden = params.isBalanceHidden,
walletIcons = walletIcons,
onTokenSelected = params.onTokenSelected,
),
)
modelScope.launch(dispatchers.default) {
combine(
walletIconsFlow,
getBalanceHidingSettingsUseCase.isBalanceHidden(),
::Pair,
).collect { (walletIcons, isBalanceHidden) ->
rebuildSections(isBalanceHidden, walletIcons)
}
}
}
private fun rebuildSections(isBalanceHidden: Boolean, walletIcons: Map<UserWalletId, DeviceIconUM>) {
stateController.update(
BuildTokenSelectorSectionsTransformer(
entries = params.entries,
appCurrency = params.appCurrency,
isBalanceHidden = isBalanceHidden,
walletIcons = walletIcons,
onTokenSelected = params.onTokenSelected,
),
)
}
}