diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/SmallButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/SmallButton.kt index 5528c5dab9..60bc4a690f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/buttons/SmallButton.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/buttons/SmallButton.kt @@ -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) diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/customtokens/ui/CustomTokensScreen.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/customtokens/ui/CustomTokensScreen.kt index 98f97905a6..ce244c3e85 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/customtokens/ui/CustomTokensScreen.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/customtokens/ui/CustomTokensScreen.kt @@ -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) { diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ChooseNetworkScreen.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ChooseNetworkScreen.kt index 444df9d0fe..ead0700da2 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ChooseNetworkScreen.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ChooseNetworkScreen.kt @@ -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) } diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ManageTokensScreen.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ManageTokensScreen.kt index fb67526346..77c91a26e3 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ManageTokensScreen.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/ManageTokensScreen.kt @@ -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), ) { diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt index e0630d462e..ac7b3cbc5d 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt @@ -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) } } } }