Updated on 2026-08-14
This commit is contained in:
parent
154de76c6d
commit
1aba736b1e
6 changed files with 39 additions and 17 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ dependencies {
|
|||
implementation(deps.compose.ui.tooling)
|
||||
|
||||
/** Domain */
|
||||
implementation(projects.domain.wallets.models)
|
||||
implementation(projects.features.referral.domain)
|
||||
|
||||
/** Other libraries */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue