diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/OnboardingScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/OnboardingScreen.kt index 0c53b94..652cfca 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/OnboardingScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/OnboardingScreen.kt @@ -1,5 +1,7 @@ package su.reya.coop.screens +import android.content.Context +import android.content.Intent import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -13,13 +15,16 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarResult import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size @@ -27,6 +32,7 @@ import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.drawscope.rotate import androidx.compose.ui.graphics.drawscope.translate import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles @@ -34,10 +40,13 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.core.net.toUri import coop.composeapp.generated.resources.Res import coop.composeapp.generated.resources.coop +import kotlinx.coroutines.launch import org.jetbrains.compose.resources.painterResource import su.reya.coop.LocalNavigator +import su.reya.coop.LocalNostrViewModel import su.reya.coop.LocalSnackbarHostState import su.reya.coop.Screen import su.reya.coop.shared.getExpressiveFontFamily @@ -45,8 +54,11 @@ import su.reya.coop.shared.getExpressiveFontFamily @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun OnboardingScreen() { + val context = LocalContext.current val snackbarHostState = LocalSnackbarHostState.current val navigator = LocalNavigator.current + val viewModel = LocalNostrViewModel.current + val scope = rememberCoroutineScope() val logoPainter = painterResource(Res.drawable.coop) val expressiveFont = getExpressiveFontFamily() @@ -142,7 +154,38 @@ fun OnboardingScreen() { ) } Spacer(modifier = Modifier.size(8.dp)) - OutlinedButton( + FilledTonalButton( + onClick = { + scope.launch { + if (isExternalSignerInstalled(context)) { + viewModel.importIdentity("external") + } else { + val result = snackbarHostState.showSnackbar( + message = "External signer not installed. Please install Amber or alternatives.", + actionLabel = "Install" + ) + + if (result == SnackbarResult.ActionPerformed) { + val intent = Intent( + Intent.ACTION_VIEW, + "https://zapstore.dev/apps/com.greenart7c3.nostrsigner".toUri() + ) + context.startActivity(intent) + } + } + } + }, + modifier = Modifier + .fillMaxWidth() + .size(ButtonDefaults.MediumContainerHeight), + ) { + Text( + text = "Connect via Amber", + style = MaterialTheme.typography.titleMedium, + ) + } + Spacer(modifier = Modifier.size(8.dp)) + TextButton( onClick = { navigator.navigate(Screen.Import) }, modifier = Modifier .fillMaxWidth() @@ -216,3 +259,8 @@ fun LogoRepeatingBackground( } } } + +fun isExternalSignerInstalled(context: Context): Boolean { + val intent = Intent(Intent.ACTION_VIEW, "nostrsigner:".toUri()) + return context.packageManager.queryIntentActivities(intent, 0).isNotEmpty() +} diff --git a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt index c132ec1..961bd6e 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt @@ -483,10 +483,10 @@ class NostrViewModel( try { val signer = createSigner(secret) nostr.setSigner(signer) - secretStore.set("user_signer", secret) } catch (e: Exception) { showError("Error: ${e.message}") } finally { + secretStore.set("user_signer", secret) _signerRequired.value = false _isLoggedIn.value = false }