Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-11 17:36:36 +05:00
parent f076ab08e7
commit 2d3a1d3bc7
8 changed files with 45 additions and 1 deletions

View file

@ -68,6 +68,7 @@ internal class PreviewCustomTokenSelectorComponent(
isMainNetwork = false,
isSelected = n.id == params.selectedNetwork?.id,
onSelectedStateChange = { params.onNetworkSelected(n) },
onLongClick = {},
)
}
}

View file

@ -158,6 +158,7 @@ internal class PreviewManageTokensComponent(
isMainNetwork = networkIndex == 0,
isSelected = false,
onSelectedStateChange = { toggleNetwork(currencyIndex, networkIndex, isSelected = it) },
onLongClick = {},
)
}.toImmutableList()

View file

@ -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)
}

View file

@ -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,

View file

@ -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<ChangedCurrencies> = changedCurrenciesManager.currenciesToAdd.asStateFlow()

View file

@ -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<CoroutineScope>,
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,

View file

@ -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)

View file

@ -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,
),
)
}