Advertisement
Guest User

Untitled

a guest
Jun 4th, 2022
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.38 KB | None | 0 0
  1. // Components
  2.  
  3. class Main(
  4.     val onFinished: () -> Unit,
  5.     val onItemSelected: (String) -> Unit,
  6. ) {
  7.     val list: State<List<String>> = mutableStateOf(List(100) { "Item $it" })
  8.  
  9.     // ...
  10. }
  11.  
  12. class Details(
  13.     val text: String,
  14.     val onFinished: () -> Unit,
  15. ) {
  16.     // ...
  17. }
  18.  
  19. class Root(
  20.     componentContext: ComponentContext,
  21.     private val onFinished: () -> Unit,
  22. ) : ComponentContext by componentContext {
  23.  
  24.     private val router: Router<Config, Child> =
  25.         router(
  26.             initialConfiguration = Config.Main,
  27.             childFactory = ::createChild,
  28.         )
  29.  
  30.     val routerState: Value<RouterState<*, Child>> = router.state
  31.  
  32.     private fun createChild(config: Config, componentContext: ComponentContext): Child =
  33.         when (config) {
  34.             is Config.Main -> MainChild(main())
  35.             is Config.Details -> DetailsChild(details(config))
  36.         }
  37.  
  38.     private fun main(): Main =
  39.         Main(
  40.             onFinished = onFinished,
  41.             onItemSelected = { router.push(Config.Details(text = it)) },
  42.         )
  43.  
  44.     private fun details(config: Config.Details): Details =
  45.         Details(
  46.             text = config.text,
  47.             onFinished = { router.navigate { it - config } },
  48.         )
  49.  
  50.     sealed interface Child
  51.     class MainChild(val main: Main) : Child
  52.     class DetailsChild(val details: Details) : Child
  53.  
  54.     private sealed interface Config : Parcelable {
  55.         @Parcelize
  56.         object Main : Config
  57.  
  58.         @Parcelize
  59.         data class Details(val text: String) : Config
  60.     }
  61. }
  62.  
  63. // Composables
  64.  
  65. @Composable
  66. fun DetailsContent(component: Details, modifier: Modifier = Modifier) {
  67.     Text(text = component.text, modifier = modifier)
  68. }
  69.  
  70. @Composable
  71. fun RootContent(component: Root) {
  72.     val routerState by component.routerState.subscribeAsState()
  73.     ChildWindows(routerState.getInstanceStack())
  74. }
  75.  
  76. @Composable
  77. fun ChildWindows(stack: List<Root.Child>) {
  78.     val child = stack.first()
  79.  
  80.     Window(
  81.         isModal = child !is Root.MainChild,
  82.         title = when (child) {
  83.             is Root.MainChild -> "Main screen"
  84.             is Root.DetailsChild -> "Details screen"
  85.         },
  86.         onCloseRequest = when (child) {
  87.             is Root.MainChild -> child.main.onFinished
  88.             is Root.DetailsChild -> child.details.onFinished
  89.         },
  90.     ) {
  91.         ChildContent(child)
  92.  
  93.         stack.drop(1).takeUnless(List<*>::isEmpty)?.also {
  94.             ChildWindows(it)
  95.         }
  96.     }
  97. }
  98.  
  99. @Composable
  100. fun ChildContent(child: Root.Child) {
  101.     Surface(modifier = Modifier.fillMaxSize()) {
  102.         MaterialTheme {
  103.             CompositionLocalProvider(LocalScrollbarStyle provides defaultScrollbarStyle()) {
  104.                 when (child) {
  105.                     is Root.MainChild -> MainContent(component = child.main, modifier = Modifier.fillMaxSize())
  106.                     is Root.DetailsChild -> DetailsContent(component = child.details, modifier = Modifier.fillMaxSize())
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
  113. @Composable
  114. fun Window(
  115.     isModal: Boolean,
  116.     onCloseRequest: () -> Unit,
  117.     title: String,
  118.     content: @Composable WindowScope.() -> Unit,
  119. ) {
  120.     if (isModal) {
  121.         Dialog(onCloseRequest = onCloseRequest, title = title, content = content)
  122.     } else {
  123.         Window(onCloseRequest = onCloseRequest, title = title, content = content)
  124.     }
  125. }
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement