From 2e309c31a6e6dac9019d7e34ad94865cc6871ec6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 20 Sep 2024 12:18:17 +0600 Subject: [PATCH 1/3] start 0.22.3 --- CHANGELOG.md | 2 ++ gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9bcf093b2e..8115c704967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.22.3 + ## 0.22.2 * `Versions`: diff --git a/gradle.properties b/gradle.properties index aaeeecdd162..f9ed3818032 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.22.2 -android_code_version=268 +version=0.22.3 +android_code_version=269 From e83e0a8535bbc49ef0d75cec0ca54f07ade4ba9e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 20 Sep 2024 12:44:10 +0600 Subject: [PATCH 2/3] update dependencies --- CHANGELOG.md | 9 +++++++++ android/smalltextfield/build.gradle | 2 +- gradle/libs.versions.toml | 18 +++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8115c704967..60d9bbdf2bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## 0.22.3 +* `Versions`: + * `Serialization`: `1.7.2` -> `1.7.3` + * `Coroutines`: `1.8.1` -> `1.9.0` + * `Compose`: `1.7.0-alpha03` -> `1.7.0-beta02` + * `Koin`: `3.5.6` -> `4.0.0` + * `Okio`: `3.9.0` -> `3.9.1` + * `AndroidFragment`: `1.8.2` -> `1.8.3` + * `androidx.compose.material3:material3` has been replaced with `org.jetbrains.compose.material3:material3` + ## 0.22.2 * `Versions`: diff --git a/android/smalltextfield/build.gradle b/android/smalltextfield/build.gradle index f8c258714b7..8e23828c7b4 100644 --- a/android/smalltextfield/build.gradle +++ b/android/smalltextfield/build.gradle @@ -12,7 +12,7 @@ kotlin { sourceSets { androidMain { dependencies { - api libs.android.compose.material3 + api libs.jb.compose.material3 } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dfa6242f1b9..08a54c4435b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] kt = "2.0.20" -kt-serialization = "1.7.2" -kt-coroutines = "1.8.1" +kt-serialization = "1.7.3" +kt-coroutines = "1.9.0" kslog = "1.3.6" -jb-compose = "1.7.0-alpha03" +jb-compose = "1.7.0-beta02" jb-exposed = "0.54.0" jb-dokka = "1.9.20" @@ -19,11 +19,11 @@ ktor = "2.3.12" gh-release = "2.5.2" -koin = "3.5.6" +koin = "4.0.0" -okio = "3.9.0" +okio = "3.9.1" -ksp = "2.0.20-1.0.24" +ksp = "2.0.20-1.0.25" kotlin-poet = "1.18.1" versions = "0.51.0" @@ -34,10 +34,10 @@ dexcount = "4.0.0" android-coreKtx = "1.13.1" android-recyclerView = "1.3.2" android-appCompat = "1.7.0" -android-fragment = "1.8.2" +android-fragment = "1.8.3" android-espresso = "3.6.1" android-test = "1.2.1" -android-compose-material3 = "1.2.1" +android-compose-material3 = "1.3.0" android-props-minSdk = "21" android-props-compileSdk = "35" @@ -85,11 +85,11 @@ jb-exposed = { module = "org.jetbrains.exposed:exposed-core", version.ref = "jb- jb-exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "jb-exposed" } sqlite = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } +jb-compose-material3 = { module = "org.jetbrains.compose.material3:material3", version.ref = "jb-compose" } android-coreKtx = { module = "androidx.core:core-ktx", version.ref = "android-coreKtx" } android-recyclerView = { module = "androidx.recyclerview:recyclerview", version.ref = "android-recyclerView" } android-appCompat-resources = { module = "androidx.appcompat:appcompat-resources", version.ref = "android-appCompat" } -android-compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "android-compose-material3" } android-fragment = { module = "androidx.fragment:fragment", version.ref = "android-fragment" } android-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "android-espresso" } android-test-junit = { module = "androidx.test.ext:junit", version.ref = "android-test" } From 837cac644df9eb6d62b1455d1bab881d6fa78478 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 20 Sep 2024 13:14:50 +0600 Subject: [PATCH 3/3] add extensions in JS --- CHANGELOG.md | 6 ++++ .../compose/AttrBuilderContextExtensions.kt | 19 ++++++++++++ .../micro_utils/common/compose/MultiRef.kt | 22 ++++++++++++++ .../common/compose/TagAttributesExtensions.kt | 11 +++++++ .../micro_utils/common/CopyToClipboard.kt | 13 +++++++++ .../common/CopyToClipboardImage.kt | 29 +++++++++++++++++++ 6 files changed, 100 insertions(+) create mode 100644 common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/AttrBuilderContextExtensions.kt create mode 100644 common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/MultiRef.kt create mode 100644 common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/TagAttributesExtensions.kt create mode 100644 common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboard.kt create mode 100644 common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboardImage.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 60d9bbdf2bf..a936846b0cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ * `Okio`: `3.9.0` -> `3.9.1` * `AndroidFragment`: `1.8.2` -> `1.8.3` * `androidx.compose.material3:material3` has been replaced with `org.jetbrains.compose.material3:material3` +* `Common`: + * `JS`: + * Add several useful extensions + * `Compose`: + * `JS`: + * Add several useful extensions ## 0.22.2 diff --git a/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/AttrBuilderContextExtensions.kt b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/AttrBuilderContextExtensions.kt new file mode 100644 index 00000000000..1de48bdd48f --- /dev/null +++ b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/AttrBuilderContextExtensions.kt @@ -0,0 +1,19 @@ +package dev.inmo.micro_utils.common.compose + +import org.jetbrains.compose.web.dom.AttrBuilderContext +import org.w3c.dom.Element + +operator fun AttrBuilderContext?.plus( + other: AttrBuilderContext? +) = when (this) { + null -> other ?: {} + else -> when (other) { + null -> this ?: {} + else -> { + { + invoke(this) + other(this) + } + } + } +} diff --git a/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/MultiRef.kt b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/MultiRef.kt new file mode 100644 index 00000000000..b75ea519673 --- /dev/null +++ b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/MultiRef.kt @@ -0,0 +1,22 @@ +package dev.inmo.micro_utils.common.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.DisposableEffectResult +import androidx.compose.runtime.DisposableEffectScope +import org.jetbrains.compose.web.attributes.AttrsScope +import org.jetbrains.compose.web.dom.ElementScope +import org.w3c.dom.Element + +/** + * This function must be called in the context of your tag content. It works like default [AttrsScope.ref], + * but able to be used several times. Uses [DisposableEffect] under the hood + */ +@Composable +fun ElementScope.ref( + block: DisposableEffectScope.(T) -> DisposableEffectResult +) { + DisposableEffect(0) { + block(scopeElement) + } +} diff --git a/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/TagAttributesExtensions.kt b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/TagAttributesExtensions.kt new file mode 100644 index 00000000000..3ab7f798f7d --- /dev/null +++ b/common/compose/src/jsMain/kotlin/dev/inmo/micro_utils/common/compose/TagAttributesExtensions.kt @@ -0,0 +1,11 @@ +package dev.inmo.micro_utils.common.compose + +import org.jetbrains.compose.web.dom.AttrBuilderContext + +fun tagClasses(vararg classnames: String): AttrBuilderContext<*> = { + classes(*classnames) +} + +fun tagId(id: String): AttrBuilderContext<*> = { + id(id) +} diff --git a/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboard.kt b/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboard.kt new file mode 100644 index 00000000000..3f1d30ed0f6 --- /dev/null +++ b/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboard.kt @@ -0,0 +1,13 @@ +package dev.inmo.micro_utils.common + +import kotlinx.browser.window + +fun copyToClipboard(text: String): Boolean { + return runCatching { + window.navigator.clipboard.writeText( + text + ) + }.onFailure { + it.printStackTrace() + }.isSuccess +} diff --git a/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboardImage.kt b/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboardImage.kt new file mode 100644 index 00000000000..6edc74d37d4 --- /dev/null +++ b/common/src/jsMain/kotlin/dev/inmo/micro_utils/common/CopyToClipboardImage.kt @@ -0,0 +1,29 @@ +package dev.inmo.micro_utils.common + +import kotlinx.browser.window +import org.w3c.files.Blob +import org.w3c.files.BlobPropertyBag +import kotlin.js.json + +external class ClipboardItem(data: dynamic) + +inline fun Blob.convertToClipboardItem(): ClipboardItem { + val itemData: dynamic = json(this.type to this) + return ClipboardItem(itemData) +} + +suspend fun copyImageURLToClipboard(imageUrl: String): Boolean { + return runCatching { + val response = window.fetch(imageUrl).await() + val blob = response.blob().await() + val data = arrayOf( + Blob( + arrayOf(blob), + BlobPropertyBag("image/png") + ).convertToClipboardItem() + ).asDynamic() + window.navigator.clipboard.write(data) + }.onFailure { + it.printStackTrace() + }.isSuccess +}