Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ dependencies {
// Core
implementation(projects.core.designsystem)
implementation(projects.core.navigation)
implementation(projects.core.model)

// Features
implementation(projects.feature.home)
Expand All @@ -76,7 +77,8 @@ dependencies {
// Compose
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.navigation3.runtime)
implementation(libs.androidx.navigation3.ui)
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.runtime)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,17 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import com.revenuecat.articles.paywall.compose.ui.CatArticlesMain
import com.revenuecat.articles.paywall.core.navigation.AppComposeNavigator
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@Inject
internal lateinit var composeNavigator: AppComposeNavigator<CatArticlesScreen>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()

setContent {
CatArticlesMain(composeNavigator = composeNavigator)
CatArticlesMain()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,69 @@
*/
package com.revenuecat.articles.paywall.compose.navigation

import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionLayout
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.LocalNavAnimatedContentScope
import androidx.navigation3.ui.NavDisplay
import com.revenuecat.articles.paywall.core.navigation.CatArticlesNavigatorImpl
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen
import com.revenuecat.articles.paywall.core.navigation.LocalComposeNavigator
import com.revenuecat.articles.paywall.feature.account.AccountScreen
import com.revenuecat.articles.paywall.feature.article.CatArticlesDetail
import com.revenuecat.articles.paywall.feature.home.CatArticlesHome
import com.revenuecat.articles.paywall.feature.subscriptions.SubscriptionManagementScreen
import com.revenuecat.articles.paywall.paywalls.CatCustomPaywalls

@OptIn(ExperimentalSharedTransitionApi::class)
@Composable
fun CatArticlesNavHost(navHostController: NavHostController) {
SharedTransitionLayout {
NavHost(
navController = navHostController,
startDestination = CatArticlesScreen.CatHome,
) {
catArticlesNavigation(this@SharedTransitionLayout)
fun CatArticlesNavHost() {
val backStack = rememberNavBackStack(CatArticlesScreen.CatHome)
val navigator = remember(backStack) { CatArticlesNavigatorImpl(backStack) }

CompositionLocalProvider(
LocalComposeNavigator provides navigator,
) {
SharedTransitionLayout {
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
entryDecorators = listOf(rememberSaveableStateHolderNavEntryDecorator()),
entryProvider = entryProvider<NavKey> {
entry<CatArticlesScreen.CatHome> {
CatArticlesHome(
sharedTransitionScope = this@SharedTransitionLayout,
animatedContentScope = LocalNavAnimatedContentScope.current,
)
}

entry<CatArticlesScreen.CatArticle> { screen ->
CatArticlesDetail(
sharedTransitionScope = this@SharedTransitionLayout,
animatedContentScope = LocalNavAnimatedContentScope.current,
article = screen.article,
)
}

entry<CatArticlesScreen.Paywalls> {
CatCustomPaywalls()
}

entry<CatArticlesScreen.Account> {
AccountScreen()
}

entry<CatArticlesScreen.SubscriptionManagement> {
SubscriptionManagementScreen()
}
},
)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,12 @@
package com.revenuecat.articles.paywall.compose.ui

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.compose.rememberNavController
import com.revenuecat.articles.paywall.compose.navigation.CatArticlesNavHost
import com.revenuecat.articles.paywall.core.designsystem.theme.CatArticlesTheme
import com.revenuecat.articles.paywall.core.navigation.AppComposeNavigator
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen

@Composable
fun CatArticlesMain(composeNavigator: AppComposeNavigator<CatArticlesScreen>) {
fun CatArticlesMain() {
CatArticlesTheme {
val navHostController = rememberNavController()

LaunchedEffect(Unit) {
composeNavigator.handleNavigationCommands(navHostController)
}

CatArticlesNavHost(navHostController = navHostController)
CatArticlesNavHost()
}
}
9 changes: 6 additions & 3 deletions core/navigation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
plugins {
id("revenuecat.android.library")
id("revenuecat.android.library.compose")
id("revenuecat.android.hilt")
id("org.jetbrains.kotlin.plugin.serialization")
id("revenuecat.spotless")
}
Expand All @@ -28,6 +27,10 @@ android {
dependencies {
implementation(projects.core.model)

implementation(libs.kotlinx.coroutines.android)
api(libs.androidx.navigation.compose)
// Navigation3
api(libs.androidx.navigation3.runtime)
api(libs.androidx.navigation3.ui)

// json parsing
implementation(libs.kotlinx.serialization.json)
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
*/
package com.revenuecat.articles.paywall.core.navigation

import androidx.navigation3.runtime.NavKey
import com.revenuecat.articles.paywall.core.model.Article
import kotlinx.serialization.Serializable
import kotlin.reflect.typeOf

sealed interface CatArticlesScreen {
sealed interface CatArticlesScreen : NavKey {

@Serializable
data object CatHome : CatArticlesScreen
Expand All @@ -28,11 +28,7 @@ sealed interface CatArticlesScreen {
data object Paywalls : CatArticlesScreen

@Serializable
data class CatArticle(val article: Article) : CatArticlesScreen {
companion object {
val typeMap = mapOf(typeOf<Article>() to CatArticlesType)
}
}
data class CatArticle(val article: Article) : CatArticlesScreen

@Serializable
data object Account : CatArticlesScreen
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,20 @@
*/
package com.revenuecat.articles.paywall.core.navigation

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.compositionLocalOf

@Module
@InstallIn(SingletonComponent::class)
internal interface NavigationModule {
val LocalComposeNavigator: ProvidableCompositionLocal<CatArticlesNavigator> =
compositionLocalOf {
error(
"No CatArticlesNavigator provided! Make sure to wrap your " +
"content with CompositionLocalProvider.",
)
}

@Binds
@Singleton
fun provideComposeNavigator(
catArticlesComposeNavigator: CatArticlesComposeNavigator,
): AppComposeNavigator<CatArticlesScreen>
}
val currentComposeNavigator: CatArticlesNavigator
@Composable
@ReadOnlyComposable
get() = LocalComposeNavigator.current
Loading
Loading