From 3d17b7e614c523edf48569b5d32d73f69ea9ca10 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Sat, 24 Jan 2026 14:57:06 +0100 Subject: [PATCH] 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`. --- .../app/content/series/SeriesComponents.kt | 29 ++++++++++------- .../app/content/series/SeriesScreen.kt | 31 ++++++++++--------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt index 08dd51b..b0015db 100644 --- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt +++ b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio @@ -116,7 +115,12 @@ internal fun SeriesActionButtons(modifier: Modifier = Modifier) { } @Composable -internal fun SeasonTabs(seasons: List, modifier: Modifier = Modifier) { +internal fun SeasonTabs( + seasons: List, + selectedSeason: SeriesSeasonUiModel?, + modifier: Modifier = Modifier, + onSelect: (SeriesSeasonUiModel) -> Unit +) { Row( modifier = modifier .fillMaxWidth() @@ -124,21 +128,28 @@ internal fun SeasonTabs(seasons: List, modifier: Modifier = horizontalArrangement = Arrangement.spacedBy(20.dp) ) { seasons.forEach { season -> - SeasonTab(name = season.name, isSelected = season.isSelected) + SeasonTab( + name = season.name, + isSelected = season == selectedSeason, + modifier = Modifier.clickable { onSelect(season) } + ) } } } @Composable -private fun SeasonTab(name: String, isSelected: Boolean) { +private fun SeasonTab( + name: String, + isSelected: Boolean, + modifier: Modifier = Modifier +) { val scheme = MaterialTheme.colorScheme val mutedStrong = scheme.onSurfaceVariant.copy(alpha = 0.7f) val color = if (isSelected) scheme.primary else mutedStrong val borderColor = if (isSelected) scheme.primary else Color.Transparent Column( - modifier = Modifier + modifier = modifier .padding(bottom = 8.dp) - .clickable { } ) { Text( text = name, @@ -160,7 +171,7 @@ private fun SeasonTab(name: String, isSelected: Boolean) { internal fun EpisodeCarousel(episodes: List, modifier: Modifier = Modifier) { LazyRow( modifier = modifier, - contentPadding = PaddingValues(horizontal = 20.dp), +// contentPadding = PaddingValues(horizontal = 20.dp), horizontalArrangement = Arrangement.spacedBy(16.dp) ) { items(episodes) { episode -> @@ -179,10 +190,6 @@ private fun EpisodeCard( Column( modifier = Modifier .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) }, verticalArrangement = Arrangement.spacedBy(12.dp) ) { diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt index 12ba41f..32ef314 100644 --- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt +++ b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt @@ -14,6 +14,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight 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.hilt.navigation.compose.hiltViewModel 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.PurefinWaitingScreen import hu.bbara.purefin.common.ui.components.MediaHero import hu.bbara.purefin.navigation.ItemDto @@ -58,6 +60,12 @@ private fun SeriesScreenInternal( val scheme = MaterialTheme.colorScheme 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(getDefaultSeason()) } + Scaffold( modifier = modifier, containerColor = MaterialTheme.colorScheme.background, @@ -104,22 +112,17 @@ private fun SeriesScreenInternal( bodyLineHeight = null, titleSpacing = 8.dp ) - Spacer(modifier = Modifier.height(28.dp)) - Text( - text = "Episodes", - color = scheme.onBackground, - fontSize = 18.sp, - fontWeight = FontWeight.Bold + Spacer(modifier = Modifier.height(24.dp)) + SeasonTabs( + seasons = series.seasonTabs, + selectedSeason = selectedSeason.value, + onSelect = { selectedSeason.value = it } ) - Spacer(modifier = Modifier.height(28.dp)) - SeasonTabs(seasons = series.seasonTabs) - Spacer(modifier = Modifier.height(16.dp)) +// Spacer(modifier = Modifier.height(16.dp)) EpisodeCarousel( - episodes = series.seasonTabs.firstOrNull { it.isSelected }?.episodes - ?: series.seasonTabs.firstOrNull()?.episodes - ?: emptyList() + episodes = selectedSeason.value.episodes ) - Spacer(modifier = Modifier.height(32.dp)) + Spacer(modifier = Modifier.height(16.dp)) Text( text = "Cast", color = scheme.onBackground,