diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index 136385e388..8a2676a038 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -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( diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt index 8024d1cc67..2bf7174f00 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractor.kt @@ -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 } \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt index 154764b162..36782f4e1d 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralInteractorImpl.kt @@ -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) diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt index 0cd466fed7..172c41b27d 100644 --- a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/di/ReferralDomainModule.kt @@ -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, ) } diff --git a/features/referral/presentation/build.gradle.kts b/features/referral/presentation/build.gradle.kts index 8a99c77aa6..ef6062abd5 100644 --- a/features/referral/presentation/build.gradle.kts +++ b/features/referral/presentation/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation(deps.compose.ui.tooling) /** Domain */ + implementation(projects.domain.wallets.models) implementation(projects.features.referral.domain) /** Other libraries */ diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt index 82c0d08bb8..6565947793 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/viewmodels/ReferralViewModel.kt @@ -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(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) {