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 2019e3648..803f5cfd8 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 @@ -133,6 +133,7 @@ import com.vitorpamplona.amethyst.ui.theme.Font14SP import com.vitorpamplona.amethyst.ui.theme.HalfDoubleVertSpacer import com.vitorpamplona.amethyst.ui.theme.HalfPadding import com.vitorpamplona.amethyst.ui.theme.HalfStartPadding +import com.vitorpamplona.amethyst.ui.theme.HalfTopPadding import com.vitorpamplona.amethyst.ui.theme.HeaderPictureModifier import com.vitorpamplona.amethyst.ui.theme.QuoteBorder import com.vitorpamplona.amethyst.ui.theme.Size10dp @@ -644,8 +645,13 @@ fun LongCommunityHeader( ) } - val hashtags = remember(noteEvent) { noteEvent.hashtags().toImmutableList() } - DisplayUncitedHashtags(hashtags, summary ?: "", nav) + if (noteEvent.hasHashtags()) { + DisplayUncitedHashtags( + remember(noteEvent) { noteEvent.hashtags().toImmutableList() }, + summary ?: "", + nav + ) + } } Column() { @@ -1405,8 +1411,10 @@ fun RenderTextEvent( ) } - val hashtags = remember(note.event) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() } - DisplayUncitedHashtags(hashtags, eventContent, nav) + if (note.event?.hasHashtags() == true) { + val hashtags = remember(note.event) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() } + DisplayUncitedHashtags(hashtags, eventContent, nav) + } } } } @@ -1456,8 +1464,10 @@ fun RenderPoll( ) } - val hashtags = remember { noteEvent.hashtags().toImmutableList() } - DisplayUncitedHashtags(hashtags, eventContent, nav) + if (noteEvent.hasHashtags()) { + val hashtags = remember { noteEvent.hashtags().toImmutableList() } + DisplayUncitedHashtags(hashtags, eventContent, nav) + } } } @@ -1675,7 +1685,6 @@ private fun RenderPrivateMessage( val withMe = remember { noteEvent.with(accountViewModel.userProfile().pubkeyHex) } if (withMe) { LoadDecryptedContent(note, accountViewModel) { eventContent -> - val hashtags = remember(note.event?.id()) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() } val modifier = remember(note.event?.id()) { Modifier.fillMaxWidth() } val isAuthorTheLoggedUser = remember(note.event?.id()) { accountViewModel.isLoggedUser(note.author) } @@ -1704,7 +1713,10 @@ private fun RenderPrivateMessage( ) } - DisplayUncitedHashtags(hashtags, eventContent, nav) + if (noteEvent.hasHashtags()) { + val hashtags = remember(note.event?.id()) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() } + DisplayUncitedHashtags(hashtags, eventContent, nav) + } } } } else { @@ -3184,26 +3196,20 @@ fun DisplayUncitedHashtags( eventContent: String, nav: (String) -> Unit ) { - val hasHashtags = remember(eventContent) { - hashtags.isNotEmpty() + val unusedHashtags = remember(eventContent) { + hashtags.filter { !eventContent.contains(it, true) } } - if (hasHashtags) { - val unusedHashtags = remember(eventContent) { - hashtags.filter { !eventContent.contains(it, true) } - } - + if (unusedHashtags.isNotEmpty()) { FlowRow( - modifier = remember { Modifier.padding(top = 5.dp) } + modifier = HalfTopPadding ) { unusedHashtags.forEach { hashtag -> ClickableText( text = remember { AnnotatedString("#$hashtag ") }, onClick = { nav("Hashtag/$hashtag") }, style = LocalTextStyle.current.copy( - color = MaterialTheme.colorScheme.primary.copy( - alpha = 0.52f - ) + color = MaterialTheme.colorScheme.lessImportantLink ) ) } @@ -3658,9 +3664,11 @@ fun AudioHeader(noteEvent: AudioHeaderEvent, note: Note, accountViewModel: Accou } } - Row(Modifier.fillMaxWidth(), verticalAlignment = CenterVertically) { - val hashtags = remember(noteEvent) { noteEvent.hashtags().toImmutableList() } - DisplayUncitedHashtags(hashtags, content ?: "", nav) + if (noteEvent.hasHashtags()) { + Row(Modifier.fillMaxWidth(), verticalAlignment = CenterVertically) { + val hashtags = remember(noteEvent) { noteEvent.hashtags().toImmutableList() } + DisplayUncitedHashtags(hashtags, content ?: "", nav) + } } } } 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 11a6cfa4a..aa824d9d2 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 @@ -788,7 +788,7 @@ fun LongChannelHeader( ) } - if (baseChannel is LiveActivitiesChannel) { + if (baseChannel is LiveActivitiesChannel && baseChannel.info?.hasHashtags() == true) { val hashtags = remember(baseChannel.info) { baseChannel.info?.hashtags()?.toImmutableList() ?: persistentListOf() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt index f5e8f9ba3..c92ab5162 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt @@ -72,6 +72,7 @@ val Size75dp = 75.dp val HalfStartPadding = Modifier.padding(start = 5.dp) val StdStartPadding = Modifier.padding(start = 10.dp) val StdTopPadding = Modifier.padding(top = 10.dp) +val HalfTopPadding = Modifier.padding(top = 5.dp) val HalfPadding = Modifier.padding(5.dp) val StdPadding = Modifier.padding(10.dp) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt index 62494293d..9bc1eb6b1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/Event.kt @@ -124,6 +124,9 @@ open class Event( ATag.parse(aTagValue, relay) } + override fun hasHashtags() = tags.any { it.size > 1 && it[0] == "t" } + override fun hasGeohashes() = tags.any { it.size > 1 && it[0] == "g" } + override fun hashtags() = tags.filter { it.size > 1 && it[0] == "t" }.map { it[1] } override fun geohashes() = tags.filter { it.size > 1 && it[0] == "g" }.map { it[1] } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt index 0d2747f25..e5de40569 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/EventInterface.kt @@ -55,6 +55,9 @@ interface EventInterface { fun expiration(): Long? + fun hasHashtags(): Boolean + fun hasGeohashes(): Boolean + fun hashtags(): List fun geohashes(): List