Skip to content

Commit

Permalink
Merge pull request #51 from dreipol/feature/abstract-navigation-state
Browse files Browse the repository at this point in the history
[abstract-navigation-state] Abstract navigation state
  • Loading branch information
tschuls authored Jul 12, 2024
2 parents 3d3c1e5 + 4ea99b6 commit 12179a7
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ch.dreipol.dreimultiplatform.reduxkotlin.navigation

abstract class AbstractNavigationState<Screen> {
abstract val homeScreen: Screen
abstract val pushedScreens: List<Screen>
val screens: List<Screen>
get() = listOf(homeScreen) + pushedScreens

val currentScreen: Screen
get() = screens.last()
}

// used in Android for showing correct animation when
// navigating back from deep link jump
enum class NavigationDirection {
PUSH,
POP
}

data class DirectionalNavigationState<Screen>(
override val homeScreen: Screen,
override val pushedScreens: List<Screen> = emptyList(),
val navigationDirection: NavigationDirection = NavigationDirection.POP,
) : AbstractNavigationState<Screen>()
Original file line number Diff line number Diff line change
@@ -1,13 +1,4 @@
package ch.dreipol.dreimultiplatform.reduxkotlin.navigation

fun navigateBack(state: NavigationState): NavigationState {
if (state.sheet != null) {
return state.copy(sheet = null)
}
val screens = state.screens.toMutableList()
if (screens.size == 1) {
return state
}
screens.removeAt(screens.lastIndex)
return state.copy(screens = screens, navigationDirection = NavigationDirection.POP)
}
fun <Screen> navigateBack(state: DirectionalNavigationState<Screen>): DirectionalNavigationState<Screen> =
state.copy(pushedScreens = state.pushedScreens.dropLast(1), navigationDirection = NavigationDirection.POP)

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import ch.dreipol.dreimultiplatform.reduxkotlin.subscribeChanges
import org.reduxkotlin.Store
import org.reduxkotlin.StoreSubscriber

interface Navigator<RootState : Any> {
interface Navigator<RootState : Any, NavigationState : AbstractNavigationState<*>> {
val store: Store<RootState>
fun updateNavigationState(navigationState: NavigationState)
fun getNavigationState(): NavigationState
}

fun <RootState : Any> Navigator<RootState>.subscribeNavigationState(): StoreSubscriber {
fun <
RootState : Any,
NavigationState : AbstractNavigationState<*>
> Navigator<RootState, NavigationState>.subscribeNavigationState(): StoreSubscriber {
return store.subscribeChanges({ getNavigationState() }) {
updateNavigationState(getNavigationState())
}
Expand Down

This file was deleted.

0 comments on commit 12179a7

Please sign in to comment.