Добавлена поддержка подключения по протоколу WebSocket
Этот коммит содержится в:
родитель
d404256023
Коммит
50c521c45a
@ -9,6 +9,7 @@ plugins {
|
|||||||
alias(libs.plugins.androidApplication)
|
alias(libs.plugins.androidApplication)
|
||||||
alias(libs.plugins.jetbrainsCompose)
|
alias(libs.plugins.jetbrainsCompose)
|
||||||
alias(libs.plugins.compose.compiler)
|
alias(libs.plugins.compose.compiler)
|
||||||
|
alias(libs.plugins.kotlinSerialization)
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
@ -55,6 +56,8 @@ kotlin {
|
|||||||
implementation(compose.components.uiToolingPreview)
|
implementation(compose.components.uiToolingPreview)
|
||||||
implementation(libs.androidx.lifecycle.viewmodel)
|
implementation(libs.androidx.lifecycle.viewmodel)
|
||||||
implementation(libs.androidx.lifecycle.runtime.compose)
|
implementation(libs.androidx.lifecycle.runtime.compose)
|
||||||
|
implementation(libs.ktor.client.core)
|
||||||
|
implementation(libs.ktor.serialization.kotlinx.json)
|
||||||
implementation(libs.navigation.compose)
|
implementation(libs.navigation.compose)
|
||||||
}
|
}
|
||||||
desktopMain.dependencies {
|
desktopMain.dependencies {
|
||||||
|
@ -12,6 +12,7 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.snapshotFlow
|
import androidx.compose.runtime.snapshotFlow
|
||||||
@ -20,10 +21,18 @@ import androidx.compose.ui.text.buildAnnotatedString
|
|||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import cit_is_bot.composeapp.generated.resources.Res
|
import cit_is_bot.composeapp.generated.resources.Res
|
||||||
import cit_is_bot.composeapp.generated.resources.baseline_add_24
|
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 org.jetbrains.compose.resources.painterResource
|
||||||
import ru.csasq.cit_is_bot.ui.components.SwitchButton
|
import ru.csasq.cit_is_bot.ui.components.SwitchButton
|
||||||
import ru.csasq.cit_is_bot.ui.dialogs.ScenarioDialog
|
import ru.csasq.cit_is_bot.ui.dialogs.ScenarioDialog
|
||||||
|
|
||||||
|
@Serializable
|
||||||
data class Scenario(
|
data class Scenario(
|
||||||
val id: Int? = null,
|
val id: Int? = null,
|
||||||
val name: String,
|
val name: String,
|
||||||
@ -32,11 +41,6 @@ data class Scenario(
|
|||||||
val isEnabled: Boolean,
|
val isEnabled: Boolean,
|
||||||
)
|
)
|
||||||
|
|
||||||
val scenarioList = listOf(
|
|
||||||
Scenario(1, "Текущее состояние сотрудников", "0 11 * * 1-5", "1 сообщение", true),
|
|
||||||
Scenario(2, "Планы на обед", "45 11 * * 1-5", "2 сообщения", false),
|
|
||||||
)
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ScenariosScreen(
|
fun ScenariosScreen(
|
||||||
navController: NavController,
|
navController: NavController,
|
||||||
@ -56,6 +60,21 @@ fun ScenariosScreen(
|
|||||||
previousValue = it
|
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(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(
|
.padding(
|
||||||
@ -93,6 +112,7 @@ fun ScenariosScreen(
|
|||||||
expanded = floatingActionButtonExpandedState.value,
|
expanded = floatingActionButtonExpandedState.value,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
scenarioList.forEach {
|
scenarioList.forEach {
|
||||||
val scenarioSwitchState = remember {
|
val scenarioSwitchState = remember {
|
||||||
mutableStateOf(it.isEnabled)
|
mutableStateOf(it.isEnabled)
|
||||||
|
@ -16,6 +16,7 @@ compose-plugin = "1.6.11"
|
|||||||
junit = "4.13.2"
|
junit = "4.13.2"
|
||||||
kotlin = "2.0.20"
|
kotlin = "2.0.20"
|
||||||
kotlinx-coroutines = "1.8.1"
|
kotlinx-coroutines = "1.8.1"
|
||||||
|
ktor = "3.0.0-wasm2"
|
||||||
navigationCompose = "2.7.7"
|
navigationCompose = "2.7.7"
|
||||||
navigationComposeVersion = "2.7.0-alpha07"
|
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" }
|
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" }
|
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" }
|
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" }
|
navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationComposeVersion" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
@ -42,4 +45,5 @@ androidApplication = { id = "com.android.application", version.ref = "agp" }
|
|||||||
androidLibrary = { id = "com.android.library", version.ref = "agp" }
|
androidLibrary = { id = "com.android.library", version.ref = "agp" }
|
||||||
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
|
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
|
||||||
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
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()
|
mavenCentral()
|
||||||
|
maven("https://maven.pkg.jetbrains.space/kotlin/p/wasm/experimental")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user