Updated on 2026-08-14

This commit is contained in:
Tangem 2025-02-09 11:14:22 +04:00
parent b03396d7b1
commit af2b62dbe3
21 changed files with 38 additions and 95 deletions

View file

@ -7,7 +7,6 @@ import com.tangem.blockchainsdk.utils.fromNetworkId
import com.tangem.data.common.currency.CryptoCurrencyFactory
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.models.StartReferralBody
import com.tangem.datasource.demo.DemoModeDatasource
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.wallets.models.UserWalletId
@ -24,16 +23,12 @@ internal class ReferralRepositoryImpl @Inject constructor(
private val referralApi: TangemTechApi,
private val referralConverter: ReferralConverter,
private val coroutineDispatcher: CoroutineDispatcherProvider,
private val demoModeDatasource: DemoModeDatasource,
private val userWalletsStore: UserWalletsStore,
excludedBlockchains: ExcludedBlockchains,
) : ReferralRepository {
private val cryptoCurrencyFactory = CryptoCurrencyFactory(excludedBlockchains)
override val isDemoMode: Boolean
get() = demoModeDatasource.isDemoModeActive
override suspend fun getReferralData(walletId: String): ReferralData {
return withContext(coroutineDispatcher.io) {
referralConverter.convert(
@ -65,7 +60,9 @@ internal class ReferralRepositoryImpl @Inject constructor(
}
override suspend fun getCryptoCurrency(userWalletId: UserWalletId, tokenData: TokenData): CryptoCurrency? {
val userWallet = userWalletsStore.getSyncOrNull(userWalletId) ?: error("Wallet $userWalletId not found")
val userWallet = withContext(coroutineDispatcher.io) {
userWalletsStore.getSyncOrNull(userWalletId) ?: error("Wallet $userWalletId not found")
}
val blockchain = Blockchain.fromNetworkId(tokenData.networkId)
?: error("Blockchain ${tokenData.networkId} not found")

View file

@ -2,7 +2,6 @@ package com.tangem.feature.referral.di
import com.tangem.blockchainsdk.utils.ExcludedBlockchains
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.demo.DemoModeDatasource
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.feature.referral.converters.ReferralConverter
import com.tangem.feature.referral.data.ReferralRepositoryImpl
@ -24,7 +23,6 @@ class ReferralRepositoryModule {
tangemTechApi: TangemTechApi,
referralConverter: ReferralConverter,
coroutineDispatcherProvider: CoroutineDispatcherProvider,
demoModeDatasource: DemoModeDatasource,
userWalletsStore: UserWalletsStore,
excludedBlockchains: ExcludedBlockchains,
): ReferralRepository {
@ -32,7 +30,6 @@ class ReferralRepositoryModule {
referralApi = tangemTechApi,
referralConverter = referralConverter,
coroutineDispatcher = coroutineDispatcherProvider,
demoModeDatasource = demoModeDatasource,
userWalletsStore = userWalletsStore,
excludedBlockchains = excludedBlockchains,
)

View file

@ -5,8 +5,6 @@ import com.tangem.feature.referral.domain.models.ReferralData
interface ReferralInteractor {
val isDemoMode: Boolean
suspend fun getReferralStatus(userWalletId: UserWalletId): ReferralData
suspend fun startReferral(userWalletId: UserWalletId): ReferralData

View file

@ -23,8 +23,6 @@ internal class ReferralInteractorImpl(
private val tokensForReferral = mutableListOf<TokenData>()
override val isDemoMode: Boolean get() = repository.isDemoMode
override suspend fun getReferralStatus(userWalletId: UserWalletId): ReferralData {
val referralData = repository.getReferralData(userWalletId.stringValue)

View file

@ -7,8 +7,6 @@ import com.tangem.feature.referral.domain.models.TokenData
interface ReferralRepository {
val isDemoMode: Boolean
/** Returns data object of [ReferralData] depends on user program status */
suspend fun getReferralData(walletId: String): ReferralData

View file

@ -33,6 +33,8 @@ dependencies {
implementation(deps.compose.ui.tooling)
/** Domain */
implementation(projects.domain.demo)
implementation(projects.domain.wallets)
implementation(projects.domain.wallets.models)
implementation(projects.features.referral.domain)

View file

@ -12,7 +12,9 @@ import com.tangem.common.routing.bundle.unbundle
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.feature.referral.analytics.ReferralEvents
import com.tangem.feature.referral.domain.ReferralInteractor
import com.tangem.feature.referral.domain.errors.ReferralError
@ -24,20 +26,20 @@ import com.tangem.feature.referral.models.ReferralStateHolder
import com.tangem.feature.referral.models.ReferralStateHolder.ErrorSnackbar
import com.tangem.feature.referral.models.ReferralStateHolder.ReferralInfoState
import com.tangem.feature.referral.router.ReferralRouter
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.properties.Delegates
@Suppress("LongParameterList")
@HiltViewModel
internal class ReferralViewModel @Inject constructor(
private val referralInteractor: ReferralInteractor,
private val dispatchers: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler,
private val shareManager: ShareManager,
private val urlOpener: UrlOpener,
private val getUserWalletUseCase: GetUserWalletUseCase,
private val isDemoCardUseCase: IsDemoCardUseCase,
savedStateHandle: SavedStateHandle,
) : ViewModel() {
@ -78,8 +80,8 @@ internal class ReferralViewModel @Inject constructor(
private fun loadReferralData() {
uiState = uiState.copy(referralInfoState = ReferralInfoState.Loading)
viewModelScope.launch(dispatchers.main) {
runCatching(dispatchers.io) {
viewModelScope.launch {
runCatching {
referralInteractor.getReferralStatus(userWalletId).apply {
lastReferralData = this
}
@ -90,13 +92,15 @@ internal class ReferralViewModel @Inject constructor(
}
private fun participate() {
if (referralInteractor.isDemoMode) {
val userWallet = getUserWalletUseCase(userWalletId).getOrNull() ?: error("User wallet not found")
if (isDemoCardUseCase(cardId = userWallet.cardId)) {
showErrorSnackbar(DemoModeException())
} else {
analyticsEventHandler.send(ReferralEvents.ClickParticipate)
uiState = uiState.copy(referralInfoState = ReferralInfoState.Loading)
viewModelScope.launch(dispatchers.main) {
runCatching(dispatchers.io) { referralInteractor.startReferral(userWalletId) }
viewModelScope.launch {
runCatching { referralInteractor.startReferral(userWalletId) }
.onSuccess(::showContent)
.onFailure { throwable ->
if (throwable is ReferralError.UserCancelledException) {