feat(audio-rooms): share-room as naddr1 (T2 #4)
Adds a "Share room" action to the room overflow menu (visible to
EVERYONE — share isn't host-restricted; the host-only "Edit room"
row is now gated alongside it). Builds an `nostr:naddr1...` URI
from the room's kind / hostPubkey / dTag via Quartz's
`ATag.toNAddr()` helper and hands it to the system share sheet
with the room title as a preview blurb.
shareRoomNaddr(context, event):
aTag = ATag(event.kind, event.pubKey, event.dTag(), null)
naddr = aTag.toNAddr()
text = "<title> — nostr:<naddr>"
Intent.ACTION_SEND → createChooser
AudioRoomFullScreen — overflow menu now visible to all members.
Share row appears for everyone; Edit row appears only when the
local user is the room's host.
Strings: audio_room_share_action.
Step 3 (zap entry points) is intentionally NOT in this commit —
the existing zap UI is built around the per-note ZapReaction in
ReactionsRow.kt with long-press-to-set-amount + click-to-zap, which
is heavy to embed inside the audio room. The reactions sub already
pulls kind 9735 receipts so paid zaps SURFACE in the floating
overlay; the SEND path can ship as a follow-up that wires the
existing `accountViewModel.zap(note, amount, ...)` flow with
ZapPaymentHandler from inside the participant context sheet.
This commit is contained in:
+45
-12
@@ -63,6 +63,7 @@ import com.vitorpamplona.amethyst.ui.stringRes
|
|||||||
import com.vitorpamplona.amethyst.ui.theme.Size35dp
|
import com.vitorpamplona.amethyst.ui.theme.Size35dp
|
||||||
import com.vitorpamplona.amethyst.ui.theme.Size40dp
|
import com.vitorpamplona.amethyst.ui.theme.Size40dp
|
||||||
import com.vitorpamplona.quartz.nip01Core.tags.aTag.ATag
|
import com.vitorpamplona.quartz.nip01Core.tags.aTag.ATag
|
||||||
|
import com.vitorpamplona.quartz.nip19Bech32.toNAddr
|
||||||
import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent
|
import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent
|
||||||
import com.vitorpamplona.quartz.nip53LiveActivities.streaming.tags.ParticipantTag
|
import com.vitorpamplona.quartz.nip53LiveActivities.streaming.tags.ParticipantTag
|
||||||
|
|
||||||
@@ -111,18 +112,28 @@ internal fun AudioRoomFullScreen(
|
|||||||
modifier = Modifier.weight(1f),
|
modifier = Modifier.weight(1f),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (isHost) {
|
// Overflow menu — visible to everyone (Share); host-only
|
||||||
Box {
|
// rows (Edit) are gated inside.
|
||||||
androidx.compose.material3.IconButton(onClick = { showHostMenu = true }) {
|
Box {
|
||||||
Icon(
|
androidx.compose.material3.IconButton(onClick = { showHostMenu = true }) {
|
||||||
symbol = MaterialSymbols.MoreVert,
|
Icon(
|
||||||
contentDescription = stringRes(R.string.audio_room_overflow_menu),
|
symbol = MaterialSymbols.MoreVert,
|
||||||
)
|
contentDescription = stringRes(R.string.audio_room_overflow_menu),
|
||||||
}
|
)
|
||||||
androidx.compose.material3.DropdownMenu(
|
}
|
||||||
expanded = showHostMenu,
|
val context = androidx.compose.ui.platform.LocalContext.current
|
||||||
onDismissRequest = { showHostMenu = false },
|
androidx.compose.material3.DropdownMenu(
|
||||||
) {
|
expanded = showHostMenu,
|
||||||
|
onDismissRequest = { showHostMenu = false },
|
||||||
|
) {
|
||||||
|
androidx.compose.material3.DropdownMenuItem(
|
||||||
|
text = { Text(stringRes(R.string.audio_room_share_action)) },
|
||||||
|
onClick = {
|
||||||
|
showHostMenu = false
|
||||||
|
shareRoomNaddr(context, event)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if (isHost) {
|
||||||
androidx.compose.material3.DropdownMenuItem(
|
androidx.compose.material3.DropdownMenuItem(
|
||||||
text = { Text(stringRes(R.string.audio_room_edit_title)) },
|
text = { Text(stringRes(R.string.audio_room_edit_title)) },
|
||||||
onClick = {
|
onClick = {
|
||||||
@@ -461,3 +472,25 @@ private fun TalkRow(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build an `nostr:naddr1...` URI for the room and hand it to the
|
||||||
|
* system share sheet. Includes the room title in the share text
|
||||||
|
* so the receiving app can render a preview without round-tripping
|
||||||
|
* the relay.
|
||||||
|
*/
|
||||||
|
private fun shareRoomNaddr(
|
||||||
|
context: android.content.Context,
|
||||||
|
event: MeetingSpaceEvent,
|
||||||
|
) {
|
||||||
|
val aTag = ATag(event.kind, event.pubKey, event.dTag(), null)
|
||||||
|
val naddr = aTag.toNAddr()
|
||||||
|
val title = event.room().orEmpty()
|
||||||
|
val text = if (title.isNotBlank()) "$title — nostr:$naddr" else "nostr:$naddr"
|
||||||
|
val intent =
|
||||||
|
android.content.Intent(android.content.Intent.ACTION_SEND).apply {
|
||||||
|
type = "text/plain"
|
||||||
|
putExtra(android.content.Intent.EXTRA_TEXT, text)
|
||||||
|
}
|
||||||
|
context.startActivity(android.content.Intent.createChooser(intent, null))
|
||||||
|
}
|
||||||
|
|||||||
@@ -544,6 +544,7 @@
|
|||||||
<string name="audio_room_participant_unfollow">Unfollow</string>
|
<string name="audio_room_participant_unfollow">Unfollow</string>
|
||||||
<string name="audio_room_participant_mute">Mute</string>
|
<string name="audio_room_participant_mute">Mute</string>
|
||||||
<string name="audio_room_participant_unmute">Unmute</string>
|
<string name="audio_room_participant_unmute">Unmute</string>
|
||||||
|
<string name="audio_room_share_action">Share room</string>
|
||||||
<string name="audio_room_create_fab">Start space</string>
|
<string name="audio_room_create_fab">Start space</string>
|
||||||
<string name="audio_room_create_title">Start a new audio room</string>
|
<string name="audio_room_create_title">Start a new audio room</string>
|
||||||
<string name="audio_room_create_field_room">Room name</string>
|
<string name="audio_room_create_field_room">Room name</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user