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
This commit is contained in:
Claude
2026-03-29 04:22:33 +00:00
parent b1b9707c5f
commit c3447e2a05
2 changed files with 126 additions and 2 deletions
@@ -40,12 +40,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
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.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
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.ThemeComparisonColumn
import com.vitorpamplona.quartz.nip43RelayMembers.addMember.RelayAddMemberEvent import com.vitorpamplona.quartz.nip43RelayMembers.addMember.RelayAddMemberEvent
import com.vitorpamplona.quartz.nip43RelayMembers.list.RelayMembershipListEvent import com.vitorpamplona.quartz.nip43RelayMembers.list.RelayMembershipListEvent
import com.vitorpamplona.quartz.nip43RelayMembers.removeMember.RelayRemoveMemberEvent import com.vitorpamplona.quartz.nip43RelayMembers.removeMember.RelayRemoveMemberEvent
@@ -139,8 +141,8 @@ private fun RelayMemberEventCard(
icon: ImageVector, icon: ImageVector,
title: String, title: String,
subtitle: String?, subtitle: String?,
nav: INav, nav: INav? = null,
relayPubKey: String?, relayPubKey: String? = null,
) { ) {
Column( Column(
modifier = 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,
)
}
}
@@ -62,12 +62,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.note.UserCompose import com.vitorpamplona.amethyst.ui.note.UserCompose
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.ThemeComparisonColumn
import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.HexKey
import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.fetchAsFlow import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.fetchAsFlow
import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter 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( suspend fun sendJoinRequest(
relay: NormalizedRelayUrl, relay: NormalizedRelayUrl,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,