diff --git a/CHANGELOG.md b/CHANGELOG.md index b9bcf093b2e..a936846b0cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 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` +* `Common`: + * `JS`: + * Add several useful extensions + * `Compose`: + * `JS`: + * Add several useful extensions + ## 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/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 +} 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 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" }