Updated on 2026-08-14

This commit is contained in:
Tangem 2025-06-09 13:56:56 +05:00
parent fd70774d75
commit e5478ad943
3 changed files with 62 additions and 82 deletions

View file

@ -101,6 +101,7 @@ internal class WcPairModel @Inject constructor(
is WcPairState.Proposal -> {
sessionProposal = pairState.dAppSession
proposalNetwork = sessionProposal.proposalNetwork.getValue(selectedUserWalletFlow.value)
proposalNetwork.available.mapTo(additionallyEnabledNetworks) { it.id.rawId }
appInfoUiState.transformerUpdate(
WcAppInfoTransformer(
dAppSession = sessionProposal,
@ -179,6 +180,7 @@ internal class WcPairModel @Inject constructor(
selectedUserWalletFlow.update { selectedUserWallet }
appInfoUiState.transformerUpdate(WcAppInfoWalletChangedTransformer(selectedUserWallet, proposalNetwork))
additionallyEnabledNetworks.clear()
proposalNetwork.available.mapTo(additionallyEnabledNetworks) { it.id.rawId }
}
override fun onNetworksSelected(selectedNetworks: Set<Network.RawID>) {

View file

@ -5,14 +5,16 @@ 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.decompose.navigation.Router
import com.tangem.core.ui.extensions.getGreyedOutIconRes
import com.tangem.core.ui.extensions.iconResId
import com.tangem.domain.models.network.Network
import com.tangem.features.walletconnect.connections.components.WcSelectNetworksComponent.WcSelectNetworksParams
import com.tangem.features.walletconnect.connections.entity.WcNetworkInfoItem
import com.tangem.features.walletconnect.connections.entity.WcSelectNetworksUM
import com.tangem.features.walletconnect.connections.model.transformers.WcSelectNetworksCheckedTransformer
import com.tangem.features.walletconnect.connections.model.transformers.WcSelectNetworksTransformer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.transformer.update
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
@ -27,32 +29,15 @@ internal class WcSelectNetworksModel @Inject constructor(
) : Model() {
private val params = paramsContainer.require<WcSelectNetworksParams>()
val state: StateFlow<WcSelectNetworksUM>
field = MutableStateFlow(
WcSelectNetworksUM(
missing = persistentListOf(),
required = persistentListOf(),
available = persistentListOf(),
notAdded = persistentListOf(),
onDone = ::onDone,
private val additionallyEnabledNetworks = MutableStateFlow<Set<Network.RawID>>(
filterAdditionallyEnabledNetworks(
availableNetworks = params.availableNetworks,
additionallyEnabledNetworks = params.enabledAvailableNetworks,
),
)
private val additionallyEnabledNetworks = MutableStateFlow<Set<Network.RawID>>(setOf())
init {
state.update(
WcSelectNetworksTransformer(
missingRequiredNetworks = params.missingRequiredNetworks,
requiredNetworks = params.requiredNetworks,
availableNetworks = params.availableNetworks,
notAddedNetworks = params.notAddedNetworks,
enabledNetworks = params.enabledAvailableNetworks,
onCheckedChange = ::onCheckedChange,
),
)
}
val state: StateFlow<WcSelectNetworksUM>
field = MutableStateFlow(getInitialState())
private fun onCheckedChange(isChecked: Boolean, networkId: String) {
additionallyEnabledNetworks.update {
@ -65,4 +50,54 @@ internal class WcSelectNetworksModel @Inject constructor(
params.callback.onNetworksSelected(additionallyEnabledNetworks.value)
router.pop()
}
private fun filterAdditionallyEnabledNetworks(
availableNetworks: Set<Network>,
additionallyEnabledNetworks: Set<Network.RawID>,
): Set<Network.RawID> {
return availableNetworks
.asSequence()
.filter { it.id.rawId in additionallyEnabledNetworks }
.mapTo(hashSetOf()) { it.id.rawId }
}
private fun getInitialState(): WcSelectNetworksUM {
return WcSelectNetworksUM(
missing = params.missingRequiredNetworks.map { network ->
WcNetworkInfoItem.Required(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
required = params.requiredNetworks.map { network ->
WcNetworkInfoItem.Checked(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
available = params.availableNetworks.map { network ->
WcNetworkInfoItem.Checkable(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
checked = network.id.rawId in additionallyEnabledNetworks.value,
onCheckedChange = { onCheckedChange(it, network.rawId) },
)
}.toImmutableList(),
notAdded = params.notAddedNetworks.map { network ->
WcNetworkInfoItem.ReadOnly(
id = network.rawId,
icon = getGreyedOutIconRes(network.rawId),
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
onDone = ::onDone,
)
}
}

View file

@ -1,57 +0,0 @@
package com.tangem.features.walletconnect.connections.model.transformers
import com.tangem.core.ui.extensions.getGreyedOutIconRes
import com.tangem.core.ui.extensions.iconResId
import com.tangem.domain.models.network.Network
import com.tangem.features.walletconnect.connections.entity.WcNetworkInfoItem
import com.tangem.features.walletconnect.connections.entity.WcSelectNetworksUM
import com.tangem.utils.transformer.Transformer
import kotlinx.collections.immutable.toImmutableList
internal class WcSelectNetworksTransformer(
private val missingRequiredNetworks: Set<Network>,
private val requiredNetworks: Set<Network>,
private val availableNetworks: Set<Network>,
private val notAddedNetworks: Set<Network>,
private val enabledNetworks: Set<Network.RawID>,
private val onCheckedChange: (Boolean, String) -> Unit,
) : Transformer<WcSelectNetworksUM> {
override fun transform(prevState: WcSelectNetworksUM): WcSelectNetworksUM {
return prevState.copy(
missing = missingRequiredNetworks.map { network ->
WcNetworkInfoItem.Required(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
required = requiredNetworks.map { network ->
WcNetworkInfoItem.Checked(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
available = availableNetworks.map { network ->
WcNetworkInfoItem.Checkable(
id = network.rawId,
icon = network.iconResId,
name = network.name,
symbol = network.currencySymbol,
checked = network.id.rawId in enabledNetworks,
onCheckedChange = { onCheckedChange(it, network.rawId) },
)
}.toImmutableList(),
notAdded = notAddedNetworks.map { network ->
WcNetworkInfoItem.ReadOnly(
id = network.rawId,
icon = getGreyedOutIconRes(network.rawId),
name = network.name,
symbol = network.currencySymbol,
)
}.toImmutableList(),
)
}
}