Updated on 2026-08-14

This commit is contained in:
Tangem 2024-02-09 12:49:50 +01:00
parent 0b8c00c156
commit e80b02306f
5 changed files with 66 additions and 45 deletions

View file

@ -1,11 +1,13 @@
package com.tangem.core.ui.components.buttons
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@ -51,12 +53,22 @@ fun SecondarySmallButton(config: SmallButtonConfig, modifier: Modifier = Modifie
@Composable
private fun SmallButton(config: SmallButtonConfig, isPrimary: Boolean, modifier: Modifier = Modifier) {
val shape = RoundedCornerShape(size = TangemTheme.dimens.radius16)
val backgroundColor by animateColorAsState(
targetValue = if (isPrimary) TangemTheme.colors.button.primary else TangemTheme.colors.button.secondary,
label = "Update background color",
)
val textColor by animateColorAsState(
targetValue = if (isPrimary) TangemTheme.colors.text.primary2 else TangemTheme.colors.text.primary1,
label = "Update text color",
)
Box(
modifier = modifier
.defaultMinSize(minWidth = TangemTheme.dimens.size46, minHeight = TangemTheme.dimens.size24)
.clip(shape)
.background(
color = if (isPrimary) TangemTheme.colors.button.primary else TangemTheme.colors.button.secondary,
color = backgroundColor,
shape = shape,
)
.clickable(enabled = true, onClick = config.onClick)
@ -66,8 +78,11 @@ private fun SmallButton(config: SmallButtonConfig, isPrimary: Boolean, modifier:
contentAlignment = Alignment.Center,
) {
Text(
modifier = Modifier.padding(
horizontal = TangemTheme.dimens.spacing10,
),
text = config.text.resolveReference(),
color = if (isPrimary) TangemTheme.colors.text.primary2 else TangemTheme.colors.text.primary1,
color = textColor,
maxLines = 1,
style = TangemTheme.typography.button,
)
@ -97,7 +112,7 @@ private fun ButtonsSample() {
verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing8),
) {
val config = SmallButtonConfig(
text = TextReference.Str(value = "Add"),
text = TextReference.Str(value = "Adddddddd"),
onClick = {},
)
PrimarySmallButton(config = config)

View file

@ -12,9 +12,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.Keyboard
import com.tangem.core.ui.components.PrimaryButton
import com.tangem.core.ui.components.RectangleShimmer
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
import com.tangem.core.ui.components.keyboardAsState
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.managetokens.impl.R
@ -46,11 +48,14 @@ internal fun CustomTokensScreen(state: AddCustomTokenState, modifier: Modifier =
@Composable
private fun Content(state: AddCustomTokenState, modifier: Modifier = Modifier) {
val keyboard by keyboardAsState()
Column(
modifier = modifier
.background(color = TangemTheme.colors.background.tertiary)
.statusBarsPadding()
.navigationBarsPadding()
.imePadding()
.padding(
top = TangemTheme.dimens.spacing10,
start = TangemTheme.dimens.spacing16,
@ -78,12 +83,14 @@ private fun Content(state: AddCustomTokenState, modifier: Modifier = Modifier) {
.padding(bottom = TangemTheme.dimens.spacing16),
)
CustomTokenItemsList(state = state)
PrimaryButton(
text = stringResource(id = R.string.custom_token_add_token),
onClick = state.addTokenButton.onClick,
enabled = state.addTokenButton.isEnabled,
modifier = Modifier.fillMaxWidth(),
)
if (keyboard is Keyboard.Closed) {
PrimaryButton(
text = stringResource(id = R.string.custom_token_add_token),
onClick = state.addTokenButton.onClick,
enabled = state.addTokenButton.isEnabled,
modifier = Modifier.fillMaxWidth(),
)
}
}
if (state.chooseWalletState is ChooseWalletState.Choose && state.chooseWalletState.show) {

View file

@ -84,29 +84,18 @@ internal fun ChooseNetworkScreen(
SpacerH(height = TangemTheme.dimens.spacing16)
}
item {
if (networkState.nativeNetworks.isNotEmpty()) {
NativeNetworks(networkState = networkState, tokenState = state)
}
if (networkState.nativeNetworks.isNotEmpty()) {
this@LazyColumn.nativeNetworks(networkState = networkState, tokenState = state)
}
if (networkState.nonNativeNetworks.isNotEmpty()) {
item {
NonNativeNetworksHeader(networkState.onNonNativeNetworkHintClick)
}
item {
SpacerH(height = TangemTheme.dimens.spacing8)
}
item {
this@LazyColumn.NonNativeNetworks(networkState = networkState, tokenState = state)
}
this@LazyColumn.nonNativeNetworks(networkState = networkState, tokenState = state)
}
}
}
@Composable
private fun NativeNetworks(networkState: ChooseNetworkState, tokenState: TokenItemState.Loaded) {
Column {
private fun LazyListScope.nativeNetworks(networkState: ChooseNetworkState, tokenState: TokenItemState.Loaded) {
item {
Text(
text = stringResource(id = R.string.manage_tokens_network_selector_native_title),
color = TangemTheme.colors.text.tertiary,
@ -119,25 +108,35 @@ private fun NativeNetworks(networkState: ChooseNetworkState, tokenState: TokenIt
style = TangemTheme.typography.caption2,
)
SpacerH(height = TangemTheme.dimens.spacing8)
}
networkState.nativeNetworks.forEachIndexed { index, network ->
NetworkItem(
state = network,
tokenState = tokenState,
modifier = Modifier
.roundedShapeItemDecoration(
currentIndex = index,
lastIndex = networkState.nativeNetworks.lastIndex,
addDefaultPadding = false,
),
)
}
items(
count = networkState.nativeNetworks.count(),
key = { index -> networkState.nativeNetworks[index].id },
) { index ->
NetworkItem(
state = networkState.nativeNetworks[index],
tokenState = tokenState,
modifier = Modifier
.roundedShapeItemDecoration(
currentIndex = index,
lastIndex = networkState.nativeNetworks.lastIndex,
addDefaultPadding = false,
),
)
}
item {
SpacerH(height = TangemTheme.dimens.spacing16)
}
}
@Composable
private fun LazyListScope.NonNativeNetworks(networkState: ChooseNetworkState, tokenState: TokenItemState.Loaded) {
private fun LazyListScope.nonNativeNetworks(networkState: ChooseNetworkState, tokenState: TokenItemState.Loaded) {
item {
NonNativeNetworksHeader(networkState.onNonNativeNetworkHintClick)
SpacerH(height = TangemTheme.dimens.spacing8)
}
items(
count = networkState.nonNativeNetworks.count(),
key = { index -> networkState.nonNativeNetworks[index].id },
@ -153,6 +152,7 @@ private fun LazyListScope.NonNativeNetworks(networkState: ChooseNetworkState, to
),
)
}
item {
SpacerH(height = TangemTheme.dimens.spacing16)
}

View file

@ -2,10 +2,7 @@ package com.tangem.managetokens.presentation.managetokens.ui
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.Surface
import androidx.compose.runtime.*
@ -52,6 +49,8 @@ private fun Content(state: ManageTokensState) {
Box(
modifier = Modifier
.fillMaxSize()
.navigationBarsPadding()
.imePadding()
.background(color = TangemTheme.colors.background.primary)
.padding(top = TangemTheme.dimens.spacing32),
) {

View file

@ -323,7 +323,6 @@ internal class ManageTokensViewModel @Inject constructor(
"It is only null if Blockchain is Unknown, which mustn't happen here"
}
if (!network.isAdded.value) {
updateUi(token, network)
addedCurrenciesByWallet[selectedWallet]?.add(cryptoCurrency)
allAddedCurrencies.add(cryptoCurrency)
viewModelScope.launch(dispatchers.io) {
@ -332,13 +331,14 @@ internal class ManageTokensViewModel @Inject constructor(
currency = cryptoCurrency,
)
}
updateUi(token, network)
} else {
viewModelScope.launch(dispatchers.io) {
if (canBeRemovedAndShowAlertIfNot(selectedWallet.walletId, cryptoCurrency)) {
withContext(dispatchers.main) { updateUi(token, network) }
addedCurrenciesByWallet[selectedWallet]?.remove(cryptoCurrency)
allAddedCurrencies.remove(cryptoCurrency)
removeCurrencyUseCase(selectedWallet.walletId, cryptoCurrency)
withContext(dispatchers.main) { updateUi(token, network) }
}
}
}