diff --git a/shared/src/commonMain/kotlin/com/bricks/mp/core/BricksRenderer.kt b/shared/src/commonMain/kotlin/com/bricks/mp/core/BricksRenderer.kt index 10b82cd..b91ae06 100644 --- a/shared/src/commonMain/kotlin/com/bricks/mp/core/BricksRenderer.kt +++ b/shared/src/commonMain/kotlin/com/bricks/mp/core/BricksRenderer.kt @@ -1,7 +1,19 @@ package com.bricks.mp.core import androidx.compose.foundation.* -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.weight import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.horizontalScroll @@ -38,7 +50,9 @@ fun RenderWidget( // 布局 "HBox", "FHBox" -> RenderHBox(resolvedWidget, actionDispatcher) "VBox", "FVBox" -> RenderVBox(resolvedWidget, actionDispatcher) - "Filler", "HFiller" -> Spacer(modifier = Modifier.weight(1f)) + "Filler", "HFiller" -> { + Spacer(modifier = Modifier.weight(1f)) + } "VFiller" -> Spacer(modifier = Modifier.height( WidgetOptions.getString(resolvedWidget.options, "height", "16").toFloatOrNull()?.dp ?: 16.dp )) @@ -316,7 +330,7 @@ private fun RenderFormWidget(widget: BricksWidget, actionDispatcher: ActionDispa val updatedBind = bind.copy( options = bind.options + mapOf( "formdata" to kotlinx.serialization.json.buildJsonObject { - formValues.forEach { (k, v) -> put(k, v) } + formValues.forEach { (k, v) -> put(k, kotlinx.serialization.json.JsonPrimitive(v)) } } ) ) diff --git a/shared/src/commonMain/kotlin/com/bricks/mp/sage/SageClient.kt b/shared/src/commonMain/kotlin/com/bricks/mp/sage/SageClient.kt index 8500479..7e45661 100644 --- a/shared/src/commonMain/kotlin/com/bricks/mp/sage/SageClient.kt +++ b/shared/src/commonMain/kotlin/com/bricks/mp/sage/SageClient.kt @@ -8,6 +8,7 @@ import io.ktor.client.plugins.cookies.* import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.serialization.json.* @@ -40,10 +41,10 @@ class SageClient { // 登录状态 private val _isLoggedIn = kotlinx.coroutines.flow.MutableStateFlow(false) - val isLoggedIn = _isLoggedIn.asStateFlow() + val isLoggedIn: kotlinx.coroutines.flow.StateFlow = _isLoggedIn private val _loginError = kotlinx.coroutines.flow.MutableStateFlow(null) - val loginError = _loginError.asStateFlow() + val loginError: kotlinx.coroutines.flow.StateFlow = _loginError private val mutex = Mutex() @@ -82,7 +83,7 @@ class SageClient { if (widgetType == "Message" || widgetType == "UiMessage") { // 检查是否有 session cookie - val cookies = cookieStorage.getCookies(URLBuilder(baseUrl).build()) + val cookies = cookieStorage.get(URLBuilder(baseUrl).build()) if (cookies.isNotEmpty()) { println("[Sage] Login successful, got ${cookies.size} cookies") _isLoggedIn.value = true @@ -197,7 +198,7 @@ class SageClient { suspend fun logout() = mutex.withLock { try { // 清除 cookies - cookieStorage.getCookies(URLBuilder(baseUrl).build()) + cookieStorage.get(URLBuilder(baseUrl).build()) _isLoggedIn.value = false println("[Sage] Logged out") } catch (e: Exception) { diff --git a/shared/src/jvmMain/kotlin/com/bricks/Main.kt b/shared/src/jvmMain/kotlin/com/bricks/Main.kt index ee040e8..e0cf71e 100644 --- a/shared/src/jvmMain/kotlin/com/bricks/Main.kt +++ b/shared/src/jvmMain/kotlin/com/bricks/Main.kt @@ -25,8 +25,8 @@ import com.bricks.mp.core.BricksWidget import com.bricks.mp.core.RenderWidget import com.bricks.mp.actions.ActionDispatcher import com.bricks.mp.sage.SageClient +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO import kotlinx.coroutines.launch /** @@ -274,6 +274,7 @@ fun LoginScreen( /** * 主应用界面 */ +@OptIn(androidx.compose.material3.ExperimentalMaterial3Api::class) @Composable fun MainAppScreen( rootWidget: BricksWidget,