瀏覽代碼

Added refreshing list of keys

Vadik Sirekanyan 2 年之前
父節點
當前提交
72f0b997dd

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

@@ -7,13 +7,10 @@ import androidx.activity.compose.setContent
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.produceState
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 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.AddServerContent
 import org.sirekanyan.outline.ui.EditKeyContent
@@ -26,16 +23,13 @@ class MainActivity : ComponentActivity() {
         setContent {
             val api = remember { OutlineApi() }
             val dao = rememberApiUrlDao()
-            val state = rememberMainState()
-            val keys by produceState(listOf<Key>(), state.selected) {
-                value = state.selected?.let { api.getKeys(it) } ?: listOf()
-            }
+            val state = rememberMainState(api)
             OutlineTheme {
                 Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                     BackHandler(state.drawer.isOpen) {
                         state.closeDrawer()
                     }
-                    MainContent(api, dao, state, keys)
+                    MainContent(api, dao, state)
                     state.dialog?.let { dialog ->
                         BackHandler(state.dialog != null) {
                             state.dialog = null

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

@@ -24,6 +24,7 @@ import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.material3.surfaceColorAtElevation
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
@@ -39,24 +40,30 @@ import org.sirekanyan.outline.ui.KeyBottomSheet
 import org.sirekanyan.outline.ui.KeyContent
 
 @Composable
-fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState, keys: List<Key>) {
+fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState) {
     ModalNavigationDrawer({ DrawerContent(api, dao, state) }, drawerState = state.drawer) {
         val contentPadding = WindowInsets.systemBars.asPaddingValues() + PaddingValues(top = 64.dp)
-        if (state.page is HelloPage) {
-            Box(Modifier.fillMaxSize().padding(contentPadding), Alignment.Center) {
-                TextButton(onClick = { state.dialog = AddServerDialog }) {
-                    Icon(Icons.Default.Add, null)
-                    Spacer(Modifier.size(8.dp))
-                    Text("Add server")
+        when (val page = state.page) {
+            is HelloPage -> {
+                Box(Modifier.fillMaxSize().padding(contentPadding), Alignment.Center) {
+                    TextButton(onClick = { state.dialog = AddServerDialog }) {
+                        Icon(Icons.Default.Add, null)
+                        Spacer(Modifier.size(8.dp))
+                        Text("Add server")
+                    }
                 }
             }
-        } else {
-            LazyColumn(contentPadding = contentPadding + PaddingValues(bottom = 88.dp)) {
-                keys.sortedByDescending(Key::traffic).forEach { key ->
-                    item {
-                        KeyContent(key, onClick = { state.selectedKey = key })
+            is SelectedPage -> {
+                LazyColumn(contentPadding = contentPadding + PaddingValues(bottom = 88.dp)) {
+                    page.keys.sortedByDescending(Key::traffic).forEach { key ->
+                        item {
+                            KeyContent(key, onClick = { state.selectedKey = key })
+                        }
                     }
                 }
+                LaunchedEffect(page.selected) {
+                    state.refreshCurrentKeys()
+                }
             }
         }
         MainTopAppBar {
@@ -68,6 +75,7 @@ fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState, keys: List<Ke
                 state.selected?.let {
                     state.scope.launch {
                         api.createAccessKey(it)
+                        state.refreshCurrentKeys()
                     }
                 }
             },
@@ -83,6 +91,7 @@ fun MainContent(api: OutlineApi, dao: ApiUrlDao, state: MainState, keys: List<Ke
                     onDeleteClick = {
                         state.scope.launch {
                             api.deleteAccessKey(selected, selectedKey.accessKey.id)
+                            state.refreshCurrentKeys()
                         }
                     },
                 )

+ 13 - 4
app/src/main/java/org/sirekanyan/outline/MainState.kt

@@ -11,15 +11,16 @@ import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
+import org.sirekanyan.outline.api.OutlineApi
 import org.sirekanyan.outline.api.model.Key
 
 @Composable
-fun rememberMainState(): MainState {
+fun rememberMainState(api: OutlineApi): MainState {
     val scope = rememberCoroutineScope()
-    return remember { MainState(scope) }
+    return remember { MainState(scope, api) }
 }
 
-class MainState(val scope: CoroutineScope) {
+class MainState(val scope: CoroutineScope, private val api: OutlineApi) {
 
     val drawer = DrawerState(DrawerValue.Closed)
     var page by mutableStateOf<Page>(HelloPage)
@@ -43,13 +44,21 @@ class MainState(val scope: CoroutineScope) {
         }
     }
 
+    suspend fun refreshCurrentKeys() {
+        (page as? SelectedPage)?.let { page ->
+            page.keys = api.getKeys(page.selected)
+        }
+    }
+
 }
 
 sealed class Page
 
 data object HelloPage : Page()
 
-data class SelectedPage(val selected: String) : Page()
+data class SelectedPage(val selected: String) : Page() {
+    var keys by mutableStateOf(listOf<Key>())
+}
 
 sealed class Dialog
 

+ 1 - 0
app/src/main/java/org/sirekanyan/outline/ui/EditKeyContent.kt

@@ -45,6 +45,7 @@ fun EditKeyContent(api: OutlineApi, state: MainState, dialog: EditKeyDialog) {
                         exception.printStackTrace()
                         error = "Check name or try again"
                     }
+                    state.refreshCurrentKeys()
                 }
             },
         )