Skip to content

Commit 46b4883

Browse files
committed
Implement handler and action systems
1 parent 3fe3214 commit 46b4883

File tree

7 files changed

+98
-15
lines changed

7 files changed

+98
-15
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Designed and developed by 2024 skydoves (Jaewoong Eum)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.getstream.server.driven.core.designsystem.consumer
17+
18+
import androidx.compose.foundation.clickable
19+
import androidx.compose.runtime.Composable
20+
import androidx.compose.ui.Modifier
21+
import io.getstream.server.driven.core.model.Handler
22+
import io.getstream.server.driven.core.model.HandlerAction
23+
import io.getstream.server.driven.core.model.HandlerType
24+
25+
@Composable
26+
fun Handler?.consumeHandler(
27+
navigator: () -> Unit
28+
): Modifier {
29+
if (this == null) return Modifier
30+
31+
val action = if (this.actions[HandlerAction.NAVIGATION.value] == "to") {
32+
{ navigator }
33+
} else {
34+
{}
35+
}
36+
37+
return if (this.type == HandlerType.CLICK.value) {
38+
Modifier.clickable { action.invoke() }
39+
} else {
40+
Modifier
41+
}
42+
}

core/designsystem/src/main/kotlin/io/getstream/server/driven/core/designsystem/consumer/ConsumeImageUi.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,28 @@ import io.getstream.server.driven.core.designsystem.extension.size
3030
import io.getstream.server.driven.core.designsystem.preview.MockUtils
3131
import io.getstream.server.driven.core.designsystem.theme.ServerDrivenTheme
3232
import io.getstream.server.driven.core.model.ImageUi
33+
import io.getstream.server.driven.core.model.UiComponent
3334

3435
@Composable
3536
fun ConsumeImageUi(
3637
imageUi: ImageUi,
3738
modifier: Modifier = Modifier,
3839
version: Int,
40+
navigator: (UiComponent) -> Unit = {},
3941
imageOptions: ImageOptions? = null
4042
) {
43+
val actionModifier = imageUi.handler.consumeHandler(
44+
navigator = { navigator.invoke(imageUi) }
45+
)
46+
4147
val newModifier = if (version == 1) {
4248
modifier
49+
.then(actionModifier)
4350
.size(imageUi.size)
4451
.clip(RoundedCornerShape(8.dp))
4552
} else {
4653
modifier
54+
.then(actionModifier)
4755
.size(imageUi.size)
4856
.clip(RoundedCornerShape(16.dp))
4957
.border(

core/designsystem/src/main/kotlin/io/getstream/server/driven/core/designsystem/consumer/UiConsumer.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,23 @@ import io.getstream.server.driven.core.model.UiComponent
2525
@Composable
2626
fun UiComponent.Consume(
2727
modifier: Modifier = Modifier,
28-
version: Int = 0,
29-
onListItemClicked: (UiComponent) -> Unit = {}
28+
version: Int = 1,
29+
navigator: (UiComponent) -> Unit = {}
3030
) {
3131
when (this) {
3232
is TextUi -> ConsumeTextUi(textUi = this, modifier = modifier, version = version)
33-
is ImageUi -> ConsumeImageUi(imageUi = this, modifier = modifier, version = version)
33+
is ImageUi -> ConsumeImageUi(
34+
imageUi = this,
35+
modifier = modifier,
36+
version = version,
37+
navigator = navigator
38+
)
39+
3440
is ListUi -> ConsumeList(
3541
listUi = this,
3642
modifier = modifier,
3743
version = version,
38-
onListItemClicked = onListItemClicked
44+
onListItemClicked = navigator
3945
)
4046

4147
else -> ConsumeDefaultUi(uiComponent = this, version = version)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Designed and developed by 2024 skydoves (Jaewoong Eum)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.getstream.server.driven.core.model
17+
18+
import androidx.compose.runtime.Immutable
19+
import kotlinx.serialization.Serializable
20+
21+
@Immutable
22+
@Serializable
23+
data class Handler(
24+
val type: String,
25+
val actions: Map<String, String>
26+
)
27+
28+
enum class HandlerType(val value: String) {
29+
CLICK("click")
30+
}
31+
32+
enum class HandlerAction(val value: String) {
33+
NAVIGATION("navigation")
34+
}

core/model/src/main/kotlin/io/getstream/server/driven/core/model/ImageUi.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ data class ImageUi(
2424
val title: String = "",
2525
val url: String,
2626
val size: DpSizeUi = DpSizeUi(0, 0),
27-
val scaleType: String
27+
val scaleType: String,
28+
val handler: Handler? = null
2829
) : UiComponent {
2930

3031
fun toTextUi(

core/model/src/main/kotlin/io/getstream/server/driven/core/model/ListUi.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ data class ListUi(
2525
val layout: String,
2626
val itemSize: DpSizeUi,
2727
val items: List<ImageUi>,
28+
val handler: Handler? = null,
2829
val extra: Map<String, JsonElement> = mapOf()
2930
) : UiComponent
3031

feature/timeline/src/main/kotlin/io/getstream/server/driven/feature/timeline/Timeline.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package io.getstream.server.driven.feature.timeline
1717

1818
import androidx.compose.foundation.background
19-
import androidx.compose.foundation.clickable
2019
import androidx.compose.foundation.layout.Arrangement
2120
import androidx.compose.foundation.layout.Box
2221
import androidx.compose.foundation.layout.Column
@@ -36,7 +35,6 @@ import io.getstream.server.driven.core.designsystem.consumer.Consume
3635
import io.getstream.server.driven.core.designsystem.preview.DefaultPreview
3736
import io.getstream.server.driven.core.designsystem.preview.MockUtils
3837
import io.getstream.server.driven.core.designsystem.theme.ServerDrivenTheme
39-
import io.getstream.server.driven.core.model.ImageUi
4038
import io.getstream.server.driven.core.model.ScreenUi
4139
import io.getstream.server.driven.core.model.UiComponent
4240

@@ -73,16 +71,9 @@ private fun ServerDrivenTimelineContent(
7371
verticalArrangement = Arrangement.spacedBy(12.dp)
7472
) {
7573
timelineUi.components.forEach { uiComponent ->
76-
val modifier = if (uiComponent is ImageUi) {
77-
Modifier.clickable { navigateToDetails.invoke(uiComponent) }
78-
} else {
79-
Modifier
80-
}
81-
8274
uiComponent.Consume(
83-
modifier = modifier,
8475
version = timelineUi.version,
85-
onListItemClicked = { clickedComponent ->
76+
navigator = { clickedComponent ->
8677
navigateToDetails.invoke(clickedComponent)
8778
}
8879
)

0 commit comments

Comments
 (0)