1010package org.mifos.mobile.core.designsystem.component
1111
1212import androidx.compose.foundation.BorderStroke
13+ import androidx.compose.foundation.Image
14+ import androidx.compose.foundation.background
1315import androidx.compose.foundation.clickable
1416import androidx.compose.foundation.interaction.MutableInteractionSource
1517import androidx.compose.foundation.layout.Arrangement
18+ import androidx.compose.foundation.layout.Box
1619import androidx.compose.foundation.layout.Column
1720import androidx.compose.foundation.layout.ColumnScope
21+ import androidx.compose.foundation.layout.ExperimentalLayoutApi
22+ import androidx.compose.foundation.layout.FlowRow
23+ import androidx.compose.foundation.layout.Row
1824import androidx.compose.foundation.layout.Spacer
1925import androidx.compose.foundation.layout.fillMaxSize
2026import androidx.compose.foundation.layout.fillMaxWidth
2127import androidx.compose.foundation.layout.height
28+ import androidx.compose.foundation.layout.offset
2229import androidx.compose.foundation.layout.padding
2330import androidx.compose.foundation.layout.size
31+ import androidx.compose.foundation.layout.width
2432import androidx.compose.foundation.shape.RoundedCornerShape
2533import androidx.compose.material3.Card
2634import androidx.compose.material3.CardColors
@@ -35,12 +43,16 @@ import androidx.compose.runtime.Composable
3543import androidx.compose.ui.Alignment
3644import androidx.compose.ui.Modifier
3745import androidx.compose.ui.graphics.Color
46+ import androidx.compose.ui.graphics.ColorFilter
3847import androidx.compose.ui.graphics.Shape
3948import androidx.compose.ui.graphics.vector.ImageVector
4049import androidx.compose.ui.unit.Dp
4150import androidx.compose.ui.unit.dp
51+ import fluent.ui.system.icons.FluentIcons
52+ import fluent.ui.system.icons.filled.Document
4253import org.jetbrains.compose.ui.tooling.preview.Preview
4354import org.mifos.mobile.core.designsystem.icon.MifosIcons
55+ import org.mifos.mobile.core.designsystem.theme.AppColors
4456import org.mifos.mobile.core.designsystem.theme.DesignToken
4557import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
4658import org.mifos.mobile.core.designsystem.theme.MifosTypography
@@ -141,7 +153,7 @@ fun MifosCustomCard(
141153}
142154
143155@Composable
144- fun MifosUploadCard (
156+ fun MifosUploadStateCard (
145157 text : String ,
146158 icon : ImageVector ,
147159 onClick : () -> Unit ,
@@ -167,7 +179,7 @@ fun MifosUploadCard(
167179 MaterialTheme .colorScheme.secondaryContainer,
168180 ),
169181 ) {
170- UploadCardContent (
182+ MifosUploadStateCardContent (
171183 text = text,
172184 icon = icon,
173185 modifier = modifier,
@@ -176,7 +188,7 @@ fun MifosUploadCard(
176188}
177189
178190@Composable
179- fun UploadCardContent (
191+ fun MifosUploadStateCardContent (
180192 text : String ,
181193 icon : ImageVector ,
182194 modifier : Modifier = Modifier ,
@@ -202,6 +214,151 @@ fun UploadCardContent(
202214 }
203215}
204216
217+ @Composable
218+ fun MifosUploadedStateCard (
219+ removeText : String ,
220+ selectText : String ,
221+ viewText : String ,
222+ icon : ImageVector ,
223+ label : String ,
224+ fileName : String ,
225+ fileSize : String ,
226+ onRemoveClick : () -> Unit ,
227+ onViewClick : () -> Unit ,
228+ onSelectNewClick : () -> Unit ,
229+ modifier : Modifier = Modifier ,
230+ height : Dp = 112.dp,
231+ ) {
232+ Box (modifier = modifier.fillMaxWidth()) {
233+ MifosCustomCard (
234+ modifier = Modifier
235+ .fillMaxWidth()
236+ .height(height),
237+ enabled = false ,
238+ variant = CardVariant .OUTLINED ,
239+ shape = DesignToken .shapes.medium,
240+ elevation = CardDefaults .cardElevation(defaultElevation = DesignToken .elevation.none),
241+ colors = CardDefaults .cardColors(containerColor = MaterialTheme .colorScheme.onPrimary),
242+ borderStroke = BorderStroke (1 .dp, MaterialTheme .colorScheme.secondaryContainer),
243+ ) {
244+ MifosUploadedCardContent (
245+ icon = icon,
246+ fileName = fileName,
247+ fileSize = fileSize,
248+ onRemoveClick = onRemoveClick,
249+ onViewClick = onViewClick,
250+ onSelectNewClick = onSelectNewClick,
251+ removeText = removeText,
252+ selectText = selectText,
253+ viewText = viewText,
254+ )
255+ }
256+
257+ Box (
258+ modifier = Modifier
259+ .padding(start = DesignToken .padding.large)
260+ .offset(y = (- 7 ).dp),
261+ ) {
262+ Text (
263+ text = label,
264+ style = MifosTypography .bodySmall,
265+ modifier = Modifier
266+ .padding(horizontal = DesignToken .padding.extraSmall),
267+ )
268+ }
269+ }
270+ }
271+
272+ @OptIn(ExperimentalLayoutApi ::class )
273+ @Composable
274+ fun MifosUploadedCardContent (
275+ removeText : String ,
276+ selectText : String ,
277+ viewText : String ,
278+ icon : ImageVector ,
279+ fileName : String ,
280+ fileSize : String ,
281+ onRemoveClick : () -> Unit ,
282+ onViewClick : () -> Unit ,
283+ onSelectNewClick : () -> Unit ,
284+ modifier : Modifier = Modifier ,
285+ ) {
286+ Row (
287+ modifier = modifier
288+ .fillMaxWidth()
289+ .padding(DesignToken .padding.largeIncreased),
290+ ) {
291+ Box (
292+ modifier = Modifier
293+ .size(DesignToken .sizes.avatarSmall + 4 .dp)
294+ .background(
295+ color = MaterialTheme .colorScheme.primary,
296+ shape = DesignToken .shapes.small,
297+ ),
298+ contentAlignment = Alignment .Center ,
299+ ) {
300+ Image (
301+ imageVector = icon,
302+ contentDescription = " file icon" ,
303+ colorFilter = ColorFilter .tint(Color .White ),
304+ modifier = Modifier
305+ .size(DesignToken .sizes.iconMedium)
306+ .align(Alignment .Center ),
307+ )
308+ }
309+
310+ Spacer (modifier = Modifier .width(DesignToken .spacing.large))
311+
312+ Column {
313+ Text (
314+ text = fileName,
315+ style = MifosTypography .titleSmallEmphasized,
316+ color = AppColors .customBlack,
317+ )
318+
319+ Text (
320+ text = fileSize,
321+ style = MifosTypography .bodySmall,
322+ color = MaterialTheme .colorScheme.secondary,
323+ )
324+
325+ Spacer (modifier = Modifier .height(DesignToken .spacing.largeIncreased))
326+
327+ FlowRow (
328+ modifier = Modifier .fillMaxWidth(),
329+ horizontalArrangement = Arrangement .spacedBy(DesignToken .spacing.large),
330+ ) {
331+ Text (
332+ modifier = Modifier .clickable {
333+ onRemoveClick
334+ },
335+ text = removeText,
336+ color = MaterialTheme .colorScheme.primary,
337+ style = MifosTypography .labelMedium,
338+ )
339+
340+ Text (
341+ modifier = Modifier .clickable {
342+ onViewClick
343+ },
344+ text = viewText,
345+ color = MaterialTheme .colorScheme.primary,
346+ style = MifosTypography .labelMedium,
347+ )
348+
349+ Text (
350+ modifier = Modifier .clickable {
351+ onSelectNewClick
352+ },
353+ text = selectText,
354+ color = MaterialTheme .colorScheme.primary,
355+ style = MifosTypography .labelMedium,
356+ )
357+ }
358+ }
359+ }
360+ }
361+
205362@Preview
206363@Composable
207364private fun Upload_Card_Preview () {
@@ -265,7 +422,7 @@ private fun Upload_Card_Preview() {
265422 style = MifosTypography .headlineMedium,
266423 )
267424
268- MifosUploadCard (
425+ MifosUploadStateCard (
269426 text = " Upload Your Id" ,
270427 icon = MifosIcons .UploadId ,
271428 onClick = {},
@@ -274,6 +431,30 @@ private fun Upload_Card_Preview() {
274431 }
275432}
276433
434+ @Preview
435+ @Composable
436+ fun FloatingTitleCardPreview () {
437+ MifosMobileTheme {
438+ Column (
439+ modifier = Modifier .fillMaxSize().padding(DesignToken .padding.large),
440+ verticalArrangement = Arrangement .spacedBy(DesignToken .padding.largeIncreased),
441+ ) {
442+ MifosUploadedStateCard (
443+ label = " Profile Photo" ,
444+ icon = FluentIcons .Filled .Document ,
445+ fileName = " profile photo 67883.png" ,
446+ fileSize = " 346 KB" ,
447+ onRemoveClick = {},
448+ onViewClick = {},
449+ onSelectNewClick = {},
450+ removeText = " Remove File" ,
451+ selectText = " Select New File" ,
452+ viewText = " View File" ,
453+ )
454+ }
455+ }
456+ }
457+
277458enum class CardVariant {
278459
279460 /* *
0 commit comments