Updated on 2026-08-14

This commit is contained in:
Tangem 2025-05-27 23:14:13 +05:00
parent 81b030fd0d
commit 7925f2d66c
8 changed files with 32 additions and 41 deletions

View file

@ -26,7 +26,7 @@ internal data class WcConnectionsUM(
internal data class WcConnectedAppInfo(
val name: String,
val iconUrl: String,
val verifiedState: VerifiedDAppState,
val subtitle: TextReference = stringReference("Connected App"),
val isVerified: Boolean = false,
val onClick: () -> Unit,
)

View file

@ -82,7 +82,6 @@ internal class WcConnectedAppInfoModel @Inject constructor(
}
private fun extractVerifiedState(session: WcSession): VerifiedDAppState {
return VerifiedDAppState.Verified(onVerifiedClick = {})
return if (session.securityStatus == CheckDAppResult.SAFE) {
VerifiedDAppState.Verified(onVerifiedClick = {})
} else {

View file

@ -26,7 +26,8 @@ internal class WcSessionsTransformer(
name = appMetaData.name,
iconUrl = appMetaData.icons.firstOrNull().orEmpty(),
subtitle = stringReference(appMetaData.description),
isVerified = false,
verifiedState = WcDAppVerifiedStateConverter {}
.convert(session.securityStatus to appMetaData.name),
onClick = { openAppInfoModal(session) },
)
}

View file

@ -4,6 +4,7 @@ import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM
import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenuItem
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.walletconnect.connections.entity.VerifiedDAppState
import com.tangem.features.walletconnect.connections.entity.WcConnectedAppInfo
import com.tangem.features.walletconnect.connections.entity.WcConnectionsState
import com.tangem.features.walletconnect.connections.entity.WcConnectionsTopAppBarConfig
@ -22,13 +23,14 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "Moralis",
iconUrl = "$BASE_URL/satoshi.png",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
onClick = { Timber.d("Moralis clicked") },
),
WcConnectedAppInfo(
name = "website.com",
iconUrl = "$BASE_URL/doge_again_lol.jpg",
onClick = { Timber.d("website.com clicked") },
verifiedState = VerifiedDAppState.Unknown,
),
),
),
@ -39,7 +41,7 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "React app",
iconUrl = "$BASE_URL/LiteCoin.png",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
onClick = { Timber.d("React app clicked") },
),
),
@ -51,12 +53,13 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "Moralis",
iconUrl = "$BASE_URL/satoshi.png",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
onClick = { Timber.d("Moralis clicked") },
),
WcConnectedAppInfo(
name = "website.com",
iconUrl = "$BASE_URL/doge_again_lol.jpg",
verifiedState = VerifiedDAppState.Unknown,
onClick = { Timber.d("website.com clicked") },
),
),
@ -68,8 +71,8 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "React app",
iconUrl = "$BASE_URL/LiteCoin.png",
isVerified = true,
onClick = { Timber.d("React app clicked") },
verifiedState = VerifiedDAppState.Verified {},
),
),
),
@ -80,13 +83,14 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "Moralis",
iconUrl = "$BASE_URL/satoshi.png",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
onClick = { Timber.d("Moralis clicked") },
),
WcConnectedAppInfo(
name = "website.com",
iconUrl = "$BASE_URL/doge_again_lol.jpg",
onClick = { Timber.d("website.com clicked") },
verifiedState = VerifiedDAppState.Unknown,
),
),
),
@ -97,7 +101,7 @@ internal object WcConnectionsPreviewData {
WcConnectedAppInfo(
name = "React app",
iconUrl = "$BASE_URL/LiteCoin.png",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
onClick = { Timber.d("React app clicked") },
),
),

View file

@ -40,6 +40,7 @@ internal class WcAddNetworkModel @Inject constructor(
val useCase: WcMethodUseCase = useCaseFactory.createUseCase(params.rawRequest)
val transactionUM = (useCase as? WcAddNetworkUseCase)?.toUM(
actions = WcTransactionActionsUM(
onShowVerifiedAlert = ::showVerifiedAlert,
onDismiss = { cancel(useCase) },
onSign = { sign(useCase) },
onCopy = { copyData(useCase.rawSdkRequest.request.params) },
@ -53,6 +54,12 @@ internal class WcAddNetworkModel @Inject constructor(
_uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop()
}
@Suppress("UnusedPrivateMember")
private fun showVerifiedAlert(appName: String) {
// TODO(wc): Nastya [REDACTED_JIRA] // see WcPairComponent and WcPairModel
// router.push(WcAppInfoRoutes.Alert(elements = message.elements))
}
private fun sign(useCase: WcAddNetworkUseCase) {
modelScope.launch {
_uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = true)) }

View file

@ -5,16 +5,7 @@ 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.R
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2
import com.tangem.core.ui.components.bottomsheets.message.icon
import com.tangem.core.ui.components.bottomsheets.message.infoBlock
import com.tangem.core.ui.components.bottomsheets.message.messageBottomSheetUM
import com.tangem.core.ui.components.bottomsheets.message.onClick
import com.tangem.core.ui.components.bottomsheets.message.secondaryButton
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.walletconnect.WcRequestUseCaseFactory
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
@ -71,22 +62,9 @@ internal class WcSignTransactionModel @Inject constructor(
_uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop()
}
@Suppress("UnusedPrivateMember")
private fun showVerifiedAlert(appName: String) {
val message = messageBottomSheetUM {
infoBlock {
icon(R.drawable.img_approvale2_20) {
type = MessageBottomSheetUMV2.Icon.Type.Accent
backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.Unspecified
}
title = resourceReference(R.string.wc_alert_verified_domain_title)
body = resourceReference(R.string.wc_alert_verified_domain_description, wrappedList(appName))
}
secondaryButton {
text = resourceReference(R.string.common_done)
onClick { closeBs() }
}
}
// TODO(wc): Nastya [REDACTED_JIRA]
// TODO(wc): Nastya [REDACTED_JIRA] // see WcPairComponent and WcPairModel
// router.push(WcAppInfoRoutes.Alert(elements = message.elements))
}

View file

@ -23,6 +23,7 @@ import com.tangem.core.ui.components.divider.DividerWithPadding
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.walletconnect.connections.entity.VerifiedDAppState
import com.tangem.features.walletconnect.connections.ui.WcAppInfoItem
import com.tangem.features.walletconnect.impl.R
import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangeUM
@ -74,7 +75,7 @@ internal fun WcSendTransactionModalBottomSheet(
iconUrl = state.appInfo.appIcon,
title = state.appInfo.appName,
subtitle = state.appInfo.appSubtitle,
isVerified = state.appInfo.isVerified,
verifiedDAppState = state.appInfo.verifiedState,
)
DividerWithPadding(start = 0.dp, end = 0.dp)
WcTransactionRequestItem(
@ -147,7 +148,7 @@ private class WcSendTransactionStateProvider : CollectionPreviewParameterProvide
appInfo = WcTransactionAppInfoContentUM(
appName = "React App",
appIcon = "",
isVerified = true,
verifiedState = VerifiedDAppState.Verified {},
appSubtitle = "react-app.walletconnect.com",
),
estimatedWalletChanges = WcEstimatedWalletChangesUM(

View file

@ -1,12 +1,13 @@
package com.tangem.features.walletconnect.transaction.utils
import com.domain.blockaid.models.dapp.CheckDAppResult
import com.tangem.core.ui.extensions.getActiveIconRes
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.walletconnect.model.WcEthMethod
import com.tangem.domain.walletconnect.model.WcSolanaMethod
import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest
import com.tangem.domain.walletconnect.usecase.method.WcAddNetworkUseCase
import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase
import com.tangem.domain.walletconnect.usecase.method.WcMethodContext
import com.tangem.domain.walletconnect.usecase.method.WcSignState
import com.tangem.domain.walletconnect.usecase.method.WcSignStep
import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase
@ -25,7 +26,7 @@ internal fun WcAddNetworkUseCase.toUM(actions: WcTransactionActionsUM): WcAddEth
transaction = WcAddEthereumChainItemUM(
onDismiss = actions.onDismiss,
onSign = actions.onSign,
appInfo = appInfo(),
appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert),
walletName = session.wallet.name,
isLoading = false,
),
@ -65,7 +66,7 @@ private fun WcMessageSignUseCase.signTypedDataToUM(
transaction = WcSignTransactionItemUM(
onDismiss = actions.onDismiss,
onSign = actions.onSign,
appInfo = appInfo(),
appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert),
walletName = session.wallet.name,
networkInfo = networkInfo(),
addressText = walletAddress.toShortAddressText(),
@ -106,7 +107,7 @@ private fun WcMessageSignUseCase.messageSignToUM(
transaction = WcSignTransactionItemUM(
onDismiss = actions.onDismiss,
onSign = actions.onSign,
appInfo = appInfo(),
appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert),
walletName = session.wallet.name,
networkInfo = networkInfo(),
isLoading = signState.domainStep == WcSignStep.Signing,
@ -150,10 +151,10 @@ private fun WcMethodContext.basicTransactionRequestInfoBlocks() = persistentList
),
)
private fun WcMethodContext.appInfo() = WcTransactionAppInfoContentUM(
private fun WcMethodContext.appInfo(onShowVerifiedAlert: (String) -> Unit) = WcTransactionAppInfoContentUM(
appName = session.sdkModel.appMetaData.name,
appIcon = session.sdkModel.appMetaData.url,
verifiedState = WcDAppVerifiedStateConverter(onVerifiedClick = actions.onShowVerifiedAlert).convert(
verifiedState = WcDAppVerifiedStateConverter(onVerifiedClick = onShowVerifiedAlert).convert(
session.securityStatus to session.sdkModel.appMetaData.name,
),
appSubtitle = session.sdkModel.appMetaData.description,