mirror of
https://github.com/bbara04/Purefin.git
synced 2026-07-23 19:26:50 +00:00
fix(tv): open selected episode in series screen
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user