Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-18 09:19:53 +08:00
parent 8b566c31ae
commit 1b8eece376
27 changed files with 87 additions and 185 deletions

View file

@ -1,16 +0,0 @@
package com.tangem.domain.wallets.legacy
import arrow.core.raise.Raise
import arrow.core.raise.ensureNotNull
internal inline fun <Error> Raise<Error>.ensureUserWalletListManagerNotNull(
walletsStateHolder: WalletsStateHolder,
raise: (Throwable) -> Error,
): UserWalletsListManager {
return ensureNotNull(
value = walletsStateHolder.userWalletsListManager,
raise = {
raise(IllegalStateException("User wallets list manager not initialized"))
},
)
}

View file

@ -1,12 +0,0 @@
package com.tangem.domain.wallets.legacy
import kotlinx.coroutines.flow.Flow
// TODO: will be remove in this task [REDACTED_JIRA]
@Deprecated(message = "Provide UserWalletsListManager using DI", level = DeprecationLevel.WARNING)
interface WalletsStateHolder {
val userWalletsListManager: UserWalletsListManager?
val userWalletListManagerFlow: Flow<UserWalletsListManager?>
}

View file

@ -2,7 +2,5 @@ package com.tangem.domain.wallets.models
sealed interface DeleteWalletError {
object DataError : DeleteWalletError
object UnableToDelete : DeleteWalletError
data object UnableToDelete : DeleteWalletError
}

View file

@ -2,7 +2,5 @@ package com.tangem.domain.wallets.models
sealed class GetUserWalletError {
data class DataError(val cause: Throwable) : GetUserWalletError()
object UserWalletNotFound : GetUserWalletError()
data object UserWalletNotFound : GetUserWalletError()
}

View file

@ -2,7 +2,5 @@ package com.tangem.domain.wallets.models
sealed interface SelectWalletError {
object DataError : SelectWalletError
object UnableToSelectUserWallet : SelectWalletError
}

View file

@ -6,27 +6,21 @@ import arrow.core.raise.either
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.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
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'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class DeleteWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
class DeleteWalletUseCase(private val userWalletsListManager: UserWalletsListManager) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<DeleteWalletError, Unit> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { DeleteWalletError.DataError },
)
userWalletsListManager.delete(userWalletIds = listOf(userWalletId))
.doOnSuccess { return Unit.right() }
.doOnFailure { return DeleteWalletError.UnableToDelete.left() }

View file

@ -3,8 +3,7 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
@ -12,19 +11,14 @@ import com.tangem.domain.wallets.models.UserWallet
* Use case for getting selected wallet.
* Important! If all wallets is locked, use case returns a error.
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class GetSelectedWalletSyncUseCase(private val walletsStateHolder: WalletsStateHolder) {
class GetSelectedWalletSyncUseCase(private val userWalletsListManager: UserWalletsListManager) {
operator fun invoke(): Either<GetUserWalletError, UserWallet> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
ensureNotNull(
value = userWalletsListManager.selectedUserWalletSync,
raise = { GetUserWalletError.UserWalletNotFound },

View file

@ -2,8 +2,7 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
import kotlinx.coroutines.flow.Flow
@ -11,19 +10,14 @@ import kotlinx.coroutines.flow.Flow
/**
* Use case for getting flow of selected wallet.
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class GetSelectedWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
class GetSelectedWalletUseCase(private val userWalletsListManager: UserWalletsListManager) {
operator fun invoke(): Either<GetUserWalletError, Flow<UserWallet>> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
userWalletsListManager.selectedUserWallet
}
}

View file

@ -3,21 +3,15 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.firstOrNull
class GetUserWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
class GetUserWalletUseCase(private val userWalletsListManager: UserWalletsListManager) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<GetUserWalletError, UserWallet> = either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
val userWallets = userWalletsListManager.userWallets.firstOrNull().orEmpty()
ensureNotNull(userWallets.firstOrNull { it.walletId == userWalletId }) {

View file

@ -1,20 +1,18 @@
package com.tangem.domain.wallets.usecase
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWallet
import kotlinx.coroutines.flow.Flow
/**
* Use case for getting list of user wallets
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class GetWalletsUseCase(private val walletsStateHolder: WalletsStateHolder) {
class GetWalletsUseCase(private val userWalletsListManager: UserWalletsListManager) {
@Throws(IllegalArgumentException::class)
operator fun invoke(): Flow<List<UserWallet>> {
return requireNotNull(walletsStateHolder.userWalletsListManager).userWallets
}
operator fun invoke(): Flow<List<UserWallet>> = userWalletsListManager.userWallets
}

View file

@ -1,19 +1,19 @@
package com.tangem.domain.wallets.usecase
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
/**
* Use case that checks if wallet need backup cards
*
* @property userWalletsListManager user wallets list manager
*/
class IsNeedToBackupUseCase(private val walletsStateHolder: WalletsStateHolder) {
class IsNeedToBackupUseCase(private val userWalletsListManager: UserWalletsListManager) {
operator fun invoke(id: UserWalletId): Flow<Boolean> {
val userWalletsListManager = requireNotNull(walletsStateHolder.userWalletsListManager)
return userWalletsListManager.userWallets
.map { wallets ->
val wallet = wallets.firstOrNull { it.walletId == id }

View file

@ -7,27 +7,21 @@ import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.UserWalletsListError
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.SaveWalletError
import com.tangem.domain.wallets.models.UserWallet
/**
* Use case for saving user wallet
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class SaveWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
class SaveWalletUseCase(private val userWalletsListManager: UserWalletsListManager) {
suspend operator fun invoke(userWallet: UserWallet, canOverride: Boolean = false): Either<SaveWalletError, Unit> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { SaveWalletError.DataError },
)
userWalletsListManager.save(userWallet, canOverride)
.doOnSuccess { return Unit.right() }
.doOnFailure {

View file

@ -5,8 +5,7 @@ import arrow.core.raise.either
import arrow.core.right
import com.tangem.common.CompletionResult
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.SelectWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
@ -14,22 +13,18 @@ import com.tangem.domain.wallets.models.UserWalletId
/**
* Use case for selecting wallet
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
* @property reduxStateHolder redux state holder
*
[REDACTED_AUTHOR]
*/
class SelectWalletUseCase(
private val walletsStateHolder: WalletsStateHolder,
private val userWalletsListManager: UserWalletsListManager,
private val reduxStateHolder: ReduxStateHolder,
) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<SelectWalletError, UserWallet> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { SelectWalletError.DataError },
)
return when (val result = userWalletsListManager.select(userWalletId)) {
is CompletionResult.Failure -> raise(SelectWalletError.UnableToSelectUserWallet)
is CompletionResult.Success -> {

View file

@ -5,23 +5,23 @@ import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.common.doOnFailure
import com.tangem.domain.wallets.legacy.UserWalletsListError
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.legacy.UserWalletsListManager.Lockable.UnlockType
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.asLockable
import com.tangem.domain.wallets.models.UnlockWalletsError
/**
* Unlock wallets use case
*
* @property walletsStateHolder wallets state holder
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class UnlockWalletsUseCase(private val walletsStateHolder: WalletsStateHolder) {
class UnlockWalletsUseCase(private val userWalletsListManager: UserWalletsListManager) {
suspend operator fun invoke(type: UnlockType = UnlockType.ANY): Either<UnlockWalletsError, Unit> = either {
val userWalletsListManager = ensureNotNull(
value = walletsStateHolder.userWalletsListManager?.asLockable(),
value = userWalletsListManager.asLockable(),
raise = {
UnlockWalletsError.DataError(
cause = IllegalStateException("The lockable user wallets list manager could not be found"),

View file

@ -6,8 +6,7 @@ import arrow.core.raise.either
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.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UpdateWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
@ -15,22 +14,17 @@ import com.tangem.domain.wallets.models.UserWalletId
/**
* Use case for updating user wallet
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
* @property userWalletsListManager user wallets list manager
*
[REDACTED_AUTHOR]
*/
class UpdateWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
class UpdateWalletUseCase(private val userWalletsListManager: UserWalletsListManager) {
suspend operator fun invoke(
userWalletId: UserWalletId,
update: suspend (UserWallet) -> UserWallet,
): Either<UpdateWalletError, UserWallet> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { UpdateWalletError.DataError },
)
userWalletsListManager.update(userWalletId, update)
.doOnSuccess { return it.right() }
.doOnFailure { return UpdateWalletError.DataError.left() }