From 2d3a1d3bc7fbae48fd1ff38a5a3db1c47f34b5c7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 11 Sep 2024 17:36:36 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../PreviewCustomTokenSelectorComponent.kt | 1 + .../preview/PreviewManageTokensComponent.kt | 1 + .../entity/item/CurrencyNetworkUM.kt | 3 +++ .../managetokens/ui/ManageTokensScreen.kt | 13 ++++++++++++- .../utils/list/ManageTokensListManager.kt | 4 ++++ .../utils/list/ManageTokensUiManager.kt | 17 +++++++++++++++++ .../utils/mapper/CurrencyNetworksMapper.kt | 5 +++++ .../utils/ui/CurrencyItemOperations.kt | 2 ++ 8 files changed, 45 insertions(+), 1 deletion(-) diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenSelectorComponent.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenSelectorComponent.kt index 0a37116d7d..24b389d850 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenSelectorComponent.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewCustomTokenSelectorComponent.kt @@ -68,6 +68,7 @@ internal class PreviewCustomTokenSelectorComponent( isMainNetwork = false, isSelected = n.id == params.selectedNetwork?.id, onSelectedStateChange = { params.onNetworkSelected(n) }, + onLongClick = {}, ) } } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewManageTokensComponent.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewManageTokensComponent.kt index ff77045832..fae9aafb14 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewManageTokensComponent.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/component/preview/PreviewManageTokensComponent.kt @@ -158,6 +158,7 @@ internal class PreviewManageTokensComponent( isMainNetwork = networkIndex == 0, isSelected = false, onSelectedStateChange = { toggleNetwork(currencyIndex, networkIndex, isSelected = it) }, + onLongClick = {}, ) }.toImmutableList() diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/item/CurrencyNetworkUM.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/item/CurrencyNetworkUM.kt index b666a09c2a..bdec914faa 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/item/CurrencyNetworkUM.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/entity/item/CurrencyNetworkUM.kt @@ -8,9 +8,12 @@ internal data class CurrencyNetworkUM( val type: String, val iconResId: Int, val isMainNetwork: Boolean, + val onLongClick: () -> Unit, override val isSelected: Boolean, override val onSelectedStateChange: (Boolean) -> Unit, ) : SelectableItemUM { override val id: String = network.id.value + + data class LongTapConfig(val contractAddress: String, val onLongTap: () -> Unit) } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/ManageTokensScreen.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/ManageTokensScreen.kt index 3b4b3bb478..6c5489f29b 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/ManageTokensScreen.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/ui/ManageTokensScreen.kt @@ -3,8 +3,11 @@ package com.tangem.features.managetokens.ui import android.content.res.Configuration import androidx.compose.animation.* import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState @@ -364,6 +367,7 @@ private fun BasicCurrencyItem(item: CurrencyItemUM.Basic, isEditable: Boolean, m } } +@OptIn(ExperimentalFoundationApi::class) @Composable private fun NetworksList( networks: NetworksUM, @@ -392,7 +396,14 @@ private fun NetworksList( isLastItem = index == currentItems.lastIndex, content = { BlockchainRow( - modifier = Modifier.padding(end = TangemTheme.dimens.spacing8), + modifier = Modifier + .padding(end = TangemTheme.dimens.spacing8) + .combinedClickable( + onLongClick = network.onLongClick, + onClick = {}, + indication = null, + interactionSource = remember { MutableInteractionSource() }, + ), model = with(network) { BlockchainRowUM( id = id, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt index 835316aa30..da24501ab1 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt @@ -3,6 +3,7 @@ package com.tangem.features.managetokens.utils.list import arrow.core.getOrElse import com.tangem.core.decompose.di.ComponentScoped import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.message.SnackbarMessage @@ -32,6 +33,7 @@ import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject +@Suppress("LongParameterList") @ComponentScoped internal class ManageTokensListManager @Inject constructor( private val getManagedTokensUseCase: GetManagedTokensUseCase, @@ -40,6 +42,7 @@ internal class ManageTokensListManager @Inject constructor( private val checkCurrencyUnsupportedUseCase: CheckCurrencyUnsupportedUseCase, private val messageSender: UiMessageSender, private val dispatchers: CoroutineDispatcherProvider, + clipboardManager: ClipboardManager, ) : ManageTokensUiActions { private lateinit var scope: CoroutineScope @@ -59,6 +62,7 @@ internal class ManageTokensListManager @Inject constructor( dispatchers = dispatchers, actions = this, scopeProvider = Provider { scope }, + clipboardManager = clipboardManager, ) val currenciesToAdd: StateFlow = changedCurrenciesManager.currenciesToAdd.asStateFlow() diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt index b43eb3542c..167a7f88a7 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt @@ -1,9 +1,12 @@ package com.tangem.features.managetokens.utils.list import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.clipboard.ClipboardManager +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.message.ContentMessage +import com.tangem.core.ui.message.SnackbarMessage import com.tangem.domain.managetokens.model.CurrencyUnsupportedState import com.tangem.domain.managetokens.model.ManagedCryptoCurrency import com.tangem.domain.tokens.model.Network @@ -32,6 +35,7 @@ internal class ManageTokensUiManager( private val dispatchers: CoroutineDispatcherProvider, private val scopeProvider: Provider, private val actions: ManageTokensUiActions, + private val clipboardManager: ClipboardManager, ) { private val scope: CoroutineScope @@ -130,6 +134,7 @@ internal class ManageTokensUiManager( onSelectCurrencyNetwork = { networkId, isSelected -> selectNetwork(currencyBatch.key, currency, networkId, isSelected) }, + onLongTap = ::copyContractAddress, ) batches.updateUiBatchesItem( @@ -139,6 +144,18 @@ internal class ManageTokensUiManager( } } + private fun copyContractAddress(source: ManagedCryptoCurrency.SourceNetwork) { + if (source is ManagedCryptoCurrency.SourceNetwork.Default) { + clipboardManager.setText(text = source.contractAddress) + showSnackbarMessage(resourceReference(R.string.contract_address_copied_message)) + } + } + + private fun showSnackbarMessage(messageText: TextReference) { + val message = SnackbarMessage(message = messageText) + messageSender.send(message) + } + private fun selectNetwork( batchKey: Int, currency: ManagedCryptoCurrency, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt index 2e88d82956..7bb461b84b 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt @@ -12,6 +12,7 @@ internal fun ManagedCryptoCurrency.Token.toUiNetworksModel( isExpanded: Boolean, isItemsEditable: Boolean, onSelectedStateChange: (SourceNetwork, Boolean) -> Unit, + onLongTap: (SourceNetwork) -> Unit, ): NetworksUM { return if (isExpanded) { NetworksUM.Expanded( @@ -20,6 +21,7 @@ internal fun ManagedCryptoCurrency.Token.toUiNetworksModel( isSelected = it.network in addedIn, isEditable = isItemsEditable, onSelectedStateChange = onSelectedStateChange, + onLongTap = onLongTap, ) }.toImmutableList(), ) @@ -38,6 +40,7 @@ internal fun Network.toCurrencyNetworkModel( iconResId = id.getIconRes(isColored = true), isSelected = isSelected, type = standardType.name, + onLongClick = {}, isMainNetwork = false, onSelectedStateChange = onSelectedStateChange, ) @@ -47,6 +50,7 @@ private fun SourceNetwork.toCurrencyNetworkModel( isSelected: Boolean, isEditable: Boolean, onSelectedStateChange: (SourceNetwork, Boolean) -> Unit, + onLongTap: (SourceNetwork) -> Unit, ): CurrencyNetworkUM { return CurrencyNetworkUM( network = network, @@ -54,6 +58,7 @@ private fun SourceNetwork.toCurrencyNetworkModel( iconResId = id.getIconRes(isColored = isSelected || !isEditable), isSelected = isSelected || !isEditable, type = typeName, + onLongClick = { onLongTap(this) }, isMainNetwork = this is SourceNetwork.Main, onSelectedStateChange = { selected -> onSelectedStateChange(this, selected) diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/ui/CurrencyItemOperations.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/ui/CurrencyItemOperations.kt index a539a0524d..dc27478f94 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/ui/CurrencyItemOperations.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/ui/CurrencyItemOperations.kt @@ -11,6 +11,7 @@ internal fun CurrencyItemUM.toggleExpanded( currency: ManagedCryptoCurrency, isEditable: Boolean, onSelectCurrencyNetwork: (SourceNetwork, Boolean) -> Unit, + onLongTap: (SourceNetwork) -> Unit, ): CurrencyItemUM { if (currency !is ManagedCryptoCurrency.Token) return this @@ -29,6 +30,7 @@ internal fun CurrencyItemUM.toggleExpanded( isExpanded = isExpanded, isItemsEditable = isEditable, onSelectedStateChange = onSelectCurrencyNetwork, + onLongTap = onLongTap, ), ) }