From 92133947317244ec588f5ed22089b8a74e6e5d79 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 20 Feb 2023 18:09:57 -0500 Subject: [PATCH] Rendering Quoted Noted --- .../ui/components/ExpandableRichTextViewer.kt | 4 ++- .../amethyst/ui/components/RichTextViewer.kt | 26 ++++++++++++++++--- .../components/TranslateableRichTextViewer.kt | 1 + .../amethyst/ui/note/BoostSetCompose.kt | 9 ++++++- .../amethyst/ui/note/LikeSetCompose.kt | 9 ++++++- .../amethyst/ui/note/NoteCompose.kt | 23 +++++++++------- .../amethyst/ui/note/ZapSetCompose.kt | 9 ++++++- .../amethyst/ui/screen/CardFeedView.kt | 4 +-- .../amethyst/ui/screen/FeedView.kt | 8 +----- .../amethyst/ui/screen/ThreadFeedView.kt | 2 +- 10 files changed, 67 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt index 2b2350f1d..a4631a93c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.navigation.NavController +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @Composable fun ExpandableRichTextViewer( @@ -30,6 +31,7 @@ fun ExpandableRichTextViewer( canPreview: Boolean, modifier: Modifier = Modifier, tags: List>?, + accountViewModel: AccountViewModel, navController: NavController ) { var showFullText by remember { mutableStateOf(false) } @@ -37,7 +39,7 @@ fun ExpandableRichTextViewer( val text = if (showFullText) content else content.take(350) Box(contentAlignment = Alignment.BottomCenter) { - RichTextViewer(text, canPreview, modifier, tags, navController) + RichTextViewer(text, canPreview, modifier, tags, accountViewModel, navController) if (content.length > 350 && !showFullText) { Row( diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index b3b85e1db..7ad55a818 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -2,11 +2,16 @@ package com.vitorpamplona.amethyst.ui.components import android.util.Patterns import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.text.style.TextDirection +import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.lnurl.LnInvoiceUtil @@ -14,7 +19,9 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.toByteArray import com.vitorpamplona.amethyst.model.toNote import com.vitorpamplona.amethyst.service.Nip19 +import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.note.toShortenHex +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import nostr.postr.toNpub import java.net.MalformedURLException import java.net.URISyntaxException @@ -47,6 +54,7 @@ fun RichTextViewer( canPreview: Boolean, modifier: Modifier = Modifier, tags: List>?, + accountViewModel: AccountViewModel, navController: NavController, ) { Column(modifier = modifier.animateContentSize()) { @@ -77,7 +85,7 @@ fun RichTextViewer( } else if (noProtocolUrlValidator.matcher(word).matches()) { UrlPreview("https://$word", word) } else if (tagIndex.matcher(word).matches() && tags != null) { - TagLink(word, tags, navController) + TagLink(word, tags, accountViewModel, navController) } else if (isBechLink(word)) { BechLink(word, navController) } else { @@ -96,7 +104,7 @@ fun RichTextViewer( } else if (noProtocolUrlValidator.matcher(word).matches()) { ClickableUrl(word, "https://$word") } else if (tagIndex.matcher(word).matches() && tags != null) { - TagLink(word, tags, navController) + TagLink(word, tags, accountViewModel, navController) } else if (isBechLink(word)) { BechLink(word, navController) } else { @@ -150,7 +158,7 @@ fun BechLink(word: String, navController: NavController) { @Composable -fun TagLink(word: String, tags: List>, navController: NavController) { +fun TagLink(word: String, tags: List>, accountViewModel: AccountViewModel, navController: NavController) { val matcher = tagIndex.matcher(word) val index = try { @@ -176,7 +184,17 @@ fun TagLink(word: String, tags: List>, navController: NavController } else if (tags[index][0] == "e") { val note = LocalCache.notes[tags[index][1]] if (note != null) { - ClickableNoteTag(note, navController) + //ClickableNoteTag(note, navController) + NoteCompose( + baseNote = note, + accountViewModel = accountViewModel, + modifier = Modifier.padding(0.dp) + .fillMaxWidth() + .clip(shape = RoundedCornerShape(15.dp)) + .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp)) + .background(MaterialTheme.colors.onSurface.copy(alpha = 0.05f)), + isQuotedNote = true, + navController = navController) } else { Text(text = "${tags[index][1].toByteArray().toNote().toShortenHex()} ") } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt index 152d062cd..20cc8a1c1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt @@ -73,6 +73,7 @@ fun TranslateableRichTextViewer( canPreview, modifier, tags, + accountViewModel, navController ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt index 65a852e87..ad92fec16 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt @@ -110,7 +110,14 @@ fun BoostSetCompose(boostSetCard: BoostSetCard, isInnerNote: Boolean = false, ro } } - NoteCompose(note, null, Modifier.padding(top = 5.dp), true, accountViewModel, navController) + NoteCompose( + baseNote = note, + routeForLastRead = null, + modifier = Modifier.padding(top = 5.dp), + isBoostedNote = true, + accountViewModel = accountViewModel, + navController = navController + ) NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt index 4c2e45063..9bb4a761e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt @@ -110,7 +110,14 @@ fun LikeSetCompose(likeSetCard: LikeSetCard, modifier: Modifier = Modifier, isIn } } - NoteCompose(note, null, Modifier.padding(top = 5.dp), true, accountViewModel, navController) + NoteCompose( + baseNote = note, + routeForLastRead = null, + modifier = Modifier.padding(top = 5.dp), + isBoostedNote = true, + accountViewModel = accountViewModel, + navController = navController + ) NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) } 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 f7599718c..bb6c989f0 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 @@ -56,7 +56,6 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.RoboHashCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.amethyst.model.toNote import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.service.model.ReactionEvent import com.vitorpamplona.amethyst.service.model.ReportEvent @@ -74,7 +73,8 @@ fun NoteCompose( baseNote: Note, routeForLastRead: String? = null, modifier: Modifier = Modifier, - isInnerNote: Boolean = false, + isBoostedNote: Boolean = false, + isQuotedNote: Boolean = false, accountViewModel: AccountViewModel, navController: NavController ) { @@ -100,13 +100,13 @@ fun NoteCompose( BlankNote(modifier.combinedClickable( onClick = { }, onLongClick = { popupExpanded = true }, - ), isInnerNote) + ), isBoostedNote) } else if (!account.isAcceptable(noteForReports) && !showHiddenNote) { HiddenNote( account.getRelevantReports(noteForReports), account.userProfile(), modifier, - isInnerNote, + isBoostedNote, navController, onClick = { showHiddenNote = true } ) @@ -150,12 +150,12 @@ fun NoteCompose( Row( modifier = Modifier .padding( - start = if (!isInnerNote) 12.dp else 0.dp, - end = if (!isInnerNote) 12.dp else 0.dp, + start = if (!isBoostedNote) 12.dp else 0.dp, + end = if (!isBoostedNote) 12.dp else 0.dp, top = 10.dp) ) { - if (!isInnerNote) { + if (!isBoostedNote && !isQuotedNote) { Column(Modifier.width(55.dp)) { // Draws the boosted picture outside the boosted card. Box(modifier = Modifier @@ -222,8 +222,13 @@ fun NoteCompose( } } - Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) { + Column( + modifier = Modifier.padding(start = if (!isBoostedNote && !isQuotedNote) 10.dp else 0.dp) + ) { Row(verticalAlignment = Alignment.CenterVertically) { + if (isQuotedNote) { + NoteAuthorPicture(note, navController, account.userProfile(), 25.dp) + } NoteUsernameDisplay(note, Modifier.weight(1f)) if (noteEvent !is RepostEvent) { @@ -268,7 +273,7 @@ fun NoteCompose( NoteCompose( it, modifier = Modifier, - isInnerNote = true, + isBoostedNote = true, accountViewModel = accountViewModel, navController = navController ) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt index 7109ff4a3..1d7c16392 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt @@ -110,7 +110,14 @@ fun ZapSetCompose(zapSetCard: ZapSetCard, modifier: Modifier = Modifier, isInner } } - NoteCompose(note, null, Modifier.padding(top = 5.dp), true, accountViewModel, navController) + NoteCompose( + baseNote = note, + routeForLastRead = null, + modifier = Modifier.padding(top = 5.dp), + isBoostedNote = true, + accountViewModel = accountViewModel, + navController = navController + ) NoteDropDownMenu(note, popupExpanded, { popupExpanded = false }, accountViewModel) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt index 5aef2e038..d58204861 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt @@ -5,7 +5,6 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable @@ -16,7 +15,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.rememberSwipeRefreshState @@ -96,7 +94,7 @@ private fun FeedLoaded( when (item) { is NoteCard -> NoteCompose( item.note, - isInnerNote = false, + isBoostedNote = false, accountViewModel = accountViewModel, navController = navController, routeForLastRead = routeForLastRead diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt index 2df2d4f70..06a8dbcbd 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.Button @@ -23,15 +22,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.rememberSwipeRefreshState -import com.vitorpamplona.amethyst.NotificationCache -import com.vitorpamplona.amethyst.model.Note -import com.vitorpamplona.amethyst.ui.navigation.Route import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -110,7 +104,7 @@ private fun FeedLoaded( itemsIndexed(state.feed.value, key = { _, item -> item.idHex }) { index, item -> NoteCompose( item, - isInnerNote = false, + isBoostedNote = false, routeForLastRead = routeForLastRead, accountViewModel = accountViewModel, navController = navController diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt index a5ccdfb04..a8e982cc3 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt @@ -105,7 +105,7 @@ fun ThreadFeedView(noteId: String, viewModel: FeedViewModel, accountViewModel: A NoteCompose( item, modifier = Modifier.drawReplyLevel(item.replyLevel(), MaterialTheme.colors.onSurface.copy(alpha = 0.32f)), - isInnerNote = false, + isBoostedNote = false, accountViewModel = accountViewModel, navController = navController, )