11package to.bitkit.ui.settings.pin
22
3+ import androidx.compose.animation.AnimatedVisibility
34import androidx.compose.foundation.background
45import androidx.compose.foundation.layout.Column
56import androidx.compose.foundation.layout.Spacer
@@ -21,6 +22,7 @@ import androidx.compose.ui.unit.dp
2122import kotlinx.coroutines.delay
2223import to.bitkit.R
2324import to.bitkit.env.Env
25+ import to.bitkit.ui.appViewModel
2426import to.bitkit.ui.components.BodyM
2527import to.bitkit.ui.components.BodyS
2628import to.bitkit.ui.components.KEY_DELETE
@@ -34,16 +36,19 @@ import to.bitkit.ui.theme.Colors
3436@Composable
3537fun 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
112139private 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 }
0 commit comments