Эх сурвалжийг харах

Added separate state for dialog

Vadik Sirekanyan 2 жил өмнө
parent
commit
7bc91aff43

+ 10 - 6
app/src/main/java/org/sirekanyan/outline/MainActivity.kt

@@ -15,7 +15,7 @@ import androidx.core.view.WindowCompat
 import org.sirekanyan.outline.api.OutlineApi
 import org.sirekanyan.outline.api.model.Key
 import org.sirekanyan.outline.db.rememberApiUrlDao
-import org.sirekanyan.outline.ui.DraftContent
+import org.sirekanyan.outline.ui.AddServerContent
 import org.sirekanyan.outline.ui.EditKeyContent
 import org.sirekanyan.outline.ui.theme.OutlineTheme
 
@@ -32,16 +32,20 @@ class MainActivity : ComponentActivity() {
             }
             BackHandler {
                 when {
-                    state.page is DraftPage -> state.page = HelloPage
+                    state.dialog != null -> state.dialog = null
                     state.drawer.isOpen -> state.closeDrawer()
                 }
             }
             OutlineTheme {
                 Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
-                    when (val page = state.page) {
-                        is DraftPage -> DraftContent(api, dao, state)
-                        is EditKeyPage -> EditKeyContent(api, state, page)
-                        else -> MainContent(api, dao, state, keys)
+                    MainContent(api, dao, state, keys)
+                    state.dialog?.let { dialog ->
+                        Surface {
+                            when (dialog) {
+                                is AddServerDialog -> AddServerContent(api, dao, state)
+                                is EditKeyDialog -> EditKeyContent(api, state, dialog)
+                            }
+                        }
                     }
                 }
             }

+ 2 - 2
app/src/main/java/org/sirekanyan/outline/MainContent.kt

@@ -44,7 +44,7 @@ fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState, keys: List<Ke
         val contentPadding = WindowInsets.systemBars.asPaddingValues() + PaddingValues(top = 64.dp)
         if (state.page is HelloPage) {
             Box(Modifier.fillMaxSize().padding(contentPadding), Alignment.Center) {
-                TextButton(onClick = { state.page = DraftPage }) {
+                TextButton(onClick = { state.dialog = AddServerDialog }) {
                     Icon(Icons.Default.Add, null)
                     Spacer(Modifier.size(8.dp))
                     Text("Add server")
@@ -78,7 +78,7 @@ fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState, keys: List<Ke
                     key = selectedKey,
                     onDismissRequest = { state.selectedKey = null },
                     onEditClick = {
-                        state.page = EditKeyPage(selected, selectedKey)
+                        state.dialog = EditKeyDialog(selected, selectedKey)
                     },
                     onDeleteClick = {
                         state.scope.launch {

+ 6 - 3
app/src/main/java/org/sirekanyan/outline/MainState.kt

@@ -23,6 +23,7 @@ class MainState(val scope: CoroutineScope) {
 
     val drawer = DrawerState(DrawerValue.Closed)
     var page by mutableStateOf<Page>(HelloPage)
+    var dialog by mutableStateOf<Dialog?>(null)
     val selected by derivedStateOf { (page as? SelectedPage)?.selected }
     var selectedKey by mutableStateOf<Key?>(null)
 
@@ -48,8 +49,10 @@ sealed class Page
 
 data object HelloPage : Page()
 
-data object DraftPage : Page()
+data class SelectedPage(val selected: String) : Page()
 
-data class EditKeyPage(val selected: String, val key: Key) : Page()
+sealed class Dialog
 
-data class SelectedPage(val selected: String) : Page()
+data object AddServerDialog : Dialog()
+
+data class EditKeyDialog(val selected: String, val key: Key) : Dialog()

+ 3 - 3
app/src/main/java/org/sirekanyan/outline/ui/DraftContent.kt → app/src/main/java/org/sirekanyan/outline/ui/AddServerContent.kt

@@ -19,20 +19,20 @@ import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
-import org.sirekanyan.outline.HelloPage
 import org.sirekanyan.outline.MainState
 import org.sirekanyan.outline.SelectedPage
 import org.sirekanyan.outline.api.OutlineApi
 import org.sirekanyan.outline.db.ApiUrlDao
 
 @Composable
-fun DraftContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
+fun AddServerContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
     var draft by remember { mutableStateOf("") }
     var error by remember(draft) { mutableStateOf("") }
     suspend fun onAddClick() {
         try {
             api.getServerName(draft)
             dao.insertUrl(draft)
+            state.dialog = null
             state.page = SelectedPage(draft)
             state.closeDrawer(animated = false)
         } catch (exception: Exception) {
@@ -43,7 +43,7 @@ fun DraftContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
     Column {
         DialogToolbar(
             title = "Add server",
-            onCloseClick = { state.page = HelloPage },
+            onCloseClick = { state.dialog = null },
             action = "Add" to { state.scope.launch { onAddClick() } },
         )
         val focusRequester = remember { FocusRequester() }

+ 2 - 2
app/src/main/java/org/sirekanyan/outline/ui/DrawerContent.kt

@@ -18,7 +18,7 @@ import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
-import org.sirekanyan.outline.DraftPage
+import org.sirekanyan.outline.AddServerDialog
 import org.sirekanyan.outline.MainState
 import org.sirekanyan.outline.R
 import org.sirekanyan.outline.SelectedPage
@@ -56,7 +56,7 @@ fun DrawerContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
             modifier = Modifier.padding(horizontal = 12.dp),
             selected = false,
             onClick = {
-                state.page = DraftPage
+                state.dialog = AddServerDialog
             },
         )
     }

+ 6 - 7
app/src/main/java/org/sirekanyan/outline/ui/EditKeyContent.kt

@@ -18,14 +18,13 @@ import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.input.TextFieldValue
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
-import org.sirekanyan.outline.EditKeyPage
+import org.sirekanyan.outline.EditKeyDialog
 import org.sirekanyan.outline.MainState
-import org.sirekanyan.outline.SelectedPage
 import org.sirekanyan.outline.api.OutlineApi
 
 @Composable
-fun EditKeyContent(api: OutlineApi, state: MainState, page: EditKeyPage) {
-    val accessKey = page.key.accessKey
+fun EditKeyContent(api: OutlineApi, state: MainState, dialog: EditKeyDialog) {
+    val accessKey = dialog.key.accessKey
     var draft by remember {
         mutableStateOf(TextFieldValue(accessKey.nameOrDefault, TextRange(Int.MAX_VALUE)))
     }
@@ -35,13 +34,13 @@ fun EditKeyContent(api: OutlineApi, state: MainState, page: EditKeyPage) {
     Column {
         DialogToolbar(
             title = "Edit key",
-            onCloseClick = { state.page = SelectedPage(page.selected) },
+            onCloseClick = { state.dialog = null },
             action = "Save" to {
                 state.scope.launch {
                     try {
                         val newName = draft.text.ifBlank { accessKey.defaultName }
-                        api.renameAccessKey(page.selected, accessKey.id, newName)
-                        state.page = SelectedPage(page.selected)
+                        api.renameAccessKey(dialog.selected, accessKey.id, newName)
+                        state.dialog = null
                     } catch (exception: Exception) {
                         exception.printStackTrace()
                         error = "Check name or try again"