Updated on 2026-08-14
This commit is contained in:
parent
5b395f5f16
commit
126900b6ff
2 changed files with 158 additions and 94 deletions
|
|
@ -1,11 +1,23 @@
|
||||||
package com.tangem.tap.features.walletSelector.ui.components
|
package com.tangem.tap.features.walletSelector.ui.components
|
||||||
|
|
||||||
import androidx.compose.foundation.*
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.combinedClickable
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.Icon
|
import androidx.compose.material.Icon
|
||||||
import androidx.compose.material.IconButton
|
import androidx.compose.material.IconButton
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberUpdatedState
|
import androidx.compose.runtime.rememberUpdatedState
|
||||||
|
|
@ -15,7 +27,11 @@ import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import com.tangem.core.ui.components.*
|
import com.tangem.core.ui.components.PrimaryButton
|
||||||
|
import com.tangem.core.ui.components.SecondaryButtonIconRight
|
||||||
|
import com.tangem.core.ui.components.SpacerH16
|
||||||
|
import com.tangem.core.ui.components.SpacerH24
|
||||||
|
import com.tangem.core.ui.components.SpacerWMax
|
||||||
import com.tangem.core.ui.components.atoms.Hand
|
import com.tangem.core.ui.components.atoms.Hand
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.tap.features.details.ui.cardsettings.resolveReference
|
import com.tangem.tap.features.details.ui.cardsettings.resolveReference
|
||||||
|
|
@ -35,31 +51,16 @@ internal fun WalletSelectorScreenContent(
|
||||||
onEditSelectedWalletClick: () -> Unit,
|
onEditSelectedWalletClick: () -> Unit,
|
||||||
onDeleteSelectedWalletsClick: () -> Unit,
|
onDeleteSelectedWalletsClick: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val editingWalletsSize by rememberUpdatedState(newValue = state.editingWalletsIds.size)
|
|
||||||
|
|
||||||
Column(modifier = modifier) {
|
Column(modifier = modifier) {
|
||||||
Hand()
|
Header(
|
||||||
SpacerH12()
|
modifier = Modifier
|
||||||
if (editingWalletsSize > 0) {
|
.padding(horizontal = TangemTheme.dimens.spacing16)
|
||||||
EditWalletsBar(
|
.fillMaxWidth(),
|
||||||
modifier = Modifier
|
editingWalletsIds = state.editingWalletsIds,
|
||||||
.padding(horizontal = TangemTheme.dimens.spacing16)
|
onClearSelectedClick = onClearSelectedClick,
|
||||||
.fillMaxWidth(),
|
onEditSelectedWalletClick = onEditSelectedWalletClick,
|
||||||
editingWalletsSize = editingWalletsSize,
|
onDeleteSelectedWalletsClick = onDeleteSelectedWalletsClick,
|
||||||
onClearSelectedClick = onClearSelectedClick,
|
)
|
||||||
onEditSelectedWalletClick = onEditSelectedWalletClick,
|
|
||||||
onDeleteSelectedWalletsClick = onDeleteSelectedWalletsClick,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Text(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
text = stringResource(R.string.user_wallet_list_title),
|
|
||||||
style = TangemTheme.typography.subtitle1,
|
|
||||||
color = TangemTheme.colors.text.primary1,
|
|
||||||
textAlign = TextAlign.Center,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
SpacerH12()
|
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.verticalScroll(
|
.verticalScroll(
|
||||||
|
|
@ -76,28 +77,15 @@ internal fun WalletSelectorScreenContent(
|
||||||
onWalletLongClick = onWalletLongClick,
|
onWalletLongClick = onWalletLongClick,
|
||||||
)
|
)
|
||||||
SpacerH24()
|
SpacerH24()
|
||||||
if (state.isLocked) {
|
Footer(
|
||||||
PrimaryButton(
|
|
||||||
modifier = Modifier
|
|
||||||
.padding(horizontal = TangemTheme.dimens.spacing16)
|
|
||||||
.fillMaxWidth(),
|
|
||||||
text = stringResource(
|
|
||||||
id = R.string.user_wallet_list_unlock_all,
|
|
||||||
stringResource(id = R.string.common_biometrics),
|
|
||||||
),
|
|
||||||
showProgress = state.showUnlockProgress,
|
|
||||||
onClick = onUnlockClick,
|
|
||||||
)
|
|
||||||
SpacerH12()
|
|
||||||
}
|
|
||||||
SecondaryButtonIconRight(
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(horizontal = TangemTheme.dimens.spacing16)
|
.padding(horizontal = TangemTheme.dimens.spacing16)
|
||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
text = stringResource(R.string.user_wallet_list_add_button),
|
isLocked = state.isLocked,
|
||||||
showProgress = state.showAddCardProgress,
|
showUnlockProgress = state.showUnlockProgress,
|
||||||
icon = painterResource(id = R.drawable.ic_tangem),
|
showAddCardProgress = state.showAddCardProgress,
|
||||||
onClick = onAddCardClick,
|
onUnlockClick = onUnlockClick,
|
||||||
|
onAddCardClick = onAddCardClick,
|
||||||
)
|
)
|
||||||
SpacerH16()
|
SpacerH16()
|
||||||
}
|
}
|
||||||
|
|
@ -105,62 +93,42 @@ internal fun WalletSelectorScreenContent(
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun EditWalletsBar(
|
private fun Header(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
editingWalletsSize: Int,
|
editingWalletsIds: List<String>,
|
||||||
onClearSelectedClick: () -> Unit,
|
onClearSelectedClick: () -> Unit,
|
||||||
onEditSelectedWalletClick: () -> Unit,
|
onEditSelectedWalletClick: () -> Unit,
|
||||||
onDeleteSelectedWalletsClick: () -> Unit,
|
onDeleteSelectedWalletsClick: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val showEditAction = remember(editingWalletsSize) { editingWalletsSize in 1 until 2 }
|
val editingWalletsSize by rememberUpdatedState(newValue = editingWalletsIds.size)
|
||||||
Row(
|
val hasEditingWallets by remember {
|
||||||
modifier = modifier
|
derivedStateOf { editingWalletsSize > 0 }
|
||||||
.padding(vertical = TangemTheme.dimens.spacing8)
|
}
|
||||||
.fillMaxWidth(),
|
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
Column(modifier = modifier) {
|
||||||
) {
|
Hand()
|
||||||
IconButton(
|
Box(
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size32),
|
modifier = Modifier
|
||||||
onClick = onClearSelectedClick,
|
.fillMaxWidth()
|
||||||
|
.height(TangemTheme.dimens.size44),
|
||||||
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
Icon(
|
if (hasEditingWallets) {
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size24),
|
EditWalletsBar(
|
||||||
painter = painterResource(id = R.drawable.ic_close),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
tint = TangemTheme.colors.icon.primary1,
|
editingWalletsSize = editingWalletsSize,
|
||||||
contentDescription = "Unselect wallets",
|
onClearSelectedClick = onClearSelectedClick,
|
||||||
)
|
onEditSelectedWalletClick = onEditSelectedWalletClick,
|
||||||
}
|
onDeleteSelectedWalletsClick = onDeleteSelectedWalletsClick,
|
||||||
SpacerW16()
|
)
|
||||||
Text(
|
} else {
|
||||||
text = stringResource(id = R.string.user_wallet_list_editing_count, editingWalletsSize),
|
Text(
|
||||||
style = TangemTheme.typography.subtitle1,
|
text = stringResource(R.string.user_wallet_list_title),
|
||||||
color = TangemTheme.colors.text.primary1,
|
style = TangemTheme.typography.subtitle1,
|
||||||
)
|
color = TangemTheme.colors.text.primary1,
|
||||||
SpacerWMax()
|
textAlign = TextAlign.Center,
|
||||||
if (showEditAction) {
|
|
||||||
IconButton(
|
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size32),
|
|
||||||
onClick = onEditSelectedWalletClick,
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size24),
|
|
||||||
painter = painterResource(id = R.drawable.ic_pencil_outline_24),
|
|
||||||
tint = TangemTheme.colors.icon.primary1,
|
|
||||||
contentDescription = "Edit wallet name",
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
SpacerW8()
|
|
||||||
}
|
|
||||||
IconButton(
|
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size32),
|
|
||||||
onClick = onDeleteSelectedWalletsClick,
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size24),
|
|
||||||
painter = painterResource(id = R.drawable.ic_trash),
|
|
||||||
tint = TangemTheme.colors.icon.warning,
|
|
||||||
contentDescription = "Delete selected wallets",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -208,6 +176,101 @@ private fun WalletsList(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun Footer(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
isLocked: Boolean,
|
||||||
|
showUnlockProgress: Boolean,
|
||||||
|
showAddCardProgress: Boolean,
|
||||||
|
onUnlockClick: () -> Unit,
|
||||||
|
onAddCardClick: () -> Unit,
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = modifier,
|
||||||
|
verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12),
|
||||||
|
) {
|
||||||
|
if (isLocked) {
|
||||||
|
PrimaryButton(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
text = stringResource(
|
||||||
|
id = R.string.user_wallet_list_unlock_all,
|
||||||
|
stringResource(id = R.string.common_biometrics),
|
||||||
|
),
|
||||||
|
showProgress = showUnlockProgress,
|
||||||
|
onClick = onUnlockClick,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
SecondaryButtonIconRight(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
text = stringResource(R.string.user_wallet_list_add_button),
|
||||||
|
showProgress = showAddCardProgress,
|
||||||
|
icon = painterResource(id = R.drawable.ic_tangem),
|
||||||
|
onClick = onAddCardClick,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun EditWalletsBar(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
editingWalletsSize: Int,
|
||||||
|
onClearSelectedClick: () -> Unit,
|
||||||
|
onEditSelectedWalletClick: () -> Unit,
|
||||||
|
onDeleteSelectedWalletsClick: () -> Unit,
|
||||||
|
) {
|
||||||
|
val showEditAction by remember(editingWalletsSize) {
|
||||||
|
derivedStateOf { editingWalletsSize in 1 until 2 }
|
||||||
|
}
|
||||||
|
|
||||||
|
Row(
|
||||||
|
modifier = modifier,
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12),
|
||||||
|
) {
|
||||||
|
IconButton(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size32),
|
||||||
|
onClick = onClearSelectedClick,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size24),
|
||||||
|
painter = painterResource(id = R.drawable.ic_close),
|
||||||
|
tint = TangemTheme.colors.icon.primary1,
|
||||||
|
contentDescription = "Unselect wallets",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.user_wallet_list_editing_count, editingWalletsSize),
|
||||||
|
style = TangemTheme.typography.subtitle1,
|
||||||
|
color = TangemTheme.colors.text.primary1,
|
||||||
|
)
|
||||||
|
SpacerWMax()
|
||||||
|
if (showEditAction) {
|
||||||
|
IconButton(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size32),
|
||||||
|
onClick = onEditSelectedWalletClick,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size24),
|
||||||
|
painter = painterResource(id = R.drawable.ic_pencil_outline_24),
|
||||||
|
tint = TangemTheme.colors.icon.primary1,
|
||||||
|
contentDescription = "Change wallet name",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IconButton(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size32),
|
||||||
|
onClick = onDeleteSelectedWalletsClick,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
modifier = Modifier.size(TangemTheme.dimens.size24),
|
||||||
|
painter = painterResource(id = R.drawable.ic_trash),
|
||||||
|
tint = TangemTheme.colors.icon.warning,
|
||||||
|
contentDescription = "Delete selected wallets",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// region Preview
|
// region Preview
|
||||||
@Composable
|
@Composable
|
||||||
private fun WalletSelectorScreenContentSample(
|
private fun WalletSelectorScreenContentSample(
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ data class TangemDimens internal constructor(
|
||||||
val size32: Dp = 32.dp,
|
val size32: Dp = 32.dp,
|
||||||
val size40: Dp = 40.dp,
|
val size40: Dp = 40.dp,
|
||||||
val size42: Dp = 42.dp,
|
val size42: Dp = 42.dp,
|
||||||
|
val size44: Dp = 44.dp,
|
||||||
val size48: Dp = 48.dp,
|
val size48: Dp = 48.dp,
|
||||||
val size56: Dp = 56.dp,
|
val size56: Dp = 56.dp,
|
||||||
val size62: Dp = 62.dp,
|
val size62: Dp = 62.dp,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue