Переработан процесс получения данных с сервера

Этот коммит содержится в:
Глеб Иваницкий 2024-08-27 17:28:49 +03:00
родитель 50c521c45a
Коммит d7aefcb03d
4 изменённых файлов: 52 добавлений и 18 удалений

Просмотреть файл

@ -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)
}

Просмотреть файл

@ -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<Scenario?>,
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 = {

Просмотреть файл

@ -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<Scenario>()
}
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<List<Scenario>>())
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<List<Scenario>>())
// }
}
}
Column(
@ -138,6 +146,7 @@ fun ScenariosScreen(
scenarioDialogState.value?.let {
ScenarioDialog(
scenarioDialogState = scenarioDialogState,
client = client,
)
}
}

Просмотреть файл

@ -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" }