Add "Add existing rooms" entry to space

This commit is contained in:
ganfra 2026-01-20 21:07:42 +01:00
parent c3a469544e
commit e840671bf2
5 changed files with 72 additions and 0 deletions

View file

@ -25,6 +25,7 @@ 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.api.SpaceEntryPoint
import io.element.android.features.space.impl.addroom.AddRoomToSpaceNode
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
@ -69,6 +70,9 @@ class SpaceFlowNode(
@Parcelize @Parcelize
data object Leave : NavTarget data object Leave : NavTarget
@Parcelize
data object AddRoom : NavTarget
} }
override fun onBuilt() { override fun onBuilt() {
@ -111,6 +115,10 @@ class SpaceFlowNode(
override fun startLeaveSpaceFlow() { override fun startLeaveSpaceFlow() {
backstack.push(NavTarget.Leave) backstack.push(NavTarget.Leave)
} }
override fun navigateToAddRoom() {
backstack.push(NavTarget.AddRoom)
}
} }
createNode<SpaceNode>(buildContext, listOf(callback)) createNode<SpaceNode>(buildContext, listOf(callback))
} }
@ -132,6 +140,14 @@ class SpaceFlowNode(
} }
createNode<SpaceSettingsFlowNode>(buildContext, listOf(callback)) createNode<SpaceSettingsFlowNode>(buildContext, listOf(callback))
} }
NavTarget.AddRoom -> {
val callback = object : AddRoomToSpaceNode.Callback {
override fun onFinish() {
backstack.pop()
}
}
createNode<AddRoomToSpaceNode>(buildContext, listOf(callback))
}
} }
} }

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.space.impl.addroom
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedInject
import io.element.android.annotations.ContributesNode
import io.element.android.features.space.impl.di.SpaceFlowScope
import io.element.android.libraries.architecture.callback
@ContributesNode(SpaceFlowScope::class)
@AssistedInject
class AddRoomToSpaceNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
) : Node(buildContext, plugins = plugins) {
interface Callback : Plugin {
fun onFinish()
}
private val callback: Callback = callback()
@Composable
override fun View(modifier: Modifier) {
}
}

View file

@ -46,6 +46,7 @@ class SpaceNode(
fun navigateToSpaceSettings() fun navigateToSpaceSettings()
fun navigateToRoomMemberList() fun navigateToRoomMemberList()
fun startLeaveSpaceFlow() fun startLeaveSpaceFlow()
fun navigateToAddRoom()
} }
private val callback: Callback = callback() private val callback: Callback = callback()
@ -89,6 +90,9 @@ class SpaceNode(
onViewMembersClick = { onViewMembersClick = {
callback.navigateToRoomMemberList() callback.navigateToRoomMemberList()
}, },
onAddRoomClick = {
callback.navigateToAddRoom()
},
acceptDeclineInviteView = { acceptDeclineInviteView = {
acceptDeclineInviteView.Render( acceptDeclineInviteView.Render(
state = state.acceptDeclineInviteState, state = state.acceptDeclineInviteState,

View file

@ -98,6 +98,7 @@ fun SpaceView(
onLeaveSpaceClick: () -> Unit, onLeaveSpaceClick: () -> Unit,
onSettingsClick: () -> Unit, onSettingsClick: () -> Unit,
onViewMembersClick: () -> Unit, onViewMembersClick: () -> Unit,
onAddRoomClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
acceptDeclineInviteView: @Composable () -> Unit, acceptDeclineInviteView: @Composable () -> Unit,
) { ) {
@ -140,6 +141,7 @@ fun SpaceView(
onShareSpace = onShareSpace, onShareSpace = onShareSpace,
onViewMembersClick = onViewMembersClick, onViewMembersClick = onViewMembersClick,
onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) }, onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) },
onAddRoomClick = onAddRoomClick,
) )
} }
} }
@ -344,6 +346,7 @@ private fun SpaceViewTopBar(
onShareSpace: () -> Unit, onShareSpace: () -> Unit,
onViewMembersClick: () -> Unit, onViewMembersClick: () -> Unit,
onManageRoomsClick: () -> Unit, onManageRoomsClick: () -> Unit,
onAddRoomClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
TopAppBar( TopAppBar(
@ -376,6 +379,14 @@ private fun SpaceViewTopBar(
onDismissRequest = { showMenu = false } onDismissRequest = { showMenu = false }
) { ) {
if (showManageRoomsAction) { if (showManageRoomsAction) {
SpaceMenuItem(
titleRes = CommonStrings.action_add_existing_rooms,
icon = CompoundIcons.Room(),
onClick = {
showMenu = false
onAddRoomClick()
}
)
SpaceMenuItem( SpaceMenuItem(
titleRes = CommonStrings.action_manage_rooms, titleRes = CommonStrings.action_manage_rooms,
icon = CompoundIcons.Edit(), icon = CompoundIcons.Edit(),
@ -600,6 +611,7 @@ internal fun SpaceViewPreview(
acceptDeclineInviteView = {}, acceptDeclineInviteView = {},
onSettingsClick = {}, onSettingsClick = {},
onViewMembersClick = {}, onViewMembersClick = {},
onAddRoomClick = {},
onBackClick = {}, onBackClick = {},
) )
} }

View file

@ -210,6 +210,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onLeaveSpaceClick: () -> Unit = EnsureNeverCalled(), onLeaveSpaceClick: () -> Unit = EnsureNeverCalled(),
onSettingsClick: () -> Unit = EnsureNeverCalled(), onSettingsClick: () -> Unit = EnsureNeverCalled(),
onViewMembersClick: () -> Unit = EnsureNeverCalled(), onViewMembersClick: () -> Unit = EnsureNeverCalled(),
onAddRoomClick: () -> Unit = EnsureNeverCalled(),
acceptDeclineInviteView: @Composable () -> Unit = {}, acceptDeclineInviteView: @Composable () -> Unit = {},
) { ) {
setContent { setContent {
@ -221,6 +222,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setSpace
onLeaveSpaceClick = onLeaveSpaceClick, onLeaveSpaceClick = onLeaveSpaceClick,
onSettingsClick = onSettingsClick, onSettingsClick = onSettingsClick,
onViewMembersClick = onViewMembersClick, onViewMembersClick = onViewMembersClick,
onAddRoomClick = onAddRoomClick,
acceptDeclineInviteView = acceptDeclineInviteView, acceptDeclineInviteView = acceptDeclineInviteView,
) )
} }