fix navigation to reset goback

This commit is contained in:
moon 2026-05-13 22:58:28 +06:30
parent 35600bda29
commit ee2f9df351
11 changed files with 136 additions and 60 deletions

View File

@ -12,8 +12,11 @@ fun AmountRoute(
onBack: () -> Unit, onBack: () -> Unit,
onNavigateCardWaiting: () -> Unit onNavigateCardWaiting: () -> Unit
) { ) {
val canGoBack = !action.equals("Sale", ignoreCase = true)
AmountScreen( AmountScreen(
action = action, action = action,
canGoBack = canGoBack,
onBackClick = onBack, onBackClick = onBack,
onCancelClick = onBack, onCancelClick = onBack,
onNextClick = { amount -> onNextClick = { amount ->

View File

@ -1,5 +1,6 @@
package com.mob.utsmyanmar.ui.amount package com.mob.utsmyanmar.ui.amount
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@ -32,10 +33,14 @@ import com.mob.utsmyanmar.R
@Composable @Composable
fun AmountScreen( fun AmountScreen(
action: String, action: String,
canGoBack: Boolean = true,
onBackClick: () -> Unit, onBackClick: () -> Unit,
onCancelClick: () -> Unit = {}, onCancelClick: () -> Unit = {},
onNextClick: (String) -> Unit = {} onNextClick: (String) -> Unit = {}
) { ) {
BackHandler(enabled = canGoBack) {
onBackClick()
}
var amount by remember { var amount by remember {
mutableStateOf("0") mutableStateOf("0")
@ -53,13 +58,15 @@ fun AmountScreen(
) )
}, },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBackClick) { if (canGoBack) {
Icon( IconButton(onClick = onBackClick) {
painter = painterResource(R.drawable.ic_left_arrow), Icon(
contentDescription = "Back", painter = painterResource(R.drawable.ic_left_arrow),
modifier = Modifier.size(24.dp), contentDescription = "Back",
tint = White modifier = Modifier.size(24.dp),
) tint = White
)
}
} }
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
@ -104,31 +111,12 @@ fun AmountScreen(
horizontalArrangement = Arrangement.spacedBy(14.dp) horizontalArrangement = Arrangement.spacedBy(14.dp)
) { ) {
Button(
onClick = onCancelClick,
modifier = Modifier
.weight(1f)
.height(68.dp),
shape = RoundedCornerShape(18.dp),
colors = ButtonDefaults.buttonColors(
containerColor = White,
contentColor = Primary
),
border = ButtonDefaults.outlinedButtonBorder
) {
Text(
text = "Cancel",
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
Button( Button(
onClick = { onClick = {
onNextClick(normalizeAmount(amount)) onNextClick(normalizeAmount(amount))
}, },
modifier = Modifier modifier = Modifier
.weight(1f) .weight(if (canGoBack) 1f else 2f)
.height(68.dp), .height(68.dp),
shape = RoundedCornerShape(18.dp), shape = RoundedCornerShape(18.dp),
colors = ButtonDefaults.buttonColors( colors = ButtonDefaults.buttonColors(
@ -142,6 +130,27 @@ fun AmountScreen(
fontWeight = FontWeight.Bold fontWeight = FontWeight.Bold
) )
} }
if (canGoBack) {
Button(
onClick = onCancelClick,
modifier = Modifier
.weight(1f)
.height(68.dp),
shape = RoundedCornerShape(18.dp),
colors = ButtonDefaults.buttonColors(
containerColor = White,
contentColor = Primary
),
border = ButtonDefaults.outlinedButtonBorder
) {
Text(
text = "Cancel",
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
}
} }
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
@ -356,6 +365,7 @@ private fun AmountScreenPreview() {
AmountScreen( AmountScreen(
action = "Amount", action = "Amount",
canGoBack = true,
onBackClick = {} onBackClick = {}
) )
} }

View File

@ -74,7 +74,7 @@ fun CardWaitingScreen(
} }
} }
BackHandler { BackHandler(enabled = uiState.canGoBack) {
viewModel.onBackPressed() viewModel.onBackPressed()
} }
@ -90,12 +90,14 @@ fun CardWaitingScreen(
) )
}, },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBack) { if (uiState.canGoBack) {
Icon( IconButton(onClick = onBack) {
painter = painterResource(R.drawable.ic_left_arrow), Icon(
contentDescription = "Back", painter = painterResource(R.drawable.ic_left_arrow),
tint = White contentDescription = "Back",
) tint = White
)
}
} }
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(

View File

@ -3,5 +3,6 @@ package com.mob.utsmyanmar.ui.cardwaiting
data class CardWaitingUiState( data class CardWaitingUiState(
val alertMessage: String = "Please insert, tap, or swipe card", val alertMessage: String = "Please insert, tap, or swipe card",
val isLoading: Boolean = false, val isLoading: Boolean = false,
val isFallback: Boolean = false val isFallback: Boolean = false,
val canGoBack: Boolean = true
) )

View File

@ -61,6 +61,11 @@ class CardWaitingViewModel(
retryCounter = 0 retryCounter = 0
fallbackCounter = SystemParamsOperation.getInstance().fallbackCounter fallbackCounter = SystemParamsOperation.getInstance().fallbackCounter
fallbackEnabled = SystemParamsOperation.getInstance().fallbackEnabled fallbackEnabled = SystemParamsOperation.getInstance().fallbackEnabled
val isSaleTransaction = sharedViewModel.transactionsType.value == TransactionsType.SALE
_uiState.update {
it.copy(canGoBack = !isSaleTransaction)
}
if (sharedViewModel.transactionsType.value == TransactionsType.REFUND) { if (sharedViewModel.transactionsType.value == TransactionsType.REFUND) {
sharedViewModel.enableCardStatusIcon(false, false, false, false) sharedViewModel.enableCardStatusIcon(false, false, false, false)

View File

@ -40,7 +40,12 @@ fun AppNavGraph(
composable(Routes.Dashboard.route) { composable(Routes.Dashboard.route) {
DashboardRoute( DashboardRoute(
onNavigateAmount = { action -> onNavigateAmount = { action ->
navController.navigate(Routes.Amount.createRoute(action)) navController.navigate(Routes.Amount.createRoute(action)) {
popUpTo(Routes.Dashboard.route) {
inclusive = false
}
launchSingleTop = true
}
}, },
settlementEnabled = true, settlementEnabled = true,
wavePayEnabled = true wavePayEnabled = true
@ -61,7 +66,14 @@ fun AppNavGraph(
action = backStackEntry.arguments?.getString("action").orEmpty(), action = backStackEntry.arguments?.getString("action").orEmpty(),
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,
onBack = { navController.popBackStack() }, onBack = { navController.popBackStack() },
onNavigateCardWaiting = { navController.navigate(Routes.CardWaiting.route) } onNavigateCardWaiting = {
navController.navigate(Routes.CardWaiting.route) {
popUpTo(Routes.Amount.route) {
inclusive = true
}
launchSingleTop = true
}
}
) )
} }
@ -79,7 +91,12 @@ fun AppNavGraph(
viewModel = cardWaitingViewModel, viewModel = cardWaitingViewModel,
onManualEntry = {}, onManualEntry = {},
onProcessingCard = { onProcessingCard = {
navController.navigate(Routes.ProcessingCard.route) navController.navigate(Routes.ProcessingCard.route) {
popUpTo(Routes.CardWaiting.route) {
inclusive = true
}
launchSingleTop = true
}
}, },
onTimeout = { navController.popBackStack() }, onTimeout = { navController.popBackStack() },
onBack = { navController.popBackStack() }, onBack = { navController.popBackStack() },
@ -113,7 +130,12 @@ fun AppNavGraph(
ProcessingCardRoute( ProcessingCardRoute(
viewModel = processingCardViewModel, viewModel = processingCardViewModel,
onNavigatePinPad = { onNavigatePinPad = {
navController.navigate(Routes.PinPad.route) navController.navigate(Routes.PinPad.route) {
popUpTo(Routes.ProcessingCard.route) {
inclusive = true
}
launchSingleTop = true
}
}, },
onNavigateInputAmount = { navController.popBackStack(Routes.Amount.route, false) }, onNavigateInputAmount = { navController.popBackStack(Routes.Amount.route, false) },
onNavigateProcessing = {}, onNavigateProcessing = {},
@ -135,8 +157,8 @@ fun AppNavGraph(
transProcessViewModel = transProcessViewModel, transProcessViewModel = transProcessViewModel,
onNavigateTransactionResult = { onNavigateTransactionResult = {
navController.navigate(Routes.TransactionResult.route) { navController.navigate(Routes.TransactionResult.route) {
popUpTo(Routes.Dashboard.route) { popUpTo(Routes.PinPad.route) {
inclusive = false inclusive = true
} }
launchSingleTop = true launchSingleTop = true
} }

View File

@ -1,5 +1,6 @@
package com.mob.utsmyanmar.ui.pinpad package com.mob.utsmyanmar.ui.pinpad
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -9,6 +10,7 @@ import com.mob.utsmyanmar.model.PinPadStatus
import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import com.utsmyanmar.paylibs.Constant import com.utsmyanmar.paylibs.Constant
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
@Composable @Composable
fun PinPadRoute( fun PinPadRoute(
@ -21,6 +23,11 @@ fun PinPadRoute(
val pinText by pinPadViewModel.pinText.collectAsStateWithLifecycle() val pinText by pinPadViewModel.pinText.collectAsStateWithLifecycle()
val alertMsg by pinPadViewModel.alertMsg.collectAsStateWithLifecycle() val alertMsg by pinPadViewModel.alertMsg.collectAsStateWithLifecycle()
val pinStatus by pinPadViewModel.pinStatus.collectAsStateWithLifecycle() val pinStatus by pinPadViewModel.pinStatus.collectAsStateWithLifecycle()
val canGoBack = sharedViewModel.transactionsType.value != TransactionsType.SALE
BackHandler(enabled = canGoBack) {
onBack()
}
LaunchedEffect(pinStatus) { LaunchedEffect(pinStatus) {
when (pinStatus) { when (pinStatus) {
@ -52,6 +59,7 @@ fun PinPadRoute(
PinPadScreen( PinPadScreen(
pinText = pinText, pinText = pinText,
alertMessage = alertMsg, alertMessage = alertMsg,
canGoBack = canGoBack,
onBack = onBack, onBack = onBack,
onKeyboardReady = { keyboard -> onKeyboardReady = { keyboard ->
pinPadViewModel.startPinPadProcess(keyboard) pinPadViewModel.startPinPadProcess(keyboard)

View File

@ -42,6 +42,7 @@ import com.utsmyanmar.baselib.ui.CustomPinPadKeyboard
fun PinPadScreen( fun PinPadScreen(
pinText: String, pinText: String,
alertMessage: String?, alertMessage: String?,
canGoBack: Boolean,
onBack: () -> Unit, onBack: () -> Unit,
onKeyboardReady: (CustomPinPadKeyboard) -> Unit onKeyboardReady: (CustomPinPadKeyboard) -> Unit
) { ) {
@ -68,12 +69,14 @@ fun PinPadScreen(
) )
}, },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBack) { if (canGoBack) {
Icon( IconButton(onClick = onBack) {
painter = painterResource(R.drawable.ic_left_arrow), Icon(
contentDescription = "Back", painter = painterResource(R.drawable.ic_left_arrow),
tint = White contentDescription = "Back",
) tint = White
)
}
} }
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
@ -163,7 +166,11 @@ fun PinPadScreen(
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
Text( Text(
text = "Cancel on device or use back to exit.", text = if (canGoBack) {
"Cancel on device or use back to exit."
} else {
"Cancel on device to exit."
},
color = Black, color = Black,
fontSize = 14.sp, fontSize = 14.sp,
textAlign = TextAlign.Center textAlign = TextAlign.Center

View File

@ -1,6 +1,7 @@
package com.mob.utsmyanmar.ui.print_receipt package com.mob.utsmyanmar.ui.print_receipt
import android.util.Log import android.util.Log
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@ -8,7 +9,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
@ -28,13 +28,16 @@ import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.theme.Primary import com.mob.utsmyanmar.ui.theme.Primary
import com.mob.utsmyanmar.ui.theme.White import com.mob.utsmyanmar.ui.theme.White
import com.utsmyanmar.paylibs.print.NewPrintReceipt import com.utsmyanmar.paylibs.print.NewPrintReceipt
import com.utsmyanmar.paylibs.print.PrintReceipt
@Composable @Composable
fun PrintReceiptScreen( fun PrintReceiptScreen(
onPrint: () -> Unit, onPrint: () -> Unit,
onDone: () -> Unit onDone: () -> Unit
) { ) {
BackHandler {
onDone()
}
Scaffold( Scaffold(
topBar = { topBar = {
AppBar(title = "Receipt") AppBar(title = "Receipt")
@ -64,7 +67,7 @@ fun PrintReceiptScreen(
) { ) {
OutlinedButton( OutlinedButton(
onClick = {}, onClick = onDone,
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.height(50.dp), .height(50.dp),
@ -90,11 +93,14 @@ fun PrintReceiptScreen(
disabledContentColor = White, disabledContentColor = White,
), ),
shape = RoundedCornerShape(12.dp), shape = RoundedCornerShape(12.dp),
onClick = { try { onClick = {
NewPrintReceipt.getInstance().testPrint() onPrint()
}catch (e: Exception){ try {
Log.d("PrintReceipt", "error with $e") NewPrintReceipt.getInstance().testPrint()
} } } catch (e: Exception) {
Log.d("PrintReceipt", "error with $e")
}
}
) { ) {
Text( Text(
text = "Print", text = "Print",

View File

@ -7,6 +7,7 @@ import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
@Composable @Composable
fun TransactionResultRoute( fun TransactionResultRoute(
@ -19,6 +20,7 @@ fun TransactionResultRoute(
onShowPrinterDialog: (String) -> Unit onShowPrinterDialog: (String) -> Unit
) { ) {
val state by viewModel.state.collectAsStateWithLifecycle() val state by viewModel.state.collectAsStateWithLifecycle()
val canGoBack = sharedViewModel.transactionsType.value != TransactionsType.SALE
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
viewModel.onEvent( viewModel.onEvent(
@ -41,6 +43,7 @@ fun TransactionResultRoute(
TransactionResultScreen( TransactionResultScreen(
state = state, state = state,
canGoBack = canGoBack,
onEvent = { onEvent = {
viewModel.onEvent(it, sharedViewModel) viewModel.onEvent(it, sharedViewModel)
} }

View File

@ -1,5 +1,6 @@
package com.mob.utsmyanmar.ui.transaction_result package com.mob.utsmyanmar.ui.transaction_result
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -46,14 +47,21 @@ import com.mob.utsmyanmar.ui.theme.White
@Composable @Composable
fun TransactionResultScreen( fun TransactionResultScreen(
state: TransactionResultState, state: TransactionResultState,
canGoBack: Boolean,
onEvent: (TransactionResultEvent) -> Unit, onEvent: (TransactionResultEvent) -> Unit,
) { ) {
BackHandler(enabled = !canGoBack) {}
Scaffold( Scaffold(
topBar = { topBar = {
AppBar( AppBar(
title = "Transaction Results", title = "Transaction Results",
icon = Icons.Default.ChevronLeft, icon = if (canGoBack) Icons.Default.ChevronLeft else null,
onIconClick = { TransactionResultEvent.BackClick } onIconClick = if (canGoBack) {
{ onEvent(TransactionResultEvent.BackClick) }
} else {
null
}
) )
} }
) { paddingValues -> ) { paddingValues ->
@ -254,6 +262,7 @@ fun TransactionResultScreenPreview() {
message = "Transaction Approved", message = "Transaction Approved",
isLoading = false isLoading = false
), ),
canGoBack = true,
onEvent = {} onEvent = {}
) )
} }