diff --git a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/AbstractNavigationState.kt b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/AbstractNavigationState.kt new file mode 100644 index 0000000..f37aee0 --- /dev/null +++ b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/AbstractNavigationState.kt @@ -0,0 +1,24 @@ +package ch.dreipol.dreimultiplatform.reduxkotlin.navigation + +abstract class AbstractNavigationState { + abstract val homeScreen: Screen + abstract val pushedScreens: List + val screens: List + 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( + override val homeScreen: Screen, + override val pushedScreens: List = emptyList(), + val navigationDirection: NavigationDirection = NavigationDirection.POP, +) : AbstractNavigationState() diff --git a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationReducer.kt b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationReducer.kt index 6f9028d..5d31542 100644 --- a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationReducer.kt +++ b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationReducer.kt @@ -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) -} \ No newline at end of file +fun navigateBack(state: DirectionalNavigationState): DirectionalNavigationState = + state.copy(pushedScreens = state.pushedScreens.dropLast(1), navigationDirection = NavigationDirection.POP) diff --git a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationState.kt b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationState.kt deleted file mode 100644 index 6dd31e4..0000000 --- a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/NavigationState.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ch.dreipol.dreimultiplatform.reduxkotlin.navigation - -data class NavigationState( - val screens: List, - val navigationDirection: NavigationDirection = NavigationDirection.POP, - val sheet: Sheet? = null, - val blockerScreen: Boolean = false, -) { - val currentScreen = screens.last() -} -// used in Android for showing correct animation when -// navigating back from deep link jump -enum class NavigationDirection { - PUSH, - POP -} - diff --git a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Navigator.kt b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Navigator.kt index a87ccf9..325e0e7 100644 --- a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Navigator.kt +++ b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Navigator.kt @@ -4,13 +4,16 @@ import ch.dreipol.dreimultiplatform.reduxkotlin.subscribeChanges import org.reduxkotlin.Store import org.reduxkotlin.StoreSubscriber -interface Navigator { +interface Navigator> { val store: Store fun updateNavigationState(navigationState: NavigationState) fun getNavigationState(): NavigationState } -fun Navigator.subscribeNavigationState(): StoreSubscriber { +fun < + RootState : Any, + NavigationState : AbstractNavigationState<*> + > Navigator.subscribeNavigationState(): StoreSubscriber { return store.subscribeChanges({ getNavigationState() }) { updateNavigationState(getNavigationState()) } diff --git a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Screen.kt b/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Screen.kt deleted file mode 100644 index 12d4a2a..0000000 --- a/src/commonMain/kotlin/ch/dreipol/dreimultiplatform/reduxkotlin/navigation/Screen.kt +++ /dev/null @@ -1,4 +0,0 @@ -package ch.dreipol.dreimultiplatform.reduxkotlin.navigation - -interface Screen -interface Sheet \ No newline at end of file