Node.js

Erstellen der mobilen Benutzeroberfläche

Aufbau der Hauptaktivität

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent { VerifyApp() }
    }
}

@Composable
fun VerifyApp() {
    MaterialTheme {
        Surface(modifier = Modifier.fillMaxSize()) {
            VerificationScreen()
        }
    }
}
  • ComponentActivity: Die Basisklasse für Aktivitäten, die Jetpack Compose verwenden.
  • setContent: Legt den UI-Inhalt mit Compose fest.
  • MaterialTheme und Surface: Umhüllen Sie die Benutzeroberfläche in eine Material-Design-Oberfläche für Konsistenz.

Zusammensetzbare Funktion für Verifizierungsbildschirm

@Composable
fun VerificationScreen() {
    var phone by remember { mutableStateOf("") }
    var code by remember { mutableStateOf("") }
    var message by remember { mutableStateOf("") }
    var isLoading by remember { mutableStateOf(false) }
    var fallbackToSms by remember { mutableStateOf(false) }
    val coroutineScope = rememberCoroutineScope()

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        OutlinedTextField(
            value = phone,
            onValueChange = { phone = it },
            label = { Text("Phone Number") },
            keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Phone),
            modifier = Modifier.fillMaxWidth()
        )
  • remember: Ermöglicht es uns, den Zustand über mehrere Zusammensetzungen hinweg zu speichern.
  • coroutineScope: Startet asynchrone Operationen ohne Blockierung der Benutzeroberfläche.
  • OutlinedTextField: Eingabefeld zur Eingabe der Telefonnummer.

Ladeanzeige und Taste

        if (isLoading) {
            CircularProgressIndicator()
        } else {
            Button(onClick = {
                coroutineScope.launch {
                    isLoading = true
                    message = "Starting verification..."
                    try {
                        val (requestId, authUrl) = startVerification(phone)
                        currentRequestId = requestId
                        message = "Verification started!"
                    } catch (e: Exception) {
                        message = "Error: ${e.message}"
                    } finally {
                        isLoading = false
                    }
                }
            }) {
                Text("Start Verification")
            }
        }

        Spacer(modifier = Modifier.height(16.dp))

        Text(text = message)
    }
}
  • CircularProgressIndicator: Zeigt einen Ladekreisel an, während auf die Antwort gewartet wird.
  • Button: Startet den Verifizierungsprozess.
  • Text: Zeigt Statusmeldungen für den Benutzer an.