From 376ae0ee38e8a94e47cf3fb7a04457c1356e8355 Mon Sep 17 00:00:00 2001 From: Florent Champigny Date: Thu, 23 Oct 2025 16:42:15 +0200 Subject: [PATCH] fix: [NETWORK] highlight errors on list --- .../list/model/NetworkItemViewState.kt | 17 ++++++++++ .../network/list/view/NetworkItemView.kt | 34 +++++++++++++++++-- .../com/flocon/data/remote/messages/DI.kt | 4 ++- .../com/flocon/data/remote/server/Server.kt | 3 +- .../data/remote/server/Server.desktop.kt | 4 ++- .../flocon/data/remote/server/ServerJvm.kt | 6 ++-- 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/model/NetworkItemViewState.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/model/NetworkItemViewState.kt index 1bb3040d5..15e628c41 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/model/NetworkItemViewState.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/model/NetworkItemViewState.kt @@ -1,6 +1,7 @@ package io.github.openflocon.flocondesktop.features.network.list.model import androidx.compose.runtime.Immutable +import androidx.compose.runtime.remember @Immutable data class NetworkItemViewState( @@ -84,6 +85,22 @@ fun previewNetworkItemViewState(): NetworkItemViewState = NetworkItemViewState( isFromOldAppInstance = false, ) +fun previewNetworkItemViewStateError(): NetworkItemViewState = NetworkItemViewState( + uuid = "0", + dateFormatted = "00:00:00.0000", + requestSize = "10.kb", + responseSize = "0.B", + timeFormatted = "333ms", + domain = "google.com", + method = NetworkMethodUi.Http.GET, + status = NetworkStatusUi("500", NetworkStatusUi.Status.ERROR), + type = NetworkItemViewState.NetworkTypeUi.Url( + query = "/search?q=test", + ), + isMocked = false, + isFromOldAppInstance = false, +) + fun previewGraphQlItemViewState(): NetworkItemViewState = NetworkItemViewState( uuid = "0", dateFormatted = "00:00:00.0000", diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/view/NetworkItemView.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/view/NetworkItemView.kt index 3dc0302c3..dd89e928c 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/view/NetworkItemView.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/view/NetworkItemView.kt @@ -36,14 +36,19 @@ import io.github.openflocon.flocondesktop.common.ui.ContextualView import io.github.openflocon.flocondesktop.features.network.list.model.NetworkAction import io.github.openflocon.flocondesktop.features.network.list.model.NetworkItemColumnWidths import io.github.openflocon.flocondesktop.features.network.list.model.NetworkItemViewState +import io.github.openflocon.flocondesktop.features.network.list.model.NetworkStatusUi import io.github.openflocon.flocondesktop.features.network.list.model.header.OnFilterAction import io.github.openflocon.flocondesktop.features.network.list.model.header.TextFilterAction import io.github.openflocon.flocondesktop.features.network.list.model.previewNetworkItemViewState +import io.github.openflocon.flocondesktop.features.network.list.model.previewNetworkItemViewStateError import io.github.openflocon.flocondesktop.features.network.list.view.components.MethodView import io.github.openflocon.flocondesktop.features.network.list.view.components.StatusView +import io.github.openflocon.flocondesktop.features.network.list.view.components.errorTagText +import io.github.openflocon.flocondesktop.features.network.list.view.components.exceptionTagText import io.github.openflocon.library.designsystem.FloconTheme import io.github.openflocon.library.designsystem.common.FloconContextMenuItem import io.github.openflocon.library.designsystem.common.buildMenu +import io.github.openflocon.library.designsystem.components.FloconSurface import org.jetbrains.compose.ui.tooling.preview.Preview @Composable @@ -56,6 +61,14 @@ fun NetworkItemView( ) { val bodySmall = FloconTheme.typography.bodySmall.copy(fontSize = 11.sp) + val errorColor = remember(state) { + when(state.status.status) { + NetworkStatusUi.Status.ERROR -> errorTagText + NetworkStatusUi.Status.EXCEPTION -> exceptionTagText + else -> null + } + } + ContextualView( items = contextualActions( onAction = onAction, @@ -100,7 +113,7 @@ fun NetworkItemView( Text( state.dateFormatted, style = bodySmall, - color = FloconTheme.colorPalette.onPrimary + color = errorColor ?: FloconTheme.colorPalette.onPrimary ) } @@ -120,7 +133,7 @@ fun NetworkItemView( maxLines = 2, overflow = TextOverflow.Ellipsis, style = bodySmall, - color = FloconTheme.colorPalette.onPrimary, + color = errorColor ?: FloconTheme.colorPalette.onPrimary, modifier = Modifier .weight(columnWidths.domainWeight) .padding(horizontal = 4.dp), @@ -295,7 +308,7 @@ fun NetworkItemViewState.NetworkTypeUi.imageColor(): Color = when (this) { @Composable @Preview private fun ItemViewPreview() { - MaterialTheme { + FloconTheme { NetworkItemView( modifier = Modifier.fillMaxWidth(), selected = false, @@ -304,3 +317,18 @@ private fun ItemViewPreview() { ) } } + +@Composable +@Preview +private fun ItemViewPreview_error() { + FloconTheme { + FloconSurface { + NetworkItemView( + modifier = Modifier.fillMaxWidth(), + selected = false, + state = previewNetworkItemViewStateError(), + onAction = {}, + ) + } + } +} diff --git a/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/messages/DI.kt b/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/messages/DI.kt index 1ebb9ac06..53e003a3f 100644 --- a/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/messages/DI.kt +++ b/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/messages/DI.kt @@ -9,6 +9,8 @@ import org.koin.dsl.bind import org.koin.dsl.module internal val messagesModule = module { - single { getServer() } + single { getServer( + json = get() + ) } singleOf(::MessageRemoteDataSourceImpl) bind MessageRemoteDataSource::class } diff --git a/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/server/Server.kt b/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/server/Server.kt index 5668416fb..2164a89e1 100644 --- a/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/server/Server.kt +++ b/FloconDesktop/data/remote/src/commonMain/kotlin/com/flocon/data/remote/server/Server.kt @@ -6,6 +6,7 @@ import com.flocon.data.remote.models.FloconOutgoingMessageDataModel import io.github.openflocon.domain.Constant import io.github.openflocon.domain.messages.models.FloconReceivedFileDomainModel import kotlinx.coroutines.flow.Flow +import kotlinx.serialization.json.Json import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -30,4 +31,4 @@ interface Server { @OptIn(ExperimentalUuidApi::class) fun newRequestId(): String = Uuid.random().toString() -expect fun getServer(): Server +expect fun getServer(json: Json): Server diff --git a/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/Server.desktop.kt b/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/Server.desktop.kt index ec35a34b4..e092fdd03 100644 --- a/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/Server.desktop.kt +++ b/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/Server.desktop.kt @@ -1,3 +1,5 @@ package com.flocon.data.remote.server -actual fun getServer(): Server = ServerJvm() +import kotlinx.serialization.json.Json + +actual fun getServer(json: Json): Server = ServerJvm(json) diff --git a/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/ServerJvm.kt b/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/ServerJvm.kt index 349329771..2d9307403 100644 --- a/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/ServerJvm.kt +++ b/FloconDesktop/data/remote/src/desktopMain/kotlin/com/flocon/data/remote/server/ServerJvm.kt @@ -39,7 +39,9 @@ import java.util.concurrent.atomic.AtomicBoolean import kotlin.io.path.absolutePathString import kotlin.time.Duration.Companion.seconds -class ServerJvm : Server { +class ServerJvm( + private val json: Json, +) : Server { private val _receivedMessages = Channel() override val receivedMessages = _receivedMessages.receiveAsFlow() @@ -85,7 +87,7 @@ class ServerJvm : Server { Logger.w("<---- Received raw message: $receivedText") try { val floconIncomingMessageDataModel = - Json.decodeFromString( + json.decodeFromString( receivedText, ) val device = FloconDeviceIdAndPackageNameDataModel(