Skip to content

Commit 5df1906

Browse files
committed
refactor: extract BiometricsView component
1 parent ec629c4 commit 5df1906

File tree

3 files changed

+75
-25
lines changed

3 files changed

+75
-25
lines changed

app/src/main/java/to/bitkit/ui/components/AuthCheckView.kt

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,60 @@ package to.bitkit.ui.components
22

33
import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.Column
5-
import androidx.compose.foundation.layout.Spacer
65
import androidx.compose.foundation.layout.fillMaxSize
7-
import androidx.compose.foundation.layout.height
86
import androidx.compose.foundation.layout.padding
9-
import androidx.compose.foundation.layout.size
10-
import androidx.compose.material3.Icon
117
import androidx.compose.runtime.Composable
128
import androidx.compose.runtime.getValue
139
import androidx.compose.runtime.mutableStateOf
1410
import androidx.compose.runtime.saveable.rememberSaveable
1511
import androidx.compose.runtime.setValue
1612
import androidx.compose.ui.Alignment
1713
import androidx.compose.ui.Modifier
18-
import androidx.compose.ui.res.painterResource
1914
import androidx.compose.ui.res.stringResource
2015
import androidx.compose.ui.tooling.preview.Preview
2116
import androidx.compose.ui.unit.dp
17+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
2218
import to.bitkit.R
19+
import to.bitkit.ui.appViewModel
2320
import to.bitkit.ui.theme.AppThemeSurface
24-
import to.bitkit.ui.utils.BiometricPrompt
2521
import to.bitkit.ui.utils.rememberBiometricAuthSupported
2622

2723
@Composable
2824
fun AuthCheckView(
2925
onSuccess: (() -> Unit)? = null,
3026
isBiometrySupported: Boolean = rememberBiometricAuthSupported(),
3127
) {
28+
val app = appViewModel ?: return
29+
val isBiometricsEnabled by app.isBiometricEnabled.collectAsStateWithLifecycle()
30+
31+
AuthCheckViewContent(
32+
onSuccess = onSuccess,
33+
isBiometricsEnabled = isBiometricsEnabled,
34+
isBiometrySupported = isBiometrySupported,
35+
)
36+
}
37+
38+
@Composable
39+
private fun AuthCheckViewContent(
40+
onSuccess: (() -> Unit)? = null,
41+
isBiometricsEnabled: Boolean,
42+
isBiometrySupported: Boolean,
43+
) {
44+
var showBio by rememberSaveable { mutableStateOf(isBiometricsEnabled) }
45+
3246
Box(
3347
contentAlignment = Alignment.Center,
3448
modifier = Modifier.fillMaxSize()
3549
) {
3650
Column(
3751
horizontalAlignment = Alignment.CenterHorizontally,
3852
) {
39-
var showBio by rememberSaveable { mutableStateOf(true) }
4053

4154
if (showBio && isBiometrySupported) {
42-
BiometricPrompt(
55+
BiometricsView(
4356
onSuccess = { onSuccess?.invoke() },
44-
onError = { showBio = false },
45-
)
46-
47-
val subtitleText = let {
48-
val biometricsName = stringResource(R.string.security__bio)
49-
stringResource(R.string.security__bio_auth_with).replace("{biometricsName}", biometricsName)
50-
}
51-
Icon(
52-
painter = painterResource(R.drawable.ic_fingerprint),
53-
contentDescription = null,
54-
modifier = Modifier.size(64.dp),
57+
onFailure = { showBio = false },
5558
)
56-
Spacer(modifier = Modifier.height(16.dp))
57-
Subtitle(text = subtitleText)
5859
} else {
5960
Subtitle(text = "TODO: Pin code auth")
6061
PrimaryButton(
@@ -68,12 +69,25 @@ fun AuthCheckView(
6869
}
6970
}
7071

71-
@Preview
72+
@Preview(showBackground = true)
73+
@Composable
74+
private fun PreviewBio() {
75+
AppThemeSurface {
76+
AuthCheckViewContent(
77+
onSuccess = {},
78+
isBiometricsEnabled = true,
79+
isBiometrySupported = true,
80+
)
81+
}
82+
}
83+
84+
@Preview(showBackground = true)
7285
@Composable
73-
fun AuthCheckPreview() {
86+
private fun PreviewPin() {
7487
AppThemeSurface {
75-
AuthCheckView(
88+
AuthCheckViewContent(
7689
onSuccess = {},
90+
isBiometricsEnabled = false,
7791
isBiometrySupported = true,
7892
)
7993
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package to.bitkit.ui.components
2+
3+
import androidx.compose.foundation.layout.Spacer
4+
import androidx.compose.foundation.layout.height
5+
import androidx.compose.foundation.layout.size
6+
import androidx.compose.material3.Icon
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.res.painterResource
10+
import androidx.compose.ui.res.stringResource
11+
import androidx.compose.ui.unit.dp
12+
import to.bitkit.R
13+
import to.bitkit.ui.utils.BiometricPrompt
14+
15+
@Composable
16+
fun BiometricsView(
17+
onSuccess: (() -> Unit)? = null,
18+
onFailure: (() -> Unit)? = null,
19+
) {
20+
BiometricPrompt(
21+
onSuccess = { onSuccess?.invoke() },
22+
onError = { onFailure?.invoke() },
23+
)
24+
Icon(
25+
painter = painterResource(R.drawable.ic_fingerprint),
26+
contentDescription = null,
27+
modifier = Modifier.Companion.size(64.dp),
28+
)
29+
Spacer(modifier = Modifier.Companion.height(16.dp))
30+
Subtitle(
31+
text = run {
32+
val biometricsName = stringResource(R.string.security__bio)
33+
stringResource(R.string.security__bio_auth_with).replace("{biometricsName}", biometricsName)
34+
}
35+
)
36+
}

app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class AppViewModel @Inject constructor(
125125
}
126126

127127
val isBiometricEnabled: StateFlow<Boolean> = settingsStore.isBiometricEnabled
128-
.stateIn(viewModelScope, SharingStarted.Lazily, false)
128+
.stateIn(viewModelScope, SharingStarted.Eagerly, false)
129129

130130
fun setIsBiometricEnabled(value: Boolean) {
131131
viewModelScope.launch {

0 commit comments

Comments
 (0)