Skip to content

Commit 02b7109

Browse files
wip
1 parent fee82ec commit 02b7109

File tree

2 files changed

+141
-55
lines changed

2 files changed

+141
-55
lines changed

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

Lines changed: 111 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ package ui.component
22

33
import androidx.compose.foundation.clickable
44
import androidx.compose.foundation.layout.*
5-
import androidx.compose.material3.LocalContentColor
6-
import androidx.compose.material3.MaterialTheme
7-
import androidx.compose.material3.Text
5+
import androidx.compose.material3.*
86
import androidx.compose.runtime.Composable
97
import androidx.compose.runtime.CompositionLocalProvider
108
import androidx.compose.ui.Modifier
119
import androidx.compose.ui.graphics.Color
1210
import androidx.compose.ui.text.style.TextOverflow
11+
import androidx.compose.ui.unit.LayoutDirection
1312
import androidx.compose.ui.unit.dp
1413
import data.HttpRequestState
14+
import io.github.stefanusayudha.spoof.lib.generated.resources.Res
15+
import io.github.stefanusayudha.spoof.lib.generated.resources.ic_delete_24
16+
import io.github.stefanusayudha.spoof.lib.generated.resources.ic_share_24
17+
import org.jetbrains.compose.resources.painterResource
1518
import util.toDate
1619

1720
data class ErrorItemDisplay(
@@ -37,10 +40,22 @@ fun ErrorItem(
3740
modifier: Modifier = Modifier,
3841
item: ErrorItemDisplay,
3942
contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 16.dp),
43+
onDelete: (() -> Unit)? = null,
44+
onShare: (() -> Unit)? = null,
4045
onClick: () -> Unit,
4146
) {
4247
CompositionLocalProvider(LocalContentColor provides Color(colorError)) {
43-
StatusItem(modifier, onClick, contentPadding, item.executionTime, item.status, item.url, item.method)
48+
StatusItem(
49+
modifier,
50+
onClick = onClick,
51+
onDelete = onDelete,
52+
onShare = onShare,
53+
contentPadding = contentPadding,
54+
executionTime = item.executionTime,
55+
status = item.status,
56+
url = item.url,
57+
method = item.method
58+
)
4459
}
4560
}
4661

@@ -67,10 +82,22 @@ fun ExecutingItem(
6782
modifier: Modifier = Modifier,
6883
item: ExecutingItemDisplay,
6984
contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 16.dp),
85+
onDelete: (() -> Unit)? = null,
86+
onShare: (() -> Unit)? = null,
7087
onClick: () -> Unit,
7188
) {
7289
CompositionLocalProvider(LocalContentColor provides Color.White) {
73-
StatusItem(modifier, onClick, contentPadding, item.executionTime, item.status, item.url, item.method)
90+
StatusItem(
91+
modifier,
92+
onClick = onClick,
93+
onDelete = onDelete,
94+
onShare = onShare,
95+
contentPadding = contentPadding,
96+
executionTime = item.executionTime,
97+
status = item.status,
98+
url = item.url,
99+
method = item.method
100+
)
74101
}
75102
}
76103

@@ -97,10 +124,22 @@ fun SpoofedItem(
97124
modifier: Modifier = Modifier,
98125
item: SpoofedItemDisplay,
99126
contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 16.dp),
127+
onDelete: (() -> Unit)? = null,
128+
onShare: (() -> Unit)? = null,
100129
onClick: () -> Unit,
101130
) {
102131
CompositionLocalProvider(LocalContentColor provides Color(colorSpoofed)) {
103-
StatusItem(modifier, onClick, contentPadding, item.executionTime, item.status, item.url, item.method)
132+
StatusItem(
133+
modifier,
134+
onClick = onClick,
135+
onDelete = onDelete,
136+
onShare = onShare,
137+
contentPadding = contentPadding,
138+
executionTime = item.executionTime,
139+
status = item.status,
140+
url = item.url,
141+
method = item.method
142+
)
104143
}
105144
}
106145

@@ -127,47 +166,106 @@ fun SuccessItem(
127166
modifier: Modifier = Modifier,
128167
item: SuccessItemDisplay,
129168
contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 16.dp),
169+
onDelete: (() -> Unit)? = null,
170+
onShare: (() -> Unit)? = null,
130171
onClick: () -> Unit,
131172
) {
132173
CompositionLocalProvider(LocalContentColor provides Color(colorSuccess)) {
133-
StatusItem(modifier, onClick, contentPadding, item.executionTime, item.status, item.url, item.method)
174+
StatusItem(
175+
modifier,
176+
onClick = onClick,
177+
onDelete = onDelete,
178+
onShare = onShare,
179+
contentPadding = contentPadding,
180+
executionTime = item.executionTime,
181+
status = item.status,
182+
url = item.url,
183+
method = item.method
184+
)
134185
}
135186
}
136187

137188
@Composable
138189
fun StatusItem(
139190
modifier: Modifier = Modifier,
140-
onClick: () -> Unit,
141-
contentPadding: PaddingValues,
142191
executionTime: String,
143192
status: String,
144193
url: String,
145194
method: String,
195+
onClick: () -> Unit,
196+
onDelete: (() -> Unit)? = null,
197+
onShare: (() -> Unit)? = null,
198+
contentPadding: PaddingValues,
146199
) {
147200
Column(
148201
modifier = modifier
149202
.clickable {
150203
onClick.invoke()
151-
}
152-
.padding(contentPadding),
204+
},
153205
) {
154-
Row {
206+
Row(
207+
modifier = Modifier.padding(
208+
start = contentPadding.calculateStartPadding(LayoutDirection.Ltr),
209+
end = contentPadding.calculateEndPadding(LayoutDirection.Rtl)
210+
)
211+
) {
155212
Text(text = method.uppercase(), color = Color.White)
156213
Spacer(modifier = Modifier.width(4.dp))
157214
Text(
158215
text = url,
159216
overflow = TextOverflow.StartEllipsis
160217
)
161218
}
162-
Row {
219+
Row(
220+
modifier = Modifier.padding(
221+
start = contentPadding.calculateStartPadding(LayoutDirection.Ltr),
222+
end = contentPadding.calculateEndPadding(LayoutDirection.Rtl)
223+
)
224+
) {
163225
Text(text = "Status:", color = Color.White)
164226
Spacer(modifier = Modifier.width(4.dp))
165227
Text(status)
166228
}
167229
Text(
230+
modifier = Modifier.padding(
231+
start = contentPadding.calculateStartPadding(LayoutDirection.Ltr),
232+
end = contentPadding.calculateEndPadding(LayoutDirection.Rtl)
233+
),
168234
text = executionTime,
169235
color = Color.White,
170236
style = MaterialTheme.typography.labelSmall
171237
)
238+
if (listOf(onShare, onDelete).any { it != null })
239+
Row(
240+
horizontalArrangement = Arrangement.spacedBy(0.dp)
241+
) {
242+
if (onDelete != null) {
243+
IconButton(
244+
colors = IconButtonDefaults.iconButtonColors(
245+
contentColor = MaterialTheme.colorScheme.error,
246+
),
247+
onClick = onDelete
248+
) {
249+
Icon(
250+
modifier = Modifier.size(24.dp),
251+
painter = painterResource(Res.drawable.ic_delete_24),
252+
contentDescription = null
253+
)
254+
}
255+
}
256+
if (onShare != null)
257+
IconButton(
258+
colors = IconButtonDefaults.iconButtonColors(
259+
contentColor = MaterialTheme.colorScheme.onSurface,
260+
),
261+
onClick = onShare
262+
) {
263+
Icon(
264+
modifier = Modifier.size(24.dp),
265+
painter = painterResource(Res.drawable.ic_share_24),
266+
contentDescription = null
267+
)
268+
}
269+
}
172270
}
173271
}

Library/lib/src/commonMain/kotlin/ui/pane/RequestPane.kt

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ import androidx.compose.ui.unit.dp
1212
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1313
import data.HttpRequestState
1414
import data.SnifferDB
15-
import io.github.stefanusayudha.spoof.lib.generated.resources.Res
16-
import io.github.stefanusayudha.spoof.lib.generated.resources.ic_delete_24
17-
import io.github.stefanusayudha.spoof.lib.generated.resources.ic_share_24
18-
import org.jetbrains.compose.resources.painterResource
1915
import ui.component.*
2016

2117
@OptIn(ExperimentalMaterial3Api::class)
@@ -30,14 +26,20 @@ fun RequestPane(
3026

3127
Scaffold(
3228
topBar = {
33-
Row(
29+
Column(
3430
modifier = Modifier.statusBarsPadding()
3531
) {
3632
when (val tr = transaction) {
3733
is HttpRequestState.Error -> {
3834
ErrorItem(
3935
modifier = Modifier.fillMaxWidth(),
40-
item = ErrorItemDisplay.from(tr)
36+
item = ErrorItemDisplay.from(tr),
37+
onShare = {
38+
39+
},
40+
onDelete = {
41+
42+
}
4143
) {
4244

4345
}
@@ -46,7 +48,13 @@ fun RequestPane(
4648
is HttpRequestState.Executing -> {
4749
ExecutingItem(
4850
modifier = Modifier.fillMaxWidth(),
49-
item = ExecutingItemDisplay.from(tr)
51+
item = ExecutingItemDisplay.from(tr),
52+
onShare = {
53+
54+
},
55+
onDelete = {
56+
57+
}
5058
) {
5159

5260
}
@@ -55,7 +63,13 @@ fun RequestPane(
5563
is HttpRequestState.Spoofed -> {
5664
SpoofedItem(
5765
modifier = Modifier.fillMaxWidth(),
58-
item = SpoofedItemDisplay.from(tr)
66+
item = SpoofedItemDisplay.from(tr),
67+
onShare = {
68+
69+
},
70+
onDelete = {
71+
72+
}
5973
) {
6074

6175
}
@@ -64,7 +78,13 @@ fun RequestPane(
6478
is HttpRequestState.Success -> {
6579
SuccessItem(
6680
modifier = Modifier.fillMaxWidth(),
67-
item = SuccessItemDisplay.from(tr)
81+
item = SuccessItemDisplay.from(tr),
82+
onShare = {
83+
84+
},
85+
onDelete = {
86+
87+
}
6888
) {
6989

7090
}
@@ -73,39 +93,7 @@ fun RequestPane(
7393
}
7494
},
7595
bottomBar = {
76-
BottomAppBar(
77-
contentPadding = PaddingValues(horizontal = 16.dp),
78-
) {
79-
Button(
80-
modifier = Modifier.weight(1f),
81-
colors = ButtonDefaults.buttonColors(
82-
containerColor = MaterialTheme.colorScheme.error,
83-
contentColor = MaterialTheme.colorScheme.onError,
84-
),
85-
onClick = {
86-
87-
}
88-
) {
89-
Icon(
90-
modifier = Modifier.size(24.dp),
91-
painter = painterResource(Res.drawable.ic_delete_24),
92-
contentDescription = null
93-
)
94-
}
95-
Spacer(modifier = Modifier.width(8.dp))
96-
OutlinedButton(
97-
modifier = Modifier.weight(1f),
98-
onClick = {
99-
100-
}
101-
) {
102-
Icon(
103-
modifier = Modifier.size(24.dp),
104-
painter = painterResource(Res.drawable.ic_share_24),
105-
contentDescription = null
106-
)
107-
}
108-
}
96+
Box(modifier = Modifier.navigationBarsPadding())
10997
}
11098
) {
11199
Surface(

0 commit comments

Comments
 (0)