From ca90866877592b50cee9087a479d037c2f9fcef2 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sat, 3 Jun 2023 17:02:09 -0400 Subject: [PATCH] Keeping the position of the feed in navigation --- .../amethyst/ui/navigation/AppNavigation.kt | 44 ++++++------------- .../amethyst/ui/note/MultiSetCompose.kt | 2 - .../amethyst/ui/screen/CardFeedViewModel.kt | 6 ++- .../amethyst/ui/screen/FeedViewModel.kt | 6 ++- .../amethyst/ui/screen/loggedIn/HomeScreen.kt | 15 +++++-- .../ui/screen/loggedIn/NotificationScreen.kt | 15 ++++--- .../ui/screen/loggedIn/VideoScreen.kt | 10 ++++- 7 files changed, 50 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index 49c122280..8d6895235 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -64,13 +64,9 @@ fun AppNavigation( composable(route.route, route.arguments, content = { val scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false - LaunchedEffect(key1 = it) { - if (scrollToTop) { - launch { - videoFeedViewModel.sendToTop() - it.arguments?.remove("scrollToTop") - } - } + if (scrollToTop) { + videoFeedViewModel.sendToTop() + it.arguments?.remove("scrollToTop") } VideoScreen( @@ -85,13 +81,9 @@ fun AppNavigation( composable(route.route, route.arguments, content = { val scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false - LaunchedEffect(key1 = it) { - if (scrollToTop) { - launch { - searchFeedViewModel.sendToTop() - it.arguments?.remove("scrollToTop") - } - } + if (scrollToTop) { + searchFeedViewModel.sendToTop() + it.arguments?.remove("scrollToTop") } SearchScreen( @@ -107,14 +99,10 @@ fun AppNavigation( val scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false val nip47 = it.arguments?.getString("nip47") - LaunchedEffect(key1 = it) { - if (scrollToTop) { - launch { - homeFeedViewModel.sendToTop() - repliesFeedViewModel.sendToTop() - it.arguments?.remove("scrollToTop") - } - } + if (scrollToTop) { + homeFeedViewModel.sendToTop() + repliesFeedViewModel.sendToTop() + it.arguments?.remove("scrollToTop") } HomeScreen( @@ -140,14 +128,10 @@ fun AppNavigation( composable(route.route, route.arguments, content = { val scrollToTop = it.arguments?.getBoolean("scrollToTop") ?: false - LaunchedEffect(key1 = it) { - if (scrollToTop) { - launch { - notifFeedViewModel.clear() - notifFeedViewModel.sendToTop() - it.arguments?.remove("scrollToTop") - } - } + if (scrollToTop) { + notifFeedViewModel.clear() + notifFeedViewModel.sendToTop() + it.arguments?.remove("scrollToTop") } NotificationScreen( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index 6d7268e2c..23e50672e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -287,8 +287,6 @@ private fun AuthorPictureAndComment( } } - println("AAAA $content") - content.first?.let { val route by remember { derivedStateOf { 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 611300b5e..c2463d51d 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 @@ -54,11 +54,13 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val scrollToTop = _scrollToTop.asStateFlow() var scrolltoTopPending = false - suspend fun sendToTop() { + fun sendToTop() { if (scrolltoTopPending) return scrolltoTopPending = true - _scrollToTop.emit(_scrollToTop.value + 1) + viewModelScope.launch(Dispatchers.IO) { + _scrollToTop.emit(_scrollToTop.value + 1) + } } suspend fun sentToTop() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 269b5c5c9..9422e4c6f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -123,11 +123,13 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : ViewModel() { val scrollToTop = _scrollToTop.asStateFlow() var scrolltoTopPending = false - suspend fun sendToTop() { + fun sendToTop() { if (scrolltoTopPending) return scrolltoTopPending = true - _scrollToTop.emit(_scrollToTop.value + 1) + viewModelScope.launch(Dispatchers.IO) { + _scrollToTop.emit(_scrollToTop.value + 1) + } } suspend fun sentToTop() { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt index e4cece30f..8358920fc 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt @@ -141,11 +141,18 @@ fun WatchAccountForHomeScreen( val account = remember(accountState) { accountState?.account } ?: return val scope = rememberCoroutineScope() + var firstTime by remember(accountViewModel) { mutableStateOf(true) } + LaunchedEffect(accountViewModel, account.defaultHomeFollowList) { - scope.launch(Dispatchers.IO) { - NostrHomeDataSource.invalidateFilters() - homeFeedViewModel.invalidateDataAndSendToTop(true) - repliesFeedViewModel.invalidateDataAndSendToTop(true) + // Only invalidate when things change. Not in the first run + if (firstTime) { + firstTime = false + } else { + scope.launch(Dispatchers.IO) { + NostrHomeDataSource.invalidateFilters() + homeFeedViewModel.invalidateDataAndSendToTop(true) + repliesFeedViewModel.invalidateDataAndSendToTop(true) + } } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt index d673c8b90..344041d37 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt @@ -103,13 +103,16 @@ fun WatchAccountForNotifications( val accountState by accountViewModel.accountLiveData.observeAsState() val account = remember(accountState) { accountState?.account } ?: return - LaunchedEffect(accountViewModel, account.defaultNotificationFollowList) { - NostrAccountDataSource.invalidateFilters() - if (notifFeedViewModel.scrollToTop.value > 0) { - notifFeedViewModel.clear() - } + var firstTime by remember(accountViewModel) { mutableStateOf(true) } - notifFeedViewModel.invalidateDataAndSendToTop(true) + LaunchedEffect(accountViewModel, account.defaultNotificationFollowList) { + if (firstTime) { + firstTime = false + } else { + NostrAccountDataSource.invalidateFilters() + notifFeedViewModel.clear() + notifFeedViewModel.invalidateDataAndSendToTop(true) + } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt index 11305e159..d3d6c1a71 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/VideoScreen.kt @@ -133,9 +133,15 @@ fun WatchAccountForVideoScreen(videoFeedView: NostrVideoFeedViewModel, accountVi val accountState by accountViewModel.accountLiveData.observeAsState() val account = remember(accountState) { accountState?.account } ?: return + var firstTime by remember(accountViewModel) { mutableStateOf(true) } + LaunchedEffect(accountViewModel, account.defaultStoriesFollowList) { - NostrVideoDataSource.resetFilters() - videoFeedView.invalidateDataAndSendToTop(true) + if (firstTime) { + firstTime = false + } else { + NostrVideoDataSource.resetFilters() + videoFeedView.invalidateDataAndSendToTop(true) + } } }