mirror of
https://github.com/bbara04/Purefin.git
synced 2026-07-24 03:36:51 +00:00
refactor: remove top bar components from Movie, Series, and Episode screens in the tv ui
This commit is contained in:
@@ -21,50 +21,11 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import hu.bbara.purefin.common.ui.MediaMetaChip
|
import hu.bbara.purefin.common.ui.MediaMetaChip
|
||||||
import hu.bbara.purefin.common.ui.components.MediaDetailsTopBar
|
|
||||||
import hu.bbara.purefin.common.ui.components.MediaDetailsTopBarShortcut
|
|
||||||
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
||||||
import hu.bbara.purefin.core.data.navigation.Route
|
|
||||||
import hu.bbara.purefin.core.model.Episode
|
import hu.bbara.purefin.core.model.Episode
|
||||||
|
|
||||||
internal const val EpisodePlayButtonTag = "episode-play-button"
|
internal const val EpisodePlayButtonTag = "episode-play-button"
|
||||||
|
|
||||||
internal sealed interface EpisodeTopBarShortcut {
|
|
||||||
val label: String
|
|
||||||
val onClick: () -> Unit
|
|
||||||
|
|
||||||
data class Series(override val onClick: () -> Unit) : EpisodeTopBarShortcut {
|
|
||||||
override val label: String = "Series"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun episodeTopBarShortcut(
|
|
||||||
previousRoute: Route?,
|
|
||||||
onSeriesClick: () -> Unit
|
|
||||||
): EpisodeTopBarShortcut? {
|
|
||||||
return when (previousRoute) {
|
|
||||||
Route.Home -> EpisodeTopBarShortcut.Series(onClick = onSeriesClick)
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
internal fun EpisodeTopBar(
|
|
||||||
onBack: () -> Unit,
|
|
||||||
shortcut: EpisodeTopBarShortcut? = null,
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
backFocusRequester: FocusRequester? = null,
|
|
||||||
downFocusRequester: FocusRequester? = null
|
|
||||||
) {
|
|
||||||
MediaDetailsTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
shortcut = shortcut?.let { MediaDetailsTopBarShortcut(label = it.label, onClick = it.onClick) },
|
|
||||||
modifier = modifier,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = downFocusRequester
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
@OptIn(ExperimentalLayoutApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
internal fun EpisodeHeroSection(
|
internal fun EpisodeHeroSection(
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import androidx.compose.runtime.Composable
|
|||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -58,12 +57,6 @@ fun EpisodeScreen(
|
|||||||
EpisodeScreenContent(
|
EpisodeScreenContent(
|
||||||
episode = selectedEpisode,
|
episode = selectedEpisode,
|
||||||
seriesTitle = seriesTitle.value,
|
seriesTitle = seriesTitle.value,
|
||||||
topBarShortcut = remember(previousRoute, viewModel) {
|
|
||||||
episodeTopBarShortcut(
|
|
||||||
previousRoute = previousRoute,
|
|
||||||
onSeriesClick = viewModel::onSeriesClick
|
|
||||||
)
|
|
||||||
},
|
|
||||||
onBack = viewModel::onBack,
|
onBack = viewModel::onBack,
|
||||||
onPlay = remember(selectedEpisode.id, navigationManager) {
|
onPlay = remember(selectedEpisode.id, navigationManager) {
|
||||||
{
|
{
|
||||||
@@ -80,7 +73,6 @@ fun EpisodeScreen(
|
|||||||
internal fun EpisodeScreenContent(
|
internal fun EpisodeScreenContent(
|
||||||
episode: Episode,
|
episode: Episode,
|
||||||
seriesTitle: String?,
|
seriesTitle: String?,
|
||||||
topBarShortcut: EpisodeTopBarShortcut?,
|
|
||||||
onBack: () -> Unit,
|
onBack: () -> Unit,
|
||||||
onPlay: () -> Unit,
|
onPlay: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
@@ -96,15 +88,6 @@ internal fun EpisodeScreenContent(
|
|||||||
heroImageUrl = JellyfinImageHelper.finishImageUrl(episode.imageUrlPrefix, ImageType.PRIMARY),
|
heroImageUrl = JellyfinImageHelper.finishImageUrl(episode.imageUrlPrefix, ImageType.PRIMARY),
|
||||||
resetScrollKey = episode.id,
|
resetScrollKey = episode.id,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
topBar = {
|
|
||||||
EpisodeTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
shortcut = topBarShortcut,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = playFocusRequester,
|
|
||||||
modifier = Modifier.align(Alignment.TopStart)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
heroContent = {
|
heroContent = {
|
||||||
EpisodeHeroSection(
|
EpisodeHeroSection(
|
||||||
episode = episode,
|
episode = episode,
|
||||||
|
|||||||
@@ -21,27 +21,11 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import hu.bbara.purefin.common.ui.MediaMetaChip
|
import hu.bbara.purefin.common.ui.MediaMetaChip
|
||||||
import hu.bbara.purefin.common.ui.components.MediaDetailsTopBar
|
|
||||||
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
||||||
import hu.bbara.purefin.core.model.Movie
|
import hu.bbara.purefin.core.model.Movie
|
||||||
|
|
||||||
internal const val MoviePlayButtonTag = "movie-play-button"
|
internal const val MoviePlayButtonTag = "movie-play-button"
|
||||||
|
|
||||||
@Composable
|
|
||||||
internal fun MovieTopBar(
|
|
||||||
onBack: () -> Unit,
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
backFocusRequester: FocusRequester? = null,
|
|
||||||
downFocusRequester: FocusRequester? = null
|
|
||||||
) {
|
|
||||||
MediaDetailsTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
modifier = modifier,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = downFocusRequester
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
@OptIn(ExperimentalLayoutApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
internal fun MovieHeroSection(
|
internal fun MovieHeroSection(
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import androidx.compose.runtime.Composable
|
|||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -65,14 +64,6 @@ internal fun MovieScreenContent(
|
|||||||
heroImageUrl = JellyfinImageHelper.finishImageUrl(movie.imageUrlPrefix, ImageType.PRIMARY),
|
heroImageUrl = JellyfinImageHelper.finishImageUrl(movie.imageUrlPrefix, ImageType.PRIMARY),
|
||||||
resetScrollKey = movie.id,
|
resetScrollKey = movie.id,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
topBar = {
|
|
||||||
MovieTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = playFocusRequester,
|
|
||||||
modifier = Modifier.align(Alignment.TopStart)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
heroContent = {
|
heroContent = {
|
||||||
MovieHeroSection(
|
MovieHeroSection(
|
||||||
movie = movie,
|
movie = movie,
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ import androidx.compose.ui.unit.sp
|
|||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import hu.bbara.purefin.common.ui.MediaCastRow
|
import hu.bbara.purefin.common.ui.MediaCastRow
|
||||||
import hu.bbara.purefin.common.ui.MediaMetaChip
|
import hu.bbara.purefin.common.ui.MediaMetaChip
|
||||||
import hu.bbara.purefin.common.ui.components.MediaDetailsTopBar
|
|
||||||
import hu.bbara.purefin.common.ui.components.MediaProgressBar
|
import hu.bbara.purefin.common.ui.components.MediaProgressBar
|
||||||
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
import hu.bbara.purefin.common.ui.components.MediaResumeButton
|
||||||
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
|
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
|
||||||
@@ -71,21 +70,6 @@ import org.jellyfin.sdk.model.api.ImageType
|
|||||||
internal const val SeriesPlayButtonTag = "series-play-button"
|
internal const val SeriesPlayButtonTag = "series-play-button"
|
||||||
internal const val SeriesFirstSeasonTabTag = "series-first-season-tab"
|
internal const val SeriesFirstSeasonTabTag = "series-first-season-tab"
|
||||||
|
|
||||||
@Composable
|
|
||||||
internal fun SeriesTopBar(
|
|
||||||
onBack: () -> Unit,
|
|
||||||
modifier: Modifier = Modifier,
|
|
||||||
backFocusRequester: FocusRequester? = null,
|
|
||||||
downFocusRequester: FocusRequester? = null
|
|
||||||
) {
|
|
||||||
MediaDetailsTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
modifier = modifier,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = downFocusRequester
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@OptIn(ExperimentalLayoutApi::class)
|
@OptIn(ExperimentalLayoutApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
internal fun SeriesMetaChips(series: Series) {
|
internal fun SeriesMetaChips(series: Series) {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import androidx.compose.runtime.LaunchedEffect
|
|||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -83,14 +82,6 @@ internal fun SeriesScreenContent(
|
|||||||
heroImageUrl = JellyfinImageHelper.finishImageUrl(series.imageUrlPrefix, ImageType.PRIMARY),
|
heroImageUrl = JellyfinImageHelper.finishImageUrl(series.imageUrlPrefix, ImageType.PRIMARY),
|
||||||
resetScrollKey = series.id,
|
resetScrollKey = series.id,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
topBar = {
|
|
||||||
SeriesTopBar(
|
|
||||||
onBack = onBack,
|
|
||||||
backFocusRequester = backFocusRequester,
|
|
||||||
downFocusRequester = nextUpEpisode?.let { playFocusRequester } ?: firstContentFocusRequester,
|
|
||||||
modifier = Modifier.align(Alignment.TopStart)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
heroContent = {
|
heroContent = {
|
||||||
SeriesHeroSection(
|
SeriesHeroSection(
|
||||||
series = series,
|
series = series,
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package hu.bbara.purefin.common.ui.components
|
|||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.BoxScope
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.ColumnScope
|
import androidx.compose.foundation.layout.ColumnScope
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
@@ -31,7 +30,6 @@ internal fun TvMediaDetailScaffold(
|
|||||||
resetScrollKey: Any,
|
resetScrollKey: Any,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
heroHeightFraction: Float = 0.48f,
|
heroHeightFraction: Float = 0.48f,
|
||||||
topBar: @Composable BoxScope.() -> Unit,
|
|
||||||
heroContent: @Composable ColumnScope.() -> Unit,
|
heroContent: @Composable ColumnScope.() -> Unit,
|
||||||
bodyContent: LazyListScope.(Modifier) -> Unit = { _ -> }
|
bodyContent: LazyListScope.(Modifier) -> Unit = { _ -> }
|
||||||
) {
|
) {
|
||||||
@@ -71,7 +69,6 @@ internal fun TvMediaDetailScaffold(
|
|||||||
}
|
}
|
||||||
bodyContent(contentPadding)
|
bodyContent(contentPadding)
|
||||||
}
|
}
|
||||||
topBar()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user