From 0e3b007730ccb2fabe95daf523b5b47966d92ffe Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 18 Jan 2023 18:59:18 -0500 Subject: [PATCH] Fixing Public chat's event order. --- .../service/NostrChannelDataSource.kt | 20 ++++++++++++------- .../amethyst/service/NostrDataSource.kt | 1 - .../ui/screen/AccountStateViewModel.kt | 1 - .../amethyst/ui/screen/FeedViewModel.kt | 19 +++++++++++++++++- .../ui/screen/loggedIn/ChannelScreen.kt | 2 +- .../ui/screen/loggedIn/ChatroomListScreen.kt | 2 +- .../ui/screen/loggedIn/ChatroomScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/HomeScreen.kt | 2 +- .../ui/screen/loggedIn/NotificationScreen.kt | 3 +-- .../ui/screen/loggedIn/ProfileScreen.kt | 2 +- .../ui/screen/loggedIn/SearchScreen.kt | 2 +- .../ui/screen/loggedIn/ThreadScreen.kt | 2 +- 12 files changed, 39 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt index 4d9a671a7..b56208209 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrChannelDataSource.kt @@ -10,22 +10,28 @@ object NostrChannelDataSource: NostrDataSource("ChatroomFeed") { fun loadMessagesBetween(channelId: String) { channel = LocalCache.channels[channelId] + resetFilters() } - fun createMessagesToChannelFilter() = JsonFilter( - kinds = listOf(ChannelMessageEvent.kind), - tags = mapOf("e" to listOf(channel?.idHex).filterNotNull()), - limit = 100 - ) + fun createMessagesToChannelFilter(): JsonFilter? { + if (channel != null) { + return JsonFilter( + kinds = listOf(ChannelMessageEvent.kind), + tags = mapOf("e" to listOfNotNull(channel?.idHex)), + since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 1), // 24 hours + ) + } + return null + } val messagesChannel = requestNewChannel() // returns the last Note of each user. override fun feed(): List { - return channel?.notes?.values?.sortedBy { it.event!!.createdAt } ?: emptyList() + return channel?.notes?.values?.sortedBy { it.event?.createdAt } ?: emptyList() } override fun updateChannelFilters() { - messagesChannel.filter = listOf(createMessagesToChannelFilter()).ifEmpty { null } + messagesChannel.filter = listOfNotNull(createMessagesToChannelFilter()).ifEmpty { null } } } \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt index 3ae4f5a2e..ffae71cab 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt @@ -114,7 +114,6 @@ abstract class NostrDataSource(val debugName: String) { } } - @OptIn(ExperimentalTime::class) fun loadTop(): List { val returningList = feed().take(100) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt index 63c5b334b..7223d2654 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt @@ -71,7 +71,6 @@ class AccountStateViewModel(private val encryptedPreferences: EncryptedSharedPre NostrNotificationDataSource.account = account NostrChatroomListDataSource.account = account - NostrChannelDataSource.start() NostrAccountDataSource.start() NostrGlobalDataSource.start() NostrHomeDataSource.start() 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 19e12f09f..b069bd112 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 @@ -7,7 +7,16 @@ import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.LocalCacheState import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.service.NostrChannelDataSource +import com.vitorpamplona.amethyst.service.NostrChatRoomDataSource +import com.vitorpamplona.amethyst.service.NostrChatroomListDataSource import com.vitorpamplona.amethyst.service.NostrDataSource +import com.vitorpamplona.amethyst.service.NostrGlobalDataSource +import com.vitorpamplona.amethyst.service.NostrHomeDataSource +import com.vitorpamplona.amethyst.service.NostrThreadDataSource +import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource +import com.vitorpamplona.amethyst.service.NostrUserProfileFollowersDataSource +import com.vitorpamplona.amethyst.service.NostrUserProfileFollowsDataSource import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue import kotlinx.coroutines.CoroutineScope @@ -19,8 +28,16 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +class NostrChannelFeedViewModel: FeedViewModel(NostrChannelDataSource) +class NostrChatroomListFeedViewModel: FeedViewModel(NostrChatroomListDataSource) +class NostrChatRoomFeedViewModel: FeedViewModel(NostrChatRoomDataSource) +class NostrHomeFeedViewModel: FeedViewModel(NostrHomeDataSource) +class NostrGlobalFeedViewModel: FeedViewModel(NostrGlobalDataSource) +class NostrThreadFeedViewModel: FeedViewModel(NostrThreadDataSource) +class NostrUserProfileFeedViewModel: FeedViewModel(NostrUserProfileDataSource) -class FeedViewModel(val dataSource: NostrDataSource): ViewModel() { + +abstract class FeedViewModel(val dataSource: NostrDataSource): ViewModel() { private val _feedContent = MutableStateFlow(FeedState.Loading) val feedContent = _feedContent.asStateFlow() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt index 359687c19..b5ee89abd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt @@ -50,7 +50,7 @@ fun ChannelScreen(channelId: String?, accountViewModel: AccountViewModel, navCon val channelState by NostrChannelDataSource.channel!!.live.observeAsState() val channel = channelState?.channel ?: return - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrChannelDataSource ) } + val feedViewModel: NostrChannelFeedViewModel = viewModel() LaunchedEffect(Unit) { feedViewModel.refresh() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt index eb138951f..935493aa7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt @@ -19,7 +19,7 @@ fun ChatroomListScreen(accountViewModel: AccountViewModel, navController: NavCon val account by accountViewModel.accountLiveData.observeAsState() if (account != null) { - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrChatroomListDataSource ) } + val feedViewModel: NostrChatroomListFeedViewModel = viewModel() LaunchedEffect(Unit) { feedViewModel.refresh() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt index 369e6f475..b881c37b1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt @@ -46,7 +46,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr NostrChatRoomDataSource.loadMessagesBetween(account, userId) - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrChatRoomDataSource ) } + val feedViewModel: NostrChatRoomFeedViewModel = viewModel() LaunchedEffect(Unit) { feedViewModel.refresh() 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 20cc29cf1..b2903988c 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 @@ -25,7 +25,7 @@ fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController) val accountState by accountViewModel.accountLiveData.observeAsState() if (accountState != null) { - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrHomeDataSource ) } + val feedViewModel: NostrHomeFeedViewModel = viewModel() LaunchedEffect(Unit) { feedViewModel.refresh() 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 e03cb9300..3d1a325e9 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 @@ -19,8 +19,7 @@ fun NotificationScreen(accountViewModel: AccountViewModel, navController: NavCon val account by accountViewModel.accountLiveData.observeAsState() if (account != null) { - val feedViewModel: CardFeedViewModel = - viewModel { CardFeedViewModel( NostrNotificationDataSource ) } + val feedViewModel: CardFeedViewModel = viewModel { CardFeedViewModel( NostrNotificationDataSource ) } LaunchedEffect(Unit) { feedViewModel.refresh() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 3715c0d44..65bf853af 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -222,7 +222,7 @@ fun ProfileScreen(userId: String?, accountViewModel: AccountViewModel, navContro fun TabNotes(user: User, accountViewModel: AccountViewModel, navController: NavController) { val accountState by accountViewModel.accountLiveData.observeAsState() if (accountState != null) { - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrUserProfileDataSource ) } + val feedViewModel: NostrUserProfileFeedViewModel = viewModel() Column(Modifier.fillMaxHeight()) { Column( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt index 614137b48..1d4cd7e15 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt @@ -56,7 +56,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @Composable fun SearchScreen(accountViewModel: AccountViewModel, navController: NavController) { - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrGlobalDataSource ) } + val feedViewModel: NostrGlobalFeedViewModel = viewModel() LaunchedEffect(Unit) { feedViewModel.refresh() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt index 0682c7eb0..96a095e97 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ThreadScreen.kt @@ -27,7 +27,7 @@ fun ThreadScreen(noteId: String?, accountViewModel: AccountViewModel, navControl if (account != null && noteId != null) { NostrThreadDataSource.loadThread(noteId) - val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrThreadDataSource ) } + val feedViewModel: NostrThreadFeedViewModel = viewModel() Column(Modifier.fillMaxHeight()) { Column(