Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-17 17:50:49 +04:00
parent 154de76c6d
commit 1aba736b1e
6 changed files with 39 additions and 17 deletions

View file

@ -191,7 +191,16 @@ sealed class AppRoute(val path: String) : Route {
}
@Serializable
data object ReferralProgram : AppRoute(path = "/referral_program")
data class ReferralProgram(
val userWalletId: UserWalletId,
) : AppRoute(path = "/referral_program"), RouteBundleParams {
override fun getBundle(): Bundle = bundle(serializer())
companion object {
const val USER_WALLET_ID_KEY = "userWalletId"
}
}
@Serializable
data class Swap(

View file

@ -1,12 +1,13 @@
package com.tangem.feature.referral.domain
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.referral.domain.models.ReferralData
interface ReferralInteractor {
val isDemoMode: Boolean
suspend fun getReferralStatus(): ReferralData
suspend fun getReferralStatus(userWalletId: UserWalletId): ReferralData
suspend fun startReferral(): ReferralData
suspend fun startReferral(userWalletId: UserWalletId): ReferralData
}

View file

@ -3,7 +3,8 @@ package com.tangem.feature.referral.domain
import arrow.core.getOrElse
import com.tangem.domain.card.DerivePublicKeysUseCase
import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.feature.referral.domain.models.ReferralData
import com.tangem.feature.referral.domain.models.TokenData
import com.tangem.lib.crypto.UserWalletManager
@ -14,7 +15,7 @@ internal class ReferralInteractorImpl(
private val repository: ReferralRepository,
private val userWalletManager: UserWalletManager,
private val derivePublicKeysUseCase: DerivePublicKeysUseCase,
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
private val getUserWalletUseCase: GetUserWalletUseCase,
private val addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase,
) : ReferralInteractor {
@ -22,20 +23,20 @@ internal class ReferralInteractorImpl(
override val isDemoMode: Boolean get() = repository.isDemoMode
override suspend fun getReferralStatus(): ReferralData {
val referralData = repository.getReferralData(userWalletManager.getWalletId())
override suspend fun getReferralStatus(userWalletId: UserWalletId): ReferralData {
val referralData = repository.getReferralData(userWalletId.stringValue)
saveReferralTokens(referralData.tokens)
return referralData
}
override suspend fun startReferral(): ReferralData {
override suspend fun startReferral(userWalletId: UserWalletId): ReferralData {
if (tokensForReferral.isEmpty()) error("Tokens for ref is empty")
val tokenData = tokensForReferral.first()
val userWallet = getSelectedWalletSyncUseCase().getOrElse {
error("Failed to get selected wallet: $it")
val userWallet = getUserWalletUseCase(userWalletId).getOrElse {
error("Failed to get user wallet $userWalletId: $it")
}
val cryptoCurrency = repository.getCryptoCurrency(userWalletId = userWallet.walletId, tokenData = tokenData)

View file

@ -2,7 +2,7 @@ package com.tangem.feature.referral.domain.di
import com.tangem.domain.card.DerivePublicKeysUseCase
import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.feature.referral.domain.ReferralInteractor
import com.tangem.feature.referral.domain.ReferralInteractorImpl
import com.tangem.feature.referral.domain.ReferralRepository
@ -23,14 +23,14 @@ class ReferralDomainModule {
referralRepository: ReferralRepository,
userWalletManager: UserWalletManager,
derivePublicKeysUseCase: DerivePublicKeysUseCase,
getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
getUserWalletUseCase: GetUserWalletUseCase,
addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase,
): ReferralInteractor {
return ReferralInteractorImpl(
repository = referralRepository,
userWalletManager = userWalletManager,
derivePublicKeysUseCase = derivePublicKeysUseCase,
getSelectedWalletSyncUseCase = getSelectedWalletSyncUseCase,
getUserWalletUseCase = getUserWalletUseCase,
addCryptoCurrenciesUseCase = addCryptoCurrenciesUseCase,
)
}

View file

@ -31,6 +31,7 @@ dependencies {
implementation(deps.compose.ui.tooling)
/** Domain */
implementation(projects.domain.wallets.models)
implementation(projects.features.referral.domain)
/** Other libraries */

View file

@ -1,11 +1,16 @@
package com.tangem.feature.referral.viewmodels
import android.os.Bundle
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.bundle.unbundle
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.referral.analytics.ReferralEvents
import com.tangem.feature.referral.domain.ReferralInteractor
import com.tangem.feature.referral.domain.models.DiscountType
@ -29,15 +34,20 @@ internal class ReferralViewModel @Inject constructor(
private val referralInteractor: ReferralInteractor,
private val dispatchers: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler,
savedStateHandle: SavedStateHandle,
) : ViewModel() {
var uiState: ReferralStateHolder by mutableStateOf(createInitiallyUiState())
private set
private val userWalletId = savedStateHandle.get<Bundle>(AppRoute.ReferralProgram.USER_WALLET_ID_KEY)
?.unbundle(UserWalletId.serializer())
?: error("User wallet ID is required for Referral screen")
private var referralRouter: ReferralRouter by Delegates.notNull()
private var lastReferralData: ReferralData? = null
var uiState: ReferralStateHolder by mutableStateOf(createInitiallyUiState())
private set
init {
loadReferralData()
}
@ -66,7 +76,7 @@ internal class ReferralViewModel @Inject constructor(
uiState = uiState.copy(referralInfoState = ReferralInfoState.Loading)
viewModelScope.launch(dispatchers.main) {
runCatching(dispatchers.io) {
referralInteractor.getReferralStatus().apply {
referralInteractor.getReferralStatus(userWalletId).apply {
lastReferralData = this
}
}
@ -82,7 +92,7 @@ internal class ReferralViewModel @Inject constructor(
analyticsEventHandler.send(ReferralEvents.ClickParticipate)
uiState = uiState.copy(referralInfoState = ReferralInfoState.Loading)
viewModelScope.launch(dispatchers.main) {
runCatching(dispatchers.io) { referralInteractor.startReferral() }
runCatching(dispatchers.io) { referralInteractor.startReferral(userWalletId) }
.onSuccess(::showContent)
.onFailure { throwable ->
if (throwable is UserCancelledException) {