Skip to content

Commit

Permalink
feat: voyager integration wasm support only
Browse files Browse the repository at this point in the history
  • Loading branch information
programadorthi committed Jun 25, 2024
1 parent 689a71d commit 36773d1
Show file tree
Hide file tree
Showing 13 changed files with 98 additions and 44 deletions.
69 changes: 43 additions & 26 deletions integration/voyager/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl

plugins {
kotlin("multiplatform")
kotlin("plugin.serialization")
Expand All @@ -24,12 +27,37 @@ kotlin {

configureJs()

@OptIn(ExperimentalWasmDsl::class)
wasmJs {
nodejs()
browser()
}

configureWasm()

macosX64()
macosArm64()
iosX64()
iosArm64()
iosSimulatorArm64()

@OptIn(ExperimentalKotlinGradlePluginApi::class)
applyHierarchyTemplate {
common {
withJvm()

group("jsAndWasmShared") {
withJs()
withWasm()
}

group("native") {
group("macos") { withMacos() }
group("ios") { withIos() }
}
}
}

sourceSets {
commonMain {
dependencies {
Expand All @@ -40,48 +68,37 @@ kotlin {
}
}

val jsMain by getting {
commonTest {
dependencies {
implementation(libs.serialization.json)
implementation(kotlin("test"))
}
}

val jvmMain by getting {
dependsOn(commonMain.get())
jvmMain {
dependencies {
api(libs.slf4j.api)
}
}
val jvmTest by getting {
dependsOn(commonTest.get())

jvmTest {
dependencies {
implementation(libs.test.junit)
implementation(libs.test.coroutines.debug)
implementation(libs.test.kotlin.test.junit)
}
}

val nativeMain by creating {
dependsOn(commonMain.get())
val jsAndWasmSharedMain by getting {
dependencies {
implementation(kotlin("stdlib"))
implementation(libs.serialization.json)
}
}
}
}

val macosMain by creating {
dependsOn(nativeMain)
}
val macosX64Main by getting {
dependsOn(macosMain)
}
val macosArm64Main by getting {
dependsOn(macosMain)
}
val iosX64Main by getting {
dependsOn(nativeMain)
}
val iosArm64Main by getting {
dependsOn(nativeMain)
}
val iosSimulatorArm64Main by getting {
dependsOn(nativeMain)
}
tasks.configureEach {
if (name == "compileJsAndWasmSharedMainKotlinMetadata") {
enabled = false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,15 @@ public suspend fun PipelineContext<Unit, ApplicationCall>.screen(
}

when (call.routeMethod) {
RouteMethod.Push -> call.platformPush(routing, body)
RouteMethod.Replace -> call.platformReplace(routing, body)
RouteMethod.ReplaceAll -> call.platformReplaceAll(routing, body)
RouteMethod.Push -> call.platformPush(routing, body) {
call.voyagerNavigator.push(body())
}
RouteMethod.Replace -> call.platformReplace(routing, body) {
call.voyagerNavigator.replace(body())
}
RouteMethod.ReplaceAll -> call.platformReplaceAll(routing, body) {
call.voyagerNavigator.replaceAll(body())
}
else ->
error(
"Voyager needs a stack route method to work. You called a screen ${call.uri} using " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,19 @@ import dev.programadorthi.routing.core.application.ApplicationCall
internal expect suspend fun ApplicationCall.platformPush(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
)

internal expect suspend fun ApplicationCall.platformReplace(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
)

internal expect suspend fun ApplicationCall.platformReplaceAll(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
)

internal expect fun ApplicationCall.shouldNeglect(): Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.programadorthi.routing.voyager

@Suppress("UNCHECKED_CAST")
public actual fun <T> String.toSerializableType(): T = this as T
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package dev.programadorthi.routing.voyager

public expect fun <T> String.toSerializableType(): T
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import cafe.adriel.voyager.core.screen.Screen
import dev.programadorthi.routing.core.Routing
import dev.programadorthi.routing.core.application
import dev.programadorthi.routing.core.application.ApplicationCall
import dev.programadorthi.routing.voyager.voyagerNavigator
import kotlinx.browser.window
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
Expand All @@ -21,8 +20,12 @@ internal actual fun ApplicationCall.shouldNeglect(): Boolean = neglect
internal actual suspend fun ApplicationCall.platformPush(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.push(body())
if (routing.historyMode == VoyagerHistoryMode.Memory) {
fallback()
return
}
window.history.pushState(
title = "routing",
url = uriToAddressBar(),
Expand All @@ -33,8 +36,12 @@ internal actual suspend fun ApplicationCall.platformPush(
internal actual suspend fun ApplicationCall.platformReplace(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replace(body())
if (routing.historyMode == VoyagerHistoryMode.Memory) {
fallback()
return
}
window.history.replaceState(
title = "routing",
url = uriToAddressBar(),
Expand All @@ -45,8 +52,12 @@ internal actual suspend fun ApplicationCall.platformReplace(
internal actual suspend fun ApplicationCall.platformReplaceAll(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replaceAll(body())
if (routing.historyMode == VoyagerHistoryMode.Memory) {
fallback()
return
}
while (true) {
window.history.replaceState(
title = "",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package dev.programadorthi.routing.voyager.history

import dev.programadorthi.routing.core.application.ApplicationCall
import dev.programadorthi.routing.voyager.toSerializableType
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

internal fun ApplicationCall.serialize(): String {
internal fun <T> ApplicationCall.serialize(): T {
val state = toHistoryState()
return Json.encodeToString(state)
val encoded = Json.encodeToString(state)
return encoded.toSerializableType()
}

internal fun Any?.deserialize(): VoyagerHistoryState? =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,31 @@ import androidx.compose.runtime.Composable
import cafe.adriel.voyager.core.screen.Screen
import dev.programadorthi.routing.core.Routing
import dev.programadorthi.routing.core.application.ApplicationCall
import dev.programadorthi.routing.voyager.voyagerNavigator

internal actual fun ApplicationCall.shouldNeglect(): Boolean = false

internal actual suspend fun ApplicationCall.platformPush(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.push(body())
fallback()
}

internal actual suspend fun ApplicationCall.platformReplace(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replace(body())
fallback()
}

internal actual suspend fun ApplicationCall.platformReplaceAll(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replaceAll(body())
fallback()
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,31 @@ import androidx.compose.runtime.Composable
import cafe.adriel.voyager.core.screen.Screen
import dev.programadorthi.routing.core.Routing
import dev.programadorthi.routing.core.application.ApplicationCall
import dev.programadorthi.routing.voyager.voyagerNavigator

internal actual fun ApplicationCall.shouldNeglect(): Boolean = false

internal actual suspend fun ApplicationCall.platformPush(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.push(body())
fallback()
}

internal actual suspend fun ApplicationCall.platformReplace(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replace(body())
fallback()
}

internal actual suspend fun ApplicationCall.platformReplaceAll(
routing: Routing,
body: suspend () -> Screen,
fallback: suspend () -> Unit,
) {
voyagerNavigator.replaceAll(body())
fallback()
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.programadorthi.routing.voyager

@Suppress("UNCHECKED_CAST")
public actual fun <T> String.toSerializableType(): T = this as T
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ include(":integration:compose")
include(":integration:compose-animation")
include(":integration:javascript")
include(":integration:uikit")
//include(":integration:voyager")
include(":integration:voyager")

// Samples are disabled by default to avoid sync their.
//include(":samples:android-activity")
Expand Down

0 comments on commit 36773d1

Please sign in to comment.