From 8c35134bba2f3c5c95ce667596797a6c078a866b Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Fri, 26 Jun 2026 20:54:15 +0700 Subject: [PATCH 1/2] improve error handling for qr scanner --- .../kotlin/su/reya/coop/screens/ImportScreen.kt | 11 ++++++----- .../kotlin/su/reya/coop/screens/NewChatScreen.kt | 15 +++++++-------- .../kotlin/su/reya/coop/screens/ScanScreen.kt | 6 +++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ImportScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ImportScreen.kt index 336f727..bb29514 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ImportScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ImportScreen.kt @@ -94,17 +94,18 @@ fun ImportScreen() { LaunchedEffect(qrScanResult.content) { qrScanResult.content?.let { result -> runCatching { - if (result.startsWith("nsec")) { + if (result.startsWith("nsec1")) { Keys.parse(result) } else if (result.startsWith("bunker://")) { NostrConnectUri.parse(result) } else { - throw IllegalArgumentException("Invalid secret: $result") + throw IllegalArgumentException("Unsupported secret format") } + }.onSuccess { + secret = result + }.onFailure { e -> + snackbarHostState.showSnackbar("Invalid secret: ${e.message}") } - .onSuccess { it -> secret = result } - .onFailure { e -> println("Failed to parse QR: ${e.message}") } - // Clear the nav state qrScanResult.clear() } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/NewChatScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/NewChatScreen.kt index 13426bd..59b1e16 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/NewChatScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/NewChatScreen.kt @@ -109,14 +109,13 @@ fun NewChatScreen() { LaunchedEffect(qrScanResult.content) { qrScanResult.content?.let { result -> // Verify the content - runCatching { PublicKey.parse(result) } - .onSuccess { pubkey -> - selectedReceivers.add(pubkey) - } - .onFailure { e -> - println("Failed to parse QR: ${e.message}") - } - + runCatching { + PublicKey.parse(result) + }.onSuccess { pubkey -> + selectedReceivers.add(pubkey) + }.onFailure { e -> + snackbarHostState.showSnackbar("Invalid address: ${e.message}") + } // Clear the nav state qrScanResult.clear() } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt index c785a1d..08761d2 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt @@ -98,12 +98,12 @@ fun ScanScreen() { .border(2.dp, Color.White, RoundedCornerShape(12.dp)) ) Text( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(bottom = 64.dp), text = "Scan a Nostr address", style = MaterialTheme.typography.titleSmallEmphasized, color = Color.White, - modifier = Modifier - .align(Alignment.BottomCenter) - .padding(bottom = 64.dp) ) } } -- 2.49.1 From 934a268bb460123ddfd356b0da865f1593af57f5 Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Sat, 27 Jun 2026 08:10:26 +0700 Subject: [PATCH 2/2] update scan screen --- .../kotlin/su/reya/coop/screens/ScanScreen.kt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt index 08761d2..bac50b3 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt @@ -5,16 +5,15 @@ import androidx.compose.foundation.Canvas import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -44,10 +43,10 @@ fun ScanScreen() { Scaffold( snackbarHost = { SnackbarHost(snackbarHostState) }, topBar = { - TopAppBar( + CenterAlignedTopAppBar( title = { Text( - text = "Scan QR", + text = "Scan a Nostr Address", style = MaterialTheme.typography.titleMediumEmphasized ) }, @@ -97,14 +96,6 @@ fun ScanScreen() { .align(Alignment.Center) .border(2.dp, Color.White, RoundedCornerShape(12.dp)) ) - Text( - modifier = Modifier - .align(Alignment.BottomCenter) - .padding(bottom = 64.dp), - text = "Scan a Nostr address", - style = MaterialTheme.typography.titleSmallEmphasized, - color = Color.White, - ) } } } \ No newline at end of file -- 2.49.1