Skip to content

Commit bebae48

Browse files
committed
refactor: Confirm Pin screen
1 parent a2aaa0c commit bebae48

File tree

2 files changed

+80
-40
lines changed

2 files changed

+80
-40
lines changed

app/src/main/java/to/bitkit/ui/settings/pin/ConfirmPinScreen.kt

Lines changed: 79 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package to.bitkit.ui.settings.pin
22

3+
import androidx.compose.animation.AnimatedVisibility
34
import androidx.compose.foundation.background
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.Spacer
@@ -21,6 +22,7 @@ import androidx.compose.ui.unit.dp
2122
import kotlinx.coroutines.delay
2223
import to.bitkit.R
2324
import to.bitkit.env.Env
25+
import to.bitkit.ui.appViewModel
2426
import to.bitkit.ui.components.BodyM
2527
import to.bitkit.ui.components.BodyS
2628
import to.bitkit.ui.components.KEY_DELETE
@@ -34,16 +36,19 @@ import to.bitkit.ui.theme.Colors
3436
@Composable
3537
fun ConfirmPinScreen(
3638
originalPin: String,
37-
onPinConfirmed: (String) -> Unit,
39+
onPinConfirmed: () -> Unit,
3840
onBack: () -> Unit,
3941
) {
42+
val app = appViewModel ?: return
43+
4044
var pin by remember { mutableStateOf("") }
4145
var showError by remember { mutableStateOf(false) }
4246

4347
LaunchedEffect(pin) {
4448
if (pin.length == Env.PIN_LENGTH) {
4549
if (pin == originalPin) {
46-
onPinConfirmed(pin)
50+
app.addPin(pin)
51+
onPinConfirmed()
4752
} else {
4853
showError = true
4954
delay(500)
@@ -52,52 +57,74 @@ fun ConfirmPinScreen(
5257
}
5358
}
5459

60+
ConfirmPinContent(
61+
pin = pin,
62+
showError = showError,
63+
onKeyPress = { key ->
64+
if (key == KEY_DELETE) {
65+
if (pin.isNotEmpty()) {
66+
pin = pin.dropLast(1)
67+
}
68+
} else if (pin.length < Env.PIN_LENGTH) {
69+
pin = pin + key
70+
}
71+
},
72+
onBack = onBack,
73+
)
74+
}
75+
76+
@Composable
77+
private fun ConfirmPinContent(
78+
pin: String,
79+
showError: Boolean,
80+
onKeyPress: (String) -> Unit,
81+
onBack: () -> Unit,
82+
modifier: Modifier = Modifier,
83+
) {
5584
Column(
56-
modifier = Modifier
85+
modifier = modifier
5786
.fillMaxWidth()
5887
.gradientBackground()
5988
.navigationBarsPadding()
6089
) {
61-
SheetTopBar(stringResource(R.string.security__pin_retype_header), onBack = onBack)
62-
63-
Spacer(modifier = Modifier.height(16.dp))
90+
SheetTopBar(
91+
stringResource(R.string.security__pin_retype_header),
92+
onBack = onBack,
93+
)
6494

65-
BodyM(
66-
text = stringResource(R.string.security__pin_retype_text),
67-
color = Colors.White64,
68-
modifier = Modifier.padding(horizontal = 32.dp),
69-
)
95+
Spacer(modifier = Modifier.height(16.dp))
7096

71-
Spacer(modifier = Modifier.height(32.dp))
72-
Spacer(modifier = Modifier.weight(1f))
97+
BodyM(
98+
text = stringResource(R.string.security__pin_retype_text),
99+
color = Colors.White64,
100+
modifier = Modifier.padding(horizontal = 32.dp),
101+
)
73102

74-
if (showError) {
75-
BodyS(
76-
text = stringResource(R.string.security__pin_not_match),
77-
textAlign = TextAlign.Center,
78-
color = Colors.Brand,
79-
modifier = Modifier.fillMaxWidth().padding(horizontal = 32.dp)
80-
)
81-
}
82-
Spacer(modifier = Modifier.height(16.dp))
103+
Spacer(modifier = Modifier.height(32.dp))
104+
Spacer(modifier = Modifier.weight(1f))
83105

84-
PinDots(
85-
pin = pin,
86-
modifier = Modifier.padding(horizontal = 32.dp),
106+
AnimatedVisibility(visible = showError) {
107+
BodyS(
108+
text = stringResource(R.string.security__pin_not_match),
109+
textAlign = TextAlign.Center,
110+
color = Colors.Brand,
111+
modifier = Modifier
112+
.fillMaxWidth()
113+
.padding(horizontal = 32.dp)
87114
)
115+
}
116+
117+
Spacer(modifier = Modifier.height(16.dp))
88118

89-
Spacer(modifier = Modifier.height(32.dp))
119+
PinDots(
120+
pin = pin,
121+
modifier = Modifier.padding(horizontal = 32.dp),
122+
)
123+
124+
Spacer(modifier = Modifier.height(32.dp))
90125

91126
PinNumberPad(
92-
onPress = { key ->
93-
if (key == KEY_DELETE) {
94-
if (pin.isNotEmpty()) {
95-
pin = pin.dropLast(1)
96-
}
97-
} else if (pin.length < Env.PIN_LENGTH) {
98-
pin += key
99-
}
100-
},
127+
onPress = onKeyPress,
101128
modifier = Modifier
102129
.height(350.dp)
103130
.background(Colors.Black)
@@ -111,9 +138,23 @@ fun ConfirmPinScreen(
111138
@Composable
112139
private fun Preview() {
113140
AppThemeSurface {
114-
ConfirmPinScreen(
115-
originalPin = "",
116-
onPinConfirmed = {},
141+
ConfirmPinContent(
142+
pin = "",
143+
showError = false,
144+
onKeyPress = {},
145+
onBack = {},
146+
)
147+
}
148+
}
149+
150+
@Preview(showBackground = true)
151+
@Composable
152+
private fun PreviewRetry() {
153+
AppThemeSurface {
154+
ConfirmPinContent(
155+
pin = "123",
156+
showError = true,
157+
onKeyPress = {},
117158
onBack = {},
118159
)
119160
}

app/src/main/java/to/bitkit/ui/settings/pin/PinNavigationSheet.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ fun PinNavigationSheet(
5858
val route = backStackEntry.toRoute<PinRoute.ConfirmPin>()
5959
ConfirmPinScreen(
6060
originalPin = route.pin,
61-
onPinConfirmed = { pin ->
62-
app.addPin(pin)
61+
onPinConfirmed = {
6362
navController.navigate(PinRoute.AskForBiometrics)
6463
},
6564
onBack = { navController.popBackStack() },

0 commit comments

Comments
 (0)