Skip to content

Commit 2bfa629

Browse files
committed
feat(join by alias) : refactor navigation for create room flow
1 parent 21c6f92 commit 2bfa629

File tree

7 files changed

+72
-48
lines changed

7 files changed

+72
-48
lines changed

appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,8 @@ class LoggedInFlowNode @AssistedInject constructor(
357357
}
358358
NavTarget.CreateRoom -> {
359359
val callback = object : CreateRoomEntryPoint.Callback {
360-
override fun onSuccess(roomId: RoomId) {
361-
backstack.replace(NavTarget.Room(roomId.toRoomIdOrAlias()))
360+
override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias) {
361+
backstack.replace(NavTarget.Room(roomIdOrAlias))
362362
}
363363
}
364364

features/createroom/api/src/main/kotlin/io/element/android/features/createroom/api/CreateRoomEntryPoint.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import com.bumble.appyx.core.modality.BuildContext
1111
import com.bumble.appyx.core.node.Node
1212
import com.bumble.appyx.core.plugin.Plugin
1313
import io.element.android.libraries.architecture.FeatureEntryPoint
14-
import io.element.android.libraries.matrix.api.core.RoomId
14+
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
1515

1616
interface CreateRoomEntryPoint : FeatureEntryPoint {
1717
fun nodeBuilder(parentNode: Node, buildContext: BuildContext): NodeBuilder
@@ -21,6 +21,6 @@ interface CreateRoomEntryPoint : FeatureEntryPoint {
2121
}
2222

2323
interface Callback : Plugin {
24-
fun onSuccess(roomId: RoomId)
24+
fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias)
2525
}
2626
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.features.createroom
9+
10+
import com.bumble.appyx.core.plugin.Plugin
11+
import com.bumble.appyx.navmodel.backstack.BackStack
12+
import com.bumble.appyx.navmodel.backstack.operation.push
13+
import io.element.android.features.createroom.impl.CreateRoomFlowNode.NavTarget
14+
import io.element.android.libraries.architecture.overlay.Overlay
15+
import io.element.android.libraries.architecture.overlay.operation.hide
16+
import io.element.android.libraries.architecture.overlay.operation.show
17+
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
18+
19+
interface CreateRoomNavigator : Plugin {
20+
fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias)
21+
fun onCreateNewRoom()
22+
}
23+
24+
class DefaultCreateRoomNavigator(
25+
private val backstack: BackStack<NavTarget>,
26+
private val openRoom: (RoomIdOrAlias) -> Unit,
27+
) : CreateRoomNavigator {
28+
29+
override fun onOpenRoom(roomIdOrAlias: RoomIdOrAlias) = openRoom(roomIdOrAlias)
30+
31+
override fun onCreateNewRoom() {
32+
backstack.push(NavTarget.NewRoom)
33+
}
34+
35+
}

features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/ConfigureRoomFlowNode.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.bumble.appyx.navmodel.backstack.operation.push
1919
import dagger.assisted.Assisted
2020
import dagger.assisted.AssistedInject
2121
import io.element.android.anvilannotations.ContributesNode
22+
import io.element.android.features.createroom.CreateRoomNavigator
2223
import io.element.android.features.createroom.impl.addpeople.AddPeopleNode
2324
import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode
2425
import io.element.android.features.createroom.impl.di.CreateRoomComponent
@@ -46,6 +47,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
4647
private val component by lazy {
4748
parent!!.bindings<CreateRoomComponent.ParentBindings>().createRoomComponentBuilder().build()
4849
}
50+
private val navigator = plugins<CreateRoomNavigator>().first()
4951

5052
override val daggerComponent: Any
5153
get() = component
@@ -58,6 +60,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
5860
data object ConfigureRoom : NavTarget
5961
}
6062

63+
6164
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
6265
return when (navTarget) {
6366
NavTarget.Root -> {
@@ -69,8 +72,7 @@ class ConfigureRoomFlowNode @AssistedInject constructor(
6972
createNode<AddPeopleNode>(buildContext = buildContext, plugins = listOf(callback))
7073
}
7174
NavTarget.ConfigureRoom -> {
72-
val callbacks = plugins<ConfigureRoomNode.Callback>()
73-
createNode<ConfigureRoomNode>(buildContext = buildContext, plugins = callbacks)
75+
createNode<ConfigureRoomNode>(buildContext = buildContext, plugins = listOf(navigator))
7476
}
7577
}
7678
}

features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomFlowNode.kt

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,26 @@ package io.element.android.features.createroom.impl
99

1010
import android.os.Parcelable
1111
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.remember
1213
import androidx.compose.ui.Modifier
1314
import com.bumble.appyx.core.modality.BuildContext
15+
import com.bumble.appyx.core.navigation.transition.JumpToEndTransitionHandler
1416
import com.bumble.appyx.core.node.Node
1517
import com.bumble.appyx.core.plugin.Plugin
1618
import com.bumble.appyx.core.plugin.plugins
1719
import com.bumble.appyx.navmodel.backstack.BackStack
18-
import com.bumble.appyx.navmodel.backstack.operation.push
1920
import dagger.assisted.Assisted
2021
import dagger.assisted.AssistedInject
2122
import io.element.android.anvilannotations.ContributesNode
23+
import io.element.android.features.createroom.DefaultCreateRoomNavigator
2224
import io.element.android.features.createroom.api.CreateRoomEntryPoint
23-
import io.element.android.features.createroom.impl.configureroom.ConfigureRoomNode
2425
import io.element.android.features.createroom.impl.root.CreateRoomRootNode
2526
import io.element.android.libraries.architecture.BackstackView
2627
import io.element.android.libraries.architecture.BaseFlowNode
2728
import io.element.android.libraries.architecture.createNode
2829
import io.element.android.libraries.di.SessionScope
2930
import io.element.android.libraries.matrix.api.core.RoomId
31+
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
3032
import kotlinx.parcelize.Parcelize
3133

3234
@ContributesNode(SessionScope::class)
@@ -47,29 +49,23 @@ class CreateRoomFlowNode @AssistedInject constructor(
4749

4850
@Parcelize
4951
data object NewRoom : NavTarget
52+
5053
}
5154

55+
private val navigator = DefaultCreateRoomNavigator(
56+
backstack = backstack,
57+
openRoom = { roomIdOrAlias ->
58+
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onOpenRoom(roomIdOrAlias) }
59+
}
60+
)
61+
5262
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
5363
return when (navTarget) {
5464
NavTarget.Root -> {
55-
val callback = object : CreateRoomRootNode.Callback {
56-
override fun onCreateNewRoom() {
57-
backstack.push(NavTarget.NewRoom)
58-
}
59-
60-
override fun onStartChatSuccess(roomId: RoomId) {
61-
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onSuccess(roomId) }
62-
}
63-
}
64-
createNode<CreateRoomRootNode>(buildContext = buildContext, plugins = listOf(callback))
65+
createNode<CreateRoomRootNode>(buildContext = buildContext, plugins = listOf(navigator))
6566
}
6667
NavTarget.NewRoom -> {
67-
val callback = object : ConfigureRoomNode.Callback {
68-
override fun onCreateRoomSuccess(roomId: RoomId) {
69-
plugins<CreateRoomEntryPoint.Callback>().forEach { it.onSuccess(roomId) }
70-
}
71-
}
72-
createNode<ConfigureRoomFlowNode>(buildContext = buildContext, plugins = listOf(callback))
68+
createNode<ConfigureRoomFlowNode>(buildContext = buildContext, plugins = listOf(navigator))
7369
}
7470
}
7571
}

features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomNode.kt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import dagger.assisted.Assisted
1818
import dagger.assisted.AssistedInject
1919
import im.vector.app.features.analytics.plan.MobileScreen
2020
import io.element.android.anvilannotations.ContributesNode
21+
import io.element.android.features.createroom.CreateRoomNavigator
2122
import io.element.android.features.createroom.impl.di.CreateRoomScope
22-
import io.element.android.libraries.matrix.api.core.RoomId
23+
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
2324
import io.element.android.services.analytics.api.AnalyticsService
2425

2526
@ContributesNode(CreateRoomScope::class)
@@ -29,6 +30,9 @@ class ConfigureRoomNode @AssistedInject constructor(
2930
private val presenter: ConfigureRoomPresenter,
3031
private val analyticsService: AnalyticsService,
3132
) : Node(buildContext, plugins = plugins) {
33+
34+
private val navigator = plugins<CreateRoomNavigator>().first()
35+
3236
init {
3337
lifecycle.subscribe(
3438
onResume = {
@@ -37,22 +41,16 @@ class ConfigureRoomNode @AssistedInject constructor(
3741
)
3842
}
3943

40-
interface Callback : Plugin {
41-
fun onCreateRoomSuccess(roomId: RoomId)
42-
}
43-
44-
private fun onCreateRoomSuccess(roomId: RoomId) {
45-
plugins<Callback>().forEach { it.onCreateRoomSuccess(roomId) }
46-
}
47-
4844
@Composable
4945
override fun View(modifier: Modifier) {
5046
val state = presenter.present()
5147
ConfigureRoomView(
5248
state = state,
5349
modifier = modifier,
5450
onBackClick = this::navigateUp,
55-
onCreateRoomSuccess = this::onCreateRoomSuccess,
51+
onCreateRoomSuccess = {
52+
navigator.onOpenRoom(it.toRoomIdOrAlias())
53+
},
5654
)
5755
}
5856
}

features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import dagger.assisted.Assisted
2020
import dagger.assisted.AssistedInject
2121
import im.vector.app.features.analytics.plan.MobileScreen
2222
import io.element.android.anvilannotations.ContributesNode
23+
import io.element.android.features.createroom.CreateRoomNavigator
2324
import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase
2425
import io.element.android.libraries.di.SessionScope
25-
import io.element.android.libraries.matrix.api.core.RoomId
26+
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
2627
import io.element.android.services.analytics.api.AnalyticsService
2728

2829
@ContributesNode(SessionScope::class)
@@ -33,18 +34,8 @@ class CreateRoomRootNode @AssistedInject constructor(
3334
private val analyticsService: AnalyticsService,
3435
private val inviteFriendsUseCase: InviteFriendsUseCase,
3536
) : Node(buildContext, plugins = plugins) {
36-
interface Callback : Plugin {
37-
fun onCreateNewRoom()
38-
fun onStartChatSuccess(roomId: RoomId)
39-
}
40-
41-
private fun onCreateNewRoom() {
42-
plugins<Callback>().forEach { it.onCreateNewRoom() }
43-
}
4437

45-
private fun onStartChatSuccess(roomId: RoomId) {
46-
plugins<Callback>().forEach { it.onStartChatSuccess(roomId) }
47-
}
38+
private val navigator = plugins<CreateRoomNavigator>().first()
4839

4940
init {
5041
lifecycle.subscribe(
@@ -60,8 +51,10 @@ class CreateRoomRootNode @AssistedInject constructor(
6051
state = state,
6152
modifier = modifier,
6253
onCloseClick = this::navigateUp,
63-
onNewRoomClick = ::onCreateNewRoom,
64-
onOpenDM = ::onStartChatSuccess,
54+
onNewRoomClick = navigator::onCreateNewRoom,
55+
onOpenDM = {
56+
navigator.onOpenRoom(it.toRoomIdOrAlias())
57+
},
6558
onInviteFriendsClick = { invitePeople(activity) }
6659
)
6760
}

0 commit comments

Comments
 (0)