@@ -2,16 +2,19 @@ package ui.component
22
33import androidx.compose.foundation.clickable
44import 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.*
86import androidx.compose.runtime.Composable
97import androidx.compose.runtime.CompositionLocalProvider
108import androidx.compose.ui.Modifier
119import androidx.compose.ui.graphics.Color
1210import androidx.compose.ui.text.style.TextOverflow
11+ import androidx.compose.ui.unit.LayoutDirection
1312import androidx.compose.ui.unit.dp
1413import 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
1518import util.toDate
1619
1720data 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
138189fun 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}
0 commit comments