From e775d799ea305f016d9c4f95777cc0da3a6d8e2a Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Fri, 22 May 2026 09:12:40 +0700 Subject: [PATCH] add my qr screen --- composeApp/build.gradle.kts | 1 + .../composeResources/drawable/ic_qr.xml | 9 +++ .../androidMain/kotlin/su/reya/coop/App.kt | 6 ++ .../kotlin/su/reya/coop/Navigation.kt | 3 + .../kotlin/su/reya/coop/screens/HomeScreen.kt | 21 +++++- .../kotlin/su/reya/coop/screens/MyQrScreen.kt | 68 +++++++++++++++++++ .../kotlin/su/reya/coop/screens/ScanScreen.kt | 3 +- 7 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 composeApp/src/androidMain/composeResources/drawable/ic_qr.xml create mode 100644 composeApp/src/androidMain/kotlin/su/reya/coop/screens/MyQrScreen.kt diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index dc58cbf..954b656 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -28,6 +28,7 @@ kotlin { implementation("su.reya:nostr-sdk-kmp:0.2.3") implementation("io.github.kalinjul.easyqrscan:scanner:0.7.0") implementation("androidx.lifecycle:lifecycle-process:2.8.0") + implementation("io.github.alexzhirkevich:qrose:1.1.2") } commonMain.dependencies { implementation(libs.compose.runtime) diff --git a/composeApp/src/androidMain/composeResources/drawable/ic_qr.xml b/composeApp/src/androidMain/composeResources/drawable/ic_qr.xml new file mode 100644 index 0000000..221ce6e --- /dev/null +++ b/composeApp/src/androidMain/composeResources/drawable/ic_qr.xml @@ -0,0 +1,9 @@ + + + diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt index 9d505f3..3dc0cc9 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/App.kt @@ -48,6 +48,7 @@ import su.reya.coop.coop.storage.SecretStore import su.reya.coop.screens.ChatScreen import su.reya.coop.screens.HomeScreen import su.reya.coop.screens.ImportScreen +import su.reya.coop.screens.MyQrScreen import su.reya.coop.screens.NewChatScreen import su.reya.coop.screens.NewIdentityScreen import su.reya.coop.screens.OnboardingScreen @@ -236,6 +237,11 @@ fun App() { onBack = { navController.popBackStack() }, ) } + composable { backStackEntry -> + MyQrScreen( + onBack = { navController.popBackStack() }, + ) + } } } } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt index 676eb7d..15bf958 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/Navigation.kt @@ -23,4 +23,7 @@ sealed interface Screen { @Serializable data object Scan : Screen + + @Serializable + data object MyQr : Screen } diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt index a05de92..4f26a3e 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.FilledIconButton import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -64,6 +65,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import coop.composeapp.generated.resources.Res import coop.composeapp.generated.resources.ic_new_chat +import coop.composeapp.generated.resources.ic_qr import coop.composeapp.generated.resources.ic_scanner import kotlinx.coroutines.launch import org.jetbrains.compose.resources.painterResource @@ -304,8 +306,8 @@ fun HomeScreen( ) } Spacer(modifier = Modifier.size(8.dp)) - Box( - contentAlignment = Alignment.Center + Row( + verticalAlignment = Alignment.CenterVertically, ) { OutlinedButton( onClick = { @@ -320,6 +322,21 @@ fun HomeScreen( ) { Text(text = shortPubkey) } + FilledIconButton( + onClick = { + scope.launch { + sheetState.hide() + showBottomSheet = false + navController.navigate(Screen.MyQr) + } + }, + shape = MaterialShapes.Square.toShape() + ) { + Icon( + painter = painterResource(Res.drawable.ic_qr), + contentDescription = "My QR" + ) + } } } Spacer(modifier = Modifier.size(16.dp)) diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/MyQrScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/MyQrScreen.kt new file mode 100644 index 0000000..e8cd521 --- /dev/null +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/MyQrScreen.kt @@ -0,0 +1,68 @@ +package su.reya.coop.screens + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +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.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import coop.composeapp.generated.resources.Res +import coop.composeapp.generated.resources.ic_arrow_back +import io.github.alexzhirkevich.qrose.rememberQrCodePainter +import org.jetbrains.compose.resources.painterResource +import su.reya.coop.LocalNostrViewModel +import su.reya.coop.LocalSnackbarHostState + +@Composable +fun MyQrScreen( + onBack: () -> Unit +) { + val snackbarHostState = LocalSnackbarHostState.current + val viewModel = LocalNostrViewModel.current + val currentUser = viewModel.currentUser() ?: return + + Scaffold( + snackbarHost = { SnackbarHost(snackbarHostState) }, + topBar = { + TopAppBar( + title = { + Text( + text = "My QR", + style = MaterialTheme.typography.titleMediumEmphasized + ) + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + painter = painterResource(Res.drawable.ic_arrow_back), + contentDescription = "Back" + ) + } + } + ) + }, + content = { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Image( + painter = rememberQrCodePainter(currentUser.toBech32()), + contentDescription = "My QR" + ) + } + } + ) +} \ No newline at end of file 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 1386c22..b351b02 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt @@ -52,7 +52,8 @@ fun ScanScreen( TopAppBar( title = { Text( - text = "Scan QR", style = MaterialTheme.typography.titleMediumEmphasized + text = "Scan QR", + style = MaterialTheme.typography.titleMediumEmphasized ) }, navigationIcon = {