implement season selection logic and update SeriesScreen UI

- Update `SeasonTabs` to handle selection state and provide an `onSelect` callback.
- Implement `selectedSeason` state in `SeriesScreen` using `remember` and `mutableStateOf`.
- Refactor `SeriesScreen` to display episodes based on the currently selected season.
- Adjust spacing and remove redundant styling from `EpisodeCarousel` items.
- Clean up unused imports and commented-out code in `SeriesComponents.kt`.
This commit is contained in:
2026-01-24 14:57:06 +01:00
parent d102d80c09
commit 3d17b7e614
2 changed files with 35 additions and 25 deletions

View File

@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.aspectRatio
@@ -116,7 +115,12 @@ internal fun SeriesActionButtons(modifier: Modifier = Modifier) {
} }
@Composable @Composable
internal fun SeasonTabs(seasons: List<SeriesSeasonUiModel>, modifier: Modifier = Modifier) { internal fun SeasonTabs(
seasons: List<SeriesSeasonUiModel>,
selectedSeason: SeriesSeasonUiModel?,
modifier: Modifier = Modifier,
onSelect: (SeriesSeasonUiModel) -> Unit
) {
Row( Row(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
@@ -124,21 +128,28 @@ internal fun SeasonTabs(seasons: List<SeriesSeasonUiModel>, modifier: Modifier =
horizontalArrangement = Arrangement.spacedBy(20.dp) horizontalArrangement = Arrangement.spacedBy(20.dp)
) { ) {
seasons.forEach { season -> seasons.forEach { season ->
SeasonTab(name = season.name, isSelected = season.isSelected) SeasonTab(
name = season.name,
isSelected = season == selectedSeason,
modifier = Modifier.clickable { onSelect(season) }
)
} }
} }
} }
@Composable @Composable
private fun SeasonTab(name: String, isSelected: Boolean) { private fun SeasonTab(
name: String,
isSelected: Boolean,
modifier: Modifier = Modifier
) {
val scheme = MaterialTheme.colorScheme val scheme = MaterialTheme.colorScheme
val mutedStrong = scheme.onSurfaceVariant.copy(alpha = 0.7f) val mutedStrong = scheme.onSurfaceVariant.copy(alpha = 0.7f)
val color = if (isSelected) scheme.primary else mutedStrong val color = if (isSelected) scheme.primary else mutedStrong
val borderColor = if (isSelected) scheme.primary else Color.Transparent val borderColor = if (isSelected) scheme.primary else Color.Transparent
Column( Column(
modifier = Modifier modifier = modifier
.padding(bottom = 8.dp) .padding(bottom = 8.dp)
.clickable { }
) { ) {
Text( Text(
text = name, text = name,
@@ -160,7 +171,7 @@ private fun SeasonTab(name: String, isSelected: Boolean) {
internal fun EpisodeCarousel(episodes: List<SeriesEpisodeUiModel>, modifier: Modifier = Modifier) { internal fun EpisodeCarousel(episodes: List<SeriesEpisodeUiModel>, modifier: Modifier = Modifier) {
LazyRow( LazyRow(
modifier = modifier, modifier = modifier,
contentPadding = PaddingValues(horizontal = 20.dp), // contentPadding = PaddingValues(horizontal = 20.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp) horizontalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
items(episodes) { episode -> items(episodes) { episode ->
@@ -179,10 +190,6 @@ private fun EpisodeCard(
Column( Column(
modifier = Modifier modifier = Modifier
.width(260.dp) .width(260.dp)
.clip(RoundedCornerShape(16.dp))
.background(scheme.surfaceVariant.copy(alpha = 0.6f))
.border(1.dp, scheme.outlineVariant, RoundedCornerShape(16.dp))
.padding(12.dp)
.clickable { viewModel.onSelectEpisode(episode.id) }, .clickable { viewModel.onSelectEpisode(episode.id) },
verticalArrangement = Arrangement.spacedBy(12.dp) verticalArrangement = Arrangement.spacedBy(12.dp)
) { ) {

View File

@@ -14,6 +14,8 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
@@ -21,8 +23,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import hu.bbara.purefin.app.content.ContentMockData import hu.bbara.purefin.app.content.ContentMockData
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.MediaSynopsis import hu.bbara.purefin.common.ui.MediaSynopsis
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.components.MediaHero import hu.bbara.purefin.common.ui.components.MediaHero
import hu.bbara.purefin.navigation.ItemDto import hu.bbara.purefin.navigation.ItemDto
@@ -58,6 +60,12 @@ private fun SeriesScreenInternal(
val scheme = MaterialTheme.colorScheme val scheme = MaterialTheme.colorScheme
val textMutedStrong = scheme.onSurfaceVariant.copy(alpha = 0.7f) val textMutedStrong = scheme.onSurfaceVariant.copy(alpha = 0.7f)
fun getDefaultSeason() : SeriesSeasonUiModel {
// TODO get next next episodes season selected or add logic to it.
return series.seasonTabs.first()
}
val selectedSeason = remember { mutableStateOf<SeriesSeasonUiModel>(getDefaultSeason()) }
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
containerColor = MaterialTheme.colorScheme.background, containerColor = MaterialTheme.colorScheme.background,
@@ -104,22 +112,17 @@ private fun SeriesScreenInternal(
bodyLineHeight = null, bodyLineHeight = null,
titleSpacing = 8.dp titleSpacing = 8.dp
) )
Spacer(modifier = Modifier.height(28.dp)) Spacer(modifier = Modifier.height(24.dp))
Text( SeasonTabs(
text = "Episodes", seasons = series.seasonTabs,
color = scheme.onBackground, selectedSeason = selectedSeason.value,
fontSize = 18.sp, onSelect = { selectedSeason.value = it }
fontWeight = FontWeight.Bold
) )
Spacer(modifier = Modifier.height(28.dp)) // Spacer(modifier = Modifier.height(16.dp))
SeasonTabs(seasons = series.seasonTabs)
Spacer(modifier = Modifier.height(16.dp))
EpisodeCarousel( EpisodeCarousel(
episodes = series.seasonTabs.firstOrNull { it.isSelected }?.episodes episodes = selectedSeason.value.episodes
?: series.seasonTabs.firstOrNull()?.episodes
?: emptyList()
) )
Spacer(modifier = Modifier.height(32.dp)) Spacer(modifier = Modifier.height(16.dp))
Text( Text(
text = "Cast", text = "Cast",
color = scheme.onBackground, color = scheme.onBackground,