mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 00:57:02 +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.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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue