make reviews card collapsable on smaller screens

This commit is contained in:
Owen LeJeune
2023-08-01 10:28:04 -04:00
parent cf2e26c4f6
commit 6fe0b9f1dd

View File

@@ -76,6 +76,7 @@ import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedMovie
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.DetailedTv
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Genre
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.ImageCollection
import com.owenlejeune.tvtime.api.tmdb.api.v3.model.Review
import com.owenlejeune.tvtime.extensions.DateFormat
import com.owenlejeune.tvtime.extensions.WindowSizeClass
import com.owenlejeune.tvtime.extensions.combineWith
@@ -99,6 +100,7 @@ import com.owenlejeune.tvtime.ui.components.ChipStyle
import com.owenlejeune.tvtime.ui.components.CircleBackgroundColorImage
import com.owenlejeune.tvtime.ui.components.ContentCard
import com.owenlejeune.tvtime.ui.components.DetailHeader
import com.owenlejeune.tvtime.ui.components.ExpandableContentCard
import com.owenlejeune.tvtime.ui.components.ExternalIdsArea
import com.owenlejeune.tvtime.ui.components.HtmlText
import com.owenlejeune.tvtime.ui.components.ImageGalleryOverlay
@@ -385,7 +387,7 @@ fun MediaViewContent(
}
if (windowSize != WindowSizeClass.Expanded) {
ReviewsCard(itemId = itemId, type = type, mainViewModel = mainViewModel)
ReviewsCard(itemId = itemId, type = type, mainViewModel = mainViewModel, windowSize = windowSize)
}
}
}
@@ -400,7 +402,7 @@ fun MediaViewContent(
.weight(1f)
.verticalScroll(state = rememberScrollState())
) {
ReviewsCard(itemId = itemId, type = type, mainViewModel = mainViewModel)
ReviewsCard(itemId = itemId, type = type, mainViewModel = mainViewModel, windowSize = windowSize)
Spacer(modifier = Modifier.height(16.dp))
}
@@ -837,7 +839,12 @@ private fun SeasonCard(
modifier = Modifier
.padding(all = 12.dp)
.clickable {
appNavController.navigate(AppNavItem.DetailView.withArgs(MediaViewType.SEASON, itemId.combineWith(it.seasonNumber)))
appNavController.navigate(
AppNavItem.DetailView.withArgs(
MediaViewType.SEASON,
itemId.combineWith(it.seasonNumber)
)
)
}
) {
PosterItem(
@@ -1073,15 +1080,56 @@ private fun NextMcuProjectCard(
private fun ReviewsCard(
itemId: Int,
type: MediaViewType,
windowSize: WindowSizeClass,
mainViewModel: MainViewModel,
modifier: Modifier = Modifier
) {
val reviewsMap = remember { mainViewModel.produceReviewsFor(type) }
val reviews = reviewsMap[itemId]
if (windowSize == WindowSizeClass.Expanded) {
ListContentCard(
modifier = modifier,
header = {
ReviewsCardHeader()
},
) {
ReviewsCardContent(reviews = reviews)
}
} else {
ExpandableContentCard(
modifier = modifier,
title = {
Box(
modifier = Modifier
.padding(horizontal = 16.dp)
.padding(top = 16.dp)
) {
ReviewsCardHeader()
}
}
) { isExpanded ->
val reviewsSubList = reviews?.let {
if (isExpanded) {
reviews
} else {
reviews.subList(0, 3)
}
} ?: emptyList()
Column(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
ReviewsCardContent(reviews = reviewsSubList)
}
}
}
}
@Composable
private fun ReviewsCardHeader() {
Column(
verticalArrangement = Arrangement.spacedBy(9.dp)
) {
@@ -1134,7 +1182,11 @@ private fun ReviewsCard(
}
}
}
},
}
@Composable
private fun ReviewsCardContent(
reviews: List<Review>?
) {
if (reviews?.isNotEmpty() == true) {
reviews.reversed().forEachIndexed { index, review ->
@@ -1197,7 +1249,6 @@ private fun ReviewsCard(
)
}
}
}
@Composable
fun DetailsFor(