simple clearoute

This commit is contained in:
Mauro Romito
2025-11-06 12:48:32 +01:00
committed by Mauro
parent 6dee4176f2
commit c898d44178
3 changed files with 32 additions and 50 deletions
@@ -71,7 +71,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol {
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
private var roomFlowCoordinator: RoomFlowCoordinator? private var childFlowCoordinator: FlowCoordinatorProtocol?
init(entryPoint: RoomMembersFlowCoordinatorEntryPoint, init(entryPoint: RoomMembersFlowCoordinatorEntryPoint,
roomProxy: JoinedRoomProxyProtocol, roomProxy: JoinedRoomProxyProtocol,
@@ -99,20 +99,20 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol {
func handleAppRoute(_ appRoute: AppRoute, animated: Bool) { func handleAppRoute(_ appRoute: AppRoute, animated: Bool) {
switch appRoute { switch appRoute {
case .roomMemberDetails(let userID): case .roomMemberDetails(let userID):
if case .roomFlow = stateMachine.state, let roomFlowCoordinator { if case .roomFlow = stateMachine.state, let childFlowCoordinator {
roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) childFlowCoordinator.handleAppRoute(appRoute, animated: animated)
} else { } else {
stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID), userInfo: animated) stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID), userInfo: animated)
} }
case .childRoom(let roomID, let via): case .childRoom(let roomID, let via):
if case .roomFlow = stateMachine.state, let roomFlowCoordinator { if case .roomFlow = stateMachine.state, let childFlowCoordinator {
roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) childFlowCoordinator.handleAppRoute(appRoute, animated: animated)
} else { } else {
stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: nil), userInfo: animated) stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: nil), userInfo: animated)
} }
case .childEvent(let eventID, let roomID, let via): case .childEvent(let eventID, let roomID, let via):
if case .roomFlow = stateMachine.state, let roomFlowCoordinator { if case .roomFlow = stateMachine.state, let childFlowCoordinator {
roomFlowCoordinator.handleAppRoute(appRoute, animated: animated) childFlowCoordinator.handleAppRoute(appRoute, animated: animated)
} else { } else {
stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: eventID), userInfo: animated) stateMachine.tryEvent(.startRoomFlow(roomID: roomID, via: via, eventID: eventID), userInfo: animated)
} }
@@ -126,22 +126,14 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol {
} }
func clearRoute(animated: Bool) { func clearRoute(animated: Bool) {
switch stateMachine.state { childFlowCoordinator?.clearRoute(animated: animated)
case .inviteUsersScreen:
navigationStackCoordinator.setSheetCoordinator(nil, animated: animated) 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 { guard let initialCoordinator else {
return return
} }
navigationStackCoordinator.pop(to: initialCoordinator, animated: animated) navigationStackCoordinator.pop(to: initialCoordinator, animated: animated)
} }
}
private func configureStateMachine() { private func configureStateMachine() {
stateMachine.addRouteMapping { event, fromState, _ in stateMachine.addRouteMapping { event, fromState, _ in
@@ -199,7 +191,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol {
case (_, .startRoomFlow(let roomID, let via, let eventID), .roomFlow): case (_, .startRoomFlow(let roomID, let via, let eventID), .roomFlow):
startRoomFlow(roomID: roomID, via: via, eventID: eventID, animated: animated) startRoomFlow(roomID: roomID, via: via, eventID: eventID, animated: animated)
case (.roomFlow, .stopRoomFlow, _): case (.roomFlow, .stopRoomFlow, _):
roomFlowCoordinator = nil childFlowCoordinator = nil
default: default:
fatalError("Unhandled transition") fatalError("Unhandled transition")
@@ -342,7 +334,7 @@ final class RoomMembersFlowCoordinator: FlowCoordinatorProtocol {
} }
.store(in: &cancellables) .store(in: &cancellables)
roomFlowCoordinator = coordinator childFlowCoordinator = coordinator
if let eventID { if let eventID {
coordinator.handleAppRoute(.event(eventID: eventID, roomID: roomID, via: via), animated: animated) coordinator.handleAppRoute(.event(eventID: eventID, roomID: roomID, via: via), animated: animated)
} else { } else {
@@ -65,8 +65,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
private let stateMachine: StateMachine<State, Event> private let stateMachine: StateMachine<State, Event>
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
private var membersFlowCoordinator: RoomMembersFlowCoordinator? private var childFlowCoordinator: FlowCoordinatorProtocol?
private var rolesAndPermissionsFlowCoordinator: RoomRolesAndPermissionsFlowCoordinator?
private let actionsSubject: PassthroughSubject<SpaceSettingsFlowCoordinatorAction, Never> = .init() private let actionsSubject: PassthroughSubject<SpaceSettingsFlowCoordinatorAction, Never> = .init()
var actions: AnyPublisher<SpaceSettingsFlowCoordinatorAction, Never> { var actions: AnyPublisher<SpaceSettingsFlowCoordinatorAction, Never> {
@@ -94,22 +93,13 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
} }
func clearRoute(animated: Bool) { func clearRoute(animated: Bool) {
switch stateMachine.state { childFlowCoordinator?.clearRoute(animated: animated)
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) navigationStackCoordinator.setSheetCoordinator(nil, animated: animated)
clearRoute(animated: animated)
case .rolesAndPermissionsFlow: guard let initialCoordinator else {
rolesAndPermissionsFlowCoordinator?.clearRoute(animated: animated) return
clearRoute(animated: animated)
case .membersFlow:
membersFlowCoordinator?.clearRoute(animated: animated)
clearRoute(animated: animated)
} }
navigationStackCoordinator.pop(to: initialCoordinator, animated: animated)
} }
private func configureStateMachine() { private func configureStateMachine() {
@@ -174,12 +164,12 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
case (.spaceSettings, .startMembersListFlow, .membersFlow): case (.spaceSettings, .startMembersListFlow, .membersFlow):
startMembersListFlow() startMembersListFlow()
case (.membersFlow, .stopMembersListFlow, .spaceSettings): case (.membersFlow, .stopMembersListFlow, .spaceSettings):
membersFlowCoordinator = nil childFlowCoordinator = nil
case (.spaceSettings, .startRolesAndPermissionsFlow, .rolesAndPermissionsFlow): case (.spaceSettings, .startRolesAndPermissionsFlow, .rolesAndPermissionsFlow):
startRolesAndPermissionsFlow() startRolesAndPermissionsFlow()
case (.rolesAndPermissionsFlow, .stopRolesAndPermissionsFlow, .spaceSettings): case (.rolesAndPermissionsFlow, .stopRolesAndPermissionsFlow, .spaceSettings):
rolesAndPermissionsFlowCoordinator = nil childFlowCoordinator = nil
default: default:
fatalError("Unhandled transition") fatalError("Unhandled transition")
@@ -299,7 +289,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
} }
.store(in: &cancellables) .store(in: &cancellables)
rolesAndPermissionsFlowCoordinator = coordinator childFlowCoordinator = coordinator
coordinator.start() coordinator.start()
} }
@@ -321,7 +311,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
} }
.store(in: &cancellables) .store(in: &cancellables)
membersFlowCoordinator = flowCoordinator childFlowCoordinator = flowCoordinator
flowCoordinator.start(animated: true) flowCoordinator.start(animated: true)
} }
} }
@@ -20,13 +20,13 @@ class RoomMembersFlowCoordinatorTests: XCTestCase {
try await setUp(entryPoint: .roomMembersList) try await setUp(entryPoint: .roomMembersList)
XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is RoomMembersListScreenCoordinator) 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) membersFlowCoordinator.handleAppRoute(.roomMemberDetails(userID: "test"), animated: false)
try await deferred.fulfill() try await membersFlowStateExpectation.fulfill()
XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is RoomMemberDetailsScreenCoordinator) XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is RoomMemberDetailsScreenCoordinator)
deferred = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMembersList } membersFlowStateExpectation = deferFulfillment(stateMachineFactory.membersFlowStatePublisher) { $0 == .roomMembersList }
let deferredAction = deferFulfillment(membersFlowCoordinator.actions) { action in let membersFlowActionExpectation = deferFulfillment(membersFlowCoordinator.actions) { action in
switch action { switch action {
case .finished: case .finished:
true true
@@ -35,8 +35,8 @@ class RoomMembersFlowCoordinatorTests: XCTestCase {
} }
} }
membersFlowCoordinator.clearRoute(animated: false) membersFlowCoordinator.clearRoute(animated: false)
try await deferred.fulfill() try await membersFlowStateExpectation.fulfill()
try await deferredAction.fulfill() try await membersFlowActionExpectation.fulfill()
XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is BlankFormCoordinator) XCTAssertTrue(navigationStackCoordinator.stackCoordinators.last is BlankFormCoordinator)
} }