Updated on 2026-08-14

This commit is contained in:
Tangem 2022-12-09 13:30:44 +03:00
parent 5b395f5f16
commit 126900b6ff
2 changed files with 158 additions and 94 deletions

View file

@ -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(

View file

@ -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,