app: remove existing post loading

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-12-06 00:34:07 +05:30
parent ada6a6f3ff
commit d0d08f8a3c
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 5 additions and 50 deletions

View file

@ -24,6 +24,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.navigate
import androidx.navigation.compose.rememberNavController
import dagger.hilt.android.AndroidEntryPoint
import dev.msfjarvis.lobsters.model.LobstersPost
import dev.msfjarvis.lobsters.util.IconResource
import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel
import dev.msfjarvis.lobsters.ui.navigation.Destination
@ -54,7 +55,7 @@ class MainActivity : AppCompatActivity() {
fun LobstersApp() {
val viewModel: LobstersViewModel = viewModel()
val navController = rememberNavController()
val hottestPosts by viewModel.posts.collectAsState()
val hottestPosts = emptyList<LobstersPost>()
val savedPosts by viewModel.savedPosts.collectAsState()
Scaffold(
@ -68,7 +69,6 @@ fun LobstersApp() {
HottestPosts(
posts = hottestPosts,
listState = hottestPostsListState,
overscrollAction = viewModel::getMorePosts,
saveAction = viewModel::savePost,
modifier = Modifier.padding(bottom = innerPadding.bottom),
)

View file

@ -1,7 +1,7 @@
package dev.msfjarvis.lobsters.ui.posts
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumnForIndexed
import androidx.compose.foundation.lazy.LazyColumnFor
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@ -14,7 +14,6 @@ fun HottestPosts(
posts: List<LobstersPost>,
listState: LazyListState,
modifier: Modifier = Modifier,
overscrollAction: () -> Unit,
saveAction: (LobstersPost) -> Unit,
) {
val urlLauncher = UrlLauncherAmbient.current
@ -22,14 +21,11 @@ fun HottestPosts(
if (posts.isEmpty()) {
EmptyList(saved = false)
} else {
LazyColumnForIndexed(
LazyColumnFor(
items = posts,
state = listState,
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { index, item ->
if (posts.lastIndex == index) {
overscrollAction.invoke()
}
) { item ->
LobstersItem(
post = item,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },

View file

@ -3,44 +3,21 @@ package dev.msfjarvis.lobsters.ui.viewmodel
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.source.PostsDatabase
import dev.msfjarvis.lobsters.model.LobstersPost
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.net.SocketTimeoutException
import java.net.UnknownHostException
class LobstersViewModel @ViewModelInject constructor(
private val lobstersApi: LobstersApi,
database: PostsDatabase,
) : ViewModel() {
private var apiPage = 1
private val _posts = MutableStateFlow<List<LobstersPost>>(emptyList())
private val _savedPosts = MutableStateFlow<List<LobstersPost>>(emptyList())
private val postsDao = database.postsDao()
private val savedPostsDao = database.savedPostsDao()
private val coroutineExceptionHandler = CoroutineExceptionHandler { _, throwable ->
when (throwable) {
// Swallow known network errors that can be recovered from.
is UnknownHostException, is SocketTimeoutException -> {
if (_posts.value.isEmpty()) {
viewModelScope.launch {
postsDao.loadPosts().collectLatest { _posts.value = it }
}
}
}
else -> throw throwable
}
}
val posts: StateFlow<List<LobstersPost>> get() = _posts
val savedPosts: StateFlow<List<LobstersPost>> get() = _savedPosts
init {
getMorePostsInternal(true)
getSavedPosts()
}
@ -50,24 +27,6 @@ class LobstersViewModel @ViewModelInject constructor(
}
}
fun getMorePosts() {
getMorePostsInternal(false)
}
private fun getMorePostsInternal(firstLoad: Boolean) {
viewModelScope.launch(coroutineExceptionHandler) {
val newPosts = lobstersApi.getHottestPosts(apiPage)
if (firstLoad) {
_posts.value = newPosts
postsDao.deleteAllPosts()
} else {
_posts.value += newPosts
}
apiPage += 1
postsDao.insertPosts(*_posts.value.toTypedArray())
}
}
fun savePost(post: LobstersPost) {
viewModelScope.launch {
savedPostsDao.insertPosts(post)