Updated on 2026-08-14

This commit is contained in:
Tangem 2023-10-10 18:07:39 +08:00
parent 75234e34df
commit 9091a8acac
9 changed files with 75 additions and 51 deletions

View file

@ -112,6 +112,7 @@ internal class SaveWalletMiddleware {
// Enable saving access codes only if this is the first time user save the wallet
if (isFirstSavedWallet) {
preferencesStorage.shouldSaveAccessCodes = true
store.state.daggerGraphState.get(DaggerGraphState::cardSdkConfigRepository)
.setAccessCodeRequestPolicy(
isBiometricsRequestPolicy = userWallet.hasAccessCode,

View file

@ -2,12 +2,28 @@ package com.tangem.feature.wallet.presentation.wallet.state
import androidx.compose.runtime.Immutable
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.feature.wallet.impl.R
@Immutable
internal sealed class WalletAlertState {
abstract val title: TextReference?
abstract val message: TextReference
open val confirmButtonText: TextReference = resourceReference(id = R.string.common_ok)
open val isWarningConfirmButton: Boolean = false
abstract val onConfirmClick: (() -> Unit)?
data class DefaultAlert(
val title: TextReference,
val message: TextReference,
val onActionClick: (() -> Unit)?,
override val title: TextReference,
override val message: TextReference,
override val onConfirmClick: (() -> Unit)?,
) : WalletAlertState()
data class RemoveWalletAlert(override val onConfirmClick: (() -> Unit)?) : WalletAlertState() {
override val title: TextReference? = null
override val message: TextReference = resourceReference(id = R.string.user_wallet_list_delete_prompt)
override val confirmButtonText: TextReference = resourceReference(id = R.string.common_delete)
override val isWarningConfirmButton: Boolean = true
}
}

View file

@ -12,11 +12,7 @@ internal sealed class WalletEvent {
data class ShowToast(val text: TextReference) : WalletEvent()
data class ShowAlert(
val title: TextReference,
val message: TextReference,
val onActionClick: (() -> Unit)?,
) : WalletEvent()
data class ShowAlert(val state: WalletAlertState) : WalletEvent()
data class CopyAddress(val address: String, val toast: TextReference) : WalletEvent()

View file

@ -118,7 +118,7 @@ internal class WalletSkeletonStateConverter(
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = this),
imageResId = createImageResId(),
onRenameClick = clickIntents::onRenameClick,
onDeleteClick = clickIntents::onDeleteClick,
onDeleteClick = clickIntents::onDeleteBeforeConfirmationClick,
)
}
@ -129,7 +129,7 @@ internal class WalletSkeletonStateConverter(
additionalInfo = if (isMultiCurrency) WalletAdditionalInfoFactory.resolve(wallet = this) else null,
imageResId = createImageResId(),
onRenameClick = clickIntents::onRenameClick,
onDeleteClick = clickIntents::onDeleteClick,
onDeleteClick = clickIntents::onDeleteBeforeConfirmationClick,
)
}

View file

@ -9,23 +9,22 @@ import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.wallet.state.WalletAlertState
@Composable
internal fun WalletAlert(config: WalletAlertState, onDismiss: () -> Unit) {
when (config) {
is WalletAlertState.DefaultAlert -> {
DefaultAlert(config = config, onDismiss = onDismiss)
}
}
internal fun WalletAlert(state: WalletAlertState, onDismiss: () -> Unit) {
DefaultAlert(state = state, onDismiss = onDismiss)
}
@Composable
private fun DefaultAlert(config: WalletAlertState.DefaultAlert, onDismiss: () -> Unit) {
private fun DefaultAlert(state: WalletAlertState, onDismiss: () -> Unit) {
val confirmButton: DialogButton
val dismissButton: DialogButton?
if (config.onActionClick != null) {
val onActionClick = state.onConfirmClick
if (onActionClick != null) {
confirmButton = DialogButton(
title = stringResource(id = R.string.common_ok),
title = state.confirmButtonText.resolveReference(),
warning = state.isWarningConfirmButton,
onClick = {
config.onActionClick.invoke()
onActionClick()
onDismiss()
},
)
@ -35,16 +34,18 @@ private fun DefaultAlert(config: WalletAlertState.DefaultAlert, onDismiss: () ->
)
} else {
confirmButton = DialogButton(
title = stringResource(id = R.string.common_ok),
title = state.confirmButtonText.resolveReference(),
warning = state.isWarningConfirmButton,
onClick = onDismiss,
)
dismissButton = null
}
BasicDialog(
message = config.message.resolveReference(),
message = state.message.resolveReference(),
confirmButton = confirmButton,
onDismissDialog = onDismiss,
title = config.title.resolveReference(),
title = state.title?.resolveReference(),
dismissButton = dismissButton,
)
}

View file

@ -48,15 +48,7 @@ internal fun WalletEventEffect(
clipboardManager.setText(AnnotatedString(value.address))
Toast.makeText(context, value.toast.resolveReference(resources), Toast.LENGTH_SHORT).show()
}
is WalletEvent.ShowAlert -> {
onAlertConfigSet(
WalletAlertState.DefaultAlert(
title = value.title,
message = value.message,
onActionClick = value.onActionClick,
),
)
}
is WalletEvent.ShowAlert -> onAlertConfigSet(value.state)
is WalletEvent.RateApp -> {
val reviewManager = ReviewManagerFactory.create(context)
val requestTask = reviewManager.requestReviewFlow()

View file

@ -82,7 +82,7 @@ internal fun WalletScreen(state: WalletState) {
)
alertConfig?.let {
WalletAlert(config = it, onDismiss = { alertConfig = null })
WalletAlert(state = it, onDismiss = { alertConfig = null })
}
}
is WalletState.Initial -> Unit

View file

@ -45,7 +45,9 @@ internal interface WalletClickIntents {
fun onRenameClick(userWalletId: UserWalletId, name: String)
fun onDeleteClick(userWalletId: UserWalletId)
fun onDeleteBeforeConfirmationClick(userWalletId: UserWalletId)
fun onDeleteAfterConfirmationClick(userWalletId: UserWalletId)
fun onSingleCurrencySendClick(cryptoCurrencyStatus: CryptoCurrencyStatus? = null)

View file

@ -752,7 +752,19 @@ internal class WalletViewModel @Inject constructor(
}
}
override fun onDeleteClick(userWalletId: UserWalletId) {
override fun onDeleteBeforeConfirmationClick(userWalletId: UserWalletId) {
uiState = stateFactory.getStateAndTriggerEvent(
state = uiState,
event = WalletEvent.ShowAlert(
state = WalletAlertState.RemoveWalletAlert(
onConfirmClick = { onDeleteAfterConfirmationClick(userWalletId) },
),
),
setUiState = { uiState = it },
)
}
override fun onDeleteAfterConfirmationClick(userWalletId: UserWalletId) {
val state = uiState as? WalletState.ContentState ?: return
viewModelScope.launch(dispatchers.io) {
deleteWalletUseCase(userWalletId)
@ -820,29 +832,33 @@ internal class WalletViewModel @Inject constructor(
val currency = cryptoCurrencyStatus.currency
return if (currency is CryptoCurrency.Coin && !isCryptoCurrencyCoinCouldHide(userWalletId, currency)) {
WalletEvent.ShowAlert(
title = resourceReference(
id = R.string.token_details_unable_hide_alert_title,
formatArgs = WrappedList(listOf(cryptoCurrencyStatus.currency.name)),
),
message = resourceReference(
id = R.string.token_details_unable_hide_alert_message,
formatArgs = WrappedList(
listOf(
cryptoCurrencyStatus.currency.name,
cryptoCurrencyStatus.currency.network.name,
state = WalletAlertState.DefaultAlert(
title = resourceReference(
id = R.string.token_details_unable_hide_alert_title,
formatArgs = WrappedList(listOf(cryptoCurrencyStatus.currency.name)),
),
message = resourceReference(
id = R.string.token_details_unable_hide_alert_message,
formatArgs = WrappedList(
listOf(
cryptoCurrencyStatus.currency.name,
cryptoCurrencyStatus.currency.network.name,
),
),
),
onConfirmClick = null,
),
onActionClick = null,
)
} else {
WalletEvent.ShowAlert(
title = resourceReference(
id = R.string.token_details_hide_alert_title,
formatArgs = WrappedList(listOf(cryptoCurrencyStatus.currency.name)),
state = WalletAlertState.DefaultAlert(
title = resourceReference(
id = R.string.token_details_hide_alert_title,
formatArgs = WrappedList(listOf(cryptoCurrencyStatus.currency.name)),
),
message = resourceReference(R.string.token_details_hide_alert_message),
onConfirmClick = { onPerformHideToken(cryptoCurrencyStatus) },
),
message = resourceReference(R.string.token_details_hide_alert_message),
onActionClick = { onPerformHideToken(cryptoCurrencyStatus) },
)
}
}