-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJetnewsApp.kt
More file actions
106 lines (97 loc) · 4.1 KB
/
JetnewsApp.kt
File metadata and controls
106 lines (97 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.jetnews.ui
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.DrawerState
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ModalNavigationDrawer
import androidx.compose.material3.rememberDrawerState
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.example.jetnews.data.AppContainer
import com.example.jetnews.ui.components.AppNavRail
import com.example.jetnews.ui.theme.JetnewsTheme
import kotlinx.coroutines.launch
@Composable
fun JetnewsApp(
appContainer: AppContainer,
widthSizeClass: WindowWidthSizeClass,
) {
JetnewsTheme {
val navController = rememberNavController()
val navigationActions = remember(navController) {
JetnewsNavigationActions(navController)
}
val coroutineScope = rememberCoroutineScope()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute =
navBackStackEntry?.destination?.route ?: JetnewsDestinations.HOME_ROUTE
val isExpandedScreen = widthSizeClass == WindowWidthSizeClass.Expanded
val sizeAwareDrawerState = rememberSizeAwareDrawerState(isExpandedScreen)
ModalNavigationDrawer(
drawerContent = {
AppDrawer(
drawerState = sizeAwareDrawerState,
currentRoute = currentRoute,
navigateToHome = navigationActions.navigateToHome,
navigateToInterests = navigationActions.navigateToInterests,
closeDrawer = { coroutineScope.launch { sizeAwareDrawerState.close() } }
)
},
drawerState = sizeAwareDrawerState,
// Only enable opening the drawer via gestures if the screen is not expanded
gesturesEnabled = !isExpandedScreen
) {
Row {
if (isExpandedScreen) {
AppNavRail(
currentRoute = currentRoute,
navigateToHome = navigationActions.navigateToHome,
navigateToInterests = navigationActions.navigateToInterests,
)
}
JetnewsNavGraph(
appContainer = appContainer,
isExpandedScreen = isExpandedScreen,
navController = navController,
openDrawer = { coroutineScope.launch { sizeAwareDrawerState.open() } },
)
}
}
}
}
/**
* Determine the drawer state to pass to the modal drawer.
*/
@Composable
private fun rememberSizeAwareDrawerState(isExpandedScreen: Boolean): DrawerState {
val drawerState = rememberDrawerState(DrawerValue.Closed)
return if (!isExpandedScreen) {
// If we want to allow showing the drawer, we use a real, remembered drawer
// state defined above
drawerState
} else {
// If we don't want to allow the drawer to be shown, we provide a drawer state
// that is locked closed. This is intentionally not remembered, because we
// don't want to keep track of any changes and always keep it closed
DrawerState(DrawerValue.Closed)
}
}