Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-03 14:49:04 +04:00
parent 03691635a2
commit e2b489f0b9
20 changed files with 144 additions and 637 deletions

View file

@ -27,12 +27,10 @@
<ID>MultilineLambdaItParameter:WcSwitchNetworkModel.kt$WcSwitchNetworkModel${ if (it.isExistInWcSession) { router.pop() } else { showErrorDialog(HandleMethodError.RequiredNetwork(it.network.name)) } }</ID>
<ID>NamedArguments:WcAddEthereumChainModalBottomSheetContent.kt$WcAddEthereumChainModalBottomSheetContent(state, {}, {}, {})</ID>
<ID>NamedArguments:WcAlertsFactory.kt$WcAlertsFactory$createMaliciousDAppAlert(alertType.description, alertType.onClick, alertType.iconType, alertType.iconBgType)</ID>
<ID>NamedArguments:WcPairModel.kt$WcPairModel$handlePairState( pairState, portfolios, selected, isAccountMode, )</ID>
<ID>NamedArguments:WcSendTransactionModel.kt$WcSendTransactionModel$buildUiState(securityCheck, useCase, signState, isApprovalMethod)</ID>
<ID>NestedScopeFunctions:WcSendAndReceiveBlockAidUiConverter.kt$WcSendAndReceiveBlockAidUiConverter$let { spendAllowanceUMConverter.convert( WcSpendAllowanceUMConverter.Input( approvedAmount = it, onLearnMoreClick = value.onApproveLearnMoreClick, ), ) }</ID>
<ID>NoNameShadowing:WcNavigationUtils.kt$model</ID>
<ID>NullCheckOnMutableProperty:WcCommonTransactionComponentDelegate.kt$WcCommonTransactionComponentDelegate$if (contentStack != null) { val content by contentStack!!.subscribeAsState() BackHandler(onBack = ::onChildBack) content.active.instance.BottomSheet() }</ID>
<ID>NullableBooleanCheck:WcPairModel.kt$WcPairModel$isAccountMode ?: false</ID>
<ID>NullableToStringCall:WcEstimatedWalletChangeUMConverter.kt$WcEstimatedWalletChangeUMConverter$${value.sign}</ID>
<ID>ReusedModifierInstance:DefaultWalletConnectEntryComponent.kt$DefaultWalletConnectEntryComponent$Content(modifier = modifier)</ID>
<ID>ReusedModifierInstance:WcAppInfoBS.kt$Box( modifier = modifier .padding(start = 48.dp) .border( width = 2.dp, color = TangemTheme.colors.background.action, shape = CircleShape, ) .padding(2.dp) .background(color = TangemTheme.colors.background.action) .size(20.dp) .clip(CircleShape) .background(color = TangemTheme.colors.icon.primary1.copy(alpha = 0.1F)), ) { Text( modifier = Modifier.align(Alignment.Center), text = "+$remainingCount", style = TangemTheme.typography.overline, color = TangemTheme.colors.text.secondary, ) }</ID>
@ -46,7 +44,6 @@
<ID>UnsafeCallOnNullableType:WcPairComponent.kt$WcPairComponent$model.portfolioFetcher!!</ID>
<ID>UnsafeCallOnNullableType:WcSignTransactionComponent.kt$WcSignTransactionComponent$content!!</ID>
<ID>UnsafeCallOnNullableType:WcTransactionRequestInfoComponent.kt$WcTransactionRequestInfoComponent$content!!</ID>
<ID>UseEmptyCounterpart:WcPairModel.kt$WcPairModel$setOf&lt;Network&gt;()</ID>
<ID>UseOrEmpty:WcSpendAllowanceUMConverter.kt$WcSpendAllowanceUMConverter$value.approvedAmount.amount?.currencySymbol ?: ""</ID>
<ID>UseOrEmpty:WcTransactionCheckErrorItem.kt$notification.text?.resolveReference() ?: ""</ID>
</CurrentIssues>

View file

@ -15,11 +15,9 @@ import com.tangem.core.decompose.navigation.inner.InnerRouter
import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
import com.tangem.core.ui.decompose.ComposableContentComponent
import com.tangem.domain.walletconnect.model.WcPairRequest
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.walletconnect.model.WcPairRequest
import com.tangem.features.account.PortfolioSelectorComponent
import com.tangem.features.walletconnect.connections.components.WcSelectNetworksComponent.*
import com.tangem.features.walletconnect.connections.components.WcSelectWalletComponent.*
import com.tangem.features.walletconnect.connections.model.WcPairModel
import com.tangem.features.walletconnect.connections.routes.WcAppInfoRoutes
import com.tangem.features.walletconnect.connections.routes.WcAppInfoRoutes.Alert
@ -115,7 +113,7 @@ internal class WcPairComponent(
WcAppInfoRoutes.PortfolioSelector -> portfolioSelectorComponentFactory.create(
context = appComponentContext,
params = PortfolioSelectorComponent.Params(
portfolioFetcher = model.portfolioFetcher!!,
portfolioFetcher = model.portfolioFetcher,
bsCallback = model.portfolioSelectorCallback,
controller = model.selectorController,
),

View file

@ -18,7 +18,6 @@ import com.tangem.core.ui.message.DialogMessage
import com.tangem.core.ui.message.EventMessageAction
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.core.ui.res.TangemTheme
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.account.supplier.MultiAccountListSupplier
import com.tangem.domain.account.usecase.IsAccountsModeEnabledUseCase
import com.tangem.domain.qrscanning.models.QrResultSource
@ -55,7 +54,6 @@ internal class WcConnectionsModel @Inject constructor(
private val wcDisconnectUseCase: WcDisconnectUseCase,
private val multiAccountListSupplier: MultiAccountListSupplier,
private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase,
accountsFeatureToggles: AccountsFeatureToggles,
private val wcPairService: WcPairService,
override val dispatchers: CoroutineDispatcherProvider,
analytics: AnalyticsEventHandler,
@ -70,11 +68,7 @@ internal class WcConnectionsModel @Inject constructor(
init {
analytics.send(WcAnalyticEvents.ScreenOpened())
listenQrUpdates()
if (accountsFeatureToggles.isFeatureEnabled) {
listenWcSessions()
} else {
listenWcSessionsOld()
}
listenWcSessions()
}
private fun listenQrUpdates() {
@ -98,21 +92,6 @@ internal class WcConnectionsModel @Inject constructor(
.launchIn(modelScope)
}
private fun listenWcSessionsOld() {
wcSessionsUseCase.invoke()
.conflate()
.distinctUntilChanged()
.onEach { sessionsMap ->
uiState.update(
WcSessionsTransformer(
sessionsMap = sessionsMap,
openAppInfoModal = ::openAppInfoModal,
),
)
}
.launchIn(modelScope)
}
private fun listenWcSessions() {
combine(
flow = wcSessionsUseCase.invoke().distinctUntilChanged(),

View file

@ -21,7 +21,6 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.core.ui.message.ToastMessage
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.account.producer.SingleAccountListProducer
import com.tangem.domain.account.supplier.SingleAccountListSupplier
import com.tangem.domain.account.usecase.IsAccountsModeEnabledUseCase
@ -75,7 +74,6 @@ internal class WcPairModel @Inject constructor(
private val messageSender: UiMessageSender,
override val dispatchers: CoroutineDispatcherProvider,
private val analytics: AnalyticsEventHandler,
private val accountsFeatureToggles: AccountsFeatureToggles,
val selectorController: PortfolioSelectorController,
private val singleAccountListSupplier: SingleAccountListSupplier,
private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase,
@ -95,7 +93,10 @@ internal class WcPairModel @Inject constructor(
)
val stackNavigation = StackNavigation<WcAppInfoRoutes>()
val portfolioFetcher: PortfolioFetcher?
val portfolioFetcher: PortfolioFetcher = portfolioFetcherFactory.create(
mode = PortfolioFetcher.Mode.All(isOnlyMultiCurrency = true),
scope = modelScope,
)
val portfolioSelectorCallback = object : PortfolioSelectorComponent.BottomSheetCallback {
override val onDismiss: () -> Unit = { stackNavigation.pop() }
override val onBack: () -> Unit = { stackNavigation.pop() }
@ -110,32 +111,23 @@ internal class WcPairModel @Inject constructor(
)
private var proposalNetwork by Delegates.notNull<WcSessionProposal.ProposalNetwork>()
private var sessionProposal by Delegates.notNull<WcSessionProposal>()
private var additionallyEnabledNetworks = setOf<Network>()
private var additionallyEnabledNetworks = emptySet<Network>()
private val dAppVerifiedStateConverter = WcDAppVerifiedStateConverter(onVerifiedClick = ::showVerifiedAlert)
val appInfoUiState: StateFlow<WcAppInfoUM>
field = MutableStateFlow<WcAppInfoUM>(createLoadingState())
init {
if (accountsFeatureToggles.isFeatureEnabled) {
portfolioFetcher = portfolioFetcherFactory.create(
mode = PortfolioFetcher.Mode.All(isOnlyMultiCurrency = true),
scope = modelScope,
)
modelScope.launch {
val params = SingleAccountListProducer.Params(params.userWalletId)
val accountList = singleAccountListSupplier.getSyncOrNull(params)
if (accountList == null) {
router.pop()
return@launch
}
val firstAccount = accountList.accounts.first()
selectorController.selectAccount(firstAccount.accountId)
combineFlows(portfolioFetcher)
modelScope.launch {
val params = SingleAccountListProducer.Params(params.userWalletId)
val accountList = singleAccountListSupplier.getSyncOrNull(params)
if (accountList == null) {
router.pop()
return@launch
}
} else {
portfolioFetcher = null
loadDAppInfo()
val firstAccount = accountList.accounts.first()
selectorController.selectAccount(firstAccount.accountId)
combineFlows(portfolioFetcher)
}
}
@ -151,22 +143,16 @@ internal class WcPairModel @Inject constructor(
flow4 = isAccountsModeEnabledUseCase(),
transform = { portfolios, selected, pairState, isAccountMode ->
handlePairState(
pairState,
portfolios,
selected,
isAccountMode,
pairState = pairState,
portfolios = portfolios,
selected = selected,
isAccountMode = isAccountMode,
)
},
)
.launchIn(modelScope)
}
private fun loadDAppInfo() {
wcPairUseCase()
.onEach { pairState -> handlePairState(pairState) }
.launchIn(modelScope)
}
private suspend fun handlePairState(
pairState: WcPairState,
portfolios: PortfolioFetcher.Data? = null,
@ -193,7 +179,7 @@ internal class WcPairModel @Inject constructor(
)
processError(pairState.error)
}
is WcPairState.Loading -> appInfoUiState.update { createLoadingState(isAccountMode ?: false) }
is WcPairState.Loading -> appInfoUiState.update { createLoadingState(isAccountMode == true) }
is WcPairState.Proposal -> handleProposalState(
pairState = pairState,
portfolios = portfolios,
@ -225,7 +211,7 @@ internal class WcPairModel @Inject constructor(
} else {
val portfolioSelectRow = tryToCreatePortfolioSelectRow(selected, portfolios)
if (proposalAccountNetwork != null) {
selectorController.isEnabled.value = { wallet, account ->
selectorController.isEnabled.value = { _, account ->
proposalAccountNetwork.contains(account.account.accountId)
}
}