Split book thumbnail

This commit is contained in:
Thomas Andres Gomez 2022-07-19 14:59:35 +02:00
parent d82efe7f5d
commit fb1709125d
10 changed files with 331 additions and 207 deletions

View file

@ -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<LargeBookThumbnailUio>(),
) {
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<LargeBookThumbnailUio>(),
) {
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,
)
}
}

View file

@ -1,7 +1,6 @@
package com.pixelized.biblib.ui.screen.home.common.item package com.pixelized.biblib.ui.screen.home.common.item
import android.content.res.Configuration import android.content.res.Configuration
import android.text.Layout
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@ -26,7 +25,7 @@ import com.pixelized.biblib.utils.extention.default
import com.skydoves.landscapist.glide.GlideImage import com.skydoves.landscapist.glide.GlideImage
@Stable @Stable
data class BookThumbnailUio( data class SmallBookThumbnailUio(
val id: Int, val id: Int,
val genre: String, val genre: String,
val title: String, val title: String,
@ -39,8 +38,8 @@ data class BookThumbnailUio(
@Composable @Composable
fun SmallBookThumbnail( fun SmallBookThumbnail(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
thumbnail: BookThumbnailUio?, thumbnail: SmallBookThumbnailUio?,
onClick: (BookThumbnailUio) -> Unit = default<BookThumbnailUio>(), onClick: (SmallBookThumbnailUio) -> Unit = default<SmallBookThumbnailUio>(),
) { ) {
if (thumbnail != null) { if (thumbnail != null) {
SmallBookThumbnailContent( SmallBookThumbnailContent(
@ -58,8 +57,8 @@ fun SmallBookThumbnail(
@Composable @Composable
private fun SmallBookThumbnailContent( private fun SmallBookThumbnailContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
thumbnail: BookThumbnailUio, thumbnail: SmallBookThumbnailUio,
onClick: (BookThumbnailUio) -> Unit = default<BookThumbnailUio>(), onClick: (SmallBookThumbnailUio) -> Unit = default<SmallBookThumbnailUio>(),
) { ) {
val dimen = MaterialTheme.bibLib.dimen val dimen = MaterialTheme.bibLib.dimen
Card( Card(
@ -229,135 +228,13 @@ private fun SmallBookThumbnailPlaceHolder(
} }
} }
@Composable
fun LargeBookThumbnail(
modifier: Modifier = Modifier,
thumbnail: BookThumbnailUio?,
onClick: (BookThumbnailUio) -> Unit = default<BookThumbnailUio>(),
) {
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<BookThumbnailUio>(),
) {
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 @Composable
@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(uiMode = Configuration.UI_MODE_NIGHT_NO)
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun SmallBookThumbnailPreview() { private fun SmallBookThumbnailPreview() {
BibLibTheme { BibLibTheme {
SmallBookThumbnail( SmallBookThumbnail(
thumbnail = BookThumbnailUio( thumbnail = SmallBookThumbnailUio(
id = 0, id = 0,
genre = "Sci-Fi", genre = "Sci-Fi",
title = "Foundation", title = "Foundation",
@ -379,36 +256,4 @@ private fun SmallBookThumbnailEmptyPreview() {
thumbnail = null, 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,
)
}
} }

View file

@ -4,14 +4,15 @@ import androidx.compose.runtime.Composable
import androidx.paging.PagingData import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems 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 import kotlinx.coroutines.flow.flowOf
@Composable @Composable
fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> { fun smallBookThumbnailPreviewResources(): LazyPagingItems<SmallBookThumbnailUio> {
val thumbnails = listOf( val thumbnails = listOf(
BookThumbnailUio( SmallBookThumbnailUio(
id = 112, id = 112,
title = "Prélude à Fondation", title = "Prélude à Fondation",
author = "Asimov", author = "Asimov",
@ -20,7 +21,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 78, id = 78,
title = "L'Aube de Fondation", title = "L'Aube de Fondation",
author = "Asimov", author = "Asimov",
@ -29,7 +30,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 90, id = 90,
title = "Fondation", title = "Fondation",
author = "Asimov", author = "Asimov",
@ -38,7 +39,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 184, id = 184,
title = "Fondation et Empire", title = "Fondation et Empire",
author = "Asimov", author = "Asimov",
@ -47,7 +48,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 185, id = 185,
title = "Seconde Fondation", title = "Seconde Fondation",
author = "Asimov", author = "Asimov",
@ -56,7 +57,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 119, id = 119,
title = "Fondation foudroyée", title = "Fondation foudroyée",
author = "Asimov", author = "Asimov",
@ -65,7 +66,7 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
isNew = false, isNew = false,
cover = "", cover = "",
), ),
BookThumbnailUio( SmallBookThumbnailUio(
id = 163, id = 163,
title = "Terre et Fondation", title = "Terre et Fondation",
author = "Asimov", author = "Asimov",
@ -76,4 +77,67 @@ fun bookPreviewResources(): LazyPagingItems<BookThumbnailUio> {
), ),
) )
return flowOf(PagingData.from(thumbnails)).collectAsLazyPagingItems() return flowOf(PagingData.from(thumbnails)).collectAsLazyPagingItems()
}
@Composable
fun largeBookThumbnailPreviewResources(): LazyPagingItems<LargeBookThumbnailUio> {
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()
} }

View file

@ -13,9 +13,9 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.items import androidx.paging.compose.items
import com.pixelized.biblib.ui.scaffold.LocalDetailBottomSheetState 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.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.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.navigationBarsHeight import com.pixelized.biblib.utils.extention.navigationBarsHeight
@ -34,7 +34,7 @@ fun BooksPage(
@Composable @Composable
private fun BooksPageContent( private fun BooksPageContent(
books: LazyPagingItems<BookThumbnailUio>, books: LazyPagingItems<SmallBookThumbnailUio>,
) { ) {
val bottomDetailState = LocalDetailBottomSheetState.current val bottomDetailState = LocalDetailBottomSheetState.current
@ -66,7 +66,7 @@ private fun BooksPagePreview() {
BibLibTheme { BibLibTheme {
Column { Column {
BooksPageContent( BooksPageContent(
books = bookPreviewResources() books = smallBookThumbnailPreviewResources()
) )
} }
} }

View file

@ -5,12 +5,8 @@ import androidx.lifecycle.ViewModel
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.compose.collectAsLazyPagingItems 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.repository.book.IBookRepository
import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio import com.pixelized.biblib.utils.extention.toSmallThumbnailUio
import com.pixelized.biblib.utils.extention.longDate
import com.pixelized.biblib.utils.extention.toThumbnailUio
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import javax.inject.Inject import javax.inject.Inject
@ -24,7 +20,7 @@ class BooksViewModel @Inject constructor(
private val booksSource = Pager( private val booksSource = Pager(
config = PagingConfig(pageSize = PAGING_SIZE), config = PagingConfig(pageSize = PAGING_SIZE),
pagingSourceFactory = bookRepository.getBooksSource() pagingSourceFactory = bookRepository.getBooksSource()
.map { it.toThumbnailUio() } .map { it.toSmallThumbnailUio() }
.asPagingSourceFactory(Dispatchers.IO) .asPagingSourceFactory(Dispatchers.IO)
).flow ).flow

View file

@ -8,8 +8,9 @@ import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.network.client.IBibLibClient
import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.repository.book.IBookRepository
import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio import com.pixelized.biblib.ui.screen.home.common.item.LargeBookThumbnailUio
import com.pixelized.biblib.utils.extention.toThumbnailUio import com.pixelized.biblib.utils.extention.toLargeBookThumbnailUio
import com.pixelized.biblib.utils.extention.toSmallThumbnailUio
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -21,10 +22,10 @@ class NewsBookViewModel @Inject constructor(
bookRepository: IBookRepository, bookRepository: IBookRepository,
) : ViewModel() { ) : ViewModel() {
private val newsSource: Flow<PagingData<BookThumbnailUio>> = Pager( private val newsSource: Flow<PagingData<LargeBookThumbnailUio>> = Pager(
config = PagingConfig(pageSize = PAGING_SIZE), config = PagingConfig(pageSize = PAGING_SIZE),
pagingSourceFactory = bookRepository.getNewsSource() pagingSourceFactory = bookRepository.getNewsSource()
.map { it.toThumbnailUio(coverBaseUrl = IBibLibClient.COVER_URL) } .map { it.toLargeBookThumbnailUio() }
.asPagingSourceFactory(Dispatchers.IO) .asPagingSourceFactory(Dispatchers.IO)
).flow ).flow

View file

@ -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_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES 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.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
@ -12,9 +14,9 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import com.pixelized.biblib.ui.scaffold.DetailBottomSheetState import com.pixelized.biblib.ui.scaffold.DetailBottomSheetState
import com.pixelized.biblib.ui.scaffold.LocalDetailBottomSheetState 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.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.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.navigationBarsHeight import com.pixelized.biblib.utils.extention.navigationBarsHeight
@ -33,7 +35,7 @@ fun NewsPage(
@Composable @Composable
private fun NewsPageContent( private fun NewsPageContent(
books: LazyPagingItems<BookThumbnailUio>, books: LazyPagingItems<LargeBookThumbnailUio>,
) { ) {
val detailBottomSheetState: DetailBottomSheetState = LocalDetailBottomSheetState.current val detailBottomSheetState: DetailBottomSheetState = LocalDetailBottomSheetState.current
@ -68,7 +70,7 @@ private fun NewPagePreview() {
BibLibTheme { BibLibTheme {
Column { Column {
NewsPageContent( NewsPageContent(
books = bookPreviewResources() books = largeBookThumbnailPreviewResources()
) )
} }
} }

View file

@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha 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.LocalDetailBottomSheetState
import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel
import com.pixelized.biblib.ui.scaffold.SearchFilter 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.SmallBookThumbnail
import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio
import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default import com.pixelized.biblib.utils.extention.default
@ -71,17 +72,21 @@ fun SearchPage(
@Composable @Composable
private fun SearchPageContent( private fun SearchPageContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
search: Flow<PagingData<BookThumbnailUio>> = emptyFlow(), search: Flow<PagingData<SmallBookThumbnailUio>> = emptyFlow(),
filters: List<SearchFilter> = SearchFilter.all, filters: List<SearchFilter> = SearchFilter.all,
onFilter: (filter: SearchFilter) -> Unit = default<SearchFilter>(), onFilter: (filter: SearchFilter) -> Unit = default<SearchFilter>(),
onDetail: (item: BookThumbnailUio) -> Unit = default<BookThumbnailUio>() onDetail: (item: SmallBookThumbnailUio) -> Unit = default<SmallBookThumbnailUio>()
) { ) {
val items = search.collectAsLazyPagingItems() val items = search.collectAsLazyPagingItems()
LazyColumn( LazyColumn(
modifier = modifier, modifier = modifier,
contentPadding = PaddingValues(bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight()), contentPadding = PaddingValues(
verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.dp8), bottom = MaterialTheme.bibLib.dimen.thumbnail.padding + navigationBarsHeight()
),
verticalArrangement = Arrangement.spacedBy(
space = MaterialTheme.bibLib.dimen.thumbnail.arrangement
),
) { ) {
item(key = "Search Filter") { item(key = "Search Filter") {
SearchFilter( SearchFilter(
@ -132,7 +137,8 @@ private fun SearchFilter(
Row( Row(
modifier = Modifier modifier = Modifier
.horizontalScroll(rememberScrollState()) .horizontalScroll(rememberScrollState())
.then(modifier) .then(modifier),
verticalAlignment = Alignment.CenterVertically,
) { ) {
filters.forEachIndexed { index, filter -> filters.forEachIndexed { index, filter ->
val chipModifier = if (index != filters.lastIndex) { val chipModifier = if (index != filters.lastIndex) {
@ -140,6 +146,7 @@ private fun SearchFilter(
} else { } else {
Modifier Modifier
} }
SearchChipFilter( SearchChipFilter(
modifier = chipModifier, modifier = chipModifier,
selected = filter.isSelected, selected = filter.isSelected,
@ -166,16 +173,27 @@ private fun SearchChipFilter(
onClick = onClick, onClick = onClick,
) { ) {
Text( Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = label text = label
) )
value?.let { value?.let {
Text(text = ": ") Text(
Text(text = value) 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( Icon(
imageVector = Icons.Default.ArrowDropDown, imageVector = Icons.Default.ArrowDropDown,
tint = MaterialTheme.bibLib.colors.typography.medium,
contentDescription = null contentDescription = null
) )
} }

View file

@ -6,12 +6,8 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.paging.* 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.repository.book.IBookRepository
import com.pixelized.biblib.ui.screen.home.common.item.BookThumbnailUio import com.pixelized.biblib.utils.extention.toSmallThumbnailUio
import com.pixelized.biblib.utils.extention.longDate
import com.pixelized.biblib.utils.extention.toThumbnailUio
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -90,7 +86,7 @@ class SearchViewModel @Inject constructor(
.combine(language.confirmFlow) { paging, filter -> .combine(language.confirmFlow) { paging, filter ->
paging.filter { filter == null || it.language == null || it.language.id == filter.id } 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( data class FilterUio(
val id: Int, val id: Int,

View file

@ -3,7 +3,8 @@ package com.pixelized.biblib.utils.extention
import androidx.annotation.StringDef import androidx.annotation.StringDef
import com.pixelized.biblib.model.book.Book import com.pixelized.biblib.model.book.Book
import com.pixelized.biblib.network.client.IBibLibClient 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 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 annotation class CoverUrl
fun Book.toThumbnailUio( fun Book.toSmallThumbnailUio(
@CoverUrl coverBaseUrl: String = IBibLibClient.THUMBNAIL_URL @CoverUrl coverBaseUrl: String = IBibLibClient.THUMBNAIL_URL
) = BookThumbnailUio( ) = SmallBookThumbnailUio(
id = id, id = id,
genre = genre?.joinToString { it.name } ?: "", genre = genre?.joinToString { it.name } ?: "",
title = title, title = title,
author = author.joinToString { it.name }, author = author.joinToString { it.name },
date = releaseDate.longDate(), date = releaseDate.longDate(),
isNew = isNew, 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( fun Book.toDetailUio(