mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 19:44:05 +00:00
simple clearoute
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user