From c822da9e2285cdfd77d6a45c06aff4682d7f7ae1 Mon Sep 17 00:00:00 2001 From: Cedrick Cooke Date: Tue, 20 Jan 2026 15:32:40 -0800 Subject: [PATCH 1/2] Wasm support --- app/build.gradle.kts | 10 ++++++++++ .../jsMain/kotlin/{Main.kt => StartComposeApp.js.kt} | 8 +++----- app/src/wasmJsMain/kotlin/StartComposeApp.wasm.kt | 10 ++++++++++ app/src/wasmJsMain/resources/index.html | 11 +++++++++++ app/src/webMain/kotlin/Main.kt | 11 +++++++++++ .../kotlin/features/scan/DeviceLocator.kt | 0 .../kotlin/features/scan/OnLifecycleResumed.kt | 0 .../kotlin/features/scan/RequestDeviceLocator.kt | 0 bluetooth/build.gradle.kts | 1 + .../src/{jsMain => webMain}/kotlin/SystemControl.kt | 0 .../requirements/BluetoothScanRequirementsFactory.kt | 0 gradle/libs.versions.toml | 4 ++-- moko-permissions-bluetooth/build.gradle.kts | 2 ++ moko-permissions-compose/build.gradle.kts | 2 ++ moko-permissions/build.gradle.kts | 2 ++ 15 files changed, 54 insertions(+), 7 deletions(-) rename app/src/jsMain/kotlin/{Main.kt => StartComposeApp.js.kt} (56%) create mode 100644 app/src/wasmJsMain/kotlin/StartComposeApp.wasm.kt create mode 100644 app/src/wasmJsMain/resources/index.html create mode 100644 app/src/webMain/kotlin/Main.kt rename app/src/{jsMain => webMain}/kotlin/features/scan/DeviceLocator.kt (100%) rename app/src/{jsMain => webMain}/kotlin/features/scan/OnLifecycleResumed.kt (100%) rename app/src/{jsMain => webMain}/kotlin/features/scan/RequestDeviceLocator.kt (100%) rename bluetooth/src/{jsMain => webMain}/kotlin/SystemControl.kt (100%) rename bluetooth/src/{jsMain => webMain}/kotlin/requirements/BluetoothScanRequirementsFactory.kt (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1102b6e4..0869ba14 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,6 +28,15 @@ kotlin { } binaries.executable() } + wasmJs { + outputModuleName = "sample" + browser { + commonWebpackConfig { + outputFileName = "sample.js" + } + } + binaries.executable() + } jvm() @@ -56,6 +65,7 @@ kotlin { iosMain.get().dependsOn(composeMain) jsMain.get().dependsOn(composeMain) jvmMain.get().dependsOn(composeMain) + wasmJsMain.get().dependsOn(composeMain) val notJsMain by creating { dependsOn(commonMain.get()) diff --git a/app/src/jsMain/kotlin/Main.kt b/app/src/jsMain/kotlin/StartComposeApp.js.kt similarity index 56% rename from app/src/jsMain/kotlin/Main.kt rename to app/src/jsMain/kotlin/StartComposeApp.js.kt index c286ce0a..59693f8e 100644 --- a/app/src/jsMain/kotlin/Main.kt +++ b/app/src/jsMain/kotlin/StartComposeApp.js.kt @@ -1,14 +1,12 @@ import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.CanvasBasedWindow +import androidx.compose.ui.window.ComposeViewport import com.juul.sensortag.App -import com.juul.sensortag.configureLogging import org.jetbrains.skiko.wasm.onWasmReady @OptIn(ExperimentalComposeUiApi::class) -fun main() { - configureLogging() +actual fun startComposeApp() { onWasmReady { - CanvasBasedWindow("SensorTag") { + ComposeViewport("ComposeTarget") { App() } } diff --git a/app/src/wasmJsMain/kotlin/StartComposeApp.wasm.kt b/app/src/wasmJsMain/kotlin/StartComposeApp.wasm.kt new file mode 100644 index 00000000..b83ceb59 --- /dev/null +++ b/app/src/wasmJsMain/kotlin/StartComposeApp.wasm.kt @@ -0,0 +1,10 @@ +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.window.ComposeViewport +import com.juul.sensortag.App + +@OptIn(ExperimentalComposeUiApi::class) +actual fun startComposeApp() { + ComposeViewport { + App() + } +} diff --git a/app/src/wasmJsMain/resources/index.html b/app/src/wasmJsMain/resources/index.html new file mode 100644 index 00000000..0cd90abb --- /dev/null +++ b/app/src/wasmJsMain/resources/index.html @@ -0,0 +1,11 @@ + + + + + + SensorTag + + + + + diff --git a/app/src/webMain/kotlin/Main.kt b/app/src/webMain/kotlin/Main.kt new file mode 100644 index 00000000..542c4f00 --- /dev/null +++ b/app/src/webMain/kotlin/Main.kt @@ -0,0 +1,11 @@ +import androidx.compose.ui.ExperimentalComposeUiApi +import com.juul.sensortag.App +import com.juul.sensortag.configureLogging + +@OptIn(ExperimentalComposeUiApi::class) +fun main() { + configureLogging() + startComposeApp() +} + +expect fun startComposeApp() diff --git a/app/src/jsMain/kotlin/features/scan/DeviceLocator.kt b/app/src/webMain/kotlin/features/scan/DeviceLocator.kt similarity index 100% rename from app/src/jsMain/kotlin/features/scan/DeviceLocator.kt rename to app/src/webMain/kotlin/features/scan/DeviceLocator.kt diff --git a/app/src/jsMain/kotlin/features/scan/OnLifecycleResumed.kt b/app/src/webMain/kotlin/features/scan/OnLifecycleResumed.kt similarity index 100% rename from app/src/jsMain/kotlin/features/scan/OnLifecycleResumed.kt rename to app/src/webMain/kotlin/features/scan/OnLifecycleResumed.kt diff --git a/app/src/jsMain/kotlin/features/scan/RequestDeviceLocator.kt b/app/src/webMain/kotlin/features/scan/RequestDeviceLocator.kt similarity index 100% rename from app/src/jsMain/kotlin/features/scan/RequestDeviceLocator.kt rename to app/src/webMain/kotlin/features/scan/RequestDeviceLocator.kt diff --git a/bluetooth/build.gradle.kts b/bluetooth/build.gradle.kts index a08814d0..9ed19d0f 100644 --- a/bluetooth/build.gradle.kts +++ b/bluetooth/build.gradle.kts @@ -15,6 +15,7 @@ kotlin { jvm() macosX64() macosArm64() + wasmJs().browser() sourceSets { commonMain.dependencies { diff --git a/bluetooth/src/jsMain/kotlin/SystemControl.kt b/bluetooth/src/webMain/kotlin/SystemControl.kt similarity index 100% rename from bluetooth/src/jsMain/kotlin/SystemControl.kt rename to bluetooth/src/webMain/kotlin/SystemControl.kt diff --git a/bluetooth/src/jsMain/kotlin/requirements/BluetoothScanRequirementsFactory.kt b/bluetooth/src/webMain/kotlin/requirements/BluetoothScanRequirementsFactory.kt similarity index 100% rename from bluetooth/src/jsMain/kotlin/requirements/BluetoothScanRequirementsFactory.kt rename to bluetooth/src/webMain/kotlin/requirements/BluetoothScanRequirementsFactory.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41d03b85..ea588b13 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,12 +3,12 @@ agp = "8.13.0" android-compile = "35" android-min = "21" android-target = "33" -compose = "1.8.2" +compose = "1.10.0" jvm = "17" kable = "0.39.2" kotlin = "2.2.21" kotlinx-coroutines = "1.10.2" -krayon = "0.21.0" +krayon = "0.23.0" voyager = "1.1.0-beta03" [libraries] diff --git a/moko-permissions-bluetooth/build.gradle.kts b/moko-permissions-bluetooth/build.gradle.kts index f6d94b33..0f8461d5 100644 --- a/moko-permissions-bluetooth/build.gradle.kts +++ b/moko-permissions-bluetooth/build.gradle.kts @@ -18,6 +18,7 @@ kotlin { jvm() macosX64() macosArm64() + wasmJs().browser() applyDefaultHierarchyTemplate() @@ -28,6 +29,7 @@ kotlin { macosMain.get().dependsOn(nopMain) jsMain.get().dependsOn(nopMain) jvmMain.get().dependsOn(nopMain) + wasmJsMain.get().dependsOn(nopMain) commonMain.dependencies { api(projects.mokoPermissions) diff --git a/moko-permissions-compose/build.gradle.kts b/moko-permissions-compose/build.gradle.kts index f53cb2c6..ec3d10bb 100644 --- a/moko-permissions-compose/build.gradle.kts +++ b/moko-permissions-compose/build.gradle.kts @@ -20,6 +20,7 @@ kotlin { jvm() macosX64() macosArm64() + wasmJs().browser() applyDefaultHierarchyTemplate() @@ -30,6 +31,7 @@ kotlin { macosMain.get().dependsOn(nopMain) jsMain.get().dependsOn(nopMain) jvmMain.get().dependsOn(nopMain) + wasmJsMain.get().dependsOn(nopMain) commonMain.dependencies { api(projects.mokoPermissions) diff --git a/moko-permissions/build.gradle.kts b/moko-permissions/build.gradle.kts index b97c4d90..26fcd5ad 100644 --- a/moko-permissions/build.gradle.kts +++ b/moko-permissions/build.gradle.kts @@ -14,6 +14,7 @@ kotlin { jvm() macosX64() macosArm64() + wasmJs().browser() applyDefaultHierarchyTemplate() @@ -24,6 +25,7 @@ kotlin { macosMain.get().dependsOn(nopMain) jsMain.get().dependsOn(nopMain) jvmMain.get().dependsOn(nopMain) + wasmJsMain.get().dependsOn(nopMain) commonMain.dependencies { implementation(libs.coroutines) From d6b1efe4096aa583cfb9b392a321a01c4049ac4a Mon Sep 17 00:00:00 2001 From: Cedrick Cooke Date: Thu, 29 Jan 2026 09:33:47 -0800 Subject: [PATCH 2/2] Update kable version in libs.versions.toml Updated kable version from 0.39.2 to 0.42.0. --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ea588b13..b49cb306 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ android-min = "21" android-target = "33" compose = "1.10.0" jvm = "17" -kable = "0.39.2" +kable = "0.42.0" kotlin = "2.2.21" kotlinx-coroutines = "1.10.2" krayon = "0.23.0"