From e41df98920764888199507378e35518eb1269d7e Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 17 May 2023 17:01:07 -0400 Subject: [PATCH] Bugfix for channel metadata messages show up before channel creation packages --- .../amethyst/model/LocalCache.kt | 29 +++++++++++-------- .../amethyst/ui/note/BlankNote.kt | 4 +-- .../ui/note/ChatroomMessageCompose.kt | 16 ++++++---- .../amethyst/ui/note/NoteCompose.kt | 8 ++--- .../amethyst/ui/note/NoteQuickActionMenu.kt | 7 +++-- .../ui/screen/loggedIn/ChannelScreen.kt | 7 ++++- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 16257be07..eea2d7851 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -553,17 +553,20 @@ object LocalCache { // Log.d("MT", "New Event ${event.content} ${event.id.toHex()}") val oldChannel = getOrCreateChannel(event.id) val author = getOrCreateUser(event.pubKey) + + val note = getOrCreateNote(event.id) + if (note.event == null) { + oldChannel.addNote(note) + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } + if (event.createdAt <= oldChannel.updatedMetadataAt) { return // older data, does nothing } if (oldChannel.creator == null || oldChannel.creator == author) { oldChannel.updateChannelInfo(author, event.channelInfo(), event.createdAt) - - val note = getOrCreateNote(event.id) - oldChannel.addNote(note) - note.loadEvent(event, author, emptyList()) - - refreshObservers(note) } } @@ -578,16 +581,18 @@ object LocalCache { if (event.createdAt > oldChannel.updatedMetadataAt) { if (oldChannel.creator == null || oldChannel.creator == author) { oldChannel.updateChannelInfo(author, event.channelInfo(), event.createdAt) - - val note = getOrCreateNote(event.id) - oldChannel.addNote(note) - note.loadEvent(event, author, emptyList()) - - refreshObservers(note) } } else { // Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}") } + + val note = getOrCreateNote(event.id) + if (note.event == null) { + oldChannel.addNote(note) + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } } fun consume(event: ChannelMessageEvent, relay: Relay?) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt index 98aa24cdb..a333a2b6c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User @Composable -fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false) { +fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false, idHex: String? = null) { Column(modifier = modifier) { Row(modifier = Modifier.padding(horizontal = if (!isQuote) 12.dp else 6.dp)) { Column(modifier = Modifier.padding(start = if (!isQuote) 10.dp else 5.dp)) { @@ -39,7 +39,7 @@ fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false) { horizontalArrangement = Arrangement.Center ) { Text( - text = stringResource(R.string.post_not_found), + text = stringResource(R.string.post_not_found) + if (idHex != null) ": $idHex" else "", modifier = Modifier.padding(30.dp), color = Color.Gray ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index 57ed43b3a..55fe08669 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -90,12 +90,12 @@ fun ChatroomMessageCompose( val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return val noteState by baseNote.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } + val note = remember(noteState) { noteState?.note } ?: return val noteReportsState by baseNote.live().reports.observeAsState() val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return - val noteEvent = note?.event + val noteEvent = remember(noteState) { note.event } var popupExpanded by remember { mutableStateOf(false) } @@ -107,7 +107,7 @@ fun ChatroomMessageCompose( ) ) - note?.let { + note.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } } else if (account.isHidden(noteForReports.author!!)) { @@ -209,7 +209,11 @@ fun ChatroomMessageCompose( shape = shape, modifier = Modifier .combinedClickable( - onClick = { }, + onClick = { + if (noteEvent is ChannelCreateEvent) { + navController.navigate("Channel/${note.idHex}") + } + }, onLongClick = { popupExpanded = true } ) ) { @@ -228,12 +232,14 @@ fun ChatroomMessageCompose( alignment, navController ) + } else { + Spacer(modifier = Modifier.height(5.dp)) } val replyTo = note.replyTo if (!innerQuote && !replyTo.isNullOrEmpty()) { Row(verticalAlignment = Alignment.CenterVertically) { - replyTo.toSet().mapIndexed { _, note -> + replyTo.lastOrNull()?.let { note -> ChatroomMessageCompose( note, null, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 2715282dd..b6c279f1f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -196,13 +196,13 @@ fun NoteComposeInner( val loggedIn = remember(accountState) { accountState?.account?.userProfile() } ?: return val noteState by baseNote.live().metadata.observeAsState() - val note = remember(noteState) { noteState?.note } + val note = remember(noteState) { noteState?.note } ?: return val noteReportsState by baseNote.live().reports.observeAsState() val noteForReports = remember(noteReportsState) { noteReportsState?.note } ?: return - val noteEvent = note?.event - val baseChannel = note?.channel() + val noteEvent = remember(noteState) { note.event } + val baseChannel = remember(noteState) { note.channel() } var popupExpanded by remember { mutableStateOf(false) } @@ -217,7 +217,7 @@ fun NoteComposeInner( isBoostedNote ) - note?.let { + note.let { NoteQuickActionMenu(it, popupExpanded, { popupExpanded = false }, accountViewModel) } } else if (account.isHidden(noteForReports.author!!)) { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt index 02369406b..73c75812c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteQuickActionMenu.kt @@ -217,10 +217,11 @@ fun NoteQuickActionMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Uni VerticalDivider(primaryLight) NoteQuickActionItem( - icon = ImageVector.vectorResource(id = R.drawable.text_select_move_forward_character), - label = stringResource(R.string.quick_action_select) + icon = ImageVector.vectorResource(id = R.drawable.relays), + label = stringResource(R.string.broadcast) ) { - showSelectTextDialog = true + accountViewModel.broadcast(note) + // showSelectTextDialog = true onDismiss() } VerticalDivider(primaryLight) 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 d2cdff261..c6bcc52ab 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 @@ -2,6 +2,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.widget.Toast import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -253,7 +254,11 @@ fun ChannelHeader(baseChannel: Channel, account: Account, navController: NavCont val context = LocalContext.current.applicationContext - Column() { + Column( + Modifier.clickable { + navController.navigate("Channel/${baseChannel.idHex}") + } + ) { Column(modifier = Modifier.padding(12.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { RobohashAsyncImageProxy(