Jelajahi Sumber

Added rename delegate (refactoring)

Vadik Sirekanyan 2 tahun lalu
induk
melakukan
a74b71b5d6

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

@@ -35,8 +35,8 @@ class MainActivity : ComponentActivity() {
                         }
                         when (dialog) {
                             is AddServerDialog -> Surface { AddServerContent(router) }
-                            is RenameServerDialog -> Surface { RenameServerContent(state, dialog) }
-                            is RenameKeyDialog -> Surface { RenameKeyContent(state, dialog) }
+                            is RenameServerDialog -> Surface { RenameServerContent(state, router, dialog.server) }
+                            is RenameKeyDialog -> Surface { RenameKeyContent(state, dialog.key) }
                             is DeleteKeyDialog -> {
                                 val (key) = dialog
                                 DeleteKeyContent(

+ 5 - 11
app/src/main/java/org/sirekanyan/outline/MainState.kt

@@ -90,16 +90,6 @@ class MainState(
         }
     }
 
-    suspend fun updateServerKeys(server: Server) {
-        withContext(Dispatchers.IO) {
-            try {
-                keys.updateKeys(server)
-            } catch (exception: Exception) {
-                exception.printStackTrace()
-            }
-        }
-    }
-
     fun onRetryButtonClicked() {
         launch {
             refreshCurrentKeys(showLoading = true)
@@ -122,7 +112,11 @@ class MainState(
         launch {
             deletingKey = key
             keys.deleteKey(key)
-            updateServerKeys(key.server)
+            try {
+                keys.updateKeys(key.server)
+            } catch (exception: Exception) {
+                exception.printStackTrace()
+            }
         }.invokeOnCompletion {
             deletingKey = null
         }

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

@@ -22,13 +22,17 @@ import kotlinx.coroutines.launch
 import org.sirekanyan.outline.MainState
 import org.sirekanyan.outline.ext.rememberStateScope
 
+interface RenameDelegate {
+    suspend fun onRename(newName: String)
+}
+
 @Composable
 fun RenameContent(
     state: MainState,
     dialogTitle: String,
     initialName: String,
     defaultName: String,
-    onSaveClicked: suspend (String) -> Unit,
+    renameDelegate: RenameDelegate,
 ) {
     val scope = rememberStateScope()
     var draft by rememberSaveable(stateSaver = TextFieldValue.Saver) {
@@ -45,7 +49,7 @@ fun RenameContent(
                     try {
                         isLoading = true
                         val newName = draft.text.ifBlank { defaultName }
-                        onSaveClicked(newName)
+                        renameDelegate.onRename(newName)
                         state.dialog = null
                     } catch (exception: Exception) {
                         exception.printStackTrace()

+ 28 - 5
app/src/main/java/org/sirekanyan/outline/ui/RenameKeyContent.kt

@@ -1,13 +1,36 @@
 package org.sirekanyan.outline.ui
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalContext
 import org.sirekanyan.outline.MainState
-import org.sirekanyan.outline.RenameKeyDialog
+import org.sirekanyan.outline.api.model.Key
+import org.sirekanyan.outline.app
+import org.sirekanyan.outline.repository.KeyRepository
 
 @Composable
-fun RenameKeyContent(state: MainState, dialog: RenameKeyDialog) {
-    RenameContent(state, "Edit key", dialog.key.name, dialog.key.defaultName) { newName ->
-        state.keys.renameKey(dialog.key.server, dialog.key, newName)
-        state.updateServerKeys(dialog.key.server)
+private fun rememberRenameKeyDelegate(key: Key): RenameDelegate {
+    val context = LocalContext.current
+    val keys = remember { context.app().keyRepository }
+    return remember { RenameKeyDelegate(keys, key) }
+}
+
+private class RenameKeyDelegate(
+    private val keys: KeyRepository,
+    private val key: Key,
+) : RenameDelegate {
+    override suspend fun onRename(newName: String) {
+        keys.renameKey(key.server, key, newName)
+        try {
+            keys.updateKeys(key.server)
+        } catch (exception: Exception) {
+            exception.printStackTrace()
+        }
     }
 }
+
+@Composable
+fun RenameKeyContent(state: MainState, key: Key) {
+    val delegate = rememberRenameKeyDelegate(key)
+    RenameContent(state, "Edit key", key.name, key.defaultName, delegate)
+}

+ 26 - 5
app/src/main/java/org/sirekanyan/outline/ui/RenameServerContent.kt

@@ -1,14 +1,35 @@
 package org.sirekanyan.outline.ui
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalContext
 import org.sirekanyan.outline.MainState
-import org.sirekanyan.outline.RenameServerDialog
+import org.sirekanyan.outline.Router
 import org.sirekanyan.outline.SelectedPage
+import org.sirekanyan.outline.api.model.Server
+import org.sirekanyan.outline.app
+import org.sirekanyan.outline.repository.ServerRepository
 
 @Composable
-fun RenameServerContent(state: MainState, dialog: RenameServerDialog) {
-    RenameContent(state, "Edit server", dialog.server.name, dialog.server.getHost()) { newName ->
-        val newServer = state.servers.renameServer(dialog.server, newName)
-        state.page = SelectedPage(newServer)
+private fun rememberRenameServerDelegate(router: Router, server: Server): RenameDelegate {
+    val context = LocalContext.current
+    val servers = remember { context.app().serverRepository }
+    return remember { RenameServerDelegate(router, servers, server) }
+}
+
+private class RenameServerDelegate(
+    private val router: Router,
+    private val servers: ServerRepository,
+    private val server: Server,
+) : RenameDelegate {
+    override suspend fun onRename(newName: String) {
+        val newServer = servers.renameServer(server, newName)
+        router.page = SelectedPage(newServer)
     }
 }
+
+@Composable
+fun RenameServerContent(state: MainState, router: Router, server: Server) {
+    val delegate = rememberRenameServerDelegate(router, server)
+    RenameContent(state, "Edit server", server.name, server.getHost(), delegate)
+}