Updated on 2026-08-14

This commit is contained in:
Tangem 2023-02-03 12:12:39 +03:00
commit be91bf0b4d
14 changed files with 421 additions and 185 deletions

View file

@ -1,66 +1,31 @@
package com.tangem.tap.features.saveWallet.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.Dialog
import com.tangem.core.ui.R
import com.tangem.core.ui.components.SpacerH16
import com.tangem.core.ui.components.SpacerH24
import com.tangem.core.ui.components.SpacerW8
import com.tangem.core.ui.components.TextButton
import com.tangem.core.ui.components.BasicDialog
import com.tangem.core.ui.components.DialogButton
import com.tangem.core.ui.res.TangemTheme
import com.tangem.tap.features.saveWallet.ui.models.EnrollBiometricsDialog
@Composable
fun EnrollBiometricsDialogContent(dialog: EnrollBiometricsDialog) {
Dialog(onDismissRequest = dialog.onCancel) {
Column(
modifier = Modifier
.background(
shape = TangemTheme.shapes.roundedCornersLarge,
color = TangemTheme.colors.background.plain,
)
.padding(all = TangemTheme.dimens.spacing24),
) {
Text(
modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.save_user_wallet_agreement_enroll_biometrics_title),
style = TangemTheme.typography.h3,
color = TangemTheme.colors.text.primary1,
)
SpacerH16()
Text(
modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.save_user_wallet_agreement_enroll_biometrics_description),
style = TangemTheme.typography.body2,
color = TangemTheme.colors.text.primary1,
)
SpacerH24()
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.End,
) {
TextButton(
text = stringResource(R.string.common_cancel),
onClick = dialog.onCancel,
)
SpacerW8()
TextButton(
text = stringResource(R.string.common_enable),
onClick = dialog.onEnroll,
)
}
}
}
BasicDialog(
title = stringResource(R.string.save_user_wallet_agreement_enroll_biometrics_title),
message = stringResource(R.string.save_user_wallet_agreement_enroll_biometrics_description),
confirmButton = DialogButton(
title = stringResource(R.string.common_enable),
onClick = dialog.onEnroll,
),
dismissButton = DialogButton(
onClick = dialog.onCancel,
),
onDismissDialog = dialog.onCancel,
)
}
// region Preview

View file

@ -25,9 +25,10 @@ import com.tangem.core.ui.fragments.ComposeBottomSheetFragment
import com.tangem.core.ui.res.TangemTheme
import com.tangem.tap.common.analytics.events.MyWallets
import com.tangem.tap.features.details.ui.cardsettings.resolveReference
import com.tangem.tap.features.walletSelector.ui.components.RemoveWalletDialogContent
import com.tangem.tap.features.walletSelector.ui.components.RenameWalletDialogContent
import com.tangem.tap.features.walletSelector.ui.components.WalletSelectorScreenContent
import com.tangem.tap.features.walletSelector.ui.model.RenameWalletDialog
import com.tangem.tap.features.walletSelector.ui.model.DialogModel
internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment<WalletSelectorScreenState>() {
private val viewModel by viewModels<WalletSelectorViewModel>()
@ -48,7 +49,7 @@ internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment<Wa
override fun ScreenContent(state: WalletSelectorScreenState, modifier: Modifier) {
val snackbarHostState = remember { SnackbarHostState() }
val errorMessage by rememberUpdatedState(newValue = state.error?.resolveReference())
val renameWalletDialog by rememberUpdatedState(newValue = state.renameWalletDialog)
val dialog by rememberUpdatedState(newValue = state.dialog)
Box(modifier = modifier.nestedScroll(rememberNestedScrollInteropConnection())) {
WalletSelectorScreenContent(
@ -71,7 +72,7 @@ internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment<Wa
)
}
RenameWalletDialog(dialog = renameWalletDialog)
Dialog(dialog = dialog)
LaunchedEffect(key1 = errorMessage) {
errorMessage?.let {
@ -83,8 +84,11 @@ internal class WalletSelectorBottomSheetFragment : ComposeBottomSheetFragment<Wa
@Suppress("TopLevelComposableFunctions")
@Composable
private fun RenameWalletDialog(dialog: RenameWalletDialog?) {
private fun Dialog(dialog: DialogModel?) {
if (dialog == null) return
RenameWalletDialogContent(dialog)
when (dialog) {
is DialogModel.RemoveWalletDialog -> RemoveWalletDialogContent(dialog)
is DialogModel.RenameWalletDialog -> RenameWalletDialogContent(dialog)
}
}
}

View file

@ -3,8 +3,8 @@ package com.tangem.tap.features.walletSelector.ui
import androidx.compose.runtime.Immutable
import com.tangem.domain.common.util.UserWalletId
import com.tangem.tap.features.details.ui.cardsettings.TextReference
import com.tangem.tap.features.walletSelector.ui.model.DialogModel
import com.tangem.tap.features.walletSelector.ui.model.MultiCurrencyUserWalletItem
import com.tangem.tap.features.walletSelector.ui.model.RenameWalletDialog
import com.tangem.tap.features.walletSelector.ui.model.SingleCurrencyUserWalletItem
@Immutable
@ -14,7 +14,7 @@ internal data class WalletSelectorScreenState(
val selectedUserWalletId: UserWalletId? = null,
val isLocked: Boolean = false,
val editingUserWalletsIds: List<UserWalletId> = listOf(),
val renameWalletDialog: RenameWalletDialog? = null,
val dialog: DialogModel? = null,
val showAddCardProgress: Boolean = false,
val showUnlockProgress: Boolean = false,
val error: TextReference? = null,

View file

@ -8,7 +8,7 @@ import com.tangem.tap.common.analytics.events.MyWallets
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.features.walletSelector.redux.WalletSelectorAction
import com.tangem.tap.features.walletSelector.redux.WalletSelectorState
import com.tangem.tap.features.walletSelector.ui.model.RenameWalletDialog
import com.tangem.tap.features.walletSelector.ui.model.DialogModel
import com.tangem.tap.store
import com.tangem.tap.userWalletsListManager
import com.tangem.tap.walletStoresManager
@ -67,28 +67,28 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
}
fun renameWallet() = with(state.value) {
if (editingUserWalletsIds.isNotEmpty() && renameWalletDialog == null) {
if (editingUserWalletsIds.isNotEmpty() && dialog == null) {
val editedUserWalletId = editingUserWalletsIds.first()
val editedUserWallet = (multiCurrencyWallets + singleCurrencyWallets)
.find { it.id == editedUserWalletId }
if (editedUserWallet != null) {
Analytics.send(MyWallets.Button.EditWalletTapped())
val dialog = RenameWalletDialog(
val dialog = DialogModel.RenameWalletDialog(
currentName = editedUserWallet.name,
onApply = { newName ->
onConfirm = { newName ->
store.dispatch(WalletSelectorAction.RenameWallet(editedUserWalletId, newName))
stateInternal.update { prevState ->
prevState.copy(
renameWalletDialog = null,
dialog = null,
editingUserWalletsIds = emptyList(),
)
}
},
onCancel = {
onDismiss = {
stateInternal.update { prevState ->
prevState.copy(
renameWalletDialog = null,
dialog = null,
)
}
},
@ -96,7 +96,7 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
stateInternal.update { prevState ->
prevState.copy(
renameWalletDialog = dialog,
dialog = dialog,
)
}
}
@ -105,7 +105,30 @@ internal class WalletSelectorViewModel : ViewModel(), StoreSubscriber<WalletSele
fun deleteWallets() = with(state.value) {
if (editingUserWalletsIds.isNotEmpty()) {
store.dispatch(WalletSelectorAction.RemoveWallets(userWalletsIds = editingUserWalletsIds))
val dialog = DialogModel.RemoveWalletDialog(
onConfirm = {
store.dispatch(WalletSelectorAction.RemoveWallets(editingUserWalletsIds))
stateInternal.update { prevState ->
prevState.copy(
dialog = null,
editingUserWalletsIds = emptyList(),
)
}
},
onDismiss = {
stateInternal.update { prevState ->
prevState.copy(
dialog = null,
)
}
},
)
stateInternal.update { prevState ->
prevState.copy(
dialog = dialog,
)
}
}
}

View file

@ -0,0 +1,24 @@
package com.tangem.tap.features.walletSelector.ui.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import com.tangem.core.ui.components.BasicDialog
import com.tangem.core.ui.components.DialogButton
import com.tangem.tap.features.walletSelector.ui.model.DialogModel
import com.tangem.wallet.R
@Composable
internal fun RemoveWalletDialogContent(dialog: DialogModel.RemoveWalletDialog) {
BasicDialog(
message = stringResource(id = R.string.user_wallet_list_delete_prompt),
confirmButton = DialogButton(
title = stringResource(id = R.string.common_delete),
warning = true,
onClick = dialog.onConfirm,
),
dismissButton = DialogButton(
onClick = dialog.onDismiss,
),
onDismissDialog = dialog.onDismiss,
)
}

View file

@ -1,12 +1,6 @@
package com.tangem.tap.features.walletSelector.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -16,65 +10,39 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.Dialog
import com.tangem.core.ui.components.OutlineTextField
import com.tangem.core.ui.components.SpacerH16
import com.tangem.core.ui.components.SpacerH24
import com.tangem.core.ui.components.SpacerW8
import com.tangem.core.ui.components.TextButton
import com.tangem.core.ui.components.AdditionalTextInputDialogParams
import com.tangem.core.ui.components.DialogButton
import com.tangem.core.ui.components.TextInputDialog
import com.tangem.core.ui.res.TangemTheme
import com.tangem.tap.features.walletSelector.ui.model.RenameWalletDialog
import com.tangem.tap.features.walletSelector.ui.model.DialogModel
import com.tangem.wallet.R
@Composable
internal fun RenameWalletDialogContent(dialog: RenameWalletDialog) {
Dialog(onDismissRequest = dialog.onCancel) {
Column(
modifier = Modifier
.background(
shape = TangemTheme.shapes.roundedCornersLarge,
color = TangemTheme.colors.background.plain,
)
.padding(all = TangemTheme.dimens.spacing24),
) {
var value by remember {
mutableStateOf(TextFieldValue(text = dialog.currentName))
}
Text(
modifier = Modifier.fillMaxWidth(),
text = stringResource(R.string.user_wallet_list_rename_popup_title),
style = TangemTheme.typography.h3,
color = TangemTheme.colors.text.primary1,
)
SpacerH16()
OutlineTextField(
value = value,
label = stringResource(R.string.user_wallet_list_rename_popup_placeholder),
onValueChange = { newValue ->
value = newValue
},
)
SpacerH24()
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.End,
) {
TextButton(
text = stringResource(id = R.string.common_cancel),
onClick = dialog.onCancel,
)
SpacerW8()
TextButton(
text = stringResource(id = R.string.common_save),
enabled = value.text.isNotEmpty() && value.text != dialog.currentName,
onClick = {
dialog.onApply(value.text)
},
)
}
}
internal fun RenameWalletDialogContent(dialog: DialogModel.RenameWalletDialog) {
var value by remember {
mutableStateOf(TextFieldValue(text = dialog.currentName))
}
TextInputDialog(
fieldValue = value,
confirmButton = DialogButton(
title = stringResource(id = R.string.common_save),
enabled = value.text.isNotEmpty() && value.text != dialog.currentName,
onClick = { dialog.onConfirm(value.text) },
),
onDismissDialog = dialog.onDismiss,
onValueChange = { newValue ->
value = newValue
},
title = stringResource(R.string.user_wallet_list_rename_popup_title),
dismissButton = DialogButton(
title = stringResource(id = R.string.common_cancel),
onClick = dialog.onDismiss,
),
textFieldParams = AdditionalTextInputDialogParams(
label = stringResource(R.string.user_wallet_list_rename_popup_placeholder),
),
)
}
// region Preview
@ -83,10 +51,9 @@ private fun RenameWalletDialogContentSample(
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier
.background(TangemTheme.colors.background.primary),
modifier = modifier,
) {
RenameWalletDialogContent(dialog = RenameWalletDialog("", {}, {}))
RenameWalletDialogContent(dialog = DialogModel.RenameWalletDialog("", {}, {}))
}
}

View file

@ -0,0 +1,14 @@
package com.tangem.tap.features.walletSelector.ui.model
internal sealed interface DialogModel {
data class RenameWalletDialog(
val currentName: String,
val onConfirm: (newName: String) -> Unit,
val onDismiss: () -> Unit,
) : DialogModel
data class RemoveWalletDialog(
val onConfirm: () -> Unit,
val onDismiss: () -> Unit,
) : DialogModel
}

View file

@ -1,10 +0,0 @@
package com.tangem.tap.features.walletSelector.ui.model
import androidx.compose.runtime.Immutable
@Immutable
internal data class RenameWalletDialog(
val currentName: String,
val onApply: (newName: String) -> Unit,
val onCancel: () -> Unit,
)