forked from reya/coop-mobile
101 lines
3.9 KiB
Kotlin
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))
|
|
)
|
|
}
|
|
}
|
|
} |