Skip to content

Commit b605f1f

Browse files
committed
Apply versioning to the details screen
1 parent 5da26f0 commit b605f1f

File tree

6 files changed

+42
-30
lines changed

6 files changed

+42
-30
lines changed

app/src/main/kotlin/io/getstream/server/driven/compose/navigation/ServerDrivenNavHost.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import androidx.navigation.compose.composable
2727
import androidx.navigation.compose.rememberNavController
2828
import androidx.navigation.toRoute
2929
import io.getstream.server.driven.core.designsystem.theme.ServerDrivenTheme
30+
import io.getstream.server.driven.core.model.ScreenUi
3031
import io.getstream.server.driven.core.navigation.AppComposeNavigator
3132
import io.getstream.server.driven.core.navigation.ServerDrivenScreen
3233
import io.getstream.server.driven.feature.details.PostDetails
@@ -53,8 +54,15 @@ fun ServerDrivenNavHost(
5354
) {
5455
composable<ServerDrivenScreen.Timeline> {
5556
ServerDrivenTimeline(
56-
navigateToDetails = { component ->
57-
composeNavigator.navigate(ServerDrivenScreen.Details(component))
57+
navigateToDetails = { component, version ->
58+
composeNavigator.navigate(
59+
ServerDrivenScreen.Details(
60+
ScreenUi(
61+
version = version,
62+
components = listOf(component)
63+
)
64+
)
65+
)
5866
}
5967
)
6068
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
package io.getstream.server.driven.core.model
1717

1818
import androidx.compose.runtime.Immutable
19+
import kotlinx.serialization.Serializable
1920

2021
@Immutable
22+
@Serializable
2123
data class ScreenUi(
2224
val version: Int,
2325
val components: List<UiComponent>

core/navigation/src/main/kotlin/io/getstream/server/driven/core/navigation/ServerDrivenScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
*/
1616
package io.getstream.server.driven.core.navigation
1717

18-
import io.getstream.server.driven.core.model.UiComponent
19-
import io.getstream.server.driven.core.navigation.navtypes.UiComponentNavType
18+
import io.getstream.server.driven.core.model.ScreenUi
19+
import io.getstream.server.driven.core.navigation.navtypes.ScreenUiNavType
2020
import kotlin.reflect.typeOf
2121
import kotlinx.serialization.Serializable
2222

@@ -26,10 +26,10 @@ sealed interface ServerDrivenScreen {
2626
data object Timeline : ServerDrivenScreen
2727

2828
@Serializable
29-
data class Details(val ui: UiComponent) : ServerDrivenScreen {
29+
data class Details(val ui: ScreenUi) : ServerDrivenScreen {
3030

3131
companion object {
32-
val typeMap = mapOf(typeOf<UiComponent>() to UiComponentNavType)
32+
val typeMap = mapOf(typeOf<ScreenUi>() to ScreenUiNavType)
3333
}
3434
}
3535
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,33 @@ package io.getstream.server.driven.core.navigation.navtypes
1818
import android.net.Uri
1919
import android.os.Bundle
2020
import androidx.navigation.NavType
21-
import io.getstream.server.driven.core.model.UiComponent
21+
import io.getstream.server.driven.core.model.ScreenUi
2222
import kotlinx.serialization.encodeToString
2323
import kotlinx.serialization.json.Json
2424

25-
object UiComponentNavType : NavType<UiComponent?>(isNullableAllowed = true) {
25+
object ScreenUiNavType : NavType<ScreenUi?>(isNullableAllowed = true) {
2626

2727
private val json = Json
2828

29-
override fun get(bundle: Bundle, key: String): UiComponent? {
29+
override fun get(bundle: Bundle, key: String): ScreenUi? {
3030
val stringValue = bundle.getString(key) ?: return null
31-
val component = json.decodeFromString<UiComponent>(stringValue)
31+
val component = json.decodeFromString<ScreenUi>(stringValue)
3232
return component
3333
}
3434

35-
override fun put(bundle: Bundle, key: String, value: UiComponent?) {
35+
override fun put(bundle: Bundle, key: String, value: ScreenUi?) {
3636
val stringValue = json.encodeToString(value)
3737
bundle.putSerializable(key, stringValue)
3838
}
3939

40-
override fun serializeAsValue(value: UiComponent?): String {
40+
override fun serializeAsValue(value: ScreenUi?): String {
4141
// Serialized values must always be Uri encoded
4242
return Uri.encode(Json.encodeToString(value))
4343
}
4444

45-
override fun parseValue(value: String): UiComponent? {
45+
override fun parseValue(value: String): ScreenUi? {
4646
// Navigation takes care of decoding the string
4747
// before passing it to parseValue()
48-
return Json.decodeFromString<UiComponent?>(value)
48+
return Json.decodeFromString<ScreenUi?>(value)
4949
}
5050
}

feature/details/src/main/kotlin/io/getstream/server/driven/feature/details/ServerDrivenDetails.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ import io.getstream.server.driven.core.designsystem.consumer.Consume
3232
import io.getstream.server.driven.core.designsystem.preview.MockUtils.mockTextUi2
3333
import io.getstream.server.driven.core.designsystem.theme.ServerDrivenTheme
3434
import io.getstream.server.driven.core.model.ImageUi
35-
import io.getstream.server.driven.core.model.UiComponent
35+
import io.getstream.server.driven.core.model.ScreenUi
3636

3737
@Composable
3838
fun PostDetails(
39-
detailsUi: UiComponent
39+
detailsUi: ScreenUi
4040
) {
4141
Column(
4242
modifier = Modifier
@@ -46,18 +46,20 @@ fun PostDetails(
4646
.verticalScroll(state = rememberScrollState()),
4747
verticalArrangement = Arrangement.spacedBy(12.dp)
4848
) {
49-
Box(
50-
modifier = Modifier
51-
.fillMaxWidth()
52-
.height(300.dp)
53-
) {
54-
detailsUi.Consume()
55-
}
49+
detailsUi.components.forEach { component ->
50+
Box(
51+
modifier = Modifier
52+
.fillMaxWidth()
53+
.height(300.dp)
54+
) {
55+
component.Consume(version = detailsUi.version)
56+
}
5657

57-
if (detailsUi is ImageUi && detailsUi.title.isNotEmpty()) {
58-
detailsUi.toTextUi().Consume()
58+
if (component is ImageUi && component.title.isNotEmpty()) {
59+
component.toTextUi().Consume(version = detailsUi.version)
60+
}
5961
}
6062

61-
mockTextUi2.Consume()
63+
mockTextUi2.Consume(version = detailsUi.version)
6264
}
6365
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import io.getstream.server.driven.core.model.UiComponent
4141
@Composable
4242
fun ServerDrivenTimeline(
4343
timelineViewModel: TimelineViewModel = hiltViewModel(),
44-
navigateToDetails: (UiComponent) -> Unit
44+
navigateToDetails: (UiComponent, Int) -> Unit
4545
) {
4646
val timelineUi by timelineViewModel.timelineUi.collectAsStateWithLifecycle()
4747

@@ -60,7 +60,7 @@ fun ServerDrivenTimeline(
6060
@Composable
6161
private fun ServerDrivenTimelineContent(
6262
timelineUi: ScreenUi,
63-
navigateToDetails: (UiComponent) -> Unit
63+
navigateToDetails: (UiComponent, Int) -> Unit
6464
) {
6565
Column(
6666
modifier = Modifier
@@ -74,7 +74,7 @@ private fun ServerDrivenTimelineContent(
7474
uiComponent.Consume(
7575
version = timelineUi.version,
7676
navigator = { clickedComponent ->
77-
navigateToDetails.invoke(clickedComponent)
77+
navigateToDetails.invoke(clickedComponent, timelineUi.version)
7878
}
7979
)
8080
}
@@ -94,7 +94,7 @@ private fun ServerDrivenTimelineContentPreview() {
9494
MockUtils.mockTextUi2
9595
)
9696
),
97-
navigateToDetails = {}
97+
navigateToDetails = { _, _ -> }
9898
)
9999
}
100100
}

0 commit comments

Comments
 (0)