From bc80eed141a09c799920437303277f851dd664d9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 29 Oct 2025 18:25:55 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../account/models/AccountStatusList.kt | 4 +- .../di/SingleAccountStatusSupplierModule.kt | 36 +++++++++++++++ .../DefaultSingleAccountStatusProducer.kt | 44 +++++++++++++++++++ .../producer/SingleAccountStatusProducer.kt | 17 +++++++ .../supplier/SingleAccountStatusSupplier.kt | 15 +++++++ .../account/AccountDependencies.kt | 2 + 6 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/di/SingleAccountStatusSupplierModule.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusProducer.kt create mode 100644 domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusSupplier.kt diff --git a/domain/account/src/main/java/com/tangem/domain/account/models/AccountStatusList.kt b/domain/account/src/main/java/com/tangem/domain/account/models/AccountStatusList.kt index b982971414..c817094f5a 100644 --- a/domain/account/src/main/java/com/tangem/domain/account/models/AccountStatusList.kt +++ b/domain/account/src/main/java/com/tangem/domain/account/models/AccountStatusList.kt @@ -30,12 +30,12 @@ data class AccountStatusList( val groupType: TokensGroupType, ) { - val mainAccount: AccountStatus + val mainAccount: AccountStatus.CryptoPortfolio get() = accountStatuses.first { accountStatus -> when (accountStatus) { is AccountStatus.CryptoPortfolio -> accountStatus.account.isMainAccount } - } + } as AccountStatus.CryptoPortfolio fun flattenCurrencies(): List = accountStatuses .map { accountStatus -> accountStatus.flattenCurrencies() } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/SingleAccountStatusSupplierModule.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/SingleAccountStatusSupplierModule.kt new file mode 100644 index 0000000000..db05d87dc9 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/SingleAccountStatusSupplierModule.kt @@ -0,0 +1,36 @@ +package com.tangem.domain.account.status.di + +import com.tangem.domain.account.status.producer.DefaultSingleAccountStatusProducer +import com.tangem.domain.account.status.producer.SingleAccountStatusProducer +import com.tangem.domain.account.status.supplier.SingleAccountStatusSupplier +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface SingleAccountStatusSupplierModule { + + @Binds + @Singleton + fun bindSingleAccountStatusProducerFactory( + impl: DefaultSingleAccountStatusProducer.Factory, + ): SingleAccountStatusProducer.Factory + + companion object { + + @Provides + @Singleton + fun provideSingleAccountStatusSupplier( + factory: SingleAccountStatusProducer.Factory, + ): SingleAccountStatusSupplier { + return object : SingleAccountStatusSupplier( + factory = factory, + keyCreator = { "single_account_status_${it.accountId.value}" }, + ) {} + } + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusProducer.kt new file mode 100644 index 0000000000..86377c035e --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusProducer.kt @@ -0,0 +1,44 @@ +package com.tangem.domain.account.status.producer + +import arrow.core.Option +import arrow.core.none +import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.models.account.AccountStatus +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.mapNotNull + +/** + * Default implementation of [SingleAccountStatusProducer]. + * + * @param params Parameters required to produce the account status. + * @param singleAccountStatusListSupplier Supplier to fetch the list of account statuses. + * @param dispatchers Coroutine dispatcher provider for managing threading. + */ +internal class DefaultSingleAccountStatusProducer @AssistedInject constructor( + @Assisted val params: SingleAccountStatusProducer.Params, + private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier, + private val dispatchers: CoroutineDispatcherProvider, +) : SingleAccountStatusProducer { + + override val fallback: Option get() = none() + + override fun produce(): Flow { + return singleAccountStatusListSupplier(userWalletId = params.accountId.userWalletId) + .mapNotNull { accountStatusList -> + accountStatusList.accountStatuses.firstOrNull { + it.account.accountId == params.accountId + } + } + .flowOn(dispatchers.default) + } + + @AssistedFactory + interface Factory : SingleAccountStatusProducer.Factory { + override fun create(params: SingleAccountStatusProducer.Params): DefaultSingleAccountStatusProducer + } +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusProducer.kt new file mode 100644 index 0000000000..1a649fedbc --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/SingleAccountStatusProducer.kt @@ -0,0 +1,17 @@ +package com.tangem.domain.account.status.producer + +import com.tangem.domain.core.flow.FlowProducer +import com.tangem.domain.models.account.AccountId +import com.tangem.domain.models.account.AccountStatus + +/** + * Producer that provides a single [AccountStatus] for a specific account identifier. + * +[REDACTED_AUTHOR] + */ +interface SingleAccountStatusProducer : FlowProducer { + + data class Params(val accountId: AccountId) + + interface Factory : FlowProducer.Factory +} \ No newline at end of file diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusSupplier.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusSupplier.kt new file mode 100644 index 0000000000..f00b6d0a35 --- /dev/null +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/supplier/SingleAccountStatusSupplier.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.account.status.supplier + +import com.tangem.domain.account.status.producer.SingleAccountStatusProducer +import com.tangem.domain.core.flow.FlowCachingSupplier +import com.tangem.domain.models.account.AccountStatus + +/** + * Supplier that provides a single [AccountStatus] for a specific account identifier. + * +[REDACTED_AUTHOR] + */ +abstract class SingleAccountStatusSupplier( + override val factory: SingleAccountStatusProducer.Factory, + override val keyCreator: (SingleAccountStatusProducer.Params) -> String, +) : FlowCachingSupplier() \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/account/AccountDependencies.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/account/AccountDependencies.kt index 5a811786ab..4119478f5a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/account/AccountDependencies.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/account/AccountDependencies.kt @@ -3,6 +3,7 @@ package com.tangem.feature.wallet.presentation.account import com.tangem.core.decompose.di.ModelScoped import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.account.status.supplier.SingleAccountStatusSupplier import com.tangem.domain.account.usecase.IsAccountsModeEnabledUseCase import javax.inject.Inject @@ -12,4 +13,5 @@ internal class AccountDependencies @Inject constructor( val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase, val expandedAccountsHolder: ExpandedAccountsHolder, val singleAccountStatusListSupplier: SingleAccountStatusListSupplier, + val singleAccountStatusSupplier: SingleAccountStatusSupplier, ) \ No newline at end of file