From 90d6c4bd6591c598b64ed98420d4ead34be34733 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Fri, 14 May 2021 14:10:12 +0200 Subject: [PATCH] Add back the detail page linked to the API. --- .../composable/pages/DetailPageComposable.kt | 16 ++++++++++++ .../ui/composable/pages/HomePageComposable.kt | 10 +++----- .../composable/screen/MainScreenComposable.kt | 6 ++--- .../ui/viewmodel/book/BooksViewModel.kt | 25 +++++++++++++++++++ .../ui/viewmodel/book/IBooksViewModel.kt | 4 +++ .../navigation/INavigationViewModel.kt | 2 +- 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPageComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPageComposable.kt index 21cc170..50b1fd6 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPageComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/DetailPageComposable.kt @@ -12,6 +12,8 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Download import androidx.compose.material.icons.filled.Send import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -23,16 +25,30 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import com.pixelized.biblib.R import com.pixelized.biblib.ui.composable.items.Image import com.pixelized.biblib.ui.data.BookUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.theme.Teal200 +import com.pixelized.biblib.ui.viewmodel.book.BooksViewModel +import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel import com.pixelized.biblib.utils.BitmapCache import com.pixelized.biblib.utils.injection.Bob import com.pixelized.biblib.utils.mock.BookMock +@Composable +fun DetailPageComposable( + booksViewModel: IBooksViewModel = viewModel(), + bookId: Int +) { + val book by booksViewModel.getBookDetail(bookId).observeAsState() + book?.let { + DetailPageComposable(book = it) + } +} + @Composable fun DetailPageComposable(book: BookUio) { val typography = MaterialTheme.typography diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/HomePageComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/HomePageComposable.kt index 399ac62..e006309 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/pages/HomePageComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/pages/HomePageComposable.kt @@ -1,6 +1,5 @@ package com.pixelized.biblib.ui.composable.pages -import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth @@ -18,7 +17,7 @@ import com.pixelized.biblib.ui.data.BookThumbnailUio import com.pixelized.biblib.ui.theme.BibLibTheme import com.pixelized.biblib.ui.viewmodel.book.IBooksViewModel import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel - +import com.pixelized.biblib.ui.viewmodel.navigation.INavigationViewModel.Navigable.Page @Preview @Composable @@ -35,7 +34,8 @@ fun HomePageComposable( navigationViewModel: INavigationViewModel, booksViewModel: IBooksViewModel ) { - val lazyBooks: LazyPagingItems = booksViewModel.books.collectAsLazyPagingItems() + val lazyBooks: LazyPagingItems = + booksViewModel.books.collectAsLazyPagingItems() LazyColumn( contentPadding = PaddingValues(16.dp), @@ -48,9 +48,7 @@ fun HomePageComposable( .fillMaxWidth() .wrapContentHeight(), ) { item -> - // TODO: -// val bookMock = BookMock().let { it.books[item.id] ?: it.book } -// navigation.navigateTo(INavigation.Page.Detail(bookMock)) + navigationViewModel.navigateTo(Page.Detail(item.id)) } } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt index 2909a15..652d738 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/composable/screen/MainScreenComposable.kt @@ -56,7 +56,7 @@ fun MainScreenComposable( val page by navigationViewModel.page.observeAsState() LaunchedEffect(key1 = "MainScreen", block = { - navigationViewModel.navigateTo(Page.HomePage) + navigationViewModel.navigateTo(Page.HomePage, true) }) Scaffold( @@ -76,10 +76,10 @@ fun MainScreenComposable( enter = slideInHorizontally(initialOffsetX = { width -> width }), exit = slideOutHorizontally(targetOffsetX = { width -> width }), ) { - // small trick to display the detail page during animation exit. + // Small trick to display the detail page during animation exit. var currentPage by remember { mutableStateOf(null) } currentPage = page as? Page.Detail ?: currentPage - currentPage?.let { DetailPageComposable(it.book) } + currentPage?.let { DetailPageComposable(booksViewModel, it.bookId) } } } } diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/BooksViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/BooksViewModel.kt index 1c836ec..ee36e99 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/BooksViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/BooksViewModel.kt @@ -14,10 +14,12 @@ import com.pixelized.biblib.network.factory.BookFactory import com.pixelized.biblib.repository.apiCache.IAPICacheRepository import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.ui.data.BookThumbnailUio +import com.pixelized.biblib.ui.data.BookUio import com.pixelized.biblib.utils.injection.inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch +import java.util.* class BooksViewModel : ViewModel(), IBooksViewModel { private val bookRepository: IBookRepository by inject() @@ -51,6 +53,17 @@ class BooksViewModel : ViewModel(), IBooksViewModel { } } + override fun getBookDetail(id: Int): LiveData { + val data = MutableLiveData() + viewModelScope.launch(Dispatchers.IO) { + val factory = BookFactory() + val response = client.service.detail(id) + val book = factory.fromDetailResponseToBook(response) + data.postValue(book.toUio()) + } + return data + } + private suspend fun loadNewBooks(): Boolean { val cached = apiCache.new val updated = client.service.new() @@ -79,4 +92,16 @@ class BooksViewModel : ViewModel(), IBooksViewModel { date = releaseDate.toString(), series = series?.name, ) + + private fun Book.toUio() = BookUio( + id = id, + title = title, + author = author.joinToString { it.name }, + genre = genre?.joinToString { it.name } ?: "", + rating = rating?.toFloat() ?: 0.0f, + language = language?.code?.let { Locale(it).language } ?: "", + date = releaseDate.toString(), + series = series?.name, + description = synopsis ?: "", + ) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/IBooksViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/IBooksViewModel.kt index 7608285..910ec3c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/IBooksViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/book/IBooksViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.paging.PagingData import com.pixelized.biblib.ui.data.BookThumbnailUio +import com.pixelized.biblib.ui.data.BookUio import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf @@ -14,6 +15,8 @@ interface IBooksViewModel { fun updateBooks() + fun getBookDetail(id: Int): LiveData + sealed class State { object Initial : State() object Loading : State() @@ -28,5 +31,6 @@ interface IBooksViewModel { get() = flowOf() override fun updateBooks() = Unit + override fun getBookDetail(id: Int) = MutableLiveData() } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt index f3fa779..2f43dcc 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/navigation/INavigationViewModel.kt @@ -20,7 +20,7 @@ interface INavigationViewModel { sealed class Page : Navigable() { object HomePage : Page() - data class Detail(val book: BookUio) : Page() + data class Detail(val bookId: Int) : Page() } }