Updated on 2026-08-14

This commit is contained in:
Tangem 2025-04-02 01:41:05 +05:00
parent 6c16caedba
commit 3bbdbbb5a3
16 changed files with 286 additions and 73 deletions

View file

@ -1,10 +1,27 @@
package com.tangem.common.ui.bottomsheet.chooseaddress
import com.tangem.common.ui.bottomsheet.receive.AddressModel
import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig
import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.tokens.model.NetworkAddress
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
class ChooseAddressBottomSheetConfig(
val addressModels: ImmutableList<AddressModel>,
val onClick: (AddressModel) -> Unit,
) : TangemBottomSheetConfigContent
) : TangemBottomSheetConfigContent {
constructor(
asset: TokenReceiveBottomSheetConfig.Asset,
network: Network,
networkAddress: NetworkAddress,
onClick: (AddressModel) -> Unit,
) : this(
addressModels = networkAddress.availableAddresses
.mapToAddressModels(asset, network)
.toImmutableList(),
onClick = onClick,
)
}

View file

@ -1,6 +1,9 @@
package com.tangem.common.ui.bottomsheet.receive
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.combinedReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network
@ -12,18 +15,48 @@ private const val DEL_ADDRESS_NAME = "Main"
private const val LEGACY_ADDRESS_NAME = "Legacy"
private const val DEFAULT_ADDRESS_NAME = "Default"
fun Set<NetworkAddress.Address>.mapToAddressModels(currency: CryptoCurrency): List<AddressModel> = this
.sortedBy { it.type.ordinal }
.map { address ->
AddressModel(
displayName = currency.network.getAddressDisplayName(address.type),
value = address.value,
type = when (address.type) {
NetworkAddress.Address.Type.Primary -> AddressModel.Type.Default
NetworkAddress.Address.Type.Secondary -> AddressModel.Type.Legacy
},
)
}
fun Set<NetworkAddress.Address>.mapToAddressModels(cryptoCurrency: CryptoCurrency) = mapToAddressModels(
stringReference("${cryptoCurrency.name} (${cryptoCurrency.symbol})"),
cryptoCurrency.network,
)
fun Set<NetworkAddress.Address>.mapToAddressModels(
asset: TokenReceiveBottomSheetConfig.Asset,
network: Network,
): List<AddressModel> = when (asset) {
is TokenReceiveBottomSheetConfig.Asset.Currency -> mapToAddressModels(
stringReference("${asset.name} (${asset.symbol})"),
network,
)
is TokenReceiveBottomSheetConfig.Asset.NFT -> mapToAddressModels(
resourceReference(R.string.common_nft),
network,
)
}
private fun Set<NetworkAddress.Address>.mapToAddressModels(name: TextReference, network: Network): List<AddressModel> =
this
.sortedBy { it.type.ordinal }
.map { address ->
val displayName = network.getAddressDisplayName(address.type)
AddressModel(
displayName = displayName,
fullName = if (this.size < 2) {
name
} else {
combinedReference(
displayName,
stringReference(" "),
name,
)
},
value = address.value,
type = when (address.type) {
NetworkAddress.Address.Type.Primary -> AddressModel.Type.Default
NetworkAddress.Address.Type.Secondary -> AddressModel.Type.Legacy
},
)
}
private fun Network.getAddressDisplayName(addressType: NetworkAddress.Address.Type): TextReference {
return when (id.value) {

View file

@ -4,6 +4,7 @@ import com.tangem.core.ui.extensions.TextReference
data class AddressModel(
val displayName: TextReference,
val fullName: TextReference,
val value: String,
val type: Type,
) {

View file

@ -67,7 +67,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi
QrCodeContent(content = content, onAddressChange = { selectedAddress = it })
Info(
currency = content.symbol,
symbol = content.asset.displaySymbol,
network = content.network,
showMemoDisclaimer = content.showMemoDisclaimer,
)
@ -82,7 +82,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi
}
@Composable
private fun Info(currency: String, network: String, showMemoDisclaimer: Boolean, modifier: Modifier = Modifier) {
private fun Info(symbol: TextReference, network: String, showMemoDisclaimer: Boolean, modifier: Modifier = Modifier) {
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
@ -104,7 +104,7 @@ private fun Info(currency: String, network: String, showMemoDisclaimer: Boolean,
config = NotificationConfig(
title = resourceReference(
R.string.receive_bottom_sheet_warning_title,
wrappedList(currency, network),
wrappedList(symbol.resolveReference(), network),
),
subtitle = resourceReference(R.string.receive_bottom_sheet_warning_message_description),
iconResId = R.drawable.ic_alert_circle_24,
@ -189,9 +189,8 @@ private fun QrCodePage(content: TokenReceiveBottomSheetConfig, qrCodePainter: Pa
) {
Text(
text = stringResourceSafe(
R.string.receive_bottom_sheet_warning_message,
getName(content = content, index = currentIndex),
content.symbol,
R.string.receive_bottom_sheet_warning_message_compact,
content.addresses[currentIndex].fullName.resolveReference(),
content.network,
),
color = TangemTheme.colors.text.primary1,
@ -215,15 +214,6 @@ private fun QrCodePage(content: TokenReceiveBottomSheetConfig, qrCodePainter: Pa
}
}
@Composable
private fun getName(content: TokenReceiveBottomSheetConfig, index: Int): String {
return if (content.addresses.size < 2) {
content.name
} else {
"${content.addresses[index].displayName.resolveReference()} ${content.name}"
}
}
@Composable
private fun Buttons(
snackbarHostState: SnackbarHostState,
@ -291,12 +281,18 @@ private fun Preview_TokenReceiveBottomSheet(
private class TokenReceiveBottomSheetConfigPreviewProvider : PreviewParameterProvider<TokenReceiveBottomSheetConfig> {
val address = AddressModel(
displayName = stringReference("Address 1"),
fullName = combinedReference(
stringReference("Address 1"),
stringReference(" Stellar"),
),
value = "0xe5178c7d4d0e861ed2e9414e045b501226b0de8d",
type = AddressModel.Type.Default,
)
private val baseConfig = TokenReceiveBottomSheetConfig(
name = "Stellar",
symbol = "XLM",
asset = TokenReceiveBottomSheetConfig.Asset.Currency(
name = "Stellar",
symbol = "XLM",
),
network = "Ethereum",
addresses = persistentListOf(address),
showMemoDisclaimer = false,

View file

@ -1,14 +1,51 @@
package com.tangem.common.ui.bottomsheet.receive
import androidx.compose.runtime.Immutable
import com.tangem.core.ui.R
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.tokens.model.NetworkAddress
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
data class TokenReceiveBottomSheetConfig(
val name: String,
val symbol: String,
val asset: Asset,
val network: String,
val addresses: ImmutableList<AddressModel>,
val showMemoDisclaimer: Boolean,
val onCopyClick: (String) -> Unit,
val onShareClick: (String) -> Unit,
) : TangemBottomSheetConfigContent
) : TangemBottomSheetConfigContent {
constructor(
asset: Asset,
network: Network,
networkAddress: NetworkAddress,
showMemoDisclaimer: Boolean,
onCopyClick: (String) -> Unit,
onShareClick: (String) -> Unit,
) : this(
asset = asset,
network = network.name,
addresses = networkAddress.availableAddresses
.mapToAddressModels(asset, network)
.toImmutableList(),
showMemoDisclaimer = showMemoDisclaimer,
onCopyClick = onCopyClick,
onShareClick = onShareClick,
)
@Immutable
sealed class Asset {
abstract val displaySymbol: TextReference
data class Currency(val name: String, val symbol: String) : Asset() {
override val displaySymbol = stringReference(symbol)
}
data object NFT : Asset() {
override val displaySymbol = resourceReference(R.string.common_nft)
}
}
}