Updated on 2026-08-14
This commit is contained in:
parent
1456166220
commit
4193e5777e
12 changed files with 272 additions and 3 deletions
|
|
@ -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
1
domain/account/status/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/build
|
||||
41
domain/account/status/build.gradle.kts
Normal file
41
domain/account/status/build.gradle.kts
Normal 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)
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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" },
|
||||
) {}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
}
|
||||
|
|
@ -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>
|
||||
}
|
||||
|
|
@ -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>>()
|
||||
|
|
@ -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>()
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue