diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt index 16bbcb165..d4adb8d78 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt @@ -23,7 +23,6 @@ package com.vitorpamplona.amethyst.ui.screen import androidx.compose.animation.Crossfade import androidx.compose.animation.core.tween import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -32,18 +31,13 @@ import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.pullrefresh.PullRefreshIndicator -import androidx.compose.material3.pullrefresh.pullRefresh -import androidx.compose.material3.pullrefresh.rememberPullRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -68,30 +62,8 @@ fun RefreshableCardView( scrollStateKey: String? = null, enablePullRefresh: Boolean = true, ) { - var refreshing by remember { mutableStateOf(false) } - val pullRefreshState = - rememberPullRefreshState( - refreshing, - onRefresh = { - refreshing = true - viewModel.invalidateData() - refreshing = false - }, - ) - - val modifier = - if (enablePullRefresh) { - Modifier.fillMaxSize().pullRefresh(pullRefreshState) - } else { - Modifier.fillMaxSize() - } - - Box(modifier) { + RefresheableBox(viewModel, enablePullRefresh) { SaveableCardFeedState(viewModel, accountViewModel, nav, routeForLastRead, scrollStateKey) - - if (enablePullRefresh) { - PullRefreshIndicator(refreshing, pullRefreshState, Modifier.align(Alignment.TopCenter)) - } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index f35f36ff6..d8d96c06b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -70,7 +70,7 @@ class NotificationViewModel(val account: Account) : } @Stable -open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { +open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel(), InvalidatableViewModel { private val _feedContent = MutableStateFlow(CardFeedState.Loading) val feedContent = _feedContent.asStateFlow() @@ -358,7 +358,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { private val bundler = BundledUpdate(1000, Dispatchers.IO) private val bundlerInsert = BundledInsert>(1000, Dispatchers.IO) - fun invalidateData(ignoreIfDoing: Boolean = false) { + override fun invalidateData(ignoreIfDoing: Boolean) { bundler.invalidate(ignoreIfDoing) { // adds the time to perform the refresh into this delay // holding off new updates in case of heavy refresh routines. diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt index 2b80040b3..8cb4ba12e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt @@ -21,23 +21,16 @@ package com.vitorpamplona.amethyst.ui.screen import android.util.Log -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.pullrefresh.PullRefreshIndicator -import androidx.compose.material3.pullrefresh.pullRefresh -import androidx.compose.material3.pullrefresh.rememberPullRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewModelScope @@ -57,7 +50,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @Stable -class RelayFeedViewModel : ViewModel() { +class RelayFeedViewModel : ViewModel(), InvalidatableViewModel { val order = compareByDescending { it.lastEvent } .thenByDescending { it.counter } @@ -112,8 +105,8 @@ class RelayFeedViewModel : ViewModel() { private val bundler = BundledUpdate(250, Dispatchers.IO) - fun invalidateData() { - bundler.invalidate { + override fun invalidateData(ignoreIfDoing: Boolean) { + bundler.invalidate(ignoreIfDoing) { // adds the time to perform the refresh into this delay // holding off new updates in case of heavy refresh routines. refreshSuspended() @@ -142,22 +135,7 @@ fun RelayFeedView( NewRelayListView({ wantsToAddRelay = "" }, accountViewModel, wantsToAddRelay, nav = nav) } - var refreshing by remember { mutableStateOf(false) } - val refresh = { - refreshing = true - viewModel.refresh() - refreshing = false - } - val pullRefreshState = rememberPullRefreshState(refreshing, onRefresh = refresh) - - val modifier = - if (enablePullRefresh) { - Modifier.fillMaxSize().pullRefresh(pullRefreshState) - } else { - Modifier.fillMaxSize() - } - - Box(modifier) { + RefresheableBox(viewModel, enablePullRefresh) { val listState = rememberLazyListState() LazyColumn( @@ -176,9 +154,5 @@ fun RelayFeedView( ) } } - - if (enablePullRefresh) { - PullRefreshIndicator(refreshing, pullRefreshState, Modifier.align(Alignment.TopCenter)) - } } }