MainState.kt 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package org.sirekanyan.outline
  2. import androidx.compose.material3.DrawerState
  3. import androidx.compose.material3.DrawerValue
  4. import androidx.compose.runtime.Composable
  5. import androidx.compose.runtime.derivedStateOf
  6. import androidx.compose.runtime.getValue
  7. import androidx.compose.runtime.mutableStateOf
  8. import androidx.compose.runtime.remember
  9. import androidx.compose.runtime.rememberCoroutineScope
  10. import androidx.compose.runtime.setValue
  11. import kotlinx.coroutines.CoroutineScope
  12. import kotlinx.coroutines.launch
  13. import org.sirekanyan.outline.api.model.Key
  14. @Composable
  15. fun rememberMainState(): MainState {
  16. val scope = rememberCoroutineScope()
  17. return remember { MainState(scope) }
  18. }
  19. class MainState(val scope: CoroutineScope) {
  20. val drawer = DrawerState(DrawerValue.Closed)
  21. var page by mutableStateOf<Page>(HelloPage)
  22. var dialog by mutableStateOf<Dialog?>(null)
  23. val selected by derivedStateOf { (page as? SelectedPage)?.selected }
  24. var selectedKey by mutableStateOf<Key?>(null)
  25. fun openDrawer() {
  26. scope.launch {
  27. drawer.open()
  28. }
  29. }
  30. fun closeDrawer(animated: Boolean = true) {
  31. scope.launch {
  32. if (animated) {
  33. drawer.close()
  34. } else {
  35. drawer.snapTo(DrawerValue.Closed)
  36. }
  37. }
  38. }
  39. }
  40. sealed class Page
  41. data object HelloPage : Page()
  42. data class SelectedPage(val selected: String) : Page()
  43. sealed class Dialog
  44. data object AddServerDialog : Dialog()
  45. data class EditKeyDialog(val selected: String, val key: Key) : Dialog()