amethyst/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/QrCodeScanner.kt

60 wiersze
1.9 KiB
Kotlin

package com.vitorpamplona.amethyst.ui.qrcode
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import com.google.zxing.client.android.Intents
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.nip19.Nip19
@Composable
fun QrCodeScanner(onScan: (String?) -> Unit) {
val lifecycleOwner = LocalLifecycleOwner.current
val parseQrResult = { it: String ->
try {
val nip19 = Nip19.uriToRoute(it)
val startingPage = when (nip19?.type) {
Nip19.Type.USER -> "User/${nip19.hex}"
Nip19.Type.NOTE -> "Note/${nip19.hex}"
else -> null
}
if (startingPage != null) {
onScan(startingPage)
} else {
onScan(null)
}
} catch (e: Throwable) {
// QR can be anything, do not throw errors.
onScan(null)
}
}
val qrLauncher =
rememberLauncherForActivityResult(ScanContract()) {
if (it.contents != null) {
parseQrResult(it.contents)
} else {
onScan(null)
}
}
val scanOptions = ScanOptions().apply {
setDesiredBarcodeFormats(ScanOptions.QR_CODE)
setPrompt(stringResource(id = R.string.point_to_the_qr_code))
setBeepEnabled(false)
setOrientationLocked(false)
addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN)
}
DisposableEffect(lifecycleOwner) {
qrLauncher.launch(scanOptions)
onDispose { }
}
}