mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-05-18 07:51:46 +00:00
add bookmark badge in catalog screen
This commit is contained in:
parent
219210fd64
commit
7be85691ed
2 changed files with 41 additions and 0 deletions
|
|
@ -46,6 +46,8 @@ import com.nuvio.app.core.network.NetworkStatusRepository
|
||||||
import com.nuvio.app.core.ui.NuvioNetworkOfflineCard
|
import com.nuvio.app.core.ui.NuvioNetworkOfflineCard
|
||||||
import coil3.compose.AsyncImage
|
import coil3.compose.AsyncImage
|
||||||
import com.nuvio.app.core.format.formatReleaseDateForDisplay
|
import com.nuvio.app.core.format.formatReleaseDateForDisplay
|
||||||
|
import com.nuvio.app.core.ui.NuvioAnimatedBookmarkedBadge
|
||||||
|
import com.nuvio.app.core.ui.NuvioAnimatedWatchedBadge
|
||||||
import com.nuvio.app.core.ui.NuvioBackButton
|
import com.nuvio.app.core.ui.NuvioBackButton
|
||||||
import com.nuvio.app.core.ui.rememberPosterCardStyleUiState
|
import com.nuvio.app.core.ui.rememberPosterCardStyleUiState
|
||||||
import com.nuvio.app.core.ui.posterCardClickable
|
import com.nuvio.app.core.ui.posterCardClickable
|
||||||
|
|
@ -55,6 +57,7 @@ import com.nuvio.app.features.home.MetaPreview
|
||||||
import com.nuvio.app.features.home.HomeCatalogSettingsRepository
|
import com.nuvio.app.features.home.HomeCatalogSettingsRepository
|
||||||
import com.nuvio.app.features.home.PosterShape
|
import com.nuvio.app.features.home.PosterShape
|
||||||
import com.nuvio.app.features.home.stableKey
|
import com.nuvio.app.features.home.stableKey
|
||||||
|
import com.nuvio.app.features.library.LibraryRepository
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
|
@ -81,6 +84,10 @@ fun CatalogScreen(
|
||||||
val gridState = rememberLazyGridState()
|
val gridState = rememberLazyGridState()
|
||||||
var headerHeightPx by remember { mutableIntStateOf(0) }
|
var headerHeightPx by remember { mutableIntStateOf(0) }
|
||||||
var observedOfflineState by remember { mutableStateOf(false) }
|
var observedOfflineState by remember { mutableStateOf(false) }
|
||||||
|
val libraryUiState by remember {
|
||||||
|
LibraryRepository.ensureLoaded()
|
||||||
|
LibraryRepository.uiState
|
||||||
|
}.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
LaunchedEffect(manifestUrl, type, catalogId, genre, supportsPagination, homeCatalogSettingsUiState.hideUnreleasedContent) {
|
LaunchedEffect(manifestUrl, type, catalogId, genre, supportsPagination, homeCatalogSettingsUiState.hideUnreleasedContent) {
|
||||||
CatalogRepository.load(
|
CatalogRepository.load(
|
||||||
|
|
@ -182,10 +189,20 @@ fun CatalogScreen(
|
||||||
key = { item -> item.lazyKey },
|
key = { item -> item.lazyKey },
|
||||||
) { keyedItem ->
|
) { keyedItem ->
|
||||||
val item = keyedItem.value
|
val item = keyedItem.value
|
||||||
|
val isSaved = remember(
|
||||||
|
libraryUiState.items,
|
||||||
|
libraryUiState.sections,
|
||||||
|
libraryUiState.sourceMode,
|
||||||
|
item.id,
|
||||||
|
item.type,
|
||||||
|
) {
|
||||||
|
LibraryRepository.isSaved(item.id, item.type)
|
||||||
|
}
|
||||||
CatalogPosterTile(
|
CatalogPosterTile(
|
||||||
item = item,
|
item = item,
|
||||||
cornerRadiusDp = posterCardStyle.cornerRadiusDp,
|
cornerRadiusDp = posterCardStyle.cornerRadiusDp,
|
||||||
hideLabels = posterCardStyle.hideLabelsEnabled,
|
hideLabels = posterCardStyle.hideLabelsEnabled,
|
||||||
|
isSaved = isSaved,
|
||||||
onClick = onPosterClick?.let { { it(item) } },
|
onClick = onPosterClick?.let { { it(item) } },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -256,6 +273,7 @@ private fun CatalogPosterTile(
|
||||||
item: MetaPreview,
|
item: MetaPreview,
|
||||||
cornerRadiusDp: Int,
|
cornerRadiusDp: Int,
|
||||||
hideLabels: Boolean,
|
hideLabels: Boolean,
|
||||||
|
isSaved: Boolean = false,
|
||||||
onClick: (() -> Unit)? = null,
|
onClick: (() -> Unit)? = null,
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
|
|
@ -277,6 +295,13 @@ private fun CatalogPosterTile(
|
||||||
contentScale = ContentScale.Crop,
|
contentScale = ContentScale.Crop,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NuvioAnimatedBookmarkedBadge(
|
||||||
|
isVisible = isSaved,
|
||||||
|
modifier = Modifier
|
||||||
|
.align(Alignment.TopStart)
|
||||||
|
.padding(6.dp),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
if (!hideLabels) {
|
if (!hideLabels) {
|
||||||
Text(
|
Text(
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ import androidx.compose.ui.text.style.TextAlign
|
||||||
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 androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import coil3.compose.AsyncImage
|
import coil3.compose.AsyncImage
|
||||||
import com.nuvio.app.core.ui.NuvioPosterCard
|
import com.nuvio.app.core.ui.NuvioPosterCard
|
||||||
import com.nuvio.app.core.ui.NuvioPosterShape
|
import com.nuvio.app.core.ui.NuvioPosterShape
|
||||||
|
|
@ -61,6 +62,7 @@ import com.nuvio.app.features.home.PosterShape
|
||||||
import com.nuvio.app.features.home.canOpenCatalog
|
import com.nuvio.app.features.home.canOpenCatalog
|
||||||
import com.nuvio.app.features.home.stableKey
|
import com.nuvio.app.features.home.stableKey
|
||||||
import com.nuvio.app.features.home.components.HomeCatalogRowSection
|
import com.nuvio.app.features.home.components.HomeCatalogRowSection
|
||||||
|
import com.nuvio.app.features.library.LibraryRepository
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.filter
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
|
@ -204,6 +206,10 @@ private fun TabbedGridContent(
|
||||||
onPosterClick: (MetaPreview) -> Unit,
|
onPosterClick: (MetaPreview) -> Unit,
|
||||||
) {
|
) {
|
||||||
val gridState = rememberLazyGridState()
|
val gridState = rememberLazyGridState()
|
||||||
|
val libraryUiState by remember {
|
||||||
|
LibraryRepository.ensureLoaded()
|
||||||
|
LibraryRepository.uiState
|
||||||
|
}.collectAsStateWithLifecycle()
|
||||||
|
|
||||||
LaunchedEffect(gridState, uiState.selectedTabIndex, uiState.selectedTabCanLoadMore, uiState.selectedTabIsLoadingMore) {
|
LaunchedEffect(gridState, uiState.selectedTabIndex, uiState.selectedTabCanLoadMore, uiState.selectedTabIsLoadingMore) {
|
||||||
snapshotFlow { gridState.layoutInfo }
|
snapshotFlow { gridState.layoutInfo }
|
||||||
|
|
@ -280,11 +286,21 @@ private fun TabbedGridContent(
|
||||||
key = { item -> item.lazyKey },
|
key = { item -> item.lazyKey },
|
||||||
) { keyedItem ->
|
) { keyedItem ->
|
||||||
val item = keyedItem.value
|
val item = keyedItem.value
|
||||||
|
val isSaved = remember(
|
||||||
|
libraryUiState.items,
|
||||||
|
libraryUiState.sections,
|
||||||
|
libraryUiState.sourceMode,
|
||||||
|
item.id,
|
||||||
|
item.type,
|
||||||
|
) {
|
||||||
|
LibraryRepository.isSaved(item.id, item.type)
|
||||||
|
}
|
||||||
NuvioPosterCard(
|
NuvioPosterCard(
|
||||||
title = item.name,
|
title = item.name,
|
||||||
imageUrl = item.poster,
|
imageUrl = item.poster,
|
||||||
shape = NuvioPosterShape.Poster,
|
shape = NuvioPosterShape.Poster,
|
||||||
detailLine = item.releaseInfo,
|
detailLine = item.releaseInfo,
|
||||||
|
isSaved = isSaved,
|
||||||
onClick = { onPosterClick(item) },
|
onClick = { onPosterClick(item) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue