diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
index b2cf50fba..2058b0c57 100644
--- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
+++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
@@ -62,11 +62,13 @@ import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.commons.model.nip28PublicChats.PublicChatChannel
import com.vitorpamplona.amethyst.model.AddressableNote
+import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.observeChannelPicture
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeCommunityApprovalNeedStatus
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNoteEdits
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNoteEvent
+import com.vitorpamplona.amethyst.ui.components.ClickableBox
import com.vitorpamplona.amethyst.ui.components.GenericLoadable
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
import com.vitorpamplona.amethyst.ui.layouts.GenericRepostLayout
@@ -210,6 +212,7 @@ import com.vitorpamplona.quartz.experimental.nipsOnNostr.NipTextEvent
import com.vitorpamplona.quartz.experimental.zapPolls.ZapPollEvent
import com.vitorpamplona.quartz.nip01Core.tags.geohash.geoHashOrScope
import com.vitorpamplona.quartz.nip04Dm.messages.PrivateDmEvent
+import com.vitorpamplona.quartz.nip10Notes.BaseThreadedEvent
import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent
import com.vitorpamplona.quartz.nip13Pow.strongPoWOrNull
import com.vitorpamplona.quartz.nip17Dm.files.ChatMessageEncryptedFileHeaderEvent
@@ -1672,6 +1675,8 @@ fun FirstUserInfoRow(
Expiration(baseNote)
+ JumpToParentReplyButton(baseNote, accountViewModel, nav)
+
TimeAgo(baseNote)
if (moreOptions == null) {
@@ -1692,6 +1697,42 @@ fun PinnedMark() {
)
}
+@Composable
+fun JumpToParentReplyButton(
+ baseNote: Note,
+ accountViewModel: AccountViewModel,
+ nav: INav,
+) {
+ if (!accountViewModel.settings.isCompleteUIMode()) return
+ if (baseNote.event !is BaseThreadedEvent) return
+
+ val parentNote =
+ remember(baseNote) {
+ val noteEvent = baseNote.event as? BaseThreadedEvent ?: return@remember null
+ val direct =
+ noteEvent
+ .replyingToAddressOrEvent()
+ ?.let { accountViewModel.getNoteIfExists(it) }
+ ?.takeIf { it.event !is CommunityDefinitionEvent && LocalCache.getAnyChannel(it) == null }
+ val resolved = direct ?: baseNote.replyTo?.lastOrNull { it.event !is CommunityDefinitionEvent }
+ resolved?.takeIf { LocalCache.getAnyChannel(it) == null }
+ } ?: return
+
+ ClickableBox(
+ modifier = Modifier.padding(start = 5.dp).size(20.dp),
+ onClick = {
+ nav.nav { routeFor(parentNote, accountViewModel.account) }
+ },
+ ) {
+ Icon(
+ symbol = MaterialSymbols.KeyboardArrowUp,
+ contentDescription = stringRes(R.string.jump_to_parent_reply),
+ modifier = Modifier.size(18.dp),
+ tint = MaterialTheme.colorScheme.placeholderText,
+ )
+ }
+}
+
@Composable
fun Expiration(note: Note) {
val event = note.event
diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml
index a30b9e49d..7f51350ed 100644
--- a/amethyst/src/main/res/values/strings.xml
+++ b/amethyst/src/main/res/values/strings.xml
@@ -1724,6 +1724,7 @@
Close all reactions to this post
Reply
+ Jump to the note this reply is replying to
Boost Or Quote
Like
Zap