diff --git a/ElementX/Sources/FlowCoordinators/RoomMembersFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomMembersFlowCoordinator.swift index 10f32cc27..15379b2ac 100644 --- a/ElementX/Sources/FlowCoordinators/RoomMembersFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomMembersFlowCoordinator.swift @@ -71,7 +71,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol { actionsSubject.eraseToAnyPublisher() } - private var roomFlowCoordinator: RoomFlowCoordinator? + private var childFlowCoordinator: FlowCoordinatorProtocol? init(entryPoint: RoomMembersFlowCoordinatorEntryPoint, roomProxy: JoinedRoomProxyProtocol, @@ -99,20 +99,20 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol { func handleAppRoute(_ appRoute: AppRoute, animated: Bool) { switch appRoute { case .roomMemberDetails(let userID): - if case .roomFlow = stateMachine.state, let roomFlowCoordinator { - roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) + if case .roomFlow = stateMachine.state, let childFlowCoordinator { + childFlowCoordinator.handleAppRoute(appRoute, animated: animated) } else { stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID), userInfo: animated) } case .childRoom(let roomID, let via): - if case .roomFlow = stateMachine.state, let roomFlowCoordinator { - roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) + if case .roomFlow = stateMachine.state, let childFlowCoordinator { + childFlowCoordinator.handleAppRoute(appRoute, animated: animated) } else { stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: nil), userInfo: animated) } case .childEvent(let eventID, let roomID, let via): - if case .roomFlow = stateMachine.state, let roomFlowCoordinator { - roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) + if case .roomFlow = stateMachine.state, let childFlowCoordinator { + childFlowCoordinator.handleAppRoute(appRoute, animated: animated) } else { stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: eventID), userInfo: animated) } @@ -126,21 +126,13 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol { } func clearRoute(animated: Bool) { - switch stateMachine.state { - case .inviteUsersScreen: - navigationStackCoordinator.setSheetCoordinator(nil, animated: animated) - clearRoute(animated: animated) - case .roomFlow: - roomFlowCoordinator?.clearRoute(animated: animated) - clearRoute(animated: animated) - case .initial: - break - case .roomMemberDetails, .roomMembersList, .userProfile: - guard let initialCoordinator else { - return - } - navigationStackCoordinator.pop(to: initialCoordinator, animated: animated) + childFlowCoordinator?.clearRoute(animated: animated) + navigationStackCoordinator.setSheetCoordinator(nil, animated: animated) + + guard let initialCoordinator else { + return } + navigationStackCoordinator.pop(to: initialCoordinator, animated: animated) } private func configureStateMachine() { @@ -199,7 +191,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol { case (_, .startRoomFlow(let roomID, let via, let eventID), .roomFlow): startRoomFlow(roomID: roomID, via: via, eventID: eventID, animated: animated) case (.roomFlow, .stopRoomFlow, _): - roomFlowCoordinator = nil + childFlowCoordinator = nil default: fatalError("Unhandled transition") @@ -342,7 +334,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol { } .store(in: &cancellables) - roomFlowCoordinator = coordinator + childFlowCoordinator = coordinator if let eventID { coordinator.handleAppRoute(.event(eventID: eventID, roomID: roomID, via: via), animated: animated) } else { diff --git a/ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift index f46d00ade..e0289737e 100644 --- a/ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/SpaceSettingsFlowCoordinator.swift @@ -65,8 +65,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol { private let stateMachine: StateMachine private var cancellables = Set() - private var membersFlowCoordinator: RoomMembersFlowCoordinator? - private var rolesAndPermissionsFlowCoordinator: RoomRolesAndPermissionsFlowCoordinator? + private var childFlowCoordinator: FlowCoordinatorProtocol? private let actionsSubject: PassthroughSubject = .init() var actions: AnyPublisher { @@ -94,22 +93,13 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol { } func clearRoute(animated: Bool) { - switch stateMachine.state { - case .initial: - break - case .spaceSettings, .securityAndPrivacy: - guard let initialCoordinator else { return } - navigationStackCoordinator.pop(to: initialCoordinator, animated: animated) - case .editDetailsScreen, .editAddress: - navigationStackCoordinator.setSheetCoordinator(nil, animated: animated) - clearRoute(animated: animated) - case .rolesAndPermissionsFlow: - rolesAndPermissionsFlowCoordinator?.clearRoute(animated: animated) - clearRoute(animated: animated) - case .membersFlow: - membersFlowCoordinator?.clearRoute(animated: animated) - clearRoute(animated: animated) + childFlowCoordinator?.clearRoute(animated: animated) + navigationStackCoordinator.setSheetCoordinator(nil, animated: animated) + + guard let initialCoordinator else { + return } + navigationStackCoordinator.pop(to: initialCoordinator, animated: animated) } private func configureStateMachine() { @@ -174,12 +164,12 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol { case (.spaceSettings, .startMembersListFlow, .membersFlow): startMembersListFlow() case (.membersFlow, .stopMembersListFlow, .spaceSettings): - membersFlowCoordinator = nil + childFlowCoordinator = nil case (.spaceSettings, .startRolesAndPermissionsFlow, .rolesAndPermissionsFlow): startRolesAndPermissionsFlow() case (.rolesAndPermissionsFlow, .stopRolesAndPermissionsFlow, .spaceSettings): - rolesAndPermissionsFlowCoordinator = nil + childFlowCoordinator = nil default: fatalError("Unhandled transition") @@ -299,7 +289,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol { } .store(in: &cancellables) - rolesAndPermissionsFlowCoordinator = coordinator + childFlowCoordinator = coordinator coordinator.start() } @@ -321,7 +311,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol { } .store(in: &cancellables) - membersFlowCoordinator = flowCoordinator + childFlowCoordinator = flowCoordinator flowCoordinator.start(animated: true) } } diff --git a/UnitTests/Sources/RoomMembersFlowCoordinatorTests.swift b/UnitTests/Sources/RoomMembersFlowCoordinatorTests.swift index 0b5bb9a0a..b4711344c 100644 --- a/UnitTests/Sources/RoomMembersFlowCoordinatorTests.swift +++ b/UnitTests/Sources/RoomMembersFlowCoordinatorTests.swift @@ -20,13 +20,13 @@ class RoomMembersFlowCoordinatorTests: XCTestCase { try await setUp(entryPoint: .roomMembersList) XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is RoomMembersListScreenCoordinator) - var deferred = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMemberDetails(userID: "test", previousState: .roomMembersList) } + var membersFlowStateExpectation = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMemberDetails(userID: "test", previousState: .roomMembersList) } membersFlowCoordinator.handleAppRoute(.roomMemberDetails(userID: "test"), animated: false) - try await deferred.fulfill() + try await membersFlowStateExpectation.fulfill() XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is RoomMemberDetailsScreenCoordinator) - deferred = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMembersList } - let deferredAction = deferFulfillment(membersFlowCoordinator.actions) { action in + membersFlowStateExpectation = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMembersList } + let membersFlowActionExpectation = deferFulfillment(membersFlowCoordinator.actions) { action in switch action { case .finished: true @@ -35,8 +35,8 @@ class RoomMembersFlowCoordinatorTests: XCTestCase { } } membersFlowCoordinator.clearRoute(animated: false) - try await deferred.fulfill() - try await deferredAction.fulfill() + try await membersFlowStateExpectation.fulfill() + try await membersFlowActionExpectation.fulfill() XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is BlankFormCoordinator) }