Skip to content

Commit e20f6f8

Browse files
committed
feat(feature:send-money): implement upi and non upi scanner navigation
1 parent c7e26d0 commit e20f6f8

File tree

15 files changed

+507
-15
lines changed

15 files changed

+507
-15
lines changed

cmp-android/prodRelease-badging.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package: name='org.mifospay' versionCode='1' versionName='2025.8.3-beta.0.2' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
1+
package: name='org.mifospay' versionCode='1' versionName='2025.8.3-beta.0.3' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15'
22
minSdkVersion:'26'
33
targetSdkVersion:'34'
44
uses-permission: name='android.permission.INTERNET'

cmp-shared/src/commonMain/kotlin/org/mifospay/shared/navigation/MifosNavHost.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,10 @@ import org.mifospay.feature.savedcards.details.navigateToCardDetails
7373
import org.mifospay.feature.send.money.SendMoneyScreen
7474
import org.mifospay.feature.send.money.navigation.SEND_MONEY_BASE_ROUTE
7575
import org.mifospay.feature.send.money.navigation.SEND_MONEY_OPTIONS_ROUTE
76+
import org.mifospay.feature.send.money.navigation.navigateToPayeeDetailsScreen
7677
import org.mifospay.feature.send.money.navigation.navigateToSendMoneyOptionsScreen
7778
import org.mifospay.feature.send.money.navigation.navigateToSendMoneyScreen
79+
import org.mifospay.feature.send.money.navigation.payeeDetailsScreen
7880
import org.mifospay.feature.send.money.navigation.sendMoneyOptionsScreen
7981
import org.mifospay.feature.send.money.navigation.sendMoneyScreen
8082
import org.mifospay.feature.settings.navigation.settingsScreen
@@ -100,6 +102,7 @@ internal fun MifosNavHost(
100102
onBackClick = navController::navigateUp,
101103
navigateToTransferScreen = navController::navigateToTransferScreen,
102104
navigateToScanQrScreen = navController::navigateToScanQr,
105+
navigateToPayeeDetails = navController::navigateToPayeeDetailsScreen,
103106
showTopBar = false,
104107
)
105108
},
@@ -306,14 +309,28 @@ internal fun MifosNavHost(
306309
},
307310
)
308311
},
312+
onNavigateToPayeeDetails = { qrCodeData ->
313+
navController.navigateToPayeeDetailsScreen(qrCodeData)
314+
},
309315
)
310316

311317
sendMoneyScreen(
312318
onBackClick = navController::popBackStack,
313319
navigateToTransferScreen = navController::navigateToTransferScreen,
320+
navigateToPayeeDetailsScreen = navController::navigateToPayeeDetailsScreen,
314321
navigateToScanQrScreen = navController::navigateToScanQr,
315322
)
316323

324+
payeeDetailsScreen(
325+
onBackClick = navController::popBackStack,
326+
onNavigateToUpiPayment = { state ->
327+
// TODO: Handle UPI payment navigation
328+
},
329+
onNavigateToFineractPayment = { state ->
330+
// TODO: Handle Fineract payment navigation
331+
},
332+
)
333+
317334
transferScreen(
318335
navigateBack = navController::popBackStack,
319336
onTransferSuccess = {
@@ -351,6 +368,16 @@ internal fun MifosNavHost(
351368
},
352369
)
353370
},
371+
navigateToPayeeDetailsScreen = {
372+
navController.navigateToPayeeDetailsScreen(
373+
qrCodeData = it,
374+
navOptions = navOptions {
375+
popUpTo(SCAN_QR_ROUTE) {
376+
inclusive = true
377+
}
378+
},
379+
)
380+
},
354381
)
355382

356383
merchantTransferScreen(

core/designsystem/src/commonMain/kotlin/org/mifospay/core/designsystem/icon/MifosIcons.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.compose.material.icons.filled.ChevronLeft
2222
import androidx.compose.material.icons.filled.ChevronRight
2323
import androidx.compose.material.icons.filled.Close
2424
import androidx.compose.material.icons.filled.ContentCopy
25+
import androidx.compose.material.icons.filled.CurrencyRupee
2526
import androidx.compose.material.icons.filled.Delete
2627
import androidx.compose.material.icons.filled.Description
2728
import androidx.compose.material.icons.filled.Edit
@@ -129,4 +130,5 @@ object MifosIcons {
129130
val Scan = Icons.Outlined.QrCodeScanner
130131
val RadioButtonUnchecked = Icons.Default.RadioButtonUnchecked
131132
val RadioButtonChecked = Icons.Filled.RadioButtonChecked
133+
val Currency = Icons.Filled.CurrencyRupee
132134
}

feature/qr/src/commonMain/kotlin/org/mifospay/feature/qr/ScanQrCodeScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import org.mifospay.core.designsystem.component.MifosScaffold
3030
internal fun ScanQrCodeScreen(
3131
navigateBack: () -> Unit,
3232
navigateToSendScreen: (String) -> Unit,
33+
navigateToPayeeDetailsScreen: (String) -> Unit,
3334
modifier: Modifier = Modifier,
3435
viewModel: ScanQrViewModel = koinViewModel(),
3536
) {
@@ -44,6 +45,10 @@ internal fun ScanQrCodeScreen(
4445
navigateToSendScreen.invoke((eventFlow as ScanQrEvent.OnNavigateToSendScreen).data)
4546
}
4647

48+
is ScanQrEvent.OnNavigateToPayeeDetails -> {
49+
navigateToPayeeDetailsScreen.invoke((eventFlow as ScanQrEvent.OnNavigateToPayeeDetails).data)
50+
}
51+
4752
is ScanQrEvent.ShowToast -> {
4853
scope.launch {
4954
snackbarHostState.showSnackbar((eventFlow as ScanQrEvent.ShowToast).message)

feature/qr/src/commonMain/kotlin/org/mifospay/feature/qr/ScanQrViewModel.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,24 @@ class ScanQrViewModel : ViewModel() {
2323

2424
fun onScanned(data: String): Boolean {
2525
return try {
26-
try {
26+
val isUpiQr = try {
2727
UpiQrCodeProcessor.decodeUpiString(data)
28+
true
2829
} catch (e: Exception) {
2930
if (StandardUpiQrCodeProcessor.isValidUpiQrCode(data)) {
3031
StandardUpiQrCodeProcessor.parseUpiQrCode(data)
32+
true
3133
} else {
32-
throw e
34+
false
3335
}
3436
}
3537

3638
_eventFlow.update {
37-
ScanQrEvent.OnNavigateToSendScreen(data)
39+
if (isUpiQr) {
40+
ScanQrEvent.OnNavigateToPayeeDetails(data)
41+
} else {
42+
ScanQrEvent.OnNavigateToSendScreen(data)
43+
}
3844
}
3945

4046
true
@@ -49,5 +55,6 @@ class ScanQrViewModel : ViewModel() {
4955

5056
sealed interface ScanQrEvent {
5157
data class OnNavigateToSendScreen(val data: String) : ScanQrEvent
58+
data class OnNavigateToPayeeDetails(val data: String) : ScanQrEvent
5259
data class ShowToast(val message: String) : ScanQrEvent
5360
}

feature/qr/src/commonMain/kotlin/org/mifospay/feature/qr/navigation/ReadQrNavigation.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ fun NavController.navigateToScanQr(navOptions: NavOptions? = null) =
2323
fun NavGraphBuilder.scanQrScreen(
2424
navigateBack: () -> Unit,
2525
navigateToSendScreen: (String) -> Unit,
26+
navigateToPayeeDetailsScreen: (String) -> Unit,
2627
) {
2728
composableWithSlideTransitions(route = SCAN_QR_ROUTE) {
2829
ScanQrCodeScreen(
2930
navigateBack = navigateBack,
3031
navigateToSendScreen = navigateToSendScreen,
32+
navigateToPayeeDetailsScreen = navigateToPayeeDetailsScreen,
3133
)
3234
}
3335
}

feature/send-money/src/androidMain/kotlin/org/mifospay/feature/send/money/QrScanner.android.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ class QrScannerImp(
3939
override fun startScanning(): Flow<String?> {
4040
return callbackFlow {
4141
scanner.startScan()
42-
.addOnSuccessListener {
42+
.addOnSuccessListener { barcode ->
4343
launch {
44-
send(it.rawValue)
44+
val rawValue = barcode.rawValue
45+
send(rawValue)
4546
}
46-
}.addOnFailureListener {
47+
}.addOnFailureListener { exception ->
4748
launch {
4849
send(null)
4950
}

0 commit comments

Comments
 (0)