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.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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user