src: fix is_saved logic

Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
This commit is contained in:
Aditya Wasan 2021-01-31 14:45:53 +05:30
parent 6fdf1d0ca0
commit ff4a2a751f
No known key found for this signature in database
GPG key ID: 6D6DF3BF15DE79B5
4 changed files with 20 additions and 29 deletions

View file

@ -1,5 +1,6 @@
package dev.msfjarvis.lobsters.data.remote
import android.util.Log
import androidx.paging.PagingSource
import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.local.LobstersPost
@ -14,17 +15,9 @@ class LobstersPagingSource @Inject constructor(
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
return try {
val page = params.key ?: 1
val posts = lobstersApi.getHottestPosts(page).map { post ->
// We can replace these two lines below with a getOrInsertPost repository method.
val dbPost = lobstersRepository.getPost(post.short_id)
return@map if (dbPost == null) {
// If db does not contain the post, add it and return the original post
lobstersRepository.addPostToDB(post)
post
} else {
// Otherwise return the db post
dbPost
}
val posts = lobstersApi.getHottestPosts(page).mapIndexed { index, post ->
val isSaved = lobstersRepository.isPostSaved(post.short_id)
return@mapIndexed post.copy(is_saved = isSaved)
}
LoadResult.Page(

View file

@ -9,7 +9,6 @@ import javax.inject.Inject
class LobstersRepository @Inject constructor(private val lobstersDatabase: LobstersDatabase) {
fun isPostSaved(postId: String): Boolean {
// returns the post if it exists and its is_saved property is true
val post = lobstersDatabase.postQueries.isPostSaved(postId).executeAsOneOrNull()
return post != null
}
@ -27,9 +26,7 @@ class LobstersRepository @Inject constructor(private val lobstersDatabase: Lobst
}
suspend fun savePost(post: LobstersPost) = withContext(Dispatchers.IO) {
if (!isPostSaved(post.short_id)) {
lobstersDatabase.postQueries.savePost(post.short_id)
}
lobstersDatabase.postQueries.insertOrReplacePost(post.copy(is_saved = true))
}
suspend fun removeSavedPost(post: LobstersPost) = withContext(Dispatchers.IO) {

View file

@ -14,10 +14,6 @@ import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.ripple.rememberRipple
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.graphics.Color
import androidx.compose.ui.res.stringResource
@ -69,8 +65,6 @@ fun LobstersItem(
onLongClick: () -> Unit,
onSaveButtonClick: () -> Unit,
) {
var isSaved by remember { mutableStateOf(post.is_saved ?: false) }
Surface(
modifier = Modifier
.fillMaxWidth()
@ -127,14 +121,11 @@ fun LobstersItem(
},
)
IconResource(
resourceId = if (isSaved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
resourceId = if (post.is_saved == true) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
modifier = Modifier
.padding(8.dp)
.clickable(
onClick = {
onSaveButtonClick()
isSaved = isSaved.not()
},
onClick = onSaveButtonClick,
indication = rememberRipple(),
)
.constrainAs(saveButton) {

View file

@ -4,7 +4,9 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.cachedIn
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.remote.LobstersPagingSource
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
@ -17,17 +19,21 @@ import javax.inject.Inject
class LobstersViewModel @Inject constructor(
private val pagingSource: LobstersPagingSource,
private val lobstersRepository: LobstersRepository,
private val lobstersApi: LobstersApi,
) : ViewModel() {
private val _savedPosts = MutableStateFlow<List<LobstersPost>>(emptyList())
private var source: LobstersPagingSource? = null
val savedPosts = _savedPosts.asStateFlow()
val posts = Pager(PagingConfig(5)) {
pagingSource
}.flow
val posts = Pager(PagingConfig(25)) {
source = LobstersPagingSource(lobstersApi, lobstersRepository)
source!!
}.flow.cachedIn(viewModelScope)
fun toggleSave(post: LobstersPost) {
viewModelScope.launch {
val isSaved = lobstersRepository.isPostSaved(post.short_id)
if (isSaved) removeSavedPost(post) else savePost(post)
invalidateSource()
}
}
@ -39,6 +45,10 @@ class LobstersViewModel @Inject constructor(
}
}
fun invalidateSource() {
source?.invalidate()
}
private fun savePost(post: LobstersPost) {
viewModelScope.launch {
lobstersRepository.savePost(post)