Modified AppBar and add routes

This commit is contained in:
moon 2026-05-13 20:29:37 +06:30
parent 04549321fb
commit 44c0fa20af
6 changed files with 106 additions and 10 deletions

View File

@ -1,7 +1,11 @@
package com.mob.utsmyanmar.ui.components.appbar package com.mob.utsmyanmar.ui.components.appbar
import android.graphics.drawable.Icon import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.* import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
@ -12,8 +16,8 @@ import com.mob.utsmyanmar.ui.theme.White
@Composable @Composable
fun AppBar( fun AppBar(
title: String, title: String,
icon: ImageVector? = null,
onIconClick: (() -> Unit)? = null, onIconClick: (() -> Unit)? = null,
icon: ImageVector
) { ) {
CenterAlignedTopAppBar( CenterAlignedTopAppBar(
title = { title = {
@ -23,19 +27,21 @@ fun AppBar(
fontWeight = FontWeight.SemiBold fontWeight = FontWeight.SemiBold
) )
}, },
navigationIcon = { navigationIcon = {
if (onIconClick != null) { if (icon != null && onIconClick != null) {
IconButton( IconButton(
onClick = onIconClick onClick = onIconClick
) { ) {
Icon( Icon(
imageVector = icon, imageVector = icon,
"Appbar icon", contentDescription = "App bar icon",
tint = White tint = White
) )
} }
} }
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = Primary containerColor = Primary
) )

View File

@ -18,6 +18,7 @@ import com.mob.utsmyanmar.ui.dashboard.DashboardScreen
import com.mob.utsmyanmar.ui.pinpad.PinPadRoute import com.mob.utsmyanmar.ui.pinpad.PinPadRoute
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel
import com.mob.utsmyanmar.ui.print_receipt.PrintReceiptScreen
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultRoute import com.mob.utsmyanmar.ui.transaction_result.TransactionResultRoute
import com.mob.utsmyanmar.viewmodel.CardReaderViewModel import com.mob.utsmyanmar.viewmodel.CardReaderViewModel
import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel
@ -173,8 +174,8 @@ fun AppNavGraph(
} }
}, },
onNavigatePrintReceipt = { onNavigatePrintReceipt = {
navController.navigate(Routes.Dashboard.route) { navController.navigate(Routes.PrintReceipt.route) {
popUpTo(Routes.Dashboard.route) { popUpTo(Routes.TransactionResult.route) {
inclusive = false inclusive = false
} }
launchSingleTop = true launchSingleTop = true
@ -185,5 +186,18 @@ fun AppNavGraph(
onShowPrinterDialog = {} onShowPrinterDialog = {}
) )
} }
composable(Routes.PrintReceipt.route) {
PrintReceiptScreen(
onDone = {
navController.navigate(Routes.Dashboard.route) {
popUpTo(Routes.Dashboard.route) {
inclusive = false
}
launchSingleTop = true
}
}
)
}
} }
} }

View File

@ -9,4 +9,5 @@ sealed class Routes(val route: String) {
data object ProcessingCard : Routes("processing_card") data object ProcessingCard : Routes("processing_card")
data object PinPad : Routes("pin_pad") data object PinPad : Routes("pin_pad")
data object TransactionResult : Routes("transaction_result") data object TransactionResult : Routes("transaction_result")
data object PrintReceipt : Routes("print_receipt")
} }

View File

@ -0,0 +1,63 @@
package com.mob.utsmyanmar.ui.print_receipt
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
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.sp
import com.mob.utsmyanmar.ui.components.appbar.AppBar
@Composable
fun PrintReceiptScreen(
onDone: () -> Unit
) {
Scaffold(
topBar = {
AppBar(title = "Print Receipt")
}
) { paddingValues ->
Column(
modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "Print Receipt",
style = MaterialTheme.typography.titleLarge.copy(
fontSize = 24.sp,
fontWeight = FontWeight.SemiBold
)
)
Button(
modifier = Modifier
.fillMaxWidth()
.padding(top = 24.dp),
onClick = onDone
) {
Text(text = "Back to Dashboard")
}
}
}
}
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun PreviewPrintReceiptScreen() {
PrintReceiptScreen { }
}

View File

@ -27,6 +27,18 @@ fun TransactionResultRoute(
) )
} }
LaunchedEffect(Unit) {
viewModel.uiEvent.collect { event ->
when (event) {
TransactionResultUiEvent.NavigateMain -> onNavigateMain()
TransactionResultUiEvent.NavigatePrintReceipt -> onNavigatePrintReceipt()
is TransactionResultUiEvent.ShowError -> onShowError(event.message)
is TransactionResultUiEvent.ShowSuccess -> onShowSuccess(event.message)
is TransactionResultUiEvent.ShowPrinterDialog -> onShowPrinterDialog(event.message)
}
}
}
TransactionResultScreen( TransactionResultScreen(
state = state, state = state,
onEvent = { onEvent = {

View File

@ -35,7 +35,7 @@ class TransactionResultViewModel @Inject constructor(
companion object { companion object {
private const val TAG = "TransactionResultVM" private const val TAG = "TransactionResultVM"
private const val RESULT_TIMEOUT = 1000L private const val RESULT_TIMEOUT = 3000L
} }
private val _state = MutableStateFlow(TransactionResultState()) private val _state = MutableStateFlow(TransactionResultState())