-
Notifications
You must be signed in to change notification settings - Fork 337
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// Project generated by Kotlin Multiplatform Wizard | ||
{ | ||
"spec": { | ||
"template_id": "kmt", | ||
"targets": { | ||
"web": { | ||
"ui": [ | ||
"compose" | ||
] | ||
} | ||
} | ||
}, | ||
"timestamp": "2024-03-22T09:05:07.407317266Z" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
*.iml | ||
.gradle | ||
**/build/ | ||
xcuserdata | ||
!src/**/build/ | ||
local.properties | ||
.idea | ||
.DS_Store | ||
captures | ||
.externalNativeBuild | ||
.cxx | ||
*.xcodeproj/* | ||
!*.xcodeproj/project.pbxproj | ||
!*.xcodeproj/xcshareddata/ | ||
!*.xcodeproj/project.xcworkspace/ | ||
!*.xcworkspace/contents.xcworkspacedata | ||
**/xcshareddata/WorkspaceSettings.xcsettings |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# Ktor-client-wasm | ||
|
||
A compose wasm-js application using Ktor HttpClient to make requests. | ||
|
||
## Running | ||
|
||
Execute this command to run the sample: | ||
|
||
```bash | ||
./gradlew clean wasmJsBrowserRun | ||
``` | ||
|
||
Then, navigate to [http://localhost:8080/](http://localhost:8080/) to see the sample home page. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
plugins { | ||
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/build.gradle.kts is not ending with a new line.
|
||
// this is necessary to avoid the plugins to be loaded multiple times | ||
// in each subproject's classloader | ||
alias(libs.plugins.jetbrainsCompose) apply false | ||
alias(libs.plugins.kotlinMultiplatform) apply false | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import org.jetbrains.compose.desktop.application.dsl.TargetFormat | ||
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/composeApp/build.gradle.kts is not ending with a new line.
|
||
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl | ||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig | ||
|
||
plugins { | ||
alias(libs.plugins.kotlinMultiplatform) | ||
|
||
alias(libs.plugins.jetbrainsCompose) | ||
} | ||
|
||
repositories { | ||
maven("https://maven.pkg.jetbrains.space/public/p/ktor/eap") | ||
mavenCentral() | ||
google() | ||
} | ||
|
||
kotlin { | ||
@OptIn(ExperimentalWasmDsl::class) | ||
wasmJs { | ||
moduleName = "composeApp" | ||
browser { | ||
commonWebpackConfig { | ||
outputFileName = "composeApp.js" | ||
devServer = (devServer ?: KotlinWebpackConfig.DevServer()).apply { | ||
static = (static ?: mutableListOf()).apply { | ||
// Serve sources to debug inside browser | ||
add(project.projectDir.path) | ||
} | ||
} | ||
} | ||
} | ||
binaries.executable() | ||
} | ||
|
||
sourceSets { | ||
commonMain.dependencies { | ||
implementation(compose.runtime) | ||
implementation(compose.foundation) | ||
implementation(compose.material) | ||
implementation(compose.ui) | ||
implementation(compose.components.resources) | ||
implementation(compose.components.uiToolingPreview) | ||
|
||
implementation(libs.ktorClientCore) | ||
} | ||
} | ||
} | ||
|
||
|
||
|
||
compose.experimental { | ||
web.application {} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:width="600dp" | ||
android:height="600dp" | ||
android:viewportWidth="600" | ||
android:viewportHeight="600"> | ||
<path | ||
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z" | ||
android:fillColor="#041619" | ||
android:fillType="nonZero"/> | ||
<path | ||
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z" | ||
android:fillColor="#37BF6E" | ||
android:fillType="nonZero"/> | ||
<path | ||
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z" | ||
android:fillColor="#3870B2" | ||
android:fillType="nonZero"/> | ||
<path | ||
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z" | ||
android:strokeWidth="10" | ||
android:fillColor="#00000000" | ||
android:strokeColor="#083042" | ||
android:fillType="nonZero"/> | ||
<path | ||
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z" | ||
android:strokeWidth="10" | ||
android:fillColor="#00000000" | ||
android:strokeColor="#083042" | ||
android:fillType="nonZero"/> | ||
<path | ||
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z" | ||
android:strokeWidth="10" | ||
android:fillColor="#00000000" | ||
android:strokeColor="#083042" | ||
android:fillType="nonZero"/> | ||
</vector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import androidx.compose.animation.AnimatedVisibility | ||
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/composeApp/src/wasmJsMain/kotlin/App.kt is not ending with a new line.
|
||
import androidx.compose.foundation.Image | ||
import androidx.compose.foundation.layout.Column | ||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.material.Button | ||
import androidx.compose.material.MaterialTheme | ||
import androidx.compose.material.Text | ||
import androidx.compose.runtime.* | ||
Check warning Code scanning / detekt Wildcard imports should be replaced with imports using fully qualified class names. Wildcard imports can lead to naming conflicts. A library update can introduce naming clashes with your classes which results in compilation errors. Warning
androidx.compose.runtime.* is a wildcard import. Replace it with fully qualified imports.
|
||
import androidx.compose.ui.Alignment | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.graphics.asComposeImageBitmap | ||
import androidx.compose.ui.graphics.painter.BitmapPainter | ||
import io.ktor.client.* | ||
Check warning Code scanning / detekt Wildcard imports should be replaced with imports using fully qualified class names. Wildcard imports can lead to naming conflicts. A library update can introduce naming clashes with your classes which results in compilation errors. Warning
io.ktor.client.* is a wildcard import. Replace it with fully qualified imports.
|
||
import io.ktor.client.call.* | ||
Check warning Code scanning / detekt Wildcard imports should be replaced with imports using fully qualified class names. Wildcard imports can lead to naming conflicts. A library update can introduce naming clashes with your classes which results in compilation errors. Warning
io.ktor.client.call.* is a wildcard import. Replace it with fully qualified imports.
|
||
import io.ktor.client.request.* | ||
Check warning Code scanning / detekt Wildcard imports should be replaced with imports using fully qualified class names. Wildcard imports can lead to naming conflicts. A library update can introduce naming clashes with your classes which results in compilation errors. Warning
io.ktor.client.request.* is a wildcard import. Replace it with fully qualified imports.
|
||
import org.jetbrains.skia.Bitmap | ||
|
||
val client = HttpClient() | ||
|
||
@Composable | ||
fun UrlImage(url: String) { | ||
var painter by remember { mutableStateOf<BitmapPainter?>(null) } | ||
|
||
LaunchedEffect(Unit) { | ||
val response: ByteArray = client.get(url) | ||
.body() | ||
|
||
val image = org.jetbrains.skia.Image.makeFromEncoded(response) | ||
val bitmap = Bitmap.Companion | ||
.makeFromImage(image) | ||
.asComposeImageBitmap() | ||
painter = BitmapPainter(bitmap) | ||
} | ||
|
||
val imagePainter = painter ?: return | ||
Image( | ||
painter = imagePainter, | ||
contentDescription = url | ||
) | ||
} | ||
|
||
@Composable | ||
fun App() { | ||
MaterialTheme { | ||
var showContent by remember { mutableStateOf(false) } | ||
Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { | ||
Button(onClick = { showContent = !showContent }) { | ||
Text("Click me!") | ||
} | ||
AnimatedVisibility(showContent) { | ||
UrlImage("/kodee.png") | ||
} | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
class Greeting { | ||
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/composeApp/src/wasmJsMain/kotlin/Greeting.kt is not ending with a new line.
|
||
private val platform = getPlatform() | ||
|
||
fun greet(): String { | ||
return "Hello, ${platform.name}!" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
class WasmPlatform { | ||
Check warning Code scanning / detekt If a source file contains only a single non-private top-level class or object, the file name should reflect the case-sensitive name plus the .kt extension. Warning
The file name 'Platform' does not match the name of the single top-level declaration 'WasmPlatform'.
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/composeApp/src/wasmJsMain/kotlin/Platform.kt is not ending with a new line.
|
||
val name: String = "Web with Kotlin/Wasm" | ||
} | ||
|
||
fun getPlatform() = WasmPlatform() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import androidx.compose.ui.ExperimentalComposeUiApi | ||
Check warning Code scanning / detekt Checks whether files end with a line separator. Warning
The file /home/runner/work/ktor-samples/ktor-samples/ktor-client-wasm/composeApp/src/wasmJsMain/kotlin/main.kt is not ending with a new line.
|
||
import androidx.compose.ui.window.CanvasBasedWindow | ||
|
||
@OptIn(ExperimentalComposeUiApi::class) | ||
fun main() { | ||
CanvasBasedWindow(canvasElementId = "ComposeTarget") { App() } | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"> | ||
<title>Compose App</title> | ||
<script> | ||
window.process = { | ||
env: { | ||
"KTOR_LOG_LEVEL": "DEBUG", | ||
}, | ||
release: { | ||
name: "browser" | ||
} | ||
} | ||
</script> | ||
|
||
<script type="application/javascript" src="skiko.js"></script> | ||
<script type="application/javascript" src="composeApp.js"></script> | ||
</head> | ||
<body> | ||
|
||
<canvas id="ComposeTarget"></canvas> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
kotlin.code.style=official | ||
|
||
#Gradle | ||
org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M" | ||
|
||
|
||
#Compose | ||
org.jetbrains.compose.experimental.wasm.enabled=true | ||
|
||
#Development | ||
development=true |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
[versions] | ||
compose = "1.6.2" | ||
compose-plugin = "1.6.0" | ||
junit = "4.13.2" | ||
kotlin = "1.9.22" | ||
ktor = "3.0.0-beta-2-eap-920" | ||
|
||
[libraries] | ||
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } | ||
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } | ||
junit = { group = "junit", name = "junit", version.ref = "junit" } | ||
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } | ||
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" } | ||
ktorClientCore = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } | ||
|
||
[plugins] | ||
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } | ||
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
distributionBase=GRADLE_USER_HOME | ||
distributionPath=wrapper/dists | ||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip | ||
networkTimeout=10000 | ||
validateDistributionUrl=true | ||
zipStoreBase=GRADLE_USER_HOME | ||
zipStorePath=wrapper/dists |