diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/LargeBookThumbnail.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/LargeBookThumbnail.kt new file mode 100644 index 0000000..8aba236 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/LargeBookThumbnail.kt @@ -0,0 +1,190 @@ +package com.pixelized.biblib.ui.screen.home.common.item + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Card +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.pixelized.biblib.R +import com.pixelized.biblib.ui.theme.BibLibTheme +import com.pixelized.biblib.utils.extention.bibLib +import com.pixelized.biblib.utils.extention.default +import com.skydoves.landscapist.glide.GlideImage + +@Stable +data class LargeBookThumbnailUio( + val id: Int, + val title: String, + val author: String, + val date: String?, + val isNew: Boolean, + val cover: String, +) + +@Composable +fun LargeBookThumbnail( + modifier: Modifier = Modifier, + thumbnail: LargeBookThumbnailUio?, + onClick: (LargeBookThumbnailUio) -> Unit = default(), +) { + Card( + modifier = modifier + .fillMaxWidth() + .wrapContentHeight(), + shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge, + ) { + if (thumbnail != null) { + LargeBookThumbnailContent( + modifier = modifier, + thumbnail = thumbnail, + onClick = onClick, + ) + } else { + LargeBookThumbnailPlaceHolder( + modifier = modifier, + ) + } + } +} + +@Composable +private fun LargeBookThumbnailContent( + modifier: Modifier = Modifier, + thumbnail: LargeBookThumbnailUio, + onClick: (LargeBookThumbnailUio) -> Unit = default(), +) { + Column( + modifier = modifier.clickable { thumbnail.let(onClick) } + ) { + GlideImage( + modifier = Modifier + .clip(shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge) + .fillMaxWidth() + .aspectRatio(64f / 102f), + previewPlaceholder = R.drawable.ic_fondatoin_cover, + imageModel = thumbnail.cover, + ) + + Text( + modifier = Modifier + .padding(top = MaterialTheme.bibLib.dimen.dp4) + .padding(horizontal = MaterialTheme.bibLib.dimen.dp8), + style = MaterialTheme.typography.body1, + color = MaterialTheme.bibLib.colors.typography.medium, + text = thumbnail.title, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + Text( + modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.dp8), + style = MaterialTheme.typography.caption, + color = MaterialTheme.bibLib.colors.typography.easy, + text = thumbnail.author + ) + + Text( + modifier = Modifier + .align(alignment = Alignment.End) + .padding(horizontal = MaterialTheme.bibLib.dimen.dp8) + .padding(bottom = MaterialTheme.bibLib.dimen.dp8), + style = MaterialTheme.typography.caption, + color = MaterialTheme.bibLib.colors.typography.easy, + text = thumbnail.date ?: "" + ) + } +} + +@Composable +private fun LargeBookThumbnailPlaceHolder( + modifier: Modifier = Modifier, +) { + Column(modifier = modifier) { + Box( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(64f / 102f) + .background( + color = MaterialTheme.bibLib.colors.placeHolder, + shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge, + ), + ) + + Box( + modifier = Modifier + .padding(top = MaterialTheme.bibLib.dimen.dp4) + .padding(horizontal = MaterialTheme.bibLib.dimen.dp8) + .size(width = 80.dp, height = 12.dp) + .background( + color = MaterialTheme.bibLib.colors.placeHolder, + shape = CircleShape, + ), + ) + + Box( + modifier = Modifier + .padding(top = MaterialTheme.bibLib.dimen.dp4) + .padding(horizontal = MaterialTheme.bibLib.dimen.dp8) + .size(width = 60.dp, height = 12.dp) + .background( + color = MaterialTheme.bibLib.colors.placeHolder, + shape = CircleShape, + ), + ) + + Box( + modifier = Modifier + .align(alignment = Alignment.End) + .padding(top = MaterialTheme.bibLib.dimen.dp4) + .padding(horizontal = MaterialTheme.bibLib.dimen.dp8) + .padding(bottom = MaterialTheme.bibLib.dimen.dp8) + .size(width = 40.dp, height = 12.dp) + .background( + color = MaterialTheme.bibLib.colors.placeHolder, + shape = CircleShape, + ), + ) + } +} + +@Composable +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun LargeBookThumbnailPreview() { + BibLibTheme { + LargeBookThumbnail( + modifier = Modifier.width(168.dp), + thumbnail = LargeBookThumbnailUio( + id = 0, + title = "Foundation", + author = "Asimov", + date = "February 1951", + isNew = false, + cover = "", + ), + ) + } +} + +@Composable +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +private fun LargeBookThumbnailEmptyPreview() { + BibLibTheme { + LargeBookThumbnail( + modifier = Modifier.width(168.dp), + thumbnail = null, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/BookThumbnail.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/SmallBookThumbnail.kt similarity index 63% rename from app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/BookThumbnail.kt rename to app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/SmallBookThumbnail.kt index a299815..20400b7 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/BookThumbnail.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/item/SmallBookThumbnail.kt @@ -1,7 +1,6 @@ package com.pixelized.biblib.ui.screen.home.common.item import android.content.res.Configuration -import android.text.Layout import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -26,7 +25,7 @@ import com.pixelized.biblib.utils.extention.default import com.skydoves.landscapist.glide.GlideImage @Stable -data class BookThumbnailUio( +data class SmallBookThumbnailUio( val id: Int, val genre: String, val title: String, @@ -39,8 +38,8 @@ data class BookThumbnailUio( @Composable fun SmallBookThumbnail( modifier: Modifier = Modifier, - thumbnail: BookThumbnailUio?, - onClick: (BookThumbnailUio) -> Unit = default(), + thumbnail: SmallBookThumbnailUio?, + onClick: (SmallBookThumbnailUio) -> Unit = default(), ) { if (thumbnail != null) { SmallBookThumbnailContent( @@ -58,8 +57,8 @@ fun SmallBookThumbnail( @Composable private fun SmallBookThumbnailContent( modifier: Modifier = Modifier, - thumbnail: BookThumbnailUio, - onClick: (BookThumbnailUio) -> Unit = default(), + thumbnail: SmallBookThumbnailUio, + onClick: (SmallBookThumbnailUio) -> Unit = default(), ) { val dimen = MaterialTheme.bibLib.dimen Card( @@ -229,135 +228,13 @@ private fun SmallBookThumbnailPlaceHolder( } } -@Composable -fun LargeBookThumbnail( - modifier: Modifier = Modifier, - thumbnail: BookThumbnailUio?, - onClick: (BookThumbnailUio) -> Unit = default(), -) { - Card( - modifier = modifier - .fillMaxWidth() - .wrapContentHeight(), - shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge, - ) { - if (thumbnail != null) { - LargeBookThumbnailContent( - modifier = modifier, - thumbnail = thumbnail, - onClick = onClick, - ) - } else { - LargeBookThumbnailPlaceHolder( - modifier = modifier, - ) - } - } -} - -@Composable -private fun LargeBookThumbnailContent( - modifier: Modifier = Modifier, - thumbnail: BookThumbnailUio, - onClick: (BookThumbnailUio) -> Unit = default(), -) { - Column( - modifier = modifier.clickable { thumbnail.let(onClick) } - ) { - GlideImage( - modifier = Modifier - .clip(shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge) - .fillMaxWidth() - .aspectRatio(64f / 102f), - previewPlaceholder = R.drawable.ic_fondatoin_cover, - imageModel = thumbnail.cover, - ) - - Text( - modifier = Modifier - .padding(top = MaterialTheme.bibLib.dimen.dp4) - .padding(horizontal = MaterialTheme.bibLib.dimen.dp8), - style = MaterialTheme.typography.body1, - color = MaterialTheme.bibLib.colors.typography.medium, - text = thumbnail.title, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - - Text( - modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.dp8), - style = MaterialTheme.typography.caption, - color = MaterialTheme.bibLib.colors.typography.easy, - text = thumbnail.author - ) - - Text( - modifier = Modifier - .align(alignment = Alignment.End) - .padding(horizontal = MaterialTheme.bibLib.dimen.dp8) - .padding(bottom = MaterialTheme.bibLib.dimen.dp8), - style = MaterialTheme.typography.caption, - color = MaterialTheme.bibLib.colors.typography.easy, - text = thumbnail.date ?: "" - ) - } -} - -@Composable -private fun LargeBookThumbnailPlaceHolder( - modifier: Modifier = Modifier, -) { - Column(modifier = modifier) { - Box( - modifier = Modifier - .fillMaxWidth() - .aspectRatio(64f / 102f) - .background( - color = MaterialTheme.bibLib.colors.placeHolder, - shape = MaterialTheme.bibLib.shapes.bookThumbnailCoverLarge, - ), - ) - - Box( - modifier = Modifier - .padding(top = MaterialTheme.bibLib.dimen.dp4) - .size(width = 80.dp, height = 12.dp) - .background( - color = MaterialTheme.bibLib.colors.placeHolder, - shape = CircleShape, - ), - ) - - Box( - modifier = Modifier - .padding(top = MaterialTheme.bibLib.dimen.dp4) - .size(width = 60.dp, height = 12.dp) - .background( - color = MaterialTheme.bibLib.colors.placeHolder, - shape = CircleShape, - ), - ) - - Box( - modifier = Modifier - .padding(top = MaterialTheme.bibLib.dimen.dp4) - .size(width = 40.dp, height = 12.dp) - .background( - color = MaterialTheme.bibLib.colors.placeHolder, - shape = CircleShape, - ), - ) - } -} - - @Composable @Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) private fun SmallBookThumbnailPreview() { BibLibTheme { SmallBookThumbnail( - thumbnail = BookThumbnailUio( + thumbnail = SmallBookThumbnailUio( id = 0, genre = "Sci-Fi", title = "Foundation", @@ -379,36 +256,4 @@ private fun SmallBookThumbnailEmptyPreview() { thumbnail = null, ) } -} - -@Composable -@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) -@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -private fun LargeBookThumbnailPreview() { - BibLibTheme { - LargeBookThumbnail( - modifier = Modifier.width(168.dp), - thumbnail = BookThumbnailUio( - id = 0, - genre = "Sci-Fi", - title = "Foundation", - author = "Asimov", - date = "February 1951", - isNew = false, - cover = "", - ), - ) - } -} - -@Composable -@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) -@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) -private fun LargeBookThumbnailEmptyPreview() { - BibLibTheme { - LargeBookThumbnail( - modifier = Modifier.width(168.dp), - thumbnail = null, - ) - } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/preview/bookPreviewResources.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/preview/bookPreviewResources.kt index 9e3b871..67ed009 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/preview/bookPreviewResources.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/preview/bookPreviewResources.kt @@ -4,14 +4,15 @@ import androidx.compose.runtime.Composable import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio import kotlinx.coroutines.flow.flowOf @Composable -fun bookPreviewResources(): LazyPagingItems { +fun smallBookThumbnailPreviewResources(): LazyPagingItems { val thumbnails = listOf( - BookThumbnailUio( + SmallBookThumbnailUio( id = 112, title = "Prélude à Fondation", author = "Asimov", @@ -20,7 +21,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 78, title = "L'Aube de Fondation", author = "Asimov", @@ -29,7 +30,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 90, title = "Fondation", author = "Asimov", @@ -38,7 +39,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 184, title = "Fondation et Empire", author = "Asimov", @@ -47,7 +48,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 185, title = "Seconde Fondation", author = "Asimov", @@ -56,7 +57,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 119, title = "Fondation foudroyée", author = "Asimov", @@ -65,7 +66,7 @@ fun bookPreviewResources(): LazyPagingItems { isNew = false, cover = "", ), - BookThumbnailUio( + SmallBookThumbnailUio( id = 163, title = "Terre et Fondation", author = "Asimov", @@ -76,4 +77,67 @@ fun bookPreviewResources(): LazyPagingItems { ), ) return flowOf(PagingData.from(thumbnails)).collectAsLazyPagingItems() +} + +@Composable +fun largeBookThumbnailPreviewResources(): LazyPagingItems { + val thumbnails = listOf( + LargeBookThumbnailUio( + id = 112, + title = "Prélude à Fondation", + author = "Asimov", + date = "1988", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 78, + title = "L'Aube de Fondation", + author = "Asimov", + date = "1993", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 90, + title = "Fondation", + author = "Asimov", + date = "1951", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 184, + title = "Fondation et Empire", + author = "Asimov", + date = "1952", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 185, + title = "Seconde Fondation", + author = "Asimov", + date = "1953", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 119, + title = "Fondation foudroyée", + author = "Asimov", + date = "1982", + isNew = false, + cover = "", + ), + LargeBookThumbnailUio( + id = 163, + title = "Terre et Fondation", + author = "Asimov", + date = "1986", + isNew = false, + cover = "", + ), + ) + return flowOf(PagingData.from(thumbnails)).collectAsLazyPagingItems() } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt index 7493584..725eb63 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt @@ -13,9 +13,9 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.items import com.pixelized.biblib.ui.scaffold.LocalDetailBottomSheetState -import com.pixelized.biblib.ui.screen.home.common.preview.bookPreviewResources +import com.pixelized.biblib.ui.screen.home.common.preview.smallBookThumbnailPreviewResources import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnail -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.navigationBarsHeight @@ -34,7 +34,7 @@ fun BooksPage( @Composable private fun BooksPageContent( - books: LazyPagingItems, + books: LazyPagingItems, ) { val bottomDetailState = LocalDetailBottomSheetState.current @@ -66,7 +66,7 @@ private fun BooksPagePreview() { BibLibTheme { Column { BooksPageContent( - books = bookPreviewResources() + books = smallBookThumbnailPreviewResources() ) } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt index bedf5da..a6a8fd6 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksViewModel.kt @@ -5,12 +5,8 @@ import androidx.lifecycle.ViewModel import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.compose.collectAsLazyPagingItems -import com.pixelized.biblib.model.book.Book -import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.book.IBookRepository -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio -import com.pixelized.biblib.utils.extention.longDate -import com.pixelized.biblib.utils.extention.toThumbnailUio +import com.pixelized.biblib.utils.extention.toSmallThumbnailUio import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import javax.inject.Inject @@ -24,7 +20,7 @@ class BooksViewModel @Inject constructor( private val booksSource = Pager( config = PagingConfig(pageSize = PAGING_SIZE), pagingSourceFactory = bookRepository.getBooksSource() - .map { it.toThumbnailUio() } + .map { it.toSmallThumbnailUio() } .asPagingSourceFactory(Dispatchers.IO) ).flow diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt index b25f985..5d8b6c7 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsBookViewModel.kt @@ -8,8 +8,9 @@ import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.book.IBookRepository -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio -import com.pixelized.biblib.utils.extention.toThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnailUio +import com.pixelized.biblib.utils.extention.toLargeBookThumbnailUio +import com.pixelized.biblib.utils.extention.toSmallThumbnailUio import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -21,10 +22,10 @@ class NewsBookViewModel @Inject constructor( bookRepository: IBookRepository, ) : ViewModel() { - private val newsSource: Flow> = Pager( + private val newsSource: Flow> = Pager( config = PagingConfig(pageSize = PAGING_SIZE), pagingSourceFactory = bookRepository.getNewsSource() - .map { it.toThumbnailUio(coverBaseUrl = IBibLibClient.COVER_URL) } + .map { it.toLargeBookThumbnailUio() } .asPagingSourceFactory(Dispatchers.IO) ).flow diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt index 6036c0a..76c5e0b 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt @@ -2,7 +2,9 @@ package com.pixelized.biblib.ui.screen.home.page.news import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_YES -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material.MaterialTheme @@ -12,9 +14,9 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.compose.LazyPagingItems import com.pixelized.biblib.ui.scaffold.DetailBottomSheetState import com.pixelized.biblib.ui.scaffold.LocalDetailBottomSheetState -import com.pixelized.biblib.ui.screen.home.common.preview.bookPreviewResources -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnail +import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.preview.largeBookThumbnailPreviewResources import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.navigationBarsHeight @@ -33,7 +35,7 @@ fun NewsPage( @Composable private fun NewsPageContent( - books: LazyPagingItems, + books: LazyPagingItems, ) { val detailBottomSheetState: DetailBottomSheetState = LocalDetailBottomSheetState.current @@ -68,7 +70,7 @@ private fun NewPagePreview() { BibLibTheme { Column { NewsPageContent( - books = bookPreviewResources() + books = largeBookThumbnailPreviewResources() ) } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchPage.kt index d764f6b..cf153b6 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchPage.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchPage.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -33,8 +34,8 @@ import com.pixelized.biblib.ui.scaffold.LocalCategorySearchBottomSheetState import com.pixelized.biblib.ui.scaffold.LocalDetailBottomSheetState import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel import com.pixelized.biblib.ui.scaffold.SearchFilter -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnail +import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.default @@ -71,17 +72,21 @@ fun SearchPage( @Composable private fun SearchPageContent( modifier: Modifier = Modifier, - search: Flow> = emptyFlow(), + search: Flow> = emptyFlow(), filters: List = SearchFilter.all, onFilter: (filter: SearchFilter) -> Unit = default(), - onDetail: (item: BookThumbnailUio) -> Unit = default() + onDetail: (item: SmallBookThumbnailUio) -> Unit = default() ) { val items = search.collectAsLazyPagingItems() LazyColumn( modifier = modifier, - contentPadding = PaddingValues(bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight()), - verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.dp8), + contentPadding = PaddingValues( + bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight() + ), + verticalArrangement = Arrangement.spacedBy( + space = MaterialTheme.bibLib.dimen.thumbnail.arrangement + ), ) { item(key = "Search Filter") { SearchFilter( @@ -132,7 +137,8 @@ private fun SearchFilter( Row( modifier = Modifier .horizontalScroll(rememberScrollState()) - .then(modifier) + .then(modifier), + verticalAlignment = Alignment.CenterVertically, ) { filters.forEachIndexed { index, filter -> val chipModifier = if (index != filters.lastIndex) { @@ -140,6 +146,7 @@ private fun SearchFilter( } else { Modifier } + SearchChipFilter( modifier = chipModifier, selected = filter.isSelected, @@ -166,16 +173,27 @@ private fun SearchChipFilter( onClick = onClick, ) { Text( + color = MaterialTheme.bibLib.colors.typography.medium, + style = MaterialTheme.typography.caption, text = label ) value?.let { - Text(text = ": ") - Text(text = value) + Text( + color = MaterialTheme.bibLib.colors.typography.medium, + style = MaterialTheme.typography.caption, + text = ": " + ) + Text( + color = MaterialTheme.bibLib.colors.typography.medium, + style = MaterialTheme.typography.caption, + text = value + ) } Icon( imageVector = Icons.Default.ArrowDropDown, + tint = MaterialTheme.bibLib.colors.typography.medium, contentDescription = null ) } diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchViewModel.kt index a3bdd6b..d52d52c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/search/SearchViewModel.kt @@ -6,12 +6,8 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.paging.* -import com.pixelized.biblib.model.book.Book -import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.book.IBookRepository -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio -import com.pixelized.biblib.utils.extention.longDate -import com.pixelized.biblib.utils.extention.toThumbnailUio +import com.pixelized.biblib.utils.extention.toSmallThumbnailUio import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -90,7 +86,7 @@ class SearchViewModel @Inject constructor( .combine(language.confirmFlow) { paging, filter -> paging.filter { filter == null || it.language == null || it.language.id == filter.id } } - .map { paging -> paging.map { it.toThumbnailUio() } } + .map { paging -> paging.map { it.toSmallThumbnailUio() } } data class FilterUio( val id: Int, diff --git a/app/src/main/java/com/pixelized/biblib/utils/extention/BookEx.kt b/app/src/main/java/com/pixelized/biblib/utils/extention/BookEx.kt index eee00bd..aafe768 100644 --- a/app/src/main/java/com/pixelized/biblib/utils/extention/BookEx.kt +++ b/app/src/main/java/com/pixelized/biblib/utils/extention/BookEx.kt @@ -3,7 +3,8 @@ package com.pixelized.biblib.utils.extention import androidx.annotation.StringDef import com.pixelized.biblib.model.book.Book import com.pixelized.biblib.network.client.IBibLibClient -import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnailUio +import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio import com.pixelized.biblib.ui.screen.home.detail.BookDetailUio @@ -14,16 +15,27 @@ import com.pixelized.biblib.ui.screen.home.detail.BookDetailUio ) annotation class CoverUrl -fun Book.toThumbnailUio( +fun Book.toSmallThumbnailUio( @CoverUrl coverBaseUrl: String = IBibLibClient.THUMBNAIL_URL -) = BookThumbnailUio( +) = SmallBookThumbnailUio( id = id, genre = genre?.joinToString { it.name } ?: "", title = title, author = author.joinToString { it.name }, date = releaseDate.longDate(), isNew = isNew, - cover = "${coverBaseUrl}/$id.jpg" + cover = "${coverBaseUrl}/$id.jpg", +) + +fun Book.toLargeBookThumbnailUio( + @CoverUrl coverBaseUrl: String = IBibLibClient.COVER_URL +) = LargeBookThumbnailUio( + id = id, + title = title, + author = author.joinToString { it.name }, + date = releaseDate.longDate(), + isNew = isNew, + cover = "${coverBaseUrl}/$id.jpg", ) fun Book.toDetailUio(