@@ -27,121 +27,113 @@ import com.getcode.navigation.core.LocalCodeNavigator
2727import com.getcode.theme.CodeTheme
2828import com.getcode.theme.sheetHeight
2929import com.getcode.util.keyboardAsState
30- import com.getcode.util.recomposeHighlighter
3130import com.getcode.view.components.SheetTitle
3231import kotlinx.coroutines.delay
3332import kotlinx.coroutines.launch
34- import timber.log.Timber
3533
36- internal interface ModalContent {
3734
38- @Composable
39- fun Screen.ModalContainer (
40- closeButton : (Screen ? ) -> Boolean = { false },
41- screenContent : @Composable () -> Unit
42- ) {
43- ModalContainer (
44- navigator = LocalCodeNavigator .current,
45- displayLogo = false ,
46- backButton = { false },
47- onLogoClicked = {},
48- closeButton = closeButton,
49- screenContent = screenContent,
50- )
51- }
35+ @Composable
36+ internal fun Screen.ModalContainer (
37+ closeButton : (Screen ? ) -> Boolean = { false },
38+ screenContent : @Composable () -> Unit
39+ ) {
40+ ModalContainer (
41+ navigator = LocalCodeNavigator .current,
42+ displayLogo = false ,
43+ backButton = { false },
44+ onLogoClicked = {},
45+ closeButton = closeButton,
46+ screenContent = screenContent,
47+ )
48+ }
5249
53- @Composable
54- fun Screen.ModalContainer (
55- displayLogo : Boolean = false,
56- onLogoClicked : () -> Unit = { },
57- closeButton : (Screen ? ) -> Boolean = { false },
58- screenContent : @Composable () -> Unit
59- ) {
60- ModalContainer (
61- navigator = LocalCodeNavigator .current,
62- displayLogo = displayLogo,
63- backButton = { false },
64- onLogoClicked = onLogoClicked,
65- closeButton = closeButton,
66- screenContent = screenContent,
67- )
68- }
50+ @Composable
51+ internal fun Screen.ModalContainer (
52+ displayLogo : Boolean = false,
53+ onLogoClicked : () -> Unit = { },
54+ closeButton : (Screen ? ) -> Boolean = { false },
55+ screenContent : @Composable () -> Unit
56+ ) {
57+ ModalContainer (
58+ navigator = LocalCodeNavigator .current,
59+ displayLogo = displayLogo,
60+ backButton = { false },
61+ onLogoClicked = onLogoClicked,
62+ closeButton = closeButton,
63+ screenContent = screenContent,
64+ )
65+ }
6966
70- @OptIn(ExperimentalFoundationApi ::class )
71- @Composable
72- fun Screen.ModalContainer (
73- navigator : CodeNavigator = LocalCodeNavigator .current,
74- displayLogo : Boolean = false,
75- backButton : (Screen ? ) -> Boolean = { false },
76- onBackClicked : (() -> Unit )? = null,
77- closeButton : (Screen ? ) -> Boolean = { false },
78- onCloseClicked : (() -> Unit )? = null,
79- onLogoClicked : () -> Unit = { },
80- screenContent : @Composable () -> Unit
67+ @OptIn(ExperimentalFoundationApi ::class )
68+ @Composable
69+ internal fun Screen.ModalContainer (
70+ navigator : CodeNavigator = LocalCodeNavigator .current,
71+ displayLogo : Boolean = false,
72+ backButton : (Screen ? ) -> Boolean = { false },
73+ onBackClicked : (() -> Unit )? = null,
74+ closeButton : (Screen ? ) -> Boolean = { false },
75+ onCloseClicked : (() -> Unit )? = null,
76+ onLogoClicked : () -> Unit = { },
77+ screenContent : @Composable () -> Unit
78+ ) {
79+ Column (
80+ modifier = Modifier
81+ .fillMaxWidth()
82+ .fillMaxHeight(sheetHeight)
8183 ) {
82- Column (
83- modifier = Modifier
84- .fillMaxWidth()
85- .fillMaxHeight(sheetHeight)
86- ) {
87- val lastItem by remember(navigator.lastModalItem) {
88- derivedStateOf { navigator.lastModalItem }
89- }
90-
91- val isBackEnabled by remember(backButton, lastItem) {
92- derivedStateOf { backButton(lastItem) }
93- }
84+ val lastItem by remember(navigator.lastModalItem) {
85+ derivedStateOf { navigator.lastModalItem }
86+ }
9487
95- val isCloseEnabled by remember(closeButton , lastItem) {
96- derivedStateOf { closeButton (lastItem) }
97- }
88+ val isBackEnabled by remember(backButton , lastItem) {
89+ derivedStateOf { backButton (lastItem) }
90+ }
9891
99- val keyboardController = LocalSoftwareKeyboardController .current
100- val composeScope = rememberCoroutineScope()
92+ val isCloseEnabled by remember(closeButton, lastItem) {
93+ derivedStateOf { closeButton(lastItem) }
94+ }
10195
102- val keyboardVisible by keyboardAsState()
96+ val keyboardController = LocalSoftwareKeyboardController .current
97+ val composeScope = rememberCoroutineScope()
10398
104- val hideSheet = {
105- composeScope.launch {
106- if (keyboardVisible) {
107- keyboardController?.hide()
108- delay(500 )
109- }
110- navigator.hide()
111- }
99+ val hideSheet = {
100+ composeScope.launch {
101+ keyboardController?.hide()
102+ delay(500 )
103+ navigator.hide()
112104 }
113-
114- SheetTitle (
115- modifier = Modifier ,
116- title = {
117- val name = (lastItem as ? NamedScreen )?.name
118- val sheetName by remember(lastItem) {
119- derivedStateOf { name }
120- }
121- sheetName.takeIf { ! displayLogo && lastItem == this @ModalContainer }
122- },
123- displayLogo = displayLogo,
124- onLogoClicked = onLogoClicked,
125- // hide while transitioning to/from other destinations
126- backButton = isBackEnabled,
127- closeButton = isCloseEnabled,
128- onBackIconClicked = onBackClicked?.let { { it() } } ? : { navigator.pop() },
129- onCloseIconClicked = onCloseClicked?.let { { it() } } ? : { hideSheet() }
130- )
131- Box (
132- modifier = Modifier
133- .windowInsetsPadding(WindowInsets .navigationBars)
134- ) {
135- CompositionLocalProvider (
136- LocalOverscrollConfiguration provides null
137- ) {
138- screenContent()
105+ }
106+ SheetTitle (
107+ modifier = Modifier ,
108+ title = {
109+ val name = (lastItem as ? NamedScreen )?.name
110+ val sheetName by remember(lastItem) {
111+ derivedStateOf { name }
139112 }
113+ sheetName.takeIf { ! displayLogo && lastItem == this @ModalContainer }
114+ },
115+ displayLogo = displayLogo,
116+ onLogoClicked = onLogoClicked,
117+ // hide while transitioning to/from other destinations
118+ backButton = isBackEnabled,
119+ closeButton = isCloseEnabled,
120+ onBackIconClicked = onBackClicked?.let { { it() } } ? : { navigator.pop() },
121+ onCloseIconClicked = onCloseClicked?.let { { it() } } ? : { hideSheet() }
122+ )
123+ Box (
124+ modifier = Modifier
125+ .windowInsetsPadding(WindowInsets .navigationBars)
126+ ) {
127+ CompositionLocalProvider (
128+ LocalOverscrollConfiguration provides null
129+ ) {
130+ screenContent()
140131 }
141132 }
142133 }
143134}
144135
136+ internal interface ModalContent
145137internal sealed interface ModalRoot : ModalContent
146138
147139data object MainRoot : Screen {
@@ -153,6 +145,8 @@ data object MainRoot : Screen {
153145 // TODO: potentially add a loading state here
154146 // so app doesn't appear stuck in a dead state
155147 // while we wait for auth check to complete
156- Box (modifier = Modifier .fillMaxSize().background(CodeTheme .colors.background))
148+ Box (modifier = Modifier
149+ .fillMaxSize()
150+ .background(CodeTheme .colors.background))
157151 }
158152}
0 commit comments