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

@ -97,7 +97,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde
is GlobalAction.UpdateUserWalletsListManager -> {
val generalUserWalletsListManager = store.inject(DaggerGraphState::generalUserWalletsListManager)
appStateHolder.userWalletsListManager = generalUserWalletsListManager
globalState.copy(userWalletsListManager = generalUserWalletsListManager)
}
is GlobalAction.ChangeAppThemeMode -> globalState.copy(

View file

@ -1,7 +1,7 @@
package com.tangem.tap.data
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.flow.firstOrNull
@ -9,26 +9,24 @@ import kotlinx.coroutines.flow.firstOrNull
// FIXME: Workaround, remove it once the normal UserWalletsStore has been implemented
// [REDACTED_JIRA]
internal class RuntimeUserWalletsStore(
private val walletsStateHolder: WalletsStateHolder,
private val userWalletsListManager: UserWalletsListManager,
) : UserWalletsStore {
override val selectedUserWalletOrNull: UserWallet?
get() = walletsStateHolder.userWalletsListManager?.selectedUserWalletSync
get() = userWalletsListManager.selectedUserWalletSync
override suspend fun getSyncOrNull(key: UserWalletId): UserWallet? {
return walletsStateHolder.userWalletsListManager
?.userWallets
?.firstOrNull()
return userWalletsListManager
.userWallets
.firstOrNull()
?.singleOrNull { it.walletId == key }
}
override suspend fun getAllSyncOrNull(): List<UserWallet>? {
return walletsStateHolder.userWalletsListManager
?.userWallets
?.firstOrNull()
return userWalletsListManager.userWallets.firstOrNull()
}
override suspend fun update(userWalletId: UserWalletId, update: suspend (UserWallet) -> UserWallet) {
walletsStateHolder.userWalletsListManager?.update(userWalletId, update)
userWalletsListManager.update(userWalletId, update)
}
}

View file

@ -2,7 +2,6 @@ package com.tangem.tap.di
import com.tangem.core.navigation.ReduxNavController
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.tap.proxy.AppStateHolder
import dagger.Binds
import dagger.Module
@ -14,10 +13,6 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
internal interface AppStateHolderModule {
@Binds
@Singleton
fun bindsWalletsStateHolder(appStateHolder: AppStateHolder): WalletsStateHolder
@Binds
@Singleton
fun bindsNavigationStateHolder(appStateHolder: AppStateHolder): ReduxNavController

View file

@ -1,7 +1,7 @@
package com.tangem.tap.di.data
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.tap.data.RuntimeUserWalletsStore
import dagger.Module
import dagger.Provides
@ -15,7 +15,7 @@ internal object UserWalletsStoreModule {
@Provides
@Singleton
fun provideUserWalletsStore(walletsStateHolder: WalletsStateHolder): UserWalletsStore {
return RuntimeUserWalletsStore(walletsStateHolder)
fun provideUserWalletsStore(userWalletsListManager: UserWalletsListManager): UserWalletsStore {
return RuntimeUserWalletsStore(userWalletsListManager = userWalletsListManager)
}
}

View file

@ -6,7 +6,7 @@ import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.card.repository.DerivationsRepository
import com.tangem.domain.demo.DemoConfig
import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase
import dagger.Module
import dagger.Provides
@ -58,8 +58,8 @@ internal object CardDomainModule {
@Provides
@ViewModelScoped
fun provideIsNeedToBackupUseCase(walletStateHolder: WalletsStateHolder): IsNeedToBackupUseCase {
return IsNeedToBackupUseCase(walletStateHolder)
fun provideIsNeedToBackupUseCase(userWalletsListManager: UserWalletsListManager): IsNeedToBackupUseCase {
return IsNeedToBackupUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides

View file

@ -2,7 +2,7 @@ package com.tangem.tap.di.domain
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.repository.WalletAddressServiceRepository
import com.tangem.domain.wallets.repository.WalletsRepository
import com.tangem.domain.wallets.usecase.*
@ -19,32 +19,34 @@ internal object WalletsDomainModule {
@Provides
@ViewModelScoped
fun providesGetWalletsUseCase(walletsStateHolder: WalletsStateHolder): GetWalletsUseCase {
return GetWalletsUseCase(walletsStateHolder = walletsStateHolder)
fun providesGetWalletsUseCase(userWalletsListManager: UserWalletsListManager): GetWalletsUseCase {
return GetWalletsUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesGetUserWalletUseCase(walletsStateHolder: WalletsStateHolder): GetUserWalletUseCase {
return GetUserWalletUseCase(walletsStateHolder = walletsStateHolder)
fun providesGetUserWalletUseCase(userWalletsListManager: UserWalletsListManager): GetUserWalletUseCase {
return GetUserWalletUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesGetSelectedWalletSyncUseCase(walletsStateHolder: WalletsStateHolder): GetSelectedWalletSyncUseCase {
return GetSelectedWalletSyncUseCase(walletsStateHolder = walletsStateHolder)
fun providesGetSelectedWalletSyncUseCase(
userWalletsListManager: UserWalletsListManager,
): GetSelectedWalletSyncUseCase {
return GetSelectedWalletSyncUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesGetSelectedWalletUseCase(walletsStateHolder: WalletsStateHolder): GetSelectedWalletUseCase {
return GetSelectedWalletUseCase(walletsStateHolder = walletsStateHolder)
fun providesGetSelectedWalletUseCase(userWalletsListManager: UserWalletsListManager): GetSelectedWalletUseCase {
return GetSelectedWalletUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesSaveWalletUseCase(walletsStateHolder: WalletsStateHolder): SaveWalletUseCase {
return SaveWalletUseCase(walletsStateHolder = walletsStateHolder)
fun providesSaveWalletUseCase(userWalletsListManager: UserWalletsListManager): SaveWalletUseCase {
return SaveWalletUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ -55,29 +57,29 @@ internal object WalletsDomainModule {
@Provides
@ViewModelScoped
fun providesUnlockWalletUseCase(walletsStateHolder: WalletsStateHolder): UnlockWalletsUseCase {
return UnlockWalletsUseCase(walletsStateHolder = walletsStateHolder)
fun providesUnlockWalletUseCase(userWalletsListManager: UserWalletsListManager): UnlockWalletsUseCase {
return UnlockWalletsUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesSelectWalletUseCase(
walletsStateHolder: WalletsStateHolder,
userWalletsListManager: UserWalletsListManager,
reduxStateHolder: ReduxStateHolder,
): SelectWalletUseCase {
return SelectWalletUseCase(walletsStateHolder, reduxStateHolder)
return SelectWalletUseCase(userWalletsListManager = userWalletsListManager, reduxStateHolder = reduxStateHolder)
}
@Provides
@ViewModelScoped
fun providesUpdateWalletUseCase(walletsStateHolder: WalletsStateHolder): UpdateWalletUseCase {
return UpdateWalletUseCase(walletsStateHolder = walletsStateHolder)
fun providesUpdateWalletUseCase(userWalletsListManager: UserWalletsListManager): UpdateWalletUseCase {
return UpdateWalletUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides
@ViewModelScoped
fun providesDeleteWalletUseCase(walletsStateHolder: WalletsStateHolder): DeleteWalletUseCase {
return DeleteWalletUseCase(walletsStateHolder = walletsStateHolder)
fun providesDeleteWalletUseCase(userWalletsListManager: UserWalletsListManager): DeleteWalletUseCase {
return DeleteWalletUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides

View file

@ -8,7 +8,7 @@ import com.tangem.datasource.di.SdkMoshi
import com.tangem.datasource.files.FileReader
import com.tangem.domain.tokens.repository.CurrenciesRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.tap.domain.walletconnect.WalletConnectSdkHelper
import com.tangem.tap.domain.walletconnect2.app.TangemWcBlockchainHelper
import com.tangem.tap.domain.walletconnect2.app.WalletConnectEventsHandlerImpl
@ -40,7 +40,7 @@ internal object WalletConnectInteractorModule {
walletConnectFeatureToggles: WalletConnectFeatureToggles,
currenciesRepository: CurrenciesRepository,
walletManagersFacade: WalletManagersFacade,
walletsStateHolder: WalletsStateHolder,
userWalletsListManager: UserWalletsListManager,
): WalletConnectInteractor {
return WalletConnectInteractor(
handler = WalletConnectEventsHandlerImpl(),
@ -50,7 +50,7 @@ internal object WalletConnectInteractorModule {
blockchainHelper = TangemWcBlockchainHelper(walletConnectFeatureToggles),
currenciesRepository = currenciesRepository,
walletManagersFacade = walletManagersFacade,
walletsStateHolder = walletsStateHolder,
userWalletsListManager = userWalletsListManager,
dispatchers = AppCoroutineDispatcherProvider(),
)
}

View file

@ -6,7 +6,7 @@ import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.tokens.repository.CurrenciesRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase
import com.tangem.tap.common.extensions.filterNotNull
@ -31,12 +31,12 @@ class WalletConnectInteractor(
private val dispatchers: CoroutineDispatcherProvider,
private val walletManagersFacade: WalletManagersFacade,
private val currenciesRepository: CurrenciesRepository,
private val walletsStateHolder: WalletsStateHolder,
private val userWalletsListManager: UserWalletsListManager,
val blockchainHelper: WcBlockchainHelper,
) {
private val getSelectedWalletUseCase by lazy(LazyThreadSafetyMode.NONE) {
GetSelectedWalletUseCase(walletsStateHolder)
GetSelectedWalletUseCase(userWalletsListManager)
}
private val wcScope = CoroutineScope(

View file

@ -6,8 +6,6 @@ import com.tangem.core.navigation.ReduxNavController
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.dispatchWithMain
@ -15,8 +13,6 @@ import com.tangem.tap.common.extensions.onUserWalletSelected
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.network.exchangeServices.ExchangeService
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import org.rekotlin.Action
import org.rekotlin.Store
import javax.inject.Inject
@ -25,18 +21,7 @@ import javax.inject.Inject
* Holds objects from old modules, that missing in DI graph.
* Object sets manually to use in new modules and [AppStateHolder] proxies its to DI.
*/
class AppStateHolder @Inject constructor() : WalletsStateHolder, ReduxNavController, ReduxStateHolder {
override var userWalletsListManager: UserWalletsListManager? = null
set(value) {
field = value
_userWalletsListManagerFlow.value = value
}
override val userWalletListManagerFlow: Flow<UserWalletsListManager?>
get() = _userWalletsListManagerFlow
private val _userWalletsListManagerFlow = MutableStateFlow<UserWalletsListManager?>(null)
class AppStateHolder @Inject constructor() : ReduxNavController, ReduxStateHolder {
@Deprecated("Use scan response from selected user wallet")
var scanResponse: ScanResponse? = null

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() }

View file

@ -24,7 +24,7 @@ import com.tangem.datasource.crypto.DataSignatureVerifier
import com.tangem.domain.common.util.derivationStyleProvider
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.swap.converters.*
import com.tangem.feature.swap.domain.api.SwapRepository
@ -48,7 +48,7 @@ internal class DefaultSwapRepository @Inject constructor(
private val tangemExpressApi: TangemExpressApi,
private val coroutineDispatcher: CoroutineDispatcherProvider,
private val walletManagersFacade: WalletManagersFacade,
private val walletsStateHolder: WalletsStateHolder,
private val userWalletsListManager: UserWalletsListManager,
private val errorsDataConverter: ErrorsDataConverter,
private val dataSignatureVerifier: DataSignatureVerifier,
moshi: Moshi,
@ -389,8 +389,8 @@ internal class DefaultSwapRepository @Inject constructor(
blockchain = blockchain,
extraDerivationPath = null,
derivationStyleProvider = requireNotNull(
walletsStateHolder.userWalletsListManager
?.selectedUserWalletSync
userWalletsListManager
.selectedUserWalletSync
?.scanResponse
?.derivationStyleProvider,
),

View file

@ -8,7 +8,7 @@ import com.tangem.datasource.crypto.DataSignatureVerifier
import com.tangem.datasource.di.NetworkMoshi
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.feature.swap.DefaultSwapRepository
import com.tangem.feature.swap.DefaultSwapTransactionRepository
import com.tangem.feature.swap.converters.ErrorsDataConverter
@ -33,7 +33,7 @@ internal class SwapDataModule {
coroutineDispatcher: CoroutineDispatcherProvider,
dataSignature: DataSignatureVerifier,
walletManagerFacade: WalletManagersFacade,
walletsStateHolder: WalletsStateHolder,
userWalletsListManager: UserWalletsListManager,
errorsDataConverter: ErrorsDataConverter,
@NetworkMoshi moshi: Moshi,
): SwapRepository {
@ -42,7 +42,7 @@ internal class SwapDataModule {
tangemExpressApi = tangemExpressApi,
coroutineDispatcher = coroutineDispatcher,
walletManagersFacade = walletManagerFacade,
walletsStateHolder = walletsStateHolder,
userWalletsListManager = userWalletsListManager,
errorsDataConverter = errorsDataConverter,
dataSignatureVerifier = dataSignature,
moshi = moshi,

View file

@ -13,7 +13,7 @@ import com.tangem.domain.tokens.repository.QuotesRepository
import com.tangem.domain.transaction.TransactionRepository
import com.tangem.domain.transaction.usecase.SendTransactionUseCase
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.feature.swap.domain.*
import com.tangem.feature.swap.domain.api.SwapRepository
@ -79,8 +79,8 @@ class SwapDomainModule {
@SwapScope
@Provides
@Singleton
fun providesGetSelectedWalletUseCase(walletsStateHolder: WalletsStateHolder): GetSelectedWalletSyncUseCase {
return GetSelectedWalletSyncUseCase(walletsStateHolder = walletsStateHolder)
fun providesGetSelectedWalletUseCase(userWalletsListManager: UserWalletsListManager): GetSelectedWalletSyncUseCase {
return GetSelectedWalletSyncUseCase(userWalletsListManager = userWalletsListManager)
}
@Provides