refactor: extract and rename LibraryUiModel

This commit is contained in:
2026-04-29 17:35:52 +02:00
parent 8cc85d1525
commit bd5e43114b
12 changed files with 42 additions and 38 deletions

View File

@@ -22,7 +22,7 @@ import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.ui.model.EpisodeUiModel import hu.bbara.purefin.ui.model.EpisodeUiModel
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.ui.model.MovieUiModel import hu.bbara.purefin.ui.model.MovieUiModel
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.screen.home.TvHomeScreen import hu.bbara.purefin.ui.screen.home.TvHomeScreen
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@@ -385,9 +385,9 @@ class TvHomeContentTest {
) )
} }
private fun sampleLibraries(): List<LibraryItem> { private fun sampleLibraries(): List<LibraryUiModel> {
return listOf( return listOf(
LibraryItem( LibraryUiModel(
id = sampleLibraryId(), id = sampleLibraryId(),
name = "Movies", name = "Movies",
type = LibraryKind.MOVIES, type = LibraryKind.MOVIES,

View File

@@ -5,7 +5,7 @@ import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
import hu.bbara.purefin.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Rule import org.junit.Rule
@@ -20,14 +20,14 @@ class TvLibrariesOverviewScreenTest {
@Test @Test
fun tvLibrariesOverviewScreen_opensSelectedLibrary() { fun tvLibrariesOverviewScreen_opensSelectedLibrary() {
val libraries = listOf( val libraries = listOf(
LibraryItem( LibraryUiModel(
id = UUID.fromString("11111111-1111-1111-1111-111111111111"), id = UUID.fromString("11111111-1111-1111-1111-111111111111"),
name = "Movies", name = "Movies",
type = LibraryKind.MOVIES, type = LibraryKind.MOVIES,
posterUrl = "", posterUrl = "",
isEmpty = false isEmpty = false
), ),
LibraryItem( LibraryUiModel(
id = UUID.fromString("22222222-2222-2222-2222-222222222222"), id = UUID.fromString("22222222-2222-2222-2222-222222222222"),
name = "Shows", name = "Shows",
type = LibraryKind.SERIES, type = LibraryKind.SERIES,
@@ -35,7 +35,7 @@ class TvLibrariesOverviewScreenTest {
isEmpty = false isEmpty = false
) )
) )
var openedLibrary: LibraryItem? = null var openedLibrary: LibraryUiModel? = null
composeRule.setContent { composeRule.setContent {
AppTheme { AppTheme {

View File

@@ -13,14 +13,14 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.ui.model.MovieUiModel import hu.bbara.purefin.ui.model.MovieUiModel
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.screen.home.components.TvFocusedItemHero import hu.bbara.purefin.ui.screen.home.components.TvFocusedItemHero
import hu.bbara.purefin.ui.screen.home.components.TvHomeContent import hu.bbara.purefin.ui.screen.home.components.TvHomeContent
import java.util.UUID import java.util.UUID
@Composable @Composable
fun TvHomeScreen( fun TvHomeScreen(
libraries: List<LibraryItem>, libraries: List<LibraryUiModel>,
libraryContent: Map<UUID, List<MediaUiModel>>, libraryContent: Map<UUID, List<MediaUiModel>>,
continueWatching: List<MediaUiModel>, continueWatching: List<MediaUiModel>,
nextUp: List<MediaUiModel>, nextUp: List<MediaUiModel>,

View File

@@ -24,7 +24,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import java.util.UUID import java.util.UUID
internal const val TvHomeInitialFocusTag = "tv-home-initial-focus-item" internal const val TvHomeInitialFocusTag = "tv-home-initial-focus-item"
@@ -32,7 +32,7 @@ internal const val TvHomeContentViewportTag = "tv-home-content-viewport"
@Composable @Composable
fun TvHomeContent( fun TvHomeContent(
libraries: List<LibraryItem>, libraries: List<LibraryUiModel>,
libraryContent: Map<UUID, List<MediaUiModel>>, libraryContent: Map<UUID, List<MediaUiModel>>,
continueWatching: List<MediaUiModel>, continueWatching: List<MediaUiModel>,
nextUp: List<MediaUiModel>, nextUp: List<MediaUiModel>,

View File

@@ -43,7 +43,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.image.PurefinAsyncImage
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
internal const val TvLibrariesOverviewItemTagPrefix = "tv-libraries-overview-item-" internal const val TvLibrariesOverviewItemTagPrefix = "tv-libraries-overview-item-"
@@ -52,8 +52,8 @@ private val TvLibrariesOverviewCardShape = RoundedCornerShape(18.dp)
@Composable @Composable
fun TvLibrariesOverviewScreen( fun TvLibrariesOverviewScreen(
libraries: List<LibraryItem>, libraries: List<LibraryUiModel>,
onLibrarySelected: (LibraryItem) -> Unit, onLibrarySelected: (LibraryUiModel) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val scheme = MaterialTheme.colorScheme val scheme = MaterialTheme.colorScheme
@@ -117,7 +117,7 @@ fun TvLibrariesOverviewScreen(
@Composable @Composable
private fun TvLibraryOverviewCard( private fun TvLibraryOverviewCard(
item: LibraryItem, item: LibraryUiModel,
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {

View File

@@ -5,7 +5,7 @@ import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.model.MediaKind import hu.bbara.purefin.model.MediaKind
import hu.bbara.purefin.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.feature.browse.home.NextUpItem import hu.bbara.purefin.feature.browse.home.NextUpItem
import hu.bbara.purefin.feature.browse.home.PosterItem import hu.bbara.purefin.feature.browse.home.PosterItem
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@@ -104,8 +104,8 @@ class TvHomeHeroStateTest {
assertEquals(continueWatching, registry.firstAvailableItem) assertEquals(continueWatching, registry.firstAvailableItem)
} }
private fun sampleLibrary(id: UUID, isEmpty: Boolean = false): LibraryItem { private fun sampleLibrary(id: UUID, isEmpty: Boolean = false): LibraryUiModel {
return LibraryItem( return LibraryUiModel(
id = id, id = id,
name = "Movies", name = "Movies",
type = LibraryKind.MOVIES, type = LibraryKind.MOVIES,

View File

@@ -12,7 +12,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.ui.screen.AppBottomBar import hu.bbara.purefin.ui.screen.AppBottomBar
import hu.bbara.purefin.ui.screen.home.components.HomeContent import hu.bbara.purefin.ui.screen.home.components.HomeContent
@@ -23,7 +23,7 @@ import java.util.UUID
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun HomeScreen( fun HomeScreen(
libraries: List<LibraryItem>, libraries: List<LibraryUiModel>,
libraryContent: Map<UUID, List<MediaUiModel>>, libraryContent: Map<UUID, List<MediaUiModel>>,
suggestions: List<MediaUiModel>, suggestions: List<MediaUiModel>,
continueWatching: List<MediaUiModel>, continueWatching: List<MediaUiModel>,
@@ -31,7 +31,7 @@ fun HomeScreen(
isRefreshing: Boolean, isRefreshing: Boolean,
onRefresh: () -> Unit, onRefresh: () -> Unit,
onMediaSelected: (MediaUiModel) -> Unit, onMediaSelected: (MediaUiModel) -> Unit,
onLibrarySelected: (LibraryItem) -> Unit, onLibrarySelected: (LibraryUiModel) -> Unit,
onProfileClick: () -> Unit, onProfileClick: () -> Unit,
onSettingsClick: () -> Unit, onSettingsClick: () -> Unit,
onLogoutClick: () -> Unit, onLogoutClick: () -> Unit,

View File

@@ -22,7 +22,7 @@ import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.screen.home.components.continuewatching.ContinueWatchingSection import hu.bbara.purefin.ui.screen.home.components.continuewatching.ContinueWatchingSection
import hu.bbara.purefin.ui.screen.home.components.featured.SuggestionsSection import hu.bbara.purefin.ui.screen.home.components.featured.SuggestionsSection
import hu.bbara.purefin.ui.screen.home.components.library.LibraryPosterSection import hu.bbara.purefin.ui.screen.home.components.library.LibraryPosterSection
@@ -32,7 +32,7 @@ import java.util.UUID
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun HomeContent( fun HomeContent(
libraries: List<LibraryItem>, libraries: List<LibraryUiModel>,
libraryContent: Map<UUID, List<MediaUiModel>>, libraryContent: Map<UUID, List<MediaUiModel>>,
suggestions: List<MediaUiModel>, suggestions: List<MediaUiModel>,
continueWatching: List<MediaUiModel>, continueWatching: List<MediaUiModel>,
@@ -40,7 +40,7 @@ fun HomeContent(
isRefreshing: Boolean, isRefreshing: Boolean,
onRefresh: () -> Unit, onRefresh: () -> Unit,
onMediaSelected: (MediaUiModel) -> Unit, onMediaSelected: (MediaUiModel) -> Unit,
onLibrarySelected: (LibraryItem) -> Unit, onLibrarySelected: (LibraryUiModel) -> Unit,
onBrowseLibrariesClick: () -> Unit, onBrowseLibrariesClick: () -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {

View File

@@ -12,14 +12,14 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.common.header.SectionHeader import hu.bbara.purefin.ui.common.header.SectionHeader
@Composable @Composable
fun LibraryPosterSection( fun LibraryPosterSection(
library: LibraryItem, library: LibraryUiModel,
items: List<MediaUiModel>, items: List<MediaUiModel>,
onLibrarySelected: (LibraryItem) -> Unit, onLibrarySelected: (LibraryUiModel) -> Unit,
onMediaSelected: (MediaUiModel) -> Unit, onMediaSelected: (MediaUiModel) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {

View File

@@ -16,6 +16,7 @@ import hu.bbara.purefin.navigation.NavigationManager
import hu.bbara.purefin.navigation.Route import hu.bbara.purefin.navigation.Route
import hu.bbara.purefin.navigation.SeriesDto import hu.bbara.purefin.navigation.SeriesDto
import hu.bbara.purefin.ui.model.EpisodeUiModel import hu.bbara.purefin.ui.model.EpisodeUiModel
import hu.bbara.purefin.ui.model.LibraryUiModel
import hu.bbara.purefin.ui.model.MediaUiModel import hu.bbara.purefin.ui.model.MediaUiModel
import hu.bbara.purefin.ui.model.MovieUiModel import hu.bbara.purefin.ui.model.MovieUiModel
import hu.bbara.purefin.ui.model.SeriesUiModel import hu.bbara.purefin.ui.model.SeriesUiModel
@@ -51,12 +52,12 @@ class AppViewModel @Inject constructor(
val libraries = homeRepository.libraries.map { libraries -> val libraries = homeRepository.libraries.map { libraries ->
libraries.map { libraries.map {
LibraryItem( LibraryUiModel(
id = it.id, id = it.id,
name = it.name, name = it.name,
type = it.type, type = it.type,
posterUrl = it.posterUrl, posterUrl = it.posterUrl,
isEmpty = when(it.type) { isEmpty = when (it.type) {
LibraryKind.MOVIES -> mediaCatalogReader.movies.value.isEmpty() LibraryKind.MOVIES -> mediaCatalogReader.movies.value.isEmpty()
LibraryKind.SERIES -> mediaCatalogReader.series.value.isEmpty() LibraryKind.SERIES -> mediaCatalogReader.series.value.isEmpty()
} }

View File

@@ -3,7 +3,6 @@ package hu.bbara.purefin.feature.browse.home
import hu.bbara.purefin.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import hu.bbara.purefin.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.model.MediaKind import hu.bbara.purefin.model.MediaKind
import hu.bbara.purefin.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.model.Series import hu.bbara.purefin.model.Series
@@ -35,14 +34,6 @@ data class NextUpItem(
get() = episode.synopsis get() = episode.synopsis
} }
data class LibraryItem(
val id: UUID,
val name: String,
val type: LibraryKind,
val posterUrl: String,
val isEmpty: Boolean
)
data class PosterItem( data class PosterItem(
override val type: MediaKind, override val type: MediaKind,
val movie: Movie? = null, val movie: Movie? = null,

View File

@@ -0,0 +1,12 @@
package hu.bbara.purefin.ui.model
import hu.bbara.purefin.model.LibraryKind
import java.util.UUID
data class LibraryUiModel(
val id: UUID,
val name: String,
val type: LibraryKind,
val posterUrl: String,
val isEmpty: Boolean
)