From ab31d57fa5a75904a64c7cb5dbe82e90c145a67d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 3 Jun 2025 19:35:11 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../connections/utils/WcAlertsFactory.kt | 27 ++- .../components/chain/WcAddNetworkComponent.kt | 6 +- .../chain/WcAddNetworkContainerComponent.kt | 76 ++------ .../WcCommonTransactionComponentDelegate.kt | 67 +++++++ .../components/common/WcNavigationUtils.kt | 27 +++ .../WcTransactionRequestInfoComponent.kt | 18 +- .../send/WcSendTransactionComponent.kt | 6 +- .../WcSendTransactionContainerComponent.kt | 80 +++------ .../sign/WcSignTransactionComponent.kt | 6 +- .../WcSignTransactionContainerComponent.kt | 70 +++----- ...icTransactionRequestInfoBlocksConverter.kt | 30 ++++ .../WcAddEthereumChainUMConverter.kt | 41 +++++ .../WcCommonTransactionUMConverter.kt | 50 ++++++ .../converter/WcNetworkInfoUMConverter.kt | 15 ++ .../converter/WcSignTransactionUMConverter.kt | 50 ++++++ .../converter/WcSignTypedDataUMConverter.kt | 84 +++++++++ .../WcTransactionAppInfoContentUMConverter.kt | 25 +++ .../WcTransactionRequestBlockUMConverter.kt | 33 ++++ .../entity/chain/WcAddEthereumChainUM.kt | 5 +- .../entity/common/WcCommonTransactionModel.kt | 10 ++ .../entity/common/WcCommonTransactionUM.kt | 6 + .../entity/send/WcSendTransactionUM.kt | 5 +- .../entity/sign/WcSignTransactionUM.kt | 5 +- .../transaction/model/WcAddNetworkModel.kt | 44 +++-- .../model/WcSendTransactionModel.kt | 84 ++++++++- .../model/WcSignTransactionModel.kt | 46 +++-- .../transaction/routes/WcTransactionRoutes.kt | 10 ++ .../transaction/utils/WalletAddressUtils.kt | 7 - .../transaction/utils/WcTransactionUtils.kt | 166 ------------------ 29 files changed, 689 insertions(+), 410 deletions(-) create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcCommonTransactionComponentDelegate.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcNavigationUtils.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/BasicTransactionRequestInfoBlocksConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcAddEthereumChainUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcCommonTransactionUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcNetworkInfoUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTransactionUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTypedDataUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionAppInfoContentUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionModel.kt create mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionUM.kt delete mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WalletAddressUtils.kt delete mode 100644 features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt index 26667e4fe2..e9ab26ccf8 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/utils/WcAlertsFactory.kt @@ -4,10 +4,17 @@ import com.tangem.core.ui.R import com.tangem.core.ui.components.bottomsheets.message.* import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.wrappedList +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes internal object WcAlertsFactory { - fun createUnknownDomainAlert(onClick: () -> Unit): MessageBottomSheetUMV2 { + internal fun createCommonTransactionAppInfoAlertUM(alertType: WcTransactionRoutes.Alert.Type) = when (alertType) { + is WcTransactionRoutes.Alert.Type.Verified -> createVerifiedDomainAlert(alertType.appName) + is WcTransactionRoutes.Alert.Type.UnknownDomain -> createUnknownDomainAlert() + is WcTransactionRoutes.Alert.Type.UnsafeDomain -> createUnsafeDomainAlert() + } + + fun createUnknownDomainAlert(activeButtonOnClick: (() -> Unit)? = null): MessageBottomSheetUMV2 { return messageBottomSheetUM { infoBlock { icon(R.drawable.img_knight_shield_32) { @@ -24,14 +31,16 @@ internal object WcAlertsFactory { text = resourceReference(R.string.common_cancel) onClick { closeBs() } } - secondaryButton { - text = resourceReference(R.string.wc_alert_connect_anyway) - onClick { onClick() } + if (activeButtonOnClick != null) { + secondaryButton { + text = resourceReference(R.string.wc_alert_connect_anyway) + onClick { activeButtonOnClick() } + } } } } - fun createUnsafeDomainAlert(onClick: () -> Unit): MessageBottomSheetUMV2 { + fun createUnsafeDomainAlert(activeButtonOnClick: (() -> Unit)? = null): MessageBottomSheetUMV2 { return messageBottomSheetUM { infoBlock { icon(R.drawable.img_knight_shield_32) { @@ -48,9 +57,11 @@ internal object WcAlertsFactory { text = resourceReference(R.string.common_cancel) onClick { closeBs() } } - secondaryButton { - text = resourceReference(R.string.wc_alert_connect_anyway) - onClick { onClick() } + if (activeButtonOnClick != null) { + secondaryButton { + text = resourceReference(R.string.wc_alert_connect_anyway) + onClick { activeButtonOnClick() } + } } } } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkComponent.kt index f7242b0263..c72342cf06 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkComponent.kt @@ -11,12 +11,10 @@ import com.tangem.features.walletconnect.transaction.ui.chain.WcAddEthereumChain internal class WcAddNetworkComponent( private val appComponentContext: AppComponentContext, private val model: WcAddNetworkModel, - private val transactionInfoOnClick: () -> Unit, - private val onDismiss: () -> Unit, ) : AppComponentContext by appComponentContext, ComposableBottomSheetComponent { override fun dismiss() { - onDismiss() + model.dismiss() } @Composable @@ -26,7 +24,7 @@ internal class WcAddNetworkComponent( if (content != null) { WcAddEthereumChainModalBottomSheetContent( state = content!!.transaction, - onClickTransactionRequest = transactionInfoOnClick, + onClickTransactionRequest = model::showTransactionRequest, onBack = router::pop, onDismiss = ::dismiss, ) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkContainerComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkContainerComponent.kt index e2505f1211..7c9b4b33fc 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkContainerComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/chain/WcAddNetworkContainerComponent.kt @@ -1,66 +1,25 @@ package com.tangem.features.walletconnect.transaction.components.chain -import androidx.activity.compose.BackHandler -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.extensions.compose.subscribeAsState -import com.arkivanov.decompose.router.stack.StackNavigation -import com.arkivanov.decompose.router.stack.childStack -import com.arkivanov.decompose.router.stack.pop -import com.arkivanov.decompose.router.stack.pushNew import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext import com.tangem.core.decompose.model.getOrCreateModel -import com.tangem.core.decompose.navigation.inner.InnerRouter import com.tangem.core.ui.decompose.ComposableBottomSheetComponent -import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.walletconnect.transaction.components.common.WcCommonTransactionComponentDelegate import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams -import com.tangem.features.walletconnect.transaction.components.common.WcTransactionRequestInfoComponent +import com.tangem.features.walletconnect.transaction.components.common.getWcCommonScreen import com.tangem.features.walletconnect.transaction.model.WcAddNetworkModel import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes internal class WcAddNetworkContainerComponent( - private val appComponentContext: AppComponentContext, + appComponentContext: AppComponentContext, params: WcTransactionModelParams, -) : AppComponentContext by appComponentContext, ComposableContentComponent { +) : WcCommonTransactionComponentDelegate(appComponentContext) { - private val contentNavigation = StackNavigation() - private val innerRouter = InnerRouter( - stackNavigation = contentNavigation, - popCallback = { onChildBack() }, - ) private val model: WcAddNetworkModel = getOrCreateModel(params = params) - private val contentStack = childStack( - key = "WcAddNetworkStack", - source = contentNavigation, - serializer = WcTransactionRoutes.serializer(), - initialConfiguration = WcTransactionRoutes.Transaction, - handleBackButton = true, - childFactory = ::screenChild, - ) - @Composable - override fun Content(modifier: Modifier) { - val content by contentStack.subscribeAsState() - BackHandler(onBack = ::onChildBack) - content.active.instance.BottomSheet() - } - - private fun dismiss() { - model.dismiss() - } - - private fun onChildBack() { - when (contentStack.value.active.configuration) { - WcTransactionRoutes.Transaction -> contentNavigation.pop() - WcTransactionRoutes.TransactionRequestInfo -> contentNavigation.pushNew(WcTransactionRoutes.Transaction) - } - } - - private fun toTransactionRequestInfo() { - contentNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + init { + super.init(navigation = model.stackNavigation, screenChild = ::screenChild, screenKey = "WcAddNetworkStack") } private fun screenChild( @@ -68,18 +27,15 @@ internal class WcAddNetworkContainerComponent( componentContext: ComponentContext, ): ComposableBottomSheetComponent { val appComponentContext = childByContext(componentContext = componentContext, router = innerRouter) - return when (config) { - is WcTransactionRoutes.Transaction -> WcAddNetworkComponent( - appComponentContext = childByContext(componentContext), - transactionInfoOnClick = ::toTransactionRequestInfo, - onDismiss = ::dismiss, - model = model, - ) - is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( - appComponentContext = appComponentContext, - onDismiss = ::dismiss, - model = model.uiState.value?.transactionRequestInfo, - ) - } + return getWcCommonScreen( + config = config, + appComponentContext = appComponentContext, + transactionScreenConverter = { createTransactionComponent(appComponentContext) }, + model = model, + ) + } + + private fun createTransactionComponent(appComponentContext: AppComponentContext): WcAddNetworkComponent { + return WcAddNetworkComponent(appComponentContext = appComponentContext, model = model) } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcCommonTransactionComponentDelegate.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcCommonTransactionComponentDelegate.kt new file mode 100644 index 0000000000..0dd02cb797 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcCommonTransactionComponentDelegate.kt @@ -0,0 +1,67 @@ +package com.tangem.features.walletconnect.transaction.components.common + +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import com.arkivanov.decompose.ComponentContext +import com.arkivanov.decompose.extensions.compose.subscribeAsState +import com.arkivanov.decompose.router.stack.ChildStack +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.childStack +import com.arkivanov.decompose.router.stack.pop +import com.arkivanov.decompose.value.Value +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.navigation.inner.InnerRouter +import com.tangem.core.ui.decompose.ComposableBottomSheetComponent +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes + +internal abstract class WcCommonTransactionComponentDelegate( + private val appComponentContext: AppComponentContext, +) : AppComponentContext by appComponentContext, ComposableContentComponent { + + private var stackNavigation: StackNavigation? = null + private var contentStack: Value>? = null + + protected val innerRouter by lazy { + stackNavigation?.let { + InnerRouter(stackNavigation = it, popCallback = { onChildBack() }) + } + } + + protected fun init( + navigation: StackNavigation, + screenChild: (WcTransactionRoutes, ComponentContext) -> ComposableBottomSheetComponent, + screenKey: String, + ) { + stackNavigation = navigation + contentStack = childStack( + key = screenKey, + source = navigation, + serializer = WcTransactionRoutes.serializer(), + initialConfiguration = WcTransactionRoutes.Transaction, + handleBackButton = true, + childFactory = screenChild, + ) + } + + @Composable + override fun Content(modifier: Modifier) { + if (contentStack != null) { + val content by contentStack!!.subscribeAsState() + BackHandler(onBack = ::onChildBack) + content.active.instance.BottomSheet() + } + } + + private fun onChildBack() { + when (contentStack?.value?.active?.configuration) { + is WcTransactionRoutes.Transaction, + is WcTransactionRoutes.TransactionRequestInfo, + is WcTransactionRoutes.Alert, + -> stackNavigation?.pop() + else -> Unit + } + } +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcNavigationUtils.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcNavigationUtils.kt new file mode 100644 index 0000000000..d06bc28646 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcNavigationUtils.kt @@ -0,0 +1,27 @@ +package com.tangem.features.walletconnect.transaction.components.common + +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.ui.decompose.ComposableBottomSheetComponent +import com.tangem.features.walletconnect.connections.components.AlertsComponentV2 +import com.tangem.features.walletconnect.connections.utils.WcAlertsFactory.createCommonTransactionAppInfoAlertUM +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes + +internal fun getWcCommonScreen( + config: WcTransactionRoutes, + appComponentContext: AppComponentContext, + transactionScreenConverter: () -> ComposableBottomSheetComponent, + model: WcCommonTransactionModel, +): ComposableBottomSheetComponent { + return when (config) { + is WcTransactionRoutes.Transaction -> transactionScreenConverter() + is WcTransactionRoutes.Alert -> AlertsComponentV2( + appComponentContext = appComponentContext, + messageUM = createCommonTransactionAppInfoAlertUM(config.type), + ) + is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( + appComponentContext = appComponentContext, + model = model, + ) + } +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcTransactionRequestInfoComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcTransactionRequestInfoComponent.kt index 64dc1eaecb..11d4128967 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcTransactionRequestInfoComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/common/WcTransactionRequestInfoComponent.kt @@ -1,25 +1,31 @@ package com.tangem.features.walletconnect.transaction.components.common import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.ui.decompose.ComposableBottomSheetComponent -import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel import com.tangem.features.walletconnect.transaction.ui.common.TransactionRequestInfoContent internal class WcTransactionRequestInfoComponent( private val appComponentContext: AppComponentContext, - private val model: WcTransactionRequestInfoUM?, - private val onDismiss: () -> Unit, + private val model: WcCommonTransactionModel, ) : AppComponentContext by appComponentContext, ComposableBottomSheetComponent { override fun dismiss() { - onDismiss() + model.dismiss() } @Composable override fun BottomSheet() { - if (model != null) { - TransactionRequestInfoContent(model, onBack = router::pop, onDismiss = ::dismiss) + val content by model.uiState.collectAsStateWithLifecycle() + if (content?.transactionRequestInfo != null) { + TransactionRequestInfoContent( + state = content!!.transactionRequestInfo, + onBack = router::pop, + onDismiss = ::dismiss, + ) } } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionComponent.kt index 7d32b417a6..648dc13467 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionComponent.kt @@ -11,12 +11,10 @@ import com.tangem.features.walletconnect.transaction.ui.send.WcSendTransactionMo internal class WcSendTransactionComponent( private val appComponentContext: AppComponentContext, private val model: WcSendTransactionModel, - private val transactionInfoOnClick: () -> Unit, - private val onDismiss: () -> Unit, ) : AppComponentContext by appComponentContext, ComposableBottomSheetComponent { override fun dismiss() { - onDismiss() + model.dismiss() } @Composable @@ -26,7 +24,7 @@ internal class WcSendTransactionComponent( if (content != null) { WcSendTransactionModalBottomSheet( state = content!!.transaction, - onClickTransactionRequest = transactionInfoOnClick, + onClickTransactionRequest = model::showTransactionRequest, onBack = router::pop, onDismiss = ::dismiss, ) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionContainerComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionContainerComponent.kt index 1a6a505812..420e419ce1 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionContainerComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/send/WcSendTransactionContainerComponent.kt @@ -1,66 +1,29 @@ package com.tangem.features.walletconnect.transaction.components.send -import androidx.activity.compose.BackHandler -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.extensions.compose.subscribeAsState -import com.arkivanov.decompose.router.stack.StackNavigation -import com.arkivanov.decompose.router.stack.childStack -import com.arkivanov.decompose.router.stack.pop -import com.arkivanov.decompose.router.stack.pushNew import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext import com.tangem.core.decompose.model.getOrCreateModel -import com.tangem.core.decompose.navigation.inner.InnerRouter import com.tangem.core.ui.decompose.ComposableBottomSheetComponent -import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.walletconnect.transaction.components.common.WcCommonTransactionComponentDelegate import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams -import com.tangem.features.walletconnect.transaction.components.common.WcTransactionRequestInfoComponent +import com.tangem.features.walletconnect.transaction.components.common.getWcCommonScreen import com.tangem.features.walletconnect.transaction.model.WcSendTransactionModel import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes internal class WcSendTransactionContainerComponent( - private val appComponentContext: AppComponentContext, + appComponentContext: AppComponentContext, params: WcTransactionModelParams, -) : AppComponentContext by appComponentContext, ComposableContentComponent { +) : WcCommonTransactionComponentDelegate(appComponentContext) { - private val contentNavigation = StackNavigation() - private val innerRouter = InnerRouter( - stackNavigation = contentNavigation, - popCallback = { onChildBack() }, - ) private val model: WcSendTransactionModel = getOrCreateModel(params = params) - private val contentStack = childStack( - key = "WcSendTransactionStack", - source = contentNavigation, - serializer = WcTransactionRoutes.serializer(), - initialConfiguration = WcTransactionRoutes.Transaction, - handleBackButton = true, - childFactory = ::screenChild, - ) - @Composable - override fun Content(modifier: Modifier) { - val content by contentStack.subscribeAsState() - BackHandler(onBack = ::onChildBack) - content.active.instance.BottomSheet() - } - - private fun dismiss() { - router.pop() - } - - private fun onChildBack() { - when (contentStack.value.active.configuration) { - WcTransactionRoutes.Transaction -> contentNavigation.pop() - WcTransactionRoutes.TransactionRequestInfo -> contentNavigation.pushNew(WcTransactionRoutes.Transaction) - } - } - - private fun toTransactionRequestInfo() { - contentNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + init { + super.init( + navigation = model.stackNavigation, + screenChild = ::screenChild, + screenKey = "WcSendTransactionStack", + ) } private fun screenChild( @@ -68,18 +31,15 @@ internal class WcSendTransactionContainerComponent( componentContext: ComponentContext, ): ComposableBottomSheetComponent { val appComponentContext = childByContext(componentContext = componentContext, router = innerRouter) - return when (config) { - is WcTransactionRoutes.Transaction -> WcSendTransactionComponent( - appComponentContext = childByContext(componentContext), - transactionInfoOnClick = ::toTransactionRequestInfo, - onDismiss = ::dismiss, - model = model, - ) - is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( - appComponentContext = appComponentContext, - onDismiss = ::dismiss, - model = model.uiState.value?.transactionRequestInfo, - ) - } + return getWcCommonScreen( + config = config, + appComponentContext = appComponentContext, + transactionScreenConverter = { createTransactionComponent(appComponentContext) }, + model = model, + ) + } + + private fun createTransactionComponent(appComponentContext: AppComponentContext): WcSendTransactionComponent { + return WcSendTransactionComponent(appComponentContext = appComponentContext, model = model) } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionComponent.kt index 77831293fa..92550465c1 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionComponent.kt @@ -11,12 +11,10 @@ import com.tangem.features.walletconnect.transaction.ui.sign.WcSignTransactionMo internal class WcSignTransactionComponent( private val appComponentContext: AppComponentContext, private val model: WcSignTransactionModel, - private val transactionInfoOnClick: () -> Unit, - private val onDismiss: () -> Unit, ) : AppComponentContext by appComponentContext, ComposableBottomSheetComponent { override fun dismiss() { - onDismiss() + model.dismiss() } @Composable @@ -26,7 +24,7 @@ internal class WcSignTransactionComponent( if (content != null) { WcSignTransactionModalBottomSheetContent( state = content!!.transaction, - onClickTransactionRequest = transactionInfoOnClick, + onClickTransactionRequest = model::showTransactionRequest, onBack = router::pop, onDismiss = ::dismiss, ) diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionContainerComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionContainerComponent.kt index 10ff238577..cdfd63915b 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionContainerComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/sign/WcSignTransactionContainerComponent.kt @@ -1,56 +1,29 @@ package com.tangem.features.walletconnect.transaction.components.sign -import androidx.activity.compose.BackHandler -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.extensions.compose.subscribeAsState -import com.arkivanov.decompose.router.stack.* import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext import com.tangem.core.decompose.model.getOrCreateModel -import com.tangem.core.decompose.navigation.inner.InnerRouter import com.tangem.core.ui.decompose.ComposableBottomSheetComponent -import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.walletconnect.transaction.components.common.WcCommonTransactionComponentDelegate import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams -import com.tangem.features.walletconnect.transaction.components.common.WcTransactionRequestInfoComponent +import com.tangem.features.walletconnect.transaction.components.common.getWcCommonScreen import com.tangem.features.walletconnect.transaction.model.WcSignTransactionModel import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes internal class WcSignTransactionContainerComponent( - private val appComponentContext: AppComponentContext, + appComponentContext: AppComponentContext, params: WcTransactionModelParams, -) : AppComponentContext by appComponentContext, ComposableContentComponent { +) : WcCommonTransactionComponentDelegate(appComponentContext) { - private val contentNavigation = StackNavigation() - private val innerRouter = InnerRouter( - stackNavigation = contentNavigation, - popCallback = { onChildBack() }, - ) private val model: WcSignTransactionModel = getOrCreateModel(params = params) - private val contentStack = childStack( - key = "WcSignTransactionStack", - source = contentNavigation, - serializer = WcTransactionRoutes.serializer(), - initialConfiguration = WcTransactionRoutes.Transaction, - handleBackButton = true, - childFactory = ::screenChild, - ) - @Composable - override fun Content(modifier: Modifier) { - val content by contentStack.subscribeAsState() - BackHandler(onBack = ::onChildBack) - content.active.instance.BottomSheet() - } - - private fun onChildBack() { - when (contentStack.value.active.configuration) { - WcTransactionRoutes.Transaction, - WcTransactionRoutes.TransactionRequestInfo, - -> contentNavigation.pop() - } + init { + super.init( + navigation = model.stackNavigation, + screenChild = ::screenChild, + screenKey = "WcSignTransactionStack", + ) } private fun screenChild( @@ -58,18 +31,15 @@ internal class WcSignTransactionContainerComponent( componentContext: ComponentContext, ): ComposableBottomSheetComponent { val appComponentContext = childByContext(componentContext = componentContext, router = innerRouter) - return when (config) { - is WcTransactionRoutes.Transaction -> WcSignTransactionComponent( - appComponentContext = appComponentContext, - onDismiss = model::dismiss, - model = model, - transactionInfoOnClick = { contentNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) }, - ) - is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( - appComponentContext = appComponentContext, - onDismiss = model::dismiss, - model = model.uiState.value?.transactionRequestInfo, - ) - } + return getWcCommonScreen( + config = config, + appComponentContext = appComponentContext, + transactionScreenConverter = { createTransactionComponent(appComponentContext) }, + model = model, + ) + } + + private fun createTransactionComponent(appComponentContext: AppComponentContext): WcSignTransactionComponent { + return WcSignTransactionComponent(appComponentContext = appComponentContext, model = model) } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/BasicTransactionRequestInfoBlocksConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/BasicTransactionRequestInfoBlocksConverter.kt new file mode 100644 index 0000000000..af474ea237 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/BasicTransactionRequestInfoBlocksConverter.kt @@ -0,0 +1,30 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.domain.walletconnect.usecase.method.WcMethodContext +import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestBlockUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM +import com.tangem.utils.converter.Converter +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import javax.inject.Inject + +internal class BasicTransactionRequestInfoBlocksConverter @Inject constructor() : + Converter> { + + override fun convert(value: WcMethodContext) = persistentListOf( + WcTransactionRequestBlockUM( + persistentListOf( + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_signature_type), + description = value.rawSdkRequest.request.method, + ), + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_contents), + description = value.rawSdkRequest.request.params, + ), + ), + ), + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcAddEthereumChainUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcAddEthereumChainUMConverter.kt new file mode 100644 index 0000000000..d7a3c9de50 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcAddEthereumChainUMConverter.kt @@ -0,0 +1,41 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.domain.walletconnect.usecase.method.WcAddNetworkUseCase +import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainItemUM +import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +internal class WcAddEthereumChainUMConverter @Inject constructor( + private val basicBlocksConverter: BasicTransactionRequestInfoBlocksConverter, + private val appInfoContentUMConverter: WcTransactionAppInfoContentUMConverter, +) : Converter { + + override fun convert(value: Input): WcAddEthereumChainUM { + return WcAddEthereumChainUM( + transaction = WcAddEthereumChainItemUM( + onDismiss = value.actions.onDismiss, + onSign = value.actions.onSign, + appInfo = appInfoContentUMConverter.convert( + WcTransactionAppInfoContentUMConverter.Input( + session = value.useCase.session, + onShowVerifiedAlert = value.actions.onShowVerifiedAlert, + ), + ), + walletName = value.useCase.session.wallet.name, + isLoading = false, + ), + transactionRequestInfo = WcTransactionRequestInfoUM( + blocks = basicBlocksConverter.convert(value.useCase), + onCopy = value.actions.onCopy, + ), + ) + } + + data class Input( + val useCase: WcAddNetworkUseCase, + val actions: WcTransactionActionsUM, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcCommonTransactionUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcCommonTransactionUMConverter.kt new file mode 100644 index 0000000000..853990637c --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcCommonTransactionUMConverter.kt @@ -0,0 +1,50 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.domain.walletconnect.model.WcEthMethod +import com.tangem.domain.walletconnect.model.WcSolanaMethod +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +internal class WcCommonTransactionUMConverter @Inject constructor( + private val signTypedDataUMConverter: WcSignTypedDataUMConverter, + private val signTransactionUMConverter: WcSignTransactionUMConverter, +) : Converter { + + override fun convert(value: Input): WcCommonTransactionUM? { + return when (value.useCase) { + is WcMessageSignUseCase -> { + when (value.useCase.method) { + is WcEthMethod.SignTypedData -> signTypedDataUMConverter.convert( + WcSignTypedDataUMConverter.Input( + useCase = value.useCase, + signState = value.signState, + signModel = value.signState.signModel as WcMessageSignUseCase.SignModel, + actions = value.actions, + ), + ) + is WcEthMethod.MessageSign, is WcSolanaMethod.SignMessage -> signTransactionUMConverter.convert( + WcSignTransactionUMConverter.Input( + useCase = value.useCase, + signState = value.signState, + signModel = value.signState.signModel as WcMessageSignUseCase.SignModel, + actions = value.actions, + ), + ) + else -> null + } + } + else -> TODO("[REDACTED_JIRA]") + } + } + + data class Input( + val useCase: WcSignUseCase<*>, + val signState: WcSignState<*>, + val actions: WcTransactionActionsUM, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcNetworkInfoUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcNetworkInfoUMConverter.kt new file mode 100644 index 0000000000..31b58c91d4 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcNetworkInfoUMConverter.kt @@ -0,0 +1,15 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.core.ui.extensions.getActiveIconRes +import com.tangem.domain.models.network.Network +import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +internal class WcNetworkInfoUMConverter @Inject constructor() : Converter { + + override fun convert(value: Network) = WcNetworkInfoUM( + name = value.name, + iconRes = getActiveIconRes(value.rawId), + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTransactionUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTransactionUMConverter.kt new file mode 100644 index 0000000000..cc90835ef5 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTransactionUMConverter.kt @@ -0,0 +1,50 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignStep +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM +import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionItemUM +import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM +import com.tangem.utils.converter.Converter +import kotlinx.collections.immutable.persistentListOf +import javax.inject.Inject + +internal class WcSignTransactionUMConverter @Inject constructor( + private val appInfoContentUMConverter: WcTransactionAppInfoContentUMConverter, + private val networkInfoUMConverter: WcNetworkInfoUMConverter, + private val requestBlockUMConverter: WcTransactionRequestBlockUMConverter, +) : Converter { + + override fun convert(value: Input) = WcSignTransactionUM( + transaction = WcSignTransactionItemUM( + onDismiss = value.actions.onDismiss, + onSign = value.actions.onSign, + appInfo = appInfoContentUMConverter.convert( + WcTransactionAppInfoContentUMConverter.Input( + session = value.useCase.session, + onShowVerifiedAlert = value.actions.onShowVerifiedAlert, + ), + ), + walletName = value.useCase.session.wallet.name, + networkInfo = networkInfoUMConverter.convert(value.useCase.network), + isLoading = value.signState.domainStep == WcSignStep.Signing, + ), + transactionRequestInfo = WcTransactionRequestInfoUM( + persistentListOf( + requestBlockUMConverter.convert( + WcTransactionRequestBlockUMConverter.Input(value.useCase.rawSdkRequest, value.signModel), + ), + ), + onCopy = value.actions.onCopy, + ), + ) + + data class Input( + val useCase: WcMessageSignUseCase, + val signState: WcSignState<*>, + val signModel: WcMessageSignUseCase.SignModel, + val actions: WcTransactionActionsUM, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTypedDataUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTypedDataUMConverter.kt new file mode 100644 index 0000000000..be17ac0cdf --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcSignTypedDataUMConverter.kt @@ -0,0 +1,84 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.domain.walletconnect.model.WcEthMethod +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.domain.walletconnect.usecase.method.WcSignState +import com.tangem.domain.walletconnect.usecase.method.WcSignStep +import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestBlockUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM +import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionItemUM +import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM +import com.tangem.utils.converter.Converter +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList +import javax.inject.Inject + +private const val ADDRESS_FIRST_PART_LENGTH = 7 +private const val ADDRESS_SECOND_PART_LENGTH = 4 + +internal class WcSignTypedDataUMConverter @Inject constructor( + private val appInfoContentUMConverter: WcTransactionAppInfoContentUMConverter, + private val networkInfoUMConverter: WcNetworkInfoUMConverter, + private val requestBlockUMConverter: WcTransactionRequestBlockUMConverter, +) : Converter { + + override fun convert(value: Input): WcSignTransactionUM = WcSignTransactionUM( + transaction = WcSignTransactionItemUM( + onDismiss = value.actions.onDismiss, + onSign = value.actions.onSign, + appInfo = appInfoContentUMConverter.convert( + WcTransactionAppInfoContentUMConverter.Input( + session = value.useCase.session, + onShowVerifiedAlert = value.actions.onShowVerifiedAlert, + ), + ), + walletName = value.useCase.session.wallet.name, + networkInfo = networkInfoUMConverter.convert(value.useCase.network), + addressText = value.useCase.walletAddress.toShortAddressText(), + isLoading = value.signState.domainStep == WcSignStep.Signing, + ), + transactionRequestInfo = WcTransactionRequestInfoUM( + blocks = buildList { + add( + requestBlockUMConverter.convert( + WcTransactionRequestBlockUMConverter.Input(value.useCase.rawSdkRequest, value.signModel), + ), + ) + (value.useCase.method as? WcEthMethod.SignTypedData)?.params?.message?.to?.let { to -> + add( + WcTransactionRequestBlockUM( + persistentListOf( + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_transaction_info_to_title), + ), + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.settings_wallet_name_title), + description = to.name, + ), + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_common_wallet), + description = to.wallet, + ), + ), + ), + ) + } + }.toImmutableList(), + onCopy = value.actions.onCopy, + ), + ) + + private fun String.toShortAddressText() = + "${take(ADDRESS_FIRST_PART_LENGTH)}...${takeLast(ADDRESS_SECOND_PART_LENGTH)}" + + data class Input( + val useCase: WcMessageSignUseCase, + val signState: WcSignState<*>, + val signModel: WcMessageSignUseCase.SignModel, + val actions: WcTransactionActionsUM, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionAppInfoContentUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionAppInfoContentUMConverter.kt new file mode 100644 index 0000000000..f7b97c0d9d --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionAppInfoContentUMConverter.kt @@ -0,0 +1,25 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.domain.walletconnect.model.WcSession +import com.tangem.features.walletconnect.connections.model.transformers.WcDAppVerifiedStateConverter +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +internal class WcTransactionAppInfoContentUMConverter @Inject constructor() : + Converter { + + override fun convert(value: Input) = WcTransactionAppInfoContentUM( + appName = value.session.sdkModel.appMetaData.name, + appIcon = value.session.sdkModel.appMetaData.icons.firstOrNull().orEmpty(), + verifiedState = WcDAppVerifiedStateConverter(onVerifiedClick = value.onShowVerifiedAlert).convert( + value.session.securityStatus to value.session.sdkModel.appMetaData.name, + ), + appSubtitle = value.session.sdkModel.appMetaData.description, + ) + + data class Input( + val session: WcSession, + val onShowVerifiedAlert: (String) -> Unit, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt new file mode 100644 index 0000000000..188c4bc5d2 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/converter/WcTransactionRequestBlockUMConverter.kt @@ -0,0 +1,33 @@ +package com.tangem.features.walletconnect.transaction.converter + +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.domain.walletconnect.usecase.method.WcMessageSignUseCase +import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestBlockUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoItemUM +import com.tangem.utils.converter.Converter +import kotlinx.collections.immutable.persistentListOf +import javax.inject.Inject + +internal class WcTransactionRequestBlockUMConverter @Inject constructor() : + Converter { + + override fun convert(value: Input) = WcTransactionRequestBlockUM( + persistentListOf( + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_signature_type), + description = value.rawSdkRequest.request.method, + ), + WcTransactionRequestInfoItemUM( + title = resourceReference(R.string.wc_contents), + description = value.signModel?.humanMsg ?: value.rawSdkRequest.request.params, + ), + ), + ) + + data class Input( + val rawSdkRequest: WcSdkSessionRequest, + val signModel: WcMessageSignUseCase.SignModel? = null, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/chain/WcAddEthereumChainUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/chain/WcAddEthereumChainUM.kt index 53c2c9289d..5cf66c06a7 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/chain/WcAddEthereumChainUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/chain/WcAddEthereumChainUM.kt @@ -1,13 +1,14 @@ package com.tangem.features.walletconnect.transaction.entity.chain import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM internal data class WcAddEthereumChainUM( val transaction: WcAddEthereumChainItemUM, - val transactionRequestInfo: WcTransactionRequestInfoUM, -) + override val transactionRequestInfo: WcTransactionRequestInfoUM, +) : WcCommonTransactionUM internal data class WcAddEthereumChainItemUM( val onDismiss: () -> Unit, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionModel.kt new file mode 100644 index 0000000000..bf422a8b13 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionModel.kt @@ -0,0 +1,10 @@ +package com.tangem.features.walletconnect.transaction.entity.common + +import kotlinx.coroutines.flow.StateFlow + +internal interface WcCommonTransactionModel { + + val uiState: StateFlow + + fun dismiss() +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionUM.kt new file mode 100644 index 0000000000..5af8bc609d --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/common/WcCommonTransactionUM.kt @@ -0,0 +1,6 @@ +package com.tangem.features.walletconnect.transaction.entity.common + +internal interface WcCommonTransactionUM { + + val transactionRequestInfo: WcTransactionRequestInfoUM +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/send/WcSendTransactionUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/send/WcSendTransactionUM.kt index 7b3994cef9..50ad8b67ff 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/send/WcSendTransactionUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/send/WcSendTransactionUM.kt @@ -2,14 +2,15 @@ package com.tangem.features.walletconnect.transaction.entity.send import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.features.walletconnect.transaction.entity.blockaid.WcEstimatedWalletChangesUM +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionUM import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM internal data class WcSendTransactionUM( val transaction: WcSendTransactionItemUM, - val transactionRequestInfo: WcTransactionRequestInfoUM, -) + override val transactionRequestInfo: WcTransactionRequestInfoUM, +) : WcCommonTransactionUM internal data class WcSendTransactionItemUM( val onDismiss: () -> Unit, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/sign/WcSignTransactionUM.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/sign/WcSignTransactionUM.kt index 48a1bc062e..69e4c2e1fe 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/sign/WcSignTransactionUM.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/entity/sign/WcSignTransactionUM.kt @@ -1,14 +1,15 @@ package com.tangem.features.walletconnect.transaction.entity.sign import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionUM import com.tangem.features.walletconnect.transaction.entity.common.WcNetworkInfoUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionAppInfoContentUM import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM internal data class WcSignTransactionUM( val transaction: WcSignTransactionItemUM, - val transactionRequestInfo: WcTransactionRequestInfoUM, -) + override val transactionRequestInfo: WcTransactionRequestInfoUM, +) : WcCommonTransactionUM internal data class WcSignTransactionItemUM( val onDismiss: () -> Unit, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt index 68f27851f1..55cadb69e6 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt @@ -1,6 +1,8 @@ package com.tangem.features.walletconnect.transaction.model import androidx.compose.runtime.Stable +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.pushNew import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -11,8 +13,10 @@ import com.tangem.domain.walletconnect.usecase.method.WcAddNetworkUseCase import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainUM +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM -import com.tangem.features.walletconnect.transaction.utils.toUM +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes +import com.tangem.features.walletconnect.transaction.converter.WcAddEthereumChainUMConverter import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -28,36 +32,46 @@ internal class WcAddNetworkModel @Inject constructor( private val router: Router, private val clipboardManager: ClipboardManager, private val useCaseFactory: WcRequestUseCaseFactory, -) : Model() { + private val wcAddEthereumChainUMConverter: WcAddEthereumChainUMConverter, +) : Model(), WcCommonTransactionModel { private val _uiState = MutableStateFlow(null) - val uiState: StateFlow = _uiState + override val uiState: StateFlow = _uiState + + val stackNavigation = StackNavigation() private val params = paramsContainer.require() init { modelScope.launch { 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) }, - ), - ) + val transactionUM = (useCase as? WcAddNetworkUseCase)?.let { + wcAddEthereumChainUMConverter.convert( + WcAddEthereumChainUMConverter.Input( + useCase = useCase, + actions = WcTransactionActionsUM( + onShowVerifiedAlert = ::showVerifiedAlert, + onDismiss = { cancel(useCase) }, + onSign = { sign(useCase) }, + onCopy = { copyData(useCase.rawSdkRequest.request.params) }, + ), + ), + ) + } _uiState.emit(transactionUM) } } - fun dismiss() { + override fun dismiss() { _uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop() } - @Suppress("UnusedPrivateMember") + fun showTransactionRequest() { + stackNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + } + private fun showVerifiedAlert(appName: String) { - // TODO(wc): Nastya [REDACTED_JIRA] // see WcPairComponent and WcPairModel - // router.push(WcAppInfoRoutes.Alert(elements = message.elements)) + stackNavigation.pushNew(WcTransactionRoutes.Alert(WcTransactionRoutes.Alert.Type.Verified(appName))) } private fun sign(useCase: WcAddNetworkUseCase) { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt index 04c9f0c056..41f9283c12 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSendTransactionModel.kt @@ -1,24 +1,102 @@ package com.tangem.features.walletconnect.transaction.model import androidx.compose.runtime.Stable +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.pushNew +import com.domain.blockaid.models.transaction.TransactionData 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.clipboard.ClipboardManager +import com.tangem.domain.walletconnect.WcRequestUseCaseFactory +import com.tangem.domain.walletconnect.usecase.method.* +import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM import com.tangem.features.walletconnect.transaction.entity.send.WcSendTransactionUM +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes +import com.tangem.features.walletconnect.transaction.converter.WcCommonTransactionUMConverter import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch import javax.inject.Inject @Stable @ModelScoped internal class WcSendTransactionModel @Inject constructor( + paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, -) : Model() { + private val router: Router, + private val clipboardManager: ClipboardManager, + private val useCaseFactory: WcRequestUseCaseFactory, + private val converter: WcCommonTransactionUMConverter, +) : Model(), WcCommonTransactionModel { + + private val params = paramsContainer.require() private val _uiState = MutableStateFlow(null) - val uiState: StateFlow = _uiState + override val uiState: StateFlow = _uiState + + val stackNavigation = StackNavigation() init { - TODO("Finish model in this task [REDACTED_JIRA]") + modelScope.launch { + when (val useCase: WcSignUseCase = useCaseFactory.createUseCase(params.rawRequest)) { + is WcTransactionUseCase, + is WcListTransactionUseCase, + -> { + useCase.invoke().onEach { signState -> + if (signingIsDone(signState)) return@onEach + val transactionUM = converter.convert( + WcCommonTransactionUMConverter.Input( + useCase = useCase, + signState = signState, + actions = WcTransactionActionsUM( + onShowVerifiedAlert = ::showVerifiedAlert, + onDismiss = { cancel(useCase) }, + onSign = useCase::sign, + onCopy = { copyData(useCase.rawSdkRequest.request.params) }, + ), + ), + ) as? WcSendTransactionUM + _uiState.emit(transactionUM) + } + .launchIn(this) + } + } + } + } + + override fun dismiss() { + _uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop() + } + + fun showTransactionRequest() { + stackNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + } + + private fun showVerifiedAlert(appName: String) { + stackNavigation.pushNew(WcTransactionRoutes.Alert(WcTransactionRoutes.Alert.Type.Verified(appName))) + } + + private fun signingIsDone(signState: WcSignState<*>): Boolean { + (signState.domainStep as? WcSignStep.Result)?.result?.let { + router.pop() + return true + } + return false + } + + private fun cancel(useCase: WcSignUseCase<*>) { + useCase.cancel() + router.pop() + } + + private fun copyData(text: String) { + clipboardManager.setText(text = text, isSensitive = true) } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt index cc4cb61067..62d9ab0ee5 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcSignTransactionModel.kt @@ -1,6 +1,8 @@ package com.tangem.features.walletconnect.transaction.model import androidx.compose.runtime.Stable +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.pushNew import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -11,9 +13,11 @@ import com.tangem.domain.walletconnect.usecase.method.WcSignState import com.tangem.domain.walletconnect.usecase.method.WcSignStep import com.tangem.domain.walletconnect.usecase.method.WcSignUseCase import com.tangem.features.walletconnect.transaction.components.common.WcTransactionModelParams +import com.tangem.features.walletconnect.transaction.entity.common.WcCommonTransactionModel import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM -import com.tangem.features.walletconnect.transaction.utils.toUM +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes +import com.tangem.features.walletconnect.transaction.converter.WcCommonTransactionUMConverter import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -30,42 +34,50 @@ internal class WcSignTransactionModel @Inject constructor( private val router: Router, private val clipboardManager: ClipboardManager, private val useCaseFactory: WcRequestUseCaseFactory, -) : Model() { - - private val _uiState = MutableStateFlow(null) - val uiState: StateFlow = _uiState + private val converter: WcCommonTransactionUMConverter, +) : Model(), WcCommonTransactionModel { private val params = paramsContainer.require() + private val _uiState = MutableStateFlow(null) + override val uiState: StateFlow = _uiState + + val stackNavigation = StackNavigation() + init { modelScope.launch { val useCase: WcSignUseCase<*> = useCaseFactory.createUseCase(params.rawRequest) useCase.invoke() .onEach { signState -> if (signingIsDone(signState)) return@onEach - val signTransactionUM = useCase.toUM( - signState = signState, - actions = WcTransactionActionsUM( - onShowVerifiedAlert = ::showVerifiedAlert, - onDismiss = { cancel(useCase) }, - onSign = useCase::sign, - onCopy = { copyData(useCase.rawSdkRequest.request.params) }, + val signTransactionUM = converter.convert( + WcCommonTransactionUMConverter.Input( + useCase = useCase, + signState = signState, + actions = WcTransactionActionsUM( + onShowVerifiedAlert = ::showVerifiedAlert, + onDismiss = { cancel(useCase) }, + onSign = useCase::sign, + onCopy = { copyData(useCase.rawSdkRequest.request.params) }, + ), ), - ) + ) as? WcSignTransactionUM _uiState.emit(signTransactionUM) } .launchIn(this) } } - fun dismiss() { + override fun dismiss() { _uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop() } - @Suppress("UnusedPrivateMember") + fun showTransactionRequest() { + stackNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + } + private fun showVerifiedAlert(appName: String) { - // TODO(wc): Nastya [REDACTED_JIRA] // see WcPairComponent and WcPairModel - // router.push(WcAppInfoRoutes.Alert(elements = message.elements)) + stackNavigation.pushNew(WcTransactionRoutes.Alert(WcTransactionRoutes.Alert.Type.Verified(appName))) } private fun signingIsDone(signState: WcSignState<*>): Boolean { diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt index 28ad46783d..b762172be6 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt @@ -13,4 +13,14 @@ internal sealed class WcTransactionRoutes : TangemBottomSheetConfigContent, Rout @Serializable data object TransactionRequestInfo : WcTransactionRoutes() + + @Serializable + data class Alert(val type: Type) : WcTransactionRoutes() { + @Serializable + sealed class Type { + data class Verified(val appName: String) : Type() + data object UnknownDomain : Type() + data object UnsafeDomain : Type() + } + } } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WalletAddressUtils.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WalletAddressUtils.kt deleted file mode 100644 index a51a5d82f7..0000000000 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WalletAddressUtils.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.tangem.features.walletconnect.transaction.utils - -const val ADDRESS_FIRST_PART_LENGTH = 7 -const val ADDRESS_SECOND_PART_LENGTH = 4 - -internal fun String.toShortAddressText() = - "${take(ADDRESS_FIRST_PART_LENGTH)}...${takeLast(ADDRESS_SECOND_PART_LENGTH)}" \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt deleted file mode 100644 index 21933394fd..0000000000 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt +++ /dev/null @@ -1,166 +0,0 @@ -package com.tangem.features.walletconnect.transaction.utils - -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 -import com.tangem.features.walletconnect.connections.model.transformers.WcDAppVerifiedStateConverter -import com.tangem.features.walletconnect.impl.R -import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainItemUM -import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainUM -import com.tangem.features.walletconnect.transaction.entity.common.* -import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionItemUM -import com.tangem.features.walletconnect.transaction.entity.sign.WcSignTransactionUM -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableList - -internal fun WcAddNetworkUseCase.toUM(actions: WcTransactionActionsUM): WcAddEthereumChainUM { - return WcAddEthereumChainUM( - transaction = WcAddEthereumChainItemUM( - onDismiss = actions.onDismiss, - onSign = actions.onSign, - appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert), - walletName = session.wallet.name, - isLoading = false, - ), - transactionRequestInfo = WcTransactionRequestInfoUM( - blocks = basicTransactionRequestInfoBlocks(), - onCopy = actions.onCopy, - ), - ) -} - -internal fun WcSignUseCase<*>.toUM(signState: WcSignState<*>, actions: WcTransactionActionsUM): WcSignTransactionUM? { - return when (this) { - is WcMessageSignUseCase -> { - when (method) { - is WcEthMethod.SignTypedData -> signTypedDataToUM( - signState = signState, - signModel = signState.signModel as WcMessageSignUseCase.SignModel, - actions = actions, - ) - is WcEthMethod.MessageSign, is WcSolanaMethod.SignMessage -> messageSignToUM( - signState = signState, - signModel = signState.signModel as WcMessageSignUseCase.SignModel, - actions = actions, - ) - else -> null - } - } - else -> null - } -} - -private fun WcMessageSignUseCase.signTypedDataToUM( - signState: WcSignState<*>, - signModel: WcMessageSignUseCase.SignModel, - actions: WcTransactionActionsUM, -) = WcSignTransactionUM( - transaction = WcSignTransactionItemUM( - onDismiss = actions.onDismiss, - onSign = actions.onSign, - appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert), - walletName = session.wallet.name, - networkInfo = networkInfo(), - addressText = walletAddress.toShortAddressText(), - isLoading = signState.domainStep == WcSignStep.Signing, - ), - transactionRequestInfo = WcTransactionRequestInfoUM( - blocks = buildList { - add(createInfoBlockUM(rawSdkRequest, signModel)) - (method as? WcEthMethod.SignTypedData)?.params?.message?.to?.let { to -> - add( - WcTransactionRequestBlockUM( - persistentListOf( - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_transaction_info_to_title), - ), - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.settings_wallet_name_title), - description = to.name, - ), - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_common_wallet), - description = to.wallet, - ), - ), - ), - ) - } - }.toImmutableList(), - onCopy = actions.onCopy, - ), -) - -private fun WcMessageSignUseCase.messageSignToUM( - signState: WcSignState<*>, - signModel: WcMessageSignUseCase.SignModel, - actions: WcTransactionActionsUM, -) = WcSignTransactionUM( - transaction = WcSignTransactionItemUM( - onDismiss = actions.onDismiss, - onSign = actions.onSign, - appInfo = appInfo(onShowVerifiedAlert = actions.onShowVerifiedAlert), - walletName = session.wallet.name, - networkInfo = networkInfo(), - isLoading = signState.domainStep == WcSignStep.Signing, - ), - transactionRequestInfo = WcTransactionRequestInfoUM( - persistentListOf(createInfoBlockUM(rawSdkRequest, signModel)), - onCopy = actions.onCopy, - ), -) - -private fun createInfoBlockUM( - rawSdkRequest: WcSdkSessionRequest, - signModel: WcMessageSignUseCase.SignModel, -): WcTransactionRequestBlockUM { - return WcTransactionRequestBlockUM( - persistentListOf( - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_signature_type), - description = rawSdkRequest.request.method, - ), - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_contents), - description = signModel.humanMsg, - ), - ), - ) -} - -private fun WcMethodContext.basicTransactionRequestInfoBlocks() = persistentListOf( - WcTransactionRequestBlockUM( - persistentListOf( - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_signature_type), - description = rawSdkRequest.request.method, - ), - WcTransactionRequestInfoItemUM( - title = resourceReference(R.string.wc_contents), - description = rawSdkRequest.request.params, - ), - ), - ), -) - -private fun WcMethodContext.appInfo(onShowVerifiedAlert: (String) -> Unit) = WcTransactionAppInfoContentUM( - appName = session.sdkModel.appMetaData.name, - appIcon = session.sdkModel.appMetaData.url, - verifiedState = WcDAppVerifiedStateConverter(onVerifiedClick = onShowVerifiedAlert).convert( - session.securityStatus to session.sdkModel.appMetaData.name, - ), - appSubtitle = session.sdkModel.appMetaData.description, -) - -private fun WcMethodContext.networkInfo() = WcNetworkInfoUM( - name = network.name, - iconRes = getActiveIconRes(network.rawId), -) \ No newline at end of file