mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 03:17:03 +05:30
app: wire in local persistence in LobstersViewModel
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
95334d2c8b
commit
4fdb5a60d5
1 changed files with 20 additions and 3 deletions
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue