diff --git a/app/src/main/java/chat/revolt/api/unreads/Unreads.kt b/app/src/main/java/chat/revolt/api/unreads/Unreads.kt index 36584444..4b80db6a 100644 --- a/app/src/main/java/chat/revolt/api/unreads/Unreads.kt +++ b/app/src/main/java/chat/revolt/api/unreads/Unreads.kt @@ -50,11 +50,7 @@ class Unreads { suspend fun markAsRead(channelId: String, messageId: String, sync: Boolean = true) { if (!hasLoaded.value) return channels[channelId]?.let { - if (it.last_id == messageId) { - channels.remove(channelId) - } else { - channels[channelId] = it.copy(last_id = messageId) - } + channels[channelId] = it.copy(last_id = messageId) } if (sync) { ackChannel(channelId, messageId) @@ -63,11 +59,7 @@ class Unreads { fun processExternalAck(channelId: String, messageId: String) { channels[channelId]?.let { - if (it.last_id == messageId) { - channels.remove(channelId) - } else { - channels[channelId] = it.copy(last_id = messageId) - } + channels[channelId] = it.copy(last_id = messageId) } } diff --git a/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt b/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt index f0d74a08..a8cf105d 100644 --- a/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt +++ b/app/src/main/java/chat/revolt/components/chat/InReplyTo.kt @@ -2,12 +2,13 @@ package chat.revolt.components.chat import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow @@ -16,6 +17,7 @@ import androidx.compose.ui.unit.sp import chat.revolt.R import chat.revolt.api.RevoltAPI import chat.revolt.api.asJanuaryProxyUrl +import chat.revolt.api.internals.WebCompat import chat.revolt.components.generic.UserAvatar @Composable @@ -30,67 +32,77 @@ fun InReplyTo( val username = message?.masquerade?.name ?: author?.username ?: "" - Row( + val contentColor = LocalContentColor.current + val usernameColor = message?.masquerade?.colour?.let { + WebCompat.parseColour(it) + } ?: contentColor + + Box( modifier = modifier .fillMaxWidth() - .padding(4.dp) - .clickable { onMessageClick(messageId) }, - verticalAlignment = Alignment.CenterVertically, + .clickable { onMessageClick(messageId) } ) { - Spacer(modifier = Modifier.width(48.dp)) + Row( + modifier = Modifier.padding(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Spacer(modifier = Modifier.width(40.dp)) - if (message != null) { - UserAvatar( - username = username, - userId = author?.id ?: "", - avatar = author?.avatar, - rawUrl = message.masquerade?.avatar?.let { asJanuaryProxyUrl(it) }, - size = 16.dp - ) + if (message != null) { + UserAvatar( + username = username, + userId = author?.id ?: "", + avatar = author?.avatar, + rawUrl = message.masquerade?.avatar?.let { asJanuaryProxyUrl(it) }, + size = 16.dp + ) - Text( - text = if (author != null) { - if (withMention) { - "@$username" + Text( + text = if (author != null) { + if (withMention) { + "@$username" + } else { + username + } } else { - username + stringResource(id = R.string.unknown) + }, + fontWeight = FontWeight.Bold, + fontSize = 12.sp, + color = usernameColor, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.padding(horizontal = 4.dp) + ) + + InlineBadges( + bot = message.masquerade == null && author?.bot != null, + masquerade = message.masquerade != null && author?.bot != null, + colour = contentColor.copy(alpha = 0.5f), + modifier = Modifier.size(8.dp), + followingIfAny = { + Spacer(modifier = Modifier.width(4.dp)) } - } else { - stringResource(id = R.string.unknown) - }, - fontWeight = FontWeight.Bold, - fontSize = 12.sp, - color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.9f), - maxLines = 1, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.padding(horizontal = 4.dp) - ) + ) - InlineBadges( - bot = message.masquerade == null && author?.bot != null, - masquerade = message.masquerade != null && author?.bot != null, - colour = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.5f), - modifier = Modifier.size(8.dp), - followingIfAny = { - Spacer(modifier = Modifier.width(4.dp)) - } - ) - - Text( - text = message.content ?: "", - fontSize = 12.sp, - color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.7f), - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } else { - Text( - text = stringResource(id = R.string.reply_message_not_cached), - fontStyle = FontStyle.Italic, - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) + Text( + text = message.content ?: "", + fontSize = 12.sp, + color = contentColor.copy(alpha = 0.7f), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } else { + Text( + text = stringResource(id = R.string.reply_message_not_cached), + fontStyle = FontStyle.Italic, // inter doesn't have italics... + color = contentColor.copy(alpha = 0.7f), + fontFamily = FontFamily.Default, // ...so we use the defaul t font + fontSize = 12.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } } } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/components/chat/Message.kt b/app/src/main/java/chat/revolt/components/chat/Message.kt index 049fe8d7..f03ddd67 100644 --- a/app/src/main/java/chat/revolt/components/chat/Message.kt +++ b/app/src/main/java/chat/revolt/components/chat/Message.kt @@ -1,6 +1,7 @@ package chat.revolt.components.chat import android.net.Uri +import android.widget.Toast import androidx.browser.customtabs.CustomTabsIntent import androidx.compose.foundation.* import androidx.compose.foundation.layout.* @@ -24,7 +25,7 @@ import chat.revolt.api.schemas.AutumnResource import chat.revolt.components.generic.RemoteImage import chat.revolt.components.generic.UserAvatar import chat.revolt.components.generic.UserAvatarWidthPlaceholder -import chat.revolt.markdown.Renderer +import chat.revolt.markdown.Markdown import chat.revolt.api.schemas.Message as MessageSchema fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) { @@ -62,13 +63,17 @@ fun Message( } message.replies?.forEach { reply -> - val replyMessage = RevoltAPI.messageCache[reply] ?: return@forEach + val replyMessage = RevoltAPI.messageCache[reply] InReplyTo( messageId = reply, - withMention = message.mentions?.contains(replyMessage.author) == true + withMention = replyMessage?.author?.let { message.mentions?.contains(replyMessage.author) } + ?: false, ) { // TODO Add jump to message + if (replyMessage == null) { + Toast.makeText(context, "lmao prankd", Toast.LENGTH_SHORT).show() + } } } @@ -131,7 +136,7 @@ fun Message( message.content?.let { Text( - text = Renderer.annotateMarkdown(it), + text = Markdown.annotate(it), maxLines = if (truncate) 1 else Int.MAX_VALUE, overflow = TextOverflow.Ellipsis ) diff --git a/app/src/main/java/chat/revolt/internals/markdown/MarkdownContext.kt b/app/src/main/java/chat/revolt/internals/markdown/MarkdownContext.kt new file mode 100644 index 00000000..16e2a0a1 --- /dev/null +++ b/app/src/main/java/chat/revolt/internals/markdown/MarkdownContext.kt @@ -0,0 +1,11 @@ +package chat.revolt.internals.markdown + +import androidx.compose.runtime.snapshots.SnapshotStateMap +import chat.revolt.api.schemas.User + +data class MarkdownContext( + val memberMap: SnapshotStateMap, + val userMap: SnapshotStateMap, + val channelMap: SnapshotStateMap, + val serverId: String, +) \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt b/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt index 0a774cc5..497f7ec2 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt +++ b/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt @@ -27,6 +27,7 @@ import chat.revolt.api.routes.user.blockUser import chat.revolt.api.schemas.ContentReportReason import chat.revolt.components.chat.Message import chat.revolt.components.generic.FormTextField +import chat.revolt.markdown.Markdown import kotlinx.coroutines.launch enum class ReportingState { @@ -48,6 +49,9 @@ fun ReportMessageDialog( return } + val author = RevoltAPI.userCache[message.author] + val messageIsBridged = author?.let { author.bot != null && message.masquerade != null } ?: false + val state = remember { mutableStateOf(ReportingState.Reason) } val selectedReason = remember { mutableStateOf("Illegal") } @@ -104,6 +108,14 @@ fun ReportMessageDialog( ) } + if (messageIsBridged) { + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = Markdown.annotate(stringResource(id = R.string.report_message_bridge_notice)), + fontSize = 12.sp + ) + } + Spacer(modifier = Modifier.height(16.dp)) Box { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 693455ac..059450d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,7 @@ Thank you for taking the time to report this message. Please provide a reason for reporting this message. Selected message: + **Note:** This message may have been sent from another platform. It is recommended to also report the message on the platform it was sent from. Thank you for taking the time to report this server. Please provide a reason for reporting this server. Selected server: Thank you for taking the time to report this user. Please provide a reason for reporting this user. diff --git a/markdown/src/main/java/chat/revolt/markdown/Renderer.kt b/markdown/src/main/java/chat/revolt/markdown/Markdown.kt similarity index 80% rename from markdown/src/main/java/chat/revolt/markdown/Renderer.kt rename to markdown/src/main/java/chat/revolt/markdown/Markdown.kt index 362d8a19..1c559b9a 100644 --- a/markdown/src/main/java/chat/revolt/markdown/Renderer.kt +++ b/markdown/src/main/java/chat/revolt/markdown/Markdown.kt @@ -5,8 +5,8 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight -object Renderer { - fun annotateMarkdown(text: String): AnnotatedString { +object Markdown { + fun annotateInContext(text: String, context: Ctx): AnnotatedString { // TODO this is all placeholder code val boldRegex = Regex("\\*\\*(.*?)\\*\\*") return buildAnnotatedString { @@ -23,4 +23,6 @@ object Renderer { toAnnotatedString() } } + + fun annotate(text: String): AnnotatedString = annotateInContext(text, Unit) } \ No newline at end of file diff --git a/markdown/src/main/java/chat/revolt/markdown/ast/UniSt.kt b/markdown/src/main/java/chat/revolt/markdown/ast/UniSt.kt index 325b6458..cf5439db 100644 --- a/markdown/src/main/java/chat/revolt/markdown/ast/UniSt.kt +++ b/markdown/src/main/java/chat/revolt/markdown/ast/UniSt.kt @@ -58,10 +58,3 @@ open class Node( */ val position: Position = Position() ) - -open class UnistParent( - /** - * List representing the children of a node. - */ - val children: List = emptyList() -) : Node()