瀏覽代碼

added dialog for storing page name

sirekanian 3 年之前
父節點
當前提交
733bef9718

+ 3 - 0
app/src/main/java/com/sirekanian/spacetime/MainPresenter.kt

@@ -23,6 +23,7 @@ fun rememberMainPresenter(): MainPresenter {
 
 interface MainPresenter {
 
+    val state: MainState
     fun observePages(): Flow<List<Page>>
     fun addPage(page: ImagePage)
     fun removePage(page: ImagePage)
@@ -34,6 +35,8 @@ class MainPresenterImpl(
     private val scope: CoroutineScope,
 ) : MainPresenter {
 
+    override val state = MainState()
+
     override fun observePages(): Flow<List<Page>> =
         repository.observePages().map { it.plus(GalleryPage) }
 

+ 5 - 1
app/src/main/java/com/sirekanian/spacetime/MainScreen.kt

@@ -8,14 +8,17 @@ import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import com.google.accompanist.pager.ExperimentalPagerApi
 import com.google.accompanist.pager.HorizontalPager
+import com.sirekanian.spacetime.model.Draft
 import com.sirekanian.spacetime.model.GalleryPage
 import com.sirekanian.spacetime.model.ImagePage
+import com.sirekanian.spacetime.ui.DraftAlertDialog
 import com.sirekanian.spacetime.ui.GalleryPageContent
 import com.sirekanian.spacetime.ui.ImagePageContent
 
 @Composable
 @ExperimentalPagerApi
 fun MainScreen(presenter: MainPresenter) {
+    val state = presenter.state
     val pages by presenter.observePages().collectAsState(listOf())
     val insets = WindowInsets.systemBars.asPaddingValues()
     HorizontalPager(
@@ -27,8 +30,9 @@ fun MainScreen(presenter: MainPresenter) {
                 ImagePageContent(insets, page, onDelete = { presenter.removePage(page) })
             }
             GalleryPage -> {
-                GalleryPageContent(insets, onSelect = { presenter.addPage(ImagePage(0, "", it)) })
+                GalleryPageContent(insets, onSelect = { state.draft = Draft(it) })
             }
         }
     }
+    DraftAlertDialog(state, onConfirm = { presenter.addPage(it) })
 }

+ 12 - 0
app/src/main/java/com/sirekanian/spacetime/MainState.kt

@@ -0,0 +1,12 @@
+package com.sirekanian.spacetime
+
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import com.sirekanian.spacetime.model.Draft
+
+class MainState {
+
+    var draft by mutableStateOf<Draft?>(null)
+
+}

+ 3 - 0
app/src/main/java/com/sirekanian/spacetime/model/Draft.kt

@@ -0,0 +1,3 @@
+package com.sirekanian.spacetime.model
+
+class Draft(val url: String)

+ 90 - 0
app/src/main/java/com/sirekanian/spacetime/ui/DraftAlertDialog.kt

@@ -0,0 +1,90 @@
+package com.sirekanian.spacetime.ui
+
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Dialog
+import com.sirekanian.spacetime.MainState
+import com.sirekanian.spacetime.model.ImagePage
+
+@Composable
+fun DraftAlertDialog(state: MainState, onConfirm: (ImagePage) -> Unit) {
+    val draft = state.draft
+    var name by remember(draft) { mutableStateOf("") }
+    if (draft != null) {
+        MyAlertDialog(
+            title = {
+                Text(
+                    text = "Enter Name",
+                    style = MaterialTheme.typography.h6,
+                )
+            },
+            content = {
+                val focusRequester = remember { FocusRequester() }
+                OutlinedTextField(
+                    value = name,
+                    onValueChange = { name = it },
+                    modifier = Modifier.focusRequester(focusRequester),
+                    label = { Text("Name") },
+                )
+                LaunchedEffect(Unit) {
+                    focusRequester.requestFocus()
+                }
+            },
+            dismissButton = {
+                TextButton(
+                    onClick = { state.draft = null },
+                    content = { Text("CANCEL") },
+                )
+            },
+            confirmButton = {
+                TextButton(
+                    onClick = {
+                        onConfirm(ImagePage(0, name, draft.url))
+                        state.draft = null
+                    },
+                    content = { Text("OK") },
+                )
+            },
+            onDismiss = {
+                state.draft = null
+            },
+        )
+    }
+}
+
+@Composable
+private fun MyAlertDialog(
+    title: @Composable () -> Unit,
+    content: @Composable () -> Unit,
+    dismissButton: @Composable () -> Unit,
+    confirmButton: @Composable () -> Unit,
+    onDismiss: () -> Unit,
+) {
+    Dialog(onDismiss) {
+        Surface(shape = MaterialTheme.shapes.medium) {
+            Column {
+                Column(Modifier.padding(24.dp)) {
+                    title.invoke()
+                    Spacer(Modifier.size(16.dp))
+                    content.invoke()
+                }
+                Spacer(Modifier.size(4.dp))
+                Row(
+                    Modifier
+                        .padding(8.dp)
+                        .fillMaxWidth(),
+                    Arrangement.spacedBy(8.dp, Alignment.End),
+                ) {
+                    dismissButton.invoke()
+                    confirmButton.invoke()
+                }
+            }
+        }
+    }
+}