Skip to content

Commit 79047d4

Browse files
author
TEYSSANDIER Raphael
committed
feature: Rework
1 parent f182777 commit 79047d4

File tree

22 files changed

+184
-150
lines changed

22 files changed

+184
-150
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.github.openflocon.flocondesktop.core.data.settings
22

33
import io.github.openflocon.flocondesktop.core.data.settings.usecase.ObserveNetworkSettingsUseCase
4+
import io.github.openflocon.flocondesktop.core.data.settings.usecase.SaveNetworkSettingsUseCase
45
import org.koin.core.module.dsl.factoryOf
56
import org.koin.dsl.module
67

78
internal val settingsModule = module {
89
factoryOf(::ObserveNetworkSettingsUseCase)
10+
factoryOf(::SaveNetworkSettingsUseCase)
911
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.github.openflocon.flocondesktop.core.data.settings.usecase
2+
3+
import io.github.openflocon.domain.models.settings.NetworkSettings
4+
import io.github.openflocon.domain.settings.repository.SettingsRepository
5+
6+
class SaveNetworkSettingsUseCase(
7+
private val settingsRepository: SettingsRepository
8+
) {
9+
operator fun invoke(
10+
settings: NetworkSettings
11+
): Result<Unit> = runCatching {
12+
settingsRepository.networkSettings = settings
13+
}
14+
15+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.github.openflocon.flocondesktop.features.analytics
22

3-
import androidx.navigation3.runtime.EntryProviderBuilder
3+
import androidx.navigation3.runtime.EntryProviderScope
44
import io.github.openflocon.navigation.FloconRoute
55

6-
fun EntryProviderBuilder<FloconRoute>.analyticsRoutes() {
6+
fun EntryProviderScope<FloconRoute>.analyticsRoutes() {
77
// TODO
88
}

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/deeplinks/view/DeeplinkItemView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import androidx.compose.material.icons.Icons
1717
import androidx.compose.material.icons.automirrored.filled.Send
1818
import androidx.compose.material.icons.filled.Delete
1919
import androidx.compose.material3.ExperimentalMaterial3Api
20+
import androidx.compose.material3.ExposedDropdownMenuAnchorType.Companion.PrimaryEditable
2021
import androidx.compose.material3.ExposedDropdownMenuBox
21-
import androidx.compose.material3.MenuAnchorType.Companion.PrimaryEditable
2222
import androidx.compose.material3.Text
2323
import androidx.compose.runtime.Composable
2424
import androidx.compose.runtime.LaunchedEffect

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/Navigation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.github.openflocon.flocondesktop.features.network
22

3-
import androidx.navigation3.runtime.EntryProviderBuilder
3+
import androidx.navigation3.runtime.EntryProviderScope
44
import io.github.openflocon.domain.settings.repository.SettingsRepository
55
import io.github.openflocon.flocondesktop.features.network.detail.view.NetworkDetailScreen
66
import io.github.openflocon.navigation.FloconRoute
@@ -15,7 +15,7 @@ internal sealed interface NetworkRoutes : FloconRoute {
1515

1616
}
1717

18-
fun EntryProviderBuilder<FloconRoute>.networkRoutes() {
18+
fun EntryProviderScope<FloconRoute>.networkRoutes() {
1919
entry<NetworkRoutes.Panel>(
2020
metadata = PanelSceneStrategy.panel(
2121
pinnable = true,

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/body/model/ContentUiState.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ data class ContentUiState(
1111
val mocksDisplayed: MockDisplayed?,
1212
val websocketMocksDisplayed: Boolean,
1313
val badNetworkQualityDisplayed: Boolean,
14+
val invertList: Boolean,
15+
val autoScroll: Boolean,
16+
val pinPanel: Boolean
1417
)
1518

1619
@Immutable
@@ -24,5 +27,7 @@ fun previewContentUiState() = ContentUiState(
2427
detailJsons = emptySet(),
2528
mocksDisplayed = null,
2629
badNetworkQualityDisplayed = false,
27-
websocketMocksDisplayed = false,
30+
invertList = false,
31+
autoScroll = false,
32+
pinPanel = false
2833
)

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/detail/view/components/DetailHeadersView.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ fun DetailHeadersView(
6464
label = item.name,
6565
value = item.value,
6666
labelWidth = labelWidth,
67+
contentColor = FloconTheme.colorPalette.onPrimary,
6768
modifier = Modifier.fillMaxWidth()
6869
)
6970
}

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/NetworkViewModel.kt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import io.github.openflocon.domain.common.DispatcherProvider
1313
import io.github.openflocon.domain.common.combines
1414
import io.github.openflocon.domain.device.usecase.ObserveCurrentDeviceIdAndPackageNameUseCase
1515
import io.github.openflocon.domain.feedback.FeedbackDisplayer
16+
import io.github.openflocon.domain.models.settings.NetworkSettings
1617
import io.github.openflocon.domain.network.models.BadQualityConfigDomainModel
1718
import io.github.openflocon.domain.network.models.MockNetworkDomainModel
1819
import io.github.openflocon.domain.network.models.NetworkFilterDomainModel
@@ -33,6 +34,7 @@ import io.github.openflocon.domain.network.usecase.badquality.ObserveAllNetworkB
3334
import io.github.openflocon.domain.network.usecase.mocks.ObserveNetworkMocksUseCase
3435
import io.github.openflocon.flocondesktop.common.utils.stateInWhileSubscribed
3536
import io.github.openflocon.flocondesktop.core.data.settings.usecase.ObserveNetworkSettingsUseCase
37+
import io.github.openflocon.flocondesktop.core.data.settings.usecase.SaveNetworkSettingsUseCase
3638
import io.github.openflocon.flocondesktop.features.network.NetworkRoutes
3739
import io.github.openflocon.domain.network.usecase.mocks.ObserveNetworkWebsocketIdsUseCase
3840
import io.github.openflocon.domain.network.usecase.settings.ObserveNetworkSettingsUseCase
@@ -93,6 +95,8 @@ class NetworkViewModel(
9395
private val updateNetworkSettingsUseCase: UpdateNetworkSettingsUseCase,
9496
private val observeNetworkWebsocketIdsUseCase: ObserveNetworkWebsocketIdsUseCase,
9597
private val openBodyDelegate: OpenBodyDelegate,
98+
private val observeNetworkSettingsUseCase: ObserveNetworkSettingsUseCase,
99+
private val saveNetworkSettingsUseCase: SaveNetworkSettingsUseCase
96100
) : ViewModel(headerDelegate) {
97101

98102
private val contentState = MutableStateFlow(
@@ -146,6 +150,9 @@ class NetworkViewModel(
146150
)
147151
)
148152

153+
private val settings = observeNetworkSettingsUseCase()
154+
.stateInWhileSubscribed(NetworkSettings(pinnedDetails = false))
155+
149156
private val filter = combines(
150157
snapshotFlow { _filterText.value }.map { it.takeIf { it.isNotBlank() } }
151158
.distinctUntilChanged(),
@@ -191,7 +198,7 @@ class NetworkViewModel(
191198
private val detailState = combine(
192199
detailDelegate.uiState,
193200
contentState,
194-
observeNetworkSettingsUseCase()
201+
settings
195202
) { state, content, settings ->
196203
state.takeIf { settings.pinnedDetails && content.selectedRequestId != null }
197204
}
@@ -205,7 +212,9 @@ class NetworkViewModel(
205212
settings.map { it.toUi() },
206213
) { content, detail, filter, header, settings ->
207214
NetworkUiState(
208-
contentState = content,
215+
contentState = content.copy(
216+
pinPanel = settings.pinnedDetails
217+
),
209218
detailState = detail,
210219
filterState = filter,
211220
headerState = header,
@@ -217,7 +226,7 @@ class NetworkViewModel(
217226
scope = viewModelScope,
218227
started = SharingStarted.WhileSubscribed(5_000),
219228
initialValue = NetworkUiState(
220-
detailState = detailDelegate.uiState.value,
229+
detailState = detailState.value,
221230
contentState = contentState.value,
222231
filterState = filterUiState.value,
223232
headerState = headerDelegate.headerUiState.value,
@@ -270,6 +279,16 @@ class NetworkViewModel(
270279
}
271280
}
272281

282+
private fun onPinned(action: NetworkAction.Pinned) {
283+
viewModelScope.launch {
284+
saveNetworkSettingsUseCase(
285+
settings.value.copy(
286+
pinnedDetails = action.value
287+
)
288+
)
289+
}
290+
}
291+
273292
private fun onClearSession() {
274293
viewModelScope.launch(dispatcherProvider.viewModel) {
275294
removeOldSessionsNetworkRequestUseCase()

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/model/NetworkAction.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ sealed interface NetworkAction {
4646

4747
data class InvertList(val value: Boolean) : NetworkAction
4848

49-
data class ToggleAutoScroll(val value: Boolean) : NetworkAction
49+
data class Pinned(val value: Boolean) : NetworkAction
50+
51+
data object ToggleAutoScroll : NetworkAction
5052

5153
data object ClearOldSession : NetworkAction
5254

FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/view/NetworkScreen.kt

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.openflocon.flocondesktop.features.network.list.view
22

3-
import androidx.compose.desktop.ui.tooling.preview.Preview
43
import androidx.compose.foundation.background
54
import androidx.compose.foundation.clickable
65
import androidx.compose.foundation.layout.Box
@@ -21,33 +20,32 @@ import androidx.compose.material.icons.outlined.CleaningServices
2120
import androidx.compose.material.icons.outlined.Delete
2221
import androidx.compose.material.icons.outlined.History
2322
import androidx.compose.material.icons.outlined.ImportExport
24-
import androidx.compose.material.icons.outlined.PinEnd
2523
import androidx.compose.material.icons.outlined.PlayCircle
2624
import androidx.compose.material.icons.outlined.Podcasts
2725
import androidx.compose.material.icons.outlined.SignalWifiStatusbarConnectedNoInternet4
2826
import androidx.compose.material.icons.outlined.WifiTethering
27+
import androidx.compose.material.icons.sharp.PushPin
2928
import androidx.compose.runtime.Composable
3029
import androidx.compose.runtime.LaunchedEffect
3130
import androidx.compose.runtime.State
3231
import androidx.compose.runtime.getValue
3332
import androidx.compose.runtime.mutableStateMapOf
3433
import androidx.compose.runtime.mutableStateOf
3534
import androidx.compose.runtime.remember
36-
import androidx.compose.ui.Alignment
3735
import androidx.compose.ui.Modifier
3836
import androidx.compose.ui.draw.clip
3937
import androidx.compose.ui.input.key.Key
4038
import androidx.compose.ui.input.key.KeyEventType
4139
import androidx.compose.ui.input.key.key
4240
import androidx.compose.ui.input.key.onPreviewKeyEvent
4341
import androidx.compose.ui.input.key.type
42+
import androidx.compose.ui.tooling.preview.Preview
4443
import androidx.compose.ui.unit.dp
4544
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4645
import androidx.paging.PagingData
4746
import androidx.paging.compose.LazyPagingItems
4847
import androidx.paging.compose.collectAsLazyPagingItems
4948
import androidx.paging.compose.itemKey
50-
import io.github.openflocon.domain.settings.repository.SettingsRepository
5149
import io.github.openflocon.flocondesktop.common.ui.window.FloconWindowState
5250
import io.github.openflocon.flocondesktop.common.ui.window.createFloconWindowState
5351
import io.github.openflocon.flocondesktop.features.network.badquality.list.view.BadNetworkQualityWindow
@@ -75,15 +73,13 @@ import io.github.openflocon.library.designsystem.components.FloconHorizontalDivi
7573
import io.github.openflocon.library.designsystem.components.FloconIcon
7674
import io.github.openflocon.library.designsystem.components.FloconIconButton
7775
import io.github.openflocon.library.designsystem.components.FloconIconToggleButton
78-
import io.github.openflocon.library.designsystem.components.FloconIconTonalButton
7976
import io.github.openflocon.library.designsystem.components.FloconOverflow
8077
import io.github.openflocon.library.designsystem.components.FloconPageTopBar
8178
import io.github.openflocon.library.designsystem.components.FloconVerticalScrollbar
8279
import io.github.openflocon.library.designsystem.components.panel.PanelWidth
8380
import io.github.openflocon.library.designsystem.components.rememberFloconScrollbarAdapter
8481
import kotlinx.coroutines.flow.MutableStateFlow
8582
import org.koin.compose.viewmodel.koinViewModel
86-
import org.koin.mp.KoinPlatform
8783

8884
@Composable
8985
fun NetworkScreen(
@@ -254,7 +250,13 @@ fun NetworkScreen(
254250
checked = uiState.contentState.invertList,
255251
text = "Invert list",
256252
leadingIcon = Icons.AutoMirrored.Outlined.List,
257-
onCheckedChange = { onAction(NetworkAction.InvertList(it)) }
253+
onCheckedChange = { checked -> onAction(NetworkAction.InvertList(checked)) }
254+
)
255+
FloconDropdownMenuItem(
256+
checked = uiState.contentState.pinPanel,
257+
text = "Pin panel",
258+
leadingIcon = Icons.Sharp.PushPin,
259+
onCheckedChange = { checked -> onAction(NetworkAction.Pinned(checked)); it() }
258260
)
259261
FloconDropdownSeparator()
260262
FloconDropdownMenuItem(
@@ -339,25 +341,6 @@ fun NetworkScreen(
339341
}
340342
}
341343

342-
// TODO Change
343-
Box(
344-
contentAlignment = Alignment.TopEnd,
345-
modifier = Modifier.fillMaxSize()
346-
) {
347-
FloconIconTonalButton(
348-
onClick = {
349-
val repository = KoinPlatform.getKoin().get<SettingsRepository>()
350-
351-
repository.networkSettings = repository.networkSettings.copy(pinnedDetails = false)
352-
},
353-
modifier = Modifier.align(Alignment.BottomStart)
354-
) {
355-
FloconIcon(
356-
Icons.Outlined.PinEnd
357-
)
358-
}
359-
}
360-
361344
val states = remember { mutableStateMapOf<NetworkBodyDetailUi, FloconWindowState>() }
362345

363346
LaunchedEffect(uiState.contentState.detailJsons) {

0 commit comments

Comments
 (0)