fix(tv): open selected episode in series screen

This commit is contained in:
2026-05-01 20:59:50 +02:00
parent bfc007f24f
commit e738e9637f
3 changed files with 25 additions and 8 deletions

View File

@@ -3,7 +3,6 @@ package hu.bbara.purefin.navigation
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.EntryProviderScope
import hu.bbara.purefin.feature.browse.home.AppViewModel import hu.bbara.purefin.feature.browse.home.AppViewModel
import hu.bbara.purefin.ui.screen.episode.TvEpisodeScreen
import hu.bbara.purefin.ui.screen.movie.TvMovieScreen import hu.bbara.purefin.ui.screen.movie.TvMovieScreen
import hu.bbara.purefin.ui.screen.series.TvSeriesScreen import hu.bbara.purefin.ui.screen.series.TvSeriesScreen
import hu.bbara.purefin.ui.screen.login.LoginScreen import hu.bbara.purefin.ui.screen.login.LoginScreen
@@ -37,7 +36,10 @@ fun EntryProviderScope<Route>.tvSeriesSection() {
fun EntryProviderScope<Route>.tvEpisodeSection() { fun EntryProviderScope<Route>.tvEpisodeSection() {
entry<Route.EpisodeRoute> { route -> entry<Route.EpisodeRoute> { route ->
TvEpisodeScreen(episode = route.item) TvSeriesScreen(
series = SeriesDto(id = route.item.seriesId),
focusedEpisodeId = route.item.id
)
} }
} }

View File

@@ -37,6 +37,7 @@ import java.util.UUID
@Composable @Composable
fun TvSeriesScreen( fun TvSeriesScreen(
series: SeriesDto, series: SeriesDto,
focusedEpisodeId: UUID? = null,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: SeriesViewModel = hiltViewModel() viewModel: SeriesViewModel = hiltViewModel()
) { ) {
@@ -51,6 +52,7 @@ fun TvSeriesScreen(
TvSeriesScreenContent( TvSeriesScreenContent(
series = seriesData, series = seriesData,
onPlayEpisode = viewModel::onPlayEpisode, onPlayEpisode = viewModel::onPlayEpisode,
focusedEpisodeId = focusedEpisodeId,
modifier = modifier modifier = modifier
) )
} else { } else {
@@ -62,16 +64,25 @@ fun TvSeriesScreen(
internal fun TvSeriesScreenContent( internal fun TvSeriesScreenContent(
series: Series, series: Series,
onPlayEpisode: (UUID) -> Unit, onPlayEpisode: (UUID) -> Unit,
focusedEpisodeId: UUID? = null,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val nextUpEpisode = remember(series.id) { series.nextUpEpisode() } val nextUpEpisode = remember(series.id) { series.nextUpEpisode() }
var selectedSeason by remember(series.id, nextUpEpisode?.seasonId) { val focusedEpisode = remember(series.id, focusedEpisodeId) {
mutableStateOf(series.defaultSeason(nextUpEpisode)) focusedEpisodeId?.let { id ->
series.seasons
.flatMap { it.episodes }
.firstOrNull { it.id == id }
}
}
val initialEpisode = focusedEpisode ?: nextUpEpisode
var selectedSeason by remember(series.id, initialEpisode?.seasonId) {
mutableStateOf(series.defaultSeason(initialEpisode))
} }
val firstContentFocusRequester = remember { FocusRequester() } val firstContentFocusRequester = remember { FocusRequester() }
LaunchedEffect(series.id, nextUpEpisode?.id) { LaunchedEffect(series.id, initialEpisode?.id) {
if (nextUpEpisode != null) return@LaunchedEffect if (initialEpisode != null) return@LaunchedEffect
withFrameNanos { } withFrameNanos { }
firstContentFocusRequester.requestFocus() firstContentFocusRequester.requestFocus()
} }
@@ -107,7 +118,7 @@ internal fun TvSeriesScreenContent(
TvEpisodeCarousel( TvEpisodeCarousel(
episodes = selectedSeason.episodes, episodes = selectedSeason.episodes,
onPlayEpisode = { onPlayEpisode(it.id) }, onPlayEpisode = { onPlayEpisode(it.id) },
focusedEpisodeId = nextUpEpisode?.id, focusedEpisodeId = initialEpisode?.id,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
} }

View File

@@ -171,7 +171,11 @@ class AppViewModel @Inject constructor(
when (mediaUiModel) { when (mediaUiModel) {
is MovieUiModel -> onMovieSelected(mediaUiModel.id) is MovieUiModel -> onMovieSelected(mediaUiModel.id)
is SeriesUiModel -> onSeriesSelected(mediaUiModel.id) is SeriesUiModel -> onSeriesSelected(mediaUiModel.id)
is EpisodeUiModel -> onSeriesSelected(mediaUiModel.seriesId) is EpisodeUiModel -> onEpisodeSelected(
seriesId = mediaUiModel.seriesId,
seasonId = mediaUiModel.seasonId,
episodeId = mediaUiModel.id
)
} }
} }