feature(space) : plumb up space settings screen

This commit is contained in:
ganfra 2025-10-30 22:16:20 +01:00
parent 9d3b7de0d8
commit 5f7fda2402
5 changed files with 45 additions and 18 deletions

View file

@ -195,10 +195,6 @@ class JoinedRoomLoadedFlowNode(
callback.navigateToRoom(roomId, viaParameters) callback.navigateToRoom(roomId, viaParameters)
} }
override fun navigateToRoomDetails() {
backstack.push(NavTarget.RoomDetails)
}
override fun navigateToRoomMemberList() { override fun navigateToRoomMemberList() {
backstack.push(NavTarget.RoomMemberList) backstack.push(NavTarget.RoomMemberList)
} }

View file

@ -28,7 +28,6 @@ interface SpaceEntryPoint : FeatureEntryPoint {
interface Callback : Plugin { interface Callback : Plugin {
fun navigateToRoom(roomId: RoomId, viaParameters: List<String>) fun navigateToRoom(roomId: RoomId, viaParameters: List<String>)
fun navigateToRoomDetails()
fun navigateToRoomMemberList() fun navigateToRoomMemberList()
} }
} }

View file

@ -18,6 +18,7 @@ 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.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.pop
import com.bumble.appyx.navmodel.backstack.operation.push import com.bumble.appyx.navmodel.backstack.operation.push
import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.AssistedInject
@ -26,14 +27,15 @@ import io.element.android.features.space.api.SpaceEntryPoint
import io.element.android.features.space.impl.di.SpaceFlowGraph import io.element.android.features.space.impl.di.SpaceFlowGraph
import io.element.android.features.space.impl.leave.LeaveSpaceNode import io.element.android.features.space.impl.leave.LeaveSpaceNode
import io.element.android.features.space.impl.root.SpaceNode import io.element.android.features.space.impl.root.SpaceNode
import io.element.android.features.space.impl.settings.SpaceSettingsNode
import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.callback
import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.di.DependencyInjectionGraphOwner
import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.BaseRoom
import io.element.android.libraries.matrix.api.spaces.SpaceService import io.element.android.libraries.matrix.api.spaces.SpaceService
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@ -42,6 +44,7 @@ import kotlinx.parcelize.Parcelize
class SpaceFlowNode( class SpaceFlowNode(
@Assisted val buildContext: BuildContext, @Assisted val buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
room: BaseRoom,
spaceService: SpaceService, spaceService: SpaceService,
graphFactory: SpaceFlowGraph.Factory, graphFactory: SpaceFlowGraph.Factory,
) : BaseFlowNode<SpaceFlowNode.NavTarget>( ) : BaseFlowNode<SpaceFlowNode.NavTarget>(
@ -52,15 +55,17 @@ class SpaceFlowNode(
buildContext = buildContext, buildContext = buildContext,
plugins = plugins, plugins = plugins,
), DependencyInjectionGraphOwner { ), DependencyInjectionGraphOwner {
private val inputs: SpaceEntryPoint.Inputs = inputs()
private val callback: SpaceEntryPoint.Callback = callback() private val callback: SpaceEntryPoint.Callback = callback()
private val spaceRoomList = spaceService.spaceRoomList(inputs.roomId) private val spaceRoomList = spaceService.spaceRoomList(room.roomId)
override val graph = graphFactory.create(spaceRoomList) override val graph = graphFactory.create(spaceRoomList)
sealed interface NavTarget : Parcelable { sealed interface NavTarget : Parcelable {
@Parcelize @Parcelize
data object Root : NavTarget data object Root : NavTarget
@Parcelize
data object Settings : NavTarget
@Parcelize @Parcelize
data object Leave : NavTarget data object Leave : NavTarget
} }
@ -77,7 +82,7 @@ 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, listOf(inputs)) createNode<LeaveSpaceNode>(buildContext)
} }
NavTarget.Root -> { NavTarget.Root -> {
val callback = object : SpaceNode.Callback { val callback = object : SpaceNode.Callback {
@ -85,8 +90,8 @@ class SpaceFlowNode(
callback.navigateToRoom(roomId, viaParameters) callback.navigateToRoom(roomId, viaParameters)
} }
override fun navigateToRoomDetails() { override fun navigateToSpaceSettings() {
callback.navigateToRoomDetails() backstack.push(NavTarget.Settings)
} }
override fun navigateToRoomMemberList() { override fun navigateToRoomMemberList() {
@ -97,7 +102,35 @@ class SpaceFlowNode(
backstack.push(NavTarget.Leave) backstack.push(NavTarget.Leave)
} }
} }
createNode<SpaceNode>(buildContext, listOf(inputs, callback)) createNode<SpaceNode>(buildContext, listOf(callback))
}
NavTarget.Settings -> {
val callback = object : SpaceSettingsNode.Callback {
override fun onBackClick() {
backstack.pop()
}
override fun onSpaceInfoClick() {
//TODO
}
override fun onMembersClick() {
callback.navigateToRoomMemberList()
}
override fun onRolesAndPermissionsClick() {
//TODO
}
override fun onSecurityAndPrivacyClick() {
//TODO
}
override fun onLeaveSpaceClick() {
backstack.push(NavTarget.Leave)
}
}
createNode<SpaceSettingsNode>(buildContext, listOf(callback))
} }
} }
} }

View file

@ -16,10 +16,9 @@ import com.bumble.appyx.core.plugin.Plugin
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
import io.element.android.features.space.api.SpaceEntryPoint
import io.element.android.features.space.impl.di.SpaceFlowScope import io.element.android.features.space.impl.di.SpaceFlowScope
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.room.JoinedRoom
@ContributesNode(SpaceFlowScope::class) @ContributesNode(SpaceFlowScope::class)
@AssistedInject @AssistedInject
@ -27,10 +26,10 @@ class LeaveSpaceNode(
@Assisted buildContext: BuildContext, @Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
matrixClient: MatrixClient, matrixClient: MatrixClient,
room: JoinedRoom,
presenterFactory: LeaveSpacePresenter.Factory, presenterFactory: LeaveSpacePresenter.Factory,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
private val inputs: SpaceEntryPoint.Inputs = inputs() private val leaveSpaceHandle = matrixClient.spaceService.getLeaveSpaceHandle(room.roomId)
private val leaveSpaceHandle = matrixClient.spaceService.getLeaveSpaceHandle(inputs.roomId)
private val presenter: LeaveSpacePresenter = presenterFactory.create(leaveSpaceHandle) private val presenter: LeaveSpacePresenter = presenterFactory.create(leaveSpaceHandle)
override fun onBuilt() { override fun onBuilt() {

View file

@ -42,7 +42,7 @@ class SpaceNode(
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
interface Callback : Plugin { interface Callback : Plugin {
fun navigateToRoom(roomId: RoomId, viaParameters: List<String>) fun navigateToRoom(roomId: RoomId, viaParameters: List<String>)
fun navigateToRoomDetails() fun navigateToSpaceSettings()
fun navigateToRoomMemberList() fun navigateToRoomMemberList()
fun startLeaveSpaceFlow() fun startLeaveSpaceFlow()
} }
@ -80,7 +80,7 @@ class SpaceNode(
callback.navigateToRoom(spaceRoom.roomId, spaceRoom.via) callback.navigateToRoom(spaceRoom.roomId, spaceRoom.via)
}, },
onDetailsClick = { onDetailsClick = {
callback.navigateToRoomDetails() callback.navigateToSpaceSettings()
}, },
onShareSpace = { onShareSpace = {
onShareRoom(context) onShareRoom(context)