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.viewModelScope
import dev.msfjarvis.lobsters.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.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 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
init {
viewModelScope.launch {
dao.loadPosts().collectLatest { _posts.value = it }
}
getMorePosts()
}
fun getMorePosts() {
viewModelScope.launch {
_posts.value += lobstersApi.getHottestPosts(apiPage)
viewModelScope.launch(coroutineExceptionHandler) {
val newPosts = lobstersApi.getHottestPosts(apiPage)
_posts.value += newPosts
apiPage += 1
dao.insertPosts(*_posts.value.toTypedArray())
}
}
}