From b78761e89a451d1bc286309bc88ee5fd17b97df7 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 28 Nov 2025 15:54:05 +0100 Subject: [PATCH] space: start branching space settings flow --- features/space/impl/build.gradle.kts | 2 + .../features/space/impl/SpaceFlowNode.kt | 26 ++-- .../impl/settings/SpaceSettingsFlowNode.kt | 116 ++++++++++++++++++ .../space/impl/settings/SpaceSettingsNode.kt | 4 +- 4 files changed, 127 insertions(+), 21 deletions(-) create mode 100644 features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsFlowNode.kt diff --git a/features/space/impl/build.gradle.kts b/features/space/impl/build.gradle.kts index d212bac36b..4ee6822bc5 100644 --- a/features/space/impl/build.gradle.kts +++ b/features/space/impl/build.gradle.kts @@ -40,6 +40,8 @@ dependencies { implementation(projects.libraries.featureflag.api) implementation(projects.features.invite.api) implementation(projects.libraries.previewutils) + implementation(projects.features.securityandprivacy.api) + implementation(projects.features.rolesandpermissions.api) api(projects.features.space.api) testCommonDependencies(libs, true) 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 036eab1c22..5fe646aaeb 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 @@ -28,7 +28,7 @@ import io.element.android.features.space.api.SpaceEntryPoint 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 -import io.element.android.features.space.impl.settings.SpaceSettingsNode +import io.element.android.features.space.impl.settings.SpaceSettingsFlowNode import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BaseFlowNode import io.element.android.libraries.architecture.callback @@ -115,32 +115,20 @@ class SpaceFlowNode( createNode(buildContext, listOf(callback)) } NavTarget.Settings -> { - val callback = object : SpaceSettingsNode.Callback { - override fun closeSettings() { - backstack.pop() - } - - override fun navigateToSpaceInfo() { - // TODO - } - + val callback = object : SpaceSettingsFlowNode.Callback { override fun navigateToSpaceMembers() { callback.navigateToRoomMemberList() } - override fun navigateToRolesAndPermissions() { - // TODO - } - - override fun navigateToSecurityAndPrivacy() { - // TODO - } - override fun startLeaveSpaceFlow() { backstack.push(NavTarget.Leave) } + + override fun closeSettings() { + backstack.pop() + } } - createNode(buildContext, listOf(callback)) + createNode(buildContext, listOf(callback)) } } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsFlowNode.kt new file mode 100644 index 0000000000..b52da111b3 --- /dev/null +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsFlowNode.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2025 Element Creations 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.settings + +import android.os.Parcelable +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 com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.push +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedInject +import io.element.android.annotations.ContributesNode +import io.element.android.features.rolesandpermissions.api.RolesAndPermissionsEntryPoint +import io.element.android.features.securityandprivacy.api.SecurityAndPrivacyEntryPoint +import io.element.android.features.space.impl.di.SpaceFlowScope +import io.element.android.libraries.architecture.BackstackView +import io.element.android.libraries.architecture.BaseFlowNode +import io.element.android.libraries.architecture.callback +import io.element.android.libraries.architecture.createNode +import kotlinx.parcelize.Parcelize + +@ContributesNode(SpaceFlowScope::class) +@AssistedInject +class SpaceSettingsFlowNode( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val securityAndPrivacyEntryPoint: SecurityAndPrivacyEntryPoint, + private val rolesAndPermissionsEntryPoint: RolesAndPermissionsEntryPoint, +) : BaseFlowNode( + backstack = BackStack( + initialElement = NavTarget.Root, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins, +) { + interface Callback : Plugin { + fun navigateToSpaceMembers() + fun startLeaveSpaceFlow() + fun closeSettings() + } + + sealed interface NavTarget : Parcelable { + @Parcelize + data object Root : NavTarget + + @Parcelize + data object SecurityAndPrivacy : NavTarget + + @Parcelize + data object RolesAndPermissions : NavTarget + } + + private val callback: Callback = callback() + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + is NavTarget.Root -> { + val callback = object : SpaceSettingsNode.Callback { + override fun closeSettings() { + callback.closeSettings() + } + + override fun navigateToEditDetails() { + // TODO + } + + override fun navigateToSpaceMembers() { + callback.navigateToSpaceMembers() + } + + override fun navigateToRolesAndPermissions() { + backstack.push(NavTarget.RolesAndPermissions) + } + + override fun navigateToSecurityAndPrivacy() { + backstack.push(NavTarget.SecurityAndPrivacy) + } + + override fun startLeaveSpaceFlow() { + callback.startLeaveSpaceFlow() + } + } + createNode( + buildContext = buildContext, + plugins = listOf(callback), + ) + } + is NavTarget.SecurityAndPrivacy -> { + securityAndPrivacyEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + ) + } + is NavTarget.RolesAndPermissions -> { + rolesAndPermissionsEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + ) + } + } + } + + @Composable + override fun View(modifier: Modifier) { + BackstackView(modifier) + } +} diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsNode.kt index ae2f4857c0..b1e64fbba1 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/settings/SpaceSettingsNode.kt @@ -32,7 +32,7 @@ class SpaceSettingsNode( interface Callback : Plugin { fun closeSettings() - fun navigateToSpaceInfo() + fun navigateToEditDetails() fun navigateToSpaceMembers() fun navigateToRolesAndPermissions() fun navigateToSecurityAndPrivacy() @@ -48,7 +48,7 @@ class SpaceSettingsNode( SpaceSettingsView( state = state, modifier = modifier, - onSpaceInfoClick = callback::navigateToSpaceInfo, + onSpaceInfoClick = callback::navigateToEditDetails, onBackClick = callback::closeSettings, onMembersClick = callback::navigateToSpaceMembers, onRolesAndPermissionsClick = callback::navigateToRolesAndPermissions,