Merge pull request #5619 from element-hq/feature/fga/space_members

Space : add view members entry
This commit is contained in:
ganfra
2025-10-29 10:53:45 +01:00
committed by GitHub
9 changed files with 57 additions and 13 deletions

View File

@@ -22,8 +22,6 @@ import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.appnav.di.RoomGraphFactory
import io.element.android.appnav.room.RoomNavigationTarget
import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode.Inputs
import io.element.android.appnav.room.joined.JoinedRoomLoadedFlowNode.NavTarget
import io.element.android.features.messages.api.MessagesEntryPoint
import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint
import io.element.android.features.space.api.SpaceEntryPoint
@@ -154,6 +152,9 @@ class JoinedRoomLoadedFlowNode(
NavTarget.RoomNotificationSettings -> {
createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomNotificationSettings)
}
NavTarget.RoomMemberList -> {
createRoomDetailsNode(buildContext, RoomDetailsEntryPoint.InitialTarget.RoomMemberList)
}
NavTarget.Space -> {
createSpaceNode(buildContext)
}
@@ -169,6 +170,10 @@ class JoinedRoomLoadedFlowNode(
override fun onOpenDetails() {
backstack.push(NavTarget.RoomDetails)
}
override fun onOpenMemberList() {
backstack.push(NavTarget.RoomMemberList)
}
}
return spaceEntryPoint.nodeBuilder(this, buildContext)
.inputs(SpaceEntryPoint.Inputs(roomId = inputs.room.roomId))
@@ -216,6 +221,9 @@ class JoinedRoomLoadedFlowNode(
@Parcelize
data object RoomDetails : NavTarget
@Parcelize
data object RoomMemberList : NavTarget
@Parcelize
data class RoomMemberDetails(val userId: UserId) : NavTarget
@@ -229,17 +237,17 @@ class JoinedRoomLoadedFlowNode(
}
}
private fun initialElement(plugins: List<Plugin>): NavTarget {
val input = plugins.filterIsInstance<Inputs>().single()
private fun initialElement(plugins: List<Plugin>): JoinedRoomLoadedFlowNode.NavTarget {
val input = plugins.filterIsInstance<JoinedRoomLoadedFlowNode.Inputs>().single()
return when (input.initialElement) {
is RoomNavigationTarget.Root -> {
if (input.room.roomInfoFlow.value.isSpace) {
NavTarget.Space
JoinedRoomLoadedFlowNode.NavTarget.Space
} else {
NavTarget.Messages(input.initialElement.eventId)
JoinedRoomLoadedFlowNode.NavTarget.Messages(input.initialElement.eventId)
}
}
RoomNavigationTarget.Details -> NavTarget.RoomDetails
RoomNavigationTarget.NotificationSettings -> NavTarget.RoomNotificationSettings
RoomNavigationTarget.Details -> JoinedRoomLoadedFlowNode.NavTarget.RoomDetails
RoomNavigationTarget.NotificationSettings -> JoinedRoomLoadedFlowNode.NavTarget.RoomNotificationSettings
}
}

View File

@@ -23,6 +23,9 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint {
@Parcelize
data object RoomDetails : InitialTarget
@Parcelize
data object RoomMemberList : InitialTarget
@Parcelize
data class RoomMemberDetails(val roomMemberId: UserId) : InitialTarget

View File

@@ -44,4 +44,5 @@ internal fun InitialTarget.toNavTarget() = when (this) {
is InitialTarget.RoomDetails -> NavTarget.RoomDetails
is InitialTarget.RoomMemberDetails -> NavTarget.RoomMemberDetails(roomMemberId)
is InitialTarget.RoomNotificationSettings -> NavTarget.RoomNotificationSettings(showUserDefinedSettingStyle = true)
InitialTarget.RoomMemberList -> NavTarget.RoomMemberList
}

View File

@@ -33,5 +33,7 @@ interface SpaceEntryPoint : FeatureEntryPoint {
interface Callback : Plugin {
fun onOpenRoom(roomId: RoomId, viaParameters: List<String>)
fun onOpenDetails()
fun onOpenMemberList()
}
}

View File

@@ -88,6 +88,10 @@ class SpaceFlowNode(
callback.onOpenDetails()
}
override fun onOpenMemberList() {
callback.onOpenMemberList()
}
override fun onLeaveSpace() {
backstack.push(NavTarget.Leave)
}

View File

@@ -42,6 +42,8 @@ class SpaceNode(
interface Callback : Plugin {
fun onOpenRoom(roomId: RoomId, viaParameters: List<String>)
fun onOpenDetails()
fun onOpenMemberList()
fun onLeaveSpace()
}
@@ -83,6 +85,9 @@ class SpaceNode(
onShareSpace = {
onShareRoom(context)
},
onViewMembersClick = {
callback.onOpenMemberList()
},
acceptDeclineInviteView = {
acceptDeclineInviteView.Render(
state = state.acceptDeclineInviteState,

View File

@@ -78,6 +78,7 @@ fun SpaceView(
onShareSpace: () -> Unit,
onLeaveSpaceClick: () -> Unit,
onDetailsClick: () -> Unit,
onViewMembersClick: () -> Unit,
modifier: Modifier = Modifier,
acceptDeclineInviteView: @Composable () -> Unit,
) {
@@ -89,7 +90,8 @@ fun SpaceView(
onBackClick = onBackClick,
onLeaveSpaceClick = onLeaveSpaceClick,
onShareSpace = onShareSpace,
onDetailsClick = onDetailsClick
onDetailsClick = onDetailsClick,
onViewMembersClick = onViewMembersClick,
)
},
content = { padding ->
@@ -256,6 +258,7 @@ private fun SpaceViewTopBar(
onLeaveSpaceClick: () -> Unit,
onDetailsClick: () -> Unit,
onShareSpace: () -> Unit,
onViewMembersClick: () -> Unit,
modifier: Modifier = Modifier,
) {
TopAppBar(
@@ -304,6 +307,20 @@ private fun SpaceViewTopBar(
)
}
)
DropdownMenuItem(
onClick = {
showMenu = false
onViewMembersClick()
},
text = { Text(stringResource(id = CommonStrings.screen_space_menu_action_members)) },
leadingIcon = {
Icon(
imageVector = CompoundIcons.User(),
tint = ElementTheme.colors.iconSecondary,
contentDescription = null,
)
}
)
DropdownMenuItem(
onClick = {
showMenu = false
@@ -344,10 +361,10 @@ private fun SpaceAvatarAndNameRow(
)
Text(
modifier = Modifier
.padding(horizontal = 8.dp)
.semantics {
heading()
},
.padding(horizontal = 8.dp)
.semantics {
heading()
},
text = name ?: stringResource(CommonStrings.common_no_space_name),
style = ElementTheme.typography.fontBodyLgMedium,
fontStyle = FontStyle.Italic.takeIf { name == null },
@@ -403,6 +420,7 @@ internal fun SpaceViewPreview(
onLeaveSpaceClick = {},
acceptDeclineInviteView = {},
onDetailsClick = {},
onViewMembersClick = {},
onBackClick = {},
)
}

View File

@@ -46,6 +46,7 @@ class DefaultSpaceEntryPointTest {
val callback = object : SpaceEntryPoint.Callback {
override fun onOpenRoom(roomId: RoomId, viaParameters: List<String>) = lambdaError()
override fun onOpenDetails() = lambdaError()
override fun onOpenMemberList() = lambdaError()
}
val result = entryPoint.nodeBuilder(parentNode, BuildContext.root(null))
.inputs(nodeInputs)

View File

@@ -140,6 +140,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onShareSpace: () -> Unit = EnsureNeverCalled(),
onLeaveSpaceClick: () -> Unit = EnsureNeverCalled(),
onDetailsClick: () -> Unit = EnsureNeverCalled(),
onViewMembersClick: () -> Unit = EnsureNeverCalled(),
acceptDeclineInviteView: @Composable () -> Unit = {},
) {
setContent {
@@ -150,6 +151,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onShareSpace = onShareSpace,
onLeaveSpaceClick = onLeaveSpaceClick,
onDetailsClick = onDetailsClick,
onViewMembersClick = onViewMembersClick,
acceptDeclineInviteView = acceptDeclineInviteView,
)
}