diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index c3a88451..76d81e10 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -24,6 +24,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.navigate import androidx.navigation.compose.rememberNavController import dagger.hilt.android.AndroidEntryPoint +import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.util.IconResource import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel import dev.msfjarvis.lobsters.ui.navigation.Destination @@ -54,7 +55,7 @@ class MainActivity : AppCompatActivity() { fun LobstersApp() { val viewModel: LobstersViewModel = viewModel() val navController = rememberNavController() - val hottestPosts by viewModel.posts.collectAsState() + val hottestPosts = emptyList() val savedPosts by viewModel.savedPosts.collectAsState() Scaffold( @@ -68,7 +69,6 @@ fun LobstersApp() { HottestPosts( posts = hottestPosts, listState = hottestPostsListState, - overscrollAction = viewModel::getMorePosts, saveAction = viewModel::savePost, modifier = Modifier.padding(bottom = innerPadding.bottom), ) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt index 071b62c6..eaecb70f 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt @@ -1,7 +1,7 @@ package dev.msfjarvis.lobsters.ui.posts import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumnForIndexed +import androidx.compose.foundation.lazy.LazyColumnFor import androidx.compose.foundation.lazy.LazyListState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -14,7 +14,6 @@ fun HottestPosts( posts: List, listState: LazyListState, modifier: Modifier = Modifier, - overscrollAction: () -> Unit, saveAction: (LobstersPost) -> Unit, ) { val urlLauncher = UrlLauncherAmbient.current @@ -22,14 +21,11 @@ fun HottestPosts( if (posts.isEmpty()) { EmptyList(saved = false) } else { - LazyColumnForIndexed( + LazyColumnFor( items = posts, state = listState, modifier = Modifier.padding(horizontal = 8.dp).then(modifier) - ) { index, item -> - if (posts.lastIndex == index) { - overscrollAction.invoke() - } + ) { item -> LobstersItem( post = item, onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) }, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt index 5959f3f0..a79d92ef 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt @@ -3,44 +3,21 @@ package dev.msfjarvis.lobsters.ui.viewmodel import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dev.msfjarvis.lobsters.data.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.SocketTimeoutException -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 _savedPosts = MutableStateFlow>(emptyList()) - private val postsDao = database.postsDao() private val savedPostsDao = database.savedPostsDao() - private val coroutineExceptionHandler = CoroutineExceptionHandler { _, throwable -> - when (throwable) { - // Swallow known network errors that can be recovered from. - is UnknownHostException, is SocketTimeoutException -> { - if (_posts.value.isEmpty()) { - viewModelScope.launch { - postsDao.loadPosts().collectLatest { _posts.value = it } - } - } - } - else -> throw throwable - } - } - val posts: StateFlow> get() = _posts val savedPosts: StateFlow> get() = _savedPosts init { - getMorePostsInternal(true) getSavedPosts() } @@ -50,24 +27,6 @@ class LobstersViewModel @ViewModelInject constructor( } } - fun getMorePosts() { - getMorePostsInternal(false) - } - - private fun getMorePostsInternal(firstLoad: Boolean) { - viewModelScope.launch(coroutineExceptionHandler) { - val newPosts = lobstersApi.getHottestPosts(apiPage) - if (firstLoad) { - _posts.value = newPosts - postsDao.deleteAllPosts() - } else { - _posts.value += newPosts - } - apiPage += 1 - postsDao.insertPosts(*_posts.value.toTypedArray()) - } - } - fun savePost(post: LobstersPost) { viewModelScope.launch { savedPostsDao.insertPosts(post)