Skip to content

Commit 43b82a3

Browse files
wip
1 parent 258fff7 commit 43b82a3

File tree

7 files changed

+144
-100
lines changed

7 files changed

+144
-100
lines changed

Library/lib/src/androidMain/kotlin/ui/DebuggerActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class DebuggerActivity : ComponentActivity() {
1616
Sniffer.initiate(this)
1717

1818
setContent {
19-
DebuggerWindow()
19+
DebuggerScreen()
2020
}
2121
}
2222
}

Library/lib/src/androidMain/kotlin/ui/DebuggerWindow.android.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package ui
22

33
import data.Sniffer
44

5-
actual fun openDebuggerWindow() {
5+
actual fun openDebugger() {
66
Sniffer.launchDebuggerActivity.invoke()
77
}
88

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ui
2+
3+
import androidx.compose.foundation.layout.fillMaxSize
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.material3.*
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Modifier
8+
9+
expect fun openDebugger()
10+
11+
@OptIn(ExperimentalMaterial3Api::class)
12+
@Composable
13+
fun DebuggerScreen() {
14+
MaterialTheme(
15+
colorScheme = darkColorScheme()
16+
) {
17+
Scaffold(
18+
topBar = {
19+
TopAppBar(
20+
title = {
21+
Text("Sniffer")
22+
}
23+
)
24+
}
25+
) {
26+
Surface {
27+
RequestListPane(
28+
modifier = Modifier
29+
.padding(it)
30+
.fillMaxSize(),
31+
onClick = {
32+
33+
},
34+
)
35+
}
36+
}
37+
}
38+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package ui
2+
3+
import androidx.compose.foundation.layout.fillMaxWidth
4+
import androidx.compose.foundation.lazy.LazyColumn
5+
import androidx.compose.foundation.lazy.items
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.getValue
8+
import androidx.compose.ui.Modifier
9+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
10+
import data.HttpRequestState
11+
import data.SnifferDB
12+
import ui.component.*
13+
14+
@Composable
15+
fun RequestListPane(
16+
modifier: Modifier,
17+
onClick: (id: String) -> Unit,
18+
) {
19+
val requests by SnifferDB.httpRequests.collectAsStateWithLifecycle(emptyList())
20+
21+
LazyColumn(
22+
modifier = modifier,
23+
) {
24+
items(requests) {
25+
when (it) {
26+
is HttpRequestState.Error -> {
27+
ErrorItem(
28+
modifier = Modifier.fillMaxWidth(),
29+
item = ErrorItemDisplay.from(it),
30+
onClick = { onClick.invoke(it.id) },
31+
)
32+
}
33+
34+
is HttpRequestState.Executing -> {
35+
ExecutingItem(
36+
modifier = Modifier.fillMaxWidth(),
37+
item = ExecutingItemDisplay.from(it),
38+
onClick = { onClick.invoke(it.id) },
39+
)
40+
}
41+
42+
is HttpRequestState.Spoofed -> {
43+
SpoofedItem(
44+
modifier = Modifier.fillMaxWidth(),
45+
item = SpoofedItemDisplay.from(it),
46+
onClick = { onClick.invoke(it.id) },
47+
)
48+
}
49+
50+
is HttpRequestState.Success -> {
51+
SuccessItem(
52+
modifier = Modifier.fillMaxWidth(),
53+
item = SuccessItemDisplay.from(it),
54+
onClick = { onClick.invoke(it.id) },
55+
)
56+
}
57+
}
58+
}
59+
}
60+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ fun SnifferIndicator() {
9292
},
9393
isDragging = isDragging,
9494
onClick = {
95-
openDebuggerWindow()
95+
openDebugger()
9696
}
9797
)
9898
}

Library/lib/src/commonMain/kotlin/ui/DebuggerWindow.kt renamed to Library/lib/src/commonMain/kotlin/ui/component/RequestItem.kt

Lines changed: 22 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,17 @@
1-
package ui
1+
package ui.component
22

3+
import androidx.compose.foundation.clickable
34
import androidx.compose.foundation.layout.*
4-
import androidx.compose.foundation.lazy.LazyColumn
5-
import androidx.compose.foundation.lazy.items
6-
import androidx.compose.material3.*
5+
import androidx.compose.material3.LocalContentColor
6+
import androidx.compose.material3.Text
77
import androidx.compose.runtime.Composable
88
import androidx.compose.runtime.CompositionLocalProvider
9-
import androidx.compose.runtime.getValue
109
import androidx.compose.ui.Modifier
1110
import androidx.compose.ui.graphics.Color
1211
import androidx.compose.ui.text.style.TextOverflow
1312
import androidx.compose.ui.unit.dp
14-
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1513
import data.HttpRequestState
16-
import data.SnifferDB
17-
import kotlinx.datetime.LocalDateTime
18-
import kotlinx.datetime.TimeZone
19-
import kotlinx.datetime.toLocalDateTime
20-
import ui.component.colorSuccess
21-
import kotlin.time.ExperimentalTime
22-
import kotlin.time.Instant
23-
24-
expect fun openDebuggerWindow()
25-
26-
@OptIn(ExperimentalMaterial3Api::class)
27-
@Composable
28-
fun DebuggerWindow() {
29-
val requests by SnifferDB.httpRequests.collectAsStateWithLifecycle(emptyList())
30-
31-
MaterialTheme(
32-
colorScheme = darkColorScheme()
33-
) {
34-
Scaffold(
35-
topBar = {
36-
TopAppBar(
37-
title = {
38-
Text("Sniffer")
39-
}
40-
)
41-
}
42-
) {
43-
Surface {
44-
LazyColumn(
45-
modifier = Modifier.fillMaxSize(),
46-
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 16.dp)
47-
) {
48-
items(requests) {
49-
when (it) {
50-
is HttpRequestState.Error -> {
51-
ErrorItem(
52-
modifier = Modifier.fillMaxWidth(),
53-
item = ErrorItemDisplay.from(it)
54-
)
55-
}
56-
57-
is HttpRequestState.Executing -> {
58-
ExecutingItem(
59-
modifier = Modifier.fillMaxWidth(),
60-
item = ExecutingItemDisplay.from(it)
61-
)
62-
}
63-
64-
is HttpRequestState.Spoofed -> {
65-
SpoofedItem(
66-
modifier = Modifier.fillMaxWidth(),
67-
item = SpoofedItemDisplay.from(it)
68-
)
69-
}
70-
71-
is HttpRequestState.Success -> {
72-
SuccessItem(
73-
modifier = Modifier.fillMaxWidth(),
74-
item = SuccessItemDisplay.from(it)
75-
)
76-
}
77-
}
78-
}
79-
}
80-
}
81-
}
82-
}
83-
}
14+
import util.toDate
8415

8516
data class ErrorItemDisplay(
8617
val executionTime: String,
@@ -103,10 +34,11 @@ data class ErrorItemDisplay(
10334
@Composable
10435
fun ErrorItem(
10536
modifier: Modifier = Modifier,
106-
item: ErrorItemDisplay
37+
item: ErrorItemDisplay,
38+
onClick: () -> Unit,
10739
) {
10840
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
109-
StatusItem(modifier, item.executionTime, item.status, item.url, item.method)
41+
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
11042
}
11143
}
11244

@@ -131,10 +63,11 @@ data class ExecutingItemDisplay(
13163
@Composable
13264
fun ExecutingItem(
13365
modifier: Modifier = Modifier,
134-
item: ExecutingItemDisplay
66+
item: ExecutingItemDisplay,
67+
onClick: () -> Unit,
13568
) {
13669
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
137-
StatusItem(modifier, item.executionTime, item.status, item.url, item.method)
70+
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
13871
}
13972
}
14073

@@ -159,10 +92,11 @@ data class SpoofedItemDisplay(
15992
@Composable
16093
fun SpoofedItem(
16194
modifier: Modifier = Modifier,
162-
item: SpoofedItemDisplay
95+
item: SpoofedItemDisplay,
96+
onClick: () -> Unit,
16397
) {
16498
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
165-
StatusItem(modifier, item.executionTime, item.status, item.url, item.method)
99+
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
166100
}
167101
}
168102

@@ -187,24 +121,29 @@ data class SuccessItemDisplay(
187121
@Composable
188122
fun SuccessItem(
189123
modifier: Modifier = Modifier,
190-
item: SuccessItemDisplay
124+
item: SuccessItemDisplay,
125+
onClick: () -> Unit,
191126
) {
192127
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
193-
StatusItem(modifier, item.executionTime, item.status, item.url, item.method)
128+
StatusItem(modifier, onClick, item.executionTime, item.status, item.url, item.method)
194129
}
195130
}
196131

197132
@Composable
198133
fun StatusItem(
199134
modifier: Modifier = Modifier,
135+
onClick: () -> Unit,
200136
executionTime: String,
201137
status: String,
202138
url: String,
203139
method: String,
204140
) {
205141
Column(
206142
modifier = modifier
207-
.padding(vertical = 16.dp),
143+
.clickable {
144+
onClick.invoke()
145+
}
146+
.padding(vertical = 16.dp, horizontal = 16.dp),
208147
) {
209148
Row {
210149
Text(text = method.uppercase(), color = Color.White)
@@ -222,18 +161,4 @@ fun StatusItem(
222161
Text(status)
223162
}
224163
}
225-
}
226-
227-
@OptIn(ExperimentalTime::class)
228-
fun Long.toDate(timeZone: TimeZone = TimeZone.currentSystemDefault()): String {
229-
val instant = Instant.fromEpochMilliseconds(this)
230-
val dateTime: LocalDateTime = instant.toLocalDateTime(timeZone = timeZone)
231-
232-
val month = dateTime.monthNumber.toString().padStart(2, '0')
233-
val day = dateTime.dayOfMonth.toString().padStart(2, '0')
234-
val hour = dateTime.hour.toString().padStart(2, '0')
235-
val minute = dateTime.minute.toString().padStart(2, '0')
236-
val second = dateTime.second.toString().padStart(2, '0')
237-
238-
return "$month $day, $hour:$minute:$second"
239164
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package util
2+
3+
import kotlinx.datetime.LocalDateTime
4+
import kotlinx.datetime.TimeZone
5+
import kotlinx.datetime.toLocalDateTime
6+
import kotlin.time.ExperimentalTime
7+
import kotlin.time.Instant
8+
9+
@OptIn(ExperimentalTime::class)
10+
fun Long.toDate(timeZone: TimeZone = TimeZone.currentSystemDefault()): String {
11+
val instant = Instant.fromEpochMilliseconds(this)
12+
val dateTime: LocalDateTime = instant.toLocalDateTime(timeZone = timeZone)
13+
14+
val month = dateTime.monthNumber.toString().padStart(2, '0')
15+
val day = dateTime.dayOfMonth.toString().padStart(2, '0')
16+
val hour = dateTime.hour.toString().padStart(2, '0')
17+
val minute = dateTime.minute.toString().padStart(2, '0')
18+
val second = dateTime.second.toString().padStart(2, '0')
19+
20+
return "$month $day, $hour:$minute:$second"
21+
}

0 commit comments

Comments
 (0)