Skip to content

Commit 19cacac

Browse files
feat: uploaded state component (#2849)
1 parent 8004252 commit 19cacac

File tree

2 files changed

+187
-4
lines changed
  • core/designsystem/src/commonMain/kotlin/org/mifos/mobile/core/designsystem

2 files changed

+187
-4
lines changed

core/designsystem/src/commonMain/kotlin/org/mifos/mobile/core/designsystem/component/MifosCard.kt

Lines changed: 185 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,25 @@
1010
package org.mifos.mobile.core.designsystem.component
1111

1212
import androidx.compose.foundation.BorderStroke
13+
import androidx.compose.foundation.Image
14+
import androidx.compose.foundation.background
1315
import androidx.compose.foundation.clickable
1416
import androidx.compose.foundation.interaction.MutableInteractionSource
1517
import androidx.compose.foundation.layout.Arrangement
18+
import androidx.compose.foundation.layout.Box
1619
import androidx.compose.foundation.layout.Column
1720
import 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
1824
import androidx.compose.foundation.layout.Spacer
1925
import androidx.compose.foundation.layout.fillMaxSize
2026
import androidx.compose.foundation.layout.fillMaxWidth
2127
import androidx.compose.foundation.layout.height
28+
import androidx.compose.foundation.layout.offset
2229
import androidx.compose.foundation.layout.padding
2330
import androidx.compose.foundation.layout.size
31+
import androidx.compose.foundation.layout.width
2432
import androidx.compose.foundation.shape.RoundedCornerShape
2533
import androidx.compose.material3.Card
2634
import androidx.compose.material3.CardColors
@@ -35,12 +43,16 @@ import androidx.compose.runtime.Composable
3543
import androidx.compose.ui.Alignment
3644
import androidx.compose.ui.Modifier
3745
import androidx.compose.ui.graphics.Color
46+
import androidx.compose.ui.graphics.ColorFilter
3847
import androidx.compose.ui.graphics.Shape
3948
import androidx.compose.ui.graphics.vector.ImageVector
4049
import androidx.compose.ui.unit.Dp
4150
import androidx.compose.ui.unit.dp
51+
import fluent.ui.system.icons.FluentIcons
52+
import fluent.ui.system.icons.filled.Document
4253
import org.jetbrains.compose.ui.tooling.preview.Preview
4354
import org.mifos.mobile.core.designsystem.icon.MifosIcons
55+
import org.mifos.mobile.core.designsystem.theme.AppColors
4456
import org.mifos.mobile.core.designsystem.theme.DesignToken
4557
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
4658
import 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
207364
private 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+
277458
enum class CardVariant {
278459

279460
/**

core/designsystem/src/commonMain/kotlin/org/mifos/mobile/core/designsystem/theme/Color.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,6 @@ object AppColors {
231231
val primaryBlue = Color(0xFF33618D)
232232
val borderColor = Color(0xFF42474E)
233233
val borderColorOne = Color(0xFFD6E4F7)
234+
235+
val customBlack = Color(0xFF3A3A3A)
234236
}

0 commit comments

Comments
 (0)