From 4ef10e66004d9694672c683410339a8fdb2d0dbd Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 16 Jun 2025 14:09:53 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../components/WcSelectNetworksComponent.kt | 7 ++-- .../connections/model/WcPairModel.kt | 35 ++++++++++++------- .../model/WcSelectNetworksModel.kt | 21 +++++------ .../transformers/WcAppInfoTransformer.kt | 10 +++++- .../WcAppInfoWalletChangedTransformer.kt | 10 +++++- .../transformers/WcNetworksInfoConverter.kt | 19 ++++++---- .../WcNetworksSelectedTransformer.kt | 28 +++++++++++++++ .../WcSelectNetworksCheckedTransformer.kt | 5 +-- .../connections/routes/WcAppInfoRoutes.kt | 2 +- 9 files changed, 95 insertions(+), 42 deletions(-) create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksSelectedTransformer.kt diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/components/WcSelectNetworksComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/components/WcSelectNetworksComponent.kt index 86acac33bc..73d622b6ce 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/components/WcSelectNetworksComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/components/WcSelectNetworksComponent.kt @@ -66,7 +66,7 @@ internal class WcSelectNetworksComponent( } interface ModelCallback { - fun onNetworksSelected(selectedNetworks: Set) + fun onNetworksSelected(selectedNetworks: Set) } data class WcSelectNetworksParams( @@ -74,7 +74,7 @@ internal class WcSelectNetworksComponent( val requiredNetworks: Set, val availableNetworks: Set, val notAddedNetworks: Set, - val enabledAvailableNetworks: Set, + val enabledAvailableNetworks: Set, val onDismiss: () -> Unit, val callback: ModelCallback, ) @@ -87,8 +87,6 @@ private fun WcSelectNetworksBS( onDismiss: () -> Unit, modifier: Modifier = Modifier, ) { - if (state.required.isEmpty()) return // required can/must not be empty - TangemModalBottomSheetWithFooter( config = TangemBottomSheetConfig( isShown = true, @@ -117,7 +115,6 @@ private fun WcSelectNetworksBS( .fillMaxWidth(), text = "Done", onClick = state.onDone, - enabled = state.missing.isEmpty(), ) }, ) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcPairModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcPairModel.kt index 08a2dbadc7..bf9adcb783 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcPairModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcPairModel.kt @@ -26,10 +26,7 @@ import com.tangem.features.walletconnect.connections.components.WcSelectNetworks import com.tangem.features.walletconnect.connections.components.WcSelectWalletComponent import com.tangem.features.walletconnect.connections.entity.WcAppInfoUM import com.tangem.features.walletconnect.connections.entity.WcPrimaryButtonConfig -import com.tangem.features.walletconnect.connections.model.transformers.WcAppInfoTransformer -import com.tangem.features.walletconnect.connections.model.transformers.WcAppInfoWalletChangedTransformer -import com.tangem.features.walletconnect.connections.model.transformers.WcConnectButtonProgressTransformer -import com.tangem.features.walletconnect.connections.model.transformers.WcDAppVerifiedStateConverter +import com.tangem.features.walletconnect.connections.model.transformers.* import com.tangem.features.walletconnect.connections.routes.WcAppInfoRoutes import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.* @@ -67,7 +64,7 @@ internal class WcPairModel @Inject constructor( MutableStateFlow(getWalletsUseCase.invokeSync().first { it.walletId == params.userWalletId }) private var proposalNetwork by Delegates.notNull() private var sessionProposal by Delegates.notNull() - private val additionallyEnabledNetworks = mutableSetOf() + private var additionallyEnabledNetworks = setOf() private val dAppVerifiedStateConverter = WcDAppVerifiedStateConverter(onVerifiedClick = ::showVerifiedAlert) val appInfoUiState: StateFlow @@ -102,7 +99,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 } + additionallyEnabledNetworks = proposalNetwork.available appInfoUiState.transformerUpdate( WcAppInfoTransformer( dAppSession = sessionProposal, @@ -127,6 +124,7 @@ internal class WcPairModel @Inject constructor( }, userWallet = selectedUserWalletFlow.value, proposalNetwork = proposalNetwork, + additionallyEnabledNetworks = additionallyEnabledNetworks, ), ) } @@ -154,7 +152,7 @@ internal class WcPairModel @Inject constructor( private fun connect() { val enabledAvailableNetworks = - proposalNetwork.available.filter { network -> network.id.rawId in additionallyEnabledNetworks } + proposalNetwork.available.filter { network -> network in additionallyEnabledNetworks } wcPairUseCase.approve( WcSessionApprove( wallet = selectedUserWalletFlow.value, @@ -179,14 +177,25 @@ internal class WcPairModel @Inject constructor( val selectedUserWallet = sessionProposal.proposalNetwork.keys.first { it.walletId == userWalletId } proposalNetwork = sessionProposal.proposalNetwork.getValue(selectedUserWallet) selectedUserWalletFlow.update { selectedUserWallet } - appInfoUiState.transformerUpdate(WcAppInfoWalletChangedTransformer(selectedUserWallet, proposalNetwork)) - additionallyEnabledNetworks.clear() - proposalNetwork.available.mapTo(additionallyEnabledNetworks) { it.id.rawId } + additionallyEnabledNetworks = proposalNetwork.available + appInfoUiState.transformerUpdate( + WcAppInfoWalletChangedTransformer( + selectedUserWallet = selectedUserWallet, + proposalNetwork = proposalNetwork, + additionallyEnabledNetworks = additionallyEnabledNetworks, + ), + ) } - override fun onNetworksSelected(selectedNetworks: Set) { - additionallyEnabledNetworks.clear() - additionallyEnabledNetworks.addAll(selectedNetworks) + override fun onNetworksSelected(selectedNetworks: Set) { + additionallyEnabledNetworks = selectedNetworks + appInfoUiState.transformerUpdate( + WcNetworksSelectedTransformer( + missingNetworks = proposalNetwork.missingRequired, + requiredNetworks = proposalNetwork.required, + additionallyEnabledNetworks = additionallyEnabledNetworks, + ), + ) } private fun createLoadingState(): WcAppInfoUM.Loading { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcSelectNetworksModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcSelectNetworksModel.kt index ba3466ee86..c7e1f38b60 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcSelectNetworksModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/WcSelectNetworksModel.kt @@ -29,7 +29,7 @@ internal class WcSelectNetworksModel @Inject constructor( ) : Model() { private val params = paramsContainer.require() - private val additionallyEnabledNetworks = MutableStateFlow>( + private val additionallyEnabledNetworks = MutableStateFlow>( filterAdditionallyEnabledNetworks( availableNetworks = params.availableNetworks, additionallyEnabledNetworks = params.enabledAvailableNetworks, @@ -39,11 +39,11 @@ internal class WcSelectNetworksModel @Inject constructor( val state: StateFlow field = MutableStateFlow(getInitialState()) - private fun onCheckedChange(isChecked: Boolean, networkId: String) { + private fun onCheckedChange(isChecked: Boolean, network: Network) { additionallyEnabledNetworks.update { - if (isChecked) it.plus(Network.RawID(networkId)) else it.minus(Network.RawID(networkId)) + if (isChecked) it.plus(network) else it.minus(network) } - state.update(WcSelectNetworksCheckedTransformer(networkId, isChecked)) + state.update(WcSelectNetworksCheckedTransformer(network = network, isChecked = isChecked)) } private fun onDone() { @@ -53,12 +53,9 @@ internal class WcSelectNetworksModel @Inject constructor( private fun filterAdditionallyEnabledNetworks( availableNetworks: Set, - additionallyEnabledNetworks: Set, - ): Set { - return availableNetworks - .asSequence() - .filter { it.id.rawId in additionallyEnabledNetworks } - .mapTo(hashSetOf()) { it.id.rawId } + additionallyEnabledNetworks: Set, + ): Set { + return availableNetworks.filterTo(hashSetOf()) { it in additionallyEnabledNetworks } } private fun getInitialState(): WcSelectNetworksUM { @@ -85,8 +82,8 @@ internal class WcSelectNetworksModel @Inject constructor( icon = network.iconResId, name = network.name, symbol = network.currencySymbol, - checked = network.id.rawId in additionallyEnabledNetworks.value, - onCheckedChange = { onCheckedChange(it, network.rawId) }, + checked = network in additionallyEnabledNetworks.value, + onCheckedChange = { onCheckedChange(it, network) }, ) }.toImmutableList(), notAdded = params.notAddedNetworks.map { network -> diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoTransformer.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoTransformer.kt index 99bd7fa6f0..61d9f198d0 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoTransformer.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoTransformer.kt @@ -1,6 +1,7 @@ package com.tangem.features.walletconnect.connections.model.transformers import com.domain.blockaid.models.dapp.CheckDAppResult +import com.tangem.domain.models.network.Network import com.tangem.domain.walletconnect.model.WcSessionProposal import com.tangem.domain.wallets.models.UserWallet import com.tangem.features.walletconnect.connections.entity.WcAppInfoSecurityNotification @@ -18,6 +19,7 @@ internal class WcAppInfoTransformer( private val onNetworksClick: () -> Unit, private val userWallet: UserWallet, private val proposalNetwork: WcSessionProposal.ProposalNetwork, + private val additionallyEnabledNetworks: Set, ) : Transformer { override fun transform(prevState: WcAppInfoUM): WcAppInfoUM { @@ -31,7 +33,13 @@ internal class WcAppInfoTransformer( notification = createNotification(dAppSession.securityStatus), walletName = userWallet.name, onWalletClick = onWalletClick, - networksInfo = WcNetworksInfoConverter.convert(proposalNetwork), + networksInfo = WcNetworksInfoConverter.convert( + value = WcNetworksInfoConverter.Input( + missingNetworks = proposalNetwork.missingRequired, + requiredNetworks = proposalNetwork.required, + additionallyEnabledNetworks = additionallyEnabledNetworks, + ), + ), onNetworksClick = onNetworksClick, connectButtonConfig = WcPrimaryButtonConfig( showProgress = false, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoWalletChangedTransformer.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoWalletChangedTransformer.kt index 453ab9b608..21be3da5a5 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoWalletChangedTransformer.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcAppInfoWalletChangedTransformer.kt @@ -1,5 +1,6 @@ package com.tangem.features.walletconnect.connections.model.transformers +import com.tangem.domain.models.network.Network import com.tangem.domain.walletconnect.model.WcSessionProposal import com.tangem.domain.wallets.models.UserWallet import com.tangem.features.walletconnect.connections.entity.WcAppInfoUM @@ -8,12 +9,19 @@ import com.tangem.utils.transformer.Transformer internal class WcAppInfoWalletChangedTransformer( private val selectedUserWallet: UserWallet, private val proposalNetwork: WcSessionProposal.ProposalNetwork, + private val additionallyEnabledNetworks: Set, ) : Transformer { override fun transform(prevState: WcAppInfoUM): WcAppInfoUM { val contentState = prevState as? WcAppInfoUM.Content ?: return prevState return contentState.copy( walletName = selectedUserWallet.name, - networksInfo = WcNetworksInfoConverter.convert(proposalNetwork), + networksInfo = WcNetworksInfoConverter.convert( + WcNetworksInfoConverter.Input( + missingNetworks = proposalNetwork.missingRequired, + requiredNetworks = proposalNetwork.required, + additionallyEnabledNetworks = additionallyEnabledNetworks, + ), + ), connectButtonConfig = prevState.connectButtonConfig.copy( enabled = proposalNetwork.missingRequired.isEmpty(), ), diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksInfoConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksInfoConverter.kt index 85af70aefa..26934b08b7 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksInfoConverter.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksInfoConverter.kt @@ -1,22 +1,21 @@ package com.tangem.features.walletconnect.connections.model.transformers import com.tangem.core.ui.extensions.iconResId -import com.tangem.domain.walletconnect.model.WcSessionProposal +import com.tangem.domain.models.network.Network import com.tangem.features.walletconnect.connections.entity.WcNetworkInfoItem import com.tangem.features.walletconnect.connections.entity.WcNetworksInfo import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.toImmutableList -internal object WcNetworksInfoConverter : Converter { - override fun convert(value: WcSessionProposal.ProposalNetwork): WcNetworksInfo { - return if (value.missingRequired.isNotEmpty()) { +internal object WcNetworksInfoConverter : Converter { + override fun convert(value: Input): WcNetworksInfo { + return if (value.missingNetworks.isNotEmpty()) { WcNetworksInfo.MissingRequiredNetworkInfo( - networks = value.missingRequired - .joinToString { it.name }, + networks = value.missingNetworks.joinToString { it.name }, ) } else { WcNetworksInfo.ContainsAllRequiredNetworks( - items = (value.required + value.available) + items = (value.requiredNetworks + value.additionallyEnabledNetworks) .map { WcNetworkInfoItem.Required( id = it.rawId, @@ -29,4 +28,10 @@ internal object WcNetworksInfoConverter : Converter, + val requiredNetworks: Set, + val additionallyEnabledNetworks: Set, + ) } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksSelectedTransformer.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksSelectedTransformer.kt new file mode 100644 index 0000000000..ee953b6130 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcNetworksSelectedTransformer.kt @@ -0,0 +1,28 @@ +package com.tangem.features.walletconnect.connections.model.transformers + +import com.tangem.domain.models.network.Network +import com.tangem.features.walletconnect.connections.entity.WcAppInfoUM +import com.tangem.utils.transformer.Transformer + +internal class WcNetworksSelectedTransformer( + private val missingNetworks: Set, + private val requiredNetworks: Set, + private val additionallyEnabledNetworks: Set, +) : Transformer { + override fun transform(prevState: WcAppInfoUM): WcAppInfoUM { + val contentState = prevState as? WcAppInfoUM.Content ?: return prevState + return contentState.copy( + connectButtonConfig = contentState.connectButtonConfig.copy( + enabled = missingNetworks.isEmpty() && + (requiredNetworks.isNotEmpty() || additionallyEnabledNetworks.isNotEmpty()), + ), + networksInfo = WcNetworksInfoConverter.convert( + value = WcNetworksInfoConverter.Input( + missingNetworks = missingNetworks, + requiredNetworks = requiredNetworks, + additionallyEnabledNetworks = additionallyEnabledNetworks, + ), + ), + ) + } +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcSelectNetworksCheckedTransformer.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcSelectNetworksCheckedTransformer.kt index 582c0465dd..c8901e01b8 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcSelectNetworksCheckedTransformer.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/model/transformers/WcSelectNetworksCheckedTransformer.kt @@ -1,17 +1,18 @@ package com.tangem.features.walletconnect.connections.model.transformers +import com.tangem.domain.models.network.Network import com.tangem.features.walletconnect.connections.entity.WcSelectNetworksUM import com.tangem.utils.transformer.Transformer import kotlinx.collections.immutable.toImmutableList internal class WcSelectNetworksCheckedTransformer( - private val networkId: String, + private val network: Network, private val isChecked: Boolean, ) : Transformer { override fun transform(prevState: WcSelectNetworksUM): WcSelectNetworksUM { return prevState.copy( available = prevState.available - .map { item -> if (item.id == networkId) item.copy(checked = isChecked) else item } + .map { item -> if (item.id == network.rawId) item.copy(checked = isChecked) else item } .toImmutableList(), ) } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routes/WcAppInfoRoutes.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routes/WcAppInfoRoutes.kt index 9732c1e0aa..6c83d5ac07 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routes/WcAppInfoRoutes.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routes/WcAppInfoRoutes.kt @@ -21,7 +21,7 @@ internal sealed class WcAppInfoRoutes : TangemBottomSheetConfigContent, Route { val missingRequiredNetworks: Set, val requiredNetworks: Set, val availableNetworks: Set, - val enabledAvailableNetworks: Set, + val enabledAvailableNetworks: Set, val notAddedNetworks: Set, ) : WcAppInfoRoutes()