Updated on 2026-08-14

This commit is contained in:
Tangem 2024-05-13 13:05:17 +05:00
parent 75e2b0b554
commit 0b7c992ec8
15 changed files with 133 additions and 8 deletions

View file

@ -89,7 +89,7 @@ internal object TokenDetailsPreviewData {
private val actionButtons = persistentListOf(
TokenDetailsActionButton.Buy(dimContent = false, onClick = {}),
TokenDetailsActionButton.Send(dimContent = false, onClick = {}),
TokenDetailsActionButton.Receive(onClick = {}),
TokenDetailsActionButton.Receive(onClick = {}, onLongClick = null),
TokenDetailsActionButton.Swap(dimContent = false, onClick = {}),
)

View file

@ -11,6 +11,9 @@ internal sealed class TokenDetailsActionButton(val config: ActionButtonConfig) {
/** Lambda be invoked when manage button is clicked */
abstract val onClick: () -> Unit
/** Lambda be invoked when manage button is long clicked */
open val onLongClick: (() -> TextReference?)? = null
/**
* Buy
*
@ -44,12 +47,17 @@ internal sealed class TokenDetailsActionButton(val config: ActionButtonConfig) {
/**
* Receive
* @property onClick lambda be invoked when Receive button is clicked
* @property onLongClick lambda be invoked when Receive button is long clicked
*/
data class Receive(override val onClick: () -> Unit) : TokenDetailsActionButton(
data class Receive(
override val onClick: () -> Unit,
override val onLongClick: (() -> TextReference?)?,
) : TokenDetailsActionButton(
config = ActionButtonConfig(
text = TextReference.Res(id = R.string.common_receive),
iconResId = R.drawable.ic_arrow_down_24,
onClick = onClick,
onLongClick = onLongClick,
enabled = true,
),
)

View file

@ -35,6 +35,7 @@ internal class TokenDetailsActionButtonsConverter(
is TokenActionsState.ActionState.Receive -> {
TokenDetailsActionButton.Receive(
onClick = { clickIntents.onReceiveClick(action.unavailabilityReason) },
onLongClick = clickIntents::onCopyAddress,
)
}
is TokenActionsState.ActionState.Sell -> {

View file

@ -90,7 +90,7 @@ internal class TokenDetailsSkeletonStateConverter(
return persistentListOf(
TokenDetailsActionButton.Buy(dimContent = false, onClick = {}),
TokenDetailsActionButton.Send(dimContent = false, onClick = {}),
TokenDetailsActionButton.Receive(onClick = {}),
TokenDetailsActionButton.Receive(onClick = {}, onLongClick = null),
TokenDetailsActionButton.Sell(dimContent = false, onClick = {}),
TokenDetailsActionButton.Swap(dimContent = false, onClick = {}),
)

View file

@ -1,8 +1,9 @@
package com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
import com.tangem.core.ui.extensions.TextReference
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
@Suppress("TooManyFunctions")
interface TokenDetailsClickIntents {
@ -50,4 +51,6 @@ interface TokenDetailsClickIntents {
fun onSwapPromoClick()
fun onGenerateExtendedKey()
fun onCopyAddress(): TextReference?
}

View file

@ -10,9 +10,13 @@ import com.tangem.blockchain.common.address.AddressType
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.deeplink.DeepLinksRegistry
import com.tangem.core.deeplink.global.BuyCurrencyDeepLink
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
import com.tangem.core.ui.components.transactions.state.TxHistoryState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.haptic.HapticManager
import com.tangem.datasource.local.swaptx.SwapTransactionStatusStore
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
@ -25,10 +29,10 @@ import com.tangem.domain.settings.ShouldShowSwapPromoTokenUseCase
import com.tangem.domain.tokens.*
import com.tangem.domain.tokens.legacy.TradeCryptoAction
import com.tangem.domain.tokens.legacy.TradeCryptoAction.TransactionInfo
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.NetworkAddress
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
import com.tangem.domain.tokens.models.analytics.TokenExchangeAnalyticsEvent
import com.tangem.domain.tokens.models.analytics.TokenReceiveAnalyticsEvent
import com.tangem.domain.tokens.models.analytics.TokenScreenAnalyticsEvent
@ -59,6 +63,7 @@ import com.tangem.utils.Provider
import com.tangem.utils.coroutines.*
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.*
@ -96,6 +101,8 @@ internal class TokenDetailsViewModel @Inject constructor(
private val isDemoCardUseCase: IsDemoCardUseCase,
private val reduxStateHolder: ReduxStateHolder,
private val analyticsEventsHandler: AnalyticsEventHandler,
private val hapticManager: HapticManager,
private val clipboardManager: ClipboardManager,
featureToggles: TokenDetailsFeatureToggles,
deepLinksRegistry: DeepLinksRegistry,
savedStateHandle: SavedStateHandle,
@ -695,6 +702,17 @@ internal class TokenDetailsViewModel @Inject constructor(
onSwapClick(ScenarioUnavailabilityReason.None)
}
override fun onCopyAddress(): TextReference? {
val networkAddress = cryptoCurrencyStatus?.value?.networkAddress ?: return null
val addresses = networkAddress.availableAddresses.mapToAddressModels(cryptoCurrency).toImmutableList()
val defaultAddress = addresses.firstOrNull()?.value ?: return null
hapticManager.vibrateMeduim()
clipboardManager.setText(text = defaultAddress)
analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(cryptoCurrency.symbol))
return resourceReference(R.string.wallet_notification_address_copied)
}
private fun handleUnavailabilityReason(unavailabilityReason: ScenarioUnavailabilityReason): Boolean {
if (unavailabilityReason == ScenarioUnavailabilityReason.None) return false