1- package ui
1+ package ui.component
22
3+ import androidx.compose.foundation.clickable
34import 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
77import androidx.compose.runtime.Composable
88import androidx.compose.runtime.CompositionLocalProvider
9- import androidx.compose.runtime.getValue
109import androidx.compose.ui.Modifier
1110import androidx.compose.ui.graphics.Color
1211import androidx.compose.ui.text.style.TextOverflow
1312import androidx.compose.ui.unit.dp
14- import androidx.lifecycle.compose.collectAsStateWithLifecycle
1513import 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
8516data class ErrorItemDisplay (
8617 val executionTime : String ,
@@ -103,10 +34,11 @@ data class ErrorItemDisplay(
10334@Composable
10435fun 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
13264fun 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
16093fun 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
188122fun 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
198133fun 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}
0 commit comments