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) }) {
if (noteEvent is IForkableEvent && noteEvent.isAFork()) {
ShowForkInformation(noteEvent, remember(noteEvent) { Modifier.weight(1f) }, accountViewModel, nav)
ShowForkInformation(noteEvent, Modifier, accountViewModel, nav)
} else {
ObserveDisplayNip05Status(noteAuthor, accountViewModel, nav)
}
@@ -21,32 +21,24 @@
package com.vitorpamplona.amethyst.ui.note.elements
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.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
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.model.Note
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.observeUserInfo
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
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.routes.routeFor
import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.stringRes
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
@Composable
@@ -86,30 +78,14 @@ fun ForkInformationRowLightColor(
val route = remember(note) { routeFor(note, accountViewModel.account) }
if (route != null) {
Row(modifier) {
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,
)
Row(modifier, verticalAlignment = Alignment.CenterVertically) {
val userState by observeUser(author, accountViewModel)
userState?.user?.toBestDisplayName()?.let {
CreateClickableTextWithEmoji(
clickablePart = it,
clickablePart = stringRes(id = R.string.forked_from) + " " + it,
maxLines = 1,
route = route,
overrideColor = MaterialTheme.colorScheme.nip05,
overrideColor = MaterialTheme.colorScheme.primary,
fontSize = Font14SP,
nav = nav,
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.DisplayPoW
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.Reward
import com.vitorpamplona.amethyst.ui.note.elements.ShowForkInformation
import com.vitorpamplona.amethyst.ui.note.elements.TimeAgo
import com.vitorpamplona.amethyst.ui.note.observeEdits
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.bounties.bountyBaseReward
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.medical.FhirResourceEvent
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.zapPolls.PollNoteEvent
import com.vitorpamplona.quartz.nip01Core.core.Event
@@ -509,11 +508,15 @@ private fun FullBleedNoteCompose(
Column(
remember { Modifier.weight(1f) },
) {
ObserveDisplayNip05Status(
baseNote,
accountViewModel,
nav,
)
if (noteEvent is IForkableEvent && noteEvent.isAFork()) {
ShowForkInformation(noteEvent, Modifier, accountViewModel, nav)
} else {
ObserveDisplayNip05Status(
baseNote,
accountViewModel,
nav,
)
}
}
val geo = remember { noteEvent.geoHashOrScope() }
@@ -546,7 +549,6 @@ private fun FullBleedNoteCompose(
is BadgeDefinitionEvent -> BadgeDisplay(baseNote = baseNote, accountViewModel)
is LongTextNoteEvent -> RenderLongFormHeaderForThread(noteEvent, baseNote, accountViewModel)
is WikiNoteEvent -> RenderWikiHeaderForThread(noteEvent, accountViewModel, nav)
is NipTextEvent -> RenderNipHeaderForThread(noteEvent, accountViewModel, nav)
is ClassifiedsEvent -> RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav)
}
@@ -1110,8 +1112,6 @@ private fun RenderWikiHeaderForThread(
accountViewModel: AccountViewModel,
nav: INav,
) {
val forkedAddress = remember(noteEvent) { noteEvent.forkFromAddress() }
Row(modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 12.dp)) {
Column {
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
.summary()
?.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)
}
}
}
}
}
}