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.navigation3.runtime.EntryProviderScope
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.series.TvSeriesScreen
import hu.bbara.purefin.ui.screen.login.LoginScreen
@@ -37,7 +36,10 @@ fun EntryProviderScope<Route>.tvSeriesSection() {
fun EntryProviderScope<Route>.tvEpisodeSection() {
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
fun TvSeriesScreen(
series: SeriesDto,
focusedEpisodeId: UUID? = null,
modifier: Modifier = Modifier,
viewModel: SeriesViewModel = hiltViewModel()
) {
@@ -51,6 +52,7 @@ fun TvSeriesScreen(
TvSeriesScreenContent(
series = seriesData,
onPlayEpisode = viewModel::onPlayEpisode,
focusedEpisodeId = focusedEpisodeId,
modifier = modifier
)
} else {
@@ -62,16 +64,25 @@ fun TvSeriesScreen(
internal fun TvSeriesScreenContent(
series: Series,
onPlayEpisode: (UUID) -> Unit,
focusedEpisodeId: UUID? = null,
modifier: Modifier = Modifier,
) {
val nextUpEpisode = remember(series.id) { series.nextUpEpisode() }
var selectedSeason by remember(series.id, nextUpEpisode?.seasonId) {
mutableStateOf(series.defaultSeason(nextUpEpisode))
val focusedEpisode = remember(series.id, focusedEpisodeId) {
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() }
LaunchedEffect(series.id, nextUpEpisode?.id) {
if (nextUpEpisode != null) return@LaunchedEffect
LaunchedEffect(series.id, initialEpisode?.id) {
if (initialEpisode != null) return@LaunchedEffect
withFrameNanos { }
firstContentFocusRequester.requestFocus()
}
@@ -107,7 +118,7 @@ internal fun TvSeriesScreenContent(
TvEpisodeCarousel(
episodes = selectedSeason.episodes,
onPlayEpisode = { onPlayEpisode(it.id) },
focusedEpisodeId = nextUpEpisode?.id,
focusedEpisodeId = initialEpisode?.id,
modifier = Modifier.fillMaxWidth()
)
}

View File

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