feat(join by alias) : refactor navigation for create room flow
This commit is contained in:
parent
cd3eda2978
commit
12c0465d2a
7 changed files with 72 additions and 48 deletions
|
|
@ -357,8 +357,8 @@ class LoggedInFlowNode @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
NavTarget.CreateRoom -> {
|
NavTarget.CreateRoom -> {
|
||||||
val callback = object : CreateRoomEntryPoint.Callback {
|
val callback = object : CreateRoomEntryPoint.Callback {
|
||||||
override fun onSuccess(roomId: RoomId) {
|
override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias) {
|
||||||
backstack.replace(NavTarget.Room(roomId.toRoomIdOrAlias()))
|
backstack.replace(NavTarget.Room(roomIdOrAlias))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,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 io.element.android.libraries.architecture.FeatureEntryPoint
|
import io.element.android.libraries.architecture.FeatureEntryPoint
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||||
|
|
||||||
interface CreateRoomEntryPoint : FeatureEntryPoint {
|
interface CreateRoomEntryPoint : FeatureEntryPoint {
|
||||||
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
|
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
|
||||||
|
|
@ -21,6 +21,6 @@ interface CreateRoomEntryPoint : FeatureEntryPoint {
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Callback : Plugin {
|
interface Callback : Plugin {
|
||||||
fun onSuccess(roomId: RoomId)
|
fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* 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.createroom
|
||||||
|
|
||||||
|
import com.bumble.appyx.core.plugin.Plugin
|
||||||
|
import com.bumble.appyx.navmodel.backstack.BackStack
|
||||||
|
import com.bumble.appyx.navmodel.backstack.operation.push
|
||||||
|
import io.element.android.features.createroom.impl.CreateRoomFlowNode.NavTarget
|
||||||
|
import io.element.android.libraries.architecture.overlay.Overlay
|
||||||
|
import io.element.android.libraries.architecture.overlay.operation.hide
|
||||||
|
import io.element.android.libraries.architecture.overlay.operation.show
|
||||||
|
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||||
|
|
||||||
|
interface CreateRoomNavigator : Plugin {
|
||||||
|
fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias)
|
||||||
|
fun onCreateNewRoom()
|
||||||
|
}
|
||||||
|
|
||||||
|
class DefaultCreateRoomNavigator(
|
||||||
|
private val backstack: BackStack<NavTarget>,
|
||||||
|
private val openRoom: (RoomIdOrAlias) -> Unit,
|
||||||
|
) : CreateRoomNavigator {
|
||||||
|
|
||||||
|
override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias) = openRoom(roomIdOrAlias)
|
||||||
|
|
||||||
|
override fun onCreateNewRoom() {
|
||||||
|
backstack.push(NavTarget.NewRoom)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -19,6 +19,7 @@ import com.bumble.appyx.navmodel.backstack.operation.push
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
import io.element.android.features.createroom.CreateRoomNavigator
|
||||||
import io.element.android.features.createroom.impl.addpeople.AddPeopleNode
|
import io.element.android.features.createroom.impl.addpeople.AddPeopleNode
|
||||||
import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode
|
import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode
|
||||||
import io.element.android.features.createroom.impl.di.CreateRoomComponent
|
import io.element.android.features.createroom.impl.di.CreateRoomComponent
|
||||||
|
|
@ -46,6 +47,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
|
||||||
private val component by lazy {
|
private val component by lazy {
|
||||||
parent!!.bindings<CreateRoomComponent.ParentBindings>().createRoomComponentBuilder().build()
|
parent!!.bindings<CreateRoomComponent.ParentBindings>().createRoomComponentBuilder().build()
|
||||||
}
|
}
|
||||||
|
private val navigator = plugins<CreateRoomNavigator>().first()
|
||||||
|
|
||||||
override val daggerComponent: Any
|
override val daggerComponent: Any
|
||||||
get() = component
|
get() = component
|
||||||
|
|
@ -58,6 +60,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
|
||||||
data object ConfigureRoom : NavTarget
|
data object ConfigureRoom : NavTarget
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
||||||
return when (navTarget) {
|
return when (navTarget) {
|
||||||
NavTarget.Root -> {
|
NavTarget.Root -> {
|
||||||
|
|
@ -69,8 +72,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
|
||||||
createNode<AddPeopleNode>(buildContext = buildContext, plugins = listOf(callback))
|
createNode<AddPeopleNode>(buildContext = buildContext, plugins = listOf(callback))
|
||||||
}
|
}
|
||||||
NavTarget.ConfigureRoom -> {
|
NavTarget.ConfigureRoom -> {
|
||||||
val callbacks = plugins<ConfigureRoomNode.Callback>()
|
createNode<ConfigureRoomNode>(buildContext = buildContext, plugins = listOf(navigator))
|
||||||
createNode<ConfigureRoomNode>(buildContext = buildContext, plugins = callbacks)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,24 +9,26 @@ package io.element.android.features.createroom.impl
|
||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import com.bumble.appyx.core.modality.BuildContext
|
import com.bumble.appyx.core.modality.BuildContext
|
||||||
|
import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler
|
||||||
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 com.bumble.appyx.core.plugin.plugins
|
||||||
import com.bumble.appyx.navmodel.backstack.BackStack
|
import com.bumble.appyx.navmodel.backstack.BackStack
|
||||||
import com.bumble.appyx.navmodel.backstack.operation.push
|
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
import io.element.android.features.createroom.DefaultCreateRoomNavigator
|
||||||
import io.element.android.features.createroom.api.CreateRoomEntryPoint
|
import io.element.android.features.createroom.api.CreateRoomEntryPoint
|
||||||
import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode
|
|
||||||
import io.element.android.features.createroom.impl.root.CreateRoomRootNode
|
import io.element.android.features.createroom.impl.root.CreateRoomRootNode
|
||||||
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.createNode
|
import io.element.android.libraries.architecture.createNode
|
||||||
import io.element.android.libraries.di.SessionScope
|
import io.element.android.libraries.di.SessionScope
|
||||||
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.core.RoomIdOrAlias
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
|
||||||
@ContributesNode(SessionScope::class)
|
@ContributesNode(SessionScope::class)
|
||||||
|
|
@ -47,29 +49,23 @@ class CreateRoomFlowNode @AssistedInject constructor(
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
data object NewRoom : NavTarget
|
data object NewRoom : NavTarget
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val navigator = DefaultCreateRoomNavigator(
|
||||||
|
backstack = backstack,
|
||||||
|
openRoom = { roomIdOrAlias ->
|
||||||
|
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onOpenRoom(roomIdOrAlias) }
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
||||||
return when (navTarget) {
|
return when (navTarget) {
|
||||||
NavTarget.Root -> {
|
NavTarget.Root -> {
|
||||||
val callback = object : CreateRoomRootNode.Callback {
|
createNode<CreateRoomRootNode>(buildContext = buildContext, plugins = listOf(navigator))
|
||||||
override fun onCreateNewRoom() {
|
|
||||||
backstack.push(NavTarget.NewRoom)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStartChatSuccess(roomId: RoomId) {
|
|
||||||
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onSuccess(roomId) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createNode<CreateRoomRootNode>(buildContext = buildContext, plugins = listOf(callback))
|
|
||||||
}
|
}
|
||||||
NavTarget.NewRoom -> {
|
NavTarget.NewRoom -> {
|
||||||
val callback = object : ConfigureRoomNode.Callback {
|
createNode<ConfigureRoomFlowNode>(buildContext = buildContext, plugins = listOf(navigator))
|
||||||
override fun onCreateRoomSuccess(roomId: RoomId) {
|
|
||||||
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onSuccess(roomId) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
createNode<ConfigureRoomFlowNode>(buildContext = buildContext, plugins = listOf(callback))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,9 @@ import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.features.analytics.plan.MobileScreen
|
import im.vector.app.features.analytics.plan.MobileScreen
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
import io.element.android.features.createroom.CreateRoomNavigator
|
||||||
import io.element.android.features.createroom.impl.di.CreateRoomScope
|
import io.element.android.features.createroom.impl.di.CreateRoomScope
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||||
import io.element.android.services.analytics.api.AnalyticsService
|
import io.element.android.services.analytics.api.AnalyticsService
|
||||||
|
|
||||||
@ContributesNode(CreateRoomScope::class)
|
@ContributesNode(CreateRoomScope::class)
|
||||||
|
|
@ -29,6 +30,9 @@ class ConfigureRoomNode @AssistedInject constructor(
|
||||||
private val presenter: ConfigureRoomPresenter,
|
private val presenter: ConfigureRoomPresenter,
|
||||||
private val analyticsService: AnalyticsService,
|
private val analyticsService: AnalyticsService,
|
||||||
) : Node(buildContext, plugins = plugins) {
|
) : Node(buildContext, plugins = plugins) {
|
||||||
|
|
||||||
|
private val navigator = plugins<CreateRoomNavigator>().first()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
lifecycle.subscribe(
|
lifecycle.subscribe(
|
||||||
onResume = {
|
onResume = {
|
||||||
|
|
@ -37,14 +41,6 @@ class ConfigureRoomNode @AssistedInject constructor(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Callback : Plugin {
|
|
||||||
fun onCreateRoomSuccess(roomId: RoomId)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun onCreateRoomSuccess(roomId: RoomId) {
|
|
||||||
plugins<Callback>().forEach { it.onCreateRoomSuccess(roomId) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun View(modifier: Modifier) {
|
override fun View(modifier: Modifier) {
|
||||||
val state = presenter.present()
|
val state = presenter.present()
|
||||||
|
|
@ -52,7 +48,9 @@ class ConfigureRoomNode @AssistedInject constructor(
|
||||||
state = state,
|
state = state,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onBackClick = this::navigateUp,
|
onBackClick = this::navigateUp,
|
||||||
onCreateRoomSuccess = this::onCreateRoomSuccess,
|
onCreateRoomSuccess = {
|
||||||
|
navigator.onOpenRoom(it.toRoomIdOrAlias())
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,10 @@ import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.features.analytics.plan.MobileScreen
|
import im.vector.app.features.analytics.plan.MobileScreen
|
||||||
import io.element.android.anvilannotations.ContributesNode
|
import io.element.android.anvilannotations.ContributesNode
|
||||||
|
import io.element.android.features.createroom.CreateRoomNavigator
|
||||||
import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase
|
import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase
|
||||||
import io.element.android.libraries.di.SessionScope
|
import io.element.android.libraries.di.SessionScope
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||||
import io.element.android.services.analytics.api.AnalyticsService
|
import io.element.android.services.analytics.api.AnalyticsService
|
||||||
|
|
||||||
@ContributesNode(SessionScope::class)
|
@ContributesNode(SessionScope::class)
|
||||||
|
|
@ -33,18 +34,8 @@ class CreateRoomRootNode @AssistedInject constructor(
|
||||||
private val analyticsService: AnalyticsService,
|
private val analyticsService: AnalyticsService,
|
||||||
private val inviteFriendsUseCase: InviteFriendsUseCase,
|
private val inviteFriendsUseCase: InviteFriendsUseCase,
|
||||||
) : Node(buildContext, plugins = plugins) {
|
) : Node(buildContext, plugins = plugins) {
|
||||||
interface Callback : Plugin {
|
|
||||||
fun onCreateNewRoom()
|
|
||||||
fun onStartChatSuccess(roomId: RoomId)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun onCreateNewRoom() {
|
private val navigator = plugins<CreateRoomNavigator>().first()
|
||||||
plugins<Callback>().forEach { it.onCreateNewRoom() }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun onStartChatSuccess(roomId: RoomId) {
|
|
||||||
plugins<Callback>().forEach { it.onStartChatSuccess(roomId) }
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
lifecycle.subscribe(
|
lifecycle.subscribe(
|
||||||
|
|
@ -60,8 +51,10 @@ class CreateRoomRootNode @AssistedInject constructor(
|
||||||
state = state,
|
state = state,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onCloseClick = this::navigateUp,
|
onCloseClick = this::navigateUp,
|
||||||
onNewRoomClick = ::onCreateNewRoom,
|
onNewRoomClick = navigator::onCreateNewRoom,
|
||||||
onOpenDM = ::onStartChatSuccess,
|
onOpenDM = {
|
||||||
|
navigator.onOpenRoom(it.toRoomIdOrAlias())
|
||||||
|
},
|
||||||
onInviteFriendsClick = { invitePeople(activity) }
|
onInviteFriendsClick = { invitePeople(activity) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue