diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/LobstersViewModel.kt index cd32193f..e96c1129 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/LobstersViewModel.kt @@ -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>(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> 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()) } } }