@@ -32,20 +32,20 @@ import androidx.compose.material3.IconButton
3232import androidx.compose.material3.Scaffold
3333import androidx.compose.material3.Text
3434import androidx.compose.runtime.Composable
35- import androidx.compose.runtime.LaunchedEffect
3635import androidx.compose.runtime.getValue
3736import androidx.compose.runtime.mutableStateOf
3837import androidx.compose.runtime.remember
38+ import androidx.compose.runtime.rememberCoroutineScope
3939import androidx.compose.runtime.setValue
4040import androidx.compose.ui.Alignment
4141import androidx.compose.ui.Modifier
4242import androidx.compose.ui.graphics.Color
43- import androidx.compose.ui.platform.LocalContext
44- import androidx.compose.ui.tooling.preview.Preview
4543import androidx.compose.ui.unit.IntOffset
4644import androidx.compose.ui.unit.dp
4745import androidx.lifecycle.compose.collectAsStateWithLifecycle
48- import org.koin.androidx.compose.koinViewModel
46+ import kotlinx.coroutines.launch
47+ import org.jetbrains.compose.ui.tooling.preview.Preview
48+ import org.koin.compose.viewmodel.koinViewModel
4949import org.mifos.library.passcode.component.MifosIcon
5050import org.mifos.library.passcode.component.PasscodeForgotButton
5151import org.mifos.library.passcode.component.PasscodeHeader
@@ -55,10 +55,11 @@ import org.mifos.library.passcode.component.PasscodeSkipButton
5555import org.mifos.library.passcode.component.PasscodeToolbar
5656import org.mifos.library.passcode.theme.blueTint
5757import org.mifos.library.passcode.utility.Constants.PASSCODE_LENGTH
58- import org.mifos.library.passcode.utility.PreferenceManager
5958import org.mifos.library.passcode.utility.ShakeAnimation.performShakeAnimation
60- import org.mifos.library.passcode.utility.VibrationFeedback.vibrateFeedback
59+ import org.mifos.library.passcode.viewmodels.PasscodeAction
60+ import org.mifos.library.passcode.viewmodels.PasscodeEvent
6161import org.mifos.library.passcode.viewmodels.PasscodeViewModel
62+ import org.mifospay.core.ui.utils.EventsEffect
6263
6364@Composable
6465internal fun PasscodeScreen (
@@ -69,29 +70,25 @@ internal fun PasscodeScreen(
6970 modifier : Modifier = Modifier ,
7071 viewModel : PasscodeViewModel = koinViewModel(),
7172) {
72- val context = LocalContext .current
73- val preferenceManager = remember { PreferenceManager (context) }
74-
75- val activeStep by viewModel.activeStep.collectAsStateWithLifecycle()
76- val filledDots by viewModel.filledDots.collectAsStateWithLifecycle()
77- val passcodeVisible by viewModel.passcodeVisible.collectAsStateWithLifecycle()
78- val currentPasscode by viewModel.currentPasscodeInput.collectAsStateWithLifecycle()
73+ val scope = rememberCoroutineScope()
74+ val state by viewModel.stateFlow.collectAsStateWithLifecycle()
7975
8076 val xShake = remember { Animatable (initialValue = 0.0F ) }
8177 var passcodeRejectedDialogVisible by remember { mutableStateOf(false ) }
8278
83- LaunchedEffect (key1 = viewModel.onPasscodeConfirmed ) {
84- viewModel.onPasscodeConfirmed.collect {
85- onPasscodeConfirm(it)
86- }
87- }
79+ EventsEffect ( viewModel) { event ->
80+ when (event) {
81+ is PasscodeEvent . PasscodeConfirmed -> {
82+ onPasscodeConfirm(event.passcode)
83+ }
8884
89- LaunchedEffect (key1 = viewModel.onPasscodeRejected) {
90- viewModel.onPasscodeRejected.collect {
91- passcodeRejectedDialogVisible = true
92- vibrateFeedback(context)
93- performShakeAnimation(xShake)
94- onPasscodeRejected()
85+ is PasscodeEvent .PasscodeRejected -> {
86+ passcodeRejectedDialogVisible = true
87+ scope.launch {
88+ performShakeAnimation(xShake)
89+ }
90+ onPasscodeRejected()
91+ }
9592 }
9693 }
9794
@@ -106,10 +103,10 @@ internal fun PasscodeScreen(
106103 .padding(paddingValues),
107104 horizontalAlignment = Alignment .CenterHorizontally ,
108105 ) {
109- PasscodeToolbar (activeStep = activeStep, preferenceManager .hasPasscode)
106+ PasscodeToolbar (activeStep = state. activeStep, state .hasPasscode)
110107
111108 PasscodeSkipButton (
112- hasPassCode = preferenceManager .hasPasscode,
109+ hasPassCode = state .hasPasscode,
113110 onSkipButton = onSkipButton,
114111 )
115112
@@ -122,15 +119,19 @@ internal fun PasscodeScreen(
122119 horizontalAlignment = Alignment .CenterHorizontally ,
123120 ) {
124121 PasscodeHeader (
125- activeStep = activeStep,
126- isPasscodeAlreadySet = preferenceManager .hasPasscode,
122+ activeStep = state. activeStep,
123+ isPasscodeAlreadySet = state .hasPasscode,
127124 )
128125 PasscodeView (
129- restart = { viewModel.restart() },
130- togglePasscodeVisibility = { viewModel.togglePasscodeVisibility() },
131- filledDots = filledDots,
132- passcodeVisible = passcodeVisible,
133- currentPasscode = currentPasscode,
126+ restart = remember(viewModel) {
127+ { viewModel.trySendAction(PasscodeAction .Restart ) }
128+ },
129+ togglePasscodeVisibility = remember(viewModel) {
130+ { viewModel.trySendAction(PasscodeAction .TogglePasscodeVisibility ) }
131+ },
132+ filledDots = state.filledDots,
133+ passcodeVisible = state.passcodeVisible,
134+ currentPasscode = state.currentPasscodeInput,
134135 passcodeRejectedDialogVisible = passcodeRejectedDialogVisible,
135136 onDismissDialog = { passcodeRejectedDialogVisible = false },
136137 xShake = xShake,
@@ -140,16 +141,21 @@ internal fun PasscodeScreen(
140141 Spacer (modifier = Modifier .height(6 .dp))
141142
142143 PasscodeKeys (
143- enterKey = viewModel::enterKey,
144- deleteKey = viewModel::deleteKey,
145- deleteAllKeys = viewModel::deleteAllKeys,
146- modifier = Modifier .padding(horizontal = 12 .dp),
144+ enterKey = remember(viewModel) {
145+ { viewModel.trySendAction(PasscodeAction .EnterKey (it)) }
146+ },
147+ deleteKey = remember(viewModel) {
148+ { viewModel.trySendAction(PasscodeAction .DeleteKey ) }
149+ },
150+ deleteAllKeys = remember(viewModel) {
151+ { viewModel.trySendAction(PasscodeAction .DeleteAllKeys ) }
152+ },
147153 )
148154
149155 Spacer (modifier = Modifier .height(8 .dp))
150156
151157 PasscodeForgotButton (
152- hasPassCode = preferenceManager .hasPasscode,
158+ hasPassCode = state .hasPasscode,
153159 onForgotButton = onForgotButton,
154160 )
155161 }
@@ -230,7 +236,7 @@ private fun PasscodeView(
230236 }
231237}
232238
233- @Preview(showBackground = true )
239+ @Preview
234240@Composable
235241private fun PasscodeScreenPreview () {
236242 PasscodeScreen (
0 commit comments