Updated on 2026-08-14
This commit is contained in:
parent
547d562d6d
commit
d0ef5c70cd
12 changed files with 175 additions and 60 deletions
|
|
@ -19,6 +19,8 @@ internal data class ReceiveAddress(
|
|||
data class Default(override val displayName: TextReference) : Primary
|
||||
|
||||
data class Legacy(override val displayName: TextReference) : Primary
|
||||
|
||||
data class Dynamic(override val displayName: TextReference) : Primary
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -20,6 +20,7 @@ import kotlinx.collections.immutable.ImmutableList
|
|||
import kotlinx.collections.immutable.toImmutableList
|
||||
import kotlinx.collections.immutable.toPersistentList
|
||||
|
||||
@Suppress("MagicNumber")
|
||||
internal class TokenReceiveStateFactory(
|
||||
private val currentStateProvider: Provider<TokenReceiveUM>,
|
||||
private val cryptoCurrency: CryptoCurrency,
|
||||
|
|
@ -66,8 +67,9 @@ internal class TokenReceiveStateFactory(
|
|||
compareBy { address ->
|
||||
when (address.type) {
|
||||
is Ens -> 0
|
||||
is Primary.Default -> 1
|
||||
is Primary.Legacy -> 2
|
||||
is Primary.Dynamic -> 1
|
||||
is Primary.Default -> 2
|
||||
is Primary.Legacy -> 3
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
@ -82,32 +84,18 @@ internal class TokenReceiveStateFactory(
|
|||
addresses: List<ReceiveAddressModel>,
|
||||
cryptoCurrency: CryptoCurrency,
|
||||
): ImmutableList<ReceiveAddress> {
|
||||
val needUseToLegacyAndDefaultName = addresses.any { it.nameService == ReceiveAddressModel.NameService.Legacy }
|
||||
val shouldUseToLegacyAndDefaultName = addresses.any { it.displayType == ReceiveAddressModel.DisplayType.Legacy }
|
||||
|
||||
val receiveAddresses = addresses.map { model ->
|
||||
val type = when (model.nameService) {
|
||||
ReceiveAddressModel.NameService.Default -> {
|
||||
val displayName = when (cryptoCurrency) {
|
||||
is CryptoCurrency.Coin -> cryptoCurrency.name
|
||||
is CryptoCurrency.Token -> cryptoCurrency.symbol
|
||||
}
|
||||
|
||||
Primary.Default(
|
||||
displayName = if (needUseToLegacyAndDefaultName) {
|
||||
TextReference.Res(R.string.domain_receive_assets_default_address)
|
||||
} else {
|
||||
TextReference.Combined(
|
||||
wrappedList(
|
||||
TextReference.Str(displayName),
|
||||
TextReference.Str(" "),
|
||||
TextReference.Res(R.string.common_address),
|
||||
),
|
||||
)
|
||||
},
|
||||
)
|
||||
val type = when (model.displayType) {
|
||||
ReceiveAddressModel.DisplayType.Default -> {
|
||||
Primary.Default(displayName = defaultDisplayName(cryptoCurrency, shouldUseToLegacyAndDefaultName))
|
||||
}
|
||||
ReceiveAddressModel.NameService.Ens -> Ens
|
||||
ReceiveAddressModel.NameService.Legacy -> Primary.Legacy(
|
||||
ReceiveAddressModel.DisplayType.Dynamic -> {
|
||||
Primary.Dynamic(displayName = coinAddressDisplayName(cryptoCurrency))
|
||||
}
|
||||
ReceiveAddressModel.DisplayType.Ens -> Ens
|
||||
ReceiveAddressModel.DisplayType.Legacy -> Primary.Legacy(
|
||||
displayName = resourceReference(
|
||||
R.string.domain_receive_assets_legacy_address,
|
||||
WrappedList(listOf(cryptoCurrency.name)),
|
||||
|
|
@ -124,8 +112,9 @@ internal class TokenReceiveStateFactory(
|
|||
compareBy { address ->
|
||||
when (address.type) {
|
||||
is Ens -> 0
|
||||
is Primary.Default -> 1
|
||||
is Primary.Legacy -> 2
|
||||
is Primary.Dynamic -> 1
|
||||
is Primary.Default -> 2
|
||||
is Primary.Legacy -> 3
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
@ -170,4 +159,29 @@ internal class TokenReceiveStateFactory(
|
|||
isGrayscale = false,
|
||||
shouldShowCustomBadge = false,
|
||||
)
|
||||
|
||||
private fun defaultDisplayName(
|
||||
cryptoCurrency: CryptoCurrency,
|
||||
needUseToLegacyAndDefaultName: Boolean,
|
||||
): TextReference {
|
||||
return if (needUseToLegacyAndDefaultName) {
|
||||
TextReference.Res(R.string.domain_receive_assets_default_address)
|
||||
} else {
|
||||
coinAddressDisplayName(cryptoCurrency)
|
||||
}
|
||||
}
|
||||
|
||||
private fun coinAddressDisplayName(cryptoCurrency: CryptoCurrency): TextReference {
|
||||
val displayName = when (cryptoCurrency) {
|
||||
is CryptoCurrency.Coin -> cryptoCurrency.name
|
||||
is CryptoCurrency.Token -> cryptoCurrency.symbol
|
||||
}
|
||||
return TextReference.Combined(
|
||||
wrappedList(
|
||||
TextReference.Str(displayName),
|
||||
TextReference.Str(" "),
|
||||
TextReference.Res(R.string.common_address),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -22,6 +22,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
|||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
|
|
@ -300,6 +301,7 @@ private fun PrimaryAddressesItems(
|
|||
onShareClick = { onShareClick(selectedAddress.value) },
|
||||
primaryType = selectedAddress.type as ReceiveAddress.Type.Primary,
|
||||
address = selectedAddress.value,
|
||||
isDynamicAddress = selectedAddress.type is ReceiveAddress.Type.Primary.Dynamic,
|
||||
snackbarHostState = snackbarHostState,
|
||||
)
|
||||
}
|
||||
|
|
@ -345,6 +347,7 @@ private fun AddressItem(
|
|||
onShareClick: () -> Unit,
|
||||
primaryType: ReceiveAddress.Type.Primary,
|
||||
address: String,
|
||||
isDynamicAddress: Boolean,
|
||||
snackbarHostState: SnackbarHostState,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
|
|
@ -369,6 +372,11 @@ private fun AddressItem(
|
|||
|
||||
SpacerH(12.dp)
|
||||
|
||||
if (isDynamicAddress) {
|
||||
DynamicAddressBadge()
|
||||
SpacerH(8.dp)
|
||||
}
|
||||
|
||||
Text(
|
||||
text = primaryType.displayName.resolveReference(),
|
||||
color = TangemTheme.colors.text.primary1,
|
||||
|
|
@ -564,6 +572,34 @@ private fun ActionButtonWithResizableText(config: ActionButtonConfig, modifier:
|
|||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun DynamicAddressBadge(modifier: Modifier = Modifier) {
|
||||
Row(
|
||||
modifier = modifier
|
||||
.background(
|
||||
color = TangemTheme.colors.text.accent.copy(alpha = 0.1f),
|
||||
shape = RoundedCornerShape(percent = 50),
|
||||
)
|
||||
.padding(horizontal = 12.dp, vertical = 4.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp),
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(
|
||||
id = R.drawable.ic_dynamic_addresses_badge_16,
|
||||
),
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(16.dp),
|
||||
tint = TangemTheme.colors.icon.accent,
|
||||
)
|
||||
Text(
|
||||
text = stringResourceSafe(R.string.dynamic_addresses_receive_badge),
|
||||
style = TangemTheme.typography.caption1,
|
||||
color = TangemTheme.colors.text.accent,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview(showBackground = true, widthDp = 360)
|
||||
@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue