diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt index 4c91da0301..95d97156ff 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt @@ -25,6 +25,7 @@ import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode 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.leave.LeaveSpaceNode import io.element.android.features.space.impl.root.SpaceNode @@ -69,6 +70,9 @@ class SpaceFlowNode( @Parcelize data object Leave : NavTarget + + @Parcelize + data object AddRoom : NavTarget } override fun onBuilt() { @@ -111,6 +115,10 @@ class SpaceFlowNode( override fun startLeaveSpaceFlow() { backstack.push(NavTarget.Leave) } + + override fun navigateToAddRoom() { + backstack.push(NavTarget.AddRoom) + } } createNode(buildContext, listOf(callback)) } @@ -132,6 +140,14 @@ class SpaceFlowNode( } createNode(buildContext, listOf(callback)) } + NavTarget.AddRoom -> { + val callback = object : AddRoomToSpaceNode.Callback { + override fun onFinish() { + backstack.pop() + } + } + createNode(buildContext, listOf(callback)) + } } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceNode.kt new file mode 100644 index 0000000000..6d4bced691 --- /dev/null +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceNode.kt @@ -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, +) : Node(buildContext, plugins = plugins) { + interface Callback : Plugin { + fun onFinish() + } + + private val callback: Callback = callback() + + @Composable + override fun View(modifier: Modifier) { + + } +} diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt index 240bc89990..f56c3df8c2 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceNode.kt @@ -46,6 +46,7 @@ class SpaceNode( fun navigateToSpaceSettings() fun navigateToRoomMemberList() fun startLeaveSpaceFlow() + fun navigateToAddRoom() } private val callback: Callback = callback() @@ -89,6 +90,9 @@ class SpaceNode( onViewMembersClick = { callback.navigateToRoomMemberList() }, + onAddRoomClick = { + callback.navigateToAddRoom() + }, acceptDeclineInviteView = { acceptDeclineInviteView.Render( state = state.acceptDeclineInviteState, diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt index 695b887496..9f91e0f463 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceView.kt @@ -98,6 +98,7 @@ fun SpaceView( onLeaveSpaceClick: () -> Unit, onSettingsClick: () -> Unit, onViewMembersClick: () -> Unit, + onAddRoomClick: () -> Unit, modifier: Modifier = Modifier, acceptDeclineInviteView: @Composable () -> Unit, ) { @@ -140,6 +141,7 @@ fun SpaceView( onShareSpace = onShareSpace, onViewMembersClick = onViewMembersClick, onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) }, + onAddRoomClick = onAddRoomClick, ) } } @@ -344,6 +346,7 @@ private fun SpaceViewTopBar( onShareSpace: () -> Unit, onViewMembersClick: () -> Unit, onManageRoomsClick: () -> Unit, + onAddRoomClick: () -> Unit, modifier: Modifier = Modifier, ) { TopAppBar( @@ -376,6 +379,14 @@ private fun SpaceViewTopBar( onDismissRequest = { showMenu = false } ) { if (showManageRoomsAction) { + SpaceMenuItem( + titleRes = CommonStrings.action_add_existing_rooms, + icon = CompoundIcons.Room(), + onClick = { + showMenu = false + onAddRoomClick() + } + ) SpaceMenuItem( titleRes = CommonStrings.action_manage_rooms, icon = CompoundIcons.Edit(), @@ -600,6 +611,7 @@ internal fun SpaceViewPreview( acceptDeclineInviteView = {}, onSettingsClick = {}, onViewMembersClick = {}, + onAddRoomClick = {}, onBackClick = {}, ) } diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceViewTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceViewTest.kt index 27970e93f8..59041a97ed 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceViewTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/root/SpaceViewTest.kt @@ -210,6 +210,7 @@ private fun AndroidComposeTestRule.setSpace onLeaveSpaceClick: () -> Unit = EnsureNeverCalled(), onSettingsClick: () -> Unit = EnsureNeverCalled(), onViewMembersClick: () -> Unit = EnsureNeverCalled(), + onAddRoomClick: () -> Unit = EnsureNeverCalled(), acceptDeclineInviteView: @Composable () -> Unit = {}, ) { setContent { @@ -221,6 +222,7 @@ private fun AndroidComposeTestRule.setSpace onLeaveSpaceClick = onLeaveSpaceClick, onSettingsClick = onSettingsClick, onViewMembersClick = onViewMembersClick, + onAddRoomClick = onAddRoomClick, acceptDeclineInviteView = acceptDeclineInviteView, ) }