From c3447e2a05b2cc2fb1a677428956ba5fb9e9ffbe Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 29 Mar 2026 04:22:33 +0000 Subject: [PATCH] feat: Add @Preview annotations to NIP-43 UI components Adds preview functions for RelayMemberEventCard variants (membership list, add/remove member, join/leave request) and MembershipActions states (not member, is member, join sent, leave sent). https://claude.ai/code/session_01PRqe4bBCb9u62oPh8u9sHx --- .../amethyst/ui/note/types/RelayMembers.kt | 66 ++++++++++++++++++- .../relays/nip43/RelayMembersScreen.kt | 62 +++++++++++++++++ 2 files changed, 126 insertions(+), 2 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt index 83a12aec8..ee19fdba8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt @@ -40,12 +40,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonColumn import com.vitorpamplona.quartz.nip43RelayMembers.addMember.RelayAddMemberEvent import com.vitorpamplona.quartz.nip43RelayMembers.list.RelayMembershipListEvent import com.vitorpamplona.quartz.nip43RelayMembers.removeMember.RelayRemoveMemberEvent @@ -139,8 +141,8 @@ private fun RelayMemberEventCard( icon: ImageVector, title: String, subtitle: String?, - nav: INav, - relayPubKey: String?, + nav: INav? = null, + relayPubKey: String? = null, ) { Column( modifier = @@ -175,3 +177,63 @@ private fun RelayMemberEventCard( } } } + +@Preview +@Composable +private fun RelayMembershipListCardPreview() { + ThemeComparisonColumn { + RelayMemberEventCard( + icon = Icons.Default.People, + title = "Relay membership list", + subtitle = "42 members", + ) + } +} + +@Preview +@Composable +private fun RelayAddMemberCardPreview() { + ThemeComparisonColumn { + RelayMemberEventCard( + icon = Icons.Default.PersonAdd, + title = "Member added to relay", + subtitle = "a1b2c3d4e5f6a7b8...", + ) + } +} + +@Preview +@Composable +private fun RelayRemoveMemberCardPreview() { + ThemeComparisonColumn { + RelayMemberEventCard( + icon = Icons.Default.PersonRemove, + title = "Member removed from relay", + subtitle = "a1b2c3d4e5f6a7b8...", + ) + } +} + +@Preview +@Composable +private fun RelayJoinRequestCardPreview() { + ThemeComparisonColumn { + RelayMemberEventCard( + icon = Icons.Default.PersonAdd, + title = "Relay join request", + subtitle = null, + ) + } +} + +@Preview +@Composable +private fun RelayLeaveRequestCardPreview() { + ThemeComparisonColumn { + RelayMemberEventCard( + icon = Icons.AutoMirrored.Filled.ExitToApp, + title = "Relay leave request", + subtitle = null, + ) + } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip43/RelayMembersScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip43/RelayMembersScreen.kt index 5324046c0..22ee60b46 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip43/RelayMembersScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip43/RelayMembersScreen.kt @@ -62,12 +62,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.note.UserCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonColumn import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.fetchAsFlow import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter @@ -301,6 +303,66 @@ fun MembershipActions( } } +@Preview +@Composable +private fun MembershipActionsNotMemberPreview() { + ThemeComparisonColumn { + MembershipActions( + isMember = false, + isLoading = false, + joinRequestSent = false, + leaveRequestSent = false, + onJoinRequest = {}, + onLeaveRequest = {}, + ) + } +} + +@Preview +@Composable +private fun MembershipActionsIsMemberPreview() { + ThemeComparisonColumn { + MembershipActions( + isMember = true, + isLoading = false, + joinRequestSent = false, + leaveRequestSent = false, + onJoinRequest = {}, + onLeaveRequest = {}, + ) + } +} + +@Preview +@Composable +private fun MembershipActionsJoinSentPreview() { + ThemeComparisonColumn { + MembershipActions( + isMember = false, + isLoading = false, + joinRequestSent = true, + leaveRequestSent = false, + onJoinRequest = {}, + onLeaveRequest = {}, + ) + } +} + +@Preview +@Composable +private fun MembershipActionsLeaveSentPreview() { + ThemeComparisonColumn { + MembershipActions( + isMember = true, + isLoading = false, + joinRequestSent = false, + leaveRequestSent = true, + onJoinRequest = {}, + onLeaveRequest = {}, + ) + } +} + suspend fun sendJoinRequest( relay: NormalizedRelayUrl, accountViewModel: AccountViewModel,