From 1503e5aaf142847d07f807323ef9a50efead065c Mon Sep 17 00:00:00 2001 From: Doug Date: Tue, 29 Jul 2025 15:03:32 +0100 Subject: [PATCH] Rename UserSessionFlowCoordinator to ChatsFlowCoordinator. --- .../Sources/Application/AppCoordinator.swift | 26 +++++----- ...nator.swift => ChatsFlowCoordinator.swift} | 22 ++++---- ...=> ChatsFlowCoordinatorStateMachine.swift} | 4 +- .../UITests/UITestsAppCoordinator.swift | 52 +++++++++---------- ....swift => ChatsFlowCoordinatorTests.swift} | 50 +++++++++--------- 5 files changed, 77 insertions(+), 77 deletions(-) rename ElementX/Sources/FlowCoordinators/{UserSessionFlowCoordinator.swift => ChatsFlowCoordinator.swift} (98%) rename ElementX/Sources/FlowCoordinators/{UserSessionFlowCoordinatorStateMachine.swift => ChatsFlowCoordinatorStateMachine.swift} (99%) rename UnitTests/Sources/{UserSessionFlowCoordinatorTests.swift => ChatsFlowCoordinatorTests.swift} (86%) diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index 76d4de04f..0049163f4 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -46,7 +46,7 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg private let appLockFlowCoordinator: AppLockFlowCoordinator // periphery:ignore - used to avoid deallocation private var appLockSetupFlowCoordinator: AppLockSetupFlowCoordinator? - private var userSessionFlowCoordinator: UserSessionFlowCoordinator? + private var userSessionFlowCoordinator: ChatsFlowCoordinator? private var softLogoutCoordinator: SoftLogoutScreenCoordinator? private var appDelegateObserver: AnyCancellable? private var userSessionObserver: AnyCancellable? @@ -640,18 +640,18 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg fatalError("User session not setup") } - let userSessionFlowCoordinator = UserSessionFlowCoordinator(userSession: userSession, - navigationRootCoordinator: navigationRootCoordinator, - appLockService: appLockFlowCoordinator.appLockService, - bugReportService: ServiceLocator.shared.bugReportService, - elementCallService: elementCallService, - timelineControllerFactory: TimelineControllerFactory(), - appMediator: appMediator, - appSettings: appSettings, - appHooks: appHooks, - analytics: ServiceLocator.shared.analytics, - notificationManager: notificationManager, - isNewLogin: isNewLogin) + let userSessionFlowCoordinator = ChatsFlowCoordinator(userSession: userSession, + navigationRootCoordinator: navigationRootCoordinator, + appLockService: appLockFlowCoordinator.appLockService, + bugReportService: ServiceLocator.shared.bugReportService, + elementCallService: elementCallService, + timelineControllerFactory: TimelineControllerFactory(), + appMediator: appMediator, + appSettings: appSettings, + appHooks: appHooks, + analytics: ServiceLocator.shared.analytics, + notificationManager: notificationManager, + isNewLogin: isNewLogin) userSessionFlowCoordinator.actionsPublisher .sink { [weak self] action in diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/ChatsFlowCoordinator.swift similarity index 98% rename from ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift rename to ElementX/Sources/FlowCoordinators/ChatsFlowCoordinator.swift index f410944f5..7b246e6c4 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/ChatsFlowCoordinator.swift @@ -11,14 +11,14 @@ import Combine import MatrixRustSDK import SwiftUI -enum UserSessionFlowCoordinatorAction { +enum ChatsFlowCoordinatorAction { case logout case clearCache /// Logout without a confirmation. The user forgot their PIN. case forceLogout } -class UserSessionFlowCoordinator: FlowCoordinatorProtocol { +class ChatsFlowCoordinator: FlowCoordinatorProtocol { private let userSession: UserSessionProtocol private let navigationRootCoordinator: NavigationRootCoordinator private let navigationSplitCoordinator: NavigationSplitCoordinator @@ -30,7 +30,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { private let analytics: AnalyticsService private let notificationManager: NotificationManagerProtocol - private let stateMachine: UserSessionFlowCoordinatorStateMachine + private let stateMachine: ChatsFlowCoordinatorStateMachine // periphery:ignore - retaining purpose private var roomFlowCoordinator: RoomFlowCoordinator? @@ -56,13 +56,13 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { private let selectedRoomSubject = CurrentValueSubject(nil) - private let actionsSubject: PassthroughSubject = .init() - var actionsPublisher: AnyPublisher { + private let actionsSubject: PassthroughSubject = .init() + var actionsPublisher: AnyPublisher { actionsSubject.eraseToAnyPublisher() } /// For testing purposes. - var statePublisher: AnyPublisher { stateMachine.statePublisher } + var statePublisher: AnyPublisher { stateMachine.statePublisher } init(userSession: UserSessionProtocol, navigationRootCoordinator: NavigationRootCoordinator, @@ -76,7 +76,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { analytics: AnalyticsService, notificationManager: NotificationManagerProtocol, isNewLogin: Bool) { - stateMachine = UserSessionFlowCoordinatorStateMachine() + stateMachine = ChatsFlowCoordinatorStateMachine() self.userSession = userSession self.navigationRootCoordinator = navigationRootCoordinator self.bugReportService = bugReportService @@ -94,7 +94,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { detailNavigationStackCoordinator = NavigationStackCoordinator(navigationSplitCoordinator: navigationSplitCoordinator) navigationSplitCoordinator.setSidebarCoordinator(sidebarNavigationStackCoordinator) - + settingsFlowCoordinator = SettingsFlowCoordinator(parameters: .init(userSession: userSession, windowManager: appMediator.windowManager, appLockService: appLockService, @@ -242,7 +242,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { private func setupStateMachine() { stateMachine.addTransitionHandler { [weak self] context in guard let self else { return } - let animated = (context.userInfo as? UserSessionFlowCoordinatorStateMachine.EventUserInfo)?.animated ?? true + let animated = (context.userInfo as? ChatsFlowCoordinatorStateMachine.EventUserInfo)?.animated ?? true switch (context.fromState, context.event, context.toState) { case (.initial, .start, .roomList): presentHomeScreen() @@ -1067,8 +1067,8 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { // MARK: Toasts and loading indicators - private static let loadingIndicatorIdentifier = "\(UserSessionFlowCoordinator.self)-Loading" - private static let failureIndicatorIdentifier = "\(UserSessionFlowCoordinator.self)-Failure" + private static let loadingIndicatorIdentifier = "\(ChatsFlowCoordinator.self)-Loading" + private static let failureIndicatorIdentifier = "\(ChatsFlowCoordinator.self)-Failure" private func showLoadingIndicator(delay: Duration? = nil) { ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: Self.loadingIndicatorIdentifier, diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinatorStateMachine.swift b/ElementX/Sources/FlowCoordinators/ChatsFlowCoordinatorStateMachine.swift similarity index 99% rename from ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinatorStateMachine.swift rename to ElementX/Sources/FlowCoordinators/ChatsFlowCoordinatorStateMachine.swift index 818164012..4bd337272 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinatorStateMachine.swift +++ b/ElementX/Sources/FlowCoordinators/ChatsFlowCoordinatorStateMachine.swift @@ -9,7 +9,7 @@ import Combine import Foundation import SwiftState -class UserSessionFlowCoordinatorStateMachine { +class ChatsFlowCoordinatorStateMachine { /// States the AppCoordinator can find itself in enum State: StateType { /// The initial state, used before the coordinator starts @@ -138,7 +138,7 @@ class UserSessionFlowCoordinatorStateMachine { private let stateMachine: StateMachine - var state: UserSessionFlowCoordinatorStateMachine.State { + var state: ChatsFlowCoordinatorStateMachine.State { stateMachine.state } diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index 0fd42b26c..97296e9e5 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -589,19 +589,19 @@ class MockScreen: Identifiable { let appMediator = AppMediatorMock.default appMediator.underlyingWindowManager = windowManager - let flowCoordinator = UserSessionFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), - navigationRootCoordinator: navigationRootCoordinator, - appLockService: AppLockService(keychainController: KeychainControllerMock(), - appSettings: ServiceLocator.shared.settings), - bugReportService: BugReportServiceMock(.init()), - elementCallService: ElementCallServiceMock(.init()), - timelineControllerFactory: TimelineControllerFactoryMock(.init()), - appMediator: appMediator, - appSettings: appSettings, - appHooks: AppHooks(), - analytics: ServiceLocator.shared.analytics, - notificationManager: NotificationManagerMock(), - isNewLogin: false) + let flowCoordinator = ChatsFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), + navigationRootCoordinator: navigationRootCoordinator, + appLockService: AppLockService(keychainController: KeychainControllerMock(), + appSettings: ServiceLocator.shared.settings), + bugReportService: BugReportServiceMock(.init()), + elementCallService: ElementCallServiceMock(.init()), + timelineControllerFactory: TimelineControllerFactoryMock(.init()), + appMediator: appMediator, + appSettings: appSettings, + appHooks: AppHooks(), + analytics: ServiceLocator.shared.analytics, + notificationManager: NotificationManagerMock(), + isNewLogin: false) flowCoordinator.start() @@ -745,19 +745,19 @@ class MockScreen: Identifiable { mediaProvider: MediaProviderMock(configuration: .init()), appSettings: ServiceLocator.shared.settings) - let flowCoordinator = UserSessionFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), - navigationRootCoordinator: navigationRootCoordinator, - appLockService: AppLockService(keychainController: KeychainControllerMock(), - appSettings: ServiceLocator.shared.settings), - bugReportService: BugReportServiceMock(.init()), - elementCallService: ElementCallServiceMock(.init()), - timelineControllerFactory: TimelineControllerFactoryMock(.init(timelineController: timelineController)), - appMediator: AppMediatorMock.default, - appSettings: appSettings, - appHooks: AppHooks(), - analytics: ServiceLocator.shared.analytics, - notificationManager: NotificationManagerMock(), - isNewLogin: false) + let flowCoordinator = ChatsFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), + navigationRootCoordinator: navigationRootCoordinator, + appLockService: AppLockService(keychainController: KeychainControllerMock(), + appSettings: ServiceLocator.shared.settings), + bugReportService: BugReportServiceMock(.init()), + elementCallService: ElementCallServiceMock(.init()), + timelineControllerFactory: TimelineControllerFactoryMock(.init(timelineController: timelineController)), + appMediator: AppMediatorMock.default, + appSettings: appSettings, + appHooks: AppHooks(), + analytics: ServiceLocator.shared.analytics, + notificationManager: NotificationManagerMock(), + isNewLogin: false) flowCoordinator.start() diff --git a/UnitTests/Sources/UserSessionFlowCoordinatorTests.swift b/UnitTests/Sources/ChatsFlowCoordinatorTests.swift similarity index 86% rename from UnitTests/Sources/UserSessionFlowCoordinatorTests.swift rename to UnitTests/Sources/ChatsFlowCoordinatorTests.swift index 91c91032b..9debfa8ad 100644 --- a/UnitTests/Sources/UserSessionFlowCoordinatorTests.swift +++ b/UnitTests/Sources/ChatsFlowCoordinatorTests.swift @@ -11,10 +11,10 @@ import Combine @testable import ElementX @MainActor -class UserSessionFlowCoordinatorTests: XCTestCase { +class ChatsFlowCoordinatorTests: XCTestCase { var clientProxy: ClientProxyMock! var timelineControllerFactory: TimelineControllerFactoryMock! - var userSessionFlowCoordinator: UserSessionFlowCoordinator! + var chatsFlowCoordinator: ChatsFlowCoordinator! var navigationRootCoordinator: NavigationRootCoordinator! var notificationManager: NotificationManagerMock! @@ -33,21 +33,21 @@ class UserSessionFlowCoordinatorTests: XCTestCase { notificationManager = NotificationManagerMock() - userSessionFlowCoordinator = UserSessionFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), - navigationRootCoordinator: navigationRootCoordinator, - appLockService: AppLockServiceMock(), - bugReportService: BugReportServiceMock(.init()), - elementCallService: ElementCallServiceMock(.init()), - timelineControllerFactory: timelineControllerFactory, - appMediator: AppMediatorMock.default, - appSettings: ServiceLocator.shared.settings, - appHooks: AppHooks(), - analytics: ServiceLocator.shared.analytics, - notificationManager: notificationManager, - isNewLogin: false) + chatsFlowCoordinator = ChatsFlowCoordinator(userSession: UserSessionMock(.init(clientProxy: clientProxy)), + navigationRootCoordinator: navigationRootCoordinator, + appLockService: AppLockServiceMock(), + bugReportService: BugReportServiceMock(.init()), + elementCallService: ElementCallServiceMock(.init()), + timelineControllerFactory: timelineControllerFactory, + appMediator: AppMediatorMock.default, + appSettings: ServiceLocator.shared.settings, + appHooks: AppHooks(), + analytics: ServiceLocator.shared.analytics, + notificationManager: notificationManager, + isNewLogin: false) - let deferred = deferFulfillment(userSessionFlowCoordinator.statePublisher) { $0 == .roomList(roomListSelectedRoomID: nil) } - userSessionFlowCoordinator.start() + let deferred = deferFulfillment(chatsFlowCoordinator.statePublisher) { $0 == .roomList(roomListSelectedRoomID: nil) } + chatsFlowCoordinator.start() try await deferred.fulfill() } @@ -128,8 +128,8 @@ class UserSessionFlowCoordinatorTests: XCTestCase { XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomDetailsScreenCoordinator) XCTAssertNotNil(detailCoordinator) - let unexpectedFulfillment = deferFailure(userSessionFlowCoordinator.statePublisher, timeout: 1) { _ in true } - userSessionFlowCoordinator.handleAppRoute(.roomDetails(roomID: "1"), animated: true) + let unexpectedFulfillment = deferFailure(chatsFlowCoordinator.statePublisher, timeout: 1) { _ in true } + chatsFlowCoordinator.handleAppRoute(.roomDetails(roomID: "1"), animated: true) try await unexpectedFulfillment.fulfill() XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomDetailsScreenCoordinator) @@ -151,8 +151,8 @@ class UserSessionFlowCoordinatorTests: XCTestCase { XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomScreenCoordinator) XCTAssertNotNil(detailCoordinator) - let unexpectedFulfillment = deferFailure(userSessionFlowCoordinator.statePublisher, timeout: 1) { _ in true } - userSessionFlowCoordinator.handleAppRoute(.roomDetails(roomID: "1"), animated: true) + let unexpectedFulfillment = deferFailure(chatsFlowCoordinator.statePublisher, timeout: 1) { _ in true } + chatsFlowCoordinator.handleAppRoute(.roomDetails(roomID: "1"), animated: true) try await unexpectedFulfillment.fulfill() XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomScreenCoordinator) @@ -192,7 +192,7 @@ class UserSessionFlowCoordinatorTests: XCTestCase { XCTAssertEqual(detailNavigationStack?.stackCoordinators.count, 0) XCTAssertNotNil(detailCoordinator) - userSessionFlowCoordinator.handleAppRoute(.childRoom(roomID: "2", via: []), animated: true) + chatsFlowCoordinator.handleAppRoute(.childRoom(roomID: "2", via: []), animated: true) try await Task.sleep(for: .milliseconds(100)) XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomScreenCoordinator) XCTAssertEqual(detailNavigationStack?.stackCoordinators.count, 1) @@ -215,7 +215,7 @@ class UserSessionFlowCoordinatorTests: XCTestCase { XCTAssertEqual(timelineControllerFactory.buildTimelineControllerRoomProxyInitialFocussedEventIDTimelineItemFactoryMediaProviderReceivedArguments?.initialFocussedEventID, "1") // A child event route should push a new room screen onto the stack and focus on the event. - userSessionFlowCoordinator.handleAppRoute(.childEvent(eventID: "2", roomID: "2", via: []), animated: true) + chatsFlowCoordinator.handleAppRoute(.childEvent(eventID: "2", roomID: "2", via: []), animated: true) try await Task.sleep(for: .milliseconds(100)) XCTAssertTrue(detailNavigationStack?.rootCoordinator is RoomScreenCoordinator) XCTAssertEqual(detailNavigationStack?.stackCoordinators.count, 1) @@ -290,12 +290,12 @@ class UserSessionFlowCoordinatorTests: XCTestCase { // MARK: - Private - private func process(route: AppRoute, expectedState: UserSessionFlowCoordinatorStateMachine.State) async throws { + private func process(route: AppRoute, expectedState: ChatsFlowCoordinatorStateMachine.State) async throws { // Sometimes the state machine's state changes before the coordinators have updated the stack. - let delayedPublisher = userSessionFlowCoordinator.statePublisher.delay(for: .milliseconds(100), scheduler: DispatchQueue.main) + let delayedPublisher = chatsFlowCoordinator.statePublisher.delay(for: .milliseconds(100), scheduler: DispatchQueue.main) let deferred = deferFulfillment(delayedPublisher) { $0 == expectedState } - userSessionFlowCoordinator.handleAppRoute(route, animated: true) + chatsFlowCoordinator.handleAppRoute(route, animated: true) try await deferred.fulfill() } }