Updated on 2026-08-14

This commit is contained in:
Tangem 2023-08-22 20:41:14 +08:00
parent 0af5b06cbb
commit 09cb780a4f
10 changed files with 122 additions and 0 deletions

View file

@ -48,4 +48,16 @@ internal object WalletsDomainModule {
fun providesSelectWalletUseCase(walletsStateHolder: WalletsStateHolder): SelectWalletUseCase {
return SelectWalletUseCase(walletsStateHolder = walletsStateHolder)
}
@Provides
@ViewModelScoped
fun providesUpdateWalletUseCase(walletsStateHolder: WalletsStateHolder): UpdateWalletUseCase {
return UpdateWalletUseCase(walletsStateHolder = walletsStateHolder)
}
@Provides
@ViewModelScoped
fun providesDeleteWalletUseCase(walletsStateHolder: WalletsStateHolder): DeleteWalletUseCase {
return DeleteWalletUseCase(walletsStateHolder = walletsStateHolder)
}
}

View file

@ -96,6 +96,8 @@
<string name="common_receive">Получить</string>
<string name="common_reject">Отклонить</string>
<string name="common_reload">Перезагрузить</string>
<string name="common_rename">Переименовать</string>
<string name="common_reset">Сбросить</string>
<string name="common_save_changes">Сохранить изменения</string>
<string name="common_search">Искать</string>
<string name="common_search_tokens">Поиск токенов</string>
@ -116,6 +118,7 @@
<string name="common_transactions">Транзакции</string>
<string name="common_transfer">Перевод</string>
<string name="common_understand">Я понял</string>
<string name="common_unlock_needed">Необходима разблокировка</string>
<string name="common_unreachable">Недоступно</string>
<string name="common_yes">Да</string>
<string name="contract_address_copied_message">Адрес контракта скопирован!</string>
@ -472,6 +475,8 @@
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="twins_recreate_warning">Это действие необратимо. У вас не будет доступа к старому кошельку.</string>
<string name="twins_scan_twin_with_number">Приложите twin-карту с номером %s и не убирайте до окончания операции</string>
<string name="unlock_wallet_description_full">Используйте %s или отсканируйте карту, чтобы получить доступ к своему кошельку</string>
<string name="unlock_wallet_description_short">Используйте %s или отсканируйте карту</string>
<string name="user_wallet_list_add_button">Добавить новый кошелек</string>
<string name="user_wallet_list_delete_prompt">Вы уверены, что хотите удалить этот кошелек?</string>
<string name="user_wallet_list_editing_count">%d выбрано</string>

View file

@ -80,6 +80,8 @@
<string name="common_ok">OK</string>
<string name="common_origin_card">主卡片</string>
<string name="common_reject">拒絕</string>
<string name="common_rename">重新命名</string>
<string name="common_reset">重置</string>
<string name="common_save_changes">保存設置</string>
<string name="common_search">搜索</string>
<string name="common_search_tokens">搜尋代幣</string>

View file

@ -95,6 +95,8 @@
<string name="common_receive">Receive</string>
<string name="common_reject">Reject</string>
<string name="common_reload">Reload</string>
<string name="common_rename">Rename</string>
<string name="common_reset">Reset</string>
<string name="common_save_changes">Save changes</string>
<string name="common_search">Search</string>
<string name="common_search_tokens">Search tokens</string>
@ -115,6 +117,7 @@
<string name="common_transactions">Transactions</string>
<string name="common_transfer">Transfer</string>
<string name="common_understand">I understand</string>
<string name="common_unlock_needed">Unlock needed</string>
<string name="common_unreachable">Unreachable</string>
<string name="common_yes">Yes</string>
<string name="contract_address_copied_message">Contract address copied!</string>
@ -463,6 +466,8 @@
<string name="twins_recreate_toolbar">Tangem Twin</string>
<string name="twins_recreate_warning">This action is irreversible. You will not have access to the old wallet.</string>
<string name="twins_scan_twin_with_number">Tap the twin card with number %s and do not remove until the end of the operation</string>
<string name="unlock_wallet_description_full">Use %s or scan a card to have an access to your wallet</string>
<string name="unlock_wallet_description_short">Use %s or scan a card</string>
<string name="user_wallet_list_add_button">Add new wallet</string>
<string name="user_wallet_list_delete_prompt">Are you sure you want to delete this wallet?</string>
<string name="user_wallet_list_editing_count">%d selected</string>

View file

@ -0,0 +1,6 @@
package com.tangem.domain.wallets.models
sealed interface DeleteWalletError {
object DataError : DeleteWalletError
}

View file

@ -0,0 +1,6 @@
package com.tangem.domain.wallets.models
sealed interface UpdateWalletError {
object DataError : UpdateWalletError
}

View file

@ -0,0 +1,31 @@
package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.models.DeleteWalletError
import com.tangem.domain.wallets.models.UserWalletId
/**
* Use case for updating user wallet
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
*
[REDACTED_AUTHOR]
*/
class DeleteWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<DeleteWalletError, Unit> {
val userWalletsListManager = walletsStateHolder.userWalletsListManager
?: return DeleteWalletError.DataError.left()
userWalletsListManager.delete(userWalletIds = listOf(userWalletId))
.doOnSuccess { return Unit.right() }
.doOnFailure { return DeleteWalletError.DataError.left() }
return Unit.right()
}
}

View file

@ -0,0 +1,35 @@
package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.models.UpdateWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
/**
* Use case for updating user wallet
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
*
[REDACTED_AUTHOR]
*/
class UpdateWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(
userWalletId: UserWalletId,
update: suspend (UserWallet) -> UserWallet,
): Either<UpdateWalletError, Unit> {
val userWalletsListManager = walletsStateHolder.userWalletsListManager
?: return UpdateWalletError.DataError.left()
userWalletsListManager.update(userWalletId, update)
.doOnSuccess { return Unit.right() }
.doOnFailure { return UpdateWalletError.DataError.left() }
return Unit.right()
}
}

View file

@ -2,7 +2,9 @@ package com.tangem.feature.wallet.presentation.wallet.viewmodels
import com.tangem.core.ui.components.transactions.intents.TxHistoryClickIntents
import com.tangem.domain.tokens.models.CryptoCurrency
import com.tangem.domain.wallets.models.UserWalletId
@Suppress("TooManyFunctions")
internal interface WalletClickIntents : TxHistoryClickIntents {
fun onBackClick()
@ -36,4 +38,8 @@ internal interface WalletClickIntents : TxHistoryClickIntents {
fun onBottomSheetDismiss()
fun onTokenClick(currency: CryptoCurrency)
fun onRenameClick(userWalletId: UserWalletId, name: String)
fun onDeleteClick(userWalletId: UserWalletId)
}

View file

@ -60,6 +60,8 @@ internal class WalletViewModel @Inject constructor(
private val saveWalletUseCase: SaveWalletUseCase,
private val getSelectedWalletUseCase: GetSelectedWalletUseCase,
private val selectWalletUseCase: SelectWalletUseCase,
private val updateWalletUseCase: UpdateWalletUseCase,
private val deleteWalletUseCase: DeleteWalletUseCase,
private val getBiometricsStatusUseCase: GetBiometricsStatusUseCase,
private val setAccessCodeRequestPolicyUseCase: SetAccessCodeRequestPolicyUseCase,
private val getAccessCodeSavingStatusUseCase: GetAccessCodeSavingStatusUseCase,
@ -459,6 +461,18 @@ internal class WalletViewModel @Inject constructor(
router.openTokenDetails(currency = currency)
}
override fun onRenameClick(userWalletId: UserWalletId, name: String) {
viewModelScope.launch(dispatchers.io) {
updateWalletUseCase(userWalletId = userWalletId, update = { it.copy(name) })
}
}
override fun onDeleteClick(userWalletId: UserWalletId) {
viewModelScope.launch(dispatchers.io) {
deleteWalletUseCase(userWalletId)
}
}
private fun createSelectedAppCurrencyFlow(): StateFlow<AppCurrency> {
return getSelectedAppCurrencyUseCase()
.map { maybeAppCurrency ->