@@ -4,12 +4,15 @@ import android.annotation.SuppressLint
44import android.content.res.Configuration
55import androidx.compose.foundation.background
66import androidx.compose.foundation.layout.Box
7+ import androidx.compose.foundation.layout.Spacer
78import androidx.compose.foundation.layout.aspectRatio
89import androidx.compose.foundation.layout.fillMaxSize
910import androidx.compose.foundation.layout.fillMaxWidth
11+ import androidx.compose.foundation.layout.height
1012import androidx.compose.foundation.layout.padding
1113import androidx.compose.foundation.layout.systemBarsPadding
1214import androidx.compose.foundation.lazy.LazyColumn
15+ import androidx.compose.foundation.lazy.items
1316import androidx.compose.foundation.shape.RoundedCornerShape
1417import androidx.compose.material.icons.Icons
1518import androidx.compose.material.icons.filled.LocationOn
@@ -34,6 +37,11 @@ import androidx.compose.ui.unit.dp
3437import androidx.constraintlayout.compose.ConstraintLayout
3538import androidx.constraintlayout.compose.Dimension
3639import com.kickstarter.R
40+ import com.kickstarter.features.projectstory.ProjectStoryUiState
41+ import com.kickstarter.features.projectstory.data.RichTextItem
42+ import com.kickstarter.features.projectstory.ui.RichTextItemPhotoComponent
43+ import com.kickstarter.features.projectstory.ui.RichTextItemTextComponent
44+ import com.kickstarter.features.projectstory.ui.WebViewComponent
3745import com.kickstarter.libs.utils.extensions.toHtml
3846import com.kickstarter.mock.factories.ProjectFactory
3947import com.kickstarter.models.Project
@@ -62,6 +70,7 @@ import com.kickstarter.ui.toolbars.compose.ToolbarIconToggleButton
6270import com.kickstarter.ui.toolbars.compose.TopToolBar
6371import com.kickstarter.ui.views.compose.KsCreatorLayout
6472import com.kickstarter.viewmodels.projectpage.SimilarProjectsUiState
73+ import timber.log.Timber
6574
6675@Composable
6776@Preview(name = " Light" , uiMode = Configuration .UI_MODE_NIGHT_NO )
@@ -71,7 +80,8 @@ fun PreLaunchProjectPageScreenPreview() {
7180 val project = ProjectFactory .backedProject()
7281 val projectState = remember { mutableStateOf(null ) }
7382 val similarProjectsState = remember { mutableStateOf(SimilarProjectsUiState ()) }
74- PreLaunchProjectPageScreen (projectState, similarProjectsState)
83+ val projectStoryState = remember { mutableStateOf(ProjectStoryUiState ()) }
84+ PreLaunchProjectPageScreen (projectState, similarProjectsState, projectStoryState)
7585 }
7686}
7787
@@ -93,6 +103,7 @@ enum class PreLaunchProjectPageScreenTestTag() {
93103fun PreLaunchProjectPageScreen (
94104 projectState : State <Project ?>,
95105 similarProjectsState : State <SimilarProjectsUiState >,
106+ projectStoryState : State <ProjectStoryUiState >,
96107 leftOnClickAction : () -> Unit = {},
97108 rightOnClickAction : () -> Unit = {},
98109 middleRightClickAction : () -> Unit = {},
@@ -102,6 +113,8 @@ fun PreLaunchProjectPageScreen(
102113 numberOfFollowers : String? = null
103114) {
104115 val project = projectState.value
116+ val story = projectStoryState.value.storiedProject?.story
117+
105118 Scaffold (
106119 modifier = Modifier .systemBarsPadding(),
107120 topBar = {
@@ -129,7 +142,7 @@ fun PreLaunchProjectPageScreen(
129142 modifier = Modifier
130143 .padding(contentPadding)
131144 .fillMaxSize()
132- .background(colors.kds_support_100 )
145+ .background(colors.preLaunchProjectPage.background )
133146 ) {
134147 val (lazyColumn, buttonCardLayout) = createRefs()
135148 val screenPadding = dimensionResource(id = R .dimen.activity_horizontal_margin)
@@ -256,19 +269,78 @@ fun PreLaunchProjectPageScreen(
256269 }
257270 }
258271
259- item {
260- val spcMarginTop = dimensionResource(id = R .dimen.grid_3)
261- val spcMarginBottom = dimensionResource(id = R .dimen.grid_27)
272+ if (story?.items != null && story.items.isNotEmpty()) {
273+ item {
274+ Spacer (Modifier .height(dimensionResource(id = R .dimen.grid_2)))
275+ }
276+ }
262277
278+ items(story?.items ? : listOf<RichTextItem >(), contentType = { it::class .simpleName }) { item ->
263279 Box (
264- modifier = Modifier
265- .padding(top = spcMarginTop, bottom = spcMarginBottom)
266- .testTag(SIMILAR_PROJECTS_CONTAINER .name)
280+ modifier = Modifier .padding(horizontal = screenPadding, vertical = dimensionResource(id = R .dimen.grid_1))
267281 ) {
268- SimilarProjectsComponent (
269- uiState = similarProjectsState,
270- onClick = onSimilarProjectClick
271- )
282+ when (item) {
283+ is RichTextItem .Text -> {
284+ when (item) {
285+ is RichTextItem .Text .Paragraph -> {
286+ val childPhoto = item.children?.firstOrNull { it is RichTextItem .Photo } as ? RichTextItem .Photo
287+ when {
288+ childPhoto != null -> {
289+ val link = item.link
290+ RichTextItemPhotoComponent (childPhoto, link)
291+ }
292+ else -> RichTextItemTextComponent (item)
293+ }
294+ }
295+ else -> {
296+ RichTextItemTextComponent (item)
297+ }
298+ }
299+ }
300+ is RichTextItem .Photo -> {
301+ Box (
302+ modifier = Modifier .fillMaxWidth().padding(vertical = 6 .dp) // .defaultMinSize(minHeight = 200.dp)
303+ ) {
304+ RichTextItemPhotoComponent (item)
305+ }
306+ }
307+ is RichTextItem .Oembed -> {
308+ Timber .d(" RichTextItem.Oembed item: $item " )
309+ if (item.iframeUrl.isNotEmpty()) {
310+ val aspectRatio = if (item.width > 0 && item.height > 0 ) {
311+ item.width.toFloat() / item.height.toFloat()
312+ } else {
313+ 16f / 9f
314+ }
315+ Box (
316+ modifier = Modifier .fillMaxWidth().aspectRatio(aspectRatio)
317+ ) {
318+ WebViewComponent (item.iframeUrl)
319+ }
320+ }
321+ }
322+ else -> {}
323+ }
324+ }
325+ }
326+
327+ if (! projectStoryState.value.isLoading &&
328+ (projectStoryState.value.storiedProject != null || projectStoryState.value.error != null )
329+ ) {
330+ item {
331+ val spcMarginTop = dimensionResource(id = R .dimen.grid_3)
332+ val spcMarginBottom = dimensionResource(id = R .dimen.grid_27)
333+
334+ Box (
335+ modifier = Modifier
336+ .padding(top = spcMarginTop, bottom = spcMarginBottom)
337+ .testTag(SIMILAR_PROJECTS_CONTAINER .name)
338+ ) {
339+ SimilarProjectsComponent (
340+ uiState = similarProjectsState,
341+ onClick = onSimilarProjectClick
342+ )
343+ }
272344 }
273345 }
274346 }
0 commit comments