Skip to content

Commit fbb4bbf

Browse files
wip
1 parent 43b82a3 commit fbb4bbf

File tree

6 files changed

+135
-11
lines changed

6 files changed

+135
-11
lines changed

Library/lib/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ dependency {
3838
implementation(libs.androidx.lifecycle.viewmodel)
3939
implementation(libs.androidx.lifecycle.runtimeCompose)
4040
implementation(libs.androidx.lifecycle.viewmodel.compose)
41+
42+
// Navigation Compose
43+
implementation(libs.androidx.navigation.compose)
4144

4245
implementation(libs.ktor.client.core)
4346
implementation(libs.ktor.client.content.negotiation)

Library/lib/src/commonMain/kotlin/ui/DebuggerScreen.kt

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ import androidx.compose.foundation.layout.padding
55
import androidx.compose.material3.*
66
import androidx.compose.runtime.Composable
77
import androidx.compose.ui.Modifier
8+
import androidx.navigation.NavType
9+
import androidx.navigation.compose.NavHost
10+
import androidx.navigation.compose.composable
11+
import androidx.navigation.compose.rememberNavController
12+
import androidx.navigation.navArgument
13+
import ui.pane.RequestListPane
14+
import ui.pane.RequestPane
815

916
expect fun openDebugger()
1017

@@ -24,15 +31,47 @@ fun DebuggerScreen() {
2431
}
2532
) {
2633
Surface {
27-
RequestListPane(
34+
MainNavigation(
2835
modifier = Modifier
36+
.fillMaxSize()
2937
.padding(it)
30-
.fillMaxSize(),
31-
onClick = {
32-
33-
},
3438
)
3539
}
3640
}
3741
}
42+
}
43+
44+
@Composable
45+
fun MainNavigation(
46+
modifier: Modifier = Modifier
47+
) {
48+
val controller = rememberNavController()
49+
50+
NavHost(
51+
modifier = modifier,
52+
navController = controller,
53+
startDestination = "list"
54+
) {
55+
composable(route = "list") {
56+
RequestListPane(
57+
modifier = Modifier.fillMaxSize(),
58+
onClick = {
59+
controller.navigate("request/$it")
60+
},
61+
)
62+
}
63+
64+
composable(
65+
route = "request/{id}",
66+
arguments = listOf(
67+
navArgument("id") { type = NavType.StringType }
68+
)
69+
) {
70+
val id = it.savedStateHandle.get<String>("id") ?: return@composable
71+
RequestPane(
72+
modifier = Modifier.fillMaxSize(),
73+
id = id
74+
)
75+
}
76+
}
3877
}

Library/lib/src/commonMain/kotlin/ui/component/RequestItem.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fun ErrorItem(
3737
item: ErrorItemDisplay,
3838
onClick: () -> Unit,
3939
) {
40-
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
40+
CompositionLocalProvider(LocalContentColor provides Color(colorError)) {
4141
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
4242
}
4343
}
@@ -66,7 +66,7 @@ fun ExecutingItem(
6666
item: ExecutingItemDisplay,
6767
onClick: () -> Unit,
6868
) {
69-
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
69+
CompositionLocalProvider(LocalContentColor provides Color.White) {
7070
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
7171
}
7272
}
@@ -95,7 +95,7 @@ fun SpoofedItem(
9595
item: SpoofedItemDisplay,
9696
onClick: () -> Unit,
9797
) {
98-
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
98+
CompositionLocalProvider(LocalContentColor provides Color(colorSpoofed)) {
9999
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
100100
}
101101
}
@@ -154,11 +154,10 @@ fun StatusItem(
154154
)
155155
}
156156
Row {
157-
Text(text = executionTime, color = Color.White)
158-
Spacer(modifier = Modifier.width(8.dp))
159157
Text(text = "Status:", color = Color.White)
160158
Spacer(modifier = Modifier.width(4.dp))
161159
Text(status)
162160
}
161+
Text(text = executionTime, color = Color.White)
163162
}
164163
}

Library/lib/src/commonMain/kotlin/ui/RequestListPane.kt renamed to Library/lib/src/commonMain/kotlin/ui/pane/RequestListPane.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ui
1+
package ui.pane
22

33
import androidx.compose.foundation.layout.fillMaxWidth
44
import androidx.compose.foundation.lazy.LazyColumn
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package ui.pane
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.rememberScrollState
7+
import androidx.compose.foundation.verticalScroll
8+
import androidx.compose.material3.Text
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.getValue
11+
import androidx.compose.runtime.rememberUpdatedState
12+
import androidx.compose.ui.Modifier
13+
import androidx.compose.ui.unit.dp
14+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
15+
import data.HttpRequestState
16+
import data.SnifferDB
17+
import ui.component.ErrorItem
18+
import ui.component.ErrorItemDisplay
19+
import ui.component.ExecutingItem
20+
import ui.component.ExecutingItemDisplay
21+
import ui.component.SpoofedItem
22+
import ui.component.SpoofedItemDisplay
23+
import ui.component.SuccessItem
24+
import ui.component.SuccessItemDisplay
25+
26+
@Composable
27+
fun RequestPane(
28+
modifier: Modifier = Modifier,
29+
id: String
30+
) {
31+
val record by SnifferDB.httpRequests.collectAsStateWithLifecycle(emptyList())
32+
val transaction by rememberUpdatedState(record.firstOrNull { it.id == id } ?: return)
33+
val scrollState = rememberScrollState()
34+
35+
Column(
36+
modifier = modifier
37+
.verticalScroll(scrollState),
38+
verticalArrangement = Arrangement.spacedBy(16.dp)
39+
) {
40+
when (val tr = transaction) {
41+
is HttpRequestState.Error -> {
42+
ErrorItem(
43+
modifier = Modifier.fillMaxWidth(),
44+
item = ErrorItemDisplay.from(tr)
45+
) {
46+
47+
}
48+
}
49+
50+
is HttpRequestState.Executing -> {
51+
ExecutingItem(
52+
modifier = Modifier.fillMaxWidth(),
53+
item = ExecutingItemDisplay.from(tr)
54+
) {
55+
56+
}
57+
}
58+
59+
is HttpRequestState.Spoofed -> {
60+
SpoofedItem(
61+
modifier = Modifier.fillMaxWidth(),
62+
item = SpoofedItemDisplay.from(tr)
63+
) {
64+
65+
}
66+
}
67+
68+
is HttpRequestState.Success -> {
69+
SuccessItem(
70+
modifier = Modifier.fillMaxWidth(),
71+
item = SuccessItemDisplay.from(tr)
72+
) {
73+
74+
}
75+
}
76+
}
77+
Text(transaction.toString())
78+
}
79+
}

libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ composeGradlePlugin = "1.8.2"
1414
composeHotReload = "1.0.0-alpha11"
1515
composeMultiplatform = "1.8.2"
1616
androidx-lifecycle = "2.9.1"
17+
androidx-navigation = "2.9.0-beta04"
1718
junit = "4.13.2"
1819
ktor = "2.3.12"
1920
kotlinx-serialization = "1.8.1"
@@ -44,6 +45,9 @@ androidx-lifecycle-viewmodel = { module = "org.jetbrains.androidx.lifecycle:life
4445
androidx-lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle" }
4546
androidx-lifecycle-viewmodel-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle" }
4647

48+
# navigation
49+
androidx-navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "androidx-navigation" }
50+
4751
# serialization
4852
kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
4953

0 commit comments

Comments
 (0)