소스 검색

Moved click handlers to state class (refactoring)

Vadik Sirekanyan 2 년 전
부모
커밋
4ad25ccf47

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

@@ -9,8 +9,6 @@ import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
 import androidx.compose.ui.Modifier
 import androidx.core.view.WindowCompat
-import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.launch
 import org.sirekanyan.outline.ui.AddServerContent
 import org.sirekanyan.outline.ui.DeleteKeyContent
 import org.sirekanyan.outline.ui.DeleteServerContent
@@ -43,16 +41,7 @@ class MainActivity : ComponentActivity() {
                                 DeleteKeyContent(
                                     key = key,
                                     onDismiss = { state.dialog = null },
-                                    onConfirm = {
-                                        state.scope.launch {
-                                            state.deletingKey = key
-                                            state.api.deleteAccessKey(key.server, key.id)
-                                            state.refreshCurrentKeys(showLoading = false)
-                                            state.refreshHelloPage(key.server)
-                                        }.invokeOnCompletion {
-                                            state.deletingKey = null
-                                        }
-                                    }
+                                    onConfirm = { state.onDeleteKeyConfirmed(key) }
                                 )
                             }
                             is DeleteServerDialog -> {
@@ -60,13 +49,7 @@ class MainActivity : ComponentActivity() {
                                 DeleteServerContent(
                                     serverName = server.name,
                                     onDismiss = { state.dialog = null },
-                                    onConfirm = {
-                                        state.scope.launch(IO) {
-                                            state.dao.deleteUrl(server.id)
-                                        }
-                                        state.page = HelloPage
-                                        state.openDrawer()
-                                    }
+                                    onConfirm = { state.onDeleteServerConfirmed(server) }
                                 )
                             }
                         }

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

@@ -41,7 +41,6 @@ import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
-import kotlinx.coroutines.launch
 import org.sirekanyan.outline.ext.plus
 import org.sirekanyan.outline.ext.rememberFlowAsState
 import org.sirekanyan.outline.ext.showToast
@@ -149,11 +148,7 @@ fun MainContent(state: MainState) {
                         } else {
                             KeysErrorContent(
                                 insets = insets,
-                                onRetry = {
-                                    state.scope.launch {
-                                        state.refreshCurrentKeys(showLoading = true)
-                                    }
-                                },
+                                onRetry = { state.onRetryButtonClicked() },
                             )
                         }
                     }
@@ -181,17 +176,7 @@ fun MainContent(state: MainState) {
         AddKeyButton(
             isVisible = state.isFabVisible,
             isLoading = state.isFabLoading,
-            onClick = {
-                state.selectedPage?.let { page ->
-                    state.scope.launch {
-                        state.isFabLoading = true
-                        state.api.createAccessKey(page.server)
-                        state.refreshCurrentKeys(showLoading = false)
-                    }.invokeOnCompletion {
-                        state.isFabLoading = false
-                    }
-                }
-            },
+            onClick = { state.onAddKeyClicked() },
         )
         state.selectedKey?.let { key ->
             KeyBottomSheet(

+ 38 - 1
app/src/main/java/org/sirekanyan/outline/MainState.kt

@@ -83,7 +83,7 @@ class MainState(
     pageState: MutableState<Page>,
     dialogState: MutableState<Dialog?>,
     val api: OutlineApi,
-    val dao: ServerDao,
+    private val dao: ServerDao,
     private val prefs: KeyValueDao,
     cache: KeyDao,
 ) {
@@ -150,6 +150,43 @@ class MainState(
         }
     }
 
+    fun onRetryButtonClicked() {
+        scope.launch {
+            refreshCurrentKeys(showLoading = true)
+        }
+    }
+
+    fun onAddKeyClicked() {
+        selectedPage?.let { page ->
+            scope.launch {
+                isFabLoading = true
+                api.createAccessKey(page.server)
+                refreshCurrentKeys(showLoading = false)
+            }.invokeOnCompletion {
+                isFabLoading = false
+            }
+        }
+    }
+
+    fun onDeleteKeyConfirmed(key: Key) {
+        scope.launch {
+            deletingKey = key
+            api.deleteAccessKey(key.server, key.id)
+            refreshCurrentKeys(showLoading = false)
+            refreshHelloPage(key.server)
+        }.invokeOnCompletion {
+            deletingKey = null
+        }
+    }
+
+    fun onDeleteServerConfirmed(server: Server) {
+        scope.launch(Dispatchers.IO) {
+            dao.deleteUrl(server.id)
+        }
+        page = HelloPage
+        openDrawer()
+    }
+
 }
 
 @Parcelize

+ 1 - 1
app/src/main/java/org/sirekanyan/outline/feature/sort/SortBottomSheet.kt

@@ -28,7 +28,7 @@ fun SortBottomSheet(
         title = "Sort by…",
         onDismissRequest = onDismissRequest,
         items = { sheetState ->
-            Sorting.values().forEach { option ->
+            Sorting.entries.forEach { option ->
                 ListItem(
                     headlineContent = {
                         Text(

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

@@ -27,6 +27,7 @@ import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.platform.LocalContext
@@ -119,11 +120,12 @@ private fun DrawerSheetContent(state: MainState, insets: PaddingValues) {
             val context = LocalContext.current
             if (isDebugBuild()) {
                 val debugDao = rememberDebugDao()
+                val scope = rememberCoroutineScope()
                 DrawerItem(
                     icon = Icons.Default.Warning,
                     label = "Reset database",
                     onClick = {
-                        state.scope.launch(IO) {
+                        scope.launch(IO) {
                             debugDao.reset()
                         }
                     },