Добавлена поддержка подключения по протоколу WebSocket

Этот коммит содержится в:
Глеб Иваницкий 2024-08-26 17:24:41 +03:00
родитель d404256023
Коммит 50c521c45a
5 изменённых файлов: 253 добавлений и 428 удалений

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

@ -9,6 +9,7 @@ plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsCompose)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlinSerialization)
}
kotlin {
@ -55,6 +56,8 @@ kotlin {
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.ktor.client.core)
implementation(libs.ktor.serialization.kotlinx.json)
implementation(libs.navigation.compose)
}
desktopMain.dependencies {

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

@ -12,6 +12,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.snapshotFlow
@ -20,10 +21,18 @@ import androidx.compose.ui.text.buildAnnotatedString
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 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
@Serializable
data class Scenario(
val id: Int? = null,
val name: String,
@ -32,11 +41,6 @@ data class Scenario(
val isEnabled: Boolean,
)
val scenarioList = listOf(
Scenario(1, "Текущее состояние сотрудников", "0 11 * * 1-5", "1 сообщение", true),
Scenario(2, "Планы на обед", "45 11 * * 1-5", "2 сообщения", false),
)
@Composable
fun ScenariosScreen(
navController: NavController,
@ -56,6 +60,21 @@ fun ScenariosScreen(
previousValue = it
}
}
val scenarioList = remember {
mutableStateListOf<Scenario>()
}
val client = HttpClient {
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Json)
}
}
LaunchedEffect(false) {
client.webSocket(
urlString = "wss://cit.csasq.ru/ws/scripts",
) {
scenarioList.addAll(receiveDeserialized<List<Scenario>>())
}
}
Column(
modifier = Modifier
.padding(
@ -93,6 +112,7 @@ fun ScenariosScreen(
expanded = floatingActionButtonExpandedState.value,
)
}
scenarioList.forEach {
val scenarioSwitchState = remember {
mutableStateOf(it.isEnabled)

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

@ -16,6 +16,7 @@ compose-plugin = "1.6.11"
junit = "4.13.2"
kotlin = "2.0.20"
kotlinx-coroutines = "1.8.1"
ktor = "3.0.0-wasm2"
navigationCompose = "2.7.7"
navigationComposeVersion = "2.7.0-alpha07"
@ -35,6 +36,8 @@ 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-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" }
[plugins]
@ -42,4 +45,5 @@ androidApplication = { id = "com.android.application", version.ref = "agp" }
androidLibrary = { id = "com.android.library", version.ref = "agp" }
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@ -25,6 +25,7 @@ dependencyResolutionManagement {
}
}
mavenCentral()
maven("https://maven.pkg.jetbrains.space/kotlin/p/wasm/experimental")
}
}