From d7aefcb03d7fa45c7138ac74f4529386fac327c6 Mon Sep 17 00:00:00 2001 From: csasq Date: Tue, 27 Aug 2024 17:28:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BD=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81?= =?UTF-8?q?=D1=81=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composeApp/build.gradle.kts | 1 + .../cit_is_bot/ui/dialogs/ScenarioDialog.kt | 29 ++++++++++++-- .../cit_is_bot/ui/screens/ScenariosScreen.kt | 39 ++++++++++++------- gradle/libs.versions.toml | 1 + 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index bc35e1c..7bd17d5 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -57,6 +57,7 @@ kotlin { implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.ktor.client.core) + implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.navigation.compose) } diff --git a/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/dialogs/ScenarioDialog.kt b/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/dialogs/ScenarioDialog.kt index 01638f9..bac92a9 100644 --- a/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/dialogs/ScenarioDialog.kt +++ b/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/dialogs/ScenarioDialog.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -54,6 +55,13 @@ import cit_is_bot.composeapp.generated.resources.baseline_subject_24 import cit_is_bot.composeapp.generated.resources.baseline_title_24 import cit_is_bot.composeapp.generated.resources.outline_adjust_24 import cit_is_bot.composeapp.generated.resources.outline_time_auto_24 +import io.ktor.client.HttpClient +import io.ktor.client.request.put +import io.ktor.client.request.setBody +import io.ktor.http.ContentType +import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType +import kotlinx.coroutines.launch import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.painterResource import ru.csasq.cit_is_bot.ui.components.TextCheckbox @@ -75,10 +83,12 @@ enum class MessageType( @Composable fun ScenarioDialog( scenarioDialogState: MutableState, + client: HttpClient, properties: DialogProperties = DialogProperties( usePlatformDefaultWidth = false, ), ) { + val coroutine = rememberCoroutineScope() val nameState = remember { mutableStateOf(scenarioDialogState.value?.name) } @@ -134,7 +144,16 @@ fun ScenarioDialog( actions = { Button( onClick = { - scenarioDialogState.value = null + scenarioDialogState.value?.name = nameState.value!! + coroutine.launch { + val response = client.put("https://cit.csasq.ru/api/scripts") { + contentType(ContentType.Application.Json) + setBody(scenarioDialogState.value) + } + when(response.status) { + HttpStatusCode.Created -> scenarioDialogState.value = null + } + } }, ) { Text( @@ -230,7 +249,9 @@ fun ScenarioDialog( ) { OutlinedTextField( value = nameState.value ?: "", - onValueChange = {}, + onValueChange = { value -> + nameState.value = value + }, modifier = Modifier .fillMaxWidth(), label = { @@ -258,7 +279,9 @@ fun ScenarioDialog( ) OutlinedTextField( value = timeState.value ?: "", - onValueChange = {}, + onValueChange = { value -> + timeState.value = value + }, modifier = Modifier .fillMaxWidth(), label = { diff --git a/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/screens/ScenariosScreen.kt b/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/screens/ScenariosScreen.kt index a7cfa4f..3f07b3e 100644 --- a/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/screens/ScenariosScreen.kt +++ b/composeApp/src/commonMain/kotlin/ru/csasq/cit_is_bot/ui/screens/ScenariosScreen.kt @@ -22,12 +22,13 @@ import androidx.navigation.NavController import cit_is_bot.composeapp.generated.resources.Res import cit_is_bot.composeapp.generated.resources.baseline_add_24 import io.ktor.client.HttpClient -import io.ktor.client.plugins.websocket.WebSockets -import io.ktor.client.plugins.websocket.receiveDeserialized -import io.ktor.client.plugins.websocket.webSocket -import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter +import io.ktor.client.call.body +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.request.get +import io.ktor.http.HttpStatusCode +import io.ktor.serialization.kotlinx.json.json +import kotlinx.coroutines.launch import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json import org.jetbrains.compose.resources.painterResource import ru.csasq.cit_is_bot.ui.components.SwitchButton import ru.csasq.cit_is_bot.ui.dialogs.ScenarioDialog @@ -35,10 +36,10 @@ import ru.csasq.cit_is_bot.ui.dialogs.ScenarioDialog @Serializable data class Scenario( val id: Int? = null, - val name: String, - val time: String, - val messageNumber: String, - val isEnabled: Boolean, + var name: String, + var time: String, + var messageNumber: String, + var isEnabled: Boolean, ) @Composable @@ -64,15 +65,22 @@ fun ScenariosScreen( mutableStateListOf() } val client = HttpClient { - install(WebSockets) { - contentConverter = KotlinxWebsocketSerializationConverter(Json) + install(ContentNegotiation) { + json() } +// install(WebSockets) { +// contentConverter = KotlinxWebsocketSerializationConverter(Json) +// } } LaunchedEffect(false) { - client.webSocket( - urlString = "wss://cit.csasq.ru/ws/scripts", - ) { - scenarioList.addAll(receiveDeserialized>()) + client.launch { + val response = client.get("https://cit.csasq.ru/api/scripts") + when (response.status) { + HttpStatusCode.OK -> scenarioList.addAll(response.body()) + } +// client.webSocket("wss://cit.csasq.ru/ws/scripts") { +// scenarioList.addAll(receiveDeserialized>()) +// } } } Column( @@ -138,6 +146,7 @@ fun ScenariosScreen( scenarioDialogState.value?.let { ScenarioDialog( scenarioDialogState = scenarioDialogState, + client = client, ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5cb84ed..238bbfd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -36,6 +36,7 @@ androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", nam androidx-lifecycle-runtime-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } kotlinx-coroutines-swing = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationComposeVersion" }