-
Notifications
You must be signed in to change notification settings - Fork 17
/
RemovableItemContainerScreen.kt
107 lines (98 loc) · 3.86 KB
/
RemovableItemContainerScreen.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.github.terrakok.modo.sample.screens.containers.custom
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.github.terrakok.modo.ContainerScreen
import com.github.terrakok.modo.LocalContainerScreen
import com.github.terrakok.modo.NavModel
import com.github.terrakok.modo.NavigationState
import com.github.terrakok.modo.ReducerAction
import com.github.terrakok.modo.Screen
import com.github.terrakok.modo.ScreenKey
import com.github.terrakok.modo.generateScreenKey
import com.github.terrakok.modo.lazylist.screenItem
import kotlinx.parcelize.Parcelize
@Parcelize
data class RemovableItemContainerState(
val screen1: Screen,
val screen2: Screen,
val screen3: Screen?,
val screen4: Screen,
) : NavigationState {
override fun getChildScreens(): List<Screen> = listOfNotNull(screen1, screen2, screen3, screen4)
}
internal fun interface RemovableItemContainerAction : ReducerAction<RemovableItemContainerState> {
class Remove : RemovableItemContainerAction {
override fun reduce(oldState: RemovableItemContainerState): RemovableItemContainerState =
oldState.copy(screen3 = null)
}
class CreateScreen : RemovableItemContainerAction {
override fun reduce(oldState: RemovableItemContainerState): RemovableItemContainerState =
oldState.copy(screen3 = NestedScreen(canBeRemoved = true))
}
}
@Parcelize
internal class RemovableItemContainerScreen(
private val navModel: NavModel<RemovableItemContainerState, RemovableItemContainerAction> = NavModel(
RemovableItemContainerState(
NestedScreen(canBeRemoved = false),
NestedScreen(canBeRemoved = false),
NestedScreen(canBeRemoved = true),
NestedScreen(canBeRemoved = false),
)
)
) : ContainerScreen<RemovableItemContainerState, RemovableItemContainerAction>(navModel) {
@Composable
override fun Content(modifier: Modifier) {
Column {
LazyColumn(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(16.dp)) {
screenItem(navigationState.screen1) {
InternalContent(navigationState.screen1)
}
screenItem(navigationState.screen2) {
InternalContent(navigationState.screen2)
}
navigationState.screen3?.let { screen3 ->
screenItem(screen3) {
InternalContent(screen3)
}
}
screenItem(navigationState.screen4) {
InternalContent(navigationState.screen4)
}
}
Column {
Button(
modifier = Modifier.fillMaxWidth(),
onClick = { dispatch(RemovableItemContainerAction.CreateScreen()) }
) {
Text(text = "Create screen")
}
}
}
}
}
@Parcelize
internal class NestedScreen(
val canBeRemoved: Boolean,
override val screenKey: ScreenKey = generateScreenKey()
) : Screen {
@Composable
override fun Content(modifier: Modifier) {
val parent = LocalContainerScreen.current as RemovableItemContainerScreen
InnerContent(
title = screenKey.value,
onRemoveClick = takeIf { canBeRemoved }?.let { { parent.dispatch(RemovableItemContainerAction.Remove()) } },
modifier = Modifier
.fillMaxWidth()
.height(400.dp)
)
}
}