Rework url management (#172)
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user