Rework url management (#172)

This commit is contained in:
vfsfitvnm
2022-09-28 12:43:57 +02:00
parent acc2768eb4
commit a600c8b457
16 changed files with 142 additions and 400 deletions

View File

@@ -0,0 +1,14 @@
package it.vfsfitvnm.route
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import kotlinx.coroutines.flow.MutableSharedFlow
internal val globalRouteFlow = MutableSharedFlow<Pair<Route, Array<Any?>>>(extraBufferCapacity = 1)
@Composable
fun OnGlobalRoute(block: suspend (Pair<Route, Array<Any?>>) -> Unit) {
LaunchedEffect(Unit) {
globalRouteFlow.collect(block)
}
}

View File

@@ -4,10 +4,9 @@ package it.vfsfitvnm.route
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.SaverScope
import androidx.compose.runtime.saveable.rememberSaveable
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
@Immutable
open class Route internal constructor(val tag: String) {
@@ -23,23 +22,12 @@ open class Route internal constructor(val tag: String) {
return tag.hashCode()
}
object GlobalEmitter {
var listener: ((Route, Array<Any?>) -> Unit)? = null
}
object Saver : androidx.compose.runtime.saveable.Saver<Route?, String> {
override fun restore(value: String): Route? = value.takeIf(String::isNotEmpty)?.let(::Route)
override fun SaverScope.save(value: Route?): String = value?.tag ?: ""
}
}
@Composable
fun rememberRoute(route: Route? = null): MutableState<Route?> {
return rememberSaveable(stateSaver = Route.Saver) {
mutableStateOf(route)
}
}
@Immutable
class Route0(tag: String) : Route(tag) {
context(RouteHandlerScope)
@@ -51,7 +39,7 @@ class Route0(tag: String) : Route(tag) {
}
fun global() {
GlobalEmitter.listener?.invoke(this, emptyArray())
globalRouteFlow.tryEmit(this to emptyArray())
}
}
@@ -66,7 +54,12 @@ class Route1<P0>(tag: String) : Route(tag) {
}
fun global(p0: P0) {
GlobalEmitter.listener?.invoke(this, arrayOf(p0))
globalRouteFlow.tryEmit(this to arrayOf(p0))
}
suspend fun ensureGlobal(p0: P0) {
globalRouteFlow.subscriptionCount.filter { it > 0 }.first()
globalRouteFlow.emit(this to arrayOf(p0))
}
}
@@ -81,6 +74,6 @@ class Route2<P0, P1>(tag: String) : Route(tag) {
}
fun global(p0: P0, p1: P1) {
GlobalEmitter.listener?.invoke(this, arrayOf(p0, p1))
globalRouteFlow.tryEmit(this to arrayOf(p0, p1))
}
}

View File

@@ -8,8 +8,8 @@ import androidx.compose.animation.ContentTransform
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.animation.core.updateTransition
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
@@ -24,7 +24,9 @@ fun RouteHandler(
transitionSpec: AnimatedContentScope<RouteHandlerScope>.() -> ContentTransform = { fastFade },
content: @Composable RouteHandlerScope.() -> Unit
) {
var route by rememberRoute()
var route by rememberSaveable(stateSaver = Route.Saver) {
mutableStateOf(null)
}
RouteHandler(
route = route,
@@ -63,12 +65,10 @@ fun RouteHandler(
)
}
if (listenToGlobalEmitter) {
LaunchedEffect(route) {
Route.GlobalEmitter.listener = if (route == null) ({ newRoute, newParameters ->
newParameters.forEachIndexed(parameters::set)
onRouteChanged(newRoute)
}) else null
if (listenToGlobalEmitter && route == null) {
OnGlobalRoute { (newRoute, newParameters) ->
newParameters.forEachIndexed(parameters::set)
onRouteChanged(newRoute)
}
}