Files
coop-mobile/composeApp/src/androidMain/kotlin/su/reya/coop/screens/ScanScreen.kt
T

101 lines
3.9 KiB
Kotlin

package su.reya.coop.screens
import android.annotation.SuppressLint
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.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.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import coop.composeapp.generated.resources.Res
import coop.composeapp.generated.resources.ic_arrow_back
import org.jetbrains.compose.resources.painterResource
import org.publicvalue.multiplatform.qrcode.CameraPosition
import org.publicvalue.multiplatform.qrcode.CodeType
import org.publicvalue.multiplatform.qrcode.ScannerWithPermissions
import su.reya.coop.LocalNavigator
import su.reya.coop.LocalScanResult
import su.reya.coop.LocalSnackbarHostState
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun ScanScreen() {
val navigator = LocalNavigator.current
val snackbarHostState = LocalSnackbarHostState.current
val qrScanResult = LocalScanResult.current
Scaffold(
snackbarHost = { SnackbarHost(snackbarHostState) },
topBar = {
CenterAlignedTopAppBar(
title = {
Text(
text = "Scan a Nostr Address",
style = MaterialTheme.typography.titleMediumEmphasized
)
},
navigationIcon = {
IconButton(onClick = { navigator.goBack() }) {
Icon(
painter = painterResource(Res.drawable.ic_arrow_back),
contentDescription = "Back"
)
}
},
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Transparent,
titleContentColor = Color.White,
navigationIconContentColor = Color.White,
)
)
},
) { innerPadding ->
Box(modifier = Modifier.fillMaxSize()) {
ScannerWithPermissions(
modifier = Modifier.fillMaxSize(),
onScanned = {
qrScanResult.content = it
navigator.goBack()
true
},
types = listOf(CodeType.QR),
cameraPosition = CameraPosition.BACK,
enableTorch = false
)
Canvas(modifier = Modifier.fillMaxSize()) {
val scannerSize = 250.dp.toPx()
val left = (size.width - scannerSize) / 2
val top = (size.height - scannerSize) / 2
drawRect(color = Color.Black.copy(alpha = 0.6f))
drawRect(
color = Color.Transparent,
topLeft = Offset(left, top),
size = Size(scannerSize, scannerSize),
blendMode = BlendMode.Clear
)
}
Box(
modifier = Modifier
.size(250.dp)
.align(Alignment.Center)
.border(2.dp, Color.White, RoundedCornerShape(12.dp))
)
}
}
}