Skip to content

Commit

Permalink
Created StackNavigator interface and removed ComposeStackNavigator
Browse files Browse the repository at this point in the history
  • Loading branch information
chRyNaN committed Feb 28, 2022
1 parent adf27c2 commit 57c2283
Show file tree
Hide file tree
Showing 13 changed files with 121 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ import androidx.compose.runtime.saveable.rememberSaveable
@Composable
@ExperimentalNavigationApi
internal actual fun <Context, Key> InternalNavContainer(
navigator: BaseComposeNavigatorByContentViewModel<Context, Key>
navigator: ComposeNavigatorByContentViewModel<Context, Key>
) {
val contentKey = rememberSaveable(navigator.keySaver) { mutableStateOf(navigator.initialKey) }

navigator.keyChanges.collectAsStateIn(state = contentKey)

val scope = object : ComposeNavigationContentScope<Key> {
val scope = object : ComposeNavigationContentScope<Context, Key> {

override val navigator: ComposeStackNavigatorByContent<Key> = navigator
override val navigator: ComposeNavigatorByContentViewModel<Context, Key> = navigator
}

Box {
Expand All @@ -30,7 +30,7 @@ internal actual fun <Context, Key> InternalNavContainer(

@Composable
@ExperimentalNavigationApi
internal actual fun <Context, Key, NavigationScope : ComposeNavigationKeyScope<Key>> InternalNavContainer(
internal actual fun <Context, Key, NavigationScope : ComposeNavigationKeyScope<Context, Key>> InternalNavContainer(
navigator: BaseComposeNavigatorByKeyViewModel<Context, Key, NavigationScope>,
scope: NavigationScope
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,23 @@ import androidx.compose.runtime.Composable
import com.chrynan.navigation.*

@ExperimentalNavigationApi
interface ComposeNavigationIntentStackNavigatorByKey<I : NavigationIntent> :
ComposeStackNavigatorByKey<I>,
NavigationEventHandler<I, ComposeNavigationIntentScope<I>>,
NavigationEventNavigator<I> {
interface ComposeNavigationIntentStackNavigatorByKey<Context, Intent : NavigationIntent> :
ComposeNavigatorByKey<Context, Intent>,
NavigationEventHandler<Intent, ComposeNavigationIntentScope<Context, Intent>>,
NavigationEventNavigator<Intent>,
StackNavigator {

override fun ComposeNavigationIntentScope<I>.onGoBack() {
val scope: ComposeNavigationIntentScope<Context, Intent>

override fun ComposeNavigationIntentScope<Context, Intent>.onGoBack() {
goBack()
}

override fun ComposeNavigationIntentScope<I>.onGoUp() = onGoBack()

override fun ComposeNavigationIntentScope<I>.onGoTo(intent: I) = goTo(key = intent)
override fun ComposeNavigationIntentScope<Context, Intent>.onGoUp() = onGoBack()

override fun navigate(event: NavigationEvent<I>) {
val scope = object : ComposeNavigationIntentScope<I> {

override val navigator: ComposeNavigationIntentStackNavigatorByKey<I>
get() = this@ComposeNavigationIntentStackNavigatorByKey
}
override fun ComposeNavigationIntentScope<Context, Intent>.onGoTo(intent: Intent) = goTo(key = intent)

override fun navigate(event: NavigationEvent<Intent>) {
scope.onNavigate(event = event)
}
}
Expand All @@ -33,9 +30,18 @@ class ComposeNavigationIntentNavigatorByKeyViewModel<Context, Intent : Navigatio
initialScope: Context,
initialKeys: (Context) -> Intent,
keySaver: Saver<Intent, Any>,
override val content: @Composable ComposeNavigationIntentScope<Intent>.(key: Intent) -> Unit
) : BaseComposeNavigatorByKeyViewModel<Context, Intent, ComposeNavigationIntentScope<Intent>>(
override val content: @Composable ComposeNavigationIntentScope<Context, Intent>.(key: Intent) -> Unit
) : BaseComposeNavigatorByKeyViewModel<Context, Intent, ComposeNavigationIntentScope<Context, Intent>>(
initialContext = initialScope,
initialKeys = initialKeys,
keySaver = keySaver
), ComposeNavigationIntentStackNavigatorByKey<Intent>
), ComposeNavigationIntentStackNavigatorByKey<Context, Intent> {

override val scope = object : ComposeNavigationIntentScope<Context, Intent> {

override val navigator: ComposeNavigationIntentNavigatorByKeyViewModel<Context, Intent>
get() = this@ComposeNavigationIntentNavigatorByKeyViewModel
}

override fun goBack(): Boolean = super<BaseComposeNavigatorByKeyViewModel>.goBack()
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,26 @@ interface ComposeNavigationScope : NavigationScope {
}

@ExperimentalNavigationApi
interface ComposeNavigationKeyScope<K> : ComposeNavigationScope {
interface ComposeNavigationKeyScope<Context, Key> : ComposeNavigationScope {

val navigator: ComposeStackNavigatorByKey<K>
val navigator: ComposeNavigatorByKey<Context, Key>

companion object
}

@ExperimentalNavigationApi
interface ComposeNavigationIntentScope<I : NavigationIntent> : ComposeNavigationKeyScope<I> {
interface ComposeNavigationIntentScope<Context, Intent : NavigationIntent> : ComposeNavigationScope,
ComposeNavigationKeyScope<Context, Intent> {

override val navigator: ComposeNavigationIntentStackNavigatorByKey<I>
override val navigator: ComposeNavigationIntentStackNavigatorByKey<Context, Intent>

companion object
}

@ExperimentalNavigationApi
interface ComposeNavigationContentScope<K> : ComposeNavigationScope {
interface ComposeNavigationContentScope<Context, Key> : ComposeNavigationScope {

val navigator: ComposeStackNavigatorByContent<K>
val navigator: ComposeNavigatorByContent<Context, Key>

companion object
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,28 @@ interface ComposeNavigator<Key> : Navigator {
}

@ExperimentalNavigationApi
interface ComposeNavigatorByContent<Key> : ComposeNavigator<Key> {
interface ComposeContextNavigator<Context, Key> : ComposeNavigator<Key> {

val initialContext: Context

val currentContext: Context

val contextChanges: Flow<Context>

fun changeContext(to: Context)

companion object
}

@ExperimentalNavigationApi
interface ComposeNavigatorByContent<Context, Key> : ComposeNavigator<Key>,
ComposeContextNavigator<Context, Key> {

@Composable
fun goTo(
key: Key,
strategy: StackDuplicateContentStrategy,
content: @Composable ComposeNavigationContentScope<Key>.() -> Unit
content: @Composable ComposeNavigationContentScope<Context, Key>.() -> Unit
)

companion object
Expand All @@ -40,11 +55,15 @@ interface ComposeNavigatorByContent<Key> : ComposeNavigator<Key> {
@Suppress("unused")
@ExperimentalNavigationApi
@Composable
fun <Key> ComposeNavigatorByContent<Key>.goTo(key: Key, content: @Composable ComposeNavigationContentScope<Key>.() -> Unit) =
fun <Context, Key> ComposeNavigatorByContent<Context, Key>.goTo(
key: Key,
content: @Composable ComposeNavigationContentScope<Context, Key>.() -> Unit
) =
goTo(key = key, strategy = StackDuplicateContentStrategy.CLEAR_STACK, content = content)

@ExperimentalNavigationApi
interface ComposeNavigatorByKey<Key> : ComposeNavigator<Key> {
interface ComposeNavigatorByKey<Context, Key> : ComposeNavigator<Key>,
ComposeContextNavigator<Context, Key> {

fun goTo(
key: Key,
Expand All @@ -57,43 +76,5 @@ interface ComposeNavigatorByKey<Key> : ComposeNavigator<Key> {
// Note: This is needed because defaults aren't working for @Composable functions for interfaces.
@Suppress("unused")
@ExperimentalNavigationApi
fun <Key> ComposeNavigatorByKey<Key>.goTo(key: Key) =
fun <Context, Key> ComposeNavigatorByKey<Context, Key>.goTo(key: Key) =
goTo(key = key, strategy = StackDuplicateContentStrategy.CLEAR_STACK)

@ExperimentalNavigationApi
interface ComposeStackNavigator<Key> : ComposeNavigator<Key> {

fun canGoBack(): Boolean

fun goBack(): Boolean

companion object
}

@ExperimentalNavigationApi
interface ComposeStackNavigatorByContent<Key> : ComposeStackNavigator<Key>,
ComposeNavigatorByContent<Key> {

companion object
}

@ExperimentalNavigationApi
interface ComposeStackNavigatorByKey<Key> : ComposeStackNavigator<Key>,
ComposeNavigatorByKey<Key> {

companion object
}

@ExperimentalNavigationApi
interface ComposeContextNavigator<Context, Key> : ComposeNavigator<Key> {

val initialContext: Context

val currentContext: Context

val contextChanges: Flow<Context>

fun changeContext(to: Context)

companion object
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,27 @@ package com.chrynan.navigation.compose
import androidx.compose.runtime.Composable
import com.chrynan.presentation.ViewModel
import com.chrynan.navigation.StackDuplicateContentStrategy
import com.chrynan.navigation.StackNavigator
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.filterNotNull

@ExperimentalNavigationApi
abstract class BaseComposeNavigatorByContentViewModel<Context, Key> : ViewModel(),
ComposeNavigator<Key>,
ComposeNavigatorByContent<Key>,
ComposeStackNavigatorByContent<Key>,
ComposeNavigatorByContent<Context, Key>,
StackNavigator,
ComposeContextNavigator<Context, Key> {

@Composable
internal abstract fun ComposeNavigationContentScope<Key>.content(key: Key)
internal abstract fun ComposeNavigationContentScope<Context, Key>.content(key: Key)
}

@ExperimentalNavigationApi
class ComposeNavigatorByContentViewModel<Context, Key> internal constructor(
override val initialContext: Context,
override val keySaver: Saver<Key, Any>,
private val initialKeysAndContent: (Context) -> Pair<Key, @Composable ComposeNavigationContentScope<Key>.() -> Unit>
private val initialKeysAndContent: (Context) -> Pair<Key, @Composable ComposeNavigationContentScope<Context, Key>.() -> Unit>
) : BaseComposeNavigatorByContentViewModel<Context, Key>() {

override val keyChanges: Flow<Key>
Expand All @@ -31,7 +32,7 @@ class ComposeNavigatorByContentViewModel<Context, Key> internal constructor(
override val initialKey: Key
get() = initialKeysAndContent(initialContext).first

private val initialContent: @Composable ComposeNavigationContentScope<Key>.() -> Unit
private val initialContent: @Composable ComposeNavigationContentScope<Context, Key>.() -> Unit
get() = initialKeysAndContent(initialContext).second

override val currentKey: Key
Expand All @@ -49,7 +50,7 @@ class ComposeNavigatorByContentViewModel<Context, Key> internal constructor(
private val mutableKeyFlow = MutableStateFlow(value = initialKey)
private val mutableScopeFlow = MutableStateFlow(value = initialContext)

private val contents = mutableMapOf<Key, (@Composable ComposeNavigationContentScope<Key>.() -> Unit)>(
private val contents = mutableMapOf<Key, (@Composable ComposeNavigationContentScope<Context, Key>.() -> Unit)>(
initialKey to initialContent
)

Expand All @@ -59,7 +60,7 @@ class ComposeNavigatorByContentViewModel<Context, Key> internal constructor(
override fun goTo(
key: Key,
strategy: StackDuplicateContentStrategy,
content: @Composable ComposeNavigationContentScope<Key>.() -> Unit
content: @Composable ComposeNavigationContentScope<Context, Key>.() -> Unit
) {
val currentScope = this.currentContext
val currentKeyStack = scopedKeyStack[currentScope] ?: mutableListOf()
Expand Down Expand Up @@ -121,7 +122,7 @@ class ComposeNavigatorByContentViewModel<Context, Key> internal constructor(
}

@Composable
override fun ComposeNavigationContentScope<Key>.content(key: Key) {
override fun ComposeNavigationContentScope<Context, Key>.content(key: Key) {
contents[key]?.invoke(this)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@ package com.chrynan.navigation.compose
import androidx.compose.runtime.Composable
import com.chrynan.presentation.ViewModel
import com.chrynan.navigation.StackDuplicateContentStrategy
import com.chrynan.navigation.StackNavigator
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.filterNotNull

@ExperimentalNavigationApi
abstract class BaseComposeNavigatorByKeyViewModel<Context, Key, NavigationScope : ComposeNavigationKeyScope<Key>>(
abstract class BaseComposeNavigatorByKeyViewModel<Context, Key, NavigationScope : ComposeNavigationKeyScope<Context, Key>>(
final override val initialContext: Context,
final override val keySaver: Saver<Key, Any>,
private val initialKeys: (Context) -> Key
) : ViewModel(),
ComposeNavigator<Key>,
ComposeNavigatorByKey<Key>,
ComposeStackNavigatorByKey<Key>,
ComposeNavigatorByKey<Context, Key>,
StackNavigator,
ComposeContextNavigator<Context, Key> {

internal abstract val content: @Composable NavigationScope.(key: Key) -> Unit
Expand Down Expand Up @@ -114,8 +115,8 @@ class ComposeNavigatorByKeyViewModel<Context, Key> internal constructor(
initialContext: Context,
initialKeys: (Context) -> Key,
keySaver: Saver<Key, Any>,
override val content: @Composable ComposeNavigationKeyScope<Key>.(key: Key) -> Unit
) : BaseComposeNavigatorByKeyViewModel<Context, Key, ComposeNavigationKeyScope<Key>>(
override val content: @Composable ComposeNavigationKeyScope<Context, Key>.(key: Key) -> Unit
) : BaseComposeNavigatorByKeyViewModel<Context, Key, ComposeNavigationKeyScope<Context, Key>>(
initialContext = initialContext,
initialKeys = initialKeys,
keySaver = keySaver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import com.chrynan.navigation.NavigationIntent

@Composable
@ExperimentalNavigationApi
internal expect fun <Context, Key> InternalNavContainer(navigator: BaseComposeNavigatorByContentViewModel<Context, Key>)
internal expect fun <Context, Key> InternalNavContainer(navigator: ComposeNavigatorByContentViewModel<Context, Key>)

@Composable
@ExperimentalNavigationApi
internal expect fun <Context, Key, NavigationScope : ComposeNavigationKeyScope<Key>> InternalNavContainer(
internal expect fun <Context, Key, NavigationScope : ComposeNavigationKeyScope<Context, Key>> InternalNavContainer(
navigator: BaseComposeNavigatorByKeyViewModel<Context, Key, NavigationScope>,
scope: NavigationScope
)
Expand Down Expand Up @@ -71,9 +71,9 @@ fun <Context, Key> NavContainer(navigator: ComposeNavigatorByContentViewModel<Co
@Composable
@ExperimentalNavigationApi
fun <Context, Key> NavContainer(navigator: ComposeNavigatorByKeyViewModel<Context, Key>) {
val scope = object : ComposeNavigationKeyScope<Key> {
val scope = object : ComposeNavigationKeyScope<Context, Key> {

override val navigator: ComposeStackNavigatorByKey<Key>
override val navigator: ComposeNavigatorByKeyViewModel<Context, Key>
get() = navigator
}

Expand Down Expand Up @@ -109,9 +109,9 @@ fun <Context, Key> NavContainer(navigator: ComposeNavigatorByKeyViewModel<Contex
@Composable
@ExperimentalNavigationApi
fun <Context, Intent : NavigationIntent> NavContainer(navigator: ComposeNavigationIntentNavigatorByKeyViewModel<Context, Intent>) {
val scope = object : ComposeNavigationIntentScope<Intent> {
val scope = object : ComposeNavigationIntentScope<Context, Intent> {

override val navigator: ComposeNavigationIntentStackNavigatorByKey<Intent>
override val navigator: ComposeNavigationIntentNavigatorByKeyViewModel<Context, Intent>
get() = navigator
}

Expand Down
Loading

0 comments on commit 57c2283

Please sign in to comment.