feature(space) : prepare LeaveSpace for navigation to Roles&Permissions

This commit is contained in:
ganfra 2025-10-31 15:32:30 +01:00
parent f844007812
commit 48d2696ba8
4 changed files with 38 additions and 8 deletions

View file

@ -82,7 +82,16 @@ class SpaceFlowNode(
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
return when (navTarget) { return when (navTarget) {
NavTarget.Leave -> { NavTarget.Leave -> {
createNode<LeaveSpaceNode>(buildContext) val callback = object : LeaveSpaceNode.Callback {
override fun closeLeaveSpaceFlow() {
backstack.pop()
}
override fun navigateToRolesAndPermissions() {
// TODO
}
}
createNode<LeaveSpaceNode>(buildContext, listOf(callback))
} }
NavTarget.Root -> { NavTarget.Root -> {
val callback = object : SpaceNode.Callback { val callback = object : SpaceNode.Callback {
@ -111,7 +120,7 @@ class SpaceFlowNode(
} }
override fun navigateToSpaceInfo() { override fun navigateToSpaceInfo() {
//TODO // TODO
} }
override fun navigateToSpaceMembers() { override fun navigateToSpaceMembers() {
@ -119,11 +128,11 @@ class SpaceFlowNode(
} }
override fun navigateToRolesAndPermissions() { override fun navigateToRolesAndPermissions() {
//TODO // TODO
} }
override fun navigateToSecurityAndPrivacy() { override fun navigateToSecurityAndPrivacy() {
//TODO // TODO
} }
override fun startLeaveSpaceFlow() { override fun startLeaveSpaceFlow() {

View file

@ -13,6 +13,7 @@ import com.bumble.appyx.core.lifecycle.subscribe
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode import io.element.android.annotations.ContributesNode
@ -29,9 +30,16 @@ class LeaveSpaceNode(
room: JoinedRoom, room: JoinedRoom,
presenterFactory: LeaveSpacePresenter.Factory, presenterFactory: LeaveSpacePresenter.Factory,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
interface Callback : Plugin {
fun closeLeaveSpaceFlow()
fun navigateToRolesAndPermissions()
}
private val leaveSpaceHandle = matrixClient.spaceService.getLeaveSpaceHandle(room.roomId) private val leaveSpaceHandle = matrixClient.spaceService.getLeaveSpaceHandle(room.roomId)
private val presenter: LeaveSpacePresenter = presenterFactory.create(leaveSpaceHandle) private val presenter: LeaveSpacePresenter = presenterFactory.create(leaveSpaceHandle)
private val callback = plugins<Callback>().single()
override fun onBuilt() { override fun onBuilt() {
super.onBuilt() super.onBuilt()
lifecycle.subscribe( lifecycle.subscribe(
@ -46,7 +54,8 @@ class LeaveSpaceNode(
val state = presenter.present() val state = presenter.present()
LeaveSpaceView( LeaveSpaceView(
state = state, state = state,
onCancel = ::navigateUp, onCancel = callback::closeLeaveSpaceFlow,
onRolesAndPermissionsClick = callback::navigateToRolesAndPermissions,
modifier = modifier modifier = modifier
) )
} }

View file

@ -69,6 +69,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
fun LeaveSpaceView( fun LeaveSpaceView(
state: LeaveSpaceState, state: LeaveSpaceState,
onCancel: () -> Unit, onCancel: () -> Unit,
onRolesAndPermissionsClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Scaffold( Scaffold(
@ -130,6 +131,9 @@ fun LeaveSpaceView(
state.eventSink(LeaveSpaceEvents.LeaveSpace) state.eventSink(LeaveSpaceEvents.LeaveSpace)
}, },
onCancel = onCancel, onCancel = onCancel,
// TODO enable when navigation is ready
showRolesAndPermissionsButton = false, // state.isLastAdmin,
onRolesAndPermissionsClick = onRolesAndPermissionsClick,
) )
} }
} }
@ -210,6 +214,8 @@ private fun LeaveSpaceButtons(
showLeaveButton: Boolean, showLeaveButton: Boolean,
selectedRoomsCount: Int, selectedRoomsCount: Int,
onLeaveSpace: () -> Unit, onLeaveSpace: () -> Unit,
showRolesAndPermissionsButton: Boolean,
onRolesAndPermissionsClick: () -> Unit,
onCancel: () -> Unit, onCancel: () -> Unit,
) { ) {
ButtonColumnMolecule( ButtonColumnMolecule(
@ -229,8 +235,14 @@ private fun LeaveSpaceButtons(
destructive = true, destructive = true,
) )
} }
// TODO For least admin space, add a button to open the settings. if (showRolesAndPermissionsButton) {
// See https://www.figma.com/design/kcnHxunG1LDWXsJhaNuiHz/ER-145--Spaces-on-Element-X?node-id=4622-59600 Button(
text = stringResource(CommonStrings.action_go_to_roles_and_permissions),
onClick = onRolesAndPermissionsClick,
modifier = Modifier.fillMaxWidth(),
leadingIcon = IconSource.Vector(CompoundIcons.Settings()),
)
}
TextButton( TextButton(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
text = stringResource(CommonStrings.action_cancel), text = stringResource(CommonStrings.action_cancel),
@ -345,5 +357,6 @@ internal fun LeaveSpaceViewPreview(
LeaveSpaceView( LeaveSpaceView(
state = state, state = state,
onCancel = {}, onCancel = {},
onRolesAndPermissionsClick = {},
) )
} }

View file

@ -90,7 +90,6 @@ fun SpaceSettingsView(
onClick = onLeaveSpaceClick onClick = onLeaveSpaceClick
) )
}) })
} }
} }
} }