src: add isSaved parameter to LobstersItem

Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
This commit is contained in:
Aditya Wasan 2021-01-31 16:17:08 +05:30
parent af72415952
commit 092599d167
No known key found for this signature in database
GPG key ID: 6D6DF3BF15DE79B5
6 changed files with 22 additions and 17 deletions

View file

@ -1,24 +1,18 @@
package dev.msfjarvis.lobsters.data.remote package dev.msfjarvis.lobsters.data.remote
import android.util.Log
import androidx.paging.PagingSource import androidx.paging.PagingSource
import dev.msfjarvis.lobsters.data.api.LobstersApi import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.local.LobstersPost import dev.msfjarvis.lobsters.data.local.LobstersPost
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
import javax.inject.Inject import javax.inject.Inject
class LobstersPagingSource @Inject constructor( class LobstersPagingSource @Inject constructor(
private val lobstersApi: LobstersApi, private val lobstersApi: LobstersApi,
private val lobstersRepository: LobstersRepository,
) : PagingSource<Int, LobstersPost>() { ) : PagingSource<Int, LobstersPost>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> { override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
return try { return try {
val page = params.key ?: 1 val page = params.key ?: 1
val posts = lobstersApi.getHottestPosts(page).map { post -> val posts = lobstersApi.getHottestPosts(page)
val isSaved = lobstersRepository.isPostSaved(post.short_id)
post.copy(is_saved = isSaved)
}
LoadResult.Page( LoadResult.Page(
data = posts, data = posts,

View file

@ -78,6 +78,7 @@ fun LobstersApp() {
HottestPosts( HottestPosts(
posts = hottestPosts, posts = hottestPosts,
listState = hottestPostsListState, listState = hottestPostsListState,
isPostSaved = viewModel::isPostSaved,
saveAction = viewModel::toggleSave, saveAction = viewModel::toggleSave,
modifier = Modifier.padding(bottom = innerPadding.bottom), modifier = Modifier.padding(bottom = innerPadding.bottom),
) )

View file

@ -3,6 +3,10 @@ package dev.msfjarvis.lobsters.ui.posts
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
@ -14,6 +18,7 @@ import dev.msfjarvis.lobsters.ui.urllauncher.AmbientUrlLauncher
fun HottestPosts( fun HottestPosts(
posts: LazyPagingItems<LobstersPost>, posts: LazyPagingItems<LobstersPost>,
listState: LazyListState, listState: LazyListState,
isPostSaved: (String) -> Boolean,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit, saveAction: (LobstersPost) -> Unit,
) { ) {
@ -28,11 +33,17 @@ fun HottestPosts(
) { ) {
items(posts) { item -> items(posts) { item ->
if (item != null) { if (item != null) {
var isSaved by remember(item.short_id) { mutableStateOf(isPostSaved(item.short_id)) }
LobstersItem( LobstersItem(
post = item, post = item,
isSaved = isSaved,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) }, onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
onLongClick = { urlLauncher.launch(item.comments_url) }, onLongClick = { urlLauncher.launch(item.comments_url) },
onSaveButtonClick = { saveAction.invoke(item) }, onSaveButtonClick = {
isSaved = isSaved.not()
saveAction.invoke(item)
},
) )
} }
} }

View file

@ -61,6 +61,7 @@ val TEST_POST = LobstersPost(
@Composable @Composable
fun LobstersItem( fun LobstersItem(
post: LobstersPost, post: LobstersPost,
isSaved: Boolean,
onClick: () -> Unit, onClick: () -> Unit,
onLongClick: () -> Unit, onLongClick: () -> Unit,
onSaveButtonClick: () -> Unit, onSaveButtonClick: () -> Unit,
@ -121,7 +122,7 @@ fun LobstersItem(
}, },
) )
IconResource( IconResource(
resourceId = if (post.is_saved == true) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px, resourceId = if (isSaved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
modifier = Modifier modifier = Modifier
.padding(8.dp) .padding(8.dp)
.clickable( .clickable(
@ -167,6 +168,7 @@ fun Preview() {
items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item -> items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item ->
LobstersItem( LobstersItem(
post = item, post = item,
isSaved = false,
onClick = {}, onClick = {},
onLongClick = {}, onLongClick = {},
onSaveButtonClick = {}, onSaveButtonClick = {},

View file

@ -26,6 +26,7 @@ fun SavedPosts(
items(posts) { item -> items(posts) { item ->
LobstersItem( LobstersItem(
post = item, post = item,
isSaved = true,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) }, onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
onLongClick = { urlLauncher.launch(item.comments_url) }, onLongClick = { urlLauncher.launch(item.comments_url) },
onSaveButtonClick = { saveAction.invoke(item) }, onSaveButtonClick = { saveAction.invoke(item) },

View file

@ -6,7 +6,6 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.cachedIn import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.local.LobstersPost import dev.msfjarvis.lobsters.data.local.LobstersPost
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
import dev.msfjarvis.lobsters.data.repo.LobstersRepository import dev.msfjarvis.lobsters.data.repo.LobstersRepository
@ -18,26 +17,23 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class LobstersViewModel @Inject constructor( class LobstersViewModel @Inject constructor(
private val lobstersRepository: LobstersRepository, private val lobstersRepository: LobstersRepository,
private val lobstersApi: LobstersApi, private val pagingSource: LobstersPagingSource,
) : ViewModel() { ) : ViewModel() {
private lateinit var source: LobstersPagingSource
private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache()) private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache())
val savedPosts = _savedPosts.asStateFlow() val savedPosts = _savedPosts.asStateFlow()
val posts = Pager(PagingConfig(25)) { val posts = Pager(PagingConfig(25)) {
source = LobstersPagingSource(lobstersApi, lobstersRepository) pagingSource
source
}.flow.cachedIn(viewModelScope) }.flow.cachedIn(viewModelScope)
fun toggleSave(post: LobstersPost) { fun toggleSave(post: LobstersPost) {
viewModelScope.launch { viewModelScope.launch {
val isSaved = lobstersRepository.isPostSaved(post.short_id) val isSaved = lobstersRepository.isPostSaved(post.short_id)
if (isSaved) removeSavedPost(post) else savePost(post) if (isSaved) removeSavedPost(post) else savePost(post)
invalidateSource()
} }
} }
private fun invalidateSource() { fun isPostSaved(postId: String): Boolean {
source.invalidate() return lobstersRepository.isPostSaved(postId)
} }
private fun savePost(post: LobstersPost) { private fun savePost(post: LobstersPost) {