Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-18 17:04:05 +04:00
parent 1456166220
commit 4193e5777e
12 changed files with 272 additions and 3 deletions

View file

@ -5,7 +5,7 @@ import com.tangem.domain.core.flow.FlowProducer
import com.tangem.domain.models.wallet.UserWalletId
/**
* Produces a list of [AccountList] for a specific user wallet.
* Produces a [AccountList] for a specific user wallet.
*
[REDACTED_AUTHOR]
*/

1
domain/account/status/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,41 @@
plugins {
alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android)
alias(deps.plugins.kotlin.kapt)
alias(deps.plugins.hilt.android)
id("configuration")
}
android {
namespace = "com.tangem.domain.account.status"
}
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}
dependencies {
implementation(projects.domain.account)
implementation(projects.domain.core)
implementation(projects.domain.quotes)
implementation(projects.domain.models)
implementation(projects.domain.networks)
implementation(projects.domain.staking)
implementation(projects.libs.crypto)
implementation(deps.kotlin.datetime)
// region DI
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
// end
testImplementation(deps.test.coroutine)
testImplementation(deps.test.junit5)
testRuntimeOnly(deps.test.junit5.engine)
testImplementation(deps.test.mockk)
testImplementation(deps.test.truth)
testImplementation(tangemDeps.blockchain)
testImplementation(projects.common.test)
}

View file

@ -0,0 +1,28 @@
package com.tangem.domain.account.status.di
import com.tangem.domain.account.status.producer.DefaultMultiAccountStatusListProducer
import com.tangem.domain.account.status.producer.DefaultSingleAccountStatusListProducer
import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer
import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal interface AccountStatusListProducerFactoryModule {
@Binds
@Singleton
fun bindSingleAccountStatusListProducerFactory(
factory: DefaultSingleAccountStatusListProducer.Factory,
): SingleAccountStatusListProducer.Factory
@Binds
@Singleton
fun bindMultiAccountStatusListProducerFactory(
factory: DefaultMultiAccountStatusListProducer.Factory,
): MultiAccountStatusListProducer.Factory
}

View file

@ -0,0 +1,38 @@
package com.tangem.domain.account.status.di
import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer
import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer
import com.tangem.domain.account.status.supplier.MultiAccountStatusListSupplier
import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object AccountStatusListSupplierModule {
@Provides
@Singleton
fun provideSingleAccountStatusListSupplier(
factory: SingleAccountStatusListProducer.Factory,
): SingleAccountStatusListSupplier {
return object : SingleAccountStatusListSupplier(
factory = factory,
keyCreator = { "account_status_list_${it.userWalletId}" },
) {}
}
@Provides
@Singleton
fun provideMultiAccountStatusListSupplier(
factory: MultiAccountStatusListProducer.Factory,
): MultiAccountStatusListSupplier {
return object : MultiAccountStatusListSupplier(
factory = factory,
keyCreator = { "multi_account_status_list" },
) {}
}
}

View file

@ -0,0 +1,48 @@
package com.tangem.domain.account.status.producer
import arrow.core.Option
import arrow.core.some
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier
import com.tangem.domain.core.wallets.UserWalletsListRepository
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flatMapLatest
/**
[REDACTED_AUTHOR]
*/
// TODO: Finalize [REDACTED_JIRA]
internal class DefaultMultiAccountStatusListProducer @AssistedInject constructor(
@Assisted val params: Unit,
private val userWalletsListRepository: UserWalletsListRepository,
private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier,
) : MultiAccountStatusListProducer {
override val fallback: Option<List<AccountStatusList>> = emptyList<AccountStatusList>().some()
@OptIn(ExperimentalCoroutinesApi::class)
override fun produce(): Flow<List<AccountStatusList>> {
return userWalletsListRepository.userWallets
.filterNotNull()
.flatMapLatest { userWallets ->
val flows = userWallets.map {
singleAccountStatusListSupplier(
params = SingleAccountStatusListProducer.Params(it.walletId),
)
}
combine(flows) { it.toList() }
}
}
@AssistedFactory
interface Factory : MultiAccountStatusListProducer.Factory {
override fun create(params: Unit): DefaultMultiAccountStatusListProducer
}
}

View file

@ -0,0 +1,50 @@
package com.tangem.domain.account.status.producer
import arrow.core.Option
import arrow.core.none
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.account.supplier.SingleAccountListSupplier
import com.tangem.domain.models.network.NetworkStatus
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.domain.models.staking.YieldBalance
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier
import com.tangem.domain.staking.StakingIdFactory
import com.tangem.domain.staking.single.SingleYieldBalanceSupplier
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
/**
[REDACTED_AUTHOR]
*/
// TODO: Implement [REDACTED_JIRA]
@Suppress("UnusedPrivateProperty", "UnusedPrivateClass")
@OptIn(ExperimentalCoroutinesApi::class)
internal class DefaultSingleAccountStatusListProducer @AssistedInject constructor(
@Assisted private val params: SingleAccountStatusListProducer.Params,
private val singleAccountListSupplier: SingleAccountListSupplier,
private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
private val singleQuoteStatusSupplier: SingleQuoteStatusSupplier,
private val singleYieldBalanceSupplier: SingleYieldBalanceSupplier,
private val stakingIdFactory: StakingIdFactory,
) : SingleAccountStatusListProducer {
override val fallback: Option<AccountStatusList> = none()
override fun produce(): Flow<AccountStatusList> = emptyFlow()
private data class CryptoCurrencyStatusSources(
val networkStatus: NetworkStatus,
val yieldBalance: YieldBalance?,
val quoteStatus: QuoteStatus?,
)
@AssistedFactory
interface Factory : SingleAccountStatusListProducer.Factory {
override fun create(params: SingleAccountStatusListProducer.Params): DefaultSingleAccountStatusListProducer
}
}

View file

@ -0,0 +1,15 @@
package com.tangem.domain.account.status.producer
import com.tangem.domain.account.models.AccountList
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.core.flow.FlowProducer
/**
* Produces a list of [AccountList]s for all user wallets.
*
[REDACTED_AUTHOR]
*/
interface MultiAccountStatusListProducer : FlowProducer<List<AccountStatusList>> {
interface Factory : FlowProducer.Factory<Unit, MultiAccountStatusListProducer>
}

View file

@ -0,0 +1,17 @@
package com.tangem.domain.account.status.producer
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.core.flow.FlowProducer
import com.tangem.domain.models.wallet.UserWalletId
/**
* Produces a [AccountStatusList] for a specific user wallet.
*
[REDACTED_AUTHOR]
*/
interface SingleAccountStatusListProducer : FlowProducer<AccountStatusList> {
data class Params(val userWalletId: UserWalletId)
interface Factory : FlowProducer.Factory<Params, SingleAccountStatusListProducer>
}

View file

@ -0,0 +1,15 @@
package com.tangem.domain.account.status.supplier
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.account.status.producer.MultiAccountStatusListProducer
import com.tangem.domain.core.flow.FlowCachingSupplier
/**
* Supplier that provides a list of [AccountStatusList]s for all user wallets.
*
[REDACTED_AUTHOR]
*/
abstract class MultiAccountStatusListSupplier(
override val factory: MultiAccountStatusListProducer.Factory,
override val keyCreator: (Unit) -> String,
) : FlowCachingSupplier<MultiAccountStatusListProducer, Unit, List<AccountStatusList>>()

View file

@ -0,0 +1,15 @@
package com.tangem.domain.account.status.supplier
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer
import com.tangem.domain.core.flow.FlowCachingSupplier
/**
* Supplier that provides a single [AccountStatusList] for a specific user wallet.
*
[REDACTED_AUTHOR]
*/
abstract class SingleAccountStatusListSupplier(
override val factory: SingleAccountStatusListProducer.Factory,
override val keyCreator: (SingleAccountStatusListProducer.Params) -> String,
) : FlowCachingSupplier<SingleAccountStatusListProducer, SingleAccountStatusListProducer.Params, AccountStatusList>()

View file

@ -272,6 +272,7 @@ include(":features:tangempay:main:impl")
include(":features:tangempay:details:api")
include(":features:tangempay:details:impl")
include(":features:tangempay:onboarding")
include(":features:tangempay:onboarding:api")
include(":features:tangempay:onboarding:impl")
@ -297,6 +298,7 @@ include(":domain:models")
include(":domain:legacy")
include(":domain:account")
include(":domain:account:status")
include(":domain:card")
include(":domain:core")
include(":domain:demo")
@ -385,5 +387,4 @@ include(":data:swap")
include(":data:express")
include(":data:wallet-manager")
include(":data:yield-supply")
// endregion Data modules
include(":features:tangempay:onboarding")
// endregion Data modules