Skip to content

Commit

Permalink
Extracted RouterState.Entry class to Child
Browse files Browse the repository at this point in the history
  • Loading branch information
arkivanov committed Mar 20, 2021
1 parent 8d2f779 commit 895ad28
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 34 deletions.
17 changes: 17 additions & 0 deletions decompose/src/commonMain/kotlin/com/arkivanov/decompose/Child.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.arkivanov.decompose

import com.arkivanov.decompose.statekeeper.Parcelable

sealed class Child<out C : Parcelable, out T : Any> {

abstract val configuration: C

data class Created<out C : Parcelable, out T : Any>(
override val configuration: C,
val component: T
) : Child<C, T>()

data class Destroyed<out C : Parcelable>(
override val configuration: C
) : Child<C, Nothing>()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,6 @@ package com.arkivanov.decompose
import com.arkivanov.decompose.statekeeper.Parcelable

data class RouterState<out C : Parcelable, out T : Any>(
val activeChild: Entry.Created<C, T>,
val backStack: List<Entry<C, T>>
) {

sealed class Entry<out C : Parcelable, out T : Any> {
abstract val configuration: C

data class Created<out C : Parcelable, out T : Any>(
override val configuration: C,
val component: T
) : Entry<C, T>()

data class Destroyed<out C : Parcelable>(
override val configuration: C
) : Entry<C, Nothing>()
}
}
val activeChild: Child.Created<C, T>,
val backStack: List<Child<C, T>>
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.arkivanov.decompose.router

import com.arkivanov.decompose.Child
import com.arkivanov.decompose.Router
import com.arkivanov.decompose.RouterState
import com.arkivanov.decompose.backpressed.BackPressedRegistry
Expand Down Expand Up @@ -65,13 +66,13 @@ internal class RouterImpl<C : Parcelable, T : Any>(

private fun RouterStack<C, T>.toState(): RouterState<C, T> =
RouterState(
activeChild = RouterState.Entry.Created(configuration = active.configuration, component = active.component),
activeChild = Child.Created(configuration = active.configuration, component = active.component),
backStack = backStack.map { it.toRouterStateEntry() }
)

private fun RouterEntry<C, T>.toRouterStateEntry(): RouterState.Entry<C, T> =
private fun RouterEntry<C, T>.toRouterStateEntry(): Child<C, T> =
when (this) {
is RouterEntry.Created -> RouterState.Entry.Created(configuration = configuration, component = component)
is RouterEntry.Destroyed -> RouterState.Entry.Destroyed(configuration = configuration)
is RouterEntry.Created -> Child.Created(configuration = configuration, component = component)
is RouterEntry.Destroyed -> Child.Destroyed(configuration = configuration)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,19 @@ import androidx.compose.runtime.key
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.SaveableStateHolder
import androidx.compose.runtime.saveable.rememberSaveableStateHolder
import com.arkivanov.decompose.Child
import com.arkivanov.decompose.RouterState
import com.arkivanov.decompose.statekeeper.Parcelable
import com.arkivanov.decompose.value.Value

typealias ChildContent<C, T> = @Composable (child: T, configuration: C) -> Unit
typealias ChildContent<C, T> = @Composable (child: Child.Created<C, T>) -> Unit

typealias ChildAnimation<C, T> = @Composable (child: T, configuration: C, ChildContent<C, T>) -> Unit
typealias ChildAnimation<C, T> = @Composable (child: Child.Created<C, T>, ChildContent<C, T>) -> Unit

@Composable
fun <C : Parcelable, T : Any> Children(
routerState: Value<RouterState<C, T>>,
animation: ChildAnimation<C, T> = { child, configuration, childContent -> childContent(child, configuration) },
animation: ChildAnimation<C, T> = { child, childContent -> childContent(child) },
content: ChildContent<C, T>
) {
val holder = key(routerState) { rememberSaveableStateHolder() }
Expand All @@ -27,9 +28,9 @@ fun <C : Parcelable, T : Any> Children(

holder.retainStates(state.getConfigurations())

animation(activeChild.component, activeChild.configuration) { child, configuration ->
holder.SaveableStateProvider(configuration) {
content(child, configuration)
animation(activeChild) { child ->
holder.SaveableStateProvider(child.configuration) {
content(child)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion sample/counter/ios-app/ios-app/SimpleRouterState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Counter
func simpleRouterState<T : AnyObject>(_ child: T) -> Value<RouterState<AnyObject, T>> {
return mutableValue(
RouterState(
activeChild: RouterStateEntryCreated(
activeChild: ChildCreated(
configuration: "config" as AnyObject,
component: child
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ operator fun CounterInnerContainer.Model.invoke() {
Spacer(modifier = Modifier.height(16.dp))

Row {
Children(leftChild) { child, _ ->
child(onNext = ::onNextLeftChild, onPrev = ::onPrevLeftChild)
Children(leftChild) {
it.component(onNext = ::onNextLeftChild, onPrev = ::onPrevLeftChild)
}

Spacer(modifier = Modifier.width(16.dp))

Children(rightChild) { child, _ ->
child(onNext = ::onNextRightChild, onPrev = ::onPrevRightChild)
Children(rightChild) {
it.component(onNext = ::onNextRightChild, onPrev = ::onPrevRightChild)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ operator fun CounterRootContainer.Model.invoke() {

Spacer(modifier = Modifier.height(16.dp))

Children(child) { child, _ ->
child.inner()
Children(child) {
it.component.inner()
}
}
}
Expand Down

0 comments on commit 895ad28

Please sign in to comment.