Updated on 2026-08-14

This commit is contained in:
Tangem 2022-11-20 15:07:49 +03:00
parent ebcf2f40e5
commit dca991651c
13 changed files with 173 additions and 15 deletions

View file

@ -111,7 +111,11 @@ dependencies {
implementation(project(":common"))
implementation(project(":core:ui"))
implementation(project(":libs:crypto"))
/** Features */
implementation(project(":features:referral:presentation"))
implementation(project(":features:referral:domain"))
implementation(project(":features:referral:data"))
/** AndroidX libraries */
implementation(AndroidX.coreKtx)
@ -139,9 +143,13 @@ dependencies {
implementation(Firebase.firebaseCrashlytics)
/** Tangem libraries */
implementation(Tangem.blockchain)
implementation(Tangem.blockchain) {
exclude(module = "joda-time")
}
implementation(Tangem.cardCore)
implementation(Tangem.cardAndroid)
implementation(Tangem.cardAndroid) {
exclude(module = "joda-time")
}
/** DI */
implementation(Library.hilt)

View file

@ -2,12 +2,23 @@ package com.tangem.tap.proxy
import com.tangem.common.card.Card
import com.tangem.domain.common.ScanResponse
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.tokens.UserTokensRepository
import com.tangem.tap.features.tokens.redux.TokensMiddleware
import com.tangem.tap.features.wallet.redux.WalletState
import org.rekotlin.Store
/**
* 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 {
val scanResponse: ScanResponse? = null
val walletState: WalletState? = null
val userTokensRepository: UserTokensRepository? = null
val mainStore: Store<AppState>? = null
val tokesMiddleware: TokensMiddleware? = null
fun getActualCard(): Card? {
return scanResponse?.card

View file

@ -8,15 +8,14 @@ import com.tangem.lib.crypto.DerivationManager
import com.tangem.lib.crypto.models.Currency
import com.tangem.lib.crypto.models.NonNativeToken
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.tokens.redux.TokensMiddleware
import kotlin.coroutines.suspendCoroutine
class DerivationManagerImpl(
private val tokesMiddleware: TokensMiddleware,
private val appStateHolder: AppStateHolder,
) : DerivationManager {
override suspend fun deriveMissingBlockchains(currency: Currency) = suspendCoroutine<Boolean> { continuation ->
val tokesMiddleware = requireNotNull(appStateHolder.tokesMiddleware) { "tokesMiddleware is null" }
val blockchain = Blockchain.fromNetworkId(currency.networkId)
val card = appStateHolder.getActualCard()
if (blockchain != null && card != null) {

View file

@ -12,24 +12,21 @@ import com.tangem.lib.crypto.UserWalletManager
import com.tangem.lib.crypto.models.Currency
import com.tangem.lib.crypto.models.NativeToken
import com.tangem.lib.crypto.models.NonNativeToken
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.extensions.getUserWalletId
import com.tangem.tap.domain.extensions.makeWalletManagerForApp
import com.tangem.tap.domain.tokens.UserTokensRepository
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
import com.tangem.tap.features.wallet.redux.WalletAction
import org.rekotlin.Action
import org.rekotlin.Store
class UserWalletManagerImpl(
private val userTokensRepository: UserTokensRepository,
private val appStateHolder: AppStateHolder,
private val mainStore: Store<AppState>,
private val walletManagerFactory: WalletManagerFactory,
) : UserWalletManager {
override suspend fun getUserTokens(): List<Currency> {
val card = appStateHolder.getActualCard()
val userTokensRepository =
requireNotNull(appStateHolder.userTokensRepository) { "userTokensRepository is null" }
if (card != null) {
userTokensRepository.getUserTokens(card)
.filter { it.isToken() }
@ -62,6 +59,8 @@ class UserWalletManagerImpl(
override suspend fun isTokenAdded(currency: Currency): Boolean {
val card = appStateHolder.getActualCard()
val userTokensRepository =
requireNotNull(appStateHolder.userTokensRepository) { "userTokensRepository is null" }
if (card != null) {
return userTokensRepository.getUserTokens(card)
.any { it.coinId.equals(currency.id) } //todo ensure that its the same ids
@ -81,7 +80,7 @@ class UserWalletManagerImpl(
} else {
addNonNativeTokenToWalletAction(currency as NonNativeToken)
}
val mainStore = requireNotNull(appStateHolder.mainStore) { "mainStore is null" }
mainStore.dispatch(action)
}

View file

@ -0,0 +1,41 @@
package com.tangem.tap.proxy.di
import com.tangem.blockchain.common.WalletManagerFactory
import com.tangem.lib.crypto.DerivationManager
import com.tangem.lib.crypto.UserWalletManager
import com.tangem.tap.proxy.AppStateHolder
import com.tangem.tap.proxy.DerivationManagerImpl
import com.tangem.tap.proxy.UserWalletManagerImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class ProxyModule {
@Provides
@Singleton
fun provideAppStateHolder(): AppStateHolder {
return AppStateHolder()
}
@Provides
@Singleton
fun provideUserWalletManager(appStateHolder: AppStateHolder): UserWalletManager {
return UserWalletManagerImpl(
appStateHolder = appStateHolder,
walletManagerFactory = WalletManagerFactory(),
)
}
@Provides
@Singleton
fun provideDerivationManager(appStateHolder: AppStateHolder): DerivationManager {
return DerivationManagerImpl(
appStateHolder = appStateHolder,
)
}
}

View file

@ -0,0 +1,16 @@
package com.tangem.utils.di
import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
interface CoroutineDispatcherProviderModule {
@Binds
fun bindCoroutineDispatcherProvider(coroutineDispatcherProvider: AppCoroutineDispatcherProvider): CoroutineDispatcherProvider
}

View file

@ -75,9 +75,13 @@ dependencies {
implementation(project(":common"))
/** Tangem libraries */
implementation(Tangem.blockchain)
implementation(Tangem.blockchain) {
exclude(module = "joda-time")
}
implementation(Tangem.cardCore)
implementation(Tangem.cardAndroid)
implementation(Tangem.cardAndroid) {
exclude(module = "joda-time")
}
/** Other libraries */
implementation(Library.reKotlin)

View file

@ -7,9 +7,8 @@ import com.tangem.feature.referral.domain.ReferralRepository
import com.tangem.feature.referral.domain.models.ReferralData
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
import javax.inject.Inject
internal class ReferralRepositoryImpl @Inject constructor(
internal class ReferralRepositoryImpl(
private val referralApi: ReferralApi,
private val referralConverter: ReferralConverter,
private val coroutineDispatcher: CoroutineDispatcherProvider,

View file

@ -0,0 +1,29 @@
package com.tangem.feature.referral.di
import com.tangem.datasource.api.referral.ReferralApi
import com.tangem.feature.referral.converters.ReferralConverter
import com.tangem.feature.referral.data.ReferralRepositoryImpl
import com.tangem.feature.referral.domain.ReferralRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class ReferralRepositoryModule {
@Provides
@Singleton
fun provideReferralRepository(
referralApi: ReferralApi,
referralConverter: ReferralConverter,
coroutineDispatcherProvider: CoroutineDispatcherProvider,
): ReferralRepository {
return ReferralRepositoryImpl(
referralApi, referralConverter, coroutineDispatcherProvider,
)
}
}

View file

@ -5,8 +5,9 @@ import com.tangem.lib.crypto.models.Currency
import com.tangem.lib.crypto.models.NativeToken
import com.tangem.lib.crypto.models.NonNativeToken
import com.tangem.utils.converter.Converter
import javax.inject.Inject
class TokensConverter : Converter<TokenData, Currency> {
class TokensConverter @Inject constructor() : Converter<TokenData, Currency> {
override fun convert(value: TokenData): Currency {
return if (value.decimalCount != null &&

View file

@ -0,0 +1,31 @@
package com.tangem.feature.referral.domain.di
import com.tangem.feature.referral.domain.ReferralInteractor
import com.tangem.feature.referral.domain.ReferralInteractorImpl
import com.tangem.feature.referral.domain.ReferralRepository
import com.tangem.feature.referral.domain.converter.TokensConverter
import com.tangem.lib.crypto.DerivationManager
import com.tangem.lib.crypto.UserWalletManager
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class ReferralDomainModule {
@Provides
@Singleton
fun provideReferralInteractor(
referralRepository: ReferralRepository,
derivationManager: DerivationManager,
userWalletManager: UserWalletManager,
tokensConverter: TokensConverter,
): ReferralInteractor {
return ReferralInteractorImpl(
referralRepository, derivationManager, userWalletManager, tokensConverter,
)
}
}

View file

@ -1,6 +1,8 @@
plugins {
id("com.android.library")
kotlin("android")
kotlin("kapt")
id("com.google.dagger.hilt.android")
}
android {
@ -42,6 +44,13 @@ dependencies {
implementation(Compose.material)
implementation(Compose.uiTooling)
/** Domain */
implementation(project(":features:referral:domain"))
/** Other libraries */
implementation(Library.composeShimmer)
/** DI */
implementation(Library.hilt)
kapt(Library.hiltKapt)
}

View file

@ -0,0 +1,11 @@
package com.tangem.feature.referral.presentation
import androidx.lifecycle.ViewModel
import com.tangem.feature.referral.domain.ReferralInteractor
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class ReferralViewModel @Inject constructor(referralInteractor: ReferralInteractor) : ViewModel() {
}