ソースを参照

Added dialog loading state

Vadik Sirekanyan 2 年 前
コミット
9ff7278cd0

+ 5 - 0
app/src/main/java/org/sirekanyan/outline/ui/AddServerContent.kt

@@ -28,8 +28,10 @@ import org.sirekanyan.outline.db.ApiUrlDao
 fun AddServerContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
     var draft by remember { mutableStateOf("") }
     var error by remember(draft) { mutableStateOf("") }
+    var isLoading by remember { mutableStateOf(false) }
     suspend fun onAddClick() {
         try {
+            isLoading = true
             api.getServerName(draft)
             dao.insertUrl(draft)
             state.dialog = null
@@ -38,6 +40,8 @@ fun AddServerContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
         } catch (exception: Exception) {
             exception.printStackTrace()
             error = "Check URL or try again"
+        } finally {
+            isLoading = false
         }
     }
     Column {
@@ -45,6 +49,7 @@ fun AddServerContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
             title = "Add server",
             onCloseClick = { state.dialog = null },
             action = "Add" to { state.scope.launch { onAddClick() } },
+            isLoading = isLoading,
         )
         val focusRequester = remember { FocusRequester() }
         OutlinedTextField(

+ 16 - 3
app/src/main/java/org/sirekanyan/outline/ui/DialogToolbar.kt

@@ -1,7 +1,10 @@
 package org.sirekanyan.outline.ui
 
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Close
+import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
@@ -12,19 +15,29 @@ import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.surfaceColorAtElevation
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 
 @Composable
 @OptIn(ExperimentalMaterial3Api::class)
-fun DialogToolbar(title: String, onCloseClick: () -> Unit, action: Pair<String, () -> Unit>) {
+fun DialogToolbar(
+    title: String,
+    onCloseClick: () -> Unit,
+    action: Pair<String, () -> Unit>,
+    isLoading: Boolean,
+) {
     TopAppBar(
         title = { Text(title) },
         navigationIcon = {
             IconButton({ onCloseClick() }) { Icon(Icons.Default.Close, null) }
         },
         actions = {
-            val (actionName, onActionClick) = action
-            TextButton({ onActionClick() }) { Text(actionName) }
+            if (isLoading) {
+                CircularProgressIndicator(Modifier.size(56.dp).padding(16.dp), strokeWidth = 2.dp)
+            } else {
+                val (actionName, onActionClick) = action
+                TextButton({ onActionClick() }) { Text(actionName) }
+            }
         },
         colors = TopAppBarDefaults.topAppBarColors(
             containerColor = MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp),

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

@@ -28,9 +28,8 @@ fun EditKeyContent(api: OutlineApi, state: MainState, dialog: EditKeyDialog) {
     var draft by remember {
         mutableStateOf(TextFieldValue(accessKey.nameOrDefault, TextRange(Int.MAX_VALUE)))
     }
-    var error by remember(draft) {
-        mutableStateOf("")
-    }
+    var error by remember(draft) { mutableStateOf("") }
+    var isLoading by remember { mutableStateOf(false) }
     Column {
         DialogToolbar(
             title = "Edit key",
@@ -38,6 +37,7 @@ fun EditKeyContent(api: OutlineApi, state: MainState, dialog: EditKeyDialog) {
             action = "Save" to {
                 state.scope.launch {
                     val isSuccess = try {
+                        isLoading = true
                         val newName = draft.text.ifBlank { accessKey.defaultName }
                         api.renameAccessKey(dialog.selected, accessKey.id, newName)
                         state.dialog = null
@@ -46,12 +46,15 @@ fun EditKeyContent(api: OutlineApi, state: MainState, dialog: EditKeyDialog) {
                         exception.printStackTrace()
                         error = "Check name or try again"
                         false
+                    } finally {
+                        isLoading = false
                     }
                     if (isSuccess) {
                         state.refreshCurrentKeys(showLoading = false)
                     }
                 }
             },
+            isLoading = isLoading,
         )
         val focusRequester = remember { FocusRequester() }
         OutlinedTextField(