Compare commits

...

18 Commits

Author SHA1 Message Date
e20ab89688 improvements in InfinityPagedComponent 2025-06-17 15:45:05 +06:00
e557ba8184 start 0.25.8 2025-06-17 15:31:03 +06:00
8540e21d5a Merge pull request #584 from InsanusMokrassar/0.25.7
0.25.7
2025-06-10 23:38:07 +06:00
76c04a8506 update dependencies 2025-06-10 23:29:26 +06:00
128632770e start 0.25.7 2025-06-10 23:19:46 +06:00
31e0800e81 Update build.gradle 2025-06-08 20:41:05 +06:00
00ca96eec8 add nmcp 2025-06-08 18:51:53 +06:00
077ef2c639 fix of repositories order in build.gradle 2025-06-02 19:44:16 +06:00
e3ea7be0e7 one more improvement 2025-06-02 11:47:38 +06:00
05fd1c2b14 one more improvement 2025-06-02 11:45:30 +06:00
affcffe270 small improvement in uploadSonatypePublicationmain.kts 2025-06-02 11:44:09 +06:00
62930231e4 first version of uploadSonatypePublicationmain.kts 2025-06-02 11:42:45 +06:00
ad651631ec experiments time 2025-06-02 08:34:09 +06:00
cf1c8f13db add publish_all_script 2025-06-01 23:16:50 +06:00
9acc69b897 Revert "add keepa-live for uploading script parts"
This reverts commit 2ed8443e28.
2025-05-18 19:15:58 +06:00
9bc7cbdb50 add allowing of connection and keep-alive headers 2025-05-18 18:35:31 +06:00
2ed8443e28 add keepa-live for uploading script parts 2025-05-17 15:59:53 +06:00
94f598c2b4 Merge pull request #578 from InsanusMokrassar/0.25.6
0.25.6
2025-05-16 14:45:34 +06:00
11 changed files with 94 additions and 111 deletions

1
.gitignore vendored
View File

@@ -9,6 +9,7 @@ settings.xml
.gradle/
build/
out/
bin/
secret.gradle
local.properties

View File

@@ -1,5 +1,21 @@
# Changelog
## 0.25.8
* `Pagination`:
* `Compose`:
* New function `rememberInfinityPagedComponentContext` to create `InfinityPagedComponentContext`
* New variants of `InfinityPagedComponent` component
## 0.25.7
* `Versions`:
* `Compose`: `1.8.0` -> `1.8.1`
* `Xerial SQLite`: `3.49.1.0` -> `3.50.1.0`
* `Okio`: `3.11.0` -> `3.12.0`
* `Android AppCompat`: `1.7.0` -> `1.7.1`
* `Android Fragment`: `1.8.6` -> `1.8.8`
## 0.25.6
* `Versions`:

View File

@@ -19,15 +19,30 @@ buildscript {
plugins {
alias(libs.plugins.versions)
alias(libs.plugins.nmcp.aggregation)
}
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
nmcpAggregation {
centralPortal {
username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
verificationTimeout = Duration.ofHours(4)
publishingType = "USER_MANAGED"
}
publishAllProjectsProbablyBreakingProjectIsolation()
}
}
allprojects {
repositories {
mavenLocal()
mavenCentral()
google()
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
maven { url "https://nexus.inmo.dev/repository/maven-releases/" }
mavenLocal()
}
}

View File

@@ -30,3 +30,13 @@ allprojects {
}
}
}
tasks.register("getPublishableModules") {
doLast {
rootProject.subprojects.each { project ->
if (project.plugins.hasPlugin('maven-publish')) {
println(":${project.name}")
}
}
}
}

View File

@@ -15,5 +15,5 @@ crypto_js_version=4.1.1
# Project data
group=dev.inmo
version=0.25.6
android_code_version=296
version=0.25.8
android_code_version=298

View File

@@ -8,11 +8,11 @@ kotlinx-browser = "0.3"
kslog = "1.4.2"
jb-compose = "1.8.0"
jb-compose = "1.8.1"
jb-exposed = "0.61.0"
jb-dokka = "2.0.0"
sqlite = "3.49.1.0"
sqlite = "3.50.1.0"
korlibs = "5.4.0"
uuid = "0.8.4"
@@ -23,20 +23,21 @@ gh-release = "2.5.2"
koin = "4.0.4"
okio = "3.11.0"
okio = "3.12.0"
ksp = "2.1.20-1.0.31"
kotlin-poet = "1.18.1"
versions = "0.51.0"
nmcp = "0.1.5"
android-gradle = "8.9.+"
dexcount = "4.0.0"
android-coreKtx = "1.16.0"
android-recyclerView = "1.4.0"
android-appCompat = "1.7.0"
android-fragment = "1.8.6"
android-appCompat = "1.7.1"
android-fragment = "1.8.8"
android-espresso = "3.6.1"
android-test = "1.2.1"
@@ -123,3 +124,4 @@ jb-compose = { id = "org.jetbrains.compose", version.ref = "jb-compose" }
kt-jb-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kt" }
versions = { id = "com.github.ben-manes.versions", version.ref = "versions" }
nmcp-aggregation = { id = "com.gradleup.nmcp.aggregation", version.ref = "nmcp" }

View File

@@ -1,51 +1,4 @@
import java.nio.charset.StandardCharsets
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
apply plugin: 'maven-publish'
// This script work based on https://ossrh-staging-api.central.sonatype.com/swagger-ui/#/default/manual_upload_repository
// and getting available open repos and just uploading them
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
def taskName = "uploadSonatypePublication"
if (rootProject.tasks.names.contains(taskName) == false) {
rootProject.tasks.register(taskName) {
doLast {
def username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
def password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
def bearer = Base64.getEncoder().encodeToString("$username:$password".getBytes(StandardCharsets.UTF_8))
def client = HttpClient.newHttpClient()
def request = HttpRequest.newBuilder()
.uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/search/repositories?state=open"))
.GET()
.header("Content-Type", "application/json")
.header("Authorization", "Bearer $bearer")
.build()
def response = client.send(request, HttpResponse.BodyHandlers.ofString())
def keys = new ArrayList<String>()
response.body().findAll("\"key\"[\\s]*:[\\s]*\"[^\"]+\"").forEach {
def key = it.find("[^\"]+\"\$").find("[^\"]+")
keys.add(key)
}
keys.forEach {
println("Start uploading $it")
def uploadRequest = HttpRequest.newBuilder()
.uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/upload/repository/$it?publishing_type=user_managed"))
.POST(HttpRequest.BodyPublishers.ofString(""))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer $bearer")
.build()
def uploadResponse = client.send(uploadRequest, HttpResponse.BodyHandlers.ofString())
if (uploadResponse.statusCode() != 200) {
throw IllegalStateException("Faced error of uploading for repo with key $it. Response: $uploadResponse")
}
}
}
}
}
}
task javadocsJar(type: Jar) {
archiveClassifier = 'javadoc'

View File

@@ -1 +1 @@
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"},"includeCentralSonatypeUploadingScript":true}}
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"},"includeCentralSonatypeUploadingScript":false}}

View File

@@ -1,51 +1,4 @@
import java.nio.charset.StandardCharsets
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
apply plugin: 'maven-publish'
// This script work based on https://ossrh-staging-api.central.sonatype.com/swagger-ui/#/default/manual_upload_repository
// and getting available open repos and just uploading them
if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) {
def taskName = "uploadSonatypePublication"
if (rootProject.tasks.names.contains(taskName) == false) {
rootProject.tasks.register(taskName) {
doLast {
def username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER')
def password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD')
def bearer = Base64.getEncoder().encodeToString("$username:$password".getBytes(StandardCharsets.UTF_8))
def client = HttpClient.newHttpClient()
def request = HttpRequest.newBuilder()
.uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/search/repositories?state=open"))
.GET()
.header("Content-Type", "application/json")
.header("Authorization", "Bearer $bearer")
.build()
def response = client.send(request, HttpResponse.BodyHandlers.ofString())
def keys = new ArrayList<String>()
response.body().findAll("\"key\"[\\s]*:[\\s]*\"[^\"]+\"").forEach {
def key = it.find("[^\"]+\"\$").find("[^\"]+")
keys.add(key)
}
keys.forEach {
println("Start uploading $it")
def uploadRequest = HttpRequest.newBuilder()
.uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/upload/repository/$it?publishing_type=user_managed"))
.POST(HttpRequest.BodyPublishers.ofString(""))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer $bearer")
.build()
def uploadResponse = client.send(uploadRequest, HttpResponse.BodyHandlers.ofString())
if (uploadResponse.statusCode() != 200) {
throw IllegalStateException("Faced error of uploading for repo with key $it. Response: $uploadResponse")
}
}
}
}
}
}
task javadocJar(type: Jar) {

View File

@@ -1 +1 @@
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"},"includeCentralSonatypeUploadingScript":true},"type":"JVM"}
{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/MicroUtils/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"It is set of projects with micro tools for avoiding of routines coding","url":"https://github.com/InsanusMokrassar/MicroUtils/","vcsUrl":"https://github.com/InsanusMokrassar/MicroUtils.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/MicroUtils"},{"name":"InmoNexus","url":"https://nexus.inmo.dev/repository/maven-releases/"},{"name":"sonatype","url":"https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"},"includeCentralSonatypeUploadingScript":false},"type":"JVM"}

View File

@@ -65,6 +65,44 @@ class InfinityPagedComponentContext<T> internal constructor(
}
}
/**
* Creates and remembers an [InfinityPagedComponentContext] for managing infinite pagination in a Compose UI.
* This function is used to create a persistent pagination context that survives recompositions.
*
* @param size Number of items to load per page.
* @param page Initial page number to start pagination from (defaults to 0).
* @param scope [CoroutineScope] to launch pagination operations in. If not provided, a new scope will be created
* using [rememberCoroutineScope].
* @param loader Suspended function that loads paginated data. Receives the current pagination context and
* pagination parameters, and returns a [PaginationResult] containing the loaded data.
* @return An [InfinityPagedComponentContext] instance that manages the pagination state and operations.
*/
@Composable
fun <T> rememberInfinityPagedComponentContext(
size: Int,
page: Int = 0,
scope: CoroutineScope = rememberCoroutineScope(),
loader: suspend InfinityPagedComponentContext<T>.(Pagination) -> PaginationResult<T>
) = remember {
InfinityPagedComponentContext(page = page, size = size, scope = scope, loader = loader)
}
/**
* Composable function for managing an infinitely paged component.
*
* @param T The type of the paginated data.
* @param block Composable function that renders the UI with the loaded data. When data is in loading state, block will
* receive null as `it` parameter
*/
@Composable
internal fun <T> InfinityPagedComponent(
context: InfinityPagedComponentContext<T>,
block: @Composable InfinityPagedComponentContext<T>.(List<T>?) -> Unit
) {
val dataState = context.dataState.collectAsState()
context.block(dataState.value)
}
/**
* Composable function for managing an infinitely paged component.
*
@@ -84,13 +122,8 @@ internal fun <T> InfinityPagedComponent(
block: @Composable InfinityPagedComponentContext<T>.(List<T>?) -> Unit
) {
val scope = predefinedScope ?: rememberCoroutineScope()
val context = remember { InfinityPagedComponentContext<T>(page, size, scope, loader) }
remember {
context.reload()
}
val dataState = context.dataState.collectAsState()
context.block(dataState.value)
val context = rememberInfinityPagedComponentContext(page = page, size = size, scope = scope, loader = loader)
InfinityPagedComponent(context, block)
}
/**