From 00de61573302875a8cfc1ee807346e9c5dfc289c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 1 May 2026 21:20:44 +0000 Subject: [PATCH] feat(nests): add visible kebab menu to room cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Long-press on the cards already opened the standard NoteQuickActionMenu, but the affordance was hidden — especially on the compact ENDED card which has no visible interactive elements. Add an explicit MoreVert (VerticalDotsIcon) tap target that opens the same menu: - ENDED compact card: 40dp icon on the trailing edge of the row. - LIVE/SCHEDULED full card: 35dp icon in the existing SpaceHostAndReactions row, after Like and Zap. Both wire through the showQuickAction lambda from LongPressToQuickAction, so the icon and the long-press gesture trigger the exact same menu (share, copy, broadcast, report, block, delete) — no second popup-state plumbing. ObserveAndRenderSpace, RenderLiveSpacesThumb, and SpaceHostAndReactions gain an optional `onMore: (() -> Unit)?` parameter so other callers (e.g. existing live-stream surfaces that reuse SpaceHostAndReactions) keep their current rendering unchanged when they don't pass one. --- .../screen/loggedIn/nests/NestsFeedLoaded.kt | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsFeedLoaded.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsFeedLoaded.kt index 9cdbb36f1..806c6ff07 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsFeedLoaded.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsFeedLoaded.kt @@ -65,6 +65,7 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNoteAndMap import com.vitorpamplona.amethyst.ui.actions.CrossfadeIfEnabled +import com.vitorpamplona.amethyst.ui.components.ClickableBox import com.vitorpamplona.amethyst.ui.components.SensitivityWarning import com.vitorpamplona.amethyst.ui.layouts.rememberFeedContentPadding import com.vitorpamplona.amethyst.ui.navigation.navs.INav @@ -76,6 +77,7 @@ import com.vitorpamplona.amethyst.ui.note.LikeReaction import com.vitorpamplona.amethyst.ui.note.LongPressToQuickAction import com.vitorpamplona.amethyst.ui.note.UserPicture import com.vitorpamplona.amethyst.ui.note.UsernameDisplay +import com.vitorpamplona.amethyst.ui.note.VerticalDotsIcon import com.vitorpamplona.amethyst.ui.note.ZapReaction import com.vitorpamplona.amethyst.ui.note.timeAgoNoDot import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -97,6 +99,7 @@ import com.vitorpamplona.amethyst.ui.theme.QuoteBorder import com.vitorpamplona.amethyst.ui.theme.RowColSpacing import com.vitorpamplona.amethyst.ui.theme.Size34dp import com.vitorpamplona.amethyst.ui.theme.Size35dp +import com.vitorpamplona.amethyst.ui.theme.Size40dp import com.vitorpamplona.amethyst.ui.theme.Size55dp import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer import com.vitorpamplona.amethyst.ui.theme.StdPadding @@ -313,7 +316,7 @@ private fun NestFeedCard( note = baseNote, accountViewModel = accountViewModel, ) { - ObserveAndRenderSpace(addressableNote, accountViewModel, nav) + ObserveAndRenderSpace(addressableNote, accountViewModel, nav, showQuickAction) } } } @@ -412,6 +415,13 @@ private fun NestEndedCompactCard( overflow = TextOverflow.Ellipsis, ) } + + ClickableBox( + modifier = Modifier.size(Size40dp), + onClick = showQuickAction, + ) { + VerticalDotsIcon() + } } } } @@ -456,6 +466,7 @@ fun ObserveAndRenderSpace( baseNote: AddressableNote, accountViewModel: AccountViewModel, nav: INav, + onMore: (() -> Unit)? = null, ) { val card by observeNoteAndMap(baseNote, accountViewModel) { when (val noteEvent = it.event) { @@ -485,6 +496,7 @@ fun ObserveAndRenderSpace( baseNote, accountViewModel, nav, + onMore, ) } } @@ -583,6 +595,7 @@ fun RenderLiveSpacesThumb( baseNote: AddressableNote, accountViewModel: AccountViewModel, nav: INav, + onMore: (() -> Unit)? = null, ) { Column( modifier = Modifier.fillMaxWidth(), @@ -652,6 +665,7 @@ fun RenderLiveSpacesThumb( baseNote, accountViewModel, nav, + onMore, ) } } @@ -662,6 +676,7 @@ fun SpaceHostAndReactions( baseNote: AddressableNote, accountViewModel: AccountViewModel, nav: INav, + onMore: (() -> Unit)? = null, ) { Row(verticalAlignment = Alignment.CenterVertically) { val creator = baseNote.author @@ -722,6 +737,15 @@ fun SpaceHostAndReactions( accountViewModel = accountViewModel, nav = nav, ) + if (onMore != null) { + Spacer(modifier = StdHorzSpacer) + ClickableBox( + modifier = Modifier.size(Size35dp), + onClick = onMore, + ) { + VerticalDotsIcon() + } + } } } }