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()
}
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 {
@@ -65,8 +65,7 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
private let stateMachine: StateMachine<State, Event>
private var cancellables = Set<AnyCancellable>()
private var membersFlowCoordinator: RoomMembersFlowCoordinator?
private var rolesAndPermissionsFlowCoordinator: RoomRolesAndPermissionsFlowCoordinator?
private var childFlowCoordinator: FlowCoordinatorProtocol?
private let actionsSubject: PassthroughSubject<SpaceSettingsFlowCoordinatorAction, Never> = .init()
var actions: AnyPublisher<SpaceSettingsFlowCoordinatorAction, Never> {
@@ -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)
}
}
@@ -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)
}