diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/LobstersPagingSource.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/LobstersPagingSource.kt index e05695b1..77b48b65 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/LobstersPagingSource.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/LobstersPagingSource.kt @@ -1,24 +1,18 @@ 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 -import dev.msfjarvis.lobsters.data.repo.LobstersRepository import javax.inject.Inject class LobstersPagingSource @Inject constructor( private val lobstersApi: LobstersApi, - private val lobstersRepository: LobstersRepository, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { return try { val page = params.key ?: 1 - val posts = lobstersApi.getHottestPosts(page).map { post -> - val isSaved = lobstersRepository.isPostSaved(post.short_id) - post.copy(is_saved = isSaved) - } + val posts = lobstersApi.getHottestPosts(page) LoadResult.Page( data = posts, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index ec54d98f..31c8f9c3 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -78,6 +78,7 @@ fun LobstersApp() { HottestPosts( posts = hottestPosts, listState = hottestPostsListState, + isPostSaved = viewModel::isPostSaved, saveAction = viewModel::toggleSave, modifier = Modifier.padding(bottom = innerPadding.bottom), ) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt index 9b3faf23..054b32f0 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt @@ -3,6 +3,10 @@ package dev.msfjarvis.lobsters.ui.posts import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState 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.paging.LoadState import androidx.paging.compose.LazyPagingItems @@ -14,6 +18,7 @@ import dev.msfjarvis.lobsters.ui.urllauncher.AmbientUrlLauncher fun HottestPosts( posts: LazyPagingItems, listState: LazyListState, + isPostSaved: (String) -> Boolean, modifier: Modifier = Modifier, saveAction: (LobstersPost) -> Unit, ) { @@ -28,11 +33,17 @@ fun HottestPosts( ) { items(posts) { item -> if (item != null) { + var isSaved by remember(item.short_id) { mutableStateOf(isPostSaved(item.short_id)) } + LobstersItem( post = item, + isSaved = isSaved, onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) }, onLongClick = { urlLauncher.launch(item.comments_url) }, - onSaveButtonClick = { saveAction.invoke(item) }, + onSaveButtonClick = { + isSaved = isSaved.not() + saveAction.invoke(item) + }, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt index 85a84c8d..03af3e13 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt @@ -61,6 +61,7 @@ val TEST_POST = LobstersPost( @Composable fun LobstersItem( post: LobstersPost, + isSaved: Boolean, onClick: () -> Unit, onLongClick: () -> Unit, onSaveButtonClick: () -> Unit, @@ -121,7 +122,7 @@ fun LobstersItem( }, ) 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 .padding(8.dp) .clickable( @@ -167,6 +168,7 @@ fun Preview() { items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item -> LobstersItem( post = item, + isSaved = false, onClick = {}, onLongClick = {}, onSaveButtonClick = {}, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt index 32a431e6..deb275a5 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt @@ -26,6 +26,7 @@ fun SavedPosts( items(posts) { item -> LobstersItem( post = item, + isSaved = true, onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) }, onLongClick = { urlLauncher.launch(item.comments_url) }, onSaveButtonClick = { saveAction.invoke(item) }, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt index d2e14d75..76ebbb25 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt @@ -6,7 +6,6 @@ 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 @@ -18,26 +17,23 @@ import javax.inject.Inject @HiltViewModel class LobstersViewModel @Inject constructor( private val lobstersRepository: LobstersRepository, - private val lobstersApi: LobstersApi, + private val pagingSource: LobstersPagingSource, ) : ViewModel() { - private lateinit var source: LobstersPagingSource private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache()) val savedPosts = _savedPosts.asStateFlow() val posts = Pager(PagingConfig(25)) { - source = LobstersPagingSource(lobstersApi, lobstersRepository) - source + pagingSource }.flow.cachedIn(viewModelScope) fun toggleSave(post: LobstersPost) { viewModelScope.launch { val isSaved = lobstersRepository.isPostSaved(post.short_id) if (isSaved) removeSavedPost(post) else savePost(post) - invalidateSource() } } - private fun invalidateSource() { - source.invalidate() + fun isPostSaved(postId: String): Boolean { + return lobstersRepository.isPostSaved(postId) } private fun savePost(post: LobstersPost) {