app: wire in local persistence in LobstersViewModel

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-09-27 16:24:36 +05:30
parent 95334d2c8b
commit 4fdb5a60d5
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80

View file

@ -4,27 +4,44 @@ import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dev.msfjarvis.lobsters.api.LobstersApi import dev.msfjarvis.lobsters.api.LobstersApi
import dev.msfjarvis.lobsters.data.source.PostsDatabase
import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.model.LobstersPost
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.net.UnknownHostException
class LobstersViewModel @ViewModelInject constructor( class LobstersViewModel @ViewModelInject constructor(
private val lobstersApi: LobstersApi, private val lobstersApi: LobstersApi,
database: PostsDatabase,
) : ViewModel() { ) : ViewModel() {
private var apiPage = 1 private var apiPage = 1
private val _posts = MutableStateFlow<List<LobstersPost>>(emptyList()) private val _posts = MutableStateFlow<List<LobstersPost>>(emptyList())
private val dao = database.postsDao()
private val coroutineExceptionHandler = CoroutineExceptionHandler { _, throwable ->
when (throwable) {
// Swallow UHE since that happens when there is no internet and we'll just rely on our cache
is UnknownHostException -> {}
else -> throw throwable
}
}
val posts: StateFlow<List<LobstersPost>> get() = _posts val posts: StateFlow<List<LobstersPost>> get() = _posts
init { init {
viewModelScope.launch {
dao.loadPosts().collectLatest { _posts.value = it }
}
getMorePosts() getMorePosts()
} }
fun getMorePosts() { fun getMorePosts() {
viewModelScope.launch { viewModelScope.launch(coroutineExceptionHandler) {
_posts.value += lobstersApi.getHottestPosts(apiPage) val newPosts = lobstersApi.getHottestPosts(apiPage)
_posts.value += newPosts
apiPage += 1 apiPage += 1
dao.insertPosts(*_posts.value.toTypedArray())
} }
} }
} }