@@ -7,6 +7,8 @@ import android.net.Uri
77import androidx.activity.compose.BackHandler
88import androidx.annotation.DrawableRes
99import androidx.annotation.StringRes
10+ import androidx.compose.animation.core.FloatSpringSpec
11+ import androidx.compose.animation.core.Spring
1012import androidx.compose.foundation.*
1113import androidx.compose.foundation.layout.*
1214import androidx.compose.foundation.shape.CircleShape
@@ -19,7 +21,6 @@ import androidx.compose.runtime.mutableStateOf
1921import androidx.compose.runtime.remember
2022import androidx.compose.runtime.rememberCoroutineScope
2123import androidx.compose.runtime.saveable.rememberSaveable
22- import androidx.compose.runtime.setValue
2324import androidx.compose.ui.Alignment
2425import androidx.compose.ui.Modifier
2526import androidx.compose.ui.draw.clip
@@ -32,6 +33,7 @@ import androidx.compose.ui.tooling.preview.Preview
3233import androidx.compose.ui.unit.dp
3334import androidx.compose.ui.unit.sp
3435import androidx.core.app.ShareCompat
36+ import com.w2sv.androidutils.extensions.launchDelayed
3537import com.w2sv.androidutils.extensions.openUrl
3638import com.w2sv.androidutils.extensions.playStoreUrl
3739import com.w2sv.androidutils.extensions.showToast
@@ -60,55 +62,70 @@ fun StatefulNavigationDrawer(
6062 modifier : Modifier = Modifier ,
6163 initialValue : DrawerValue = DrawerValue .Closed ,
6264 viewModel : HomeActivity .ViewModel = androidx.lifecycle.viewmodel.compose.viewModel(),
63- content : @Composable (DrawerState ) -> Unit
65+ content : @Composable (() -> Unit ) -> Unit
6466) {
6567 val drawerState = rememberDrawerState(initialValue = initialValue)
6668 val scope = rememberCoroutineScope()
67- val context = LocalContext .current
69+ val navigationDrawerAnim = FloatSpringSpec (Spring .DampingRatioMediumBouncy )
70+
71+ val closeDrawer: () -> Unit = {
72+ scope.launch {
73+ drawerState.animateTo(
74+ DrawerValue .Closed ,
75+ navigationDrawerAnim
76+ )
77+ }
78+ }
6879
69- var showThemeDialog by rememberSaveable {
80+ val ( showThemeDialog, setShowThemeDialog) = rememberSaveable {
7081 mutableStateOf(false )
7182 }
7283
84+ ModalNavigationDrawer (
85+ modifier = modifier,
86+ drawerContent = {
87+ NavigationDrawerContent (
88+ closeDrawer = closeDrawer,
89+ onItemThemePressed = {
90+ // show dialog after delay for display of navigationDrawer close animation
91+ scope.launchDelayed(250L ) {
92+ setShowThemeDialog(true )
93+ }
94+ }
95+ )
96+ },
97+ drawerState = drawerState
98+ ) {
99+ content {
100+ scope.launch {
101+ drawerState.animateTo(DrawerValue .Open , navigationDrawerAnim)
102+ }
103+ }
104+ }
105+
73106 val theme by viewModel.inAppThemeState.collectAsState()
74107 val themeRequiringUpdate by viewModel.inAppThemeState.requiringUpdate.collectAsState()
108+ val context = LocalContext .current
75109
76110 if (showThemeDialog) {
77111 ThemeDialog (
78112 onDismissRequest = {
79113 viewModel.inAppThemeState.reset()
80- showThemeDialog = false
114+ setShowThemeDialog( false )
81115 },
82116 theme = { theme },
83117 onThemeSelected = { viewModel.inAppThemeState.value = it },
84118 applyButtonEnabled = { themeRequiringUpdate },
85119 onApplyButtonPress = {
86120 viewModel.inAppThemeState.apply ()
87- showThemeDialog = false
121+ setShowThemeDialog( false )
88122 context.showToast(" Updated Theme" )
89123 }
90124 )
91125 }
92126
93- val closeDrawer: () -> Unit = {
94- scope.launch {
95- drawerState.close()
96- }
97- }
98-
99- BackHandler (drawerState.isOpen, closeDrawer)
100-
101- ModalNavigationDrawer (
102- modifier = modifier,
103- drawerContent = {
104- NavigationDrawerContent (
105- closeDrawer = closeDrawer,
106- onItemThemePressed = { showThemeDialog = true }
107- )
108- },
109- drawerState = drawerState
110- ) {
111- content(drawerState)
127+ BackHandler (enabled = drawerState.isOpen) {
128+ closeDrawer()
112129 }
113130}
114131
0 commit comments