Renders the fork information at the second line for the Master Note as well.
This commit is contained in:
Vitor Pamplona
2026-01-10 12:02:26 -05:00
parent 045f2aced9
commit cf0f71d04f
3 changed files with 16 additions and 101 deletions
@@ -1088,7 +1088,7 @@ fun SecondUserInfoRow(
) { ) {
Column(modifier = remember(noteEvent) { Modifier.weight(1f) }) { Column(modifier = remember(noteEvent) { Modifier.weight(1f) }) {
if (noteEvent is IForkableEvent && noteEvent.isAFork()) { if (noteEvent is IForkableEvent && noteEvent.isAFork()) {
ShowForkInformation(noteEvent, remember(noteEvent) { Modifier.weight(1f) }, accountViewModel, nav) ShowForkInformation(noteEvent, Modifier, accountViewModel, nav)
} else { } else {
ObserveDisplayNip05Status(noteAuthor, accountViewModel, nav) ObserveDisplayNip05Status(noteAuthor, accountViewModel, nav)
} }
@@ -21,32 +21,24 @@
package com.vitorpamplona.amethyst.ui.note.elements package com.vitorpamplona.amethyst.ui.note.elements
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextOverflow
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNote import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNote
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.observeUser import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.observeUser
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.observeUserInfo
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.LoadNote import com.vitorpamplona.amethyst.ui.components.LoadNote
import com.vitorpamplona.amethyst.ui.components.appendLink
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor
import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.stringRes
import com.vitorpamplona.amethyst.ui.theme.Font14SP import com.vitorpamplona.amethyst.ui.theme.Font14SP
import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer
import com.vitorpamplona.amethyst.ui.theme.nip05
import com.vitorpamplona.quartz.experimental.forks.IForkableEvent import com.vitorpamplona.quartz.experimental.forks.IForkableEvent
@Composable @Composable
@@ -86,30 +78,14 @@ fun ForkInformationRowLightColor(
val route = remember(note) { routeFor(note, accountViewModel.account) } val route = remember(note) { routeFor(note, accountViewModel.account) }
if (route != null) { if (route != null) {
Row(modifier) { Row(modifier, verticalAlignment = Alignment.CenterVertically) {
Text(
text =
buildAnnotatedString {
appendLink(stringRes(id = R.string.forked_from) + " ") {
nav.nav(route)
}
},
style =
LocalTextStyle.current.copy(
color = MaterialTheme.colorScheme.nip05,
fontSize = Font14SP,
),
maxLines = 1,
overflow = TextOverflow.Visible,
)
val userState by observeUser(author, accountViewModel) val userState by observeUser(author, accountViewModel)
userState?.user?.toBestDisplayName()?.let { userState?.user?.toBestDisplayName()?.let {
CreateClickableTextWithEmoji( CreateClickableTextWithEmoji(
clickablePart = it, clickablePart = stringRes(id = R.string.forked_from) + " " + it,
maxLines = 1, maxLines = 1,
route = route, route = route,
overrideColor = MaterialTheme.colorScheme.nip05, overrideColor = MaterialTheme.colorScheme.primary,
fontSize = Font14SP, fontSize = Font14SP,
nav = nav, nav = nav,
tags = userState?.user?.info?.tags, tags = userState?.user?.info?.tags,
@@ -118,35 +94,3 @@ fun ForkInformationRowLightColor(
} }
} }
} }
@Composable
fun ForkInformationRow(
originalVersion: Note,
modifier: Modifier = Modifier,
accountViewModel: AccountViewModel,
nav: INav,
) {
val noteState by observeNote(originalVersion, accountViewModel)
val note = noteState.note
val route = remember(note) { routeFor(note, accountViewModel.account) }
if (route != null) {
Row(modifier) {
val author = note.author ?: return
val meta by observeUserInfo(author, accountViewModel)
Text(stringRes(id = R.string.forked_from))
Spacer(modifier = StdHorzSpacer)
val userMetadata by observeUserInfo(author, accountViewModel)
CreateClickableTextWithEmoji(
clickablePart = remember(meta) { meta?.bestName() ?: author.pubkeyDisplayHex() },
maxLines = 1,
route = route,
nav = nav,
tags = userMetadata?.tags,
)
}
}
}
@@ -113,9 +113,9 @@ import com.vitorpamplona.amethyst.ui.note.elements.DisplayFollowingHashtagsInPos
import com.vitorpamplona.amethyst.ui.note.elements.DisplayLocation import com.vitorpamplona.amethyst.ui.note.elements.DisplayLocation
import com.vitorpamplona.amethyst.ui.note.elements.DisplayPoW import com.vitorpamplona.amethyst.ui.note.elements.DisplayPoW
import com.vitorpamplona.amethyst.ui.note.elements.DisplayReward import com.vitorpamplona.amethyst.ui.note.elements.DisplayReward
import com.vitorpamplona.amethyst.ui.note.elements.ForkInformationRow
import com.vitorpamplona.amethyst.ui.note.elements.MoreOptionsButton import com.vitorpamplona.amethyst.ui.note.elements.MoreOptionsButton
import com.vitorpamplona.amethyst.ui.note.elements.Reward import com.vitorpamplona.amethyst.ui.note.elements.Reward
import com.vitorpamplona.amethyst.ui.note.elements.ShowForkInformation
import com.vitorpamplona.amethyst.ui.note.elements.TimeAgo import com.vitorpamplona.amethyst.ui.note.elements.TimeAgo
import com.vitorpamplona.amethyst.ui.note.observeEdits import com.vitorpamplona.amethyst.ui.note.observeEdits
import com.vitorpamplona.amethyst.ui.note.showAmount import com.vitorpamplona.amethyst.ui.note.showAmount
@@ -187,11 +187,10 @@ import com.vitorpamplona.quartz.experimental.audio.header.AudioHeaderEvent
import com.vitorpamplona.quartz.experimental.audio.track.AudioTrackEvent import com.vitorpamplona.quartz.experimental.audio.track.AudioTrackEvent
import com.vitorpamplona.quartz.experimental.bounties.bountyBaseReward import com.vitorpamplona.quartz.experimental.bounties.bountyBaseReward
import com.vitorpamplona.quartz.experimental.edits.TextNoteModificationEvent import com.vitorpamplona.quartz.experimental.edits.TextNoteModificationEvent
import com.vitorpamplona.quartz.experimental.forks.forkFromAddress import com.vitorpamplona.quartz.experimental.forks.IForkableEvent
import com.vitorpamplona.quartz.experimental.interactiveStories.InteractiveStoryBaseEvent import com.vitorpamplona.quartz.experimental.interactiveStories.InteractiveStoryBaseEvent
import com.vitorpamplona.quartz.experimental.medical.FhirResourceEvent import com.vitorpamplona.quartz.experimental.medical.FhirResourceEvent
import com.vitorpamplona.quartz.experimental.nip95.header.FileStorageHeaderEvent import com.vitorpamplona.quartz.experimental.nip95.header.FileStorageHeaderEvent
import com.vitorpamplona.quartz.experimental.nipsOnNostr.NipTextEvent
import com.vitorpamplona.quartz.experimental.publicMessages.PublicMessageEvent import com.vitorpamplona.quartz.experimental.publicMessages.PublicMessageEvent
import com.vitorpamplona.quartz.experimental.zapPolls.PollNoteEvent import com.vitorpamplona.quartz.experimental.zapPolls.PollNoteEvent
import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.Event
@@ -509,11 +508,15 @@ private fun FullBleedNoteCompose(
Column( Column(
remember { Modifier.weight(1f) }, remember { Modifier.weight(1f) },
) { ) {
ObserveDisplayNip05Status( if (noteEvent is IForkableEvent && noteEvent.isAFork()) {
baseNote, ShowForkInformation(noteEvent, Modifier, accountViewModel, nav)
accountViewModel, } else {
nav, ObserveDisplayNip05Status(
) baseNote,
accountViewModel,
nav,
)
}
} }
val geo = remember { noteEvent.geoHashOrScope() } val geo = remember { noteEvent.geoHashOrScope() }
@@ -546,7 +549,6 @@ private fun FullBleedNoteCompose(
is BadgeDefinitionEvent -> BadgeDisplay(baseNote = baseNote, accountViewModel) is BadgeDefinitionEvent -> BadgeDisplay(baseNote = baseNote, accountViewModel)
is LongTextNoteEvent -> RenderLongFormHeaderForThread(noteEvent, baseNote, accountViewModel) is LongTextNoteEvent -> RenderLongFormHeaderForThread(noteEvent, baseNote, accountViewModel)
is WikiNoteEvent -> RenderWikiHeaderForThread(noteEvent, accountViewModel, nav) is WikiNoteEvent -> RenderWikiHeaderForThread(noteEvent, accountViewModel, nav)
is NipTextEvent -> RenderNipHeaderForThread(noteEvent, accountViewModel, nav)
is ClassifiedsEvent -> RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav) is ClassifiedsEvent -> RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav)
} }
@@ -1110,8 +1112,6 @@ private fun RenderWikiHeaderForThread(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
val forkedAddress = remember(noteEvent) { noteEvent.forkFromAddress() }
Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) { Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) {
Column { Column {
noteEvent.image()?.let { noteEvent.image()?.let {
@@ -1137,14 +1137,6 @@ private fun RenderWikiHeaderForThread(
) )
} }
forkedAddress?.let {
LoadAddressableNote(it, accountViewModel) { originalVersion ->
if (originalVersion != null) {
ForkInformationRow(originalVersion, Modifier.fillMaxWidth(), accountViewModel, nav)
}
}
}
noteEvent noteEvent
.summary() .summary()
?.ifBlank { null } ?.ifBlank { null }
@@ -1159,24 +1151,3 @@ private fun RenderWikiHeaderForThread(
} }
} }
} }
@Composable
private fun RenderNipHeaderForThread(
noteEvent: NipTextEvent,
accountViewModel: AccountViewModel,
nav: INav,
) {
val forkedAddress = remember(noteEvent) { noteEvent.forkFromAddress() }
Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) {
Column {
forkedAddress?.let {
LoadAddressableNote(it, accountViewModel) { originalVersion ->
if (originalVersion != null) {
ForkInformationRow(originalVersion, Modifier.fillMaxWidth(), accountViewModel, nav)
}
}
}
}
}
}