Skip to content

Commit

Permalink
Redirect user from PremiumBuying to PremiumHome if he has an active
Browse files Browse the repository at this point in the history
subscription
  • Loading branch information
markocic committed Mar 4, 2025
1 parent a1da65b commit f48281c
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ interface PremiumBuyingContract {
) : UiEvent()
}

sealed class SideEffect {
data object NavigateToPremiumHome : SideEffect()
}

enum class PremiumStage {
Home,
FindPrimalName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
Expand All @@ -32,6 +33,14 @@ import net.primal.android.theme.AppTheme
fun PremiumBuyingScreen(viewModel: PremiumBuyingViewModel, screenCallbacks: PremiumBuyingContract.ScreenCallbacks) {
val uiState = viewModel.state.collectAsState()

LaunchedEffect(viewModel) {
viewModel.effects.collect {
when (it) {
PremiumBuyingContract.SideEffect.NavigateToPremiumHome -> screenCallbacks.onPremiumPurchased()
}
}
}

PremiumBuyingScreen(
state = uiState.value,
eventPublisher = viewModel::setEvent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.getAndUpdate
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch
import net.primal.android.core.compose.profile.model.asProfileDetailsUi
import net.primal.android.core.utils.isGoogleBuild
Expand All @@ -19,10 +21,12 @@ import net.primal.android.navigation.buyingPremiumFromOrigin
import net.primal.android.navigation.extendExistingPremiumName
import net.primal.android.networking.sockets.errors.WssException
import net.primal.android.premium.buying.PremiumBuyingContract.PremiumStage
import net.primal.android.premium.buying.PremiumBuyingContract.SideEffect
import net.primal.android.premium.buying.PremiumBuyingContract.UiEvent
import net.primal.android.premium.buying.PremiumBuyingContract.UiState
import net.primal.android.premium.domain.MembershipError
import net.primal.android.premium.repository.PremiumRepository
import net.primal.android.premium.utils.hasPremiumMembership
import net.primal.android.profile.repository.ProfileRepository
import net.primal.android.user.accounts.active.ActiveAccountStore
import net.primal.android.user.repository.UserRepository
Expand Down Expand Up @@ -61,7 +65,12 @@ class PremiumBuyingViewModel @Inject constructor(
private val events: MutableSharedFlow<UiEvent> = MutableSharedFlow()
fun setEvent(event: UiEvent) = viewModelScope.launch { events.emit(event) }

private val _effects = Channel<SideEffect>()
val effects = _effects.receiveAsFlow()
private fun setEffect(effect: SideEffect) = viewModelScope.launch { _effects.send(effect) }

init {
checkMembershipStatus()
observeEvents()
observePurchases()
observeActiveProfile()
Expand All @@ -75,6 +84,15 @@ class PremiumBuyingViewModel @Inject constructor(
}
}

private fun checkMembershipStatus() =
viewModelScope.launch {
premiumRepository.fetchMembershipStatus(userId = activeAccountStore.activeUserId())?.let {
if (it.hasPremiumMembership()) {
setEffect(SideEffect.NavigateToPremiumHome)
}
}
}

private fun initBillingClient() {
viewModelScope.launch {
if (isGoogleBuild()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,14 @@ class PremiumRepository @Inject constructor(
response.available
}

suspend fun fetchMembershipStatus(userId: String) {
suspend fun fetchMembershipStatus(userId: String): PremiumMembership? =
withContext(dispatchers.io()) {
premiumApi.getPremiumMembershipStatus(userId = userId)?.let { response ->
accountsStore.getAndUpdateAccount(userId = userId) {
this.copy(premiumMembership = response.toPremiumMembership())
}
}
}?.premiumMembership
}
}

suspend fun shouldShowSupportUsNotice() =
withContext(dispatchers.io()) {
Expand Down

0 comments on commit f48281c

Please sign in to comment.