diff --git a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt index 695d3bfaa7..38233aee64 100644 --- a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt +++ b/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt @@ -31,6 +31,7 @@ import com.bumble.appyx.core.node.ParentNode import com.bumble.appyx.core.node.node import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.push +import io.element.android.features.createroom.CreateRoomNode import io.element.android.features.preferences.PreferencesFlowNode import io.element.android.features.roomlist.RoomListNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -86,6 +87,10 @@ class LoggedInFlowNode( override fun onSettingsClicked() { backstack.push(NavTarget.Settings) } + + override fun onCreateRoomClicked() { + backstack.push(NavTarget.CreateRoom) + } } sealed interface NavTarget : Parcelable { @@ -97,6 +102,9 @@ class LoggedInFlowNode( @Parcelize object Settings : NavTarget + + @Parcelize + object CreateRoom : NavTarget } override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { @@ -120,6 +128,9 @@ class LoggedInFlowNode( NavTarget.Settings -> { PreferencesFlowNode(buildContext, onOpenBugReport) } + NavTarget.CreateRoom -> { + CreateRoomNode(buildContext) + } } } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt index cec107a412..579c7ae980 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListNode.kt @@ -38,6 +38,7 @@ class RoomListNode @AssistedInject constructor( interface Callback : Plugin { fun onRoomClicked(roomId: RoomId) fun onSettingsClicked() + fun onCreateRoomClicked() } private fun onRoomClicked(roomId: RoomId) { @@ -48,6 +49,10 @@ class RoomListNode @AssistedInject constructor( plugins().forEach { it.onSettingsClicked() } } + private fun onCreateRoomClicked() { + plugins().forEach { it.onCreateRoomClicked() } + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() @@ -55,7 +60,8 @@ class RoomListNode @AssistedInject constructor( state = state, modifier = modifier, onRoomClicked = this::onRoomClicked, - onOpenSettings = this::onOpenSettings + onOpenSettings = this::onOpenSettings, + onCreateRoomClicked = this::onCreateRoomClicked, ) } } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt index b7d1d122dc..ca84a4401f 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable @@ -42,6 +43,7 @@ import io.element.android.features.roomlist.model.RoomListState import io.element.android.features.roomlist.model.RoomListStateProvider import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.FloatingActionButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.matrix.api.core.RoomId @@ -54,6 +56,7 @@ fun RoomListView( modifier: Modifier = Modifier, onRoomClicked: (RoomId) -> Unit = {}, onOpenSettings: () -> Unit = {}, + onCreateRoomClicked: () -> Unit = {}, ) { fun onFilterChanged(filter: String) { state.eventSink(RoomListEvents.UpdateFilter(filter)) @@ -72,6 +75,7 @@ fun RoomListView( onFilterChanged = ::onFilterChanged, onOpenSettings = onOpenSettings, onScrollOver = ::onVisibleRangedChanged, + onCreateRoomClicked = onCreateRoomClicked, ) } @@ -86,6 +90,7 @@ fun RoomListContent( onFilterChanged: (String) -> Unit = {}, onOpenSettings: () -> Unit = {}, onScrollOver: (IntRange) -> Unit = {}, + onCreateRoomClicked: () -> Unit = {}, ) { fun onRoomClicked(room: RoomListRoomSummary) { onRoomClicked(room.roomId) @@ -148,7 +153,12 @@ fun RoomListContent( } } } - } + }, + floatingActionButton = { + FloatingActionButton(onClick = onCreateRoomClicked) { + + } + }, ) }