From d9134e84f48829059335576118220e463a224af5 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 10 May 2026 00:09:31 +0630 Subject: [PATCH] added amount screen --- .../gradle-9.4.1-bin.zip.lck | 0 .../gradle-9.4.1-bin.zip.part | 0 .idea/deploymentTargetSelector.xml | 7 + app/build.gradle.kts | 1 + .../com/mob/ustmm/ui/amount/AmountScreen.kt | 313 ++++++++++++++++++ .../mob/ustmm/ui/components/SquareButton.kt | 95 ++++++ .../ui/dashboard/BottomDashboardButton.kt | 62 ---- .../ustmm/ui/dashboard/DashboardMenuButton.kt | 64 ---- .../mob/ustmm/ui/dashboard/DashboardScreen.kt | 155 ++++++--- .../mob/ustmm/ui/navigation/AppNavGraph.kt | 29 +- .../com/mob/ustmm/ui/navigation/Routes.kt | 9 +- app/src/main/res/drawable/ic_left_arrow.xml | 24 ++ app/src/main/res/drawable/ic_sale.xml | 24 ++ app/src/main/res/drawable/logo_mob.png | Bin 0 -> 30204 bytes gradle/libs.versions.toml | 2 + 15 files changed, 610 insertions(+), 175 deletions(-) create mode 100644 .gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.lck create mode 100644 .gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.part create mode 100644 app/src/main/java/com/mob/ustmm/ui/amount/AmountScreen.kt create mode 100644 app/src/main/java/com/mob/ustmm/ui/components/SquareButton.kt delete mode 100644 app/src/main/java/com/mob/ustmm/ui/dashboard/BottomDashboardButton.kt delete mode 100644 app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardMenuButton.kt create mode 100644 app/src/main/res/drawable/ic_left_arrow.xml create mode 100644 app/src/main/res/drawable/ic_sale.xml create mode 100644 app/src/main/res/drawable/logo_mob.png diff --git a/.gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.lck b/.gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.lck new file mode 100644 index 0000000..e69de29 diff --git a/.gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.part b/.gradle-local/wrapper/dists/gradle-9.4.1-bin/arn2x92ynaizyzdaamcbpbhtj/gradle-9.4.1-bin.zip.part new file mode 100644 index 0000000..e69de29 diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index ca16a99..c7b5db6 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,13 @@ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 08acc47..e94f37c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,6 +42,7 @@ android { dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.activity.compose) + implementation(libs.androidx.compose.foundation) implementation(libs.androidx.compose.material3) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) diff --git a/app/src/main/java/com/mob/ustmm/ui/amount/AmountScreen.kt b/app/src/main/java/com/mob/ustmm/ui/amount/AmountScreen.kt new file mode 100644 index 0000000..d6e5611 --- /dev/null +++ b/app/src/main/java/com/mob/ustmm/ui/amount/AmountScreen.kt @@ -0,0 +1,313 @@ +package com.mob.ustmm.ui.amount + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.mob.ustmm.R +import com.mob.ustmm.ui.theme.MOBPOSTheme +import com.mob.ustmm.ui.theme.Primary +import com.mob.ustmm.ui.theme.White + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AmountScreen( + action: String, + onBackClick: () -> Unit, + onCancelClick: () -> Unit = {}, + onNextClick: (String) -> Unit = {} +) { + + var amount by remember { mutableStateOf("0") } + + val config = LocalConfiguration.current + val isSmallScreen = config.screenHeightDp < 700 + + Scaffold( + topBar = { + CenterAlignedTopAppBar( + title = { + Text( + text = action.uppercase(), + color = White, + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold + ) + }, + navigationIcon = { + IconButton(onClick = onBackClick) { + Icon( + painter = painterResource(R.drawable.ic_left_arrow), + contentDescription = "Back", + modifier = Modifier.size(24.dp), + tint = White + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Primary + ) + ) + }, + containerColor = White + ) { paddingValues -> + + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .background(White) + .verticalScroll(rememberScrollState()) + .padding(horizontal = if (isSmallScreen) 20.dp else 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceBetween + ) { + + Spacer( + modifier = Modifier.height( + 16.dp + ) + ) + + AmountBox( + amount = amount, + height = if (isSmallScreen) 115.dp else 142.dp + ) + + Spacer( + modifier = Modifier.height( + 100.dp + ) + ) + + Keypad( + buttonHeight = if (isSmallScreen) 60.dp else 74.dp, + buttonSpacing = if (isSmallScreen) 8.dp else 12.dp, + onKeyClick = { key -> + + amount = when (key) { + + "del" -> { + if (amount.length <= 1) { + "0" + } else { + amount.dropLast(1) + } + } + + "." -> { + if (amount.contains(".")) { + amount + } else { + "$amount." + } + } + + else -> { + if (amount == "0") { + key + } else { + amount + key + } + } + } + } + ) + + Spacer( + modifier = Modifier.height( + if (isSmallScreen) 14.dp else 18.dp + ) + ) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + + Button( + onClick = onCancelClick, + modifier = Modifier + .weight(1f) + .height(if (isSmallScreen) 58.dp else 68.dp), + shape = RoundedCornerShape(18.dp), + colors = ButtonDefaults.buttonColors( + containerColor = White, + contentColor = Primary + ), + border = ButtonDefaults.outlinedButtonBorder + ) { + Text( + text = "Cancel", + fontSize = if (isSmallScreen) 18.sp else 20.sp, + fontWeight = FontWeight.Bold + ) + } + + Button( + onClick = { + onNextClick(amount) + }, + modifier = Modifier + .weight(1f) + .height(if (isSmallScreen) 58.dp else 68.dp), + shape = RoundedCornerShape(18.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Primary, + contentColor = White + ) + ) { + Text( + text = "Next", + fontSize = if (isSmallScreen) 18.sp else 20.sp, + fontWeight = FontWeight.Bold + ) + } + } + + Spacer(modifier = Modifier.height(12.dp)) + } + } +} + +@Composable +private fun AmountBox( + amount: String, + height: Dp +) { + + Box( + modifier = Modifier + .fillMaxWidth() + .height(height) + .background( + color = Primary, + shape = RoundedCornerShape(20.dp) + ) + .padding(horizontal = 24.dp), + contentAlignment = Alignment.CenterEnd + ) { + + Row( + verticalAlignment = Alignment.CenterVertically + ) { + + Text( + text = amount, + color = White, + fontSize = 26.sp, + fontWeight = FontWeight.Bold + ) + + Spacer(modifier = Modifier.width(14.dp)) + + Box( + modifier = Modifier + .background( + color = White, + shape = RoundedCornerShape(10.dp) + ) + .padding( + horizontal = 16.dp, + vertical = 6.dp + ) + ) { + + Text( + text = "MMK", + color = Primary, + fontSize = 20.sp, + fontWeight = FontWeight.Bold + ) + } + } + } +} + +@Composable +private fun Keypad( + buttonHeight: Dp, + buttonSpacing: Dp, + onKeyClick: (String) -> Unit +) { + + val keys = listOf( + listOf("1", "2", "3"), + listOf("4", "5", "6"), + listOf("7", "8", "9"), + listOf(".", "0", "del") + ) + + Column( + verticalArrangement = Arrangement.spacedBy(buttonSpacing) + ) { + + keys.forEach { row -> + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + + row.forEach { key -> + + Button( + onClick = { + onKeyClick(key) + }, + modifier = Modifier + .weight(1f) + .height(buttonHeight), + shape = RoundedCornerShape(18.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Primary, + contentColor = White + ), + contentPadding = PaddingValues(0.dp) + ) { + + Text( + text = key, + fontSize = if (buttonHeight < 70.dp) 20.sp else 22.sp, + fontWeight = FontWeight.Bold + ) + } + } + } + } + } +} + +@Preview(showBackground = true, showSystemUi = false) +@Composable +private fun AmountScreenPreview() { + + MOBPOSTheme { + + AmountScreen( + action = "Amount", + onBackClick = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mob/ustmm/ui/components/SquareButton.kt b/app/src/main/java/com/mob/ustmm/ui/components/SquareButton.kt new file mode 100644 index 0000000..658b268 --- /dev/null +++ b/app/src/main/java/com/mob/ustmm/ui/components/SquareButton.kt @@ -0,0 +1,95 @@ +package com.mob.ustmm.ui.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.mob.ustmm.R +import com.mob.ustmm.ui.theme.MOBPOSTheme +import com.mob.ustmm.ui.theme.Primary +import com.mob.ustmm.ui.theme.White + +@Composable +fun SquareButton( + title: String, + icon: Int, + modifier: Modifier = Modifier, + enabled: Boolean = true, + containerColor: Color = White, + contentColor: Color = Primary, + iconTint: Color = contentColor, + disabledContainerColor: Color = White, + disabledContentColor: Color = Primary, + border: BorderStroke? = null, + shape: Shape = RoundedCornerShape(20.dp), + onClick: () -> Unit +) { + Button( + onClick = onClick, + enabled = enabled, + modifier = modifier + .height(180.dp), + shape = shape, + border = border, + colors = ButtonDefaults.buttonColors( + containerColor = containerColor, + contentColor = contentColor, + disabledContainerColor = disabledContainerColor, + disabledContentColor = disabledContentColor + ), + contentPadding = PaddingValues(12.dp) + ) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Icon( + painter = painterResource(icon), + contentDescription = title, + tint = if (enabled) iconTint else disabledContentColor, + modifier = Modifier.size(60.dp) + ) + + Spacer(modifier = Modifier.height(10.dp)) + + Text( + text = title, + fontSize = 24.sp, + fontWeight = FontWeight.SemiBold, + textAlign = TextAlign.Center, + maxLines = 1 + ) + } + } +} + +@Preview(showBackground = true) +@Composable +private fun SquareButtonPreview() { + MOBPOSTheme { + SquareButton( + title = "Sale", + icon = R.drawable.ic_menu, + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + containerColor = White, + contentColor = White, + iconTint = Primary, + border = null, + onClick = {} + ) + } +} diff --git a/app/src/main/java/com/mob/ustmm/ui/dashboard/BottomDashboardButton.kt b/app/src/main/java/com/mob/ustmm/ui/dashboard/BottomDashboardButton.kt deleted file mode 100644 index b98b3a3..0000000 --- a/app/src/main/java/com/mob/ustmm/ui/dashboard/BottomDashboardButton.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.mob.ustmm.ui.dashboard - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.SegmentedButtonDefaults.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun BottomDashboardButton( - text: String, - icon: Int, - modifier: Modifier = Modifier, - enabled: Boolean = true, - onClick: () -> Unit -) { - Button( - onClick = onClick, - enabled = enabled, - modifier = modifier - .padding(8.dp) - .height(81.dp), - shape = RoundedCornerShape(12.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color.Yellow, - contentColor = Color.White, - disabledContainerColor = Color.Gray, - disabledContentColor = Color.White - ), - contentPadding = PaddingValues(12.dp) - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { -// Icon( -// painter = painterResource(id = icon), -// contentDescription = null, -// tint = Color.White -// ) - - Spacer(modifier = Modifier.height(4.dp)) - - Text( - text = text, - fontSize = 17.sp - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardMenuButton.kt b/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardMenuButton.kt deleted file mode 100644 index 402bec1..0000000 --- a/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardMenuButton.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.mob.ustmm.ui.dashboard - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun DashboardMenuButton( - text: String, - icon: Int, - modifier: Modifier = Modifier, - enabled: Boolean = true, - onClick: () -> Unit -) { - Button( - onClick = onClick, - enabled = enabled, - modifier = modifier - .padding(8.dp) - .height(81.dp), - shape = RoundedCornerShape(8.dp), - colors = ButtonDefaults.buttonColors( - containerColor = Color.White, - contentColor = Color.Yellow, - disabledContainerColor = Color.LightGray, - disabledContentColor = Color.Gray - ), - border = BorderStroke(1.dp, Color.Black), - contentPadding = PaddingValues(8.dp) - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Icon( - painter = painterResource(id = icon), - contentDescription = null - ) - - Spacer(modifier = Modifier.height(4.dp)) - - Text( - text = text, - fontSize = 14.sp - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardScreen.kt b/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardScreen.kt index f55942e..9706173 100644 --- a/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardScreen.kt +++ b/app/src/main/java/com/mob/ustmm/ui/dashboard/DashboardScreen.kt @@ -4,25 +4,21 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.mob.ustmm.R +import com.mob.ustmm.ui.components.SquareButton +import com.mob.ustmm.ui.theme.MOBPOSTheme import com.mob.ustmm.ui.theme.* -import kotlinx.coroutines.delay import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @@ -30,6 +26,7 @@ import kotlinx.coroutines.launch fun DashboardScreen( settlementEnabled: Boolean, wavePayEnabled: Boolean, + onAmountClick: (String) -> Unit, onTransactionClick: () -> Unit, onSettlementClick: () -> Unit, onHistoryClick: () -> Unit, @@ -38,28 +35,7 @@ fun DashboardScreen( ) { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() - - - val images = listOf( - R.drawable.box_christmas_delivery_gift_package_present_svgrepo_com, - R.drawable.buy_ecommerce_finance_payment_pos_shop_svgrepo_com, - R.drawable.appointment_calendar_date_event_month_plan_svgrepo_com - ) - val startPage = Int.MAX_VALUE / 2; - - val pagerState = rememberPagerState( - initialPage = startPage, - pageCount = { Int.MAX_VALUE } - ) - LaunchedEffect(Unit) { - while(true){ - delay(3000) - pagerState.animateScrollToPage( - pagerState.currentPage + 1 - ) - } - } ModalNavigationDrawer( drawerState = drawerState, @@ -129,7 +105,7 @@ fun DashboardScreen( onWavePayClick() } .padding(horizontal = 24.dp, vertical = 14.dp), - color = if (wavePayEnabled) Black else White, + color = if (wavePayEnabled) Black else White, fontSize = 16.sp ) } @@ -139,7 +115,6 @@ fun DashboardScreen( topBar = { CenterAlignedTopAppBar( title = { - Text(text = "Dashboard", color = White, fontWeight = FontWeight.SemiBold) }, navigationIcon = { @@ -150,7 +125,11 @@ fun DashboardScreen( } } ) { - Icon(painter = painterResource(R.drawable.ic_menu), contentDescription = "Menu Icon", tint = White) + Icon( + painter = painterResource(R.drawable.ic_menu), + contentDescription = "Menu Icon", + tint = White + ) } }, colors = TopAppBarDefaults.topAppBarColors( @@ -158,20 +137,116 @@ fun DashboardScreen( ) ) } - ) { paddingValues -> + ) { paddingValues -> Column( - modifier = Modifier.fillMaxSize().padding(paddingValues).background(White) + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .background(White) ) { - HorizontalPager(state = pagerState) { page -> - val index = page % images.size; + Box( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + contentAlignment = Alignment.Center + ) { Image( - painter = painterResource(images[index]), - contentDescription = "Banner images", - modifier = Modifier.fillMaxSize(), - contentScale = ContentScale.Crop + painter = painterResource(R.drawable.logo_mob), + contentDescription = "Mob logo" ) } + + Box( + modifier = Modifier + .fillMaxSize() + .background( + color = Primary, + shape = RoundedCornerShape( + topStart = 16.dp, + topEnd = 16.dp, + bottomStart = 0.dp, + bottomEnd = 0.dp + ) + ) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + SquareButton( + title = "Sale", + icon = R.drawable.ic_sale, + modifier = Modifier.weight(1f), + containerColor = White, + contentColor = Primary, + iconTint = Primary, + border = null, + onClick = { onAmountClick("Sale") }, + ) + SquareButton( + title = "Sign On", + icon = R.drawable.ic_menu, + modifier = Modifier.weight(1f), + containerColor = White, + contentColor = Primary, + iconTint = Primary, + border = null, + onClick = { onAmountClick("Sign On") } + ) + } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + SquareButton( + title = "Settlement", + icon = R.drawable.ic_menu, + modifier = Modifier.weight(1f), + enabled = settlementEnabled, + containerColor = White, + contentColor = Primary, + iconTint = Primary, + border = null, + onClick = onSettlementClick + ) + SquareButton( + title = "Others", + icon = R.drawable.ic_menu, + modifier = Modifier.weight(1f), + containerColor = White, + contentColor = Primary, + iconTint = Primary, + border = null, + onClick = onCardClick + ) + } + } + } } } } } + +@Preview(showBackground = true, showSystemUi = true) +@Composable +private fun DashboardScreenPreview() { + MOBPOSTheme { + DashboardScreen( + settlementEnabled = true, + wavePayEnabled = true, + onAmountClick = {}, + onTransactionClick = {}, + onSettlementClick = {}, + onHistoryClick = {}, + onCardClick = {}, + onWavePayClick = {} + ) + } +} diff --git a/app/src/main/java/com/mob/ustmm/ui/navigation/AppNavGraph.kt b/app/src/main/java/com/mob/ustmm/ui/navigation/AppNavGraph.kt index 67ce050..2df137c 100644 --- a/app/src/main/java/com/mob/ustmm/ui/navigation/AppNavGraph.kt +++ b/app/src/main/java/com/mob/ustmm/ui/navigation/AppNavGraph.kt @@ -1,15 +1,16 @@ package com.mob.ustmm.ui.navigation - import androidx.compose.runtime.Composable +import androidx.navigation.NavHostController +import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import androidx.navigation.NavHostController +import androidx.navigation.navArgument +import com.mob.ustmm.ui.amount.AmountScreen import com.mob.ustmm.ui.dashboard.DashboardScreen - @Composable - fun AppNavGraph( +fun AppNavGraph( navController: NavHostController ) { NavHost( @@ -20,6 +21,9 @@ import com.mob.ustmm.ui.dashboard.DashboardScreen DashboardScreen( settlementEnabled = true, wavePayEnabled = true, + onAmountClick = { action -> + navController.navigate(Routes.Amount.createRoute(action)) + }, onTransactionClick = {}, onSettlementClick = {}, onHistoryClick = {}, @@ -27,6 +31,19 @@ import com.mob.ustmm.ui.dashboard.DashboardScreen onWavePayClick = {} ) } - + + composable( + route = Routes.Amount.route, + arguments = listOf( + navArgument("action") { + type = NavType.StringType + } + ) + ) { backStackEntry -> + AmountScreen( + action = backStackEntry.arguments?.getString("action").orEmpty(), + onBackClick = { navController.popBackStack() } + ) + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/mob/ustmm/ui/navigation/Routes.kt b/app/src/main/java/com/mob/ustmm/ui/navigation/Routes.kt index b93424b..8e75413 100644 --- a/app/src/main/java/com/mob/ustmm/ui/navigation/Routes.kt +++ b/app/src/main/java/com/mob/ustmm/ui/navigation/Routes.kt @@ -1,5 +1,8 @@ package com.mob.ustmm.ui.navigation -sealed class Routes(val route: String){ - data object Dashboard: Routes("dashboard") -} \ No newline at end of file +sealed class Routes(val route: String) { + data object Dashboard : Routes("dashboard") + data object Amount : Routes("amount/{action}") { + fun createRoute(action: String): String = "amount/$action" + } +} diff --git a/app/src/main/res/drawable/ic_left_arrow.xml b/app/src/main/res/drawable/ic_left_arrow.xml new file mode 100644 index 0000000..ef8fd74 --- /dev/null +++ b/app/src/main/res/drawable/ic_left_arrow.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/ic_sale.xml b/app/src/main/res/drawable/ic_sale.xml new file mode 100644 index 0000000..866c086 --- /dev/null +++ b/app/src/main/res/drawable/ic_sale.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/logo_mob.png b/app/src/main/res/drawable/logo_mob.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9889869f79fd72535e4814080cb0002a90e3f9 GIT binary patch literal 30204 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⁡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