Updated on 2026-08-14

This commit is contained in:
Tangem 2025-01-30 16:14:52 +03:00
parent c72310f5c3
commit ce8ae2538a
5 changed files with 33 additions and 15 deletions

View file

@ -10,6 +10,7 @@ import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.domain.wallets.models.UpdateWalletError
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.usecase.GetWalletNamesUseCase
import com.tangem.domain.wallets.usecase.RenameWalletUseCase
import com.tangem.feature.walletsettings.component.RenameWalletComponent
import com.tangem.feature.walletsettings.entity.RenameWalletUM
@ -26,17 +27,20 @@ import timber.log.Timber
internal class DefaultRenameWalletComponent @AssistedInject constructor(
@Assisted context: AppComponentContext,
@Assisted private val params: RenameWalletComponent.Params,
getWalletNamesUseCase: GetWalletNamesUseCase,
private val renameWalletUseCase: RenameWalletUseCase,
) : RenameWalletComponent, AppComponentContext by context {
private val currentWalletName = params.currentName
private val initialName = params.currentName
private val walletNames by lazy(getWalletNamesUseCase::invoke)
private val stateFlow: MutableStateFlow<RenameWalletUM> = MutableStateFlow(
value = RenameWalletUM(
walletNameValue = TextFieldValue(text = params.currentName),
updateValue = ::updateValue,
onValueChange = ::updateValue,
isConfirmEnabled = false,
onConfirm = { renameWallet(params.userWalletId) },
error = null,
),
)
@ -48,24 +52,31 @@ internal class DefaultRenameWalletComponent @AssistedInject constructor(
override fun Dialog() {
val model by stateFlow.collectAsStateWithLifecycle()
RenameWalletDialog(
model = model,
onDismiss = ::dismiss,
)
RenameWalletDialog(model = model, onDismiss = ::dismiss)
}
private fun updateValue(value: TextFieldValue) {
stateFlow.update {
val isNameAlreadyExists = initialName != value.text && walletNames.contains(value.text)
it.copy(
walletNameValue = value,
isConfirmEnabled = value.text.isNotBlank() && value.text != currentWalletName,
isConfirmEnabled = value.text.isNotBlank() &&
value.text != initialName &&
!isNameAlreadyExists,
error = if (isNameAlreadyExists) {
resourceReference(
id = R.string.user_wallet_list_rename_popup_error_already_exists,
formatArgs = wrappedList(value.text),
)
} else {
null
},
)
}
}
private fun renameWallet(userWalletId: UserWalletId) = componentScope.launch {
stateFlow.update { it.copy(isConfirmEnabled = false) }
val newName = stateFlow.value.walletNameValue
val maybeError = renameWalletUseCase(userWalletId, newName.text).leftOrNull()
@ -76,14 +87,14 @@ internal class DefaultRenameWalletComponent @AssistedInject constructor(
is UpdateWalletError.DataError -> resourceReference(id = R.string.common_unknown_error)
is UpdateWalletError.NameAlreadyExists -> resourceReference(
id = R.string.user_wallet_list_rename_popup_error_already_exists,
formatArgs = wrappedList(newName),
formatArgs = wrappedList(newName.text),
)
}
messageSender.send(message = SnackbarMessage(message))
} else {
dismiss()
}
dismiss()
}
@AssistedFactory

View file

@ -11,8 +11,9 @@ internal class PreviewRenameWalletComponent : RenameWalletComponent {
private val previewState = RenameWalletUM(
walletNameValue = TextFieldValue(text = "My Wallet"),
isConfirmEnabled = false,
updateValue = {},
onValueChange = {},
onConfirm = {},
error = null,
)
override fun dismiss() {}

View file

@ -2,11 +2,13 @@ package com.tangem.feature.walletsettings.entity
import androidx.compose.runtime.Immutable
import androidx.compose.ui.text.input.TextFieldValue
import com.tangem.core.ui.extensions.TextReference
@Immutable
internal data class RenameWalletUM(
val walletNameValue: TextFieldValue,
val updateValue: (value: TextFieldValue) -> Unit,
val onValueChange: (value: TextFieldValue) -> Unit,
val isConfirmEnabled: Boolean,
val onConfirm: () -> Unit,
val error: TextReference?,
)

View file

@ -8,6 +8,7 @@ import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.AdditionalTextInputDialogUM
import com.tangem.core.ui.components.DialogButtonUM
import com.tangem.core.ui.components.TextInputDialog
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.feature.walletsettings.component.preview.PreviewRenameWalletComponent
@ -31,9 +32,11 @@ internal fun RenameWalletDialog(model: RenameWalletUM, onDismiss: () -> Unit) {
onClick = onDismiss,
),
onDismissDialog = onDismiss,
onValueChange = model.updateValue,
onValueChange = model.onValueChange,
textFieldParams = AdditionalTextInputDialogUM(
label = stringResourceSafe(id = R.string.user_wallet_list_rename_popup_placeholder),
isError = model.error != null,
caption = model.error?.resolveReference(),
),
)
}

View file

@ -36,6 +36,7 @@ internal sealed interface WalletAlertState {
override val onConfirmClick: (() -> Unit)?,
) : Basic()
// TODO: reuse RenameWalletComponent [REDACTED_JIRA]
data class RenameWalletAlert(
override val text: String,
override val onConfirmClick: (String) -> Unit,