Skip to content

Commit ac88db2

Browse files
committed
refactor: Decouple AuthCheck from onSuccess actions
1 parent a756f5e commit ac88db2

File tree

3 files changed

+49
-38
lines changed

3 files changed

+49
-38
lines changed

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -475,8 +475,11 @@ private fun NavGraphBuilder.generalSettings(navController: NavHostController) {
475475
}
476476

477477
private fun NavGraphBuilder.securitySettings(navController: NavHostController) {
478-
composableWithDefaultTransitions<Routes.SecuritySettings> {
479-
SecuritySettingsScreen(navController)
478+
composableWithDefaultTransitions<Routes.SecuritySettings> { backStackEntry ->
479+
SecuritySettingsScreen(
480+
navController = navController,
481+
savedStateHandle = backStackEntry.savedStateHandle,
482+
)
480483
}
481484
}
482485

@@ -630,10 +633,7 @@ private fun NavGraphBuilder.qrScanner(
630633
private fun NavGraphBuilder.authCheck(
631634
navController: NavHostController,
632635
) {
633-
composable<Routes.AuthCheck>(
634-
enterTransition = { screenSlideIn },
635-
exitTransition = { screenSlideOut },
636-
) { navBackEntry ->
636+
composable<Routes.AuthCheck> { navBackEntry ->
637637
val route = navBackEntry.toRoute<Routes.AuthCheck>()
638638
AuthCheckScreen(
639639
route = route,
@@ -692,13 +692,13 @@ fun NavController.navigateToAuthCheck(
692692
showLogoOnPin: Boolean = false,
693693
requirePin: Boolean = false,
694694
requireBiometrics: Boolean = false,
695-
onSuccessAction: String,
695+
onSuccessActionId: String,
696696
) = navigate(
697697
route = Routes.AuthCheck(
698698
showLogoOnPin = showLogoOnPin,
699699
requirePin = requirePin,
700700
requireBiometrics = requireBiometrics,
701-
onSuccessAction = onSuccessAction,
701+
onSuccessActionId = onSuccessActionId,
702702
),
703703
)
704704

@@ -800,7 +800,7 @@ object Routes {
800800
val showLogoOnPin: Boolean = false,
801801
val requirePin: Boolean = false,
802802
val requireBiometrics: Boolean = false,
803-
val onSuccessAction: String,
803+
val onSuccessActionId: String,
804804
)
805805

806806
@Serializable
Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
package to.bitkit.ui.components
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.LaunchedEffect
5-
import androidx.compose.runtime.getValue
6-
import androidx.compose.runtime.mutableStateOf
7-
import androidx.compose.runtime.saveable.rememberSaveable
8-
import androidx.compose.runtime.setValue
9-
import androidx.lifecycle.compose.collectAsStateWithLifecycle
104
import androidx.navigation.NavController
115
import to.bitkit.ui.Routes
126
import to.bitkit.ui.appViewModel
@@ -17,31 +11,27 @@ fun AuthCheckScreen(
1711
route: Routes.AuthCheck,
1812
) {
1913
val app = appViewModel ?: return
20-
var isAuthenticated by rememberSaveable { mutableStateOf(false) }
2114

22-
if (isAuthenticated) {
23-
val isPinOnLaunchEnabled by app.isPinOnLaunchEnabled.collectAsStateWithLifecycle()
24-
val isBiometricEnabled by app.isBiometricEnabled.collectAsStateWithLifecycle()
15+
AuthCheckView(
16+
showLogoOnPin = route.showLogoOnPin,
17+
appViewModel = app,
18+
requireBiometrics = route.requireBiometrics,
19+
requirePin = route.requirePin,
20+
onSuccess = {
21+
navController.previousBackStackEntry
22+
?.savedStateHandle
23+
?.set(AuthCheckAction.KEY, route.onSuccessActionId)
2524

26-
LaunchedEffect(Unit) {
27-
when (route.onSuccessAction) {
28-
AuthCheckAction.TOGGLE_PIN_ON_LAUNCH -> app.setIsPinOnLaunchEnabled(!isPinOnLaunchEnabled)
29-
AuthCheckAction.TOGGLE_BIOMETRICS -> app.setIsBiometricEnabled(!isBiometricEnabled)
30-
}
3125
navController.popBackStack()
32-
}
33-
} else {
34-
AuthCheckView(
35-
showLogoOnPin = route.showLogoOnPin,
36-
appViewModel = app,
37-
requireBiometrics = route.requireBiometrics,
38-
requirePin = route.requirePin,
39-
onSuccess = { isAuthenticated = true },
40-
)
41-
}
26+
},
27+
)
4228
}
4329

4430
object AuthCheckAction {
45-
const val TOGGLE_PIN_ON_LAUNCH = "toggle_pin_on_launch"
46-
const val TOGGLE_BIOMETRICS = "toggle_biometrics"
31+
const val KEY = "auth_check_action_key"
32+
33+
object Id {
34+
const val TOGGLE_PIN_ON_LAUNCH = "toggle_pin_on_launch"
35+
const val TOGGLE_BIOMETRICS = "toggle_biometrics"
36+
}
4737
}

app/src/main/java/to/bitkit/ui/settings/SecuritySettingsScreen.kt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.padding
55
import androidx.compose.foundation.rememberScrollState
66
import androidx.compose.foundation.verticalScroll
77
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.LaunchedEffect
89
import androidx.compose.runtime.getValue
910
import androidx.compose.runtime.mutableStateOf
1011
import androidx.compose.runtime.remember
@@ -13,6 +14,7 @@ import androidx.compose.ui.Modifier
1314
import androidx.compose.ui.res.stringResource
1415
import androidx.compose.ui.tooling.preview.Preview
1516
import androidx.compose.ui.unit.dp
17+
import androidx.lifecycle.SavedStateHandle
1618
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1719
import androidx.navigation.NavController
1820
import to.bitkit.R
@@ -34,6 +36,7 @@ import to.bitkit.ui.settings.pin.PinNavigationSheet
3436
@Composable
3537
fun SecuritySettingsScreen(
3638
navController: NavController,
39+
savedStateHandle: SavedStateHandle,
3740
) {
3841
val app = appViewModel ?: return
3942

@@ -42,6 +45,24 @@ fun SecuritySettingsScreen(
4245
val isPinOnLaunchEnabled by app.isPinOnLaunchEnabled.collectAsStateWithLifecycle()
4346
val isBiometricEnabled by app.isBiometricEnabled.collectAsStateWithLifecycle()
4447

48+
LaunchedEffect(savedStateHandle) {
49+
savedStateHandle.getStateFlow<String?>(AuthCheckAction.KEY, null)
50+
.collect { actionId ->
51+
if (actionId != null) {
52+
when (actionId) {
53+
AuthCheckAction.Id.TOGGLE_BIOMETRICS -> {
54+
app.setIsBiometricEnabled(!isBiometricEnabled)
55+
}
56+
AuthCheckAction.Id.TOGGLE_PIN_ON_LAUNCH -> {
57+
app.setIsPinOnLaunchEnabled(!isPinOnLaunchEnabled)
58+
}
59+
}
60+
// cleanup
61+
savedStateHandle.remove<String>(AuthCheckAction.KEY)
62+
}
63+
}
64+
}
65+
4566
PinNavigationSheet(
4667
showSheet = showPinSheet,
4768
showLaterButton = false,
@@ -62,13 +83,13 @@ fun SecuritySettingsScreen(
6283
},
6384
onPinOnLaunchClick = {
6485
navController.navigateToAuthCheck(
65-
onSuccessAction = AuthCheckAction.TOGGLE_PIN_ON_LAUNCH,
86+
onSuccessActionId = AuthCheckAction.Id.TOGGLE_PIN_ON_LAUNCH,
6687
)
6788
},
6889
onUseBiometricsClick = {
6990
navController.navigateToAuthCheck(
7091
requireBiometrics = true,
71-
onSuccessAction = AuthCheckAction.TOGGLE_BIOMETRICS,
92+
onSuccessActionId = AuthCheckAction.Id.TOGGLE_BIOMETRICS,
7293
)
7394
},
7495
onBackClick = { navController.popBackStack() },

0 commit comments

Comments
 (0)