diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/DefaultWcRoutingComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/DefaultWcRoutingComponent.kt index 174119ad19..702fe61874 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/DefaultWcRoutingComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/DefaultWcRoutingComponent.kt @@ -17,6 +17,7 @@ import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.features.walletconnect.components.WcRoutingComponent import com.tangem.features.walletconnect.connections.components.WcPairComponent import com.tangem.features.walletconnect.connections.components.AlertsComponent +import com.tangem.features.walletconnect.transaction.components.WcAddNetworkContainerComponent import com.tangem.features.walletconnect.transaction.components.WcSignTransactionContainerComponent import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -60,6 +61,10 @@ internal class DefaultWcRoutingComponent @AssistedInject constructor( appComponentContext = childContext, params = WcSignTransactionContainerComponent.Params(config.rawRequest), ) + is WcInnerRoute.AddNetwork -> WcAddNetworkContainerComponent( + appComponentContext = childContext, + params = WcAddNetworkContainerComponent.Params(config.rawRequest), + ) is WcInnerRoute.Pair -> WcPairComponent( appComponentContext = childContext, params = WcPairComponent.Params( diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcInnerRoute.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcInnerRoute.kt index 4c4c8cce4d..13ddad2080 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcInnerRoute.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcInnerRoute.kt @@ -17,6 +17,9 @@ internal sealed interface WcInnerRoute : Route { @Serializable data class SignMessage(override val rawRequest: WcSdkSessionRequest) : Method + @Serializable + data class AddNetwork(override val rawRequest: WcSdkSessionRequest) : Method + @Serializable data class Pair(val request: WcPairRequest) : WcInnerRoute diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRoutingModel.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRoutingModel.kt index 05350f69ad..061f8be9a1 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRoutingModel.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRoutingModel.kt @@ -50,11 +50,12 @@ internal class WcRoutingModel @Inject constructor( WcEthMethodName.SignTypeDataV4, WcSolanaMethodName.SignMessage, -> WcInnerRoute.SignMessage(rawRequest) + WcEthMethodName.AddEthereumChain, + -> WcInnerRoute.AddNetwork(rawRequest) WcEthMethodName.SignTransaction, WcEthMethodName.SendTransaction, WcSolanaMethodName.SignTransaction, WcSolanaMethodName.SendAllTransaction, - WcEthMethodName.AddEthereumChain, is WcMethodName.Unsupported, -> WcInnerRoute.Alert( alertType = AlertsComponent.AlertType.UnsupportedMethod { innerRouter.pop() }, diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkComponent.kt new file mode 100644 index 0000000000..1ce7de5af8 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkComponent.kt @@ -0,0 +1,29 @@ +package com.tangem.features.walletconnect.transaction.components + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.walletconnect.transaction.model.WcAddNetworkModel +import com.tangem.features.walletconnect.transaction.ui.chain.WcAddEthereumChainModalBottomSheetContent + +internal class WcAddNetworkComponent( + private val appComponentContext: AppComponentContext, + private val model: WcAddNetworkModel, + private val transactionInfoOnClick: () -> Unit, +) : AppComponentContext by appComponentContext, ComposableContentComponent { + + @Composable + override fun Content(modifier: Modifier) { + val content by model.uiState.collectAsStateWithLifecycle() + + if (content != null) { + WcAddEthereumChainModalBottomSheetContent( + state = content!!.transaction, + onClickTransactionRequest = transactionInfoOnClick, + ) + } + } +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkContainerComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkContainerComponent.kt new file mode 100644 index 0000000000..12bb073a17 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcAddNetworkContainerComponent.kt @@ -0,0 +1,100 @@ +package com.tangem.features.walletconnect.transaction.components + +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +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.stack.Children +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.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.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheet +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.core.ui.res.TangemTheme +import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest +import com.tangem.features.walletconnect.transaction.model.WcAddNetworkModel +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes +import com.tangem.features.walletconnect.transaction.ui.common.WcTransactionCommonBottomSheetTitle + +internal class WcAddNetworkContainerComponent( + private val appComponentContext: AppComponentContext, + params: Params, +) : AppComponentContext by appComponentContext, ComposableContentComponent { + + private val model: WcAddNetworkModel = getOrCreateModel(params = params) + private val contentNavigation = StackNavigation() + private val contentStack = childStack( + source = contentNavigation, + serializer = WcTransactionRoutes.serializer(), + initialConfiguration = WcTransactionRoutes.Transaction, + childFactory = ::screenChild, + ) + + private fun dismiss() { + model.dismiss() + } + + @Composable + override fun Content(modifier: Modifier) { + val content by contentStack.subscribeAsState() + TangemModalBottomSheet( + config = TangemBottomSheetConfig( + isShown = true, + onDismissRequest = ::dismiss, + content = content.active.configuration, + ), + containerColor = TangemTheme.colors.background.tertiary, + title = { config -> + WcTransactionCommonBottomSheetTitle( + route = config, + onStartClick = ::toTransaction, + onEndClick = ::dismiss, + ) + }, + content = { + Box( + modifier = Modifier + .fillMaxWidth() + .animateContentSize(), + ) { + Children(stack = content) { child -> + child.instance.Content(modifier = Modifier) + } + } + }, + ) + } + + private fun toTransactionRequestInfo() { + contentNavigation.pushNew(WcTransactionRoutes.TransactionRequestInfo) + } + + private fun toTransaction() { + contentNavigation.pushNew(WcTransactionRoutes.Transaction) + } + + private fun screenChild( + config: WcTransactionRoutes, + componentContext: ComponentContext, + ): ComposableContentComponent = when (config) { + is WcTransactionRoutes.Transaction -> WcAddNetworkComponent( + appComponentContext = childByContext(componentContext), + model = model, + transactionInfoOnClick = ::toTransactionRequestInfo, + ) + is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( + appComponentContext = childByContext(componentContext), + model = model.uiState.value?.transactionRequestInfo, + ) + } + + data class Params(val rawRequest: WcSdkSessionRequest) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionContainerComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionContainerComponent.kt index 7bfc3e7738..83443e9842 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionContainerComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionContainerComponent.kt @@ -17,14 +17,12 @@ import com.tangem.core.decompose.context.childByContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheet -import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle import com.tangem.core.ui.decompose.ComposableContentComponent -import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.TangemTheme import com.tangem.domain.walletconnect.model.sdkcopy.WcSdkSessionRequest -import com.tangem.features.walletconnect.impl.R import com.tangem.features.walletconnect.transaction.model.WcSignTransactionModel -import com.tangem.features.walletconnect.transaction.routes.WcSignTransactionRoutes +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes +import com.tangem.features.walletconnect.transaction.ui.common.WcTransactionCommonBottomSheetTitle internal class WcSignTransactionContainerComponent( private val appComponentContext: AppComponentContext, @@ -32,11 +30,11 @@ internal class WcSignTransactionContainerComponent( ) : AppComponentContext by appComponentContext, ComposableContentComponent { private val model: WcSignTransactionModel = getOrCreateModel(params = params) - private val contentNavigation = StackNavigation() + private val contentNavigation = StackNavigation() private val contentStack = childStack( source = contentNavigation, - serializer = WcSignTransactionRoutes.serializer(), - initialConfiguration = WcSignTransactionRoutes.Transaction, + serializer = WcTransactionRoutes.serializer(), + initialConfiguration = WcTransactionRoutes.Transaction, childFactory = ::screenChild, ) @@ -47,14 +45,20 @@ internal class WcSignTransactionContainerComponent( @Composable override fun Content(modifier: Modifier) { val content by contentStack.subscribeAsState() - TangemModalBottomSheet( + TangemModalBottomSheet( config = TangemBottomSheetConfig( isShown = true, onDismissRequest = ::dismiss, content = content.active.configuration, ), containerColor = TangemTheme.colors.background.tertiary, - title = { config -> Title(route = config) }, + title = { config -> + WcTransactionCommonBottomSheetTitle( + route = config, + onStartClick = ::toTransaction, + onEndClick = ::dismiss, + ) + }, content = { Box( modifier = Modifier @@ -69,53 +73,30 @@ internal class WcSignTransactionContainerComponent( ) } - @Composable - private fun Title(route: WcSignTransactionRoutes) { - TangemModalBottomSheetTitle( - title = resourceReference(R.string.wc_wallet_connect), - startIconRes = when (route) { - is WcSignTransactionRoutes.Transaction -> null - else -> R.drawable.ic_back_24 - }, - onStartClick = when (route) { - is WcSignTransactionRoutes.Transaction -> null - else -> ::toTransaction - }, - endIconRes = when (route) { - is WcSignTransactionRoutes.Transaction -> R.drawable.ic_close_24 - else -> null - }, - onEndClick = when (route) { - is WcSignTransactionRoutes.Transaction -> ::dismiss - else -> null - }, - ) - } - private fun toTransactionRequestInfo() { contentNavigation.navigate { - listOf(WcSignTransactionRoutes.TransactionRequestInfo) + listOf(WcTransactionRoutes.TransactionRequestInfo) } } private fun toTransaction() { contentNavigation.navigate { - listOf(WcSignTransactionRoutes.Transaction) + listOf(WcTransactionRoutes.Transaction) } } private fun screenChild( - config: WcSignTransactionRoutes, + config: WcTransactionRoutes, componentContext: ComponentContext, ): ComposableContentComponent = when (config) { - is WcSignTransactionRoutes.Transaction -> WcSignTransactionComponent( + is WcTransactionRoutes.Transaction -> WcSignTransactionComponent( appComponentContext = childByContext(componentContext), model = model, transactionInfoOnClick = ::toTransactionRequestInfo, ) - is WcSignTransactionRoutes.TransactionRequestInfo -> WcSignTransactionRequestInfoComponent( + is WcTransactionRoutes.TransactionRequestInfo -> WcTransactionRequestInfoComponent( appComponentContext = childByContext(componentContext), - model = model, + model = model.uiState.value?.transactionRequestInfo, ) } diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionRequestInfoComponent.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcTransactionRequestInfoComponent.kt similarity index 57% rename from features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionRequestInfoComponent.kt rename to features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcTransactionRequestInfoComponent.kt index d78b56b14a..089ca95646 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcSignTransactionRequestInfoComponent.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/components/WcTransactionRequestInfoComponent.kt @@ -2,23 +2,20 @@ package com.tangem.features.walletconnect.transaction.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.ui.decompose.ComposableContentComponent -import com.tangem.features.walletconnect.transaction.model.WcSignTransactionModel +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionRequestInfoUM import com.tangem.features.walletconnect.transaction.ui.common.TransactionRequestInfoContent -internal class WcSignTransactionRequestInfoComponent( +internal class WcTransactionRequestInfoComponent( private val appComponentContext: AppComponentContext, - private val model: WcSignTransactionModel, + private val model: WcTransactionRequestInfoUM?, ) : AppComponentContext by appComponentContext, ComposableContentComponent { @Composable override fun Content(modifier: Modifier) { - val content = model.uiState.collectAsStateWithLifecycle().value - - if (content != null) { - TransactionRequestInfoContent(content.transactionRequestInfo) + if (model != null) { + TransactionRequestInfoContent(model) } } } \ No newline at end of file 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 new file mode 100644 index 0000000000..171a7f09a6 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/model/WcAddNetworkModel.kt @@ -0,0 +1,76 @@ +package com.tangem.features.walletconnect.transaction.model + +import androidx.compose.runtime.Stable +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.WcAddNetworkUseCase +import com.tangem.domain.walletconnect.usecase.method.WcMethodUseCase +import com.tangem.features.walletconnect.transaction.components.WcSignTransactionContainerComponent +import com.tangem.features.walletconnect.transaction.entity.chain.WcAddEthereumChainUM +import com.tangem.features.walletconnect.transaction.entity.common.WcTransactionActionsUM +import com.tangem.features.walletconnect.transaction.utils.toUM +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@Stable +@ModelScoped +internal class WcAddNetworkModel @Inject constructor( + paramsContainer: ParamsContainer, + override val dispatchers: CoroutineDispatcherProvider, + private val router: Router, + private val clipboardManager: ClipboardManager, + private val useCaseFactory: WcRequestUseCaseFactory, +) : Model() { + + private val _uiState = MutableStateFlow(null) + val uiState: StateFlow = _uiState + + private val params = paramsContainer.require() + + init { + modelScope.launch { + val useCase: WcMethodUseCase = useCaseFactory.createUseCase(params.rawRequest) + val transactionUM = (useCase as? WcAddNetworkUseCase)?.toUM( + actions = WcTransactionActionsUM( + onDismiss = { cancel(useCase) }, + onSign = { sign(useCase) }, + onCopy = { copyData(useCase.rawSdkRequest.request.params) }, + ), + ) + _uiState.emit(transactionUM) + } + } + + fun dismiss() { + _uiState.value?.transaction?.onDismiss?.invoke() ?: router.pop() + } + + private fun sign(useCase: WcAddNetworkUseCase) { + modelScope.launch { + _uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = true)) } + useCase.approve().getOrNull()?.let { + router.pop() + } ?: run { + _uiState.update { it?.copy(transaction = it.transaction.copy(isLoading = false)) } + TODO("[REDACTED_JIRA]") + } + } + } + + private fun cancel(useCase: WcAddNetworkUseCase) { + useCase.reject() + 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/routes/WcSignTransactionRoutes.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt similarity index 58% rename from features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcSignTransactionRoutes.kt rename to features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt index 6c5c1d9fa8..e71e613cce 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcSignTransactionRoutes.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/routes/WcTransactionRoutes.kt @@ -6,10 +6,10 @@ import kotlinx.serialization.Serializable @Serializable @Immutable -internal sealed class WcSignTransactionRoutes : TangemBottomSheetConfigContent { +internal sealed class WcTransactionRoutes : TangemBottomSheetConfigContent { @Serializable - data object Transaction : WcSignTransactionRoutes() + data object Transaction : WcTransactionRoutes() @Serializable - data object TransactionRequestInfo : WcSignTransactionRoutes() + data object TransactionRequestInfo : WcTransactionRoutes() } \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcTransactionCommonBottomSheetTitle.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcTransactionCommonBottomSheetTitle.kt new file mode 100644 index 0000000000..fd5a6d26c3 --- /dev/null +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/ui/common/WcTransactionCommonBottomSheetTitle.kt @@ -0,0 +1,34 @@ +package com.tangem.features.walletconnect.transaction.ui.common + +import androidx.compose.runtime.Composable +import com.tangem.core.ui.components.bottomsheets.modal.TangemModalBottomSheetTitle +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.features.walletconnect.impl.R +import com.tangem.features.walletconnect.transaction.routes.WcTransactionRoutes + +@Composable +internal fun WcTransactionCommonBottomSheetTitle( + route: WcTransactionRoutes, + onStartClick: () -> Unit, + onEndClick: () -> Unit, +) { + TangemModalBottomSheetTitle( + title = resourceReference(R.string.wc_wallet_connect), + startIconRes = when (route) { + is WcTransactionRoutes.Transaction -> null + else -> R.drawable.ic_back_24 + }, + onStartClick = when (route) { + is WcTransactionRoutes.Transaction -> null + else -> onStartClick + }, + endIconRes = when (route) { + is WcTransactionRoutes.Transaction -> R.drawable.ic_close_24 + else -> null + }, + onEndClick = when (route) { + is WcTransactionRoutes.Transaction -> onEndClick + else -> null + }, + ) +} \ No newline at end of file diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt similarity index 70% rename from features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt rename to features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt index c1ee1d5ee7..fdd34e1967 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcSignTransactionUtils.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/transaction/utils/WcTransactionUtils.kt @@ -1,22 +1,36 @@ 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.WcMessageSignUseCase -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.domain.walletconnect.usecase.method.* 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(), + 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 -> { @@ -46,17 +60,9 @@ private fun WcMessageSignUseCase.signTypedDataToUM( transaction = WcSignTransactionItemUM( onDismiss = actions.onDismiss, onSign = actions.onSign, - appInfo = WcTransactionAppInfoContentUM( - appName = session.sdkModel.appMetaData.name, - appIcon = session.sdkModel.appMetaData.url, - isVerified = session.securityStatus == CheckDAppResult.SAFE, - appSubtitle = session.sdkModel.appMetaData.description, - ), + appInfo = appInfo(), walletName = session.wallet.name, - networkInfo = WcNetworkInfoUM( - name = network.name, - iconRes = getActiveIconRes(network.rawId), - ), + networkInfo = networkInfo(), addressText = walletAddress.toShortAddressText(), isLoading = signState.domainStep == WcSignStep.Signing, ), @@ -95,17 +101,9 @@ private fun WcMessageSignUseCase.messageSignToUM( transaction = WcSignTransactionItemUM( onDismiss = actions.onDismiss, onSign = actions.onSign, - appInfo = WcTransactionAppInfoContentUM( - appName = session.sdkModel.appMetaData.name, - appIcon = session.sdkModel.appMetaData.url, - isVerified = session.securityStatus == CheckDAppResult.SAFE, - appSubtitle = session.sdkModel.appMetaData.description, - ), + appInfo = appInfo(), walletName = session.wallet.name, - networkInfo = WcNetworkInfoUM( - name = network.name, - iconRes = getActiveIconRes(network.rawId), - ), + networkInfo = networkInfo(), isLoading = signState.domainStep == WcSignStep.Signing, ), transactionRequestInfo = WcTransactionRequestInfoUM( @@ -130,4 +128,31 @@ private fun createInfoBlockUM( ), ), ) -} \ No newline at end of file +} + +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() = WcTransactionAppInfoContentUM( + appName = session.sdkModel.appMetaData.name, + appIcon = session.sdkModel.appMetaData.url, + isVerified = session.securityStatus == com.domain.blockaid.models.dapp.CheckDAppResult.SAFE, + appSubtitle = session.sdkModel.appMetaData.description, +) + +private fun WcMethodContext.networkInfo() = WcNetworkInfoUM( + name = network.name, + iconRes = getActiveIconRes(network.rawId), +) \ No newline at end of file